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

Unified Diff: content/renderer/gpu/render_widget_compositor.cc

Issue 300323005: Route selection bounds updates through the compositor (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updates Created 6 years, 7 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: content/renderer/gpu/render_widget_compositor.cc
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc
index eac6a28184f6aba654619f5270cb5cb9b174128d..d642b31a7ac9709e202ec41c6a1253335cecd017 100644
--- a/content/renderer/gpu/render_widget_compositor.cc
+++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -25,6 +25,7 @@
#include "cc/layers/layer.h"
#include "cc/output/copy_output_request.h"
#include "cc/output/copy_output_result.h"
+#include "cc/output/selection_handle.h"
#include "cc/resources/single_release_callback.h"
#include "cc/trees/layer_tree_host.h"
#include "content/child/child_shared_bitmap_manager.h"
@@ -36,6 +37,7 @@
#include "gpu/command_buffer/client/gles2_interface.h"
#include "third_party/WebKit/public/platform/WebCompositeAndReadbackAsyncCallback.h"
#include "third_party/WebKit/public/platform/WebSize.h"
+#include "third_party/WebKit/public/web/WebSelection.h"
#include "third_party/WebKit/public/web/WebWidget.h"
#include "ui/gfx/frame_time.h"
#include "ui/gl/gl_switches.h"
@@ -51,6 +53,7 @@ class Layer;
}
using blink::WebFloatPoint;
+using blink::WebSelection;
using blink::WebSize;
using blink::WebRect;
@@ -76,6 +79,46 @@ bool GetSwitchValueAsInt(
}
}
+bool ConvertWebSelection(const WebSelection& selection,
+ cc::Layer** start_layer,
+ cc::SelectionHandle* start_handle,
+ cc::Layer** end_layer,
+ cc::SelectionHandle* end_handle) {
+ DCHECK(start_layer);
+ DCHECK(end_layer);
+ if (selection.type == WebSelection::TypeNone)
+ return false;
+
+ if (!selection.anchorLayer)
+ return false;
+
+ if (selection.type == WebSelection::TypeInsertion) {
+ *start_layer = static_cast<const webkit::WebLayerImpl*>(
+ selection.anchorLayer)->layer();
+ start_handle->type = cc::SelectionHandle::CENTER;
+ start_handle->bounds = gfx::Rect(selection.anchorRectInLayer);
+ return true;
+ }
+
+ if (!selection.focusLayer)
+ return false;
+
+ *start_layer =
+ static_cast<const webkit::WebLayerImpl*>(selection.anchorLayer)->layer();
+ *end_layer =
+ static_cast<const webkit::WebLayerImpl*>(selection.focusLayer)->layer();
+
+ // TODO(jdduke): Use text direction (selection.startDirection) and
+ // anchorIsFirst to properly orient.
+ start_handle->type = cc::SelectionHandle::LEFT;
+ end_handle->type = cc::SelectionHandle::RIGHT;
+
+ start_handle->bounds = gfx::Rect(selection.anchorRectInLayer);
+ end_handle->bounds = gfx::Rect(selection.focusRectInLayer);
+
+ return true;
+}
+
} // namespace
// static
@@ -324,6 +367,7 @@ RenderWidgetCompositor::RenderWidgetCompositor(RenderWidget* widget,
bool threaded)
: threaded_(threaded),
suppress_schedule_composite_(false),
+ suppress_selection_updates_(false),
widget_(widget) {
}
@@ -426,6 +470,22 @@ bool RenderWidgetCompositor::SendMessageToMicroBenchmark(
return layer_tree_host_->SendMessageToMicroBenchmark(id, value.Pass());
}
+void RenderWidgetCompositor::SetIgnoreSelectionUpdates(bool ignore_selection) {
+ if (suppress_selection_updates_ == ignore_selection)
+ return;
+
+ if (!suppress_selection_updates_) {
+ cc::SelectionHandle ignored_selection;
+ ignored_selection.type = cc::SelectionHandle::IGNORED;
+ layer_tree_host_->RegisterSelection(scoped_refptr<cc::Layer>(),
+ ignored_selection,
+ scoped_refptr<cc::Layer>(),
+ ignored_selection);
+ }
+
+ suppress_selection_updates_ = ignore_selection;
+}
+
void RenderWidgetCompositor::Initialize(cc::LayerTreeSettings settings) {
scoped_refptr<base::MessageLoopProxy> compositor_message_loop_proxy;
RenderThreadImpl* render_thread = RenderThreadImpl::current();
@@ -571,6 +631,37 @@ void RenderWidgetCompositor::clearViewportLayers() {
scoped_refptr<cc::Layer>());
}
+void RenderWidgetCompositor::registerSelection(
+ const blink::WebSelection& selection) {
+ if (suppress_selection_updates_)
+ return;
+
+ cc::Layer* start_layer = NULL;
+ cc::SelectionHandle start_handle;
+ cc::Layer* end_layer = NULL;
+ cc::SelectionHandle end_handle;
+ if (!ConvertWebSelection(
+ selection, &start_layer, &start_handle, &end_layer, &end_handle)) {
+ clearSelection();
+ return;
+ }
+
+ layer_tree_host_->RegisterSelection(
+ start_layer, start_handle, end_layer, end_handle);
+}
+
+void RenderWidgetCompositor::clearSelection() {
+ if (suppress_selection_updates_)
+ return;
+
+ cc::SelectionHandle empty_handle;
+ empty_handle.type = cc::SelectionHandle::NONE;
+ layer_tree_host_->RegisterSelection(scoped_refptr<cc::Layer>(),
+ empty_handle,
+ scoped_refptr<cc::Layer>(),
+ empty_handle);
+}
+
void CompositeAndReadbackAsyncCallback(
blink::WebCompositeAndReadbackAsyncCallback* callback,
scoped_ptr<cc::CopyOutputResult> result) {

Powered by Google App Engine
This is Rietveld 408576698