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

Unified Diff: android_webview/browser/browser_view_renderer.cc

Issue 2036023002: Rewire Android WebView's compositor changed signal. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix browse_view_renderer construction and rebase Created 4 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: android_webview/browser/browser_view_renderer.cc
diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc
index a1d981e4eba9861699382aafa06155458b2b460c..c5ccc5b3b9abd4af20562047d4a335350988cadb 100644
--- a/android_webview/browser/browser_view_renderer.cc
+++ b/android_webview/browser/browser_view_renderer.cc
@@ -19,6 +19,8 @@
#include "base/trace_event/trace_event_argument.h"
#include "cc/output/compositor_frame.h"
#include "cc/output/compositor_frame_ack.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
#include "gpu/command_buffer/service/gpu_switches.h"
@@ -88,12 +90,16 @@ BrowserViewRenderer* BrowserViewRenderer::FromWebContents(
}
BrowserViewRenderer::BrowserViewRenderer(
+ content::WebContents* web_contents,
BrowserViewRendererClient* client,
const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner)
- : client_(client),
+ : content::WebContentsObserver(web_contents),
+ client_(client),
ui_task_runner_(ui_task_runner),
current_compositor_frame_consumer_(nullptr),
- compositor_(NULL),
+ compositor_(nullptr),
+ compositor_id_(web_contents->GetRenderProcessHost()->GetID(),
+ web_contents->GetRenderViewHost()->GetRoutingID()),
is_paused_(false),
view_visible_(false),
window_visible_(false),
@@ -105,8 +111,7 @@ BrowserViewRenderer::BrowserViewRenderer(
max_page_scale_factor_(0.f),
on_new_picture_enable_(false),
clear_view_(false),
- offscreen_pre_raster_(false),
- next_compositor_id_(1) {}
+ offscreen_pre_raster_(false) {}
BrowserViewRenderer::~BrowserViewRenderer() {
DCHECK(compositor_map_.empty());
@@ -247,10 +252,9 @@ bool BrowserViewRenderer::OnDrawHardware() {
}
std::unique_ptr<ChildFrame> child_frame = base::WrapUnique(new ChildFrame(
- frame.output_surface_id, std::move(frame.frame),
- GetCompositorID(compositor_), viewport_rect_for_tile_priority.IsEmpty(),
- transform_for_tile_priority, offscreen_pre_raster_,
- external_draw_constraints_.is_layer));
+ frame.output_surface_id, std::move(frame.frame), compositor_id_,
+ viewport_rect_for_tile_priority.IsEmpty(), transform_for_tile_priority,
+ offscreen_pre_raster_, external_draw_constraints_.is_layer));
ReturnUnusedResource(
current_compositor_frame_consumer_->PassUncommittedFrameOnUI());
@@ -304,16 +308,14 @@ void BrowserViewRenderer::ReturnResourceFromParent(
CompositorFrameConsumer* compositor_frame_consumer) {
CompositorFrameConsumer::ReturnedResourcesMap returned_resource_map;
compositor_frame_consumer->SwapReturnedResourcesOnUI(&returned_resource_map);
- for (auto iterator = returned_resource_map.begin();
- iterator != returned_resource_map.end(); iterator++) {
- uint32_t compositor_id = iterator->first;
+ for (auto& pair : returned_resource_map) {
+ CompositorID compositor_id = pair.first;
content::SynchronousCompositor* compositor = compositor_map_[compositor_id];
cc::CompositorFrameAck frame_ack;
- frame_ack.resources.swap(iterator->second.resources);
+ frame_ack.resources.swap(pair.second.resources);
if (compositor && !frame_ack.resources.empty()) {
- compositor->ReturnResources(iterator->second.output_surface_id,
- frame_ack);
+ compositor->ReturnResources(pair.second.output_surface_id, frame_ack);
}
}
}
@@ -467,54 +469,67 @@ gfx::Rect BrowserViewRenderer::GetScreenRect() const {
return gfx::Rect(client_->GetLocationOnScreen(), size_);
}
-uint32_t BrowserViewRenderer::GetCompositorID(
- content::SynchronousCompositor* compositor) {
- for (auto iterator = compositor_map_.begin();
- iterator != compositor_map_.end(); iterator++) {
- if (iterator->second == compositor) {
- return iterator->first;
- }
- }
-
- DCHECK(false);
- // Return an invalid ID (0), because ID starts with 1.
- return 0;
-}
-
void BrowserViewRenderer::DidInitializeCompositor(
- content::SynchronousCompositor* compositor) {
+ content::SynchronousCompositor* compositor,
+ int process_id,
+ int routing_id) {
TRACE_EVENT_INSTANT0("android_webview",
"BrowserViewRenderer::DidInitializeCompositor",
TRACE_EVENT_SCOPE_THREAD);
DCHECK(compositor);
- // This happens when id overflows to 0, unlikely in practice.
- if (next_compositor_id_ == 0)
- ++next_compositor_id_;
+ CompositorID compositor_id(process_id, routing_id);
+ // This assumes that a RenderViewHost has at most 1 synchronous compositor
+ // througout its lifetime.
+ DCHECK(compositor_map_.count(compositor_id) == 0);
+ compositor_map_[compositor_id] = compositor;
- DCHECK(compositor_map_.find(next_compositor_id_) == compositor_map_.end());
- compositor_map_[next_compositor_id_] = compositor;
- next_compositor_id_++;
+ // At this point, the RVHChanged event for the new RVH that contains the
+ // |compositor| might have been fired already, in which case just set the
+ // current compositor with the new compositor.
+ if (!compositor_ && compositor_id == compositor_id_)
+ compositor_ = compositor;
}
void BrowserViewRenderer::DidDestroyCompositor(
- content::SynchronousCompositor* compositor) {
+ content::SynchronousCompositor* compositor,
+ int process_id,
+ int routing_id) {
TRACE_EVENT_INSTANT0("android_webview",
"BrowserViewRenderer::DidDestroyCompositor",
TRACE_EVENT_SCOPE_THREAD);
- DCHECK(compositor_);
- if (compositor_ == compositor)
+ CompositorID compositor_id(process_id, routing_id);
+ DCHECK(compositor_map_.count(compositor_id));
+ if (compositor_ == compositor) {
compositor_ = nullptr;
- compositor_map_.erase(GetCompositorID(compositor));
-}
+ compositor_id_ = CompositorID();
boliu 2016/06/13 15:30:44 hmm, would this be more consistent that only OnRVC
hush (inactive) 2016/06/14 23:48:28 removed
+ }
-void BrowserViewRenderer::DidBecomeCurrent(
- content::SynchronousCompositor* compositor) {
- TRACE_EVENT_INSTANT0("android_webview",
- "BrowserViewRenderer::DidBecomeCurrent",
- TRACE_EVENT_SCOPE_THREAD);
- DCHECK(compositor);
- DCHECK(GetCompositorID(compositor));
- compositor_ = compositor;
+ compositor_map_.erase(compositor_id);
+}
+
+void BrowserViewRenderer::RenderViewHostChanged(
+ content::RenderViewHost* old_host,
+ content::RenderViewHost* new_host) {
+ DCHECK(new_host);
+
+ int process_id = new_host->GetProcess()->GetID();
+ int routing_id = new_host->GetRoutingID();
+ CompositorID compositor_id(process_id, routing_id);
+ // At this point, the current RVH may or may not contain a compositor. So
+ // compositor_ may be nullptr, in which case DidInitializeCompositor()
+ // callback is time when the new compositor is constructed.
+ if (compositor_map_.count(compositor_id)) {
+ compositor_ = compositor_map_[compositor_id];
+ compositor_id_ = compositor_id;
+ // Now transfer states to the new compositor, like memory policy and root
+ // layer scroll offset.
+ UpdateMemoryPolicy();
boliu 2016/06/13 15:30:44 if these two lines are new, then can we add these
hush (inactive) 2016/06/14 23:48:28 sure.
+ compositor_->DidChangeRootLayerScrollOffset(
+ gfx::ScrollOffset(scroll_offset_dip_));
+ } else {
+ compositor_ = nullptr;
boliu 2016/06/13 15:30:44 ditto about "compositor_id_ always point to active
hush (inactive) 2016/06/14 23:48:28 let's discuss in person on this one....
+ compositor_id_ = compositor_id;
+ }
}
void BrowserViewRenderer::SetDipScale(float dip_scale) {

Powered by Google App Engine
This is Rietveld 408576698