0

Mozilla のドキュメントは、この問題について沈黙しています。知っている人で、その理由または理由を説明して説明できる人はいますか? そうでない場合は、ポリシーの理由とアーキテクチャ上の決定を知りたいです。

編集: この質問は、アドオン SDK を使用できず、代わりに従来のオーバーレイ パターンを使用する拡張機能に限定されます。

4

2 に答える 2

1

フレームスクリプトは Web ページではなく、jquery が存在すると予想する大部分のグローバル変数 (XHR、ドキュメント、ウィンドウ自体など) へのアクセスを提供しません。

ウィンドウ環境のように見える方法で変数を調整したとしても、フレーム スクリプトの寿命は DOM ウィンドウの寿命を超えているため、これは依然として大きな問題となります。つまり、その存在は個々のページではなくタブに関連付けられています。タブの。Jquery は、ページが存続する間だけ存続するように設計されています。

3 番目の問題はセキュリティです。フレーム スクリプトはchrome/system 権限で実行されるため、フレーム スクリプトから直接実行すると jquery になります。Jquery は、通常、Web サイトの同一生成元ポリシーによって制約されるため、セキュリティを意識して設計されていません。したがって、イベント処理と XHR の複雑な相互作用によって、セキュリティの脆弱性が生じる可能性があります。

そのため、ブラウザ内部のスクリプト環境で jquery を使用することはお勧めしません。

フレーム スクリプトから DOM 操作を行う 2 つのオプションは次のとおりです。

a) 標準 DOM API をフレーム スクリプトから直接使用する。アドオン スクリプトは、ES6 サポートを有効にした状態で自動的に実行され (例: 構造化、アロー関数など)、ブラウザー間の互換性を気にする必要はありません。つまり、jquery は必要ありません。

b) jquery の使用が絶対に必要な場合 (たとえば、サードパーティのライブラリが jquery に依存している場合など) は、現在のウィンドウをプロトタイプとしてサンドボックスを作成し、サブスクリプト ローダーを使用してjquery とカスタム スクリプトを挿入することができます。

サンドボックスを作成して信頼できないコンテンツから隔離し、同時にシステム権限を削除する推奨される方法:

let options = {
  // this is the name reported in about:memory
  sandboxName: "<addon name> <purpose of sandbox>",

  // ensure that jquery sees the window as global
  sandboxPrototype: content,

  // reduces GC overhead by having the sandbox reside in the same space as target window
  sameZoneAs: content,

  // don't include components object that grants access to privileged APIs
  wantComponents: false, 

  // helper functions for interacting with untrusted content
  wantExportHelpers: true,

  // clean view of DOM APIs, otherwise untrusted content could override prototypes
  wantXrays: true,

  // addon ID, used by addon debugger and memory reporting
  // sdk addons can obtain it via require("sdk/self").id, other addons define it in the install.rdf
  metadata: {addonID: id}
}

// set the security principal to an extended principal covering the target window
let sandbox = Cu.Sandbox([content], options)

// structured-clone objects into the sandbox
sandbox.myData = {foo: "bar"}

loader.loadSubscript("resource://myaddon-id/libs/jquery.js", sandbox, "UTF-8")
loader.loadSubscript("resource://myaddon-id/src/mypagescript.js", sandbox, "UTF-8")

// call custom function created by mypagescript.js
sandbox.myFunc()

サンドボックスはページの存続期間中のみ有効であるため、フレームが新しいウィンドウ (contentオブジェクト) に移動した場合は、新しいサンドボックスを作成する必要があることに注意してください。


上記は基本的に、SDK のpage-modおよび webextensions content-scriptsによって使用される、基礎となる低レベル APIです。

于 2016-03-27T07:40:22.893 に答える
0

OP への私のコメントを参照してください。あなたが読んだドキュメントは、コンテンツ スクリプトに関するものではありません。フレームスクリプトやその他の昇格されたスコープに関するものです。Google chrome には、これらの昇格されたスコープがありません。彼らはコンテンツスクリプトしか持っていません。これが私たち全員が混乱した理由です。

これは、コンテンツ スクリプトで jpm アドオン SDK を使用して jQuery を使用する方法です。

jquery lib をデータ フォルダーにダウンロードします。

var tabs = require("sdk/tabs");
var mod = require("sdk/page-mod");
var self = require("sdk/self");

var pageUrl = self.data.url("page.html")

var pageMod = mod.PageMod({
  include: '*',
  contentScript: [self.data.url('jquery.min.js'), "console.log(jQuery);"]
})

これにより、jQuery がすべての Web サイトに挿入されます。tabs.open(pageUrl);

Webextensions を使用する場合、Google Chrome とまったく同じ方法: https://developer.mozilla.org/en-US/Add-ons/WebExtensions/

于 2016-03-31T00:05:55.507 に答える