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 372d0ee473b064461c7dffada6a2ed778f297df8..8d8a4ce9351b11a5297ae825ad2b743b82667ddd 100644 |
| --- a/chrome/browser/chrome_browser_main.cc |
| +++ b/chrome/browser/chrome_browser_main.cc |
| @@ -63,6 +63,7 @@ |
| #include "chrome/browser/memory/tab_manager.h" |
| #include "chrome/browser/metrics/field_trial_synchronizer.h" |
| #include "chrome/browser/metrics/thread_watcher.h" |
| +#include "chrome/browser/mojo_runner_util.h" |
| #include "chrome/browser/nacl_host/nacl_browser_delegate_impl.h" |
| #include "chrome/browser/net/crl_set_fetcher.h" |
| #include "chrome/browser/performance_monitor/performance_monitor.h" |
| @@ -247,6 +248,12 @@ |
| #include "components/webusb/webusb_detector.h" |
| #endif |
| +#if defined(MOJO_RUNNER_CLIENT) |
| +#include "mojo/application/public/cpp/application_delegate.h" |
| +#include "mojo/application/public/cpp/application_impl.h" |
| +#include "mojo/runner/child/runner_connection.h" |
| +#endif |
| + |
| using content::BrowserThread; |
| namespace { |
| @@ -571,6 +578,32 @@ const char kMissingLocaleDataMessage[] = |
| } // namespace chrome_browser |
| +#if defined(MOJO_RUNNER_CLIENT) |
| +class ChromeApplicationDelegate : public mojo::ApplicationDelegate { |
| + public: |
| + ChromeApplicationDelegate() {} |
| + ~ChromeApplicationDelegate() override {} |
| + |
| + // Runs the current thread's message loop until we receive an Initialize() |
| + // call from the shell. |
| + void RunUntilInitialize() { |
| + base::MessageLoop::current()->Run(); |
|
sky
2015/11/05 00:29:34
You sure you want to run a nested message loop her
|
| + } |
| + |
| + private: |
| + void Initialize(mojo::ApplicationImpl* application) override { |
| + // TODO(beng): Connect to the window manager. |
| + base::MessageLoop::current()->QuitNow(); |
| + } |
| + bool ConfigureIncomingConnection( |
| + mojo::ApplicationConnection* connection) override { |
| + return false; |
| + } |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ChromeApplicationDelegate); |
| +}; |
| +#endif // defined(MOJO_RUNNER_CLIENT) |
| + |
| // BrowserMainParts ------------------------------------------------------------ |
| ChromeBrowserMainParts::ChromeBrowserMainParts( |
| @@ -1212,6 +1245,21 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { |
| SCOPED_UMA_HISTOGRAM_LONG_TIMER("Startup.PreMainMessageLoopRunImplLongTime"); |
| const base::TimeTicks start_time_step1 = base::TimeTicks::Now(); |
| +#if defined(MOJO_RUNNER_CLIENT) |
| + if (chrome::IsRunningInMojoRunner()) { |
| + // When run from the Mojo Runner, block until we can bind an Application |
| + // request from the runner's shell, and run the main message loop until |
| + // our bound ApplicationImpl is ready to use. |
| + mojo::InterfaceRequest<mojo::Application> application_request; |
| + runner_connection_.reset( |
| + mojo::runner::RunnerConnection::ConnectToRunner(&application_request)); |
| + application_delegate_.reset(new ChromeApplicationDelegate); |
| + application_impl_.reset(new mojo::ApplicationImpl( |
| + application_delegate_.get(), application_request.Pass())); |
| + application_delegate_->RunUntilInitialize(); |
| + } |
| +#endif // defined(MOJO_RUNNER_CLIENT) |
| + |
| #if defined(OS_WIN) |
| // Windows parental controls calls can be slow, so we do an early init here |
| // that calculates this value off of the UI thread. |