IE Tab拡張機能を使用して、Confluence に保存されている Office ドキュメントを新しいタブで開く Chrome 拡張機能を開発しようとしています。
[ページの添付ファイルの表示] 画面には、Office ファイルの添付ファイル用の [Office で編集] リンクがあります。リンクにはURLLauncher
、ドキュメントを開くために使用される の新しいインスタンスを作成するクリック イベントがあります。URLLauncher
この機能は Chrome ではサポートされていないため、独自のプロトタイプを Web ページに追加して機能させたいと考えています。
要するに、これは私の考えです:
- 「View Page Attachment」ページにプロトタイプを挿入するコンテンツ スクリプトを使用して、Chrome 拡張機能を作成し
URLLauncher
ます (これが正しいアプローチかどうかはわかりませんので、提案をお待ちしています)。 - ユーザーが [Office で編集] リンクをクリックすると、
URLLauncher.open
メソッドは IE タブ拡張機能を呼び出して、添付ファイルを新しいタブで開きます。
「こんにちは!」というメッセージが表示されます。Web ページを読み込むたびにアラートが表示され、content.js が挿入されていることが確認されます。ただし、URLLauncher
Web ページでは使用できません。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...');
});
}
}