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 "chrome/browser/app_controller_mac.h" | 5 #import "chrome/browser/app_controller_mac.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 #include "chrome/browser/ui/browser_window.h" | 56 #include "chrome/browser/ui/browser_window.h" |
57 #include "chrome/browser/ui/chrome_pages.h" | 57 #include "chrome/browser/ui/chrome_pages.h" |
58 #import "chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.h" | 58 #import "chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.h" |
59 #include "chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac.h" | 59 #include "chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac.h" |
60 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.h" | 60 #import "chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.h" |
61 #import "chrome/browser/ui/cocoa/browser_window_cocoa.h" | 61 #import "chrome/browser/ui/cocoa/browser_window_cocoa.h" |
62 #import "chrome/browser/ui/cocoa/browser_window_controller.h" | 62 #import "chrome/browser/ui/cocoa/browser_window_controller.h" |
63 #import "chrome/browser/ui/cocoa/confirm_quit.h" | 63 #import "chrome/browser/ui/cocoa/confirm_quit.h" |
64 #import "chrome/browser/ui/cocoa/confirm_quit_panel_controller.h" | 64 #import "chrome/browser/ui/cocoa/confirm_quit_panel_controller.h" |
65 #import "chrome/browser/ui/cocoa/encoding_menu_controller_delegate_mac.h" | 65 #import "chrome/browser/ui/cocoa/encoding_menu_controller_delegate_mac.h" |
| 66 #include "chrome/browser/ui/cocoa/handoff_active_url_observer_bridge.h" |
66 #import "chrome/browser/ui/cocoa/history_menu_bridge.h" | 67 #import "chrome/browser/ui/cocoa/history_menu_bridge.h" |
67 #include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h" | 68 #include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h" |
68 #import "chrome/browser/ui/cocoa/profiles/profile_menu_controller.h" | 69 #import "chrome/browser/ui/cocoa/profiles/profile_menu_controller.h" |
69 #import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h" | 70 #import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h" |
70 #import "chrome/browser/ui/cocoa/tabs/tab_window_controller.h" | 71 #import "chrome/browser/ui/cocoa/tabs/tab_window_controller.h" |
71 #include "chrome/browser/ui/cocoa/task_manager_mac.h" | 72 #include "chrome/browser/ui/cocoa/task_manager_mac.h" |
72 #include "chrome/browser/ui/extensions/application_launch.h" | 73 #include "chrome/browser/ui/extensions/application_launch.h" |
73 #include "chrome/browser/ui/host_desktop.h" | 74 #include "chrome/browser/ui/host_desktop.h" |
74 #include "chrome/browser/ui/startup/startup_browser_creator.h" | 75 #include "chrome/browser/ui/startup/startup_browser_creator.h" |
75 #include "chrome/browser/ui/startup/startup_browser_creator_impl.h" | 76 #include "chrome/browser/ui/startup/startup_browser_creator_impl.h" |
76 #include "chrome/browser/ui/user_manager.h" | 77 #include "chrome/browser/ui/user_manager.h" |
77 #include "chrome/common/chrome_paths_internal.h" | 78 #include "chrome/common/chrome_paths_internal.h" |
78 #include "chrome/common/chrome_switches.h" | 79 #include "chrome/common/chrome_switches.h" |
79 #include "chrome/common/cloud_print/cloud_print_class_mac.h" | 80 #include "chrome/common/cloud_print/cloud_print_class_mac.h" |
80 #include "chrome/common/extensions/extension_constants.h" | 81 #include "chrome/common/extensions/extension_constants.h" |
81 #include "chrome/common/mac/app_mode_common.h" | 82 #include "chrome/common/mac/app_mode_common.h" |
82 #include "chrome/common/pref_names.h" | 83 #include "chrome/common/pref_names.h" |
83 #include "chrome/common/url_constants.h" | 84 #include "chrome/common/url_constants.h" |
84 #include "chrome/grit/chromium_strings.h" | 85 #include "chrome/grit/chromium_strings.h" |
85 #include "chrome/grit/generated_resources.h" | 86 #include "chrome/grit/generated_resources.h" |
| 87 #include "components/handoff/handoff_manager.h" |
86 #include "components/handoff/handoff_utility.h" | 88 #include "components/handoff/handoff_utility.h" |
87 #include "components/signin/core/browser/signin_manager.h" | 89 #include "components/signin/core/browser/signin_manager.h" |
88 #include "components/signin/core/common/profile_management_switches.h" | 90 #include "components/signin/core/common/profile_management_switches.h" |
89 #include "content/public/browser/browser_thread.h" | 91 #include "content/public/browser/browser_thread.h" |
90 #include "content/public/browser/download_manager.h" | 92 #include "content/public/browser/download_manager.h" |
91 #include "content/public/browser/notification_service.h" | 93 #include "content/public/browser/notification_service.h" |
92 #include "content/public/browser/notification_types.h" | 94 #include "content/public/browser/notification_types.h" |
93 #include "content/public/browser/plugin_service.h" | 95 #include "content/public/browser/plugin_service.h" |
94 #include "content/public/browser/user_metrics.h" | 96 #include "content/public/browser/user_metrics.h" |
95 #include "extensions/browser/extension_system.h" | 97 #include "extensions/browser/extension_system.h" |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 if (!switches::IsNewProfileManagement()) | 204 if (!switches::IsNewProfileManagement()) |
203 return false; | 205 return false; |
204 ProfileInfoCache& cache = | 206 ProfileInfoCache& cache = |
205 g_browser_process->profile_manager()->GetProfileInfoCache(); | 207 g_browser_process->profile_manager()->GetProfileInfoCache(); |
206 size_t profile_index = cache.GetIndexOfProfileWithPath(profile->GetPath()); | 208 size_t profile_index = cache.GetIndexOfProfileWithPath(profile->GetPath()); |
207 if (profile_index == std::string::npos) | 209 if (profile_index == std::string::npos) |
208 return false; | 210 return false; |
209 return cache.ProfileIsSigninRequiredAtIndex(profile_index); | 211 return cache.ProfileIsSigninRequiredAtIndex(profile_index); |
210 } | 212 } |
211 | 213 |
212 } // anonymous namespace | 214 } // namespace |
213 | 215 |
214 @interface AppController (Private) | 216 @interface AppController () <HandoffActiveURLObserverBridgeDelegate> |
| 217 |
215 - (void)initMenuState; | 218 - (void)initMenuState; |
216 - (void)initProfileMenu; | 219 - (void)initProfileMenu; |
217 - (void)updateConfirmToQuitPrefMenuItem:(NSMenuItem*)item; | 220 - (void)updateConfirmToQuitPrefMenuItem:(NSMenuItem*)item; |
218 - (void)updateDisplayMessageCenterPrefMenuItem:(NSMenuItem*)item; | 221 - (void)updateDisplayMessageCenterPrefMenuItem:(NSMenuItem*)item; |
219 - (void)registerServicesMenuTypesTo:(NSApplication*)app; | 222 - (void)registerServicesMenuTypesTo:(NSApplication*)app; |
220 - (void)getUrl:(NSAppleEventDescriptor*)event | 223 - (void)getUrl:(NSAppleEventDescriptor*)event |
221 withReply:(NSAppleEventDescriptor*)reply; | 224 withReply:(NSAppleEventDescriptor*)reply; |
222 - (void)windowLayeringDidChange:(NSNotification*)inNotification; | 225 - (void)windowLayeringDidChange:(NSNotification*)inNotification; |
223 - (void)activeSpaceDidChange:(NSNotification*)inNotification; | 226 - (void)activeSpaceDidChange:(NSNotification*)inNotification; |
224 - (void)checkForAnyKeyWindows; | 227 - (void)checkForAnyKeyWindows; |
225 - (BOOL)userWillWaitForInProgressDownloads:(int)downloadCount; | 228 - (BOOL)userWillWaitForInProgressDownloads:(int)downloadCount; |
226 - (BOOL)shouldQuitWithInProgressDownloads; | 229 - (BOOL)shouldQuitWithInProgressDownloads; |
227 - (void)executeApplication:(id)sender; | 230 - (void)executeApplication:(id)sender; |
228 - (void)profileWasRemoved:(const base::FilePath&)profilePath; | 231 - (void)profileWasRemoved:(const base::FilePath&)profilePath; |
229 | 232 |
230 // Opens a tab for each GURL in |urls|. | 233 // Opens a tab for each GURL in |urls|. |
231 - (void)openUrls:(const std::vector<GURL>&)urls; | 234 - (void)openUrls:(const std::vector<GURL>&)urls; |
232 | 235 |
233 // This class cannot open urls until startup has finished. The urls that cannot | 236 // This class cannot open urls until startup has finished. The urls that cannot |
234 // be opened are cached in |startupUrls_|. This method must be called exactly | 237 // be opened are cached in |startupUrls_|. This method must be called exactly |
235 // once after startup has completed. It opens the urls in |startupUrls_|, and | 238 // once after startup has completed. It opens the urls in |startupUrls_|, and |
236 // clears |startupUrls_|. | 239 // clears |startupUrls_|. |
237 - (void)openStartupUrls; | 240 - (void)openStartupUrls; |
238 | 241 |
239 // Opens a tab for each GURL in |urls|. If there is exactly one tab open before | 242 // Opens a tab for each GURL in |urls|. If there is exactly one tab open before |
240 // this method is called, and that tab is the NTP, then this method closes the | 243 // this method is called, and that tab is the NTP, then this method closes the |
241 // NTP after all the |urls| have been opened. | 244 // NTP after all the |urls| have been opened. |
242 - (void)openUrlsReplacingNTP:(const std::vector<GURL>&)urls; | 245 - (void)openUrlsReplacingNTP:(const std::vector<GURL>&)urls; |
| 246 |
| 247 // Whether instances of this class should use the Handoff feature. |
| 248 - (BOOL)shouldUseHandoff; |
| 249 |
| 250 // This method passes |handoffURL| to |handoffManager_|. |
| 251 - (void)passURLToHandoffManager:(const GURL&)handoffURL; |
| 252 |
| 253 // Lazily creates the Handoff Manager. Updates the state of the Handoff |
| 254 // Manager. This method is idempotent. This should be called: |
| 255 // - During initialization. |
| 256 // - When the current tab navigates to a new URL. |
| 257 // - When the active browser changes. |
| 258 // - When the active browser's active tab switches. |
| 259 // |webContents| should be the new, active WebContents. |
| 260 - (void)updateHandoffManager:(content::WebContents*)webContents; |
| 261 |
| 262 // Given |webContents|, extracts a GURL to be used for Handoff. This may return |
| 263 // the empty GURL. |
| 264 - (GURL)handoffURLFromWebContents:(content::WebContents*)webContents; |
243 @end | 265 @end |
244 | 266 |
245 class AppControllerProfileObserver : public ProfileInfoCacheObserver { | 267 class AppControllerProfileObserver : public ProfileInfoCacheObserver { |
246 public: | 268 public: |
247 AppControllerProfileObserver( | 269 AppControllerProfileObserver( |
248 ProfileManager* profile_manager, AppController* app_controller) | 270 ProfileManager* profile_manager, AppController* app_controller) |
249 : profile_manager_(profile_manager), | 271 : profile_manager_(profile_manager), |
250 app_controller_(app_controller) { | 272 app_controller_(app_controller) { |
251 DCHECK(profile_manager_); | 273 DCHECK(profile_manager_); |
252 DCHECK(app_controller_); | 274 DCHECK(app_controller_); |
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
769 // I/O. | 791 // I/O. |
770 BrowserThread::PostTask( | 792 BrowserThread::PostTask( |
771 BrowserThread::FILE, FROM_HERE, | 793 BrowserThread::FILE, FROM_HERE, |
772 base::Bind(&RecordLastRunAppBundlePath)); | 794 base::Bind(&RecordLastRunAppBundlePath)); |
773 | 795 |
774 // Makes "Services" menu items available. | 796 // Makes "Services" menu items available. |
775 [self registerServicesMenuTypesTo:[notify object]]; | 797 [self registerServicesMenuTypesTo:[notify object]]; |
776 | 798 |
777 startupComplete_ = YES; | 799 startupComplete_ = YES; |
778 | 800 |
| 801 Browser* browser = |
| 802 FindLastActiveWithHostDesktopType(chrome::HOST_DESKTOP_TYPE_NATIVE); |
| 803 content::WebContents* activeWebContents = nullptr; |
| 804 if (browser) |
| 805 activeWebContents = browser->tab_strip_model()->GetActiveWebContents(); |
| 806 [self updateHandoffManager:activeWebContents]; |
779 [self openStartupUrls]; | 807 [self openStartupUrls]; |
780 | 808 |
781 PrefService* localState = g_browser_process->local_state(); | 809 PrefService* localState = g_browser_process->local_state(); |
782 if (localState) { | 810 if (localState) { |
783 localPrefRegistrar_.Init(localState); | 811 localPrefRegistrar_.Init(localState); |
784 localPrefRegistrar_.Add( | 812 localPrefRegistrar_.Add( |
785 prefs::kAllowFileSelectionDialogs, | 813 prefs::kAllowFileSelectionDialogs, |
786 base::Bind(&chrome::BrowserCommandController::UpdateOpenFileState, | 814 base::Bind(&chrome::BrowserCommandController::UpdateOpenFileState, |
787 menuState_.get())); | 815 menuState_.get())); |
788 } | 816 } |
| 817 |
| 818 handoff_active_url_observer_bridge_.reset( |
| 819 new HandoffActiveURLObserverBridge(self)); |
789 } | 820 } |
790 | 821 |
791 // This is called after profiles have been loaded and preferences registered. | 822 // This is called after profiles have been loaded and preferences registered. |
792 // It is safe to access the default profile here. | 823 // It is safe to access the default profile here. |
793 - (void)applicationDidBecomeActive:(NSNotification*)notify { | 824 - (void)applicationDidBecomeActive:(NSNotification*)notify { |
794 content::PluginService::GetInstance()->AppActivated(); | 825 content::PluginService::GetInstance()->AppActivated(); |
795 } | 826 } |
796 | 827 |
797 // Helper function for populating and displaying the in progress downloads at | 828 // Helper function for populating and displaying the in progress downloads at |
798 // exit alert panel. | 829 // exit alert panel. |
(...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1631 | 1662 |
1632 [self openUrlsReplacingNTP:gurlVector]; | 1663 [self openUrlsReplacingNTP:gurlVector]; |
1633 return YES; | 1664 return YES; |
1634 } | 1665 } |
1635 | 1666 |
1636 - (void)application:(NSApplication*)application | 1667 - (void)application:(NSApplication*)application |
1637 didFailToContinueUserActivityWithType:(NSString*)userActivityType | 1668 didFailToContinueUserActivityWithType:(NSString*)userActivityType |
1638 error:(NSError*)error { | 1669 error:(NSError*)error { |
1639 } | 1670 } |
1640 | 1671 |
| 1672 #pragma mark - Handoff Manager |
| 1673 |
| 1674 - (BOOL)shouldUseHandoff { |
| 1675 return base::mac::IsOSYosemiteOrLater(); |
| 1676 } |
| 1677 |
| 1678 - (void)passURLToHandoffManager:(const GURL&)handoffURL { |
| 1679 [handoffManager_ updateActiveURL:handoffURL]; |
| 1680 } |
| 1681 |
| 1682 - (void)updateHandoffManager:(content::WebContents*)webContents { |
| 1683 if (![self shouldUseHandoff]) |
| 1684 return; |
| 1685 |
| 1686 if (!handoffManager_) |
| 1687 handoffManager_.reset([[HandoffManager alloc] init]); |
| 1688 |
| 1689 GURL handoffURL = [self handoffURLFromWebContents:webContents]; |
| 1690 [self passURLToHandoffManager:handoffURL]; |
| 1691 } |
| 1692 |
| 1693 - (GURL)handoffURLFromWebContents:(content::WebContents*)webContents { |
| 1694 if (!webContents) |
| 1695 return GURL(); |
| 1696 |
| 1697 Profile* profile = |
| 1698 Profile::FromBrowserContext(webContents->GetBrowserContext()); |
| 1699 if (!profile) |
| 1700 return GURL(); |
| 1701 |
| 1702 // Handoff is not allowed from an incognito profile. To err on the safe side, |
| 1703 // also disallow Handoff from a guest profile. |
| 1704 if (profile->GetProfileType() != Profile::REGULAR_PROFILE) |
| 1705 return GURL(); |
| 1706 |
| 1707 if (!webContents) |
| 1708 return GURL(); |
| 1709 |
| 1710 return webContents->GetVisibleURL(); |
| 1711 } |
| 1712 |
| 1713 #pragma mark - HandoffActiveURLObserverBridgeDelegate |
| 1714 |
| 1715 - (void)handoffActiveURLChanged:(content::WebContents*)webContents { |
| 1716 [self updateHandoffManager:webContents]; |
| 1717 } |
| 1718 |
1641 @end // @implementation AppController | 1719 @end // @implementation AppController |
1642 | 1720 |
1643 //--------------------------------------------------------------------------- | 1721 //--------------------------------------------------------------------------- |
1644 | 1722 |
1645 namespace app_controller_mac { | 1723 namespace app_controller_mac { |
1646 | 1724 |
1647 bool IsOpeningNewWindow() { | 1725 bool IsOpeningNewWindow() { |
1648 return g_is_opening_new_window; | 1726 return g_is_opening_new_window; |
1649 } | 1727 } |
1650 | 1728 |
1651 } // namespace app_controller_mac | 1729 } // namespace app_controller_mac |
OLD | NEW |