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
3// found in the LICENSE file.
4
5#include "chrome/app/android/chrome_main_delegate_android.h"
6
7#include "base/android/jni_android.h"
8#include "base/debug/trace_event.h"
9#include "chrome/browser/android/chrome_jni_registrar.h"
10#include "chrome/browser/android/chrome_startup_flags.h"
11#include "chrome/browser/android/uma_utils.h"
12#include "components/startup_metric_utils/startup_metric_utils.h"
13#include "content/public/browser/browser_main_runner.h"
14
15// ChromeMainDelegateAndroid is created when the library is loaded. It is always
16// done in the process's main Java thread. But for non browser process, e.g.
17// renderer process, it is not the native Chrome's main thread.
18ChromeMainDelegateAndroid::ChromeMainDelegateAndroid() {
19}
20
21ChromeMainDelegateAndroid::~ChromeMainDelegateAndroid() {
22}
23
24void ChromeMainDelegateAndroid::SandboxInitialized(
25    const std::string& process_type) {
26  ChromeMainDelegate::SandboxInitialized(process_type);
27}
28
29int ChromeMainDelegateAndroid::RunProcess(
30    const std::string& process_type,
31    const content::MainFunctionParams& main_function_params) {
32  TRACE_EVENT0("startup", "ChromeMainDelegateAndroid::RunProcess")
33  if (process_type.empty()) {
34    JNIEnv* env = base::android::AttachCurrentThread();
35    RegisterApplicationNativeMethods(env);
36
37    // Because the browser process can be started asynchronously as a series of
38    // UI thread tasks a second request to start it can come in while the
39    // first request is still being processed. Chrome must keep the same
40    // browser runner for the second request.
41    // Also only record the start time the first time round, since this is the
42    // start time of the application, and will be same for all requests.
43    if (!browser_runner_.get()) {
44      base::Time startTime = chrome::android::GetMainEntryPointTime();
45      startup_metric_utils::RecordSavedMainEntryPointTime(startTime);
46      browser_runner_.reset(content::BrowserMainRunner::Create());
47    }
48    return browser_runner_->Initialize(main_function_params);
49  }
50
51  return ChromeMainDelegate::RunProcess(process_type, main_function_params);
52}
53
54bool ChromeMainDelegateAndroid::BasicStartupComplete(int* exit_code) {
55  SetChromeSpecificCommandLineFlags();
56  return ChromeMainDelegate::BasicStartupComplete(exit_code);
57}
58
59bool ChromeMainDelegateAndroid::RegisterApplicationNativeMethods(JNIEnv* env) {
60  return chrome::android::RegisterJni(env);
61}
62