Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Unified Diff: chrome/browser/app_controller_mac_browsertest.mm

Issue 794853004: Reland 1: "mac: Allow Chrome to hand off its active URL to other devices." (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comments from avi. Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/app_controller_mac.mm ('k') | chrome/browser/ui/cocoa/handoff_active_url_observer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/app_controller_mac_browsertest.mm
diff --git a/chrome/browser/app_controller_mac_browsertest.mm b/chrome/browser/app_controller_mac_browsertest.mm
index a136a1267f4744dd7b2011a483903a20b1e2d52f..040018887e7e94eab9f68be8a805f1e2467376ff 100644
--- a/chrome/browser/app_controller_mac_browsertest.mm
+++ b/chrome/browser/app_controller_mac_browsertest.mm
@@ -35,9 +35,11 @@
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
#include "components/bookmarks/test/bookmark_test_helpers.h"
#include "components/signin/core/common/profile_management_switches.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "extensions/browser/app_window/app_window_registry.h"
#include "extensions/common/extension.h"
@@ -481,3 +483,144 @@ IN_PROC_BROWSER_TEST_F(AppControllerMainMenuBrowserTest,
}
} // namespace
+
+//--------------------------AppControllerHandoffBrowserTest---------------------
+
+static GURL g_handoff_url;
+
+@interface AppController (BrowserTest)
+- (BOOL)new_shouldUseHandoff;
+- (void)new_passURLToHandoffManager:(const GURL&)handoffURL;
+@end
+
+@implementation AppController (BrowserTest)
+- (BOOL)new_shouldUseHandoff {
+ return YES;
+}
+
+- (void)new_passURLToHandoffManager:(const GURL&)handoffURL {
+ g_handoff_url = handoffURL;
+}
+@end
+
+namespace {
+
+class AppControllerHandoffBrowserTest : public InProcessBrowserTest {
+ protected:
+ AppControllerHandoffBrowserTest() {}
+
+ // Exchanges the implementations of the two selectors on the class
+ // AppController.
+ void ExchangeSelectors(SEL originalMethod, SEL newMethod) {
+ Class appControllerClass = NSClassFromString(@"AppController");
+
+ ASSERT_TRUE(appControllerClass != nil);
+
+ Method original =
+ class_getInstanceMethod(appControllerClass, originalMethod);
+ Method destination = class_getInstanceMethod(appControllerClass, newMethod);
+
+ ASSERT_TRUE(original != NULL);
+ ASSERT_TRUE(destination != NULL);
+
+ method_exchangeImplementations(original, destination);
+ }
+
+ // Swizzle Handoff related implementations.
+ void SetUpInProcessBrowserTestFixture() override {
+ // Handoff is only available on OSX 10.10+. This swizzle makes the logic
+ // run on all OSX versions.
+ SEL originalMethod = @selector(shouldUseHandoff);
+ SEL newMethod = @selector(new_shouldUseHandoff);
+ ExchangeSelectors(originalMethod, newMethod);
+
+ // This swizzle intercepts the URL that would be sent to the Handoff
+ // Manager, and instead puts it into a variable accessible to this test.
+ originalMethod = @selector(passURLToHandoffManager:);
+ newMethod = @selector(new_passURLToHandoffManager:);
+ ExchangeSelectors(originalMethod, newMethod);
+ }
+
+ // Closes the tab, and waits for the close to finish.
+ void CloseTab(Browser* browser, int index) {
+ content::WebContentsDestroyedWatcher destroyed_watcher(
+ browser->tab_strip_model()->GetWebContentsAt(index));
+ browser->tab_strip_model()->CloseWebContentsAt(
+ index, TabStripModel::CLOSE_CREATE_HISTORICAL_TAB);
+ destroyed_watcher.Wait();
+ }
+};
+
+// Tests that as a user switches between tabs, navigates within a tab, and
+// switches between browser windows, the correct URL is being passed to the
+// Handoff.
+IN_PROC_BROWSER_TEST_F(AppControllerHandoffBrowserTest, TestHandoffURLs) {
+ ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
+ EXPECT_EQ(g_handoff_url, GURL(url::kAboutBlankURL));
+
+ // Test that navigating to a URL updates the handoff URL.
+ GURL test_url1 = embedded_test_server()->GetURL("/title1.html");
+ ui_test_utils::NavigateToURL(browser(), test_url1);
+ EXPECT_EQ(g_handoff_url, test_url1);
+
+ // Test that opening a new tab updates the handoff URL.
+ GURL test_url2 = embedded_test_server()->GetURL("/title2.html");
+ chrome::NavigateParams params(browser(), test_url2, ui::PAGE_TRANSITION_LINK);
+ params.disposition = NEW_FOREGROUND_TAB;
+ ui_test_utils::NavigateToURL(&params);
+ EXPECT_EQ(g_handoff_url, test_url2);
+
+ // Test that switching tabs updates the handoff URL.
+ browser()->tab_strip_model()->ActivateTabAt(0, true);
+ EXPECT_EQ(g_handoff_url, test_url1);
+
+ // Test that closing the current tab updates the handoff URL.
+ CloseTab(browser(), 0);
+ EXPECT_EQ(g_handoff_url, test_url2);
+
+ // Test that opening a new browser window updates the handoff URL.
+ GURL test_url3 = embedded_test_server()->GetURL("/title3.html");
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(), GURL(test_url3), NEW_WINDOW,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
+ EXPECT_EQ(g_handoff_url, test_url3);
+
+ // Check that there are exactly 2 browsers.
+ BrowserList* active_browser_list =
+ BrowserList::GetInstance(chrome::GetActiveDesktop());
+ EXPECT_EQ(2u, active_browser_list->size());
+
+ // Close the one and only tab for the second browser window.
+ Browser* browser2 = active_browser_list->get(1);
+ CloseTab(browser2, 0);
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(g_handoff_url, test_url2);
+
+ // The URLs of incognito windows should not be passed to Handoff.
+ GURL test_url4 = embedded_test_server()->GetURL("/simple.html");
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(), GURL(test_url4), OFF_THE_RECORD,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
+ EXPECT_EQ(g_handoff_url, GURL());
+
+ // Open a new tab in the incognito window.
+ EXPECT_EQ(2u, active_browser_list->size());
+ Browser* browser3 = active_browser_list->get(1);
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser3, test_url4, NEW_FOREGROUND_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
+ EXPECT_EQ(g_handoff_url, GURL());
+
+ // Navigate the current tab in the incognito window.
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser3, test_url1, CURRENT_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+ EXPECT_EQ(g_handoff_url, GURL());
+
+ // Activate the original browser window.
+ Browser* browser1 = active_browser_list->get(0);
+ browser1->window()->Show();
+ EXPECT_EQ(g_handoff_url, test_url2);
+}
+
+} // namespace
« no previous file with comments | « chrome/browser/app_controller_mac.mm ('k') | chrome/browser/ui/cocoa/handoff_active_url_observer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698