OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 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 19 matching lines...) Expand all Loading... |
30 | 30 |
31 #include "config.h" | 31 #include "config.h" |
32 #include "core/plugins/PluginOcclusionSupport.h" | 32 #include "core/plugins/PluginOcclusionSupport.h" |
33 | 33 |
34 #include "core/HTMLNames.h" | 34 #include "core/HTMLNames.h" |
35 #include "core/dom/Element.h" | 35 #include "core/dom/Element.h" |
36 #include "core/frame/FrameView.h" | 36 #include "core/frame/FrameView.h" |
37 #include "core/frame/LocalFrame.h" | 37 #include "core/frame/LocalFrame.h" |
38 #include "core/html/HTMLElement.h" | 38 #include "core/html/HTMLElement.h" |
39 #include "core/html/HTMLFrameOwnerElement.h" | 39 #include "core/html/HTMLFrameOwnerElement.h" |
| 40 #include "core/layout/LayoutBox.h" |
40 #include "core/layout/LayoutObject.h" | 41 #include "core/layout/LayoutObject.h" |
41 #include "core/rendering/RenderBox.h" | |
42 #include "platform/Widget.h" | 42 #include "platform/Widget.h" |
43 #include "wtf/HashSet.h" | 43 #include "wtf/HashSet.h" |
44 | 44 |
45 // This file provides a utility function to support rendering certain elements a
bove plugins. | 45 // This file provides a utility function to support rendering certain elements a
bove plugins. |
46 | 46 |
47 namespace blink { | 47 namespace blink { |
48 | 48 |
49 static void getObjectStack(const LayoutObject* ro, Vector<const LayoutObject*>*
roStack) | 49 static void getObjectStack(const LayoutObject* ro, Vector<const LayoutObject*>*
roStack) |
50 { | 50 { |
51 roStack->clear(); | 51 roStack->clear(); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 } | 112 } |
113 return true; | 113 return true; |
114 } | 114 } |
115 | 115 |
116 static bool intersectsRect(const LayoutObject* renderer, const IntRect& rect) | 116 static bool intersectsRect(const LayoutObject* renderer, const IntRect& rect) |
117 { | 117 { |
118 return renderer->absoluteBoundingBoxRectIgnoringTransforms().intersects(rect
) | 118 return renderer->absoluteBoundingBoxRectIgnoringTransforms().intersects(rect
) |
119 && (!renderer->style() || renderer->style()->visibility() == VISIBLE); | 119 && (!renderer->style() || renderer->style()->visibility() == VISIBLE); |
120 } | 120 } |
121 | 121 |
122 static void addToOcclusions(const RenderBox* renderer, Vector<IntRect>& occlusio
ns) | 122 static void addToOcclusions(const LayoutBox* renderer, Vector<IntRect>& occlusio
ns) |
123 { | 123 { |
124 occlusions.append(IntRect( | 124 occlusions.append(IntRect( |
125 roundedIntPoint(renderer->localToAbsolute()), | 125 roundedIntPoint(renderer->localToAbsolute()), |
126 flooredIntSize(renderer->size()))); | 126 flooredIntSize(renderer->size()))); |
127 } | 127 } |
128 | 128 |
129 static void addTreeToOcclusions(const LayoutObject* renderer, const IntRect& fra
meRect, Vector<IntRect>& occlusions) | 129 static void addTreeToOcclusions(const LayoutObject* renderer, const IntRect& fra
meRect, Vector<IntRect>& occlusions) |
130 { | 130 { |
131 if (!renderer) | 131 if (!renderer) |
132 return; | 132 return; |
133 if (renderer->isBox() && intersectsRect(renderer, frameRect)) | 133 if (renderer->isBox() && intersectsRect(renderer, frameRect)) |
134 addToOcclusions(toRenderBox(renderer), occlusions); | 134 addToOcclusions(toLayoutBox(renderer), occlusions); |
135 for (LayoutObject* child = renderer->slowFirstChild(); child; child = child-
>nextSibling()) | 135 for (LayoutObject* child = renderer->slowFirstChild(); child; child = child-
>nextSibling()) |
136 addTreeToOcclusions(child, frameRect, occlusions); | 136 addTreeToOcclusions(child, frameRect, occlusions); |
137 } | 137 } |
138 | 138 |
139 static const Element* topLayerAncestor(const Element* element) | 139 static const Element* topLayerAncestor(const Element* element) |
140 { | 140 { |
141 while (element && !element->isInTopLayer()) | 141 while (element && !element->isInTopLayer()) |
142 element = element->parentOrShadowHostElement(); | 142 element = element->parentOrShadowHostElement(); |
143 return element; | 143 return element; |
144 } | 144 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 // FIXME: Plugin occlusion by remote frames is probably broken. | 176 // FIXME: Plugin occlusion by remote frames is probably broken. |
177 HTMLElement* element = frameView->frame().deprecatedLocalOwner(); | 177 HTMLElement* element = frameView->frame().deprecatedLocalOwner(); |
178 if (!element || !element->renderer()) | 178 if (!element || !element->renderer()) |
179 continue; | 179 continue; |
180 | 180 |
181 LayoutObject* iframeRenderer = element->renderer(); | 181 LayoutObject* iframeRenderer = element->renderer(); |
182 | 182 |
183 if (isHTMLIFrameElement(*element) && intersectsRect(iframeRenderer, fram
eRect)) { | 183 if (isHTMLIFrameElement(*element) && intersectsRect(iframeRenderer, fram
eRect)) { |
184 getObjectStack(iframeRenderer, &iframeZstack); | 184 getObjectStack(iframeRenderer, &iframeZstack); |
185 if (iframeIsAbovePlugin(iframeZstack, pluginZstack)) | 185 if (iframeIsAbovePlugin(iframeZstack, pluginZstack)) |
186 addToOcclusions(toRenderBox(iframeRenderer), occlusions); | 186 addToOcclusions(toLayoutBox(iframeRenderer), occlusions); |
187 } | 187 } |
188 } | 188 } |
189 | 189 |
190 // Occlusions by top layer elements. | 190 // Occlusions by top layer elements. |
191 // FIXME: There's no handling yet for the interaction between top layer and | 191 // FIXME: There's no handling yet for the interaction between top layer and |
192 // iframes. For example, a plugin in the top layer will be occluded by an | 192 // iframes. For example, a plugin in the top layer will be occluded by an |
193 // iframe. And a plugin inside an iframe in the top layer won't be respected | 193 // iframe. And a plugin inside an iframe in the top layer won't be respected |
194 // as being in the top layer. | 194 // as being in the top layer. |
195 const Element* ancestor = topLayerAncestor(element); | 195 const Element* ancestor = topLayerAncestor(element); |
196 Document* document = parentFrameView->frame().document(); | 196 Document* document = parentFrameView->frame().document(); |
197 const WillBeHeapVector<RefPtrWillBeMember<Element> >& elements = document->t
opLayerElements(); | 197 const WillBeHeapVector<RefPtrWillBeMember<Element> >& elements = document->t
opLayerElements(); |
198 size_t start = ancestor ? elements.find(ancestor) + 1 : 0; | 198 size_t start = ancestor ? elements.find(ancestor) + 1 : 0; |
199 for (size_t i = start; i < elements.size(); ++i) | 199 for (size_t i = start; i < elements.size(); ++i) |
200 addTreeToOcclusions(elements[i]->renderer(), frameRect, occlusions); | 200 addTreeToOcclusions(elements[i]->renderer(), frameRect, occlusions); |
201 } | 201 } |
202 | 202 |
203 } // namespace blink | 203 } // namespace blink |
OLD | NEW |