2016-08-19 2 views
0

現在のタブのブックマークを保存し、WebExtensionボタンを押したときに閉じてしまうコードがあります。コードを保存してからすべてのタブを閉じるようにします。javascriptですべてのタブをブックマークして閉じるにはどうすればいいですか?

var currentTab; 
var currentBookmark; 

// gets active tabe 
function callOnActiveTab(callback) { 
    chrome.tabs.query({currentWindow: true}, function(tabs) { 
     for (var tab of tabs) { 
     if (tab.active) { 
      callback(tab, tabs); 
     } 
     } 
    }); 
} 

/* 
* Add the bookmark on the current page. 
*/ 
function Bookmark() { 

    chrome.bookmarks.create({title: currentTab.title, url: currentTab.url}, function(bookmark) { 
     currentBookmark = bookmark; 
    }); 

    callOnActiveTab((tab) => { 
     chrome.tabs.remove(tab.id); 
    }); 

} 

/* 
* Switches currentTab and currentBookmark to reflect the currently active tab 
*/ 
function updateTab() { 
    chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    if (tabs[0]) { 
     currentTab = tabs[0]; 

     chrome.bookmarks.search({url: currentTab.url}, (bookmarks) => { 
     currentBookmark = bookmarks[0]; 
     }); 
    } 
    }); 
} 



function listTabs() { 

    Bookmark(); 

} 


chrome.browserAction.onClicked.addListener(listTabs); 


chrome.tabs.onUpdated.addListener(updateTab); 
// listen to tab switching 
chrome.tabs.onActivated.addListener(updateTab); 

私はupdateTab()関数の最後にしおり()関数を追加した場合、ボタンはもはや機能していないと私はタブを変更する場合には、1とすると、すべてのタブを終了することを保存します。

+0

スクリプトは唯一それが開いているウィンドウを閉じることができます。

var currentBookmark; /* Add a bookmark for a tab * tabsTab - The tabs.Tab object for the tab containing the page to bookmark * callback - Called with the tabs.Tab object when the bookmark is complete */ function bookmarkTab(tabsTab, callback) { chrome.bookmarks.create({title: tabsTab.title, url: tabsTab.url}, function(bookmark) { currentBookmark = bookmark; if(typeof callback === 'function'){ callback(tabsTab); } }); } /* Remove a Tab * tabsTab - The tabs.Tab object for the tab to remove * callback - Called with the, now invalid, tab ID of the removed tab */ function removeTab(tabsTab, callback){ let rememberedId = tabsTab.id; //Unknown if object changes upon removal chrome.tabs.remove(rememberedId,function(){ if(typeof callback === 'function'){ callback(rememberedId); } }); } /* Bookmark and remove a tab once the bookmark has been made * tabsTab - The tabs.Tab object for the tab to remove */ function bookmarkAndRemoveTab(tabsTab) { //When we get here from the browserAction click, tabsTab is the active tab // in the window where the button was clicked. But, this function can be used // anytime you have a tabs.Tab object for the tab you want to bookmark and delete. bookmarkTab(tabsTab,removeTab); } chrome.browserAction.onClicked.addListener(bookmarkAndRemoveTab); 

は次に、あなたはすべてのタブにbookmarkAndRemoveTab()をした機能を持つことができます。 ..それはアクティブなタブとだけ対話できますか?それはページ上で実行されるのですか、またはブラウザの拡張機能としてインストールされますか? –

+0

はい私はそれも読んだことがありますが、決してこのページを開きません。私はテストのために2つまたは3つのタブを開きます。ブラウザに拡張機能がインストールされています。 – Robe

答えて

0

あなたのコードは、あなたがしようとしているように思われるほど複雑すぎます。 Bookmark関数を使用して複数のタブをブックマークして削除することができないという問題の重要な部分は、アクティブなタブをトラッキングしている非同期イベントハンドラによって変更されるグローバル変数に依存していることです。その関数は、関数に渡される引数を使用するように再コーディングできます。このようにして、一般的に再利用することができます。

注:bookmarkTab関数のタブの削除を移動しました(あなたのコードではBookmarkとなります)。そこにあるのは、関数Bookmarkだけを呼び出すのは悪い考えです。私はbookmarkAndRemoveTab()関数を追加しました。これは、実行中の両方の作業に対して明示的に指定されています。

はちょうどあなたの browserActionに関連したセクションは次のようになります。

/* Bookmark and remove all tabs 
*/ 
function bookmarkAndRemoveAllTabs() { 
    //Get all tabs in 'normal' windows: 
    // May want to test. Could want to get all tabs in all windows 
    // Of windowTypes:["normal","popup","panel","devtools", probably only 
    // want "normal" and "popup" tabs to be bookmarked and closed. 
    let queryInfos = [{windowType: 'normal'},{windowType: 'popup'}]; 
    queryInfos.forEach(function(queryInfo){ 
     chrome.tabs.query(queryInfo, function(tabs) { 
      for (let tab of tabs) { 
       bookmarkAndRemoveTab(tab); 
      } 
     }); 
    }); 
} 
+0

だから私はあなたのコードを実装しました:** chrome.browserAction.onClicked.addListener(bookmarkAndRemove AllTabs); **私はまだ同じ問題に走っています。最初のタブをブックマークしてからすべてのタブを閉じます。私が再び開くと、最初のものだけがブックマークされました。 – Robe

+0

OK、私は、愚かな、ブックマークを作成する実際のプロセスを調べていない選択をしました。それが非同期であることは私には明らかで明白であったはずです。コードを修正して、動作するはずのものに修正しました。問題はおそらくブックマーク処理が開始されたが完了していないことだった。タブが削除される(そしてFirefoxがシャットダウンされる)前に。ブックマークが作成されるまで、各タブは削除されません。 – Makyen

関連する問題