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 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 jint GetNativeInstanceCount(JNIEnv* env, jclass) { | 309 jint GetNativeInstanceCount(JNIEnv* env, jclass) { |
310 return base::subtle::NoBarrier_Load(&g_instance_count); | 310 return base::subtle::NoBarrier_Load(&g_instance_count); |
311 } | 311 } |
312 | 312 |
313 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) { | 313 jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env, jobject obj) { |
314 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 314 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
315 return reinterpret_cast<intptr_t>(this); | 315 return reinterpret_cast<intptr_t>(this); |
316 } | 316 } |
317 | 317 |
318 void AwContents::DrawGL(AwDrawGLInfo* draw_info) { | 318 void AwContents::DrawGL(AwDrawGLInfo* draw_info) { |
319 if (!hardware_renderer_) { | 319 for (base::Closure c = shared_renderer_state_.PopFrontClosure(); !c.is_null(); |
320 // TODO(boliu): Use executeHardwareAction to synchronously initialize | 320 c = shared_renderer_state_.PopFrontClosure()) { |
321 // hardware on first functor request. Then functor can point directly | 321 c.Run(); |
322 // to HardwareRenderer. | |
323 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_)); | |
324 } | 322 } |
325 | 323 |
| 324 // TODO(boliu): Make this a task as well. |
326 DrawGLResult result; | 325 DrawGLResult result; |
327 if (hardware_renderer_->DrawGL(draw_info, &result)) { | 326 if (hardware_renderer_ && hardware_renderer_->DrawGL(draw_info, &result)) { |
328 content::BrowserThread::PostTask( | 327 content::BrowserThread::PostTask( |
329 content::BrowserThread::UI, | 328 content::BrowserThread::UI, |
330 FROM_HERE, | 329 FROM_HERE, |
331 base::Bind(&AwContents::DidDrawGL, ui_thread_weak_ptr_, result)); | 330 base::Bind(&AwContents::DidDrawGL, ui_thread_weak_ptr_, result)); |
332 } | 331 } |
333 } | 332 } |
334 | 333 |
335 void AwContents::DidDrawGL(const DrawGLResult& result) { | 334 void AwContents::DidDrawGL(const DrawGLResult& result) { |
336 browser_view_renderer_.DidDrawGL(result); | 335 browser_view_renderer_.DidDrawGL(result); |
337 } | 336 } |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 597 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
599 JNIEnv* env = AttachCurrentThread(); | 598 JNIEnv* env = AttachCurrentThread(); |
600 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 599 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
601 if (obj.is_null()) | 600 if (obj.is_null()) |
602 return; | 601 return; |
603 | 602 |
604 Java_AwContents_onReceivedTouchIconUrl( | 603 Java_AwContents_onReceivedTouchIconUrl( |
605 env, obj.obj(), ConvertUTF8ToJavaString(env, url).obj(), precomposed); | 604 env, obj.obj(), ConvertUTF8ToJavaString(env, url).obj(), precomposed); |
606 } | 605 } |
607 | 606 |
608 bool AwContents::RequestDrawGL(jobject canvas) { | 607 bool AwContents::RequestDrawGL(jobject canvas, bool wait_for_completion) { |
609 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 608 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 609 DCHECK(!canvas || !wait_for_completion); |
610 JNIEnv* env = AttachCurrentThread(); | 610 JNIEnv* env = AttachCurrentThread(); |
611 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 611 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
612 if (obj.is_null()) | 612 if (obj.is_null()) |
613 return false; | 613 return false; |
614 return Java_AwContents_requestDrawGL(env, obj.obj(), canvas); | 614 return Java_AwContents_requestDrawGL( |
| 615 env, obj.obj(), canvas, wait_for_completion); |
615 } | 616 } |
616 | 617 |
617 void AwContents::PostInvalidate() { | 618 void AwContents::PostInvalidate() { |
618 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 619 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
619 JNIEnv* env = AttachCurrentThread(); | 620 JNIEnv* env = AttachCurrentThread(); |
620 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 621 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
621 if (!obj.is_null()) | 622 if (!obj.is_null()) |
622 Java_AwContents_postInvalidateOnAnimation(env, obj.obj()); | 623 Java_AwContents_postInvalidateOnAnimation(env, obj.obj()); |
623 } | 624 } |
624 | 625 |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 if (cvc) { | 720 if (cvc) { |
720 cvc->PauseOrResumeGeolocation(paused); | 721 cvc->PauseOrResumeGeolocation(paused); |
721 if (paused) { | 722 if (paused) { |
722 cvc->PauseVideo(); | 723 cvc->PauseVideo(); |
723 } | 724 } |
724 } | 725 } |
725 } | 726 } |
726 | 727 |
727 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { | 728 void AwContents::OnAttachedToWindow(JNIEnv* env, jobject obj, int w, int h) { |
728 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 729 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 730 // Add task but don't schedule it. It will run when DrawGL is called for |
| 731 // the first time. |
| 732 shared_renderer_state_.AppendClosure( |
| 733 base::Bind(&AwContents::InitializeHardwareDrawOnRenderThread, |
| 734 base::Unretained(this))); |
729 browser_view_renderer_.OnAttachedToWindow(w, h); | 735 browser_view_renderer_.OnAttachedToWindow(w, h); |
730 } | 736 } |
731 | 737 |
| 738 void AwContents::InitializeHardwareDrawOnRenderThread() { |
| 739 DCHECK(!hardware_renderer_); |
| 740 DCHECK(!shared_renderer_state_.IsHardwareInitialized()); |
| 741 hardware_renderer_.reset(new HardwareRenderer(&shared_renderer_state_)); |
| 742 shared_renderer_state_.SetHardwareInitialized(true); |
| 743 } |
| 744 |
732 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { | 745 void AwContents::OnDetachedFromWindow(JNIEnv* env, jobject obj) { |
733 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 746 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 747 |
| 748 shared_renderer_state_.ClearClosureQueue(); |
| 749 shared_renderer_state_.AppendClosure(base::Bind( |
| 750 &AwContents::ReleaseHardwareDrawOnRenderThread, base::Unretained(this))); |
| 751 bool draw_functor_succeeded = RequestDrawGL(NULL, true); |
| 752 if (!draw_functor_succeeded && |
| 753 shared_renderer_state_.IsHardwareInitialized()) { |
| 754 LOG(ERROR) << "Unable to free GL resources. Has the Window leaked"; |
| 755 // Calling release on wrong thread intentionally. |
| 756 ReleaseHardwareDrawOnRenderThread(); |
| 757 } else { |
| 758 shared_renderer_state_.ClearClosureQueue(); |
| 759 } |
| 760 |
734 browser_view_renderer_.OnDetachedFromWindow(); | 761 browser_view_renderer_.OnDetachedFromWindow(); |
735 } | 762 } |
736 | 763 |
737 void AwContents::ReleaseHardwareDrawOnRenderThread(JNIEnv* env, jobject obj) { | 764 void AwContents::ReleaseHardwareDrawOnRenderThread() { |
| 765 DCHECK(hardware_renderer_); |
| 766 DCHECK(shared_renderer_state_.IsHardwareInitialized()); |
| 767 // No point in running any other commands if we released hardware already. |
| 768 shared_renderer_state_.ClearClosureQueue(); |
738 hardware_renderer_.reset(); | 769 hardware_renderer_.reset(); |
| 770 shared_renderer_state_.SetHardwareInitialized(false); |
739 } | 771 } |
740 | 772 |
741 base::android::ScopedJavaLocalRef<jbyteArray> | 773 base::android::ScopedJavaLocalRef<jbyteArray> |
742 AwContents::GetOpaqueState(JNIEnv* env, jobject obj) { | 774 AwContents::GetOpaqueState(JNIEnv* env, jobject obj) { |
743 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 775 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
744 // Required optimization in WebViewClassic to not save any state if | 776 // Required optimization in WebViewClassic to not save any state if |
745 // there has been no navigations. | 777 // there has been no navigations. |
746 if (!web_contents_->GetController().GetEntryCount()) | 778 if (!web_contents_->GetController().GetEntryCount()) |
747 return ScopedJavaLocalRef<jbyteArray>(); | 779 return ScopedJavaLocalRef<jbyteArray>(); |
748 | 780 |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
987 base::Bind(&NotifyClientCertificatesChanged)); | 1019 base::Bind(&NotifyClientCertificatesChanged)); |
988 } | 1020 } |
989 | 1021 |
990 void AwContents::SetJsOnlineProperty(JNIEnv* env, | 1022 void AwContents::SetJsOnlineProperty(JNIEnv* env, |
991 jobject obj, | 1023 jobject obj, |
992 jboolean network_up) { | 1024 jboolean network_up) { |
993 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1025 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
994 render_view_host_ext_->SetJsOnlineProperty(network_up); | 1026 render_view_host_ext_->SetJsOnlineProperty(network_up); |
995 } | 1027 } |
996 | 1028 |
997 void AwContents::TrimMemoryOnRenderThread(JNIEnv* env, | 1029 void AwContents::TrimMemory(JNIEnv* env, |
998 jobject obj, | 1030 jobject obj, |
999 jint level, | 1031 jint level, |
1000 jboolean visible) { | 1032 jboolean visible) { |
1001 if (hardware_renderer_) { | 1033 if (!shared_renderer_state_.IsHardwareInitialized()) |
1002 if (hardware_renderer_->TrimMemory(level, visible)) { | 1034 return; |
1003 content::BrowserThread::PostTask( | 1035 |
1004 content::BrowserThread::UI, | 1036 shared_renderer_state_.AppendClosure( |
1005 FROM_HERE, | 1037 base::Bind(&AwContents::TrimMemoryOnRenderThread, |
1006 base::Bind(&AwContents::ForceFakeComposite, ui_thread_weak_ptr_)); | 1038 base::Unretained(this), |
1007 } | 1039 level, |
| 1040 visible)); |
| 1041 RequestDrawGL(NULL, true); |
| 1042 } |
| 1043 |
| 1044 void AwContents::TrimMemoryOnRenderThread(int level, bool visible) { |
| 1045 if (hardware_renderer_ && hardware_renderer_->TrimMemory(level, visible)) { |
| 1046 content::BrowserThread::PostTask( |
| 1047 content::BrowserThread::UI, |
| 1048 FROM_HERE, |
| 1049 base::Bind(&AwContents::ForceFakeComposite, ui_thread_weak_ptr_)); |
1008 } | 1050 } |
1009 } | 1051 } |
1010 | 1052 |
1011 void AwContents::ForceFakeComposite() { | 1053 void AwContents::ForceFakeComposite() { |
1012 browser_view_renderer_.ForceFakeCompositeSW(); | 1054 browser_view_renderer_.ForceFakeCompositeSW(); |
1013 } | 1055 } |
1014 | 1056 |
1015 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { | 1057 void SetShouldDownloadFavicons(JNIEnv* env, jclass jclazz) { |
1016 g_should_download_favicons = true; | 1058 g_should_download_favicons = true; |
1017 } | 1059 } |
1018 | 1060 |
1019 } // namespace android_webview | 1061 } // namespace android_webview |
OLD | NEW |