Chromium Code Reviews| Index: chrome/browser/chrome_browser_main.cc |
| diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc |
| index a85e75694b86ef275f86f60b978e0b951d7e59e6..9d8db819b1930116bc459e61905a5850613deab2 100644 |
| --- a/chrome/browser/chrome_browser_main.cc |
| +++ b/chrome/browser/chrome_browser_main.cc |
| @@ -8,6 +8,7 @@ |
| #include <gtk/gtk.h> |
| #endif |
| +#include <limits.h> |
|
gab
2013/03/28 03:06:06
C-headers come after C++ headers and are usually i
erikwright (departed)
2013/04/18 17:43:04
You so crazy :)
C first.
http://google-styleguid
gab
2013/04/19 14:37:47
You know who I learnt to code-review from ;)!
|
| #include <string> |
| #include <vector> |
| @@ -18,6 +19,7 @@ |
| #include "base/debug/trace_event.h" |
| #include "base/file_util.h" |
| #include "base/files/file_path.h" |
| +#include "base/memory/ref_counted.h" |
| #include "base/metrics/field_trial.h" |
| #include "base/metrics/histogram.h" |
| #include "base/path_service.h" |
| @@ -72,6 +74,7 @@ |
| #include "chrome/browser/net/crl_set_fetcher.h" |
| #include "chrome/browser/notifications/desktop_notification_service.h" |
| #include "chrome/browser/notifications/desktop_notification_service_factory.h" |
| +#include "chrome/browser/operation_output.h" |
| #include "chrome/browser/page_cycler/page_cycler.h" |
| #include "chrome/browser/performance_monitor/performance_monitor.h" |
| #include "chrome/browser/performance_monitor/startup_timer.h" |
| @@ -495,9 +498,10 @@ void RegisterComponentsForUpdate(const CommandLine& command_line) { |
| } |
| #if !defined(OS_ANDROID) |
| -bool ProcessSingletonNotificationCallback( |
| +bool ProcessSingletonOperationCallback( |
| const CommandLine& command_line, |
| - const base::FilePath& current_directory) { |
| + const base::FilePath& current_directory, |
| + scoped_ptr<OperationOutput> operation_output) { |
| // Drop the request if the browser process is already in shutdown path. |
| if (!g_browser_process || g_browser_process->IsShuttingDown()) |
| return false; |
| @@ -531,7 +535,10 @@ bool ProcessSingletonNotificationCallback( |
| GetStartupProfilePath(user_data_dir, command_line); |
| StartupBrowserCreator::ProcessCommandLineAlreadyRunning( |
| - command_line, current_directory, startup_profile_dir); |
| + command_line, |
| + current_directory, |
| + startup_profile_dir, |
| + operation_output.Pass()); |
| return true; |
| } |
| #endif |
| @@ -612,7 +619,7 @@ ChromeBrowserMainParts::ChromeBrowserMainParts( |
| browser_field_trials_(parameters.command_line), |
| #if !defined(OS_ANDROID) |
| process_singleton_lock_( |
| - base::Bind(&ProcessSingletonNotificationCallback)), |
| + base::Bind(&ProcessSingletonOperationCallback)), |
| modal_dialog_lock_(process_singleton_lock_.AsNotificationCallback()), |
| #endif |
| record_search_engine_(false), |
| @@ -1079,6 +1086,53 @@ void ChromeBrowserMainParts::PostBrowserStart() { |
| #endif |
| } |
| +class CaptureOperationOutput { |
| + public: |
| + CaptureOperationOutput() |
| + : exit_code_(new base::RefCountedData<int>(INT_MAX)) {} |
| + |
| + int exit_code() { return exit_code_->data; } |
| + |
| + scoped_ptr<OperationOutput> Wrap(scoped_ptr<OperationOutput> wrapped) { |
| + return scoped_ptr<OperationOutput>(new Wrapper(wrapped.Pass(), exit_code_)); |
| + } |
| + |
| + private: |
| + class Wrapper : public OperationOutput { |
| + public: |
| + Wrapper(scoped_ptr<OperationOutput> wrapped, |
| + const scoped_refptr<base::RefCountedData<int> >& exit_code) |
| + : wrapped_(wrapped.Pass()), |
| + exit_code_(exit_code) { |
| + } |
| + |
| + // OperationOutput implementation. |
| + virtual bool Write(const char* data, unsigned int length) OVERRIDE { |
| + if (wrapped_) |
| + return wrapped_->Write(data, length); |
| + return true; |
| + } |
| + |
| + private: |
| + virtual bool SetExitCode(unsigned int exit_code) OVERRIDE { |
| + bool success = true; |
| + if (wrapped_) |
| + success = OperationOutput::Complete(wrapped_.Pass(), exit_code); |
| + if (success) |
| + exit_code_->data = exit_code; |
| + return success; |
| + } |
| + scoped_ptr<OperationOutput> wrapped_; |
| + scoped_refptr<base::RefCountedData<int> > exit_code_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(Wrapper); |
| + }; |
| + |
| + scoped_refptr<base::RefCountedData<int> > exit_code_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(CaptureOperationOutput); |
| +}; |
| + |
| #if !defined(OS_ANDROID) |
| void ChromeBrowserMainParts::RunPageCycler() { |
| CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| @@ -1542,6 +1596,8 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| // http://crbug.com/105065. |
| browser_process_->notification_ui_manager(); |
| + CaptureOperationOutput capture_output; |
| + |
| #if !defined(OS_ANDROID) |
| // Most general initialization is behind us, but opening a |
| // tab and/or session restore and such is still to be done. |
| @@ -1549,7 +1605,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| // We are in regular browser boot sequence. Open initial tabs and enter the |
| // main message loop. |
| - int result_code; |
| + |
| #if defined(OS_CHROMEOS) |
| // On ChromeOS multiple profiles doesn't apply, and will break if we load |
| // them this early as the cryptohome hasn't yet been mounted (which happens |
| @@ -1563,8 +1619,11 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| if (!parsed_command_line().HasSwitch(switches::kDisableComponentUpdate)) |
| RegisterComponentsForUpdate(parsed_command_line()); |
| - if (browser_creator_->Start(parsed_command_line(), base::FilePath(), |
| - profile_, last_opened_profiles, &result_code)) { |
| + if (browser_creator_->Start( |
| + parsed_command_line(), base::FilePath(), |
| + profile_, last_opened_profiles, |
| + capture_output.Wrap( |
| + OperationOutput::Create(parsed_command_line())))) { |
| #if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS)) |
| // Initialize autoupdate timer. Timer callback costs basically nothing |
| // when browser is not in persistent mode, so it's OK to let it ride on |
| @@ -1640,7 +1699,7 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| run_message_loop_ = false; |
| } |
| - return result_code_; |
| + return capture_output.exit_code(); |
| } |
| bool ChromeBrowserMainParts::MainMessageLoopRun(int* result_code) { |