chrome拡張の開発でTab.statusについて教えて下さい。

1,729 views
Skip to first unread message

araishi

unread,
Jun 25, 2013, 9:39:43 AM6/25/13
to chrome-api-d...@googlegroups.com
はじめまして。araishiと申します。

はじめてChrome拡張を開発してみようと思い、練習がてらに書いてみたのですが、
タブオブジェクトのtab.statusの扱い方がよくわからなかったので質問させて下さい。

ポップアップからボタンをクリックすると特定のURLを開き、
tab.statusが「complete」になってからの処理を書きたい場合にはどのような記述をすればよいのでしょうか?
現在下記のように書いているのですが、毎回 「loading」になっています。

popup.js
$(function(){
  $("#start").click(function(){
    chrome.tabs.update(null, {url:"http://example.com"}, function(tab){
      console.log(tab);  
      if(tab.status == 'complete'){
        // ここにタブのローディングが終わってからの処理を書きたい
      }
    })
  })
})


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

Eiji Kitamura

unread,
Jun 25, 2013, 10:23:17 PM6/25/13
to chrome-api-d...@googlegroups.com
えーじです。
Tabのupdate状況を得るにはEventを取ります。

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if (tab.status === 'complete') {
      ...
    }
});

なので、chrome.tabs.updateのコールバックでstatusを取るのではなく、別のところでイベントを取るようにすれば、期待通りに動くと思います。


2013/6/25 araishi <lus...@gmail.com>

--
--
このメールは Google グループのグループ「Chrome API Developers JP」の登録者に送られています。
このグループに投稿するには、chrome-api-d...@googlegroups.com にメールを送信してください。
このグループから退会するには、chrome-api-develop...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/chrome-api-developers-jp?hl=ja からこのグループにアクセスしてください。
 
---
このメールは Google グループのグループ「Chrome API Developers JP」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、chrome-api-develop...@googlegroups.com にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 



--
Eiji Kitamura | Developer Advocate | google.com/+agektmr | +81-80-1150-6480

Yoichiro Tanaka

unread,
Jun 26, 2013, 12:54:46 AM6/26/13
to chrome-api-d...@googlegroups.com
よういちろうです。

えーじさんが提示したやり方で全く問題ないと思いますが、一つ別の手もあったりします。

もし読み込み完了を監視したいURLが一つあるいは数個に限定されているなら、Content Scriptを
使うという手があります。manifest.jsonファイルに以下のように記載して、

...
"background": {
  "scripts": [ "background.js" ],
  "persistent": false
},
"content_scripts": [
  {
    "matches": [ "http://example.com" ],
    "js": [ "cs.js" ],
    "run_at": "document_idle"
  }
],
...

cs.jsファイルがtab.status == "complete"とほぼ同じタイミングで評価されるので、cs.jsファイル
の中で、

chrome.runtime.sendMessage({message: "complete"});

とメッセージを送り、background.jsにて、

chrome.runtime.onMessage.addListener(function(req, sender, sendResponse) {
  // タブ読み込み完了時の処理
});

としてメッセージを受け取り、タブ読み込み完了時の処理を記述します。これでえーじさんの
コードと同じことが実現可能です。

違いは・・・というと、

* 書くべきコードが多く、ただただ面倒。
* タブの更新イベント監視だと、全てのタブの更新の度にEvent page(=background.js)のコン
テキストが活性化される。Content Scriptsのやり方だと、指定したURLのタブが更新された
時のみEvent pageのコンテキストが活性化される。

があげられます。後者がChrome全体の動作に対してエコに働くのであれば、メリットとして
は大きいかな、と思います。ただし、ホントにエコかどうかは未確認です。G+のコミュニティ
で聞いてみたいと思ってます。

ご参考になれば幸いです。ではでは。



2013年6月26日水曜日 11時23分17秒 UTC+9 Eiji Kitamura:


2013/6/25 araishi <lus...@gmail.com>
このグループに投稿するには、chrome-api-develo...@googlegroups.com にメールを送信してください。
このグループから退会するには、chrome-api-developers-jp+unsubscribe@googlegroups.com にメールを送信してください。

詳細については、http://groups.google.com/group/chrome-api-developers-jp?hl=ja からこのグループにアクセスしてください。
 
---
このメールは Google グループのグループ「Chrome API Developers JP」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、chrome-api-developers-jp+unsub...@googlegroups.com にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

araishi

unread,
Jun 26, 2013, 5:47:57 AM6/26/13
to chrome-api-d...@googlegroups.com
えーじさん

ありがとうございます!
できないということがわかって助かりました。
backgroundのjsでやってみようと思います。


よういちろうさん

ありがとうございます!
chromeの拡張機能は普通のJSのように開発できそう思ってたら、いろいろ癖があるようで(汗)。
Content Scriptとchrome.runtimeというのが面白そうだったので、また調べてみようと思います。



2013年6月26日水曜日 13時54分46秒 UTC+9 Yoichiro Tanaka:

Yoichiro Tanaka

unread,
Jun 27, 2013, 8:04:25 AM6/27/13
to chrome-api-d...@googlegroups.com
よういちろう です。

G+コミュニティにて質問してみました。

要点だけピックアップすると、

* chrome.tabsで監視するのと、Content scriptで監視するのと、どっちがコスト小さい?
* メッセージの送信はそうでもないけど、全タブの更新イベントのためにEvent pageがずっと生きてるのはインパクトありそうだね。
* 各ページにContent scriptをインジェクトするのはとてもコスト高い。でも、Event pageを生かしておくのもコスト高い。どっちもどっち。
* chrome.webNavigationはFilter機能があって、拾いたいイベントを限定できる。chrome.tabsにもFilter機能があればいいんじゃね?

ということで、機能追加の提案をすることになりました。

[Support a filter for chrome.tabs module] - http://goo.gl/FZyKr

現時点では、chrome.tabsで処理しておいて、もし仮に上記の提案が受け入れられてFilter機能が増えれば、それを使ってEvent page
の活性化を限定的にして軽くする、って感じかなと思います。

ご参考になれば幸いです。ではでは。


2013年6月26日水曜日 18時47分57秒 UTC+9 araishi:
Reply all
Reply to author
Forward
0 new messages