aw_main_delegate.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
1678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org// Use of this source code is governed by a BSD-style license that can be 3678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org// found in the LICENSE file. 4678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 5678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "android_webview/lib/main/aw_main_delegate.h" 6678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 7678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "android_webview/browser/aw_content_browser_client.h" 8678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "android_webview/browser/gpu_memory_buffer_factory_impl.h" 9678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "android_webview/browser/in_process_view_renderer.h" 10678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "android_webview/browser/scoped_allow_wait_for_legacy_web_view_api.h" 11678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "android_webview/lib/aw_browser_dependency_factory_impl.h" 12678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "android_webview/native/aw_geolocation_permission_context.h" 13678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "android_webview/native/aw_quota_manager_bridge_impl.h" 14678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "android_webview/native/aw_web_contents_view_delegate.h" 15678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "android_webview/native/aw_web_preferences_populater_impl.h" 16678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "android_webview/renderer/aw_content_renderer_client.h" 17678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "base/command_line.h" 18678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "base/lazy_instance.h" 19678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "base/logging.h" 20678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "base/memory/scoped_ptr.h" 21678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "base/threading/thread_restrictions.h" 22678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "cc/base/switches.h" 23678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "content/public/browser/browser_main_runner.h" 24678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "content/public/browser/browser_thread.h" 25678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "content/public/common/content_switches.h" 26678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "gpu/command_buffer/client/gl_in_process_context.h" 27678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "gpu/command_buffer/service/in_process_command_buffer.h" 28678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org#include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h" 29678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 30678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgnamespace android_webview { 31678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 32678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgnamespace { 33678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 34678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org// TODO(boliu): Remove this global Allow once the underlying issues are 35678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org// resolved - http://crbug.com/240453. See AwMainDelegate::RunProcess below. 36678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgbase::LazyInstance<scoped_ptr<ScopedAllowWaitForLegacyWebViewApi> > 37678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org g_allow_wait_in_ui_thread = LAZY_INSTANCE_INITIALIZER; 38678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 39678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 40678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 41678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgAwMainDelegate::AwMainDelegate() 42678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org : gpu_memory_buffer_factory_(new GpuMemoryBufferFactoryImpl) { 43678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 44678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 45678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgAwMainDelegate::~AwMainDelegate() { 46678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 47678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 48678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgbool AwMainDelegate::BasicStartupComplete(int* exit_code) { 49678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org content::SetContentClient(&content_client_); 50678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 51678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org gpu::InProcessCommandBuffer::SetGpuMemoryBufferFactory( 52678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org gpu_memory_buffer_factory_.get()); 53678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org gpu::InProcessCommandBuffer::EnableVirtualizedContext(); 54678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 55678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org InProcessViewRenderer::CalculateTileMemoryPolicy(); 56678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 57678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org CommandLine* cl = CommandLine::ForCurrentProcess(); 58678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org cl->AppendSwitch(switches::kEnableBeginFrameScheduling); 59678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org cl->AppendSwitch(cc::switches::kEnableMapImage); 60678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 61678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org // WebView uses the Android system's scrollbars and overscroll glow. 62678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org cl->AppendSwitch(switches::kHideScrollbars); 63678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org cl->AppendSwitch(switches::kDisableOverscrollEdgeEffect); 64678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 65678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org // Not yet supported in single-process mode. 66678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org cl->AppendSwitch(switches::kDisableExperimentalWebGL); 67678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org cl->AppendSwitch(switches::kDisableSharedWorkers); 68678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 69678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org // Ganesh backed 2D-Canvas is not yet working and causes crashes. 70678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org cl->AppendSwitch(switches::kDisableAccelerated2dCanvas); 71678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 72678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org // File system API not supported (requires some new API; internal bug 6930981) 73678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org cl->AppendSwitch(switches::kDisableFileSystem); 74678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 75678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org // Enable D-PAD navigation for application compatibility. 76678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org cl->AppendSwitch(switches::kEnableSpatialNavigation); 77678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 78678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org // Disable compositor touch hit testing for now to mitigate risk of bugs. 79678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org cl->AppendSwitch(cc::switches::kDisableCompositorTouchHitTesting); 80678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 81678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org // Disable WebRTC. 82678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org cl->AppendSwitch(switches::kDisableWebRTC); 83678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 84678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org return false; 85678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 86678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 87678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgvoid AwMainDelegate::PreSandboxStartup() { 88678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org // TODO(torne): When we have a separate renderer process, we need to handle 89678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org // being passed open FDs for the resource paks here. 90678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 91678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 92678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgvoid AwMainDelegate::SandboxInitialized(const std::string& process_type) { 93678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org // TODO(torne): Adjust linux OOM score here. 94678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 95678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 96678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgint AwMainDelegate::RunProcess( 97678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org const std::string& process_type, 98678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org const content::MainFunctionParams& main_function_params) { 99678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org if (process_type.empty()) { 100678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org AwBrowserDependencyFactoryImpl::InstallInstance(); 101678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 102678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org browser_runner_.reset(content::BrowserMainRunner::Create()); 103678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org int exit_code = browser_runner_->Initialize(main_function_params); 104678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org DCHECK(exit_code < 0); 105678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 106678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org g_allow_wait_in_ui_thread.Get().reset( 107678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org new ScopedAllowWaitForLegacyWebViewApi); 108678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 109678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org // Return 0 so that we do NOT trigger the default behavior. On Android, the 110678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org // UI message loop is managed by the Java application. 111678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org return 0; 112678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org } 113678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 114678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org return -1; 115678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 116678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 117678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgvoid AwMainDelegate::ProcessExiting(const std::string& process_type) { 118678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org // TODO(torne): Clean up resources when we handle them. 119678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 120678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org logging::CloseLogFile(); 121678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 122678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 123678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgcontent::ContentBrowserClient* 124678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org AwMainDelegate::CreateContentBrowserClient() { 125678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org content_browser_client_.reset(new AwContentBrowserClient(this)); 126678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org return content_browser_client_.get(); 127678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 128678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 129678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgcontent::ContentRendererClient* 130678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org AwMainDelegate::CreateContentRendererClient() { 131678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org content_renderer_client_.reset(new AwContentRendererClient()); 132678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org return content_renderer_client_.get(); 133678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 134678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 135678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgscoped_refptr<AwQuotaManagerBridge> AwMainDelegate::CreateAwQuotaManagerBridge( 136678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org AwBrowserContext* browser_context) { 137678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org return AwQuotaManagerBridgeImpl::Create(browser_context); 138678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 139678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 140678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgcontent::GeolocationPermissionContext* 141678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org AwMainDelegate::CreateGeolocationPermission( 142678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org AwBrowserContext* browser_context) { 143678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org return AwGeolocationPermissionContext::Create(browser_context); 144678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 145678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 146678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgcontent::WebContentsViewDelegate* AwMainDelegate::CreateViewDelegate( 147678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org content::WebContents* web_contents) { 148678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org return AwWebContentsViewDelegate::Create(web_contents); 149678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 150678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 151678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.orgAwWebPreferencesPopulater* AwMainDelegate::CreateWebPreferencesPopulater() { 152678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org return new AwWebPreferencesPopulaterImpl(); 153678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} 154678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org 155678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org} // namespace android_webview 156678f1909fc6918687aedd02949bcdf0f0e1ac682jiayl@webrtc.org