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