OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import <Carbon/Carbon.h> | 5 #import <Carbon/Carbon.h> |
6 #import <Cocoa/Cocoa.h> | 6 #import <Cocoa/Cocoa.h> |
7 #import <Foundation/Foundation.h> | 7 #import <Foundation/Foundation.h> |
8 #import <Foundation/NSAppleEventDescriptor.h> | 8 #import <Foundation/NSAppleEventDescriptor.h> |
9 #import <objc/message.h> | 9 #import <objc/message.h> |
10 #import <objc/runtime.h> | 10 #import <objc/runtime.h> |
(...skipping 17 matching lines...) Expand all Loading... |
28 #include "chrome/browser/ui/browser_window.h" | 28 #include "chrome/browser/ui/browser_window.h" |
29 #include "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.h" | 29 #include "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.h" |
30 #include "chrome/browser/ui/host_desktop.h" | 30 #include "chrome/browser/ui/host_desktop.h" |
31 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 31 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
32 #include "chrome/browser/ui/user_manager.h" | 32 #include "chrome/browser/ui/user_manager.h" |
33 #include "chrome/common/chrome_constants.h" | 33 #include "chrome/common/chrome_constants.h" |
34 #include "chrome/common/chrome_switches.h" | 34 #include "chrome/common/chrome_switches.h" |
35 #include "chrome/common/pref_names.h" | 35 #include "chrome/common/pref_names.h" |
36 #include "chrome/common/url_constants.h" | 36 #include "chrome/common/url_constants.h" |
37 #include "chrome/test/base/in_process_browser_test.h" | 37 #include "chrome/test/base/in_process_browser_test.h" |
38 #include "chrome/test/base/ui_test_utils.h" | |
39 #include "components/bookmarks/test/bookmark_test_helpers.h" | 38 #include "components/bookmarks/test/bookmark_test_helpers.h" |
40 #include "components/signin/core/common/profile_management_switches.h" | 39 #include "components/signin/core/common/profile_management_switches.h" |
41 #include "content/public/browser/web_contents.h" | 40 #include "content/public/browser/web_contents.h" |
42 #include "content/public/test/browser_test_utils.h" | |
43 #include "content/public/test/test_navigation_observer.h" | 41 #include "content/public/test/test_navigation_observer.h" |
44 #include "extensions/browser/app_window/app_window_registry.h" | 42 #include "extensions/browser/app_window/app_window_registry.h" |
45 #include "extensions/common/extension.h" | 43 #include "extensions/common/extension.h" |
46 #include "extensions/test/extension_test_message_listener.h" | 44 #include "extensions/test/extension_test_message_listener.h" |
47 #include "net/test/embedded_test_server/embedded_test_server.h" | 45 #include "net/test/embedded_test_server/embedded_test_server.h" |
48 | 46 |
49 namespace { | 47 namespace { |
50 | 48 |
51 GURL g_open_shortcut_url = GURL::EmptyGURL(); | 49 GURL g_open_shortcut_url = GURL::EmptyGURL(); |
52 | 50 |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 [ac windowChangedToProfile:profile1]; | 474 [ac windowChangedToProfile:profile1]; |
477 | 475 |
478 // Test that only bookmark 1 is shown in the restored menu. | 476 // Test that only bookmark 1 is shown in the restored menu. |
479 EXPECT_TRUE([[ac bookmarkMenuBridge]->BookmarkMenu() itemWithTitle: | 477 EXPECT_TRUE([[ac bookmarkMenuBridge]->BookmarkMenu() itemWithTitle: |
480 SysUTF16ToNSString(title1)]); | 478 SysUTF16ToNSString(title1)]); |
481 EXPECT_FALSE([[ac bookmarkMenuBridge]->BookmarkMenu() itemWithTitle: | 479 EXPECT_FALSE([[ac bookmarkMenuBridge]->BookmarkMenu() itemWithTitle: |
482 SysUTF16ToNSString(title2)]); | 480 SysUTF16ToNSString(title2)]); |
483 } | 481 } |
484 | 482 |
485 } // namespace | 483 } // namespace |
486 | |
487 //--------------------------AppControllerHandoffBrowserTest--------------------- | |
488 | |
489 static GURL g_handoff_url; | |
490 | |
491 @interface AppController (BrowserTest) | |
492 - (BOOL)new_shouldUseHandoff; | |
493 - (void)new_passURLToHandoffManager:(const GURL&)handoffURL; | |
494 @end | |
495 | |
496 @implementation AppController (BrowserTest) | |
497 - (BOOL)new_shouldUseHandoff { | |
498 return YES; | |
499 } | |
500 | |
501 - (void)new_passURLToHandoffManager:(const GURL&)handoffURL { | |
502 g_handoff_url = handoffURL; | |
503 } | |
504 @end | |
505 | |
506 namespace { | |
507 | |
508 class AppControllerHandoffBrowserTest : public InProcessBrowserTest { | |
509 protected: | |
510 AppControllerHandoffBrowserTest() {} | |
511 | |
512 // Exchanges the implementations of the two selectors on the class | |
513 // AppController. | |
514 void ExchangeSelectors(SEL originalMethod, SEL newMethod) { | |
515 Class appControllerClass = NSClassFromString(@"AppController"); | |
516 | |
517 ASSERT_TRUE(appControllerClass != nil); | |
518 | |
519 Method original = | |
520 class_getInstanceMethod(appControllerClass, originalMethod); | |
521 Method destination = class_getInstanceMethod(appControllerClass, newMethod); | |
522 | |
523 ASSERT_TRUE(original != NULL); | |
524 ASSERT_TRUE(destination != NULL); | |
525 | |
526 method_exchangeImplementations(original, destination); | |
527 } | |
528 | |
529 // Swizzle Handoff related implementations. | |
530 void SetUpInProcessBrowserTestFixture() override { | |
531 // Handoff is only available on OSX 10.10+. This swizzle makes the logic | |
532 // run on all OSX versions. | |
533 SEL originalMethod = @selector(shouldUseHandoff); | |
534 SEL newMethod = @selector(new_shouldUseHandoff); | |
535 ExchangeSelectors(originalMethod, newMethod); | |
536 | |
537 // This swizzle intercepts the URL that would be sent to the Handoff | |
538 // Manager, and instead puts it into a variable accessible to this test. | |
539 originalMethod = @selector(passURLToHandoffManager:); | |
540 newMethod = @selector(new_passURLToHandoffManager:); | |
541 ExchangeSelectors(originalMethod, newMethod); | |
542 } | |
543 | |
544 // Closes the tab, and waits for the close to finish. | |
545 void CloseTab(Browser* browser, int index) { | |
546 content::WebContentsDestroyedWatcher destroyed_watcher( | |
547 browser->tab_strip_model()->GetWebContentsAt(index)); | |
548 browser->tab_strip_model()->CloseWebContentsAt( | |
549 index, TabStripModel::CLOSE_CREATE_HISTORICAL_TAB); | |
550 destroyed_watcher.Wait(); | |
551 } | |
552 }; | |
553 | |
554 // Tests that as a user switches between tabs, navigates within a tab, and | |
555 // switches between browser windows, the correct URL is being passed to the | |
556 // Handoff. | |
557 IN_PROC_BROWSER_TEST_F(AppControllerHandoffBrowserTest, TestHandoffURLs) { | |
558 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | |
559 EXPECT_EQ(g_handoff_url, GURL(url::kAboutBlankURL)); | |
560 | |
561 // Test that navigating to a URL updates the handoff URL. | |
562 GURL test_url1 = embedded_test_server()->GetURL("/title1.html"); | |
563 ui_test_utils::NavigateToURL(browser(), test_url1); | |
564 EXPECT_EQ(g_handoff_url, test_url1); | |
565 | |
566 // Test that opening a new tab updates the handoff URL. | |
567 GURL test_url2 = embedded_test_server()->GetURL("/title2.html"); | |
568 chrome::NavigateParams params(browser(), test_url2, ui::PAGE_TRANSITION_LINK); | |
569 params.disposition = NEW_FOREGROUND_TAB; | |
570 ui_test_utils::NavigateToURL(¶ms); | |
571 EXPECT_EQ(g_handoff_url, test_url2); | |
572 | |
573 // Test that switching tabs updates the handoff URL. | |
574 browser()->tab_strip_model()->ActivateTabAt(0, true); | |
575 EXPECT_EQ(g_handoff_url, test_url1); | |
576 | |
577 // Test that closing the current tab updates the handoff URL. | |
578 CloseTab(browser(), 0); | |
579 EXPECT_EQ(g_handoff_url, test_url2); | |
580 | |
581 // Test that opening a new browser window updates the handoff URL. | |
582 GURL test_url3 = embedded_test_server()->GetURL("/title3.html"); | |
583 ui_test_utils::NavigateToURLWithDisposition( | |
584 browser(), GURL(test_url3), NEW_WINDOW, | |
585 ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER); | |
586 EXPECT_EQ(g_handoff_url, test_url3); | |
587 | |
588 // Check that there are exactly 2 browsers. | |
589 BrowserList* active_browser_list = | |
590 BrowserList::GetInstance(chrome::GetActiveDesktop()); | |
591 EXPECT_EQ(2u, active_browser_list->size()); | |
592 | |
593 // Close the one and only tab for the second browser window. | |
594 Browser* browser2 = active_browser_list->get(1); | |
595 CloseTab(browser2, 0); | |
596 base::RunLoop().RunUntilIdle(); | |
597 EXPECT_EQ(g_handoff_url, test_url2); | |
598 | |
599 // The URLs of incognito windows should not be passed to Handoff. | |
600 GURL test_url4 = embedded_test_server()->GetURL("/simple.html"); | |
601 ui_test_utils::NavigateToURLWithDisposition( | |
602 browser(), GURL(test_url4), OFF_THE_RECORD, | |
603 ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER); | |
604 EXPECT_EQ(g_handoff_url, GURL()); | |
605 | |
606 // Open a new tab in the incognito window. | |
607 EXPECT_EQ(2u, active_browser_list->size()); | |
608 Browser* browser3 = active_browser_list->get(1); | |
609 ui_test_utils::NavigateToURLWithDisposition( | |
610 browser3, test_url4, NEW_FOREGROUND_TAB, | |
611 ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); | |
612 EXPECT_EQ(g_handoff_url, GURL()); | |
613 | |
614 // Navigate the current tab in the incognito window. | |
615 ui_test_utils::NavigateToURLWithDisposition( | |
616 browser3, test_url1, CURRENT_TAB, | |
617 ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); | |
618 EXPECT_EQ(g_handoff_url, GURL()); | |
619 | |
620 // Activate the original browser window. | |
621 Browser* browser1 = active_browser_list->get(0); | |
622 browser1->window()->Show(); | |
623 EXPECT_EQ(g_handoff_url, test_url2); | |
624 } | |
625 | |
626 } // namespace | |
OLD | NEW |