[crx-ja] Content Scriptで設定画面を実現する方法

433 views
Skip to first unread message

おかもとけいじ

unread,
May 1, 2010, 5:22:23 AM5/1/10
to Chromium-Extensions-Japan
こんにちは。

いま、ページを書き換えるタイプの機能拡張(Content Script)を作っているのですが、
設定に応じて動作を変更することができずに困っています。

ふつうの機能拡張だと、backgroundのlocalStorageを、ポップアップとオプション画面から読み書きすることで、設定変更を実現して
いるように見えたので、そのようにしてみようとしたのですが、下記のような状況です。

・Content Scriptではchrome.extension.getBackgroundPage()は呼び出せないとエラーコンソールに出
るため、Content Script側からbackgroundを呼び出すのは使えませんでした。
・chrome.extension.sendRequestをbackground側から送ろうとしましたが、backgroundにベタで書いた
コードは実行されないようで(alertとかconsole.errorをいきなり書いてもダメなのでそう判断しました)、よくわからず断念しまし
た。

そこで質問なのですが、そもそもContent Scriptで設定によって動作を変えるのは無理なのでしょうか? もし成功されている方がいました
ら、どんな感じで動作しているのかご教示いただけないでしょうか。

よろしくお願いいたします。

--
このメールは Google グループのグループ「Chromium-Extensions-Japan」の登録者に送られています。
このグループに投稿するには、chromium-ext...@googlegroups.com にメールを送信してください。
このグループから退会するには、chromium-extension...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/chromium-extensions-japan?hl=ja からこのグループにアクセスしてください。

Constellation

unread,
May 1, 2010, 7:19:59 AM5/1/10
to Chromium-Extensions-Japan
こんにちはー.
Content Scriptから設定を変更したい場合は, http://code.google.com/chrome/extensions/extension.html#method-sendRequest
を使ってbackgroundにrequestを送り, backgroundでは
http://code.google.com/chrome/extensions/extension.html#event-onRequest
を使ってrequestをlistenしてはどうでしょうか?

またbackgroundの設定をContent Scriptに反映させるのは, 自分の場合はContent Scriptから
sendRequestで設定を要求し, backgroundからlistenして設定を送り返していますー.

HAMAMOTO Nori

unread,
May 1, 2010, 10:57:03 AM5/1/10
to chromium-ext...@googlegroups.com
こんばんはー

以下のような感じで、background.js へlocalStorage へのアクセスを依頼するという形で書くと動きますよ。
background.jsからの戻り値は、sendResponse()の引数の値をJSON形式で書いてあげると、content.jsのコールバック関数側で受け取れるようです。

contentscript.js
================
chrome.extension.sendRequest({greeting: "hello"}, function(response) {
  console.log(response.farewell);
});


background.js
=============
chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) {
    if (request.greeting == "hello"){
      // ここに localStorage へアクセスするコードを書く
      var result = localStorage...;
      sendResponse({resule: result});
    }
  });


background.js へのリクエストが多くなると、chrome.extension.onRequest.addListener内での if の分岐が多くなって、ごちゃごちゃして嫌なので、私は background.js 側に server オブジェクトを用意して、そちらに処理の内容を書くようにし、addListener 内で以下のようにスイッチするように書いています。

background.js
=============

//
// onRequest handler
//
chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse){
    if(sender.tab){
      server[request.name](request, sender, sendResponse);
  }
});

//
// server object
//
var server = {
  foo: function(request, sender, sendResponse){
    // request.name = 'foo' だった時の処理
    sendResponse({});
  },
  
  bar: function(request, sender, sendResponse){
    // request.name = 'bar' だった時の処理
    sendResponse({});
  }
)

content.js 側では以下のように、background.js の server.foo 関数を呼び出します。

contentscript.js
================
chrome.extension.sendRequest({
  name   : "foo" 
}, function(response){
  // response を使った処理
  ...
});

参考までに。
No...@FireDictionary.com

2010年5月1日8:19 Constellation <utata...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages