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

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

ナイトリーでGreasemonkeyを動かすパッチ&GreasemonkeyでJavaScript1.8

javascript

Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2a1pre) Gecko/20090719 Minefield/3.6a1preで確認。
Illegal valueといったエラーで動かなくなるのを修正する。
(function () {})();で囲っている部分のコードがまずかったようなのでそれを削除した。互換性に多少問題が出るかもしれない。

---
 src/chrome/chromeFiles/content/config.js |   16 ----------------
 src/components/greasemonkey.js           |   22 ++--------------------
 2 files changed, 2 insertions(+), 36 deletions(-)

diff --git a/src/chrome/chromeFiles/content/config.js b/src/chrome/chromeFiles/content/config.js
index f494f4b..b11ccd0 100644
--- a/src/chrome/chromeFiles/content/config.js
+++ b/src/chrome/chromeFiles/content/config.js
@@ -87,9 +87,6 @@ Config.prototype = {
           scriptResource._charset = childNode.getAttribute("charset");
           script._resources.push(scriptResource);
           break;
-        case "Unwrap":
-          script._unwrap = true;
-          break;
         }
       }
 
@@ -151,11 +148,6 @@ Config.prototype = {
         scriptNode.appendChild(resourceNode);
       }
 
-      if (scriptObj._unwrap) {
-        scriptNode.appendChild(doc.createTextNode("\n\t\t"));
-        scriptNode.appendChild(doc.createElement("Unwrap"));
-      }
-
       scriptNode.appendChild(doc.createTextNode("\n\t"));
 
       scriptNode.setAttribute("filename", scriptObj._filename);
@@ -258,12 +250,6 @@ Config.prototype = {
               script._resources.push(scriptResource);
               break;
           }
-        } else { // plain @header
-          switch (header) {
-            case "unwrap":
-              script._unwrap = true;
-              break;
-          }
         }
       }
     }
@@ -433,7 +419,6 @@ function Script(config) {
   this._excludes = [];
   this._requires = [];
   this._resources = [];
-  this._unwrap = false;
 }
 
 Script.prototype = {
@@ -462,7 +447,6 @@ Script.prototype = {
 
   get requires() { return this._requires.concat(); },
   get resources() { return this._resources.concat(); },
-  get unwrap() { return this._unwrap; },
 
   get _file() {
     var file = this._basedirFile;
diff --git a/src/components/greasemonkey.js b/src/components/greasemonkey.js
index b3b6e83..67f19fd 100644
--- a/src/components/greasemonkey.js
+++ b/src/components/greasemonkey.js
@@ -287,25 +287,7 @@ var greasemonkeyService = {
                          "\n" +
                          contents +
                          "\n";
-      if (!script.unwrap)
-        scriptSrc = wrap(scriptSrc);
-      if (!this.evalInSandbox(scriptSrc, url, sandbox, script) && script.unwrap)
-        this.evalInSandbox(wrap(scriptSrc),
-                           url, sandbox, script); // wrap anyway on early return
-    }
-
-    function wrap(src) {
-      return "(function(){\
-                 for (var i in this) {\
-                   if (this[i]==undefined) continue;\
-                   eval('var '+i+' = this[i]');\
-                   if (i.indexOf('GM_')==0)\
-                     delete this[i];\
-                   else\
-                     this[i] = undefined;\
-                 }\
-                 "+ src +"\
-               })()";
+      this.evalInSandbox(scriptSrc, url, sandbox, script);
     }
   },
 
@@ -366,7 +348,7 @@ var greasemonkeyService = {
             e, // error obj
             0, // 0 = error (1 = warning)
             err.uri,
-            err.lineNumber
+            e.lineNumber
           );
         } else {
           GM_logError(
-- 

Greasemonkey内のコードをJS1.8に対応させるパッチはこれ。互換性を損なう変更なので、いくつかのスクリプトが動かなくなる可能性がある。
参考:LiveCoding #6 の 2: Days on the Moon

---
 src/components/greasemonkey.js |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/src/components/greasemonkey.js b/src/components/greasemonkey.js
index 67f19fd..f3de266 100644
--- a/src/components/greasemonkey.js
+++ b/src/components/greasemonkey.js
@@ -322,7 +322,7 @@ var greasemonkeyService = {
     try {
       // workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=307984
       var lineFinder = new Error();
-      Components.utils.evalInSandbox(code, sandbox);
+      Components.utils.evalInSandbox(code, sandbox, "1.8");
     } catch (e) { // catches errors while running the script code
       try {
         if (e && "return not in function" == e.message)
--