| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
| 6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
| 7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 | 23 |
| 24 #include "bindings/core/v8/ExceptionMessages.h" | 24 #include "bindings/core/v8/ExceptionMessages.h" |
| 25 #include "bindings/core/v8/ExceptionState.h" | 25 #include "bindings/core/v8/ExceptionState.h" |
| 26 #include "core/accessibility/AXObjectCache.h" | 26 #include "core/accessibility/AXObjectCache.h" |
| 27 #include "core/dom/ExceptionCode.h" | 27 #include "core/dom/ExceptionCode.h" |
| 28 #include "core/events/Event.h" | 28 #include "core/events/Event.h" |
| 29 #include "core/frame/FrameView.h" | 29 #include "core/frame/FrameView.h" |
| 30 #include "core/frame/LocalFrame.h" | 30 #include "core/frame/LocalFrame.h" |
| 31 #include "core/loader/FrameLoader.h" | 31 #include "core/loader/FrameLoader.h" |
| 32 #include "core/loader/FrameLoaderClient.h" | 32 #include "core/loader/FrameLoaderClient.h" |
| 33 #include "core/plugins/PluginView.h" |
| 33 #include "core/rendering/RenderLayer.h" | 34 #include "core/rendering/RenderLayer.h" |
| 34 #include "core/rendering/RenderPart.h" | 35 #include "core/rendering/RenderPart.h" |
| 35 #include "core/rendering/compositing/RenderLayerCompositor.h" | 36 #include "core/rendering/compositing/RenderLayerCompositor.h" |
| 36 #include "platform/weborigin/SecurityOrigin.h" | 37 #include "platform/weborigin/SecurityOrigin.h" |
| 37 | 38 |
| 38 namespace blink { | 39 namespace blink { |
| 39 | 40 |
| 40 typedef HashMap<RefPtr<Widget>, FrameView*> WidgetToParentMap; | 41 typedef WillBeHeapHashMap<RefPtrWillBeMember<Widget>, RawPtrWillBeMember<FrameVi
ew> > WidgetToParentMap; |
| 41 static WidgetToParentMap& widgetNewParentMap() | 42 static WidgetToParentMap& widgetNewParentMap() |
| 42 { | 43 { |
| 43 DEFINE_STATIC_LOCAL(WidgetToParentMap, map, ()); | 44 DEFINE_STATIC_LOCAL(OwnPtrWillBePersistent<WidgetToParentMap>, map, (adoptPt
rWillBeNoop(new WidgetToParentMap()))); |
| 44 return map; | 45 return *map; |
| 45 } | 46 } |
| 46 | 47 |
| 47 WillBeHeapHashCountedSet<RawPtrWillBeMember<Node> >& SubframeLoadingDisabler::di
sabledSubtreeRoots() | 48 WillBeHeapHashCountedSet<RawPtrWillBeMember<Node> >& SubframeLoadingDisabler::di
sabledSubtreeRoots() |
| 48 { | 49 { |
| 49 DEFINE_STATIC_LOCAL(OwnPtrWillBePersistent<WillBeHeapHashCountedSet<RawPtrWi
llBeMember<Node> > >, nodes, (adoptPtrWillBeNoop(new WillBeHeapHashCountedSet<Ra
wPtrWillBeMember<Node> >()))); | 50 DEFINE_STATIC_LOCAL(OwnPtrWillBePersistent<WillBeHeapHashCountedSet<RawPtrWi
llBeMember<Node> > >, nodes, (adoptPtrWillBeNoop(new WillBeHeapHashCountedSet<Ra
wPtrWillBeMember<Node> >()))); |
| 50 return *nodes; | 51 return *nodes; |
| 51 } | 52 } |
| 52 | 53 |
| 53 static unsigned s_updateSuspendCount = 0; | 54 static unsigned s_updateSuspendCount = 0; |
| 54 | 55 |
| 55 HTMLFrameOwnerElement::UpdateSuspendScope::UpdateSuspendScope() | 56 HTMLFrameOwnerElement::UpdateSuspendScope::UpdateSuspendScope() |
| 56 { | 57 { |
| 57 ++s_updateSuspendCount; | 58 ++s_updateSuspendCount; |
| 58 } | 59 } |
| 59 | 60 |
| 60 void HTMLFrameOwnerElement::UpdateSuspendScope::performDeferredWidgetTreeOperati
ons() | 61 void HTMLFrameOwnerElement::UpdateSuspendScope::performDeferredWidgetTreeOperati
ons() |
| 61 { | 62 { |
| 62 WidgetToParentMap map; | 63 WidgetToParentMap map; |
| 63 widgetNewParentMap().swap(map); | 64 widgetNewParentMap().swap(map); |
| 64 WidgetToParentMap::iterator end = map.end(); | 65 WidgetToParentMap::iterator end = map.end(); |
| 65 for (WidgetToParentMap::iterator it = map.begin(); it != end; ++it) { | 66 for (WidgetToParentMap::iterator it = map.begin(); it != end; ++it) { |
| 66 Widget* child = it->key.get(); | 67 Widget* child = it->key.get(); |
| 67 FrameView* currentParent = toFrameView(child->parent()); | 68 FrameView* currentParent = toFrameView(child->parent()); |
| 68 FrameView* newParent = it->value; | 69 FrameView* newParent = it->value; |
| 69 if (newParent != currentParent) { | 70 if (newParent != currentParent) { |
| 70 if (currentParent) | 71 if (currentParent) |
| 71 currentParent->removeChild(child); | 72 currentParent->removeChild(child); |
| 72 if (newParent) | 73 if (newParent) |
| 73 newParent->addChild(child); | 74 newParent->addChild(child); |
| 75 #if ENABLE(OILPAN) |
| 76 if (currentParent && !newParent) |
| 77 child->dispose(); |
| 78 #endif |
| 74 } | 79 } |
| 75 } | 80 } |
| 76 } | 81 } |
| 77 | 82 |
| 78 HTMLFrameOwnerElement::UpdateSuspendScope::~UpdateSuspendScope() | 83 HTMLFrameOwnerElement::UpdateSuspendScope::~UpdateSuspendScope() |
| 79 { | 84 { |
| 80 ASSERT(s_updateSuspendCount > 0); | 85 ASSERT(s_updateSuspendCount > 0); |
| 81 if (s_updateSuspendCount == 1) | 86 if (s_updateSuspendCount == 1) |
| 82 performDeferredWidgetTreeOperations(); | 87 performDeferredWidgetTreeOperations(); |
| 83 --s_updateSuspendCount; | 88 --s_updateSuspendCount; |
| 84 } | 89 } |
| 85 | 90 |
| 86 static void moveWidgetToParentSoon(Widget* child, FrameView* parent) | 91 static void moveWidgetToParentSoon(Widget* child, FrameView* parent) |
| 87 { | 92 { |
| 88 if (!s_updateSuspendCount) { | 93 if (!s_updateSuspendCount) { |
| 89 if (parent) | 94 if (parent) { |
| 90 parent->addChild(child); | 95 parent->addChild(child); |
| 91 else if (toFrameView(child->parent())) | 96 } else if (toFrameView(child->parent())) { |
| 92 toFrameView(child->parent())->removeChild(child); | 97 toFrameView(child->parent())->removeChild(child); |
| 98 #if ENABLE(OILPAN) |
| 99 child->dispose(); |
| 100 #endif |
| 101 } |
| 93 return; | 102 return; |
| 94 } | 103 } |
| 95 widgetNewParentMap().set(child, parent); | 104 widgetNewParentMap().set(child, parent); |
| 96 } | 105 } |
| 97 | 106 |
| 98 HTMLFrameOwnerElement::HTMLFrameOwnerElement(const QualifiedName& tagName, Docum
ent& document) | 107 HTMLFrameOwnerElement::HTMLFrameOwnerElement(const QualifiedName& tagName, Docum
ent& document) |
| 99 : HTMLElement(tagName, document) | 108 : HTMLElement(tagName, document) |
| 100 , m_contentFrame(nullptr) | 109 , m_contentFrame(nullptr) |
| 101 , m_widget(nullptr) | 110 , m_widget(nullptr) |
| 102 , m_sandboxFlags(SandboxNone) | 111 , m_sandboxFlags(SandboxNone) |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 } | 145 } |
| 137 | 146 |
| 138 void HTMLFrameOwnerElement::disconnectContentFrame() | 147 void HTMLFrameOwnerElement::disconnectContentFrame() |
| 139 { | 148 { |
| 140 // FIXME: Currently we don't do this in removedFrom because this causes an | 149 // FIXME: Currently we don't do this in removedFrom because this causes an |
| 141 // unload event in the subframe which could execute script that could then | 150 // unload event in the subframe which could execute script that could then |
| 142 // reach up into this document and then attempt to look back down. We should | 151 // reach up into this document and then attempt to look back down. We should |
| 143 // see if this behavior is really needed as Gecko does not allow this. | 152 // see if this behavior is really needed as Gecko does not allow this. |
| 144 if (RefPtrWillBeRawPtr<Frame> frame = contentFrame()) { | 153 if (RefPtrWillBeRawPtr<Frame> frame = contentFrame()) { |
| 145 frame->detach(); | 154 frame->detach(); |
| 146 #if ENABLE(OILPAN) | |
| 147 // FIXME: Oilpan: the plugin container is released and finalized here | |
| 148 // in order to work around the current inability to make the plugin | |
| 149 // container a FrameDestructionObserver (it needs to effectively be on | |
| 150 // the heap, and Widget isn't). Hence, release it here while its | |
| 151 // frame reference is still valid. | |
| 152 if (m_widget && m_widget->isPluginContainer()) | |
| 153 m_widget = nullptr; | |
| 154 #endif | |
| 155 frame->disconnectOwnerElement(); | 155 frame->disconnectOwnerElement(); |
| 156 } | 156 } |
| 157 #if ENABLE(OILPAN) |
| 158 // Oilpan: a plugin container must be explicitly disposed before it |
| 159 // is swept and finalized. This is because the underlying plugin needs |
| 160 // to be able to access a fully-functioning frame (and all it refers |
| 161 // to) while it destructs and cleans out its resources. |
| 162 if (m_widget) { |
| 163 m_widget->dispose(); |
| 164 m_widget = nullptr; |
| 165 } |
| 166 #endif |
| 157 } | 167 } |
| 158 | 168 |
| 159 HTMLFrameOwnerElement::~HTMLFrameOwnerElement() | 169 HTMLFrameOwnerElement::~HTMLFrameOwnerElement() |
| 160 { | 170 { |
| 161 #if ENABLE(OILPAN) | 171 #if ENABLE(OILPAN) |
| 162 // An owner must by now have been informed of detachment | 172 // An owner must by now have been informed of detachment |
| 163 // when the frame was closed. | 173 // when the frame was closed. |
| 164 ASSERT(!m_contentFrame); | 174 ASSERT(!m_contentFrame); |
| 165 #else | 175 #else |
| 166 if (m_contentFrame) | 176 if (m_contentFrame) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 194 } | 204 } |
| 195 | 205 |
| 196 Document* HTMLFrameOwnerElement::getSVGDocument(ExceptionState& exceptionState)
const | 206 Document* HTMLFrameOwnerElement::getSVGDocument(ExceptionState& exceptionState)
const |
| 197 { | 207 { |
| 198 Document* doc = contentDocument(); | 208 Document* doc = contentDocument(); |
| 199 if (doc && doc->isSVGDocument()) | 209 if (doc && doc->isSVGDocument()) |
| 200 return doc; | 210 return doc; |
| 201 return 0; | 211 return 0; |
| 202 } | 212 } |
| 203 | 213 |
| 204 void HTMLFrameOwnerElement::setWidget(PassRefPtr<Widget> widget) | 214 void HTMLFrameOwnerElement::setWidget(PassRefPtrWillBeRawPtr<Widget> widget) |
| 205 { | 215 { |
| 206 if (widget == m_widget) | 216 if (widget == m_widget) |
| 207 return; | 217 return; |
| 208 | 218 |
| 209 if (m_widget) { | 219 if (m_widget) { |
| 210 if (m_widget->parent()) | 220 if (m_widget->parent()) |
| 211 moveWidgetToParentSoon(m_widget.get(), 0); | 221 moveWidgetToParentSoon(m_widget.get(), 0); |
| 212 m_widget = nullptr; | 222 m_widget = nullptr; |
| 213 } | 223 } |
| 214 | 224 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 | 260 |
| 251 if (!SubframeLoadingDisabler::canLoadFrame(*this)) | 261 if (!SubframeLoadingDisabler::canLoadFrame(*this)) |
| 252 return false; | 262 return false; |
| 253 | 263 |
| 254 return parentFrame->loader().client()->createFrame(url, frameName, this); | 264 return parentFrame->loader().client()->createFrame(url, frameName, this); |
| 255 } | 265 } |
| 256 | 266 |
| 257 void HTMLFrameOwnerElement::trace(Visitor* visitor) | 267 void HTMLFrameOwnerElement::trace(Visitor* visitor) |
| 258 { | 268 { |
| 259 visitor->trace(m_contentFrame); | 269 visitor->trace(m_contentFrame); |
| 270 visitor->trace(m_widget); |
| 260 HTMLElement::trace(visitor); | 271 HTMLElement::trace(visitor); |
| 261 FrameOwner::trace(visitor); | 272 FrameOwner::trace(visitor); |
| 262 } | 273 } |
| 263 | 274 |
| 264 | 275 |
| 265 } // namespace blink | 276 } // namespace blink |
| OLD | NEW |