OLD | NEW |
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 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 ASSERT(!m_pagePopup); | 523 ASSERT(!m_pagePopup); |
524 } | 524 } |
525 | 525 |
526 m_lastMouseDownPoint = WebPoint(event.x, event.y); | 526 m_lastMouseDownPoint = WebPoint(event.x, event.y); |
527 | 527 |
528 // Take capture on a mouse down on a plugin so we can send it mouse events. | 528 // Take capture on a mouse down on a plugin so we can send it mouse events. |
529 // If the hit node is a plugin but a scrollbar is over it don't start mouse | 529 // If the hit node is a plugin but a scrollbar is over it don't start mouse |
530 // capture because it will interfere with the scrollbar receiving events. | 530 // capture because it will interfere with the scrollbar receiving events. |
531 IntPoint point(event.x, event.y); | 531 IntPoint point(event.x, event.y); |
532 if (event.button == WebMouseEvent::ButtonLeft && m_page->mainFrame()->isLoca
lFrame()) { | 532 if (event.button == WebMouseEvent::ButtonLeft && m_page->mainFrame()->isLoca
lFrame()) { |
533 point = m_page->deprecatedLocalMainFrame()->view()->windowToContents(poi
nt); | 533 point = m_page->deprecatedLocalMainFrame()->view()->rootFrameToContents(
point); |
534 HitTestResult result(m_page->deprecatedLocalMainFrame()->eventHandler().
hitTestResultAtPoint(point)); | 534 HitTestResult result(m_page->deprecatedLocalMainFrame()->eventHandler().
hitTestResultAtPoint(point)); |
535 result.setToShadowHostIfInClosedShadowRoot(); | 535 result.setToShadowHostIfInClosedShadowRoot(); |
536 Node* hitNode = result.innerNonSharedNode(); | 536 Node* hitNode = result.innerNonSharedNode(); |
537 | 537 |
538 if (!result.scrollbar() && hitNode && hitNode->renderer() && hitNode->re
nderer()->isEmbeddedObject()) { | 538 if (!result.scrollbar() && hitNode && hitNode->renderer() && hitNode->re
nderer()->isEmbeddedObject()) { |
539 m_mouseCaptureNode = hitNode; | 539 m_mouseCaptureNode = hitNode; |
540 TRACE_EVENT_ASYNC_BEGIN0("input", "capturing mouse", this); | 540 TRACE_EVENT_ASYNC_BEGIN0("input", "capturing mouse", this); |
541 } | 541 } |
542 } | 542 } |
543 | 543 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
585 void WebViewImpl::mouseContextMenu(const WebMouseEvent& event) | 585 void WebViewImpl::mouseContextMenu(const WebMouseEvent& event) |
586 { | 586 { |
587 if (!mainFrameImpl() || !mainFrameImpl()->frameView()) | 587 if (!mainFrameImpl() || !mainFrameImpl()->frameView()) |
588 return; | 588 return; |
589 | 589 |
590 m_page->contextMenuController().clearContextMenu(); | 590 m_page->contextMenuController().clearContextMenu(); |
591 | 591 |
592 PlatformMouseEventBuilder pme(mainFrameImpl()->frameView(), event); | 592 PlatformMouseEventBuilder pme(mainFrameImpl()->frameView(), event); |
593 | 593 |
594 // Find the right target frame. See issue 1186900. | 594 // Find the right target frame. See issue 1186900. |
595 HitTestResult result = hitTestResultForWindowPos(pme.position()); | 595 HitTestResult result = hitTestResultForRootFramePos(pme.position()); |
596 Frame* targetFrame; | 596 Frame* targetFrame; |
597 if (result.innerNonSharedNode()) | 597 if (result.innerNonSharedNode()) |
598 targetFrame = result.innerNonSharedNode()->document().frame(); | 598 targetFrame = result.innerNonSharedNode()->document().frame(); |
599 else | 599 else |
600 targetFrame = m_page->focusController().focusedOrMainFrame(); | 600 targetFrame = m_page->focusController().focusedOrMainFrame(); |
601 | 601 |
602 if (!targetFrame->isLocalFrame()) | 602 if (!targetFrame->isLocalFrame()) |
603 return; | 603 return; |
604 | 604 |
605 LocalFrame* targetLocalFrame = toLocalFrame(targetFrame); | 605 LocalFrame* targetLocalFrame = toLocalFrame(targetFrame); |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
776 RefPtrWillBeRawPtr<PopupContainer> selectPopup = nullptr; | 776 RefPtrWillBeRawPtr<PopupContainer> selectPopup = nullptr; |
777 selectPopup = m_selectPopup; | 777 selectPopup = m_selectPopup; |
778 hideSelectPopup(); | 778 hideSelectPopup(); |
779 ASSERT(!m_selectPopup); | 779 ASSERT(!m_selectPopup); |
780 | 780 |
781 // Don't trigger a disambiguation popup on sites designed for mobile dev
ices. | 781 // Don't trigger a disambiguation popup on sites designed for mobile dev
ices. |
782 // Instead, assume that the page has been designed with big enough butto
ns and links. | 782 // Instead, assume that the page has been designed with big enough butto
ns and links. |
783 // Don't trigger a disambiguation popup when screencasting, since it's i
mplemented outside of | 783 // Don't trigger a disambiguation popup when screencasting, since it's i
mplemented outside of |
784 // compositor pipeline and is not being screencasted itself. This leads
to bad user experience. | 784 // compositor pipeline and is not being screencasted itself. This leads
to bad user experience. |
785 if (event.data.tap.width > 0 && !shouldDisableDesktopWorkarounds() && !p
age()->inspectorController().screencastEnabled()) { | 785 if (event.data.tap.width > 0 && !shouldDisableDesktopWorkarounds() && !p
age()->inspectorController().screencastEnabled()) { |
786 WebGestureEvent scaledEvent = event; | 786 IntRect boundingBox(page()->frameHost().pinchViewport().viewportToRo
otFrame(IntRect( |
787 scaledEvent.x = event.x / pageScaleFactor(); | 787 event.x - event.data.tap.width / 2, |
788 scaledEvent.y = event.y / pageScaleFactor(); | 788 event.y - event.data.tap.height / 2, |
789 scaledEvent.data.tap.width = event.data.tap.width / pageScaleFactor(
); | 789 event.data.tap.width, |
790 scaledEvent.data.tap.height = event.data.tap.height / pageScaleFacto
r(); | 790 event.data.tap.height))); |
791 IntRect boundingBox( | |
792 scaledEvent.x - scaledEvent.data.tap.width / 2, | |
793 scaledEvent.y - scaledEvent.data.tap.height / 2, | |
794 scaledEvent.data.tap.width, | |
795 scaledEvent.data.tap.height); | |
796 | 791 |
797 WebSize pinchViewportOffset = pinchVirtualViewportEnabled() ? | 792 // FIXME: We shouldn't pass details of the PinchViewport offset to r
ender_view_impl. |
798 flooredIntSize(page()->frameHost().pinchViewport().location()) :
IntSize(); | 793 WebSize pinchViewportOffset = flooredIntSize(page()->frameHost().pin
chViewport().location()); |
799 | |
800 // Keep bounding box relative to the main frame. | |
801 boundingBox.move(pinchViewportOffset); | |
802 | 794 |
803 Vector<IntRect> goodTargets; | 795 Vector<IntRect> goodTargets; |
804 WillBeHeapVector<RawPtrWillBeMember<Node>> highlightNodes; | 796 WillBeHeapVector<RawPtrWillBeMember<Node>> highlightNodes; |
805 findGoodTouchTargets(boundingBox, mainFrameImpl()->frame(), goodTarg
ets, highlightNodes); | 797 findGoodTouchTargets(boundingBox, mainFrameImpl()->frame(), goodTarg
ets, highlightNodes); |
806 // FIXME: replace touch adjustment code when numberOfGoodTargets ==
1? | 798 // FIXME: replace touch adjustment code when numberOfGoodTargets ==
1? |
807 // Single candidate case is currently handled by: https://bugs.webki
t.org/show_bug.cgi?id=85101 | 799 // Single candidate case is currently handled by: https://bugs.webki
t.org/show_bug.cgi?id=85101 |
808 if (goodTargets.size() >= 2 && m_client | 800 if (goodTargets.size() >= 2 && m_client |
809 && m_client->didTapMultipleTargets(pinchViewportOffset, bounding
Box, goodTargets)) { | 801 && m_client->didTapMultipleTargets(pinchViewportOffset, bounding
Box, goodTargets)) { |
810 | 802 |
811 enableTapHighlights(highlightNodes); | 803 enableTapHighlights(highlightNodes); |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1119 // events. | 1111 // events. |
1120 if (evt.isSystemKey()) | 1112 if (evt.isSystemKey()) |
1121 return false; | 1113 return false; |
1122 | 1114 |
1123 if (!suppress && !handler.keyEvent(evt)) | 1115 if (!suppress && !handler.keyEvent(evt)) |
1124 return keyEventDefault(event); | 1116 return keyEventDefault(event); |
1125 | 1117 |
1126 return true; | 1118 return true; |
1127 } | 1119 } |
1128 | 1120 |
1129 WebRect WebViewImpl::computeBlockBound(const WebPoint& webPoint, bool ignoreClip
ping) | 1121 WebRect WebViewImpl::computeBlockBound(const WebPoint& pointInRootFrame, bool ig
noreClipping) |
1130 { | 1122 { |
1131 if (!mainFrameImpl()) | 1123 if (!mainFrameImpl()) |
1132 return WebRect(); | 1124 return WebRect(); |
1133 | 1125 |
1134 // Use the point-based hit test to find the node. | 1126 // Use the point-based hit test to find the node. |
1135 IntPoint point = mainFrameImpl()->frameView()->windowToContents(IntPoint(web
Point.x, webPoint.y)); | 1127 IntPoint point = mainFrameImpl()->frameView()->rootFrameToContents(IntPoint(
pointInRootFrame.x, pointInRootFrame.y)); |
1136 HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | HitT
estRequest::Active | (ignoreClipping ? HitTestRequest::IgnoreClipping : 0); | 1128 HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | HitT
estRequest::Active | (ignoreClipping ? HitTestRequest::IgnoreClipping : 0); |
1137 HitTestResult result = mainFrameImpl()->frame()->eventHandler().hitTestResul
tAtPoint(point, hitType); | 1129 HitTestResult result = mainFrameImpl()->frame()->eventHandler().hitTestResul
tAtPoint(point, hitType); |
1138 result.setToShadowHostIfInClosedShadowRoot(); | 1130 result.setToShadowHostIfInClosedShadowRoot(); |
1139 | 1131 |
1140 Node* node = result.innerNonSharedNode(); | 1132 Node* node = result.innerNonSharedNode(); |
1141 if (!node) | 1133 if (!node) |
1142 return WebRect(); | 1134 return WebRect(); |
1143 | 1135 |
1144 // Find the block type node based on the hit node. | 1136 // Find the block type node based on the hit node. |
1145 // FIXME: This wants to walk composed tree with NodeRenderingTraversal::pare
nt(). | 1137 // FIXME: This wants to walk composed tree with NodeRenderingTraversal::pare
nt(). |
1146 while (node && (!node->renderer() || node->renderer()->isInline())) | 1138 while (node && (!node->renderer() || node->renderer()->isInline())) |
1147 node = NodeRenderingTraversal::parent(*node); | 1139 node = NodeRenderingTraversal::parent(*node); |
1148 | 1140 |
1149 // Return the bounding box in the window coordinate system. | 1141 // Return the bounding box in the root frame's coordinate space. |
1150 if (node) { | 1142 if (node) { |
1151 IntRect rect = node->Node::pixelSnappedBoundingBox(); | 1143 IntRect pointInRootFrame = node->Node::pixelSnappedBoundingBox(); |
1152 LocalFrame* frame = node->document().frame(); | 1144 LocalFrame* frame = node->document().frame(); |
1153 return frame->view()->contentsToWindow(rect); | 1145 return frame->view()->contentsToRootFrame(pointInRootFrame); |
1154 } | 1146 } |
1155 return WebRect(); | 1147 return WebRect(); |
1156 } | 1148 } |
1157 | 1149 |
1158 WebRect WebViewImpl::widenRectWithinPageBounds(const WebRect& source, int target
Margin, int minimumMargin) | 1150 WebRect WebViewImpl::widenRectWithinPageBounds(const WebRect& source, int target
Margin, int minimumMargin) |
1159 { | 1151 { |
1160 WebSize maxSize; | 1152 WebSize maxSize; |
1161 if (mainFrame()) | 1153 if (mainFrame()) |
1162 maxSize = mainFrame()->contentsSize(); | 1154 maxSize = mainFrame()->contentsSize(); |
1163 IntSize scrollOffset; | 1155 IntSize scrollOffset; |
(...skipping 27 matching lines...) Expand all Loading... |
1191 { | 1183 { |
1192 // Pages should be as legible as on desktop when at dpi scale, so no | 1184 // Pages should be as legible as on desktop when at dpi scale, so no |
1193 // need to zoom in further when automatically determining zoom level | 1185 // need to zoom in further when automatically determining zoom level |
1194 // (after double tap, find in page, etc), though the user should still | 1186 // (after double tap, find in page, etc), though the user should still |
1195 // be allowed to manually pinch zoom in further if they desire. | 1187 // be allowed to manually pinch zoom in further if they desire. |
1196 if (page()) | 1188 if (page()) |
1197 return m_maximumLegibleScale * page()->settings().accessibilityFontScale
Factor(); | 1189 return m_maximumLegibleScale * page()->settings().accessibilityFontScale
Factor(); |
1198 return m_maximumLegibleScale; | 1190 return m_maximumLegibleScale; |
1199 } | 1191 } |
1200 | 1192 |
1201 void WebViewImpl::computeScaleAndScrollForBlockRect(const WebPoint& hitPoint, co
nst WebRect& blockRect, float padding, float defaultScaleWhenAlreadyLegible, flo
at& scale, WebPoint& scroll) | 1193 void WebViewImpl::computeScaleAndScrollForBlockRect(const WebPoint& hitPointInRo
otFrame, const WebRect& blockRectInRootFrame, float padding, float defaultScaleW
henAlreadyLegible, float& scale, WebPoint& scroll) |
1202 { | 1194 { |
1203 scale = pageScaleFactor(); | 1195 scale = pageScaleFactor(); |
1204 scroll.x = scroll.y = 0; | 1196 scroll.x = scroll.y = 0; |
1205 | 1197 |
1206 WebRect rect = blockRect; | 1198 WebRect rect = blockRectInRootFrame; |
1207 | 1199 |
1208 if (!rect.isEmpty()) { | 1200 if (!rect.isEmpty()) { |
1209 float defaultMargin = doubleTapZoomContentDefaultMargin; | 1201 float defaultMargin = doubleTapZoomContentDefaultMargin; |
1210 float minimumMargin = doubleTapZoomContentMinimumMargin; | 1202 float minimumMargin = doubleTapZoomContentMinimumMargin; |
1211 // We want the margins to have the same physical size, which means we | 1203 // We want the margins to have the same physical size, which means we |
1212 // need to express them in post-scale size. To do that we'd need to know | 1204 // need to express them in post-scale size. To do that we'd need to know |
1213 // the scale we're scaling to, but that depends on the margins. Instead | 1205 // the scale we're scaling to, but that depends on the margins. Instead |
1214 // we express them as a fraction of the target rectangle: this will be | 1206 // we express them as a fraction of the target rectangle: this will be |
1215 // correct if we end up fully zooming to it, and won't matter if we | 1207 // correct if we end up fully zooming to it, and won't matter if we |
1216 // don't. | 1208 // don't. |
(...skipping 18 matching lines...) Expand all Loading... |
1235 float screenWidth = m_size.width / scale; | 1227 float screenWidth = m_size.width / scale; |
1236 float screenHeight = m_size.height / scale; | 1228 float screenHeight = m_size.height / scale; |
1237 | 1229 |
1238 // Scroll to vertically align the block. | 1230 // Scroll to vertically align the block. |
1239 if (rect.height < screenHeight) { | 1231 if (rect.height < screenHeight) { |
1240 // Vertically center short blocks. | 1232 // Vertically center short blocks. |
1241 rect.y -= 0.5 * (screenHeight - rect.height); | 1233 rect.y -= 0.5 * (screenHeight - rect.height); |
1242 } else { | 1234 } else { |
1243 // Ensure position we're zooming to (+ padding) isn't off the bottom of | 1235 // Ensure position we're zooming to (+ padding) isn't off the bottom of |
1244 // the screen. | 1236 // the screen. |
1245 rect.y = std::max<float>(rect.y, hitPoint.y + padding - screenHeight); | 1237 rect.y = std::max<float>(rect.y, hitPointInRootFrame.y + padding - scree
nHeight); |
1246 } // Otherwise top align the block. | 1238 } // Otherwise top align the block. |
1247 | 1239 |
1248 // Do the same thing for horizontal alignment. | 1240 // Do the same thing for horizontal alignment. |
1249 if (rect.width < screenWidth) | 1241 if (rect.width < screenWidth) |
1250 rect.x -= 0.5 * (screenWidth - rect.width); | 1242 rect.x -= 0.5 * (screenWidth - rect.width); |
1251 else | 1243 else |
1252 rect.x = std::max<float>(rect.x, hitPoint.x + padding - screenWidth); | 1244 rect.x = std::max<float>(rect.x, hitPointInRootFrame.x + padding - scree
nWidth); |
1253 scroll.x = rect.x; | 1245 scroll.x = rect.x; |
1254 scroll.y = rect.y; | 1246 scroll.y = rect.y; |
1255 | 1247 |
1256 scale = clampPageScaleFactorToLimits(scale); | 1248 scale = clampPageScaleFactorToLimits(scale); |
1257 scroll = mainFrameImpl()->frameView()->windowToContents(scroll); | 1249 scroll = mainFrameImpl()->frameView()->rootFrameToContents(scroll); |
1258 scroll = clampOffsetAtScale(scroll, scale); | 1250 scroll = clampOffsetAtScale(scroll, scale); |
1259 } | 1251 } |
1260 | 1252 |
1261 static Node* findCursorDefiningAncestor(Node* node, LocalFrame* frame) | 1253 static Node* findCursorDefiningAncestor(Node* node, LocalFrame* frame) |
1262 { | 1254 { |
1263 // Go up the tree to find the node that defines a mouse cursor style | 1255 // Go up the tree to find the node that defines a mouse cursor style |
1264 while (node) { | 1256 while (node) { |
1265 if (node->renderer()) { | 1257 if (node->renderer()) { |
1266 ECursor cursor = node->renderer()->style()->cursor(); | 1258 ECursor cursor = node->renderer()->style()->cursor(); |
1267 if (cursor != CURSOR_AUTO || frame->eventHandler().useHandCursor(nod
e, node->isLink())) | 1259 if (cursor != CURSOR_AUTO || frame->eventHandler().useHandCursor(nod
e, node->isLink())) |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1358 // Safari documentation for -webkit-tap-highlight-color says if the spec
ified color has 0 alpha, | 1350 // Safari documentation for -webkit-tap-highlight-color says if the spec
ified color has 0 alpha, |
1359 // then tap highlighting is disabled. | 1351 // then tap highlighting is disabled. |
1360 // http://developer.apple.com/library/safari/#documentation/appleapplica
tions/reference/safaricssref/articles/standardcssproperties.html | 1352 // http://developer.apple.com/library/safari/#documentation/appleapplica
tions/reference/safaricssref/articles/standardcssproperties.html |
1361 if (!highlightColor.alpha()) | 1353 if (!highlightColor.alpha()) |
1362 continue; | 1354 continue; |
1363 | 1355 |
1364 m_linkHighlights.append(LinkHighlight::create(node, this)); | 1356 m_linkHighlights.append(LinkHighlight::create(node, this)); |
1365 } | 1357 } |
1366 } | 1358 } |
1367 | 1359 |
1368 void WebViewImpl::animateDoubleTapZoom(const IntPoint& point) | 1360 void WebViewImpl::animateDoubleTapZoom(const IntPoint& pointInRootFrame) |
1369 { | 1361 { |
1370 if (!mainFrameImpl()) | 1362 if (!mainFrameImpl()) |
1371 return; | 1363 return; |
1372 | 1364 |
1373 WebRect blockBounds = computeBlockBound(point, false); | 1365 WebRect blockBounds = computeBlockBound(pointInRootFrame, false); |
1374 float scale; | 1366 float scale; |
1375 WebPoint scroll; | 1367 WebPoint scroll; |
1376 | 1368 |
1377 computeScaleAndScrollForBlockRect(point, blockBounds, touchPointPadding, min
imumPageScaleFactor() * doubleTapZoomAlreadyLegibleRatio, scale, scroll); | 1369 computeScaleAndScrollForBlockRect(pointInRootFrame, blockBounds, touchPointP
adding, minimumPageScaleFactor() * doubleTapZoomAlreadyLegibleRatio, scale, scro
ll); |
1378 | 1370 |
1379 bool stillAtPreviousDoubleTapScale = (pageScaleFactor() == m_doubleTapZoomPa
geScaleFactor | 1371 bool stillAtPreviousDoubleTapScale = (pageScaleFactor() == m_doubleTapZoomPa
geScaleFactor |
1380 && m_doubleTapZoomPageScaleFactor != minimumPageScaleFactor()) | 1372 && m_doubleTapZoomPageScaleFactor != minimumPageScaleFactor()) |
1381 || m_doubleTapZoomPending; | 1373 || m_doubleTapZoomPending; |
1382 | 1374 |
1383 bool scaleUnchanged = fabs(pageScaleFactor() - scale) < minScaleDifference; | 1375 bool scaleUnchanged = fabs(pageScaleFactor() - scale) < minScaleDifference; |
1384 bool shouldZoomOut = blockBounds.isEmpty() || scaleUnchanged || stillAtPrevi
ousDoubleTapScale; | 1376 bool shouldZoomOut = blockBounds.isEmpty() || scaleUnchanged || stillAtPrevi
ousDoubleTapScale; |
1385 | 1377 |
1386 bool isAnimating; | 1378 bool isAnimating; |
1387 | 1379 |
1388 if (shouldZoomOut) { | 1380 if (shouldZoomOut) { |
1389 scale = minimumPageScaleFactor(); | 1381 scale = minimumPageScaleFactor(); |
1390 isAnimating = startPageScaleAnimation(mainFrameImpl()->frameView()->wind
owToContents(point), true, scale, doubleTapZoomAnimationDurationInSeconds); | 1382 isAnimating = startPageScaleAnimation(mainFrameImpl()->frameView()->root
FrameToContents(pointInRootFrame), true, scale, doubleTapZoomAnimationDurationIn
Seconds); |
1391 } else { | 1383 } else { |
1392 isAnimating = startPageScaleAnimation(scroll, false, scale, doubleTapZoo
mAnimationDurationInSeconds); | 1384 isAnimating = startPageScaleAnimation(scroll, false, scale, doubleTapZoo
mAnimationDurationInSeconds); |
1393 } | 1385 } |
1394 | 1386 |
1395 if (isAnimating) { | 1387 if (isAnimating) { |
1396 m_doubleTapZoomPageScaleFactor = scale; | 1388 m_doubleTapZoomPageScaleFactor = scale; |
1397 m_doubleTapZoomPending = true; | 1389 m_doubleTapZoomPending = true; |
1398 } | 1390 } |
1399 } | 1391 } |
1400 | 1392 |
1401 void WebViewImpl::zoomToFindInPageRect(const WebRect& rect) | 1393 void WebViewImpl::zoomToFindInPageRect(const WebRect& rectInRootFrame) |
1402 { | 1394 { |
1403 if (!mainFrameImpl()) | 1395 if (!mainFrameImpl()) |
1404 return; | 1396 return; |
1405 | 1397 |
1406 WebRect blockBounds = computeBlockBound(WebPoint(rect.x + rect.width / 2, re
ct.y + rect.height / 2), true); | 1398 WebRect blockBounds = computeBlockBound(WebPoint(rectInRootFrame.x + rectInR
ootFrame.width / 2, rectInRootFrame.y + rectInRootFrame.height / 2), true); |
1407 | 1399 |
1408 if (blockBounds.isEmpty()) { | 1400 if (blockBounds.isEmpty()) { |
1409 // Keep current scale (no need to scroll as x,y will normally already | 1401 // Keep current scale (no need to scroll as x,y will normally already |
1410 // be visible). FIXME: Revisit this if it isn't always true. | 1402 // be visible). FIXME: Revisit this if it isn't always true. |
1411 return; | 1403 return; |
1412 } | 1404 } |
1413 | 1405 |
1414 float scale; | 1406 float scale; |
1415 WebPoint scroll; | 1407 WebPoint scroll; |
1416 | 1408 |
1417 computeScaleAndScrollForBlockRect(WebPoint(rect.x, rect.y), blockBounds, non
UserInitiatedPointPadding, minimumPageScaleFactor(), scale, scroll); | 1409 computeScaleAndScrollForBlockRect(WebPoint(rectInRootFrame.x, rectInRootFram
e.y), blockBounds, nonUserInitiatedPointPadding, minimumPageScaleFactor(), scale
, scroll); |
1418 | 1410 |
1419 startPageScaleAnimation(scroll, false, scale, findInPageAnimationDurationInS
econds); | 1411 startPageScaleAnimation(scroll, false, scale, findInPageAnimationDurationInS
econds); |
1420 } | 1412 } |
1421 | 1413 |
1422 bool WebViewImpl::zoomToMultipleTargetsRect(const WebRect& rect) | 1414 bool WebViewImpl::zoomToMultipleTargetsRect(const WebRect& rectInRootFrame) |
1423 { | 1415 { |
1424 if (!mainFrameImpl()) | 1416 if (!mainFrameImpl()) |
1425 return false; | 1417 return false; |
1426 | 1418 |
1427 float scale; | 1419 float scale; |
1428 WebPoint scroll; | 1420 WebPoint scroll; |
1429 | 1421 |
1430 computeScaleAndScrollForBlockRect(WebPoint(rect.x, rect.y), rect, nonUserIni
tiatedPointPadding, minimumPageScaleFactor(), scale, scroll); | 1422 computeScaleAndScrollForBlockRect(WebPoint(rectInRootFrame.x, rectInRootFram
e.y), rectInRootFrame, nonUserInitiatedPointPadding, minimumPageScaleFactor(), s
cale, scroll); |
1431 | 1423 |
1432 if (scale <= pageScaleFactor()) | 1424 if (scale <= pageScaleFactor()) |
1433 return false; | 1425 return false; |
1434 | 1426 |
1435 startPageScaleAnimation(scroll, false, scale, multipleTargetsZoomAnimationDu
rationInSeconds); | 1427 startPageScaleAnimation(scroll, false, scale, multipleTargetsZoomAnimationDu
rationInSeconds); |
1436 return true; | 1428 return true; |
1437 } | 1429 } |
1438 | 1430 |
1439 void WebViewImpl::hasTouchEventHandlers(bool hasTouchHandlers) | 1431 void WebViewImpl::hasTouchEventHandlers(bool hasTouchHandlers) |
1440 { | 1432 { |
(...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2572 anchor = localFrame->editor().firstRectForRange(range.get()); | 2564 anchor = localFrame->editor().firstRectForRange(range.get()); |
2573 | 2565 |
2574 range = Range::create(selectedRange->endContainer()->document(), | 2566 range = Range::create(selectedRange->endContainer()->document(), |
2575 selectedRange->endContainer(), | 2567 selectedRange->endContainer(), |
2576 selectedRange->endOffset(), | 2568 selectedRange->endOffset(), |
2577 selectedRange->endContainer(), | 2569 selectedRange->endContainer(), |
2578 selectedRange->endOffset()); | 2570 selectedRange->endOffset()); |
2579 focus = localFrame->editor().firstRectForRange(range.get()); | 2571 focus = localFrame->editor().firstRectForRange(range.get()); |
2580 } | 2572 } |
2581 | 2573 |
2582 IntRect scaledAnchor(localFrame->view()->contentsToWindow(anchor)); | 2574 anchor = localFrame->view()->contentsToViewport(anchor); |
2583 IntRect scaledFocus(localFrame->view()->contentsToWindow(focus)); | 2575 focus = localFrame->view()->contentsToViewport(focus); |
2584 | |
2585 if (pinchVirtualViewportEnabled()) { | |
2586 // FIXME(http://crbug.com/371902) - We shouldn't have to do this | |
2587 // manually, the contentsToWindow methods above should be fixed to do | |
2588 // this. | |
2589 IntPoint pinchViewportOffset = | |
2590 roundedIntPoint(page()->frameHost().pinchViewport().visibleRect().lo
cation()); | |
2591 scaledAnchor.moveBy(-pinchViewportOffset); | |
2592 scaledFocus.moveBy(-pinchViewportOffset); | |
2593 } | |
2594 | |
2595 scaledAnchor.scale(pageScaleFactor()); | |
2596 scaledFocus.scale(pageScaleFactor()); | |
2597 anchor = scaledAnchor; | |
2598 focus = scaledFocus; | |
2599 | 2576 |
2600 if (!selection.selection().isBaseFirst()) | 2577 if (!selection.selection().isBaseFirst()) |
2601 std::swap(anchor, focus); | 2578 std::swap(anchor, focus); |
2602 return true; | 2579 return true; |
2603 } | 2580 } |
2604 | 2581 |
2605 InputMethodContext* WebViewImpl::inputMethodContext() | 2582 InputMethodContext* WebViewImpl::inputMethodContext() |
2606 { | 2583 { |
2607 if (!m_imeAcceptEvents) | 2584 if (!m_imeAcceptEvents) |
2608 return 0; | 2585 return 0; |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2914 return false; | 2891 return false; |
2915 | 2892 |
2916 if (!m_webSettings->autoZoomFocusedNodeToLegibleScale()) { | 2893 if (!m_webSettings->autoZoomFocusedNodeToLegibleScale()) { |
2917 PinchViewport& pinchViewport = page()->frameHost().pinchViewport(); | 2894 PinchViewport& pinchViewport = page()->frameHost().pinchViewport(); |
2918 | 2895 |
2919 // FIXME: The pixel snapping shouldn't be done ad-hoc. crbug.com/458579. | 2896 // FIXME: The pixel snapping shouldn't be done ad-hoc. crbug.com/458579. |
2920 IntRect viewportRectInRootFrame( | 2897 IntRect viewportRectInRootFrame( |
2921 ceiledIntPoint(pinchViewport.location()), | 2898 ceiledIntPoint(pinchViewport.location()), |
2922 expandedIntSize(pinchViewport.visibleSize())); | 2899 expandedIntSize(pinchViewport.visibleSize())); |
2923 | 2900 |
2924 // FIXME: Use viewportToRootFrame when coordinate refactoring CL lands. | 2901 FloatRect targetRectInRootFrame = pinchViewport.viewportToRootFrame(rect
InViewport); |
2925 FloatRect targetRectInRootFrame( | |
2926 rectInViewport.x, | |
2927 rectInViewport.y, | |
2928 rectInViewport.width, | |
2929 rectInViewport.height); | |
2930 targetRectInRootFrame.scale(1 / pinchViewport.scale()); | |
2931 targetRectInRootFrame.moveBy(viewportRectInRootFrame.location()); | |
2932 | |
2933 DoubleSize remainder = frame->view()->scrollElementToRect(element, IntRe
ct(targetRectInRootFrame)); | 2902 DoubleSize remainder = frame->view()->scrollElementToRect(element, IntRe
ct(targetRectInRootFrame)); |
2934 | 2903 |
2935 // Scroll the remainder in the pinch viewport. | 2904 // Scroll the remainder in the pinch viewport. |
2936 page()->frameHost().pinchViewport().move(FloatPoint(remainder.width(), r
emainder.height())); | 2905 page()->frameHost().pinchViewport().move(FloatPoint(remainder.width(), r
emainder.height())); |
2937 return false; | 2906 return false; |
2938 } | 2907 } |
2939 | 2908 |
2940 float scale; | 2909 float scale; |
2941 IntPoint scroll; | 2910 IntPoint scroll; |
2942 bool needAnimation; | 2911 bool needAnimation; |
2943 computeScaleAndScrollForFocusedNode(element, scale, scroll, needAnimation); | 2912 computeScaleAndScrollForFocusedNode(element, scale, scroll, needAnimation); |
2944 if (needAnimation) | 2913 if (needAnimation) |
2945 return startPageScaleAnimation(scroll, false, scale, scrollAndScaleAnima
tionDurationInSeconds); | 2914 return startPageScaleAnimation(scroll, false, scale, scrollAndScaleAnima
tionDurationInSeconds); |
2946 | 2915 |
2947 return false; | 2916 return false; |
2948 } | 2917 } |
2949 | 2918 |
2950 void WebViewImpl::computeScaleAndScrollForFocusedNode(Node* focusedNode, float&
newScale, IntPoint& newScroll, bool& needAnimation) | 2919 void WebViewImpl::computeScaleAndScrollForFocusedNode(Node* focusedNode, float&
newScale, IntPoint& newScroll, bool& needAnimation) |
2951 { | 2920 { |
2952 focusedNode->document().updateLayoutIgnorePendingStylesheets(); | 2921 focusedNode->document().updateLayoutIgnorePendingStylesheets(); |
2953 | 2922 |
2954 // 'caret' is rect encompassing the blinking cursor. | 2923 // 'caret' is rect encompassing the blinking cursor. |
2955 IntRect textboxRect = focusedNode->document().view()->contentsToWindow(pixel
SnappedIntRect(focusedNode->Node::boundingBox())); | 2924 IntRect textboxRectInRootFrame = focusedNode->document().view()->contentsToR
ootFrame(pixelSnappedIntRect(focusedNode->Node::boundingBox())); |
2956 WebRect caret, unusedEnd; | 2925 WebRect caret, unusedEnd; |
2957 selectionBounds(caret, unusedEnd); | 2926 selectionBounds(caret, unusedEnd); |
2958 IntRect unscaledCaret = caret; | 2927 IntRect unscaledCaret = caret; |
2959 unscaledCaret.scale(1 / pageScaleFactor()); | 2928 unscaledCaret.scale(1 / pageScaleFactor()); |
2960 caret = unscaledCaret; | 2929 caret = unscaledCaret; |
2961 | 2930 |
2962 if (shouldDisableDesktopWorkarounds()) { | 2931 if (shouldDisableDesktopWorkarounds()) { |
2963 newScale = pageScaleFactor(); | 2932 newScale = pageScaleFactor(); |
2964 } else { | 2933 } else { |
2965 // Pick a scale which is reasonably readable. This is the scale at which | 2934 // Pick a scale which is reasonably readable. This is the scale at which |
2966 // the caret height will become minReadableCaretHeightForNode (adjusted | 2935 // the caret height will become minReadableCaretHeightForNode (adjusted |
2967 // for dpi and font scale factor). | 2936 // for dpi and font scale factor). |
2968 const int minReadableCaretHeightForNode = textboxRect.height() >= 2 * ca
ret.height ? minReadableCaretHeightForTextArea : minReadableCaretHeight; | 2937 const int minReadableCaretHeightForNode = textboxRectInRootFrame.height(
) >= 2 * caret.height ? minReadableCaretHeightForTextArea : minReadableCaretHeig
ht; |
2969 newScale = clampPageScaleFactorToLimits(maximumLegiblePageScale() * minR
eadableCaretHeightForNode / caret.height); | 2938 newScale = clampPageScaleFactorToLimits(maximumLegiblePageScale() * minR
eadableCaretHeightForNode / caret.height); |
2970 newScale = std::max(newScale, pageScaleFactor()); | 2939 newScale = std::max(newScale, pageScaleFactor()); |
2971 } | 2940 } |
2972 const float deltaScale = newScale / pageScaleFactor(); | 2941 const float deltaScale = newScale / pageScaleFactor(); |
2973 | 2942 |
2974 needAnimation = false; | 2943 needAnimation = false; |
2975 // If we are at less than the target zoom level, zoom in. | 2944 // If we are at less than the target zoom level, zoom in. |
2976 if (deltaScale > minScaleChangeToTriggerZoom) | 2945 if (deltaScale > minScaleChangeToTriggerZoom) |
2977 needAnimation = true; | 2946 needAnimation = true; |
2978 else | 2947 else |
2979 newScale = pageScaleFactor(); | 2948 newScale = pageScaleFactor(); |
2980 | 2949 |
2981 // Convert the rects to absolute space in the new scale. | 2950 // Convert the rects to absolute space in the new scale. |
2982 IntRect textboxRectInDocumentCoordinates = textboxRect; | 2951 IntRect textboxRectInDocumentCoordinates = mainFrameImpl()->frameView()->fra
meToContents(textboxRectInRootFrame); |
2983 textboxRectInDocumentCoordinates.move(mainFrame()->scrollOffset()); | |
2984 IntRect caretInDocumentCoordinates = caret; | 2952 IntRect caretInDocumentCoordinates = caret; |
2985 caretInDocumentCoordinates.move(mainFrame()->scrollOffset()); | 2953 caretInDocumentCoordinates.move(mainFrame()->scrollOffset()); |
2986 | 2954 |
2987 int viewWidth = m_size.width / newScale; | 2955 int viewWidth = m_size.width / newScale; |
2988 int viewHeight = m_size.height / newScale; | 2956 int viewHeight = m_size.height / newScale; |
2989 | 2957 |
2990 // If the caret is offscreen, then animate. | 2958 // If the caret is offscreen, then animate. |
2991 IntRect sizeRect(0, 0, viewWidth, viewHeight); | 2959 IntRect sizeRect(0, 0, viewWidth, viewHeight); |
2992 sizeRect.scale(newScale / pageScaleFactor()); | 2960 sizeRect.scale(newScale / pageScaleFactor()); |
2993 if (!sizeRect.contains(caret)) | 2961 if (!sizeRect.contains(caret)) |
2994 needAnimation = true; | 2962 needAnimation = true; |
2995 | 2963 |
2996 // If the box is partially offscreen and it's possible to bring it fully | 2964 // If the box is partially offscreen and it's possible to bring it fully |
2997 // onscreen, then animate. | 2965 // onscreen, then animate. |
2998 if (sizeRect.contains(textboxRectInDocumentCoordinates.width(), textboxRectI
nDocumentCoordinates.height()) && !sizeRect.contains(textboxRect)) | 2966 if (sizeRect.contains(textboxRectInDocumentCoordinates.width(), textboxRectI
nDocumentCoordinates.height()) && !sizeRect.contains(textboxRectInRootFrame)) |
2999 needAnimation = true; | 2967 needAnimation = true; |
3000 | 2968 |
3001 if (!needAnimation) | 2969 if (!needAnimation) |
3002 return; | 2970 return; |
3003 | 2971 |
3004 if (textboxRectInDocumentCoordinates.width() <= viewWidth) { | 2972 if (textboxRectInDocumentCoordinates.width() <= viewWidth) { |
3005 // Field is narrower than screen. Try to leave padding on left so field'
s | 2973 // Field is narrower than screen. Try to leave padding on left so field'
s |
3006 // label is visible, but it's more important to ensure entire field is | 2974 // label is visible, but it's more important to ensure entire field is |
3007 // onscreen. | 2975 // onscreen. |
3008 int idealLeftPadding = viewWidth * leftBoxRatio; | 2976 int idealLeftPadding = viewWidth * leftBoxRatio; |
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3525 m_pageScaleConstraintsSet.setNeedsReset(true); | 3493 m_pageScaleConstraintsSet.setNeedsReset(true); |
3526 | 3494 |
3527 // Clobber saved scales and scroll offsets. | 3495 // Clobber saved scales and scroll offsets. |
3528 if (FrameView* view = page()->deprecatedLocalMainFrame()->document()->view()
) | 3496 if (FrameView* view = page()->deprecatedLocalMainFrame()->document()->view()
) |
3529 view->cacheCurrentScrollPosition(); | 3497 view->cacheCurrentScrollPosition(); |
3530 } | 3498 } |
3531 | 3499 |
3532 void WebViewImpl::performMediaPlayerAction(const WebMediaPlayerAction& action, | 3500 void WebViewImpl::performMediaPlayerAction(const WebMediaPlayerAction& action, |
3533 const WebPoint& location) | 3501 const WebPoint& location) |
3534 { | 3502 { |
3535 HitTestResult result = hitTestResultForWindowPos(location); | 3503 // FIXME: location is probably in viewport coordinates. |
| 3504 HitTestResult result = hitTestResultForRootFramePos(location); |
3536 RefPtrWillBeRawPtr<Node> node = result.innerNonSharedNode(); | 3505 RefPtrWillBeRawPtr<Node> node = result.innerNonSharedNode(); |
3537 if (!isHTMLVideoElement(*node) && !isHTMLAudioElement(*node)) | 3506 if (!isHTMLVideoElement(*node) && !isHTMLAudioElement(*node)) |
3538 return; | 3507 return; |
3539 | 3508 |
3540 RefPtrWillBeRawPtr<HTMLMediaElement> mediaElement = static_pointer_cast<HTML
MediaElement>(node); | 3509 RefPtrWillBeRawPtr<HTMLMediaElement> mediaElement = static_pointer_cast<HTML
MediaElement>(node); |
3541 switch (action.type) { | 3510 switch (action.type) { |
3542 case WebMediaPlayerAction::Play: | 3511 case WebMediaPlayerAction::Play: |
3543 if (action.enable) | 3512 if (action.enable) |
3544 mediaElement->play(); | 3513 mediaElement->play(); |
3545 else | 3514 else |
3546 mediaElement->pause(); | 3515 mediaElement->pause(); |
3547 break; | 3516 break; |
3548 case WebMediaPlayerAction::Mute: | 3517 case WebMediaPlayerAction::Mute: |
3549 mediaElement->setMuted(action.enable); | 3518 mediaElement->setMuted(action.enable); |
3550 break; | 3519 break; |
3551 case WebMediaPlayerAction::Loop: | 3520 case WebMediaPlayerAction::Loop: |
3552 mediaElement->setLoop(action.enable); | 3521 mediaElement->setLoop(action.enable); |
3553 break; | 3522 break; |
3554 case WebMediaPlayerAction::Controls: | 3523 case WebMediaPlayerAction::Controls: |
3555 mediaElement->setBooleanAttribute(HTMLNames::controlsAttr, action.enable
); | 3524 mediaElement->setBooleanAttribute(HTMLNames::controlsAttr, action.enable
); |
3556 break; | 3525 break; |
3557 default: | 3526 default: |
3558 ASSERT_NOT_REACHED(); | 3527 ASSERT_NOT_REACHED(); |
3559 } | 3528 } |
3560 } | 3529 } |
3561 | 3530 |
3562 void WebViewImpl::performPluginAction(const WebPluginAction& action, | 3531 void WebViewImpl::performPluginAction(const WebPluginAction& action, |
3563 const WebPoint& location) | 3532 const WebPoint& location) |
3564 { | 3533 { |
3565 HitTestResult result = hitTestResultForWindowPos(location); | 3534 // FIXME: Location is probably in viewport coordinates |
| 3535 HitTestResult result = hitTestResultForRootFramePos(location); |
3566 RefPtrWillBeRawPtr<Node> node = result.innerNonSharedNode(); | 3536 RefPtrWillBeRawPtr<Node> node = result.innerNonSharedNode(); |
3567 if (!isHTMLObjectElement(*node) && !isHTMLEmbedElement(*node)) | 3537 if (!isHTMLObjectElement(*node) && !isHTMLEmbedElement(*node)) |
3568 return; | 3538 return; |
3569 | 3539 |
3570 LayoutObject* object = node->renderer(); | 3540 LayoutObject* object = node->renderer(); |
3571 if (object && object->isLayoutPart()) { | 3541 if (object && object->isLayoutPart()) { |
3572 Widget* widget = toLayoutPart(object)->widget(); | 3542 Widget* widget = toLayoutPart(object)->widget(); |
3573 if (widget && widget->isPluginContainer()) { | 3543 if (widget && widget->isPluginContainer()) { |
3574 WebPluginContainerImpl* plugin = toWebPluginContainerImpl(widget); | 3544 WebPluginContainerImpl* plugin = toWebPluginContainerImpl(widget); |
3575 switch (action.type) { | 3545 switch (action.type) { |
3576 case WebPluginAction::Rotate90Clockwise: | 3546 case WebPluginAction::Rotate90Clockwise: |
3577 plugin->plugin()->rotateView(WebPlugin::RotationType90Clockwise)
; | 3547 plugin->plugin()->rotateView(WebPlugin::RotationType90Clockwise)
; |
3578 break; | 3548 break; |
3579 case WebPluginAction::Rotate90Counterclockwise: | 3549 case WebPluginAction::Rotate90Counterclockwise: |
3580 plugin->plugin()->rotateView(WebPlugin::RotationType90Counterclo
ckwise); | 3550 plugin->plugin()->rotateView(WebPlugin::RotationType90Counterclo
ckwise); |
3581 break; | 3551 break; |
3582 default: | 3552 default: |
3583 ASSERT_NOT_REACHED(); | 3553 ASSERT_NOT_REACHED(); |
3584 } | 3554 } |
3585 } | 3555 } |
3586 } | 3556 } |
3587 } | 3557 } |
3588 | 3558 |
3589 WebHitTestResult WebViewImpl::hitTestResultAt(const WebPoint& point) | 3559 WebHitTestResult WebViewImpl::hitTestResultAt(const WebPoint& point) |
3590 { | 3560 { |
3591 return coreHitTestResultAt(point); | 3561 return coreHitTestResultAt(point); |
3592 } | 3562 } |
3593 | 3563 |
3594 HitTestResult WebViewImpl::coreHitTestResultAt(const WebPoint& point) | 3564 HitTestResult WebViewImpl::coreHitTestResultAt(const WebPoint& pointInViewport) |
3595 { | 3565 { |
3596 FloatPoint scaledPoint(point.x, point.y); | 3566 FrameView* view = mainFrameImpl()->frameView(); |
3597 scaledPoint.scale(1 / pageScaleFactor(), 1 / pageScaleFactor()); | 3567 IntPoint pointInRootFrame = view->contentsToFrame(view->viewportToContents(p
ointInViewport)); |
3598 scaledPoint.moveBy(pinchViewportOffset()); | 3568 return hitTestResultForRootFramePos(pointInRootFrame); |
3599 return hitTestResultForWindowPos(flooredIntPoint(scaledPoint)); | |
3600 } | 3569 } |
3601 | 3570 |
3602 void WebViewImpl::copyImageAt(const WebPoint& point) | 3571 void WebViewImpl::copyImageAt(const WebPoint& point) |
3603 { | 3572 { |
3604 if (!m_page) | 3573 if (!m_page) |
3605 return; | 3574 return; |
3606 | 3575 |
3607 HitTestResult result = hitTestResultForWindowPos(point); | 3576 // FIXME: point is probably in viewport coordinates. |
| 3577 HitTestResult result = hitTestResultForRootFramePos(point); |
3608 if (!isHTMLCanvasElement(result.innerNonSharedNode()) && result.absoluteImag
eURL().isEmpty()) { | 3578 if (!isHTMLCanvasElement(result.innerNonSharedNode()) && result.absoluteImag
eURL().isEmpty()) { |
3609 // There isn't actually an image at these coordinates. Might be because | 3579 // There isn't actually an image at these coordinates. Might be because |
3610 // the window scrolled while the context menu was open or because the pa
ge | 3580 // the window scrolled while the context menu was open or because the pa
ge |
3611 // changed itself between when we thought there was an image here and wh
en | 3581 // changed itself between when we thought there was an image here and wh
en |
3612 // we actually tried to retreive the image. | 3582 // we actually tried to retreive the image. |
3613 // | 3583 // |
3614 // FIXME: implement a cache of the most recent HitTestResult to avoid ha
ving | 3584 // FIXME: implement a cache of the most recent HitTestResult to avoid ha
ving |
3615 // to do two hit tests. | 3585 // to do two hit tests. |
3616 return; | 3586 return; |
3617 } | 3587 } |
3618 | 3588 |
3619 m_page->deprecatedLocalMainFrame()->editor().copyImage(result); | 3589 m_page->deprecatedLocalMainFrame()->editor().copyImage(result); |
3620 } | 3590 } |
3621 | 3591 |
3622 void WebViewImpl::saveImageAt(const WebPoint& point) | 3592 void WebViewImpl::saveImageAt(const WebPoint& point) |
3623 { | 3593 { |
3624 if (!m_client) | 3594 if (!m_client) |
3625 return; | 3595 return; |
3626 | 3596 |
3627 Node* node = hitTestResultForWindowPos(point).innerNonSharedNode(); | 3597 // FIXME: point is probably in viewport coordinates. |
| 3598 Node* node = hitTestResultForRootFramePos(point).innerNonSharedNode(); |
3628 if (!node || !(isHTMLCanvasElement(*node) || isHTMLImageElement(*node))) | 3599 if (!node || !(isHTMLCanvasElement(*node) || isHTMLImageElement(*node))) |
3629 return; | 3600 return; |
3630 | 3601 |
3631 String url = toElement(*node).imageSourceURL(); | 3602 String url = toElement(*node).imageSourceURL(); |
3632 if (!KURL(KURL(), url).protocolIsData()) | 3603 if (!KURL(KURL(), url).protocolIsData()) |
3633 return; | 3604 return; |
3634 | 3605 |
3635 m_client->saveImageFromDataURL(url); | 3606 m_client->saveImageFromDataURL(url); |
3636 } | 3607 } |
3637 | 3608 |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3818 mainFrameImpl()->frame()->view()->enableAutoSizeMode(m_minAutoSize, m_ma
xAutoSize); | 3789 mainFrameImpl()->frame()->view()->enableAutoSizeMode(m_minAutoSize, m_ma
xAutoSize); |
3819 else | 3790 else |
3820 mainFrameImpl()->frame()->view()->disableAutoSizeMode(); | 3791 mainFrameImpl()->frame()->view()->disableAutoSizeMode(); |
3821 } | 3792 } |
3822 | 3793 |
3823 unsigned long WebViewImpl::createUniqueIdentifierForRequest() | 3794 unsigned long WebViewImpl::createUniqueIdentifierForRequest() |
3824 { | 3795 { |
3825 return createUniqueIdentifier(); | 3796 return createUniqueIdentifier(); |
3826 } | 3797 } |
3827 | 3798 |
3828 void WebViewImpl::inspectElementAt(const WebPoint& point) | 3799 void WebViewImpl::inspectElementAt(const WebPoint& pointInRootFrame) |
3829 { | 3800 { |
3830 if (!m_page) | 3801 if (!m_page) |
3831 return; | 3802 return; |
3832 | 3803 |
3833 if (point.x == -1 || point.y == -1) { | 3804 if (pointInRootFrame.x == -1 || pointInRootFrame.y == -1) { |
3834 m_page->inspectorController().inspect(0); | 3805 m_page->inspectorController().inspect(0); |
3835 } else { | 3806 } else { |
3836 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move | HitT
estRequest::ReadOnly | HitTestRequest::AllowChildFrameContent; | 3807 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move | HitT
estRequest::ReadOnly | HitTestRequest::AllowChildFrameContent; |
3837 HitTestRequest request(hitType); | 3808 HitTestRequest request(hitType); |
3838 | 3809 |
3839 WebMouseEvent dummyEvent; | 3810 WebMouseEvent dummyEvent; |
3840 dummyEvent.type = WebInputEvent::MouseDown; | 3811 dummyEvent.type = WebInputEvent::MouseDown; |
3841 dummyEvent.x = point.x; | 3812 dummyEvent.x = pointInRootFrame.x; |
3842 dummyEvent.y = point.y; | 3813 dummyEvent.y = pointInRootFrame.y; |
3843 IntPoint transformedPoint = PlatformMouseEventBuilder(m_page->deprecated
LocalMainFrame()->view(), dummyEvent).position(); | 3814 IntPoint transformedPoint = PlatformMouseEventBuilder(m_page->deprecated
LocalMainFrame()->view(), dummyEvent).position(); |
3844 HitTestResult result(m_page->deprecatedLocalMainFrame()->view()->windowT
oContents(transformedPoint)); | 3815 HitTestResult result(m_page->deprecatedLocalMainFrame()->view()->rootFra
meToContents(transformedPoint)); |
3845 m_page->deprecatedLocalMainFrame()->contentRenderer()->hitTest(request,
result); | 3816 m_page->deprecatedLocalMainFrame()->contentRenderer()->hitTest(request,
result); |
3846 Node* node = result.innerNode(); | 3817 Node* node = result.innerNode(); |
3847 if (!node && m_page->deprecatedLocalMainFrame()->document()) | 3818 if (!node && m_page->deprecatedLocalMainFrame()->document()) |
3848 node = m_page->deprecatedLocalMainFrame()->document()->documentEleme
nt(); | 3819 node = m_page->deprecatedLocalMainFrame()->document()->documentEleme
nt(); |
3849 m_page->inspectorController().inspect(node); | 3820 m_page->inspectorController().inspect(node); |
3850 } | 3821 } |
3851 } | 3822 } |
3852 | 3823 |
3853 void WebViewImpl::setCompositorDeviceScaleFactorOverride(float deviceScaleFactor
) | 3824 void WebViewImpl::setCompositorDeviceScaleFactorOverride(float deviceScaleFactor
) |
3854 { | 3825 { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3902 if (!page()) | 3873 if (!page()) |
3903 return; | 3874 return; |
3904 | 3875 |
3905 page()->contextMenuController().clearContextMenu(); | 3876 page()->contextMenuController().clearContextMenu(); |
3906 m_contextMenuAllowed = true; | 3877 m_contextMenuAllowed = true; |
3907 if (LocalFrame* focusedFrame = toLocalFrame(page()->focusController().focuse
dOrMainFrame())) | 3878 if (LocalFrame* focusedFrame = toLocalFrame(page()->focusController().focuse
dOrMainFrame())) |
3908 focusedFrame->eventHandler().sendContextMenuEventForKey(); | 3879 focusedFrame->eventHandler().sendContextMenuEventForKey(); |
3909 m_contextMenuAllowed = false; | 3880 m_contextMenuAllowed = false; |
3910 } | 3881 } |
3911 | 3882 |
3912 void WebViewImpl::extractSmartClipData(WebRect rect, WebString& clipText, WebStr
ing& clipHtml, WebRect& clipRect) | 3883 void WebViewImpl::extractSmartClipData(WebRect rectInViewport, WebString& clipTe
xt, WebString& clipHtml, WebRect& clipRectInViewport) |
3913 { | 3884 { |
3914 LocalFrame* localFrame = toLocalFrame(focusedCoreFrame()); | 3885 LocalFrame* localFrame = toLocalFrame(focusedCoreFrame()); |
3915 if (!localFrame) | 3886 if (!localFrame) |
3916 return; | 3887 return; |
3917 SmartClipData clipData = SmartClip(localFrame).dataForRect(rect); | 3888 SmartClipData clipData = SmartClip(localFrame).dataForRect(rectInViewport); |
3918 clipText = clipData.clipData(); | 3889 clipText = clipData.clipData(); |
3919 clipRect = clipData.rect(); | 3890 clipRectInViewport = clipData.rectInViewport(); |
3920 | 3891 |
3921 WebLocalFrameImpl* frame = mainFrameImpl(); | 3892 WebLocalFrameImpl* frame = mainFrameImpl(); |
3922 if (!frame) | 3893 if (!frame) |
3923 return; | 3894 return; |
3924 WebPoint startPoint(rect.x, rect.y); | 3895 WebPoint startPoint(rectInViewport.x, rectInViewport.y); |
3925 WebPoint endPoint(rect.x + rect.width, rect.y + rect.height); | 3896 WebPoint endPoint(rectInViewport.x + rectInViewport.width, rectInViewport.y
+ rectInViewport.height); |
3926 VisiblePosition startVisiblePosition = frame->visiblePositionForWindowPoint(
startPoint); | 3897 VisiblePosition startVisiblePosition = frame->visiblePositionForViewportPoin
t(startPoint); |
3927 VisiblePosition endVisiblePosition = frame->visiblePositionForWindowPoint(en
dPoint); | 3898 VisiblePosition endVisiblePosition = frame->visiblePositionForViewportPoint(
endPoint); |
3928 | 3899 |
3929 Position startPosition = startVisiblePosition.deepEquivalent(); | 3900 Position startPosition = startVisiblePosition.deepEquivalent(); |
3930 Position endPosition = endVisiblePosition.deepEquivalent(); | 3901 Position endPosition = endVisiblePosition.deepEquivalent(); |
3931 | 3902 |
3932 // document() will return null if -webkit-user-select is set to none. | 3903 // document() will return null if -webkit-user-select is set to none. |
3933 if (!startPosition.document() || !endPosition.document()) | 3904 if (!startPosition.document() || !endPosition.document()) |
3934 return; | 3905 return; |
3935 | 3906 |
3936 RefPtrWillBeRawPtr<Range> range = Range::create(*startPosition.document(), s
tartPosition, endPosition); | 3907 RefPtrWillBeRawPtr<Range> range = Range::create(*startPosition.document(), s
tartPosition, endPosition); |
3937 if (!range) | 3908 if (!range) |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4224 if (!frame || !frame->isLocalFrame()) | 4195 if (!frame || !frame->isLocalFrame()) |
4225 return 0; | 4196 return 0; |
4226 | 4197 |
4227 Document* document = toLocalFrame(frame)->document(); | 4198 Document* document = toLocalFrame(frame)->document(); |
4228 if (!document) | 4199 if (!document) |
4229 return 0; | 4200 return 0; |
4230 | 4201 |
4231 return document->focusedElement(); | 4202 return document->focusedElement(); |
4232 } | 4203 } |
4233 | 4204 |
4234 HitTestResult WebViewImpl::hitTestResultForWindowPos(const IntPoint& pos) | 4205 HitTestResult WebViewImpl::hitTestResultForRootFramePos(const IntPoint& pos) |
4235 { | 4206 { |
4236 if (!m_page->mainFrame()->isLocalFrame()) | 4207 if (!m_page->mainFrame()->isLocalFrame()) |
4237 return HitTestResult(); | 4208 return HitTestResult(); |
4238 IntPoint docPoint(m_page->deprecatedLocalMainFrame()->view()->windowToConten
ts(pos)); | 4209 IntPoint docPoint(m_page->deprecatedLocalMainFrame()->view()->rootFrameToCon
tents(pos)); |
4239 HitTestResult result = m_page->deprecatedLocalMainFrame()->eventHandler().hi
tTestResultAtPoint(docPoint, HitTestRequest::ReadOnly | HitTestRequest::Active); | 4210 HitTestResult result = m_page->deprecatedLocalMainFrame()->eventHandler().hi
tTestResultAtPoint(docPoint, HitTestRequest::ReadOnly | HitTestRequest::Active); |
4240 result.setToShadowHostIfInClosedShadowRoot(); | 4211 result.setToShadowHostIfInClosedShadowRoot(); |
4241 return result; | 4212 return result; |
4242 } | 4213 } |
4243 | 4214 |
4244 WebHitTestResult WebViewImpl::hitTestResultForTap(const WebPoint& tapPointWindow
Pos, const WebSize& tapArea) | 4215 WebHitTestResult WebViewImpl::hitTestResultForTap(const WebPoint& tapPointWindow
Pos, const WebSize& tapArea) |
4245 { | 4216 { |
4246 if (!m_page->mainFrame()->isLocalFrame()) | 4217 if (!m_page->mainFrame()->isLocalFrame()) |
4247 return HitTestResult(); | 4218 return HitTestResult(); |
4248 | 4219 |
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4689 return mainFrameImpl()->frameView()->layoutSize().width() == m_size.width | 4660 return mainFrameImpl()->frameView()->layoutSize().width() == m_size.width |
4690 || (constraints.minimumScale == constraints.maximumScale && constraints.
minimumScale != -1); | 4661 || (constraints.minimumScale == constraints.maximumScale && constraints.
minimumScale != -1); |
4691 } | 4662 } |
4692 | 4663 |
4693 void WebViewImpl::forceNextWebGLContextCreationToFail() | 4664 void WebViewImpl::forceNextWebGLContextCreationToFail() |
4694 { | 4665 { |
4695 WebGLRenderingContext::forceNextWebGLContextCreationToFail(); | 4666 WebGLRenderingContext::forceNextWebGLContextCreationToFail(); |
4696 } | 4667 } |
4697 | 4668 |
4698 } // namespace blink | 4669 } // namespace blink |
OLD | NEW |