| Index: android_webview/native/aw_contents.cc
|
| diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc
|
| index 3aa233712d3c7e6d85780beabf349db51cba5348..d70bfef65e2726644db997cc55e183a4f8698086 100644
|
| --- a/android_webview/native/aw_contents.cc
|
| +++ b/android_webview/native/aw_contents.cc
|
| @@ -11,6 +11,7 @@
|
| #include "android_webview/browser/aw_browser_main_parts.h"
|
| #include "android_webview/browser/aw_resource_context.h"
|
| #include "android_webview/browser/browser_view_renderer.h"
|
| +#include "android_webview/browser/child_frame.h"
|
| #include "android_webview/browser/deferred_gpu_command_service.h"
|
| #include "android_webview/browser/net_disk_cache_remover.h"
|
| #include "android_webview/browser/renderer_host/aw_resource_dispatcher_host_delegate.h"
|
| @@ -184,6 +185,9 @@ AwContents::AwContents(scoped_ptr<WebContents> web_contents)
|
| BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
|
| base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| switches::kDisablePageVisibility)),
|
| + shared_renderer_state_(
|
| + this,
|
| + BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)),
|
| web_contents_(std::move(web_contents)),
|
| renderer_manager_key_(GLViewRendererManager::GetInstance()->NullKey()) {
|
| base::subtle::NoBarrier_AtomicIncrement(&g_instance_count, 1);
|
| @@ -361,8 +365,7 @@ jint GetNativeInstanceCount(JNIEnv* env, const JavaParamRef<jclass>&) {
|
| jlong AwContents::GetAwDrawGLViewContext(JNIEnv* env,
|
| const JavaParamRef<jobject>& obj) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - return reinterpret_cast<intptr_t>(
|
| - browser_view_renderer_.GetAwDrawGLViewContext());
|
| + return reinterpret_cast<intptr_t>(&shared_renderer_state_);
|
| }
|
|
|
| namespace {
|
| @@ -656,6 +659,15 @@ void AwContents::CancelMIDISysexPermissionRequests(const GURL& origin) {
|
| origin, AwPermissionRequest::AwPermissionRequest::MIDISysex);
|
| }
|
|
|
| +void AwContents::DrawConstraintsUpdated(
|
| + const ParentCompositorDrawConstraints& draw_constraints) {
|
| + browser_view_renderer_.UpdateParentDrawConstraints(draw_constraints);
|
| +}
|
| +
|
| +bool AwContents::IsHardwareEnabled() {
|
| + return browser_view_renderer_.hardware_enabled();
|
| +}
|
| +
|
| void AwContents::FindAllAsync(JNIEnv* env,
|
| const JavaParamRef<jobject>& obj,
|
| const JavaParamRef<jstring>& search_string) {
|
| @@ -889,6 +901,7 @@ void AwContents::OnAttachedToWindow(JNIEnv* env,
|
| void AwContents::OnDetachedFromWindow(JNIEnv* env,
|
| const JavaParamRef<jobject>& obj) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + shared_renderer_state_.DeleteHardwareRendererOnUI();
|
| browser_view_renderer_.OnDetachedFromWindow();
|
| }
|
|
|
| @@ -938,26 +951,42 @@ jboolean AwContents::RestoreFromOpaqueState(
|
| return RestoreFromPickle(&iterator, web_contents_.get());
|
| }
|
|
|
| -bool AwContents::OnDraw(JNIEnv* env,
|
| - const JavaParamRef<jobject>& obj,
|
| - const JavaParamRef<jobject>& canvas,
|
| - jboolean is_hardware_accelerated,
|
| - jint scroll_x,
|
| - jint scroll_y,
|
| - jint visible_left,
|
| - jint visible_top,
|
| - jint visible_right,
|
| - jint visible_bottom) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - gfx::Vector2d scroll(scroll_x, scroll_y);
|
| - browser_view_renderer_.PrepareToDraw(
|
| - scroll, gfx::Rect(visible_left, visible_top, visible_right - visible_left,
|
| - visible_bottom - visible_top));
|
| - if (is_hardware_accelerated && browser_view_renderer_.attached_to_window() &&
|
| - !g_force_auxiliary_bitmap_rendering) {
|
| - return browser_view_renderer_.OnDrawHardware();
|
| +void AwContents::CleanUpUncommittedFrame() {
|
| + browser_view_renderer_.ReturnUnusedResource(
|
| + shared_renderer_state_.PassUncommittedFrameOnUI());
|
| +}
|
| +
|
| +void AwContents::CleanUpReturnedResources() {
|
| + SharedRendererState::ReturnedResourcesMap returned_resource_map;
|
| + shared_renderer_state_.SwapReturnedResourcesOnUI(&returned_resource_map);
|
| +
|
| + for (auto iterator = returned_resource_map.begin();
|
| + iterator != returned_resource_map.end(); iterator++) {
|
| + browser_view_renderer_.ReturnResourceFromParent(
|
| + iterator->first, iterator->second.output_surface_id,
|
| + &iterator->second.resources);
|
| + }
|
| +}
|
| +
|
| +bool AwContents::OnDrawHardware(const gfx::Vector2d& scroll) {
|
| + shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI();
|
| + CleanUpReturnedResources();
|
| +
|
| + shared_renderer_state_.SetScrollOffsetOnUI(scroll);
|
| +
|
| + scoped_ptr<ChildFrame> child_frame = browser_view_renderer_.OnDrawHardware();
|
| +
|
| + if (child_frame.get()) {
|
| + CleanUpUncommittedFrame();
|
| + shared_renderer_state_.SetFrameOnUI(std::move(child_frame));
|
| + return true;
|
| + } else {
|
| + return shared_renderer_state_.HasFrameOnUI();
|
| }
|
| +}
|
|
|
| +bool AwContents::OnDrawSoftware(const JavaRef<jobject>& canvas,
|
| + const gfx::Vector2d& scroll) {
|
| gfx::Size view_size = browser_view_renderer_.size();
|
| if (view_size.IsEmpty()) {
|
| TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_EmptySize",
|
| @@ -977,9 +1006,33 @@ bool AwContents::OnDraw(JNIEnv* env,
|
| TRACE_EVENT_SCOPE_THREAD);
|
| return false;
|
| }
|
| + CleanUpReturnedResources();
|
| return browser_view_renderer_.OnDrawSoftware(canvas_holder->GetCanvas());
|
| }
|
|
|
| +bool AwContents::OnDraw(JNIEnv* env,
|
| + const JavaParamRef<jobject>& obj,
|
| + const JavaParamRef<jobject>& canvas,
|
| + jboolean is_hardware_accelerated,
|
| + jint scroll_x,
|
| + jint scroll_y,
|
| + jint visible_left,
|
| + jint visible_top,
|
| + jint visible_right,
|
| + jint visible_bottom) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + browser_view_renderer_.PrepareToDraw(gfx::Rect(visible_left, visible_top,
|
| + visible_right - visible_left,
|
| + visible_bottom - visible_top));
|
| + gfx::Vector2d scroll(scroll_x, scroll_y);
|
| + if (is_hardware_accelerated && browser_view_renderer_.attached_to_window() &&
|
| + !g_force_auxiliary_bitmap_rendering) {
|
| + return OnDrawHardware(scroll);
|
| + } else {
|
| + return OnDrawSoftware(canvas, scroll);
|
| + }
|
| +}
|
| +
|
| void AwContents::SetPendingWebContentsForPopup(
|
| scoped_ptr<content::WebContents> pending) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| @@ -1208,7 +1261,28 @@ void AwContents::TrimMemory(JNIEnv* env,
|
| jint level,
|
| jboolean visible) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - browser_view_renderer_.TrimMemory(level, visible);
|
| + // Constants from Android ComponentCallbacks2.
|
| + enum {
|
| + TRIM_MEMORY_RUNNING_LOW = 10,
|
| + TRIM_MEMORY_UI_HIDDEN = 20,
|
| + TRIM_MEMORY_BACKGROUND = 40,
|
| + TRIM_MEMORY_MODERATE = 60,
|
| + };
|
| +
|
| + // Not urgent enough. TRIM_MEMORY_UI_HIDDEN is treated specially because
|
| + // it does not indicate memory pressure, but merely that the app is
|
| + // backgrounded.
|
| + if (level < TRIM_MEMORY_RUNNING_LOW || level == TRIM_MEMORY_UI_HIDDEN)
|
| + return;
|
| +
|
| + // Do not release resources on view we expect to get DrawGL soon.
|
| + if (level < TRIM_MEMORY_BACKGROUND && visible)
|
| + return;
|
| +
|
| + if (level >= TRIM_MEMORY_MODERATE)
|
| + shared_renderer_state_.TrimMemoryOnUI(level);
|
| +
|
| + browser_view_renderer_.TrimMemory(level);
|
| }
|
|
|
| // TODO(sgurun) add support for posting a frame whose name is known (only
|
|
|