blob: ac422f79f3096aa89e232dd07b78a6187f81b3cf [file] [log] [blame]
// 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/macros.h"
#include "base/metrics/statistics_recorder.h"
#include "ios/web/app/web_main_loop.h"
#include "ios/web/public/url_schemes.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;
if (params.register_exit_manager) {
exit_manager_.reset(new base::AtExitManager);
}
base::CommandLine::Init(params.argc, params.argv);
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_);
RegisterWebSchemes(true);
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_;
std::unique_ptr<base::AtExitManager> exit_manager_;
std::unique_ptr<WebMainLoop> main_loop_;
DISALLOW_COPY_AND_ASSIGN(WebMainRunnerImpl);
};
// static
WebMainRunner* WebMainRunner::Create() {
return new WebMainRunnerImpl();
}
} // namespace web