Chromium Code Reviews| Index: chrome/browser/extensions/api/tabs/tabs_test.cc |
| diff --git a/chrome/browser/extensions/api/tabs/tabs_test.cc b/chrome/browser/extensions/api/tabs/tabs_test.cc |
| index 7e1e7c6f3ce25c27c16ec06435144b3bae2960ea..4f5f557f1572eb26664eec478f417817b53862d4 100644 |
| --- a/chrome/browser/extensions/api/tabs/tabs_test.cc |
| +++ b/chrome/browser/extensions/api/tabs/tabs_test.cc |
| @@ -20,8 +20,10 @@ |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_commands.h" |
| #include "chrome/browser/ui/browser_window.h" |
| +#include "chrome/browser/ui/tabs/tab_strip_model.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| +#include "content/public/common/page_zoom.h" |
| #include "content/public/common/url_constants.h" |
| #include "ui/gfx/rect.h" |
| @@ -591,4 +593,336 @@ IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DuplicateTabNoPermission) { |
| EXPECT_FALSE(utils::HasPrivacySensitiveFields(duplicate_result.get())); |
| } |
| +// Tester class for the tabs.zoom* api functions. |
| +class ExtensionTabsZoomTest : public ExtensionTabsTest { |
| + public: |
| + virtual void SetUpOnMainThread() OVERRIDE; |
| + |
| + // Runs chrome.tabs.setZoom(). |
| + void RunSetZoom(int tab_id, double zoom_factor); |
| + |
| + // Runs chrome.tabs.getZoom(). |
| + testing::AssertionResult RunGetZoom(int tab_id, double* zoom_factor); |
| + |
| + // Runs chrome.tabs.setZoomSettings(). |
| + void RunSetZoomSettings(int tab_id, const char* mode, const char* scope); |
| + |
| + // Runs chrome.tabs.getZoomSettings(). |
| + testing::AssertionResult RunGetZoomSettings(int tab_id, |
| + std::string* mode, |
| + std::string* scope); |
| + |
| + // Runs chrome.tabs.setZoom(), expecting an error. |
| + void RunSetZoomExpectError(int tab_id, |
| + double zoom_factor, |
| + std::string* error); |
| + // Runs chrome.tabs.setZoomSettings(), expecting an error. |
|
Devlin
2014/06/19 21:15:28
nit: newline between functions
wjmaclean
2014/06/20 22:01:32
Done.
|
| + void RunSetZoomSettingsExpectError(int tab_id, |
| + const char* mode, |
| + const char* scope, |
| + std::string* error); |
| + |
| + content::WebContents* OpenUrlAndWaitForLoad(const GURL& url); |
| + |
| + private: |
| + scoped_refptr<Extension> extension_; |
| +}; |
| + |
| +void ExtensionTabsZoomTest::SetUpOnMainThread() { |
|
Devlin
2014/06/19 21:15:29
Call the super::SetUpOnMainThread() first.
wjmaclean
2014/06/20 22:01:33
Done.
|
| + extension_ = utils::CreateEmptyExtension(); |
| +} |
| + |
| +void ExtensionTabsZoomTest::RunSetZoom(int tab_id, double zoom_factor) { |
|
Devlin
2014/06/19 21:15:28
This should probably return the bool result from u
wjmaclean
2014/06/20 22:01:32
Done.
|
| + scoped_refptr<TabsSetZoomFunction> set_zoom_function( |
| + new TabsSetZoomFunction()); |
| + set_zoom_function->set_extension(extension_); |
| + set_zoom_function->set_has_callback(true); |
| + |
| + utils::RunFunction(set_zoom_function.get(), |
| + base::StringPrintf("[%u, %lf]", tab_id, zoom_factor), |
| + browser(), |
| + extension_function_test_utils::NONE); |
| +} |
| + |
| +testing::AssertionResult ExtensionTabsZoomTest::RunGetZoom( |
| + int tab_id, |
| + double* zoom_factor) { |
| + scoped_refptr<TabsGetZoomFunction> get_zoom_function( |
| + new TabsGetZoomFunction()); |
| + get_zoom_function->set_extension(extension_); |
| + get_zoom_function->set_has_callback(true); |
| + |
| + scoped_ptr<base::Value> get_zoom_result( |
| + utils::RunFunctionAndReturnSingleResult( |
| + get_zoom_function.get(), |
| + base::StringPrintf("[%u]", tab_id), |
| + browser())); |
| + |
| + if (!get_zoom_result.get()) |
| + return testing::AssertionFailure() << "no result"; |
| + if (!get_zoom_result->GetAsDouble(zoom_factor)) |
| + return testing::AssertionFailure() << "result was not a double"; |
| + |
| + return testing::AssertionSuccess(); |
| +} |
| + |
| +void ExtensionTabsZoomTest::RunSetZoomSettings(int tab_id, |
|
Devlin
2014/06/19 21:15:28
again, probably return a bool here.
wjmaclean
2014/06/20 22:01:33
Done.
|
| + const char* mode, |
| + const char* scope) { |
| + scoped_refptr<TabsSetZoomSettingsFunction> set_zoom_settings_function( |
| + new TabsSetZoomSettingsFunction()); |
| + set_zoom_settings_function->set_extension(extension_); |
| + |
| + std:: string args; |
|
Devlin
2014/06/19 21:15:28
no space after std::.
wjmaclean
2014/06/20 22:01:33
Done.
|
| + if (scope) { |
| + args = base::StringPrintf("[%u, {\"mode\": \"%s\", \"scope\": \"%s\"}]", |
| + tab_id, mode, scope); |
| + } else { |
| + args = base::StringPrintf("[%u, {\"mode\": \"%s\"}]", tab_id, mode); |
| + } |
| + |
| + utils::RunFunction(set_zoom_settings_function.get(), |
| + args, |
| + browser(), |
| + extension_function_test_utils::NONE); |
| + content::RunAllPendingInMessageLoop(); |
|
Devlin
2014/06/19 21:15:28
missed this one.
wjmaclean
2014/06/20 22:01:32
Done.
|
| +} |
| + |
| +testing::AssertionResult ExtensionTabsZoomTest::RunGetZoomSettings( |
| + int tab_id, |
| + std::string* mode, |
| + std::string* scope) { |
| + DCHECK(mode); |
| + DCHECK(scope); |
| + scoped_refptr<TabsGetZoomSettingsFunction> get_zoom_settings_function( |
| + new TabsGetZoomSettingsFunction()); |
| + get_zoom_settings_function->set_extension(extension_); |
| + get_zoom_settings_function->set_has_callback(true); |
| + |
| + scoped_ptr<base::DictionaryValue> get_zoom_settings_result( |
| + utils::ToDictionary(utils::RunFunctionAndReturnSingleResult( |
| + get_zoom_settings_function.get(), |
| + base::StringPrintf("[%u]", tab_id), |
| + browser()))); |
| + |
| + if (!get_zoom_settings_result.get()) |
| + return testing::AssertionFailure() << "no result"; |
| + |
| + *mode = utils::GetString(get_zoom_settings_result.get(), "mode"); |
| + *scope = utils::GetString(get_zoom_settings_result.get(), "scope"); |
| + |
| + return testing::AssertionSuccess(); |
| +} |
| + |
| +void ExtensionTabsZoomTest::RunSetZoomExpectError(int tab_id, |
|
Devlin
2014/06/19 21:15:28
May as well have this return |error| directly.
wjmaclean
2014/06/20 22:01:33
Done.
|
| + double zoom_factor, |
| + std::string* error) { |
| + scoped_refptr<TabsSetZoomFunction> set_zoom_function( |
| + new TabsSetZoomFunction()); |
| + set_zoom_function->set_extension(extension_); |
| + set_zoom_function->set_has_callback(true); |
| + |
| + *error = utils::RunFunctionAndReturnError( |
| + set_zoom_function.get(), |
| + base::StringPrintf("[%u, %lf]", tab_id, zoom_factor), |
| + browser()); |
| +} |
| + |
| +void ExtensionTabsZoomTest::RunSetZoomSettingsExpectError(int tab_id, |
|
Devlin
2014/06/19 21:15:29
ditto.
wjmaclean
2014/06/20 22:01:33
Done.
|
| + const char* mode, |
| + const char* scope, |
| + std::string* error) { |
| + scoped_refptr<TabsSetZoomSettingsFunction> set_zoom_settings_function( |
| + new TabsSetZoomSettingsFunction()); |
| + set_zoom_settings_function->set_extension(extension_); |
| + |
| + *error = utils::RunFunctionAndReturnError(set_zoom_settings_function.get(), |
| + base::StringPrintf( |
| + "[%u, {\"mode\": \"%s\", " |
| + "\"scope\": \"%s\"}]", |
| + tab_id, |
| + mode, |
| + scope), |
| + browser()); |
| +} |
| + |
| +content::WebContents* ExtensionTabsZoomTest::OpenUrlAndWaitForLoad( |
| + const GURL& url) { |
| + ui_test_utils::NavigateToURLWithDisposition( |
| + browser(), |
| + url, |
| + NEW_FOREGROUND_TAB, |
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
| + return browser()->tab_strip_model()->GetActiveWebContents(); |
| +} |
| + |
| +namespace { |
| +double GetZoomLevel(const content::WebContents* web_contents) { |
| + return ZoomController::FromWebContents(web_contents)->GetZoomLevel(); |
| +} |
| +} // namespace |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionTabsZoomTest, SetAndGetZoom) { |
| + const char kNewTestTabArgs[] = "about:blank"; |
| + content::OpenURLParams params(GURL(kNewTestTabArgs), |
| + content::Referrer(), |
| + NEW_FOREGROUND_TAB, |
| + content::PAGE_TRANSITION_LINK, |
| + false); |
| + content::WebContents* web_contents = browser()->OpenURL(params); |
| + int tab_id = ExtensionTabUtil::GetTabId(web_contents); |
| + |
| + // Test default values before we set anything. |
| + double zoom_factor = -1; |
| + EXPECT_TRUE(RunGetZoom(tab_id, &zoom_factor)); |
| + EXPECT_EQ(1.0, zoom_factor); |
| + |
| + // Test chrome.tabs.setZoom(). |
| + const double kZoomLevel = 0.8; |
| + RunSetZoom(tab_id, kZoomLevel); |
| + EXPECT_EQ(kZoomLevel, |
| + content::ZoomLevelToZoomFactor(GetZoomLevel(web_contents))); |
| + |
| + // Test chrome.tabs.getZoom(). |
| + zoom_factor = -1; |
| + EXPECT_TRUE(RunGetZoom(tab_id, &zoom_factor)); |
| + EXPECT_EQ(kZoomLevel, zoom_factor); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionTabsZoomTest, ZoomSettings) { |
| + const char kNewTestTabArgsA[] = "data:text/html,A"; |
| + const char kNewTestTabArgsB[] = "data:text/html,B"; |
| + |
| + content::OpenURLParams params_A(GURL(kNewTestTabArgsA), content::Referrer(), |
|
Devlin
2014/06/19 21:15:29
nit: one arg per line.
wjmaclean
2014/06/20 22:01:33
Done.
|
| + NEW_FOREGROUND_TAB, |
| + content::PAGE_TRANSITION_LINK, false); |
| + content::OpenURLParams params_B(GURL(kNewTestTabArgsB), content::Referrer(), |
| + NEW_FOREGROUND_TAB, |
| + content::PAGE_TRANSITION_LINK, false); |
| + |
| + // Tabs A1 and A2 are navigated to the same origin, while B is navigated |
| + // to a different one. |
| + content::WebContents* web_contents_A1 = OpenUrlAndWaitForLoad(params_A.url); |
| + content::WebContents* web_contents_A2 = OpenUrlAndWaitForLoad(params_A.url); |
| + content::WebContents* web_contents_B = OpenUrlAndWaitForLoad(params_B.url); |
| + |
| + int tab_id_A1 = ExtensionTabUtil::GetTabId(web_contents_A1); |
| + int tab_id_A2 = ExtensionTabUtil::GetTabId(web_contents_A2); |
| + int tab_id_B = ExtensionTabUtil::GetTabId(web_contents_B); |
| + |
| + ASSERT_FLOAT_EQ( |
| + 1.f, content::ZoomLevelToZoomFactor(GetZoomLevel(web_contents_A1))); |
| + ASSERT_FLOAT_EQ( |
| + 1.f, content::ZoomLevelToZoomFactor(GetZoomLevel(web_contents_A2))); |
| + ASSERT_FLOAT_EQ( |
| + 1.f, content::ZoomLevelToZoomFactor(GetZoomLevel(web_contents_B))); |
| + |
| + // Test per-origin automatic zoom settings. |
| + RunSetZoom(tab_id_B, 1.f); |
| + RunSetZoom(tab_id_A2, 1.1f); |
| + EXPECT_FLOAT_EQ( |
| + 1.1f, content::ZoomLevelToZoomFactor(GetZoomLevel(web_contents_A1))); |
| + EXPECT_FLOAT_EQ( |
| + 1.1f, content::ZoomLevelToZoomFactor(GetZoomLevel(web_contents_A2))); |
| + EXPECT_FLOAT_EQ(1.f, |
| + content::ZoomLevelToZoomFactor(GetZoomLevel(web_contents_B))); |
| + |
| + // Test per-tab automatic zoom settings. |
| + RunSetZoomSettings(tab_id_A1, "automatic", "per-tab"); |
| + RunSetZoom(tab_id_A1, 1.2f); |
| + EXPECT_FLOAT_EQ( |
| + 1.2f, content::ZoomLevelToZoomFactor(GetZoomLevel(web_contents_A1))); |
| + EXPECT_FLOAT_EQ( |
| + 1.1f, content::ZoomLevelToZoomFactor(GetZoomLevel(web_contents_A2))); |
| + |
| + // Test 'manual' mode. |
| + RunSetZoomSettings(tab_id_A1, "manual", NULL); |
| + RunSetZoom(tab_id_A1, 1.3f); |
| + EXPECT_FLOAT_EQ( |
| + 1.3f, content::ZoomLevelToZoomFactor(GetZoomLevel(web_contents_A1))); |
| + EXPECT_FLOAT_EQ( |
| + 1.1f, content::ZoomLevelToZoomFactor(GetZoomLevel(web_contents_A2))); |
| + |
| + // Test 'disabled' mode, which will reset A1's zoom to 1.f. |
| + RunSetZoomSettings(tab_id_A1, "disabled", NULL); |
| + std::string error; |
| + RunSetZoomExpectError(tab_id_A1, 1.4f, &error); |
| + EXPECT_TRUE(MatchPattern(error, keys::kCannotZoomDisabledTabError)); |
| + EXPECT_FLOAT_EQ( |
| + 1.f, content::ZoomLevelToZoomFactor(GetZoomLevel(web_contents_A1))); |
| + // We should still be able to zoom A2 though. |
| + RunSetZoom(tab_id_A2, 1.4f); |
| + EXPECT_FLOAT_EQ( |
| + 1.4f, content::ZoomLevelToZoomFactor(GetZoomLevel(web_contents_A2))); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionTabsZoomTest, GetZoomSettings) { |
| + const char kNewTestTabArgs[] = "about:blank"; |
| + content::OpenURLParams params(GURL(kNewTestTabArgs), content::Referrer(), |
|
Devlin
2014/06/19 21:15:29
nit: one arg per line
wjmaclean
2014/06/20 22:01:33
Done.
|
| + NEW_FOREGROUND_TAB, |
| + content::PAGE_TRANSITION_LINK, false); |
| + content::WebContents* web_contents = browser()->OpenURL(params); |
| + int tab_id = ExtensionTabUtil::GetTabId(web_contents); |
| + |
| + std::string mode; |
| + std::string scope; |
| + |
| + EXPECT_TRUE(RunGetZoomSettings(tab_id, &mode, &scope)); |
| + EXPECT_EQ("automatic", mode); |
| + EXPECT_EQ("per-origin", scope); |
| + |
| + RunSetZoomSettings(tab_id, "automatic", "per-tab"); |
| + EXPECT_TRUE(RunGetZoomSettings(tab_id, &mode, &scope)); |
| + |
| + EXPECT_EQ("automatic", mode); |
| + EXPECT_EQ("per-tab", scope); |
| + |
| + std::string error; |
| + RunSetZoomSettingsExpectError(tab_id, "manual", "per-origin", &error); |
| + EXPECT_TRUE(MatchPattern(error, |
| + keys::kPerOriginOnlyInAutomaticError)); |
| + error = ""; |
| + RunSetZoomSettingsExpectError(tab_id, "disabled", "per-origin", &error); |
| + EXPECT_TRUE(MatchPattern(error, |
| + keys::kPerOriginOnlyInAutomaticError)); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionTabsZoomTest, CannotZoomBogusTabId) { |
| + const char kNewTestTabArgs[] = "about:blank"; |
| + content::OpenURLParams params(GURL(kNewTestTabArgs), content::Referrer(), |
|
Devlin
2014/06/19 21:15:29
nit: one arg per line.
wjmaclean
2014/06/20 22:01:33
Done.
|
| + NEW_FOREGROUND_TAB, |
|
Devlin
2014/06/19 21:15:29
If these params are always the same in all these t
wjmaclean
2014/06/20 22:01:33
Done.
|
| + content::PAGE_TRANSITION_LINK, false); |
| + content::WebContents* web_contents = browser()->OpenURL(params); |
| + int tab_id = ExtensionTabUtil::GetTabId(web_contents); |
| + |
| + std::string error; |
| + int bogus_id = tab_id + 1; |
|
Devlin
2014/06/19 21:15:28
nit: Just in case, maybe tab_id + 100.
wjmaclean
2014/06/20 22:01:33
Done.
|
| + RunSetZoomExpectError(bogus_id, 3.14159, &error); |
| + EXPECT_TRUE(MatchPattern(error, keys::kTabNotFoundError)); |
| + |
| + error = ""; |
| + RunSetZoomSettingsExpectError(bogus_id, "manual", "per-tab", &error); |
| + EXPECT_TRUE(MatchPattern(error, keys::kTabNotFoundError)); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(ExtensionTabsZoomTest, CannotZoomChromeURL) { |
|
Devlin
2014/06/19 21:15:29
Can we combine these last two tests into one Canno
wjmaclean
2014/06/20 22:01:32
Ok, although I'm not sure I understand the benefit
|
| + const char kNewTestTabArgs[] = "chrome://version"; |
| + content::OpenURLParams params(GURL(kNewTestTabArgs), content::Referrer(), |
| + NEW_FOREGROUND_TAB, |
| + content::PAGE_TRANSITION_LINK, false); |
| + content::WebContents* web_contents = browser()->OpenURL(params); |
| + int tab_id = ExtensionTabUtil::GetTabId(web_contents); |
| + |
| + std::string error; |
| + |
| + // Test chrome.tabs.setZoom(). |
| + RunSetZoomExpectError(tab_id, 3.14159, &error); |
| + EXPECT_TRUE(MatchPattern(error, keys::kCannotZoomChromePagesError)); |
| + |
| + // chrome.tabs.setZoomSettings(). |
| + RunSetZoomSettingsExpectError(tab_id, "manual", "per-tab", &error); |
| + EXPECT_TRUE(MatchPattern(error, |
| + keys::kCannotChangeChromePageZoomSettingsError)); |
| +} |
| + |
| } // namespace extensions |