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 #include "chrome/browser/ui/startup/startup_browser_creator_impl.h" | 5 #include "chrome/browser/ui/startup/startup_browser_creator_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
123 #if BUILDFLAG(ENABLE_RLZ) | 123 #if BUILDFLAG(ENABLE_RLZ) |
124 #include "components/rlz/rlz_tracker.h" // nogncheck | 124 #include "components/rlz/rlz_tracker.h" // nogncheck |
125 #endif | 125 #endif |
126 | 126 |
127 using content::ChildProcessSecurityPolicy; | 127 using content::ChildProcessSecurityPolicy; |
128 using content::WebContents; | 128 using content::WebContents; |
129 using extensions::Extension; | 129 using extensions::Extension; |
130 | 130 |
131 namespace { | 131 namespace { |
132 | 132 |
133 std::vector<GURL>* g_startup_urls = nullptr; | |
Avi (use Gerrit)
2017/04/06 15:54:42
Why would this need to be global? Can't it be an i
eugenebng
2017/04/10 11:54:08
This cannot be an instance variable, because diffe
| |
134 | |
133 // Utility functions ---------------------------------------------------------- | 135 // Utility functions ---------------------------------------------------------- |
134 | 136 |
135 enum LaunchMode { | 137 enum LaunchMode { |
136 LM_TO_BE_DECIDED = 0, // Possibly direct launch or via a shortcut. | 138 LM_TO_BE_DECIDED = 0, // Possibly direct launch or via a shortcut. |
137 LM_AS_WEBAPP, // Launched as a installed web application. | 139 LM_AS_WEBAPP, // Launched as a installed web application. |
138 LM_WITH_URLS, // Launched with urls in the cmd line. | 140 LM_WITH_URLS, // Launched with urls in the cmd line. |
139 LM_SHORTCUT_NONE, // Not launched from a shortcut. | 141 LM_SHORTCUT_NONE, // Not launched from a shortcut. |
140 LM_SHORTCUT_NONAME, // Launched from shortcut but no name available. | 142 LM_SHORTCUT_NONAME, // Launched from shortcut but no name available. |
141 LM_SHORTCUT_UNKNOWN, // Launched from user-defined shortcut. | 143 LM_SHORTCUT_UNKNOWN, // Launched from user-defined shortcut. |
142 LM_SHORTCUT_QUICKLAUNCH, // Launched from the quick launch bar. | 144 LM_SHORTCUT_QUICKLAUNCH, // Launched from the quick launch bar. |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
428 | 430 |
429 Browser* StartupBrowserCreatorImpl::OpenURLsInBrowser( | 431 Browser* StartupBrowserCreatorImpl::OpenURLsInBrowser( |
430 Browser* browser, | 432 Browser* browser, |
431 bool process_startup, | 433 bool process_startup, |
432 const std::vector<GURL>& urls) { | 434 const std::vector<GURL>& urls) { |
433 StartupTabs tabs; | 435 StartupTabs tabs; |
434 UrlsToTabs(urls, &tabs); | 436 UrlsToTabs(urls, &tabs); |
435 return OpenTabsInBrowser(browser, process_startup, tabs); | 437 return OpenTabsInBrowser(browser, process_startup, tabs); |
436 } | 438 } |
437 | 439 |
440 void StartupBrowserCreatorImpl::OpenURLsAfterSessionRestore( | |
441 Browser* browser, | |
442 bool process_startup, | |
443 const std::vector<GURL>& urls) { | |
444 // Save URLs for deferred opening | |
445 if (!g_startup_urls) | |
446 g_startup_urls = new std::vector<GURL>(); | |
447 *g_startup_urls = urls; | |
448 } | |
449 | |
450 bool StartupBrowserCreatorImpl::WillRestoreSession( | |
Avi (use Gerrit)
2017/04/06 15:54:42
This seems like a bunch of logic that must already
gab
2017/04/06 16:02:21
That's probably true and if you can avoid touching
gab
2017/04/06 16:02:21
That's probably true and if you can avoid touching
eugenebng
2017/04/10 11:54:08
True, this logic was taken from conditions for cal
| |
451 Browser* browser, | |
452 Profile* profile, | |
453 bool process_startup, | |
454 const std::vector<GURL>& urls) { | |
455 // First condition. | |
456 BrowserOpenBehaviorOptions behavior_options = 0; | |
457 bool is_post_crash_launch = HasPendingUncleanExit(profile); | |
458 if (process_startup) | |
459 behavior_options |= PROCESS_STARTUP; | |
460 if (is_post_crash_launch) | |
461 behavior_options |= IS_POST_CRASH_LAUNCH; | |
462 if (command_line_.HasSwitch(switches::kRestoreLastSession)) | |
463 behavior_options |= HAS_RESTORE_SWITCH; | |
464 if (command_line_.HasSwitch(switches::kOpenInNewWindow)) | |
465 behavior_options |= HAS_NEW_WINDOW_SWITCH; | |
466 if (!urls.empty()) | |
467 behavior_options |= HAS_CMD_LINE_TABS; | |
468 BrowserOpenBehavior behavior = DetermineBrowserOpenBehavior( | |
469 StartupBrowserCreator::GetSessionStartupPref(command_line_, profile), | |
470 behavior_options); | |
471 if (behavior == BrowserOpenBehavior::SYNCHRONOUS_RESTORE) | |
472 return true; | |
473 // Second contition. | |
474 SessionStartupPref pref = | |
475 StartupBrowserCreator::GetSessionStartupPref(command_line_, profile); | |
476 if (pref.type == SessionStartupPref::LAST && !is_first_run_&& | |
477 (!(profile->GetLastSessionExitType() == Profile::EXIT_CRASHED) || | |
478 command_line_.HasSwitch(switches::kRestoreLastSession))) | |
479 return true; | |
480 return false; | |
481 } | |
482 | |
483 void StartupBrowserCreatorImpl::OpenDeferredURLs(Browser* browser) { | |
484 if (g_startup_urls && !g_startup_urls->empty()) { | |
485 StartupBrowserCreator::in_synchronous_profile_launch_ = true; | |
486 OpenURLsInBrowser(browser, false, *g_startup_urls); | |
487 StartupBrowserCreator::in_synchronous_profile_launch_ = false; | |
488 delete g_startup_urls; | |
489 g_startup_urls = nullptr; | |
490 } | |
491 } | |
492 | |
438 Browser* StartupBrowserCreatorImpl::OpenTabsInBrowser(Browser* browser, | 493 Browser* StartupBrowserCreatorImpl::OpenTabsInBrowser(Browser* browser, |
439 bool process_startup, | 494 bool process_startup, |
440 const StartupTabs& tabs) { | 495 const StartupTabs& tabs) { |
441 DCHECK(!tabs.empty()); | 496 DCHECK(!tabs.empty()); |
442 | 497 |
443 // If we don't yet have a profile, try to use the one we're given from | 498 // If we don't yet have a profile, try to use the one we're given from |
444 // |browser|. While we may not end up actually using |browser| (since it | 499 // |browser|. While we may not end up actually using |browser| (since it |
445 // could be a popup window), we can at least use the profile. | 500 // could be a popup window), we can at least use the profile. |
446 if (!profile_ && browser) | 501 if (!profile_ && browser) |
447 profile_ = browser->profile(); | 502 profile_ = browser->profile(); |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
755 Browser* StartupBrowserCreatorImpl::RestoreOrCreateBrowser( | 810 Browser* StartupBrowserCreatorImpl::RestoreOrCreateBrowser( |
756 const StartupTabs& tabs, | 811 const StartupTabs& tabs, |
757 BrowserOpenBehavior behavior, | 812 BrowserOpenBehavior behavior, |
758 SessionRestore::BehaviorBitmask restore_options, | 813 SessionRestore::BehaviorBitmask restore_options, |
759 bool process_startup, | 814 bool process_startup, |
760 bool is_post_crash_launch) { | 815 bool is_post_crash_launch) { |
761 Browser* browser = nullptr; | 816 Browser* browser = nullptr; |
762 if (behavior == BrowserOpenBehavior::SYNCHRONOUS_RESTORE) { | 817 if (behavior == BrowserOpenBehavior::SYNCHRONOUS_RESTORE) { |
763 browser = SessionRestore::RestoreSession(profile_, nullptr, restore_options, | 818 browser = SessionRestore::RestoreSession(profile_, nullptr, restore_options, |
764 TabsToUrls(tabs)); | 819 TabsToUrls(tabs)); |
765 if (browser) | 820 if (browser) { |
821 OpenDeferredURLs(browser); | |
766 return browser; | 822 return browser; |
823 } | |
767 } else if (behavior == BrowserOpenBehavior::USE_EXISTING) { | 824 } else if (behavior == BrowserOpenBehavior::USE_EXISTING) { |
768 browser = chrome::FindTabbedBrowser(profile_, process_startup); | 825 browser = chrome::FindTabbedBrowser(profile_, process_startup); |
769 } | 826 } |
770 | 827 |
771 base::AutoReset<bool> synchronous_launch_resetter( | 828 base::AutoReset<bool> synchronous_launch_resetter( |
772 &StartupBrowserCreator::in_synchronous_profile_launch_, true); | 829 &StartupBrowserCreator::in_synchronous_profile_launch_, true); |
773 | 830 |
774 // OpenTabsInBrowser requires at least one tab be passed. As a fallback to | 831 // OpenTabsInBrowser requires at least one tab be passed. As a fallback to |
775 // prevent a crash, use the NTP if |tabs| is empty. This could happen if | 832 // prevent a crash, use the NTP if |tabs| is empty. This could happen if |
776 // we expected a session restore to happen but it did not occur/succeed. | 833 // we expected a session restore to happen but it did not occur/succeed. |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1020 } | 1077 } |
1021 #endif | 1078 #endif |
1022 | 1079 |
1023 std::vector<GURL> adjusted_urls(urls_to_open); | 1080 std::vector<GURL> adjusted_urls(urls_to_open); |
1024 AddSpecialURLs(&adjusted_urls); | 1081 AddSpecialURLs(&adjusted_urls); |
1025 | 1082 |
1026 // The startup code only executes for browsers launched in desktop mode. Ash | 1083 // The startup code only executes for browsers launched in desktop mode. Ash |
1027 // should never get here. | 1084 // should never get here. |
1028 Browser* browser = SessionRestore::RestoreSession( | 1085 Browser* browser = SessionRestore::RestoreSession( |
1029 profile_, NULL, restore_behavior, adjusted_urls); | 1086 profile_, NULL, restore_behavior, adjusted_urls); |
1030 | 1087 OpenDeferredURLs(browser); |
1031 AddInfoBarsIfNecessary(browser, chrome::startup::IS_PROCESS_STARTUP); | 1088 AddInfoBarsIfNecessary(browser, chrome::startup::IS_PROCESS_STARTUP); |
1032 return true; | 1089 return true; |
1033 } | 1090 } |
1034 | 1091 |
1035 Browser* browser = ProcessSpecifiedURLs(urls_to_open); | 1092 Browser* browser = ProcessSpecifiedURLs(urls_to_open); |
1036 if (!browser) | 1093 if (!browser) |
1037 return false; | 1094 return false; |
1038 | 1095 |
1039 AddInfoBarsIfNecessary(browser, chrome::startup::IS_PROCESS_STARTUP); | 1096 AddInfoBarsIfNecessary(browser, chrome::startup::IS_PROCESS_STARTUP); |
1040 | 1097 |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1257 #if defined(OS_WIN) | 1314 #if defined(OS_WIN) |
1258 TriggeredProfileResetter* triggered_profile_resetter = | 1315 TriggeredProfileResetter* triggered_profile_resetter = |
1259 TriggeredProfileResetterFactory::GetForBrowserContext(profile_); | 1316 TriggeredProfileResetterFactory::GetForBrowserContext(profile_); |
1260 // TriggeredProfileResetter instance will be nullptr for incognito profiles. | 1317 // TriggeredProfileResetter instance will be nullptr for incognito profiles. |
1261 if (triggered_profile_resetter) { | 1318 if (triggered_profile_resetter) { |
1262 has_reset_trigger = triggered_profile_resetter->HasResetTrigger(); | 1319 has_reset_trigger = triggered_profile_resetter->HasResetTrigger(); |
1263 } | 1320 } |
1264 #endif // defined(OS_WIN) | 1321 #endif // defined(OS_WIN) |
1265 return has_reset_trigger; | 1322 return has_reset_trigger; |
1266 } | 1323 } |
OLD | NEW |