| 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 |