OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |