mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 20:05:49 +00:00
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:
parent
11ae76df3b
commit
c123766e69
@ -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;
|
||||
|
@ -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]
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
});
|
@ -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.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user