summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/api/tabs
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions/api/tabs')
-rw-r--r--chrome/browser/extensions/api/tabs/tabs.cc27
-rw-r--r--chrome/browser/extensions/api/tabs/tabs.h5
-rw-r--r--chrome/browser/extensions/api/tabs/tabs_test.cc83
3 files changed, 115 insertions, 0 deletions
diff --git a/chrome/browser/extensions/api/tabs/tabs.cc b/chrome/browser/extensions/api/tabs/tabs.cc
index 76e34a9..1156651 100644
--- a/chrome/browser/extensions/api/tabs/tabs.cc
+++ b/chrome/browser/extensions/api/tabs/tabs.cc
@@ -1093,6 +1093,33 @@ bool CreateTabFunction::RunImpl() {
return true;
}
+bool DuplicateTabFunction::RunImpl() {
+ int tab_id = -1;
+ EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &tab_id));
+
+ Browser* browser = NULL;
+ TabStripModel* tab_strip = NULL;
+ TabContents* contents = NULL;
+ int tab_index = -1;
+ if (!GetTabById(tab_id, profile(), include_incognito(),
+ &browser, &tab_strip, &contents, &tab_index, &error_)) {
+ return false;
+ }
+
+ TabContents* new_contents = chrome::DuplicateTabAt(browser, tab_index);
+ if (!has_callback())
+ return true;
+
+ int new_index = tab_strip->GetIndexOfTabContents(new_contents);
+
+ // Return data about the newly created tab.
+ SetResult(ExtensionTabUtil::CreateTabValue(
+ new_contents->web_contents(),
+ tab_strip, new_index, GetExtension()));
+
+ return true;
+}
+
bool GetTabFunction::RunImpl() {
int tab_id = -1;
EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &tab_id));
diff --git a/chrome/browser/extensions/api/tabs/tabs.h b/chrome/browser/extensions/api/tabs/tabs.h
index 26125ac..b808950 100644
--- a/chrome/browser/extensions/api/tabs/tabs.h
+++ b/chrome/browser/extensions/api/tabs/tabs.h
@@ -109,6 +109,11 @@ class CreateTabFunction : public SyncExtensionFunction {
virtual bool RunImpl() OVERRIDE;
DECLARE_EXTENSION_FUNCTION_NAME("tabs.create")
};
+class DuplicateTabFunction : public SyncExtensionFunction {
+ virtual ~DuplicateTabFunction() {}
+ virtual bool RunImpl() OVERRIDE;
+ DECLARE_EXTENSION_FUNCTION_NAME("tabs.duplicate")
+};
class HighlightTabsFunction : public SyncExtensionFunction {
virtual ~HighlightTabsFunction() {}
virtual bool RunImpl() OVERRIDE;
diff --git a/chrome/browser/extensions/api/tabs/tabs_test.cc b/chrome/browser/extensions/api/tabs/tabs_test.cc
index dfe8f62..e9c97488 100644
--- a/chrome/browser/extensions/api/tabs/tabs_test.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_test.cc
@@ -604,3 +604,86 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, InvalidUpdateWindowState) {
browser()),
keys::kInvalidWindowStateError));
}
+
+IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DuplicateTab) {
+ static const char kNewBlankTabArgs[] ="about:blank";
+
+ content::OpenURLParams params(GURL(kNewBlankTabArgs), content::Referrer(),
+ NEW_FOREGROUND_TAB,
+ content::PAGE_TRANSITION_LINK, false);
+ content::WebContents* web_contents = browser()->OpenURL(params);
+ int tab_id = ExtensionTabUtil::GetTabId(web_contents);
+ int window_id = ExtensionTabUtil::GetWindowIdOfTab(web_contents);
+ int tab_index = -1;
+ TabStripModel* tab_strip;
+ ExtensionTabUtil::GetTabStripModel(web_contents, &tab_strip, &tab_index);
+
+ scoped_refptr<DuplicateTabFunction> duplicate_tab_function(
+ new DuplicateTabFunction());
+ scoped_ptr<base::DictionaryValue> test_extension_value(
+ utils::ParseDictionary(
+ "{\"name\": \"Test\", \"version\": \"1.0\", \"permissions\": [\"tabs\"]}"
+ ));
+ scoped_refptr<extensions::Extension> empty_tab_extension(
+ utils::CreateExtension(test_extension_value.get()));
+ duplicate_tab_function->set_extension(empty_tab_extension.get());
+ duplicate_tab_function->set_has_callback(true);
+
+ scoped_ptr<base::DictionaryValue> duplicate_result(utils::ToDictionary(
+ utils::RunFunctionAndReturnSingleResult(
+ duplicate_tab_function.get(), base::StringPrintf("[%u]", tab_id),
+ browser())));
+
+ int duplicate_tab_id = utils::GetInteger(duplicate_result.get(), "id");
+ int duplicate_tab_window_id = utils::GetInteger(duplicate_result.get(),
+ "windowId");
+ int duplicate_tab_index = utils::GetInteger(duplicate_result.get(), "index");
+ EXPECT_EQ(base::Value::TYPE_DICTIONARY, duplicate_result->GetType());
+ // Duplicate tab id should be different from the original tab id.
+ EXPECT_NE(tab_id, duplicate_tab_id);
+ EXPECT_EQ(window_id, duplicate_tab_window_id);
+ EXPECT_EQ(tab_index + 1, duplicate_tab_index);
+ // The test empty tab extension has tabs permissions, therefore
+ // |duplicate_result| should contain url, title, and faviconUrl
+ // in the function result.
+ EXPECT_TRUE(utils::HasPrivacySensitiveFields(duplicate_result.get()));
+}
+
+IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DuplicateTabNoPermission) {
+ static const char kNewBlankTabArgs[] ="about:blank";
+
+ content::OpenURLParams params(GURL(kNewBlankTabArgs), content::Referrer(),
+ NEW_FOREGROUND_TAB,
+ content::PAGE_TRANSITION_LINK, false);
+ content::WebContents* web_contents = browser()->OpenURL(params);
+ int tab_id = ExtensionTabUtil::GetTabId(web_contents);
+ int window_id = ExtensionTabUtil::GetWindowIdOfTab(web_contents);
+ int tab_index = -1;
+ TabStripModel* tab_strip;
+ ExtensionTabUtil::GetTabStripModel(web_contents, &tab_strip, &tab_index);
+
+ scoped_refptr<DuplicateTabFunction> duplicate_tab_function(
+ new DuplicateTabFunction());
+ scoped_refptr<extensions::Extension> empty_extension(
+ utils::CreateEmptyExtension());
+ duplicate_tab_function->set_extension(empty_extension.get());
+ duplicate_tab_function->set_has_callback(true);
+
+ scoped_ptr<base::DictionaryValue> duplicate_result(utils::ToDictionary(
+ utils::RunFunctionAndReturnSingleResult(
+ duplicate_tab_function.get(), base::StringPrintf("[%u]", tab_id),
+ browser())));
+
+ int duplicate_tab_id = utils::GetInteger(duplicate_result.get(), "id");
+ int duplicate_tab_window_id = utils::GetInteger(duplicate_result.get(),
+ "windowId");
+ int duplicate_tab_index = utils::GetInteger(duplicate_result.get(), "index");
+ EXPECT_EQ(base::Value::TYPE_DICTIONARY, duplicate_result->GetType());
+ // Duplicate tab id should be different from the original tab id.
+ EXPECT_NE(tab_id, duplicate_tab_id);
+ EXPECT_EQ(window_id, duplicate_tab_window_id);
+ EXPECT_EQ(tab_index + 1, duplicate_tab_index);
+ // The test empty extension has no permissions, therefore |duplicate_result|
+ // should not contain url, title, and faviconUrl in the function result.
+ EXPECT_FALSE(utils::HasPrivacySensitiveFields(duplicate_result.get()));
+}