| Index: ios/web/app/web_main_runner.mm
|
| diff --git a/ios/web/app/web_main_runner.mm b/ios/web/app/web_main_runner.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ff50552dedb4359fd4555b1b83079c910af30eae
|
| --- /dev/null
|
| +++ b/ios/web/app/web_main_runner.mm
|
| @@ -0,0 +1,133 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "ios/web/app/web_main_runner.h"
|
| +
|
| +#include "base/at_exit.h"
|
| +#include "base/command_line.h"
|
| +#include "base/i18n/icu_util.h"
|
| +#include "base/logging.h"
|
| +#include "base/metrics/statistics_recorder.h"
|
| +#include "ios/web/app/web_main_loop.h"
|
| +#include "ios/web/public/web_client.h"
|
| +#include "ui/base/ui_base_paths.h"
|
| +
|
| +namespace web {
|
| +
|
| +class WebMainRunnerImpl : public WebMainRunner {
|
| + public:
|
| + WebMainRunnerImpl()
|
| + : is_initialized_(false),
|
| + is_shutdown_(false),
|
| + completed_basic_startup_(false),
|
| + delegate_(nullptr) {}
|
| +
|
| + ~WebMainRunnerImpl() override {
|
| + if (is_initialized_ && !is_shutdown_) {
|
| + ShutDown();
|
| + }
|
| + }
|
| +
|
| + int Initialize(const WebMainParams& params) override {
|
| + ////////////////////////////////////////////////////////////////////////
|
| + // ContentMainRunnerImpl::Initialize()
|
| + //
|
| + is_initialized_ = true;
|
| + delegate_ = params.delegate;
|
| +
|
| + // TODO(rohitrao): Chrome for iOS initializes this in main(), because it's
|
| + // needed for breakpad. Are we really going to require that all embedders
|
| + // initialize an AtExitManager in main()?
|
| + exit_manager_.reset(new base::AtExitManager);
|
| +
|
| + // There is no way to pass commandline flags to process on iOS, so the
|
| + // CommandLine is always initialized empty. Embedders can add switches in
|
| + // |BasicStartupComplete|.
|
| + base::CommandLine::Init(0, nullptr);
|
| + if (delegate_) {
|
| + delegate_->BasicStartupComplete();
|
| + }
|
| + completed_basic_startup_ = true;
|
| +
|
| + // TODO(rohitrao): Should we instead require that all embedders call
|
| + // SetWebClient()?
|
| + if (!GetWebClient())
|
| + SetWebClient(&empty_web_client_);
|
| +
|
| +#if defined(USE_NSS)
|
| + crypto::EarlySetupForNSSInit();
|
| +#endif
|
| +
|
| + // TODO(rohitrao): Desktop calls content::RegisterContentSchemes(true) here.
|
| + // Do we need similar scheme registration on iOS?
|
| + ui::RegisterPathProvider();
|
| +
|
| + CHECK(base::i18n::InitializeICU());
|
| +
|
| + ////////////////////////////////////////////////////////////
|
| + // BrowserMainRunnerImpl::Initialize()
|
| + base::StatisticsRecorder::Initialize();
|
| +
|
| + main_loop_.reset(new WebMainLoop());
|
| + main_loop_->Init();
|
| + main_loop_->EarlyInitialization();
|
| + main_loop_->MainMessageLoopStart();
|
| + main_loop_->CreateStartupTasks();
|
| + int result_code = main_loop_->GetResultCode();
|
| + if (result_code > 0)
|
| + return result_code;
|
| +
|
| + // Return -1 to indicate no early termination.
|
| + return -1;
|
| + }
|
| +
|
| + void ShutDown() override {
|
| + ////////////////////////////////////////////////////////////////////
|
| + // BrowserMainRunner::Shutdown()
|
| + //
|
| + DCHECK(is_initialized_);
|
| + DCHECK(!is_shutdown_);
|
| + main_loop_->ShutdownThreadsAndCleanUp();
|
| + main_loop_.reset(nullptr);
|
| +
|
| + ////////////////////////////////////////////////////////////////////
|
| + // ContentMainRunner::Shutdown()
|
| + //
|
| + if (completed_basic_startup_ && delegate_) {
|
| + delegate_->ProcessExiting();
|
| + }
|
| +
|
| + exit_manager_.reset(nullptr);
|
| + delegate_ = nullptr;
|
| + is_shutdown_ = true;
|
| + }
|
| +
|
| + protected:
|
| + // True if we have started to initialize the runner.
|
| + bool is_initialized_;
|
| +
|
| + // True if the runner has been shut down.
|
| + bool is_shutdown_;
|
| +
|
| + // True if basic startup was completed.
|
| + bool completed_basic_startup_;
|
| +
|
| + // The delegate will outlive this object.
|
| + WebMainDelegate* delegate_;
|
| +
|
| + // Used if the embedder doesn't set one.
|
| + WebClient empty_web_client_;
|
| +
|
| + scoped_ptr<base::AtExitManager> exit_manager_;
|
| + scoped_ptr<WebMainLoop> main_loop_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(WebMainRunnerImpl);
|
| +};
|
| +
|
| +// static
|
| +WebMainRunner* WebMainRunner::Create() {
|
| + return new WebMainRunnerImpl();
|
| +}
|
| +
|
| +} // namespace web
|
|
|