3

IE Tab拡張機能を使用して、Confluence に保存されている Office ドキュメントを新しいタブで開く Chrome 拡張機能を開発しようとしています。

[ページの添付ファイルの表示] 画面には、Office ファイルの添付ファイル用の [Office で編集] リンクがあります。リンクにはURLLauncher、ドキュメントを開くために使用される の新しいインスタンスを作成するクリック イベントがあります。URLLauncherこの機能は Chrome ではサポートされていないため、独自のプロトタイプを Web ページに追加して機能させたいと考えています。

要するに、これは私の考えです:

  1. 「View Page Attachment」ページにプロトタイプを挿入するコンテンツ スクリプトを使用して、Chrome 拡張機能を作成しURLLauncherます (これが正しいアプローチかどうかはわかりませんので、提案をお待ちしています)。
  2. ユーザーが [Office で編集] リンクをクリックすると、URLLauncher.openメソッドは IE タブ拡張機能を呼び出して、添付ファイルを新しいタブで開きます。

「こんにちは!」というメッセージが表示されます。Web ページを読み込むたびにアラートが表示され、content.js が挿入されていることが確認されます。ただし、URLLauncherWeb ページでは使用できません。windowこれは、コンテンツ スクリプトのグローバル オブジェクトが、ページ/拡張機能のグローバル名前空間とは異なる (つまり、window.URLLauncher未定義である)ためだと思います。この障害を克服するためにコードを再編成するにはどうすればよいでしょうか?

これらは私のファイルです:

マニフェスト.json

{
   "manifest_version": 2,
   "background": {
      "scripts": [
         "background.js"
      ]
   },
   "content_scripts": [ {
      "js": [ "content.js" ],
      "matches": [ "<all_urls>" ]
   } ],
   "description": "This is a test extension",
   "permissions": [
      "tabs", "http://*/*", "https://*/*"
   ],
   "name": "Test extension",
   "version": "1.0.0"
}

background.js

chrome.tabs.executeScript(null, { 
   code: "document.body.appendChild(document.createElement('script')).src='" + 
   chrome.extension.getURL("content.js") + "';" 
}, null);

chrome.runtime.onMessage.addListener(
   function(request, sender, sendResponse) {
      console.log(sender.tab ?
            "from a content script:" + sender.tab.url :
            "from the extension");
      if (request.id == "doUrlLaunch") {        
         chrome.tabs.create({ url: request.nUrl, selected: true });
         sendResponse({result: "goodbye"});
      }
   }
);

content.js

var prefixUrl = 'chrome-extension://hehijbfgiekmjfkfjpbkbammjbdenadd/iecontainer.html#url=';
alert('Hi there!');
function URLLauncher() {

}

URLLauncher.prototype = {  
   open : function(urlStr) {
      var newUrl = prefixUrl + 'https://host.com' + encodeURI(urlStr);
      chrome.runtime.sendMessage({id: "doUrlLaunch", nUrl: newUrl}, function(response) {
      });
   }
}

前もって感謝します。

更新 1

Rob Wとこのページ(「メッセージパッシング」)の指示に従ってファイルを編集しました。コードはページ自体に挿入されるようになりましたが、まだ大きな問題が残っています。実際の JS コードはコンテンツ スクリプトにメッセージを送信しますが、メッセージはリスナーによってキャッチされないため、新しいタブは作成されず、コールバック関数は応答を受信しません。私が得たエラーメッセージ: Error in event handler for (unknown): TypeError: Cannot read property 'success' of undefined .

更新されたファイルは次のとおりです。

マニフェスト.json

{
   "manifest_version": 2,
   "content_scripts": [ {
      "js": [ "content.js" ],
      "matches": [ "<all_urls>" ]
   } ],
   "web_accessible_resources": [ "script.js" ],
   "description": "This is a test extension",
   "permissions": [
      "tabs", "http://*/*", "https://*/*"
   ],
   "name": "Test extension",
   "version": "1.0.0",
   "externally_connectable": {
      "ids": ["*"],
      "matches": ["*://*.hostname.com/*"]
   }
}

content.js

var s = document.createElement('script');
s.src = chrome.extension.getURL("script.js");
s.onload = function() {
    this.parentNode.removeChild(this);
};
(document.head||document.documentElement).appendChild(s);

chrome.runtime.onMessage.addListener(
//Unreachable code!
   function(request, sender, sendResponse) {
      console.log(sender.tab ?
            "from a content script:" + sender.tab.url :
            "from the extension");
      if (request.id == "doUrlLaunch") {        
         chrome.tabs.create({ url: request.nUrl, selected: true });
         sendResponse({result: "goodbye"});
      }
   }
);

script.js

var prefixUrl = 'chrome-extension://hehijbfgiekmjfkfjpbkbammjbdenadd/iecontainer.html#url=';
function URLLauncher() {

}

URLLauncher.prototype = {  
   open : function(urlStr) {
      var newUrl = prefixUrl + 'https://hostname.com' + encodeURI(urlStr);
      chrome.runtime.sendMessage({id: "doUrlLaunch", nUrl: newUrl}, function(response) {
          if (!response.success)
              console.log('Something went wrong...');
      });
   }
}
4

1 に答える 1

0

まだ答えに興味があるかどうかはわかりませんが、編集したファイルでは、リスナーが座っている場所に問題があります。

  1. chrome.runtime.sendMessageコンテンツ スクリプトに到達しません。拡張ページ用です。コンテンツ スクリプトへのメッセージ パッシングは を通じて機能しますchrome.tabs.sendMessageが、これはこのタスクには関係ありません。

  2. chrome.tabsコンテンツ スクリプトは、必要な API アクセスがないため、呼び出すことができません。

解決策は、これらのメッセージを受信して​​必要な API を呼び出すことができるバックグラウンド スクリプトを呼び出すことです。

したがって、次のコードを から取り出した 3 番目のスクリプトが必要ですcontent.js

// background.js
chrome.runtime.onMessage.addListener(
   function(request, sender, sendResponse) {
      console.log(sender.tab ?
            "from a content script:" + sender.tab.url :
            "from the extension");
      if (request.id == "doUrlLaunch") {        
         chrome.tabs.create({ url: request.nUrl, selected: true });
         sendResponse({result: "goodbye"});
      }
   }
);    

マニフェストを変更します。

  "background": { "scripts": [ "background.js" ] },
于 2014-05-09T09:20:49.440 に答える