Bug 1238312 - implement tabs.duplicate. r=kmag

MozReview-Commit-ID: Fzd6BuAEgSl

--HG--
extra : transplant_source : %F3%1C%C6%13Hn%DF%051%2B%7D%AB%D1%AE%F17Y%05oF
This commit is contained in:
Andy McKay 2016-02-12 15:38:55 -08:00
parent 11ae76df3b
commit c123766e69
4 changed files with 65 additions and 1 deletions

View File

@ -646,6 +646,25 @@ extensions.registerSchemaAPI("tabs", null, (extension, context) => {
return Promise.resolve(tabsMoved.map(tab => TabManager.convert(extension, tab)));
},
duplicate: function(tabId) {
let tab = TabManager.getTab(tabId);
if (!tab) {
return Promise.reject({message: `Invalid tab ID: ${tabId}`});
}
let gBrowser = tab.ownerDocument.defaultView.gBrowser;
let newTab = gBrowser.duplicateTab(tab);
gBrowser.moveTabTo(newTab, tab._tPos + 1);
gBrowser.selectTabAtIndex(newTab._tPos);
return new Promise(resolve => {
newTab.addEventListener("SSTabRestored", function listener() {
newTab.removeEventListener("SSTabRestored", listener);
return resolve(TabManager.convert(extension, newTab));
});
});
},
},
};
return self;

View File

@ -31,6 +31,7 @@ support-files =
[browser_ext_tabs_query.js]
[browser_ext_tabs_getCurrent.js]
[browser_ext_tabs_create.js]
[browser_ext_tabs_duplicate.js]
[browser_ext_tabs_update.js]
[browser_ext_tabs_onUpdated.js]
[browser_ext_tabs_sendMessage.js]

View File

@ -0,0 +1,44 @@
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
add_task(function* testDuplicateTab() {
yield BrowserTestUtils.openNewForegroundTab(gBrowser, "http://example.net/");
let extension = ExtensionTestUtils.loadExtension({
manifest: {
"permissions": ["tabs"],
},
background: function() {
browser.tabs.query({
lastFocusedWindow: true,
}, function(tabs) {
let source = tabs[1];
// By moving it 0, we check that the new tab is created next
// to the existing one.
browser.tabs.move(source.id, {index: 0}, () => {
browser.tabs.duplicate(source.id, (tab) => {
browser.test.assertEq("http://example.net/", tab.url);
// Should be the second tab, next to the one duplicated.
browser.test.assertEq(1, tab.index);
// Should be selected by default.
browser.test.assertTrue(tab.selected);
browser.test.notifyPass("tabs.duplicate");
});
});
});
},
});
yield extension.startup();
yield extension.awaitFinish("tabs.duplicate");
yield extension.unload();
while (window.gBrowser.tabs.length > 1) {
let tab = window.gBrowser.tabs[0];
if (tab.linkedBrowser.currentURI.spec === "http://example.net/") {
yield BrowserTestUtils.removeTab(tab);
}
}
});

View File

@ -204,7 +204,7 @@ class BaseContext {
* function for the promise, and no promise is returned. In this case,
* the callback is called when the promise resolves or rejects. In the
* latter case, `lastError` is set to the rejection value, and the
* callback funciton must check `browser.runtime.lastError` or
* callback function must check `browser.runtime.lastError` or
* `extension.runtime.lastError` in order to prevent it being reported
* to the console.
*