OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
3 * Copyright (C) 2014 Opera Software ASA. All rights reserved. | 3 * Copyright (C) 2014 Opera Software ASA. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 LocalFrame* frame = m_element->document().frame(); | 495 LocalFrame* frame = m_element->document().frame(); |
496 if (!frame || !frame->loader().documentLoader()) | 496 if (!frame || !frame->loader().documentLoader()) |
497 return; // FIXME: send a notification in this case? | 497 return; // FIXME: send a notification in this case? |
498 | 498 |
499 FrameLoadRequest frameRequest(frame->document(), request.toResourceRequest(), | 499 FrameLoadRequest frameRequest(frame->document(), request.toResourceRequest(), |
500 target); | 500 target); |
501 frame->loader().load(frameRequest); | 501 frame->loader().load(frameRequest); |
502 } | 502 } |
503 | 503 |
504 bool WebPluginContainerImpl::isRectTopmost(const WebRect& rect) { | 504 bool WebPluginContainerImpl::isRectTopmost(const WebRect& rect) { |
505 // Disallow access to the frame during dispose(), because it is not guaranteed
to | 505 // Disallow access to the frame during dispose(), because it is not guaranteed |
506 // be valid memory once this object has started disposal. In particular, we mi
ght be being | 506 // to be valid memory once this object has started disposal. In particular, |
507 // disposed because the frame has already be deleted and then something else d
ropped the | 507 // we might be being disposed because the frame has already be deleted and |
| 508 // then something else dropped the |
508 // last reference to the this object. | 509 // last reference to the this object. |
509 if (m_isDisposed || !m_element) | 510 if (m_isDisposed || !m_element) |
510 return false; | 511 return false; |
511 | 512 |
512 LocalFrame* frame = m_element->document().frame(); | 513 LocalFrame* frame = m_element->document().frame(); |
513 if (!frame) | 514 if (!frame) |
514 return false; | 515 return false; |
515 | 516 |
516 IntRect documentRect(x() + rect.x, y() + rect.y, rect.width, rect.height); | 517 IntRect documentRect(x() + rect.x, y() + rect.y, rect.width, rect.height); |
517 // hitTestResultAtPoint() takes a padding rectangle. | 518 // hitTestResultAtPoint() takes a padding rectangle. |
518 // FIXME: We'll be off by 1 when the width or height is even. | 519 // FIXME: We'll be off by 1 when the width or height is even. |
519 LayoutPoint center = documentRect.center(); | 520 LayoutPoint center = documentRect.center(); |
520 // Make the rect we're checking (the point surrounded by padding rects) contai
ned inside the requested rect. (Note that -1/2 is 0.) | 521 // Make the rect we're checking (the point surrounded by padding rects) |
| 522 // contained inside the requested rect. (Note that -1/2 is 0.) |
521 LayoutSize padding((documentRect.width() - 1) / 2, | 523 LayoutSize padding((documentRect.width() - 1) / 2, |
522 (documentRect.height() - 1) / 2); | 524 (documentRect.height() - 1) / 2); |
523 HitTestResult result = frame->eventHandler().hitTestResultAtPoint( | 525 HitTestResult result = frame->eventHandler().hitTestResultAtPoint( |
524 center, HitTestRequest::ReadOnly | HitTestRequest::Active | | 526 center, HitTestRequest::ReadOnly | HitTestRequest::Active | |
525 HitTestRequest::ListBased, | 527 HitTestRequest::ListBased, |
526 padding); | 528 padding); |
527 const HitTestResult::NodeSet& nodes = result.listBasedTestResult(); | 529 const HitTestResult::NodeSet& nodes = result.listBasedTestResult(); |
528 if (nodes.size() != 1) | 530 if (nodes.size() != 1) |
529 return false; | 531 return false; |
530 return nodes.first().get() == m_element; | 532 return nodes.first().get() == m_element; |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
906 unclippedIntLocalRect = IntRect(); | 908 unclippedIntLocalRect = IntRect(); |
907 return; | 909 return; |
908 } | 910 } |
909 | 911 |
910 LayoutView* rootView = m_element->document().view()->layoutView(); | 912 LayoutView* rootView = m_element->document().view()->layoutView(); |
911 while (rootView->frame()->ownerLayoutObject()) | 913 while (rootView->frame()->ownerLayoutObject()) |
912 rootView = rootView->frame()->ownerLayoutObject()->view(); | 914 rootView = rootView->frame()->ownerLayoutObject()->view(); |
913 | 915 |
914 LayoutBox* box = toLayoutBox(ownerElement->layoutObject()); | 916 LayoutBox* box = toLayoutBox(ownerElement->layoutObject()); |
915 | 917 |
916 // Note: frameRect() for this plugin is equal to contentBoxRect, mapped to the
containing view space, and rounded off. | 918 // Note: frameRect() for this plugin is equal to contentBoxRect, mapped to the |
917 // See LayoutPart.cpp::updateWidgetGeometryInternal. To remove the lossy effec
t of rounding off, use contentBoxRect directly. | 919 // containing view space, and rounded off. |
| 920 // See LayoutPart.cpp::updateWidgetGeometryInternal. To remove the lossy |
| 921 // effect of rounding off, use contentBoxRect directly. |
918 LayoutRect unclippedAbsoluteRect(box->contentBoxRect()); | 922 LayoutRect unclippedAbsoluteRect(box->contentBoxRect()); |
919 box->mapToVisualRectInAncestorSpace(rootView, unclippedAbsoluteRect); | 923 box->mapToVisualRectInAncestorSpace(rootView, unclippedAbsoluteRect); |
920 | 924 |
921 // The frameRect is already in absolute space of the local frame to the plugin
. | 925 // The frameRect is already in absolute space of the local frame to the |
| 926 // plugin. |
922 windowRect = frameRect(); | 927 windowRect = frameRect(); |
923 // Map up to the root frame. | 928 // Map up to the root frame. |
924 LayoutRect layoutWindowRect = | 929 LayoutRect layoutWindowRect = |
925 LayoutRect(m_element->document() | 930 LayoutRect(m_element->document() |
926 .view() | 931 .view() |
927 ->layoutViewItem() | 932 ->layoutViewItem() |
928 .localToAbsoluteQuad(FloatQuad(FloatRect(frameRect())), | 933 .localToAbsoluteQuad(FloatQuad(FloatRect(frameRect())), |
929 TraverseDocumentBoundaries) | 934 TraverseDocumentBoundaries) |
930 .boundingBox()); | 935 .boundingBox()); |
931 // Finally, adjust for scrolling of the root frame, which the above does not t
ake into account. | 936 // Finally, adjust for scrolling of the root frame, which the above does not |
| 937 // take into account. |
932 layoutWindowRect.moveBy(-rootView->viewRect().location()); | 938 layoutWindowRect.moveBy(-rootView->viewRect().location()); |
933 windowRect = pixelSnappedIntRect(layoutWindowRect); | 939 windowRect = pixelSnappedIntRect(layoutWindowRect); |
934 | 940 |
935 LayoutRect layoutClippedLocalRect = unclippedAbsoluteRect; | 941 LayoutRect layoutClippedLocalRect = unclippedAbsoluteRect; |
936 LayoutRect unclippedLayoutLocalRect = layoutClippedLocalRect; | 942 LayoutRect unclippedLayoutLocalRect = layoutClippedLocalRect; |
937 layoutClippedLocalRect.intersect( | 943 layoutClippedLocalRect.intersect( |
938 LayoutRect(rootView->frameView()->visibleContentRect())); | 944 LayoutRect(rootView->frameView()->visibleContentRect())); |
939 | 945 |
940 unclippedIntLocalRect = | 946 unclippedIntLocalRect = |
941 box->absoluteToLocalQuad(FloatRect(unclippedLayoutLocalRect), | 947 box->absoluteToLocalQuad(FloatRect(unclippedLayoutLocalRect), |
942 TraverseDocumentBoundaries | UseTransforms) | 948 TraverseDocumentBoundaries | UseTransforms) |
943 .enclosingBoundingBox(); | 949 .enclosingBoundingBox(); |
944 // As a performance optimization, map the clipped rect separately if is differ
ent than the unclipped rect. | 950 // As a performance optimization, map the clipped rect separately if is |
| 951 // different than the unclipped rect. |
945 if (layoutClippedLocalRect != unclippedLayoutLocalRect) | 952 if (layoutClippedLocalRect != unclippedLayoutLocalRect) |
946 clippedLocalRect = | 953 clippedLocalRect = |
947 box->absoluteToLocalQuad(FloatRect(layoutClippedLocalRect), | 954 box->absoluteToLocalQuad(FloatRect(layoutClippedLocalRect), |
948 TraverseDocumentBoundaries | UseTransforms) | 955 TraverseDocumentBoundaries | UseTransforms) |
949 .enclosingBoundingBox(); | 956 .enclosingBoundingBox(); |
950 else | 957 else |
951 clippedLocalRect = unclippedIntLocalRect; | 958 clippedLocalRect = unclippedIntLocalRect; |
952 } | 959 } |
953 | 960 |
954 void WebPluginContainerImpl::calculateGeometry(IntRect& windowRect, | 961 void WebPluginContainerImpl::calculateGeometry(IntRect& windowRect, |
955 IntRect& clipRect, | 962 IntRect& clipRect, |
956 IntRect& unobscuredRect, | 963 IntRect& unobscuredRect, |
957 Vector<IntRect>& cutOutRects) { | 964 Vector<IntRect>& cutOutRects) { |
958 // document().layoutView() can be null when we receive messages from the | 965 // document().layoutView() can be null when we receive messages from the |
959 // plugins while we are destroying a frame. | 966 // plugins while we are destroying a frame. |
960 // FIXME: Can we just check m_element->document().isActive() ? | 967 // FIXME: Can we just check m_element->document().isActive() ? |
961 if (!m_element->layoutObject()->document().layoutViewItem().isNull()) { | 968 if (!m_element->layoutObject()->document().layoutViewItem().isNull()) { |
962 // Take our element and get the clip rect from the enclosing layer and | 969 // Take our element and get the clip rect from the enclosing layer and |
963 // frame view. | 970 // frame view. |
964 computeClipRectsForPlugin(m_element, windowRect, clipRect, unobscuredRect); | 971 computeClipRectsForPlugin(m_element, windowRect, clipRect, unobscuredRect); |
965 } | 972 } |
966 getPluginOcclusions(m_element, this->parent(), frameRect(), cutOutRects); | 973 getPluginOcclusions(m_element, this->parent(), frameRect(), cutOutRects); |
967 // Convert to the plugin position. | 974 // Convert to the plugin position. |
968 for (size_t i = 0; i < cutOutRects.size(); i++) | 975 for (size_t i = 0; i < cutOutRects.size(); i++) |
969 cutOutRects[i].move(-frameRect().x(), -frameRect().y()); | 976 cutOutRects[i].move(-frameRect().x(), -frameRect().y()); |
970 } | 977 } |
971 | 978 |
972 } // namespace blink | 979 } // namespace blink |
OLD | NEW |