Index: chrome/browser/extensions/api/extension_action/browser_action_apitest.cc |
diff --git a/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc b/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc |
index f64a27981a92d3f5f24d5d93e7194da4e693b423..a8f61c9e8e30fa7545fcc3c368392fdcb7fdc905 100644 |
--- a/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc |
+++ b/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc |
@@ -24,14 +24,10 @@ |
#include "chrome/browser/ui/tabs/tab_strip_model.h" |
#include "chrome/common/url_constants.h" |
#include "chrome/test/base/ui_test_utils.h" |
-#include "content/public/browser/browser_context.h" |
#include "content/public/browser/notification_service.h" |
#include "content/public/browser/render_frame_host.h" |
#include "content/public/browser/web_contents.h" |
#include "content/public/test/browser_test_utils.h" |
-#include "content/public/test/content_browser_test_utils.h" |
-#include "content/public/test/download_test_observer.h" |
-#include "content/public/test/test_utils.h" |
#include "extensions/browser/extension_registry.h" |
#include "extensions/browser/extension_system.h" |
#include "extensions/browser/notification_types.h" |
@@ -42,7 +38,6 @@ |
#include "extensions/test/result_catcher.h" |
#include "net/dns/mock_host_resolver.h" |
#include "net/test/embedded_test_server/embedded_test_server.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
#include "ui/base/resource/resource_bundle.h" |
#include "ui/gfx/geometry/rect.h" |
#include "ui/gfx/geometry/size.h" |
@@ -110,7 +105,7 @@ |
return browser_action_test_util_.get(); |
} |
- WebContents* OpenPopup(int index) { |
+ bool OpenPopup(int index) { |
ResultCatcher catcher; |
content::WindowedNotificationObserver popup_observer( |
content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, |
@@ -118,13 +113,7 @@ |
GetBrowserActionsBar()->Press(index); |
popup_observer.Wait(); |
EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); |
- |
- if (!GetBrowserActionsBar()->HasPopup()) |
- return nullptr; |
- |
- const auto& source = static_cast<const content::Source<WebContents>&>( |
- popup_observer.source()); |
- return source.ptr(); |
+ return GetBrowserActionsBar()->HasPopup(); |
} |
ExtensionAction* GetBrowserAction(const Extension& extension) { |
@@ -805,192 +794,5 @@ |
EXPECT_TRUE(catcher.GetNextResult()) << message_; |
} |
-class NavigatingExtensionPopupBrowserTest : public BrowserActionApiTest { |
- public: |
- const Extension& popup_extension() { return *popup_extension_; } |
- const Extension& other_extension() { return *other_extension_; } |
- |
- void SetUpOnMainThread() override { |
- BrowserActionApiTest::SetUpOnMainThread(); |
- |
- host_resolver()->AddRule("*", "127.0.0.1"); |
- ASSERT_TRUE(embedded_test_server()->Start()); |
- |
- // Load an extension with a pop-up. |
- ASSERT_TRUE(popup_extension_ = LoadExtension(test_data_dir_.AppendASCII( |
- "browser_action/popup_with_form"))); |
- |
- // Load another extension (that we can try navigating to). |
- ASSERT_TRUE(other_extension_ = LoadExtension(test_data_dir_.AppendASCII( |
- "browser_action/popup_with_iframe"))); |
- } |
- |
- enum ExpectedNavigationStatus { |
- EXPECTING_NAVIGATION_SUCCESS, |
- EXPECTING_NAVIGATION_FAILURE, |
- }; |
- |
- void TestPopupNavigationViaGet( |
- const GURL& target_url, |
- ExpectedNavigationStatus expected_navigation_status) { |
- std::string navigation_starting_script = |
- "window.location = '" + target_url.spec() + "';\n"; |
- TestPopupNavigation(target_url, expected_navigation_status, |
- navigation_starting_script); |
- } |
- |
- void TestPopupNavigationViaPost( |
- const GURL& target_url, |
- ExpectedNavigationStatus expected_navigation_status) { |
- std::string navigation_starting_script = |
- "var form = document.getElementById('form');\n" |
- "form.action = '" + target_url.spec() + "';\n" |
- "form.submit();\n"; |
- TestPopupNavigation(target_url, expected_navigation_status, |
- navigation_starting_script); |
- } |
- |
- private: |
- void TestPopupNavigation(const GURL& target_url, |
- ExpectedNavigationStatus expected_navigation_status, |
- std::string navigation_starting_script) { |
- // Were there any failures so far (e.g. in SetUpOnMainThread)? |
- ASSERT_FALSE(HasFailure()); |
- |
- // Simulate a click on the browser action to open the popup. |
- WebContents* popup = OpenPopup(0); |
- ASSERT_TRUE(popup); |
- GURL popup_url = popup_extension().GetResourceURL("popup.html"); |
- EXPECT_EQ(popup_url, popup->GetLastCommittedURL()); |
- |
- // Note that the |setTimeout| call below is needed to make sure |
- // ExecuteScriptAndExtractBool returns *after* a scheduled navigation has |
- // already started. |
- std::string script_to_execute = |
- navigation_starting_script + |
- "setTimeout(\n" |
- " function() { window.domAutomationController.send(true); },\n" |
- " 0);\n"; |
- |
- // Try to navigate the pop-up. |
- bool ignored_script_result = false; |
- content::WebContentsDestroyedWatcher popup_destruction_watcher(popup); |
- EXPECT_TRUE(ExecuteScriptAndExtractBool(popup, script_to_execute, |
- &ignored_script_result)); |
- popup = popup_destruction_watcher.web_contents(); |
- |
- // Verify if the popup navigation succeeded or failed as expected. |
- if (!popup) { |
- // If navigation ends up in a tab, then the tab will be focused and |
- // therefore the popup will be closed, destroying associated WebContents - |
- // don't do any verification in this case. |
- ADD_FAILURE() << "Navigation should not close extension pop-up"; |
- } else { |
- // If the extension popup is still opened, then wait until there is no |
- // load in progress, and verify whether the navigation succeeded or not. |
- WaitForLoadStop(popup); |
- if (expected_navigation_status == EXPECTING_NAVIGATION_SUCCESS) { |
- EXPECT_EQ(target_url, popup->GetLastCommittedURL()) |
- << "Navigation to " << target_url |
- << " should succeed in an extension pop-up"; |
- } else { |
- EXPECT_NE(target_url, popup->GetLastCommittedURL()) |
- << "Navigation to " << target_url |
- << " should fail in an extension pop-up"; |
- EXPECT_THAT( |
- popup->GetLastCommittedURL(), |
- ::testing::AnyOf(::testing::Eq(popup_url), |
- ::testing::Eq(GURL("chrome-extension://invalid")), |
- ::testing::Eq(GURL("about:blank")))); |
- } |
- } |
- |
- // Make sure that the web navigation did not succeed somewhere outside of |
- // the extension popup (as it might if ExtensionViewHost::OpenURLFromTab |
- // forwards the navigation to Browser::OpenURL [which doesn't specify a |
- // source WebContents]). |
- TabStripModel* tabs = browser()->tab_strip_model(); |
- for (int i = 0; i < tabs->count(); i++) { |
- WebContents* tab_contents = tabs->GetWebContentsAt(i); |
- WaitForLoadStop(tab_contents); |
- EXPECT_NE(target_url, tab_contents->GetLastCommittedURL()) |
- << "Navigating an extension pop-up should not affect tabs."; |
- } |
- |
- // Close the pop-up. |
- EXPECT_TRUE(GetBrowserActionsBar()->HidePopup()); |
- } |
- |
- const Extension* popup_extension_; |
- const Extension* other_extension_; |
-}; |
- |
-// Tests that an extension pop-up cannot be navigated to a web page. |
-IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupBrowserTest, Webpage) { |
- GURL web_url(embedded_test_server()->GetURL("foo.com", "/title1.html")); |
- TestPopupNavigationViaGet(web_url, EXPECTING_NAVIGATION_FAILURE); |
- TestPopupNavigationViaPost(web_url, EXPECTING_NAVIGATION_FAILURE); |
-} |
- |
-// Tests that an extension pop-up can be navigated to another page |
-// in the same extension. |
-IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupBrowserTest, |
- PageInSameExtension) { |
- GURL other_page_in_same_extension = |
- popup_extension().GetResourceURL("other_page.html"); |
- TestPopupNavigationViaGet(other_page_in_same_extension, |
- EXPECTING_NAVIGATION_SUCCESS); |
- TestPopupNavigationViaPost(other_page_in_same_extension, |
- EXPECTING_NAVIGATION_SUCCESS); |
-} |
- |
-// Tests that an extension pop-up cannot be navigated to a page |
-// in another extension. |
-IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupBrowserTest, |
- PageInOtherExtension) { |
- GURL other_extension_url = other_extension().GetResourceURL("other.html"); |
- TestPopupNavigationViaGet(other_extension_url, EXPECTING_NAVIGATION_FAILURE); |
- TestPopupNavigationViaPost(other_extension_url, EXPECTING_NAVIGATION_FAILURE); |
-} |
- |
-// Tests that navigating an extension pop-up to a http URI that returns |
-// Content-Disposition: attachment; filename=... |
-// works: No navigation, but download shelf visible + download goes through. |
-// |
-// Note - there is no "...ViaGet" flavour of this test, because we don't care |
-// (yet) if GET succeeds with the download or not (it probably should succeed |
-// for consistency with POST, but it always failed in M54 and before). After |
-// abandoing ShouldFork/OpenURL for all methods (not just for POST) [see comment |
-// about https://crbug.com/646261 in ChromeContentRendererClient::ShouldFork] |
-// GET should automagically start working for downloads. |
-// TODO(lukasza): https://crbug.com/650694: Add a "Get" flavour of the test once |
-// the download works both for GET and POST requests. |
-IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupBrowserTest, DownloadViaPost) { |
- content::DownloadTestObserverTerminal downloads_observer( |
- content::BrowserContext::GetDownloadManager(browser()->profile()), |
- 1, // == wait_count (only waiting for "download-test3.gif"). |
- content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); |
- |
- // Navigate to a URL that replies with |
- // Content-Disposition: attachment; filename=... |
- // header. |
- GURL download_url( |
- embedded_test_server()->GetURL("foo.com", "/download-test3.gif")); |
- TestPopupNavigationViaPost(download_url, EXPECTING_NAVIGATION_FAILURE); |
- |
- // Verify that "download-test3.gif got downloaded. |
- downloads_observer.WaitForFinished(); |
- EXPECT_EQ(0u, downloads_observer.NumDangerousDownloadsSeen()); |
- EXPECT_EQ(1u, downloads_observer.NumDownloadsSeenInState( |
- content::DownloadItem::COMPLETE)); |
- |
- // The test verification below is applicable only to scenarios where the |
- // download shelf is supported - on ChromeOS, instead of the download shelf, |
- // there is a download notification in the right-bottom corner of the screen. |
-#if !defined(OS_CHROMEOS) |
- EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible()); |
-#endif |
-} |
- |
} // namespace |
} // namespace extensions |