2017-01-04 9 views
0

質問:Firefox WebExtensionsでは、任意の背景の由来から、どのようにしてタブ内の任意のページを一意に開くことができますか?Firefox WebExtensions:背景ページを一意のタブとして開くにはどうすればよいですか?

要件:

1)任意の背景の起源。最初の使用例は、browser_action contextMenusです。しかし、技術はポップアップ、オプション、または任意のカスタムバックグラウンドスクリプトから作業する必要があります。コンテンツページには関係ありません。しかし、その技術が彼らのためにも働くのであれば、素晴らしい。

2)タブで任意のページを開きます。私の最初の使用はオプションページですが、テクニックは任意のバックグラウンドページ(オプション、ポップアップ、またはカスタムページ)で機能するはずです。

3)一意に開きます。初めての場合は、新しいタブで開きます。タブが以前に開かれている場合は、既存のタブにフォーカスし、重複するタブを作成しないでください。

4)タブを閉じると、以前に開いたタブIDへの参照が削除されていることを確認する必要があります。

私は自分の質問に1つの解決策で答えました。

ソリューションを改善できる場合は、教えてください。ありがとうございました。

質問が重複している場合は、必要に応じてソリューションを削除して投稿します。

+0

あなたは複数の質問をしています:1)あなたが開いているタブにパラメータを渡してください(私の意見では、説明したものよりも簡単で、バックグラウンドで両方のページに対応できる方法がありますコンテキストスクリプトとコンテンツスクリプト)。 2)目的のURLを含むタブが開いているかどうかを確認し、そうであればフォーカスを合わせます。 3)[一般的にバックグラウンドコンテキストでページ間でメッセージを送信する](http://stackoverflow.com/a/41420772/3773011)。これらの3つのことは別々の質問です。それらを[別の質問](http://stackoverflow.com/questions/ask)に分けてください。 – Makyen

+0

私はこの質問を書いたとき、私はちょうど私の考えを集めていたと思います。編集して他の質問を作成します。 – user314159

+0

問題はありません、私はそれがどのように行くことができるか知っています。正式には、私はこの質問をあまりにも広すぎる(問題ごとに1つの問題)として締め切るべきだった。もっと緊密に集中すれば、これは良い質問になると私は信じています。私は1&2のやり方に関するアイデアを持っています.1のために、私はそれをやる方法について考えています。あなたのアウトラインされたメソッドは、他に何をしているかによっても機能し、最も適切かもしれません。 2のために、私は他のもののために使った部分的なコードを持っています。 3については、明らかに、私はすでにリンクされた答えを提供しています。質問を更新したり、質問を更新したりするときに私にpingしてください。 – Makyen

答えて

0

これは自分の質問に答えるためのもので、インラインでコメントしています。

この単純な例では、すべてのページャが最上位ディレクトリにあると想定していますが、これは任意で簡単に変更できます。

1) 'の.html')なし(ページ名を保持するグローバルオブジェクトtabIDs

は、本質的に、それは、4つの部分からなります。これを拡張子を含むフルパスに変更するか、ページ名を短い名前にして、パス名などの別のオプションを使用するようにテクニックを変更してください。

2)非同期機能新しい待ち受け機能の名前)をtabCreateとし、既に開いているかどうかを判断して、そのタブに切り替えるか、新しいタブを作成します。

3)onRemovedイベントハンドラは、タブが閉じられた後にtabIDsのクリーンアップを処理します(該当する場合)。

4)使用例、コンテキストメニュー項目から、デモの目的のためだけに、ここで、この質問には使用していませんが、別の質問の一部であり、そしていくつかのpagepanelオプションを渡します。

background.js:

// tabID contexts 
//  global var to keep track of different tabs, 
//  i.e. options.html, popup.html and so on. 

var tabIDs = { 
    'options': null, 
    'popup': null, 
} 

// Requires Firefox 52.0+ to use async/await 
//  opts correspond to contexts above in tabIDs 
//  of the form { 'page': 'options' } or { 'page': 'popup' } 
//  note if using Node.js, this may require v7+ and --harmony_async_await 
async function tabCreate (opts) { 
    var tab; 

    if (tabIDs[ opts.page ] !== null) { 
     // should probably bring window to front first... oops 
     // .. 
     // switch to tab 
     tab = await browser.tabs.update(tabIDs[ opts.page ], { active: true }); 
    } else { 
     tab = await browser.tabs.create({ 
      'url': opts.page + '.html' 
     }); 

     tabIDs[ opts.page ] = tab.id; 
    } 

    console.log('**** opts.page = ' + opts.page + ', opts.tab = ' + opts.tab + ', tab.id = ' + tab.id); 
} 

// When tabs are closed, see if the tabID is in tabIDs, 
//  and if so, set it to null 
function tabRemove (tabID, removeInfo) { 
console.log('Closed TAB ' + tabID); 

    Object.keys(tabIDs).forEach(function(key, index) { 
     if (tabIDs[ key ] === tabID) { 
      tabIDs[ key ] = null; 
      return; 
     } 
    }); 
} 
browser.tabs.onRemoved.addListener(tabRemove); 

/* 
* Context Menus 
*/ 

browser.contextMenus.removeAll(); 

browser.contextMenus.create({ 
    title: 'My Web Extension', 
    contexts: [ 'browser_action' ], 
}); 

browser.contextMenus.create({ 
    title: 'Options', 
    contexts: [ 'browser_action' ], 
    onclick: myWebExt_Options 
}); 

function myWebExt_Options () { 
    tabCreate({ 
     'page': 'options', 
     'panel': 1, 
    }); 
} 

別のアプローチは、各ページにイベントリスナーを追加し、閉じたときに、バックbackground.jsにメッセージを送信するかもしれないが、それはほとんど、あるいはまったくとはるかに複雑なようです利益。

+0

ユーザがページをブックマークしておき、以前に 'tabCreate()'とは独立していた場合はどうなりますか? – Makyen

+0

ええと、私の使用例は、私のアドオンの内部ページ、特にコンテキストメニューからページを開くように制限されていたので、その可能性は考慮していませんでした。解決策に合わせて答えを調整することができました。うーん、外部で開いたページやアドオンへのブックマークをどうやって処理すればいいのか分からない。一致するtabIDが見つからない場合は、tab.urlを参照してください。おそらく短縮名tab.id、tab.urlを追跡するためにグローバルオブジェクトを展開してください。オハイオ州、またはレコード作成をtab.onCreatedイベントハンドラで処理します...しかし、他の人のタブを追跡したくないだけで、自分の拡張機能です。^_^ – user314159

+0

タブをトラッキングする必要はありません。 [extension.getViews() '](https()から背景のコンテキストで現在開いているページ(タブ、パネル、背景ページ、オプションページなど)のウィンドウオブジェクトのリストを直接取得することができます://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/extension/getViews)。 Windowオブジェクトから、ページが開いているURLを判断できます。 – Makyen

関連する問題