15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/android/chrome_main_delegate_android.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/debug/trace_event.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/android/chrome_jni_registrar.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/android/chrome_startup_flags.h" 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/android/uma_utils.h" 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "components/startup_metric_utils/startup_metric_utils.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_main_runner.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ChromeMainDelegateAndroid is created when the library is loaded. It is always 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// done in the process's main Java thread. But for non browser process, e.g. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// renderer process, it is not the native Chrome's main thread. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeMainDelegateAndroid::ChromeMainDelegateAndroid() { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeMainDelegateAndroid::~ChromeMainDelegateAndroid() { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeMainDelegateAndroid::SandboxInitialized( 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& process_type) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeMainDelegate::SandboxInitialized(process_type); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ChromeMainDelegateAndroid::RunProcess( 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& process_type, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MainFunctionParams& main_function_params) { 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TRACE_EVENT0("startup", "ChromeMainDelegateAndroid::RunProcess") 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (process_type.empty()) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterApplicationNativeMethods(env); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Because the browser process can be started asynchronously as a series of 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // UI thread tasks a second request to start it can come in while the 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // first request is still being processed. Chrome must keep the same 40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // browser runner for the second request. 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Also only record the start time the first time round, since this is the 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // start time of the application, and will be same for all requests. 43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!browser_runner_.get()) { 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Time startTime = chrome::android::GetMainEntryPointTime(); 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) startup_metric_utils::RecordSavedMainEntryPointTime(startTime); 46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) browser_runner_.reset(content::BrowserMainRunner::Create()); 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return browser_runner_->Initialize(main_function_params); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ChromeMainDelegate::RunProcess(process_type, main_function_params); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeMainDelegateAndroid::BasicStartupComplete(int* exit_code) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetChromeSpecificCommandLineFlags(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ChromeMainDelegate::BasicStartupComplete(exit_code); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ChromeMainDelegateAndroid::RegisterApplicationNativeMethods(JNIEnv* env) { 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return chrome::android::RegisterJni(env); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62