diff options
Diffstat (limited to 'chrome/browser/extensions/api/tabs')
-rw-r--r-- | chrome/browser/extensions/api/tabs/tabs.cc | 27 | ||||
-rw-r--r-- | chrome/browser/extensions/api/tabs/tabs.h | 5 | ||||
-rw-r--r-- | chrome/browser/extensions/api/tabs/tabs_test.cc | 83 |
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())); +} |