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

Side by Side Diff: Source/web/WebViewImpl.cpp

Issue 302993003: Route selection bounds updates through WebLayerTreeView (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Attach to proper scrolling layer Created 6 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 #include "core/page/InjectedStyleSheets.h" 72 #include "core/page/InjectedStyleSheets.h"
73 #include "core/page/Page.h" 73 #include "core/page/Page.h"
74 #include "core/page/PagePopupClient.h" 74 #include "core/page/PagePopupClient.h"
75 #include "core/page/PointerLockController.h" 75 #include "core/page/PointerLockController.h"
76 #include "core/page/ScopedPageLoadDeferrer.h" 76 #include "core/page/ScopedPageLoadDeferrer.h"
77 #include "core/page/TouchDisambiguation.h" 77 #include "core/page/TouchDisambiguation.h"
78 #include "core/rendering/FastTextAutosizer.h" 78 #include "core/rendering/FastTextAutosizer.h"
79 #include "core/rendering/RenderView.h" 79 #include "core/rendering/RenderView.h"
80 #include "core/rendering/RenderWidget.h" 80 #include "core/rendering/RenderWidget.h"
81 #include "core/rendering/TextAutosizer.h" 81 #include "core/rendering/TextAutosizer.h"
82 #include "core/rendering/compositing/CompositedLayerMapping.h"
82 #include "core/rendering/compositing/RenderLayerCompositor.h" 83 #include "core/rendering/compositing/RenderLayerCompositor.h"
83 #include "modules/device_orientation/DeviceOrientationInspectorAgent.h" 84 #include "modules/device_orientation/DeviceOrientationInspectorAgent.h"
84 #include "modules/encryptedmedia/MediaKeysController.h" 85 #include "modules/encryptedmedia/MediaKeysController.h"
85 #include "modules/indexeddb/InspectorIndexedDBAgent.h" 86 #include "modules/indexeddb/InspectorIndexedDBAgent.h"
86 #include "modules/push_messaging/PushController.h" 87 #include "modules/push_messaging/PushController.h"
87 #include "modules/screen_orientation/ScreenOrientationController.h" 88 #include "modules/screen_orientation/ScreenOrientationController.h"
88 #include "platform/ContextMenu.h" 89 #include "platform/ContextMenu.h"
89 #include "platform/ContextMenuItem.h" 90 #include "platform/ContextMenuItem.h"
90 #include "platform/Cursor.h" 91 #include "platform/Cursor.h"
91 #include "platform/KeyboardCodes.h" 92 #include "platform/KeyboardCodes.h"
(...skipping 24 matching lines...) Expand all
116 #include "public/web/WebActiveWheelFlingParameters.h" 117 #include "public/web/WebActiveWheelFlingParameters.h"
117 #include "public/web/WebAutofillClient.h" 118 #include "public/web/WebAutofillClient.h"
118 #include "public/web/WebFrameClient.h" 119 #include "public/web/WebFrameClient.h"
119 #include "public/web/WebHitTestResult.h" 120 #include "public/web/WebHitTestResult.h"
120 #include "public/web/WebInputElement.h" 121 #include "public/web/WebInputElement.h"
121 #include "public/web/WebMediaPlayerAction.h" 122 #include "public/web/WebMediaPlayerAction.h"
122 #include "public/web/WebNode.h" 123 #include "public/web/WebNode.h"
123 #include "public/web/WebPlugin.h" 124 #include "public/web/WebPlugin.h"
124 #include "public/web/WebPluginAction.h" 125 #include "public/web/WebPluginAction.h"
125 #include "public/web/WebRange.h" 126 #include "public/web/WebRange.h"
127 #include "public/web/WebSelection.h"
126 #include "public/web/WebTextInputInfo.h" 128 #include "public/web/WebTextInputInfo.h"
127 #include "public/web/WebViewClient.h" 129 #include "public/web/WebViewClient.h"
128 #include "public/web/WebWindowFeatures.h" 130 #include "public/web/WebWindowFeatures.h"
129 #include "web/CompositionUnderlineVectorBuilder.h" 131 #include "web/CompositionUnderlineVectorBuilder.h"
130 #include "web/ContextFeaturesClientImpl.h" 132 #include "web/ContextFeaturesClientImpl.h"
131 #include "web/DatabaseClientImpl.h" 133 #include "web/DatabaseClientImpl.h"
132 #include "web/FullscreenController.h" 134 #include "web/FullscreenController.h"
133 #include "web/GraphicsLayerFactoryChromium.h" 135 #include "web/GraphicsLayerFactoryChromium.h"
134 #include "web/LinkHighlight.h" 136 #include "web/LinkHighlight.h"
135 #include "web/LocalFileSystemClient.h" 137 #include "web/LocalFileSystemClient.h"
(...skipping 1579 matching lines...) Expand 10 before | Expand all | Expand 10 after
1715 } 1717 }
1716 1718
1717 void WebViewImpl::layout() 1719 void WebViewImpl::layout()
1718 { 1720 {
1719 TRACE_EVENT0("webkit", "WebViewImpl::layout"); 1721 TRACE_EVENT0("webkit", "WebViewImpl::layout");
1720 PageWidgetDelegate::layout(m_page.get()); 1722 PageWidgetDelegate::layout(m_page.get());
1721 updateLayerTreeBackgroundColor(); 1723 updateLayerTreeBackgroundColor();
1722 1724
1723 for (size_t i = 0; i < m_linkHighlights.size(); ++i) 1725 for (size_t i = 0; i < m_linkHighlights.size(); ++i)
1724 m_linkHighlights[i]->updateGeometry(); 1726 m_linkHighlights[i]->updateGeometry();
1727
1728 updateLayerTreeSelection();
1725 } 1729 }
1726 1730
1727 void WebViewImpl::paint(WebCanvas* canvas, const WebRect& rect) 1731 void WebViewImpl::paint(WebCanvas* canvas, const WebRect& rect)
1728 { 1732 {
1729 // This should only be used when compositing is not being used for this 1733 // This should only be used when compositing is not being used for this
1730 // WebView, and it is painting into the recording of its parent. 1734 // WebView, and it is painting into the recording of its parent.
1731 ASSERT(!isAcceleratedCompositingActive()); 1735 ASSERT(!isAcceleratedCompositingActive());
1732 1736
1733 double paintStart = currentTime(); 1737 double paintStart = currentTime();
1734 PageWidgetDelegate::paint(m_page.get(), pageOverlays(), canvas, rect, isTran sparent() ? PageWidgetDelegate::Translucent : PageWidgetDelegate::Opaque); 1738 PageWidgetDelegate::paint(m_page.get(), pageOverlays(), canvas, rect, isTran sparent() ? PageWidgetDelegate::Translucent : PageWidgetDelegate::Opaque);
(...skipping 2265 matching lines...) Expand 10 before | Expand all | Expand 10 after
4000 m_rootTransformLayer = m_page->mainFrame()->view()->renderView()->compos itor()->ensureRootTransformLayer(); 4004 m_rootTransformLayer = m_page->mainFrame()->view()->renderView()->compos itor()->ensureRootTransformLayer();
4001 4005
4002 if (m_rootTransformLayer) { 4006 if (m_rootTransformLayer) {
4003 WebCore::TransformationMatrix transform; 4007 WebCore::TransformationMatrix transform;
4004 transform.translate(m_rootLayerOffset.width, m_rootLayerOffset.height); 4008 transform.translate(m_rootLayerOffset.width, m_rootLayerOffset.height);
4005 transform = transform.scale(m_rootLayerScale); 4009 transform = transform.scale(m_rootLayerScale);
4006 m_rootTransformLayer->setTransform(transform); 4010 m_rootTransformLayer->setTransform(transform);
4007 } 4011 }
4008 } 4012 }
4009 4013
4014 static FloatPoint convertTargetPointToCompositedLayerPoint(IntPoint point, Rende rObject* targetRenderer, RenderObject* compositedRenderer)
4015 {
4016 point = targetRenderer->frame()->view()->contentsToWindow(point);
4017 point = compositedRenderer->frame()->view()->windowToContents(point);
4018 return compositedRenderer->absoluteToLocal(point, UseTransforms);
4019 }
4020
4021 static bool computeCompositedLayerAndRect(Node* node, IntRect absoluteRect, int& layerId, WebRect& layerRect)
aelias_OOO_until_Jul13 2014/06/12 06:02:01 Looks very similar to the logic in LinkHighlight.c
jdduke (slow) 2014/06/12 18:03:20 Any suggestions on where to place to put such code
4022 {
4023 if (!node || !node->renderer())
4024 return false;
4025
4026 // Find the nearest enclosing composited layer and attach to it. We may need to cross frame boundaries
4027 // to find a suitable layer.
4028 RenderObject* renderer = node->renderer();
4029 RenderLayer* renderLayer;
4030 do {
4031 renderLayer = renderer->enclosingLayer()->enclosingCompositingLayerForRe paint();
4032 if (!renderLayer) {
4033 renderer = renderer->frame()->ownerRenderer();
4034 if (!renderer)
4035 return false;
4036 }
4037 } while (!renderLayer);
4038
4039 CompositedLayerMappingPtr compositedLayerMapping = renderLayer->compositingS tate() == PaintsIntoGroupedBacking ? renderLayer->groupedMapping() : renderLayer ->compositedLayerMapping();
4040 GraphicsLayer* graphicsLayer = renderLayer->compositingState() == PaintsInto GroupedBacking ? compositedLayerMapping->squashingLayer() : compositedLayerMappi ng->mainGraphicsLayer();
4041
4042 if (!graphicsLayer->drawsContent()) {
4043 if (renderLayer->scrollableArea() && renderLayer->scrollableArea()->uses CompositedScrolling()) {
4044 ASSERT(renderLayer->hasCompositedLayerMapping() && renderLayer->comp ositedLayerMapping()->scrollingContentsLayer());
4045 graphicsLayer = compositedLayerMapping->scrollingContentsLayer();
4046 }
4047 }
4048
4049 layerId = graphicsLayer->platformLayer()->id();
4050
4051 absoluteRect.move(-graphicsLayer->offsetFromRenderer());
4052
4053 FloatQuad layerQuad;
4054 layerQuad.setP1(convertTargetPointToCompositedLayerPoint(absoluteRect.minXMi nYCorner(), node->renderer(), renderLayer->renderer()));
4055 layerQuad.setP2(convertTargetPointToCompositedLayerPoint(absoluteRect.maxXMi nYCorner(), node->renderer(), renderLayer->renderer()));
4056 layerQuad.setP3(convertTargetPointToCompositedLayerPoint(absoluteRect.maxXMa xYCorner(), node->renderer(), renderLayer->renderer()));
4057 layerQuad.setP4(convertTargetPointToCompositedLayerPoint(absoluteRect.minXMa xYCorner(), node->renderer(), renderLayer->renderer()));
4058 layerRect = layerQuad.enclosingBoundingBox();
4059
4060 return true;
4061 }
4062
4063 void WebViewImpl::updateLayerTreeSelection()
4064 {
4065 if (!m_layerTreeView || !settings()->compositedSelectionUpdatesEnabled())
4066 return;
4067
4068 const LocalFrame* frame = toLocalFrame(focusedWebCoreFrame());
4069 if (!frame || !frame->selection().isCaretOrRange())
4070 return m_layerTreeView->clearSelection();
4071
4072 FrameSelection& selection = frame->selection();
4073
4074 // TODO(jdduke): Cache selection and compare?
4075 if (selection.isCaret()) {
4076 WebSelection webSelection;
4077 if (!computeCompositedLayerAndRect(selection.rootEditableElementOrDocume ntElement(),
4078 selection.absoluteCaretBounds(),
4079 webSelection.anchorLayerId,
4080 webSelection.anchorRectInLayer)) {
4081 return m_layerTreeView->clearSelection();
4082 }
4083
4084 // TODO(jdduke): Populate editable bounds.
4085 webSelection.type = WebSelection::TypeInsertion;
4086 m_layerTreeView->registerSelection(webSelection);
4087 return;
4088 }
4089
4090 RefPtrWillBeRawPtr<Range> selectedRange = selection.toNormalizedRange();
4091 if (!selectedRange)
4092 return m_layerTreeView->clearSelection();
4093
4094 WebSelection webSelection;
4095
4096 RefPtrWillBeRawPtr<Range> range(Range::create(selectedRange->startContainer( )->document(),
4097 selectedRange->startContainer(),
4098 selectedRange->startOffset(),
4099 selectedRange->startContainer(),
4100 selectedRange->startOffset()));
4101 IntRect anchor = frame->editor().firstRectForRange(range.get());
4102 if (!computeCompositedLayerAndRect(selection.start().anchorNode(),
4103 anchor,
4104 webSelection.anchorLayerId,
4105 webSelection.anchorRectInLayer)) {
4106 return m_layerTreeView->clearSelection();
4107 }
4108
4109 range = Range::create(selectedRange->endContainer()->document(),
4110 selectedRange->endContainer(),
4111 selectedRange->endOffset(),
4112 selectedRange->endContainer(),
4113 selectedRange->endOffset());
4114 IntRect focus = frame->editor().firstRectForRange(range.get());
4115 if (!computeCompositedLayerAndRect(selection.end().anchorNode(),
4116 focus,
4117 webSelection.focusLayerId,
4118 webSelection.focusRectInLayer)) {
4119 return m_layerTreeView->clearSelection();
4120 }
4121
4122 // TODO(jdduke): Populate editable bounds.
4123 webSelection.type = WebSelection::TypeSelection;
4124 webSelection.anchorDirection = selection.start().primaryDirection() == RTL ? WebTextDirectionRightToLeft : WebTextDirectionLeftToRight;
4125 webSelection.focusDirection = selection.end().primaryDirection() == RTL ? We bTextDirectionRightToLeft : WebTextDirectionLeftToRight;
4126 webSelection.anchorIsFirst = selection.selection().isBaseFirst();
4127 m_layerTreeView->registerSelection(webSelection);
4128 }
4129
4010 bool WebViewImpl::detectContentOnTouch(const WebPoint& position) 4130 bool WebViewImpl::detectContentOnTouch(const WebPoint& position)
4011 { 4131 {
4012 HitTestResult touchHit = hitTestResultForWindowPos(position); 4132 HitTestResult touchHit = hitTestResultForWindowPos(position);
4013 4133
4014 if (touchHit.isContentEditable()) 4134 if (touchHit.isContentEditable())
4015 return false; 4135 return false;
4016 4136
4017 Node* node = touchHit.innerNode(); 4137 Node* node = touchHit.innerNode();
4018 if (!node || !node->isTextNode()) 4138 if (!node || !node->isTextNode())
4019 return false; 4139 return false;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
4101 const PageScaleConstraints& constraints = m_pageScaleConstraintsSet.pageDefi nedConstraints(); 4221 const PageScaleConstraints& constraints = m_pageScaleConstraintsSet.pageDefi nedConstraints();
4102 4222
4103 if (!mainFrameImpl() || !mainFrameImpl()->frameView()) 4223 if (!mainFrameImpl() || !mainFrameImpl()->frameView())
4104 return false; 4224 return false;
4105 4225
4106 return mainFrameImpl()->frameView()->layoutSize().width() == m_size.width 4226 return mainFrameImpl()->frameView()->layoutSize().width() == m_size.width
4107 || (constraints.minimumScale == constraints.maximumScale && constraints. minimumScale != -1); 4227 || (constraints.minimumScale == constraints.maximumScale && constraints. minimumScale != -1);
4108 } 4228 }
4109 4229
4110 } // namespace blink 4230 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698