読者です 読者をやめる 読者になる 読者になる

まめ畑

ゆるゆると書いていきます

jetpackの自動更新とPageModsを少し便利にするパッチ書いた

Jetpack javascript

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に適用して下さい。
早く自動更新時の信頼サイトの追加機能を入れて欲しいですね。