| 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 element = element->ParentOrShadowHostElement(); | 147 element = element->ParentOrShadowHostElement(); |
| 148 return element; | 148 return element; |
| 149 } | 149 } |
| 150 | 150 |
| 151 // Return a set of rectangles that should not be overdrawn by the | 151 // Return a set of rectangles that should not be overdrawn by the |
| 152 // plugin ("cutouts"). This helps implement the "iframe shim" | 152 // plugin ("cutouts"). This helps implement the "iframe shim" |
| 153 // technique of overlaying a windowed plugin with content from the | 153 // technique of overlaying a windowed plugin with content from the |
| 154 // page. In a nutshell, iframe elements should occlude plugins when | 154 // page. In a nutshell, iframe elements should occlude plugins when |
| 155 // they occur higher in the stacking order. | 155 // they occur higher in the stacking order. |
| 156 void GetPluginOcclusions(Element* element, | 156 void GetPluginOcclusions(Element* element, |
| 157 FrameViewBase* parent, | 157 FrameView* parent, |
| 158 const IntRect& frame_rect, | 158 const IntRect& frame_rect, |
| 159 Vector<IntRect>& occlusions) { | 159 Vector<IntRect>& occlusions) { |
| 160 LayoutObject* plugin_node = element->GetLayoutObject(); | 160 LayoutObject* plugin_node = element->GetLayoutObject(); |
| 161 ASSERT(plugin_node); | 161 ASSERT(plugin_node); |
| 162 if (!plugin_node->Style()) | 162 if (!plugin_node->Style()) |
| 163 return; | 163 return; |
| 164 Vector<const LayoutObject*> plugin_zstack; | 164 Vector<const LayoutObject*> plugin_zstack; |
| 165 Vector<const LayoutObject*> iframe_zstack; | 165 Vector<const LayoutObject*> iframe_zstack; |
| 166 GetObjectStack(plugin_node, &plugin_zstack); | 166 GetObjectStack(plugin_node, &plugin_zstack); |
| 167 | 167 |
| 168 if (!parent->IsFrameView()) | |
| 169 return; | |
| 170 | |
| 171 FrameView* parent_frame_view = ToFrameView(parent); | |
| 172 | |
| 173 // Occlusions by iframes. | 168 // Occlusions by iframes. |
| 174 const FrameView::ChildrenSet* children = parent_frame_view->Children(); | 169 for (const auto& child : parent->Children()) { |
| 175 for (FrameView::ChildrenSet::const_iterator it = children->begin(); | 170 if (!child->IsFrameView()) |
| 176 it != children->end(); ++it) { | |
| 177 // We only care about FrameView's because iframes show up as FrameViews. | |
| 178 if (!(*it)->IsFrameView()) | |
| 179 continue; | 171 continue; |
| 180 | 172 |
| 181 const FrameView* frame_view = ToFrameView(it->Get()); | 173 const FrameView* frame_view = ToFrameView(child); |
| 182 // Check to make sure we can get both the element and the LayoutObject | 174 // Check to make sure we can get both the element and the LayoutObject |
| 183 // for this FrameView, if we can't just move on to the next object. | 175 // for this FrameView, if we can't just move on to the next object. |
| 184 // FIXME: Plugin occlusion by remote frames is probably broken. | 176 // FIXME: Plugin occlusion by remote frames is probably broken. |
| 185 HTMLElement* element = frame_view->GetFrame().DeprecatedLocalOwner(); | 177 HTMLElement* element = frame_view->GetFrame().DeprecatedLocalOwner(); |
| 186 if (!element || !element->GetLayoutObject()) | 178 if (!element || !element->GetLayoutObject()) |
| 187 continue; | 179 continue; |
| 188 | 180 |
| 189 LayoutObject* iframe_renderer = element->GetLayoutObject(); | 181 LayoutObject* iframe_renderer = element->GetLayoutObject(); |
| 190 | 182 |
| 191 if (isHTMLIFrameElement(*element) && | 183 if (isHTMLIFrameElement(*element) && |
| 192 IntersectsRect(iframe_renderer, frame_rect)) { | 184 IntersectsRect(iframe_renderer, frame_rect)) { |
| 193 GetObjectStack(iframe_renderer, &iframe_zstack); | 185 GetObjectStack(iframe_renderer, &iframe_zstack); |
| 194 if (IframeIsAbovePlugin(iframe_zstack, plugin_zstack)) | 186 if (IframeIsAbovePlugin(iframe_zstack, plugin_zstack)) |
| 195 AddToOcclusions(ToLayoutBox(iframe_renderer), occlusions); | 187 AddToOcclusions(ToLayoutBox(iframe_renderer), occlusions); |
| 196 } | 188 } |
| 197 } | 189 } |
| 198 | 190 |
| 199 // Occlusions by top layer elements. | 191 // Occlusions by top layer elements. |
| 200 // FIXME: There's no handling yet for the interaction between top layer and | 192 // FIXME: There's no handling yet for the interaction between top layer and |
| 201 // iframes. For example, a plugin in the top layer will be occluded by an | 193 // iframes. For example, a plugin in the top layer will be occluded by an |
| 202 // iframe. And a plugin inside an iframe in the top layer won't be respected | 194 // iframe. And a plugin inside an iframe in the top layer won't be respected |
| 203 // as being in the top layer. | 195 // as being in the top layer. |
| 204 const Element* ancestor = TopLayerAncestor(element); | 196 const Element* ancestor = TopLayerAncestor(element); |
| 205 Document* document = parent_frame_view->GetFrame().GetDocument(); | 197 Document* document = parent->GetFrame().GetDocument(); |
| 206 const HeapVector<Member<Element>>& elements = document->TopLayerElements(); | 198 const HeapVector<Member<Element>>& elements = document->TopLayerElements(); |
| 207 size_t start = ancestor ? elements.Find(ancestor) + 1 : 0; | 199 size_t start = ancestor ? elements.Find(ancestor) + 1 : 0; |
| 208 for (size_t i = start; i < elements.size(); ++i) | 200 for (size_t i = start; i < elements.size(); ++i) |
| 209 AddTreeToOcclusions(elements[i]->GetLayoutObject(), frame_rect, occlusions); | 201 AddTreeToOcclusions(elements[i]->GetLayoutObject(), frame_rect, occlusions); |
| 210 } | 202 } |
| 211 | 203 |
| 212 } // namespace blink | 204 } // namespace blink |
| OLD | NEW |