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

Side by Side Diff: chrome/browser/chrome_browser_main.cc

Issue 949293002: Implement a poor man's PostAfterStartupTask() function. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months 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 unified diff | Download patch
OLDNEW
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/chrome_browser_main.h" 5 #include "chrome/browser/chrome_browser_main.h"
6 6
7 #include <set> 7 #include <set>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 13 matching lines...) Expand all
24 #include "base/prefs/pref_value_store.h" 24 #include "base/prefs/pref_value_store.h"
25 #include "base/prefs/scoped_user_pref_update.h" 25 #include "base/prefs/scoped_user_pref_update.h"
26 #include "base/process/process_info.h" 26 #include "base/process/process_info.h"
27 #include "base/profiler/scoped_tracker.h" 27 #include "base/profiler/scoped_tracker.h"
28 #include "base/run_loop.h" 28 #include "base/run_loop.h"
29 #include "base/strings/string_number_conversions.h" 29 #include "base/strings/string_number_conversions.h"
30 #include "base/strings/string_piece.h" 30 #include "base/strings/string_piece.h"
31 #include "base/strings/string_split.h" 31 #include "base/strings/string_split.h"
32 #include "base/strings/sys_string_conversions.h" 32 #include "base/strings/sys_string_conversions.h"
33 #include "base/strings/utf_string_conversions.h" 33 #include "base/strings/utf_string_conversions.h"
34 #include "base/synchronization/cancellation_flag.h"
34 #include "base/sys_info.h" 35 #include "base/sys_info.h"
35 #include "base/threading/platform_thread.h" 36 #include "base/threading/platform_thread.h"
36 #include "base/time/time.h" 37 #include "base/time/time.h"
37 #include "base/trace_event/trace_event.h" 38 #include "base/trace_event/trace_event.h"
38 #include "base/values.h" 39 #include "base/values.h"
39 #include "build/build_config.h" 40 #include "build/build_config.h"
40 #include "cc/base/switches.h" 41 #include "cc/base/switches.h"
41 #include "chrome/browser/about_flags.h" 42 #include "chrome/browser/about_flags.h"
42 #include "chrome/browser/browser_process.h" 43 #include "chrome/browser/browser_process.h"
43 #include "chrome/browser/browser_process_impl.h" 44 #include "chrome/browser/browser_process_impl.h"
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory. h" 79 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory. h"
79 #include "chrome/browser/process_singleton.h" 80 #include "chrome/browser/process_singleton.h"
80 #include "chrome/browser/profiles/profile.h" 81 #include "chrome/browser/profiles/profile.h"
81 #include "chrome/browser/profiles/profile_manager.h" 82 #include "chrome/browser/profiles/profile_manager.h"
82 #include "chrome/browser/profiles/profiles_state.h" 83 #include "chrome/browser/profiles/profiles_state.h"
83 #include "chrome/browser/shell_integration.h" 84 #include "chrome/browser/shell_integration.h"
84 #include "chrome/browser/translate/translate_service.h" 85 #include "chrome/browser/translate/translate_service.h"
85 #include "chrome/browser/ui/app_list/app_list_service.h" 86 #include "chrome/browser/ui/app_list/app_list_service.h"
86 #include "chrome/browser/ui/browser.h" 87 #include "chrome/browser/ui/browser.h"
87 #include "chrome/browser/ui/browser_finder.h" 88 #include "chrome/browser/ui/browser_finder.h"
89 #include "chrome/browser/ui/browser_iterator.h"
88 #include "chrome/browser/ui/host_desktop.h" 90 #include "chrome/browser/ui/host_desktop.h"
89 #include "chrome/browser/ui/startup/bad_flags_prompt.h" 91 #include "chrome/browser/ui/startup/bad_flags_prompt.h"
90 #include "chrome/browser/ui/startup/default_browser_prompt.h" 92 #include "chrome/browser/ui/startup/default_browser_prompt.h"
91 #include "chrome/browser/ui/startup/startup_browser_creator.h" 93 #include "chrome/browser/ui/startup/startup_browser_creator.h"
94 #include "chrome/browser/ui/tabs/tab_strip_model.h"
92 #include "chrome/browser/ui/uma_browsing_activity_observer.h" 95 #include "chrome/browser/ui/uma_browsing_activity_observer.h"
93 #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" 96 #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h"
94 #include "chrome/common/chrome_constants.h" 97 #include "chrome/common/chrome_constants.h"
95 #include "chrome/common/chrome_paths.h" 98 #include "chrome/common/chrome_paths.h"
96 #include "chrome/common/chrome_result_codes.h" 99 #include "chrome/common/chrome_result_codes.h"
97 #include "chrome/common/chrome_switches.h" 100 #include "chrome/common/chrome_switches.h"
98 #include "chrome/common/chrome_version_info.h" 101 #include "chrome/common/chrome_version_info.h"
99 #include "chrome/common/crash_keys.h" 102 #include "chrome/common/crash_keys.h"
100 #include "chrome/common/env_vars.h" 103 #include "chrome/common/env_vars.h"
101 #include "chrome/common/logging_chrome.h" 104 #include "chrome/common/logging_chrome.h"
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 217
215 #if defined(ENABLE_WEBRTC) 218 #if defined(ENABLE_WEBRTC)
216 #include "chrome/browser/media/webrtc_log_util.h" 219 #include "chrome/browser/media/webrtc_log_util.h"
217 #endif // defined(ENABLE_WEBRTC) 220 #endif // defined(ENABLE_WEBRTC)
218 221
219 #if defined(USE_AURA) 222 #if defined(USE_AURA)
220 #include "ui/aura/env.h" 223 #include "ui/aura/env.h"
221 #endif // defined(USE_AURA) 224 #endif // defined(USE_AURA)
222 225
223 using content::BrowserThread; 226 using content::BrowserThread;
227 using content::WebContents;
228 using content::WebContentsObserver;
224 229
225 namespace { 230 namespace {
226 231
232 // The basis for when tasks posted via PostAfterStartupTasks begin running.
233 using StartupCompleteFlag = base::CancellationFlag;
234 base::LazyInstance<StartupCompleteFlag>::Leaky g_startup_complete_flag;
235
236 void SetBrowserStartupIsComplete() {
237 g_startup_complete_flag.Get().Set();
238 }
239
240 // Observes the first page load and set the startup complete flag accordingly.
241 class StartupObserver : public WebContentsObserver {
jam 2015/03/23 23:19:44 nit: this would be much smaller lines if the metho
michaeln 2015/03/24 23:01:11 Done.
242 public:
243 StartupObserver() : weak_factory_(this) {}
244 ~StartupObserver() override {}
245
246 void Start();
247
248 private:
249 void OnStartupComplete();
250 void OnFailsafeTimeout();
251
252 // WebContentsObserver overrides
253 void DidFinishLoad(content::RenderFrameHost* render_frame_host,
254 const GURL& validated_url) override;
255 void DidFailLoad(content::RenderFrameHost* render_frame_host,
256 const GURL& validated_url,
257 int error_code,
258 const base::string16& error_description) override;
259 void WebContentsDestroyed() override;
260
261 base::WeakPtrFactory<StartupObserver> weak_factory_;
262 };
cmumford 2015/03/23 23:57:20 Not sure: Is DISALLOW_COPY_AND_ASSIGN required for
michaeln 2015/03/24 23:01:12 Done.
263
264 void StartupObserver::Start() {
265 // Signal completion quickly when there is no first page to load.
266 int kShortDelaySecs = 3;
cmumford 2015/03/23 23:57:19 const int kShortDelaySecs = 3;
michaeln 2015/03/24 23:01:11 Done.
267 base::TimeDelta delay = base::TimeDelta::FromSeconds(kShortDelaySecs);
268
269 #if !defined(OS_ANDROID)
michaeln 2015/03/23 20:24:23 FUD: Initially mimic'ing chrome_browser_main_extra
270 WebContents* contents = nullptr;
271 for (chrome::BrowserIterator iter; !iter.done(); iter.Next()) {
272 contents = (*iter)->tab_strip_model()->GetActiveWebContents();
273 if (contents)
274 break;
275 }
276
277 if (contents) {
278 // Give the page time to finish loading.
279 const int kLongerDelayMins = 3;
280 Observe(contents);
281 delay = base::TimeDelta::FromMinutes(kLongerDelayMins);
282 }
283 #endif // !defined(OS_ANDROID)
284
285 BrowserThread::PostDelayedTask(
286 BrowserThread::UI, FROM_HERE,
287 base::Bind(&StartupObserver::OnFailsafeTimeout,
288 weak_factory_.GetWeakPtr()),
289 delay);
290 }
291
292 void StartupObserver::OnStartupComplete() {
293 SetBrowserStartupIsComplete();
294 delete this;
295 }
296
297 void StartupObserver::OnFailsafeTimeout() {
298 OnStartupComplete();
299 }
300
301 void StartupObserver::DidFinishLoad(content::RenderFrameHost* render_frame_host,
302 const GURL& validated_url) {
303 if (web_contents()->GetMainFrame() == render_frame_host)
cmumford 2015/03/23 23:57:19 The rest of Chrome does if (!render_frame_host->Ge
michaeln 2015/03/24 23:01:11 thnx, done
304 OnStartupComplete();
305 }
306
307 void StartupObserver::DidFailLoad(content::RenderFrameHost* render_frame_host,
308 const GURL& validated_url,
309 int error_code,
310 const base::string16& error_description) {
311 if (web_contents()->GetMainFrame() == render_frame_host)
312 OnStartupComplete();
313 }
314
315 void StartupObserver::WebContentsDestroyed() {
316 OnStartupComplete();
317 }
318
227 // This function provides some ways to test crash and assertion handling 319 // This function provides some ways to test crash and assertion handling
228 // behavior of the program. 320 // behavior of the program.
229 void HandleTestParameters(const base::CommandLine& command_line) { 321 void HandleTestParameters(const base::CommandLine& command_line) {
230 // This parameter causes a null pointer crash (crash reporter trigger). 322 // This parameter causes a null pointer crash (crash reporter trigger).
231 if (command_line.HasSwitch(switches::kBrowserCrashTest)) { 323 if (command_line.HasSwitch(switches::kBrowserCrashTest)) {
232 int* bad_pointer = NULL; 324 int* bad_pointer = NULL;
233 *bad_pointer = 0; 325 *bad_pointer = 0;
234 } 326 }
235 } 327 }
236 328
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 local_state_(NULL), 673 local_state_(NULL),
582 restart_last_session_(false) { 674 restart_last_session_(false) {
583 // If we're running tests (ui_task is non-null). 675 // If we're running tests (ui_task is non-null).
584 if (parameters.ui_task) 676 if (parameters.ui_task)
585 browser_defaults::enable_help_app = false; 677 browser_defaults::enable_help_app = false;
586 678
587 // Chrome disallows cookies by default. All code paths that want to use 679 // Chrome disallows cookies by default. All code paths that want to use
588 // cookies need to go through one of Chrome's URLRequestContexts which have 680 // cookies need to go through one of Chrome's URLRequestContexts which have
589 // a ChromeNetworkDelegate attached that selectively allows cookies again. 681 // a ChromeNetworkDelegate attached that selectively allows cookies again.
590 net::URLRequest::SetDefaultCookiePolicyToBlock(); 682 net::URLRequest::SetDefaultCookiePolicyToBlock();
683
684 // Be sure to allocate the lazy instance on the main thread.
685 g_startup_complete_flag.Get();
591 } 686 }
592 687
593 ChromeBrowserMainParts::~ChromeBrowserMainParts() { 688 ChromeBrowserMainParts::~ChromeBrowserMainParts() {
594 for (int i = static_cast<int>(chrome_extra_parts_.size())-1; i >= 0; --i) 689 for (int i = static_cast<int>(chrome_extra_parts_.size())-1; i >= 0; --i)
595 delete chrome_extra_parts_[i]; 690 delete chrome_extra_parts_[i];
596 chrome_extra_parts_.clear(); 691 chrome_extra_parts_.clear();
597 } 692 }
598 693
599 // This will be called after the command-line has been mutated by about:flags 694 // This will be called after the command-line has been mutated by about:flags
600 void ChromeBrowserMainParts::SetupMetricsAndFieldTrials() { 695 void ChromeBrowserMainParts::SetupMetricsAndFieldTrials() {
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after
1102 #endif // !defined(OS_ANDROID) 1197 #endif // !defined(OS_ANDROID)
1103 #if defined(ENABLE_WEBRTC) 1198 #if defined(ENABLE_WEBRTC)
1104 // Set up a task to delete old WebRTC log files for all profiles. Use a delay 1199 // Set up a task to delete old WebRTC log files for all profiles. Use a delay
1105 // to reduce the impact on startup time. 1200 // to reduce the impact on startup time.
1106 BrowserThread::PostDelayedTask( 1201 BrowserThread::PostDelayedTask(
1107 BrowserThread::UI, 1202 BrowserThread::UI,
1108 FROM_HERE, 1203 FROM_HERE,
1109 base::Bind(&WebRtcLogUtil::DeleteOldWebRtcLogFilesForAllProfiles), 1204 base::Bind(&WebRtcLogUtil::DeleteOldWebRtcLogFilesForAllProfiles),
1110 base::TimeDelta::FromMinutes(1)); 1205 base::TimeDelta::FromMinutes(1));
1111 #endif // defined(ENABLE_WEBRTC) 1206 #endif // defined(ENABLE_WEBRTC)
1207
1208 // The observer is self-deleting.
1209 (new StartupObserver)->Start();
1112 } 1210 }
1113 1211
1114 int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { 1212 int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
1115 TRACE_EVENT0("startup", "ChromeBrowserMainParts::PreMainMessageLoopRunImpl"); 1213 TRACE_EVENT0("startup", "ChromeBrowserMainParts::PreMainMessageLoopRunImpl");
1116 SCOPED_UMA_HISTOGRAM_LONG_TIMER("Startup.PreMainMessageLoopRunImplLongTime"); 1214 SCOPED_UMA_HISTOGRAM_LONG_TIMER("Startup.PreMainMessageLoopRunImplLongTime");
1117 const base::TimeTicks start_time_step1 = base::TimeTicks::Now(); 1215 const base::TimeTicks start_time_step1 = base::TimeTicks::Now();
1118 // Android updates the metrics service dynamically depending on whether the 1216 // Android updates the metrics service dynamically depending on whether the
1119 // application is in the foreground or not. Do not start here. 1217 // application is in the foreground or not. Do not start here.
1120 #if !defined(OS_ANDROID) 1218 #if !defined(OS_ANDROID)
1121 // Now that the file thread has been started, start recording. 1219 // Now that the file thread has been started, start recording.
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after
1728 chromeos::CrosSettings::Shutdown(); 1826 chromeos::CrosSettings::Shutdown();
1729 #endif // defined(OS_CHROMEOS) 1827 #endif // defined(OS_CHROMEOS)
1730 #endif // defined(OS_ANDROID) 1828 #endif // defined(OS_ANDROID)
1731 } 1829 }
1732 1830
1733 // Public members: 1831 // Public members:
1734 1832
1735 void ChromeBrowserMainParts::AddParts(ChromeBrowserMainExtraParts* parts) { 1833 void ChromeBrowserMainParts::AddParts(ChromeBrowserMainExtraParts* parts) {
1736 chrome_extra_parts_.push_back(parts); 1834 chrome_extra_parts_.push_back(parts);
1737 } 1835 }
1836
1837 bool IsBrowserStartupComplete() {
1838 return g_startup_complete_flag.Get().IsSet();
1839 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698