jetpackの自動更新とPageModsを少し便利にするパッチ書いた
jetpackが自動更新機能を備えているのはご存知かと思いますが、この自動更新に少し困ったことがあります。
Featureのインストール確認画面で自動更新を選択すると注意書きが出てくるのですが、一回インストールしてしまうと今のところ無条件でFeatureの変更を自動で行ってしまいます。
つまり、正常に動作するFeatureを配布し、ある時から何か悪さをするコードを追加されてしまうといつの間にか自動でコードが更新されてしまう事態になります。
かといって、自動更新は便利なのでOffにするのはちょっとと思って自分の環境では少しjetpackの環境をいじっています。
Firefoxが起動している間、自動更新は1時間に1回行われます。(ちなみにコードを単純に==で比較しているだけなので、空白1つでも更新されます)
将来的にjetpack自体に信頼済のサイトを追加する機能が追加されるようです。
超簡易Patchを作ってみました。Ver0.4用です。
変数名や機能などは自分仕様なので好きに改変してください。
この変更を加えると、Featureのインストール確認画面の下に、チェックボックスが追加され、確認なしで更新するかを選べます。
チェックをしないと、更新が見つかる度に確認のPopUpが出ます。
Featureの名前とインストール元のURLが表示されます。
jetpackのDBにフィールドを追加するのでいったん、インストール済のFeatureを削除して、変更を加えて再度インストールして下さい。
diff -r -d -u jetpack-origin@labs.mozilla.com/content/confirm-add-jetpack.html jetpack@labs.mozilla.com/content/confirm-add-jetpack.html --- jetpack-origin@labs.mozilla.com/content/confirm-add-jetpack.html 2009-07-30 14:46:57.000000000 +0900 +++ jetpack@labs.mozilla.com/content/confirm-add-jetpack.html 2009-07-30 14:48:13.000000000 +0900 @@ -68,6 +68,8 @@ are sure about the implications of what you're doing.</p> </ul> + <input type="checkbox" id="nonotice"/> + <label for="nonotice" style="font-size: larger;">Auto-update this feature without NOTICE.</label> </p> <p> <input type="submit" value="Get me outta here!" diff -r -d -u jetpack-origin@labs.mozilla.com/content/js/confirm-add-jetpack.js jetpack@labs.mozilla.com/content/js/confirm-add-jetpack.js --- jetpack-origin@labs.mozilla.com/content/js/confirm-add-jetpack.js 2009-07-30 14:46:57.000000000 +0900 +++ jetpack@labs.mozilla.com/content/js/confirm-add-jetpack.js 2009-07-30 14:48:14.000000000 +0900 @@ -80,12 +80,14 @@ function onSubmit() { var code = $("#sourceCode").text(); var canAutoUpdate = $("#autoupdate").attr("checked") ? true : false; + var withoutNoticeUpdate = $("#nonotice").attr("checked") ? true : false; if (code) { var feedMgr = JetpackSetup.createServices().feedManager; feedMgr.addSubscribedFeed({url: gCommandFeedInfo.url, sourceUrl: gCommandFeedInfo.sourceUrl, sourceCode: code, canAutoUpdate: canAutoUpdate, + withoutNoticeUpdate: withoutNoticeUpdate, title: gCommandFeedInfo.title, type: "jetpack"}); showConfirmation(); diff -r -d -u jetpack-origin@labs.mozilla.com/content/js/jetpack-runtime.js jetpack@labs.mozilla.com/content/js/jetpack-runtime.js --- jetpack-origin@labs.mozilla.com/content/js/jetpack-runtime.js 2009-07-30 14:46:57.000000000 +0900 +++ jetpack@labs.mozilla.com/content/js/jetpack-runtime.js 2009-07-30 14:48:14.000000000 +0900 @@ -276,6 +276,10 @@ success: function(data) { var currCode = feed.getCode(); if (currCode != data) { + if(!feed.withoutNoticeUpdate){ + var update = window.confirm(feed.title +" was Changed. Update Now? URL(" + feed.srcUri.spec + ")"); + if(!update) return; + } feed.setCode(data); feed.broadcastChangeEvent(); } diff -r -d -u jetpack-origin@labs.mozilla.com/ubiquity-modules/feedmanager.js jetpack@labs.mozilla.com/ubiquity-modules/feedmanager.js --- jetpack-origin@labs.mozilla.com/ubiquity-modules/feedmanager.js 2009-07-30 14:46:57.000000000 +0900 +++ jetpack@labs.mozilla.com/ubiquity-modules/feedmanager.js 2009-07-30 14:48:14.000000000 +0900 @@ -51,6 +51,7 @@ const FEED_SRC_ANNO = "ubiquity/source"; const FEED_TYPE_ANNO = "ubiquity/type"; const FEED_AUTOUPDATE_ANNO = "ubiquity/autoupdate"; +const FEED_WITHOUTNOTICE_ANNO = "ubiquity/withoutnotice"; const FEED_BUILTIN_ANNO = "ubiquity/builtin"; const FEED_SUBSCRIBED_ANNO = "ubiquity/confirmed"; const FEED_UNSUBSCRIBED_ANNO = "ubiquity/removed"; @@ -60,6 +61,7 @@ const FEED_ANNOS = [FEED_SRC_ANNO, FEED_TYPE_ANNO, FEED_AUTOUPDATE_ANNO, + FEED_WITHOUTNOTICE_ANNO, FEED_BUILTIN_ANNO, FEED_SUBSCRIBED_ANNO, FEED_UNSUBSCRIBED_ANNO, @@ -212,6 +214,8 @@ expiration); annSvc.setPageAnnotation(uri, FEED_AUTOUPDATE_ANNO, info.canAutoUpdate, 0, expiration); + annSvc.setPageAnnotation(uri, FEED_WITHOUTNOTICE_ANNO, info.withoutNoticeUpdate, 0, + expiration); annSvc.setPageAnnotation(uri, FEED_SUBSCRIBED_ANNO, "true", 0, expiration); if (info.title) @@ -518,6 +522,21 @@ else feedInfo.canAutoUpdate = false; + // === {{{Feed.withoutNoticeUpdate}}} === + // + // Whether or not the latest version of the feed's source code should + // be fetched from the network without Notice. See + // {{{FeedManager.addSubscribedFeed()}}} for more + // information. Read-only. + + if (annSvc.pageHasAnnotation(uri, FEED_AUTOUPDATE_ANNO)) + // fern: there's no not-hackish way of parsing a string to a boolean. + feedInfo.withoutNoticeUpdate = (/^true$/i).test( + annSvc.getPageAnnotation(uri, FEED_AUTOUPDATE_ANNO) + ); + else + feedInfo.withoutNoticeUpdate = false; + // === {{{Feed.getCode()}}} === // // Returns the cached source code for the feed, if any.
PageModsにも少し変更を加えて使っています。
PageModsは許可サイトのみを指定できる状態なのですが、除外サイトも指定したいと思って追加しました。
除外サイト→許可サイトの順でマッチングを行います。
好きなように改変して使ってください。
この様に指定出来ます。
jetpack.future.import("pageMods"); var callback = function(document){ document.title = "hogehogehoge"; }; var options = {}; options.exclude = ["http://d.hatena.ne.jp/masa138"]; //除外 options.matches = ["http://d.hatena.ne.jp/*","http://www.yahoo.co.jp/"]; //適用 jetpack.pageMods.add(callback, options);
diff -r -d -u jetpack-origin@labs.mozilla.com/modules/page-modification.js jetpack@labs.mozilla.com/modules/page-modification.js --- jetpack-origin@labs.mozilla.com/modules/page-modification.js 2009-07-30 15:41:25.000000000 +0900 +++ jetpack@labs.mozilla.com/modules/page-modification.js 2009-07-30 15:41:24.000000000 +0900 @@ -63,6 +63,7 @@ MemoryTracking.track(this); // store the patterns in this array this.patterns = []; + this.patterns_exclude = []; if (typeOf(jetpack) === 'object'){ this.jetpack = jetpack; @@ -87,7 +88,9 @@ // introspect the options, handle string, array, and object var _options; + var _option_exclude; var _patterns = []; + var _patterns_exclude = []; if (typeOf(options) === 'object'){ if (options.matches){ @@ -96,9 +99,13 @@ else { throw new Error("PagesMods.add expects an object with a matches property"); } + + if(options.exclude){ + _option_exclude = options.exclude; + } } else { - _options = options; + throw new Error("PagesMods.add expects an object with a matches or exclude property"); } if(typeOf(_options) === 'array'){ @@ -108,6 +115,13 @@ _patterns = [_options]; } + if(typeOf(_option_exclude) === 'array'){ + _patterns_exclude = _option_exclude.slice(); + } + else if (typeOf(_option_exclude) === 'string'){ + _patterns_exclude = [_option_exclude]; + } + // store all MatchPattern Objects in a new object with its corrresponding // callback function for (var i=0; i < _patterns.length; i++) { @@ -121,12 +135,34 @@ e + "\n"); } } + + // store ExcludePattern Objects + for (var i=0; i < _patterns_exclude.length; i++) { + try { + let em = new MatchPattern(_patterns_exclude[i]); + this.patterns_exclude.push({ expattern: em }); + } + catch (e) { + throw new Error("There was a problem creating a ExcludeMatchPattern\n " + + e + "\n"); + } + } // register the matches and callbacks var scope = this; this.jetpack.tabs.onReady(function() { for (var i=0; i < scope.patterns.length; i++){ + if(!scope.patterns_exclude[i]) continue; + if(scope.patterns_exclude[i].expattern.doMatch(this.contentDocument.location)){ + return; + } + else { + // match failure, noop + } + } + + for (var i=0; i < scope.patterns.length; i++){ if(scope.patterns[i].pattern.doMatch(this.contentDocument.location)){ scope.patterns[i].callback(this.contentDocument); } @@ -135,7 +171,6 @@ } } }); - } };
PageMods配布先に依存するので、あくまで自分用のFeatureに適用して下さい。
早く自動更新時の信頼サイトの追加機能を入れて欲しいですね。