ようへい

2012年8月26日日曜日

Greasemonkey 1.0 リリース

ついに、Greasemonkey 1.0 がリリースされました。
やっと安定版というところでしょうか。
Greasespot: Greasemonkey 1.0 Release
http://www.greasespot.net/2012/08/greasemonkey-10-release.html 1.0での主な変更点は、@grantという権限パラメタがMetaブロックに追加されています。
スクリプト内で使用しているGM_関数を、あらかじめ@grantで宣言しなければいけないようです。
Greasemonkey 1.0 adds a special Metadata Block imperative: @grant. As of version 1.0:

 If a script does not specify any @grant values, Greasemonkey will attempt to auto-detect the right settings.
 If a script specifies any values (or they have been auto detected), then it will be provided with only those API methods that it declares.
 The valid values are the names of those GM_ prefixed values that you wish your script to be granted access to. 
 Otherwise the script will be granted no special API privileges, and thus run without the security constraints Greasemonkey scripts have traditionally had. If you want your script to operate in this mode, you should explicitly declare @grant none.
@grant - GreaseSpot Wiki
http://wiki.greasespot.net/@grant
@grantの追記は大きな手間ではなかったのですが、1.0にすると以下のエラーが出るようになりました。
なお、@grantにGM_xmlhttpRequestは追記済みです。
[Exception... "A parameter or an operation is not supported by the underlying object"  code: "15" nsresult: "0x8053000f (InvalidAccessError)"  location: "chrome://greasemonkey/content/xmlhttprequester.js Line: 86"]
ちなみに、xmlhttprequester.jsの該当行は以下。
// this function is intended to be called in chrome's security context, so
// that it can access other domains without security warning
GM_xmlhttpRequester.prototype.chromeStartRequest =
function(safeUrl, details, req) {
  this.setupReferer(details, req);

  var setupRequestEvent = GM_util.hitch(this, 'setupRequestEvent', this.wrappedContentWin);

  setupRequestEvent(req, "abort", details);
  setupRequestEvent(req, "error", details);
  setupRequestEvent(req, "load", details);
  setupRequestEvent(req, "progress", details);
  setupRequestEvent(req, "readystatechange", details);
  setupRequestEvent(req, "timeout", details);
  if (details.upload) {
    setupRequestEvent(req.upload, "abort", details.upload);
    setupRequestEvent(req.upload, "error", details.upload);
    setupRequestEvent(req.upload, "load", details.upload);
    setupRequestEvent(req.upload, "progress", details.upload);
  }

  req.mozBackgroundRequest = !!details.mozBackgroundRequest;

  req.open(details.method, safeUrl,
      !details.synchronous, details.user || "", details.password || "");

  if (details.overrideMimeType) {
    req.overrideMimeType(details.overrideMimeType);
  }
  if (details.timeout) {
    req.timeout = details.timeout;
  }

  if (details.headers) {
    var headers = details.headers;

    for (var prop in headers) {
      if (Object.prototype.hasOwnProperty.call(headers, prop)) {
        req.setRequestHeader(prop, headers[prop]);
      }
    }
  }
どうやらGM_xmlhttpRequestのtimeoutパラメタが悪さしているみたい。
ということで、一時的にGM_xmlhttpRequestのtimeoutパラメタをコメントアウトすることで回避できました。
ちなみに以下のページから、0.9系をインストールして確認すると、上記のようなエラーは出ませんでした。
おそらく、1.0でのバグだと考えられます。
Greasemonkey :: Versions :: Add-ons for Firefox
https://addons.mozilla.org/ja/firefox/addon/greasemonkey/versions/ ちなみに、@grantを設定していないスクリプトで表示される警告メッセージはabout:configのgreasemonkey.showGrantsWarningをfalseにすることで、表示しないようにすることが出来るようです。

後日談

timeoutを設定した際にエラーを吐いた件は使い方がまずかったみたい。
[Greasemonkey] timeout と synchronous の関係について - ログろいど
関連記事

0 件のコメント:

コメントを投稿