Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(297)

Side by Side Diff: android_webview/native/aw_contents.cc

Issue 655813004: Part 1: Refactor Android WebView graphics code (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@refactor
Patch Set: comments Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « android_webview/native/aw_contents.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "android_webview/native/aw_contents.h" 5 #include "android_webview/native/aw_contents.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "android_webview/browser/aw_browser_context.h" 9 #include "android_webview/browser/aw_browser_context.h"
10 #include "android_webview/browser/aw_browser_main_parts.h" 10 #include "android_webview/browser/aw_browser_main_parts.h"
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 // static 153 // static
154 AwBrowserPermissionRequestDelegate* AwBrowserPermissionRequestDelegate::FromID( 154 AwBrowserPermissionRequestDelegate* AwBrowserPermissionRequestDelegate::FromID(
155 int render_process_id, int render_view_id) { 155 int render_process_id, int render_view_id) {
156 AwContents* aw_contents = AwContents::FromID(render_process_id, 156 AwContents* aw_contents = AwContents::FromID(render_process_id,
157 render_view_id); 157 render_view_id);
158 return implicit_cast<AwBrowserPermissionRequestDelegate*>(aw_contents); 158 return implicit_cast<AwBrowserPermissionRequestDelegate*>(aw_contents);
159 } 159 }
160 160
161 AwContents::AwContents(scoped_ptr<WebContents> web_contents) 161 AwContents::AwContents(scoped_ptr<WebContents> web_contents)
162 : web_contents_(web_contents.Pass()), 162 : web_contents_(web_contents.Pass()),
163 shared_renderer_state_(
164 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
165 this),
166 browser_view_renderer_( 163 browser_view_renderer_(
167 this, 164 this,
168 &shared_renderer_state_,
169 web_contents_.get(), 165 web_contents_.get(),
170 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)), 166 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)),
167 shared_renderer_state_(browser_view_renderer_.GetSharedRendererState()),
171 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()) { 168 renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()) {
172 base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, 1); 169 base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, 1);
173 icon_helper_.reset(new IconHelper(web_contents_.get())); 170 icon_helper_.reset(new IconHelper(web_contents_.get()));
174 icon_helper_->SetListener(this); 171 icon_helper_->SetListener(this);
175 web_contents_->SetUserData(kAwContentsUserDataKey, 172 web_contents_->SetUserData(kAwContentsUserDataKey,
176 new AwContentsUserData(this)); 173 new AwContentsUserData(this));
177 render_view_host_ext_.reset( 174 render_view_host_ext_.reset(
178 new AwRenderViewHostExt(this, web_contents_.get())); 175 new AwRenderViewHostExt(this, web_contents_.get()));
179 176
180 permission_request_handler_.reset( 177 permission_request_handler_.reset(
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 // static 333 // static
337 jint GetNativeInstanceCount(JNIEnv* env, jclass) { 334 jint GetNativeInstanceCount(JNIEnv* env, jclass) {
338 return base::subtle::NoBarrier_Load(&g_instance_count); 335 return base::subtle::NoBarrier_Load(&g_instance_count);
339 } 336 }
340 337
341 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) { 338 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) {
342 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 339 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
343 return reinterpret_cast<intptr_t>(this); 340 return reinterpret_cast<intptr_t>(this);
344 } 341 }
345 342
343 // TODO(hush): move this function to SharedRendererState.
346 void AwContents::DrawGL(AwDrawGLInfo* draw_info) { 344 void AwContents::DrawGL(AwDrawGLInfo* draw_info) {
347 if (draw_info->mode == AwDrawGLInfo::kModeSync) { 345 if (draw_info->mode == AwDrawGLInfo::kModeSync) {
348 if (hardware_renderer_) 346 if (hardware_renderer_)
349 hardware_renderer_->CommitFrame(); 347 hardware_renderer_->CommitFrame();
350 return; 348 return;
351 } 349 }
352 350
353 { 351 {
354 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); 352 GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
355 base::AutoLock lock(render_thread_lock_); 353 base::AutoLock lock(render_thread_lock_);
(...skipping 12 matching lines...) Expand all
368 LOG(ERROR) << "Received unexpected kModeProcessNoContext"; 366 LOG(ERROR) << "Received unexpected kModeProcessNoContext";
369 } 367 }
370 368
371 // kModeProcessNoContext should never happen because we tear down hardware 369 // kModeProcessNoContext should never happen because we tear down hardware
372 // in onTrimMemory. However that guarantee is maintained outside of chromium 370 // in onTrimMemory. However that guarantee is maintained outside of chromium
373 // code. Not notifying shared state in kModeProcessNoContext can lead to 371 // code. Not notifying shared state in kModeProcessNoContext can lead to
374 // immediate deadlock, which is slightly more catastrophic than leaks or 372 // immediate deadlock, which is slightly more catastrophic than leaks or
375 // corruption. 373 // corruption.
376 if (draw_info->mode == AwDrawGLInfo::kModeProcess || 374 if (draw_info->mode == AwDrawGLInfo::kModeProcess ||
377 draw_info->mode == AwDrawGLInfo::kModeProcessNoContext) { 375 draw_info->mode == AwDrawGLInfo::kModeProcessNoContext) {
378 shared_renderer_state_.DidDrawGLProcess(); 376 shared_renderer_state_->DidDrawGLProcess();
379 } 377 }
380 378
381 if (shared_renderer_state_.IsInsideHardwareRelease()) { 379 if (shared_renderer_state_->IsInsideHardwareRelease()) {
382 hardware_renderer_.reset(); 380 hardware_renderer_.reset();
383 // Flush the idle queue in tear down. 381 // Flush the idle queue in tear down.
384 DeferredGpuCommandService::GetInstance()->PerformAllIdleWork(); 382 DeferredGpuCommandService::GetInstance()->PerformAllIdleWork();
385 return; 383 return;
386 } 384 }
387 385
388 if (draw_info->mode != AwDrawGLInfo::kModeDraw) { 386 if (draw_info->mode != AwDrawGLInfo::kModeDraw) {
389 if (draw_info->mode == AwDrawGLInfo::kModeProcess) { 387 if (draw_info->mode == AwDrawGLInfo::kModeProcess) {
390 DeferredGpuCommandService::GetInstance()->PerformIdleWork(true); 388 DeferredGpuCommandService::GetInstance()->PerformIdleWork(true);
391 } 389 }
392 return; 390 return;
393 } 391 }
394 392
395 if (!hardware_renderer_) { 393 if (!hardware_renderer_) {
396 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_)); 394 hardware_renderer_.reset(new HardwareRenderer(shared_renderer_state_));
397 hardware_renderer_->CommitFrame(); 395 hardware_renderer_->CommitFrame();
398 } 396 }
399 397
400 hardware_renderer_->DrawGL(state_restore.stencil_enabled(), 398 hardware_renderer_->DrawGL(state_restore.stencil_enabled(),
401 state_restore.framebuffer_binding_ext(), 399 state_restore.framebuffer_binding_ext(),
402 draw_info); 400 draw_info);
403 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false); 401 DeferredGpuCommandService::GetInstance()->PerformIdleWork(false);
404 } 402 }
405 403
406 namespace { 404 namespace {
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after
881 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { 879 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) {
882 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 880 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
883 browser_view_renderer_.OnAttachedToWindow(w, h); 881 browser_view_renderer_.OnAttachedToWindow(w, h);
884 } 882 }
885 883
886 void AwContents::InitializeHardwareDrawIfNeeded() { 884 void AwContents::InitializeHardwareDrawIfNeeded() {
887 GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); 885 GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
888 886
889 base::AutoLock lock(render_thread_lock_); 887 base::AutoLock lock(render_thread_lock_);
890 if (renderer_manager_key_ == manager->NullKey()) { 888 if (renderer_manager_key_ == manager->NullKey()) {
891 renderer_manager_key_ = manager->PushBack(&shared_renderer_state_); 889 renderer_manager_key_ = manager->PushBack(shared_renderer_state_);
892 DeferredGpuCommandService::SetInstance(); 890 DeferredGpuCommandService::SetInstance();
893 } 891 }
894 } 892 }
895 893
896 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { 894 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) {
897 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 895 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
898 ReleaseHardwareDrawIfNeeded(); 896 ReleaseHardwareDrawIfNeeded();
899 browser_view_renderer_.OnDetachedFromWindow(); 897 browser_view_renderer_.OnDetachedFromWindow();
900 } 898 }
901 899
902 void AwContents::ReleaseHardwareDrawIfNeeded() { 900 void AwContents::ReleaseHardwareDrawIfNeeded() {
903 InsideHardwareReleaseReset inside_reset(&shared_renderer_state_); 901 InsideHardwareReleaseReset inside_reset(shared_renderer_state_);
904 902
905 JNIEnv* env = AttachCurrentThread(); 903 JNIEnv* env = AttachCurrentThread();
906 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); 904 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
907 if (!obj.is_null()) 905 if (!obj.is_null())
908 Java_AwContents_invalidateOnFunctorDestroy(env, obj.obj()); 906 Java_AwContents_invalidateOnFunctorDestroy(env, obj.obj());
909 907
910 bool hardware_initialized = browser_view_renderer_.hardware_enabled(); 908 bool hardware_initialized = browser_view_renderer_.hardware_enabled();
911 if (hardware_initialized) { 909 if (hardware_initialized) {
912 bool draw_functor_succeeded = RequestDrawGL(NULL, true); 910 bool draw_functor_succeeded = RequestDrawGL(NULL, true);
913 if (!draw_functor_succeeded) { 911 if (!draw_functor_succeeded) {
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
1173 } 1171 }
1174 1172
1175 browser_view_renderer_.TrimMemory(level, visible); 1173 browser_view_renderer_.TrimMemory(level, visible);
1176 } 1174 }
1177 1175
1178 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { 1176 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) {
1179 g_should_download_favicons = true; 1177 g_should_download_favicons = true;
1180 } 1178 }
1181 1179
1182 } // namespace android_webview 1180 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/native/aw_contents.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698