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 |