| 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 20 matching lines...) Expand all Loading... |
| 31 #include "core/frame/LocalFrameClient.h" | 31 #include "core/frame/LocalFrameClient.h" |
| 32 #include "core/layout/LayoutPart.h" | 32 #include "core/layout/LayoutPart.h" |
| 33 #include "core/layout/api/LayoutPartItem.h" | 33 #include "core/layout/api/LayoutPartItem.h" |
| 34 #include "core/loader/FrameLoadRequest.h" | 34 #include "core/loader/FrameLoadRequest.h" |
| 35 #include "core/loader/FrameLoader.h" | 35 #include "core/loader/FrameLoader.h" |
| 36 #include "core/plugins/PluginView.h" | 36 #include "core/plugins/PluginView.h" |
| 37 #include "platform/weborigin/SecurityOrigin.h" | 37 #include "platform/weborigin/SecurityOrigin.h" |
| 38 | 38 |
| 39 namespace blink { | 39 namespace blink { |
| 40 | 40 |
| 41 typedef HeapHashMap<Member<Widget>, Member<FrameView>> WidgetToParentMap; | 41 typedef HeapHashMap<Member<FrameViewBase>, Member<FrameView>> |
| 42 static WidgetToParentMap& widgetNewParentMap() { | 42 FrameViewBaseToParentMap; |
| 43 DEFINE_STATIC_LOCAL(WidgetToParentMap, map, (new WidgetToParentMap)); | 43 static FrameViewBaseToParentMap& widgetNewParentMap() { |
| 44 DEFINE_STATIC_LOCAL(FrameViewBaseToParentMap, map, |
| 45 (new FrameViewBaseToParentMap)); |
| 44 return map; | 46 return map; |
| 45 } | 47 } |
| 46 | 48 |
| 47 using WidgetSet = HeapHashSet<Member<Widget>>; | 49 using FrameViewBaseSet = HeapHashSet<Member<FrameViewBase>>; |
| 48 static WidgetSet& widgetsPendingTemporaryRemovalFromParent() { | 50 static FrameViewBaseSet& widgetsPendingTemporaryRemovalFromParent() { |
| 49 // Widgets in this set will not leak because it will be cleared in | 51 // FrameViewBases in this set will not leak because it will be cleared in |
| 50 // HTMLFrameOwnerElement::UpdateSuspendScope::performDeferredWidgetTreeOperati
ons. | 52 // HTMLFrameOwnerElement::UpdateSuspendScope::performDeferredWidgetTreeOperati
ons. |
| 51 DEFINE_STATIC_LOCAL(WidgetSet, set, (new WidgetSet)); | 53 DEFINE_STATIC_LOCAL(FrameViewBaseSet, set, (new FrameViewBaseSet)); |
| 52 return set; | 54 return set; |
| 53 } | 55 } |
| 54 | 56 |
| 55 static WidgetSet& widgetsPendingDispose() { | 57 static FrameViewBaseSet& widgetsPendingDispose() { |
| 56 DEFINE_STATIC_LOCAL(WidgetSet, set, (new WidgetSet)); | 58 DEFINE_STATIC_LOCAL(FrameViewBaseSet, set, (new FrameViewBaseSet)); |
| 57 return set; | 59 return set; |
| 58 } | 60 } |
| 59 | 61 |
| 60 SubframeLoadingDisabler::SubtreeRootSet& | 62 SubframeLoadingDisabler::SubtreeRootSet& |
| 61 SubframeLoadingDisabler::disabledSubtreeRoots() { | 63 SubframeLoadingDisabler::disabledSubtreeRoots() { |
| 62 DEFINE_STATIC_LOCAL(SubtreeRootSet, nodes, ()); | 64 DEFINE_STATIC_LOCAL(SubtreeRootSet, nodes, ()); |
| 63 return nodes; | 65 return nodes; |
| 64 } | 66 } |
| 65 | 67 |
| 66 static unsigned s_updateSuspendCount = 0; | 68 static unsigned s_updateSuspendCount = 0; |
| 67 | 69 |
| 68 HTMLFrameOwnerElement::UpdateSuspendScope::UpdateSuspendScope() { | 70 HTMLFrameOwnerElement::UpdateSuspendScope::UpdateSuspendScope() { |
| 69 ++s_updateSuspendCount; | 71 ++s_updateSuspendCount; |
| 70 } | 72 } |
| 71 | 73 |
| 72 void HTMLFrameOwnerElement::UpdateSuspendScope:: | 74 void HTMLFrameOwnerElement::UpdateSuspendScope:: |
| 73 performDeferredWidgetTreeOperations() { | 75 performDeferredWidgetTreeOperations() { |
| 74 WidgetToParentMap map; | 76 FrameViewBaseToParentMap map; |
| 75 widgetNewParentMap().swap(map); | 77 widgetNewParentMap().swap(map); |
| 76 for (const auto& widget : map) { | 78 for (const auto& frameViewBase : map) { |
| 77 Widget* child = widget.key.get(); | 79 FrameViewBase* child = frameViewBase.key.get(); |
| 78 FrameView* currentParent = toFrameView(child->parent()); | 80 FrameView* currentParent = toFrameView(child->parent()); |
| 79 FrameView* newParent = widget.value; | 81 FrameView* newParent = frameViewBase.value; |
| 80 if (newParent != currentParent) { | 82 if (newParent != currentParent) { |
| 81 if (currentParent) | 83 if (currentParent) |
| 82 currentParent->removeChild(child); | 84 currentParent->removeChild(child); |
| 83 if (newParent) | 85 if (newParent) |
| 84 newParent->addChild(child); | 86 newParent->addChild(child); |
| 85 if (currentParent && !newParent) | 87 if (currentParent && !newParent) |
| 86 child->dispose(); | 88 child->dispose(); |
| 87 } | 89 } |
| 88 } | 90 } |
| 89 | 91 |
| 90 { | 92 { |
| 91 WidgetSet set; | 93 FrameViewBaseSet set; |
| 92 widgetsPendingTemporaryRemovalFromParent().swap(set); | 94 widgetsPendingTemporaryRemovalFromParent().swap(set); |
| 93 for (const auto& widget : set) { | 95 for (const auto& frameViewBase : set) { |
| 94 FrameView* currentParent = toFrameView(widget->parent()); | 96 FrameView* currentParent = toFrameView(frameViewBase->parent()); |
| 95 if (currentParent) | 97 if (currentParent) |
| 96 currentParent->removeChild(widget.get()); | 98 currentParent->removeChild(frameViewBase.get()); |
| 97 } | 99 } |
| 98 } | 100 } |
| 99 | 101 |
| 100 { | 102 { |
| 101 WidgetSet set; | 103 FrameViewBaseSet set; |
| 102 widgetsPendingDispose().swap(set); | 104 widgetsPendingDispose().swap(set); |
| 103 for (const auto& widget : set) { | 105 for (const auto& frameViewBase : set) { |
| 104 widget->dispose(); | 106 frameViewBase->dispose(); |
| 105 } | 107 } |
| 106 } | 108 } |
| 107 } | 109 } |
| 108 | 110 |
| 109 HTMLFrameOwnerElement::UpdateSuspendScope::~UpdateSuspendScope() { | 111 HTMLFrameOwnerElement::UpdateSuspendScope::~UpdateSuspendScope() { |
| 110 DCHECK_GT(s_updateSuspendCount, 0u); | 112 DCHECK_GT(s_updateSuspendCount, 0u); |
| 111 if (s_updateSuspendCount == 1) | 113 if (s_updateSuspendCount == 1) |
| 112 performDeferredWidgetTreeOperations(); | 114 performDeferredWidgetTreeOperations(); |
| 113 --s_updateSuspendCount; | 115 --s_updateSuspendCount; |
| 114 } | 116 } |
| 115 | 117 |
| 116 // Unlike moveWidgetToParentSoon, this will not call dispose the Widget. | 118 // Unlike moveWidgetToParentSoon, this will not call dispose the Widget. |
| 117 void temporarilyRemoveWidgetFromParentSoon(Widget* widget) { | 119 void temporarilyRemoveWidgetFromParentSoon(FrameViewBase* frameViewBase) { |
| 118 if (s_updateSuspendCount) { | 120 if (s_updateSuspendCount) { |
| 119 widgetsPendingTemporaryRemovalFromParent().insert(widget); | 121 widgetsPendingTemporaryRemovalFromParent().insert(frameViewBase); |
| 120 } else { | 122 } else { |
| 121 if (toFrameView(widget->parent())) | 123 if (toFrameView(frameViewBase->parent())) |
| 122 toFrameView(widget->parent())->removeChild(widget); | 124 toFrameView(frameViewBase->parent())->removeChild(frameViewBase); |
| 123 } | 125 } |
| 124 } | 126 } |
| 125 | 127 |
| 126 void moveWidgetToParentSoon(Widget* child, FrameView* parent) { | 128 void moveWidgetToParentSoon(FrameViewBase* child, FrameView* parent) { |
| 127 if (!s_updateSuspendCount) { | 129 if (!s_updateSuspendCount) { |
| 128 if (parent) { | 130 if (parent) { |
| 129 parent->addChild(child); | 131 parent->addChild(child); |
| 130 } else if (toFrameView(child->parent())) { | 132 } else if (toFrameView(child->parent())) { |
| 131 toFrameView(child->parent())->removeChild(child); | 133 toFrameView(child->parent())->removeChild(child); |
| 132 child->dispose(); | 134 child->dispose(); |
| 133 } | 135 } |
| 134 return; | 136 return; |
| 135 } | 137 } |
| 136 widgetNewParentMap().set(child, parent); | 138 widgetNewParentMap().set(child, parent); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 // the subframe hasn't been created yet. | 208 // the subframe hasn't been created yet. |
| 207 if (contentFrame()) | 209 if (contentFrame()) |
| 208 document().frame()->loader().client()->didChangeSandboxFlags(contentFrame(), | 210 document().frame()->loader().client()->didChangeSandboxFlags(contentFrame(), |
| 209 flags); | 211 flags); |
| 210 } | 212 } |
| 211 | 213 |
| 212 bool HTMLFrameOwnerElement::isKeyboardFocusable() const { | 214 bool HTMLFrameOwnerElement::isKeyboardFocusable() const { |
| 213 return m_contentFrame && HTMLElement::isKeyboardFocusable(); | 215 return m_contentFrame && HTMLElement::isKeyboardFocusable(); |
| 214 } | 216 } |
| 215 | 217 |
| 216 void HTMLFrameOwnerElement::disposeWidgetSoon(Widget* widget) { | 218 void HTMLFrameOwnerElement::disposeWidgetSoon(FrameViewBase* frameViewBase) { |
| 217 if (s_updateSuspendCount) { | 219 if (s_updateSuspendCount) { |
| 218 widgetsPendingDispose().insert(widget); | 220 widgetsPendingDispose().insert(frameViewBase); |
| 219 return; | 221 return; |
| 220 } | 222 } |
| 221 widget->dispose(); | 223 frameViewBase->dispose(); |
| 222 } | 224 } |
| 223 | 225 |
| 224 void HTMLFrameOwnerElement::dispatchLoad() { | 226 void HTMLFrameOwnerElement::dispatchLoad() { |
| 225 dispatchScopedEvent(Event::create(EventTypeNames::load)); | 227 dispatchScopedEvent(Event::create(EventTypeNames::load)); |
| 226 } | 228 } |
| 227 | 229 |
| 228 const WebVector<mojom::blink::PermissionName>& | 230 const WebVector<mojom::blink::PermissionName>& |
| 229 HTMLFrameOwnerElement::delegatedPermissions() const { | 231 HTMLFrameOwnerElement::delegatedPermissions() const { |
| 230 DEFINE_STATIC_LOCAL(WebVector<mojom::blink::PermissionName>, permissions, ()); | 232 DEFINE_STATIC_LOCAL(WebVector<mojom::blink::PermissionName>, permissions, ()); |
| 231 return permissions; | 233 return permissions; |
| 232 } | 234 } |
| 233 | 235 |
| 234 const WebVector<WebFeaturePolicyFeature>& | 236 const WebVector<WebFeaturePolicyFeature>& |
| 235 HTMLFrameOwnerElement::allowedFeatures() const { | 237 HTMLFrameOwnerElement::allowedFeatures() const { |
| 236 DEFINE_STATIC_LOCAL(WebVector<WebFeaturePolicyFeature>, features, ()); | 238 DEFINE_STATIC_LOCAL(WebVector<WebFeaturePolicyFeature>, features, ()); |
| 237 return features; | 239 return features; |
| 238 } | 240 } |
| 239 | 241 |
| 240 Document* HTMLFrameOwnerElement::getSVGDocument( | 242 Document* HTMLFrameOwnerElement::getSVGDocument( |
| 241 ExceptionState& exceptionState) const { | 243 ExceptionState& exceptionState) const { |
| 242 Document* doc = contentDocument(); | 244 Document* doc = contentDocument(); |
| 243 if (doc && doc->isSVGDocument()) | 245 if (doc && doc->isSVGDocument()) |
| 244 return doc; | 246 return doc; |
| 245 return nullptr; | 247 return nullptr; |
| 246 } | 248 } |
| 247 | 249 |
| 248 void HTMLFrameOwnerElement::setWidget(Widget* widget) { | 250 void HTMLFrameOwnerElement::setWidget(FrameViewBase* frameViewBase) { |
| 249 if (widget == m_widget) | 251 if (frameViewBase == m_widget) |
| 250 return; | 252 return; |
| 251 | 253 |
| 252 if (m_widget) { | 254 if (m_widget) { |
| 253 if (m_widget->parent()) | 255 if (m_widget->parent()) |
| 254 moveWidgetToParentSoon(m_widget.get(), 0); | 256 moveWidgetToParentSoon(m_widget.get(), 0); |
| 255 m_widget = nullptr; | 257 m_widget = nullptr; |
| 256 } | 258 } |
| 257 | 259 |
| 258 m_widget = widget; | 260 m_widget = frameViewBase; |
| 259 | 261 |
| 260 LayoutPart* layoutPart = toLayoutPart(layoutObject()); | 262 LayoutPart* layoutPart = toLayoutPart(layoutObject()); |
| 261 LayoutPartItem layoutPartItem = LayoutPartItem(layoutPart); | 263 LayoutPartItem layoutPartItem = LayoutPartItem(layoutPart); |
| 262 if (layoutPartItem.isNull()) | 264 if (layoutPartItem.isNull()) |
| 263 return; | 265 return; |
| 264 | 266 |
| 265 if (m_widget) { | 267 if (m_widget) { |
| 266 layoutPartItem.updateOnWidgetChange(); | 268 layoutPartItem.updateOnWidgetChange(); |
| 267 | 269 |
| 268 DCHECK_EQ(document().view(), layoutPartItem.frameView()); | 270 DCHECK_EQ(document().view(), layoutPartItem.frameView()); |
| 269 DCHECK(layoutPartItem.frameView()); | 271 DCHECK(layoutPartItem.frameView()); |
| 270 moveWidgetToParentSoon(m_widget.get(), layoutPartItem.frameView()); | 272 moveWidgetToParentSoon(m_widget.get(), layoutPartItem.frameView()); |
| 271 } | 273 } |
| 272 | 274 |
| 273 if (AXObjectCache* cache = document().existingAXObjectCache()) | 275 if (AXObjectCache* cache = document().existingAXObjectCache()) |
| 274 cache->childrenChanged(layoutPart); | 276 cache->childrenChanged(layoutPart); |
| 275 } | 277 } |
| 276 | 278 |
| 277 Widget* HTMLFrameOwnerElement::releaseWidget() { | 279 FrameViewBase* HTMLFrameOwnerElement::releaseWidget() { |
| 278 if (!m_widget) | 280 if (!m_widget) |
| 279 return nullptr; | 281 return nullptr; |
| 280 if (m_widget->parent()) | 282 if (m_widget->parent()) |
| 281 temporarilyRemoveWidgetFromParentSoon(m_widget.get()); | 283 temporarilyRemoveWidgetFromParentSoon(m_widget.get()); |
| 282 LayoutPart* layoutPart = toLayoutPart(layoutObject()); | 284 LayoutPart* layoutPart = toLayoutPart(layoutObject()); |
| 283 if (layoutPart) { | 285 if (layoutPart) { |
| 284 if (AXObjectCache* cache = document().existingAXObjectCache()) | 286 if (AXObjectCache* cache = document().existingAXObjectCache()) |
| 285 cache->childrenChanged(layoutPart); | 287 cache->childrenChanged(layoutPart); |
| 286 } | 288 } |
| 287 return m_widget.release(); | 289 return m_widget.release(); |
| 288 } | 290 } |
| 289 | 291 |
| 290 Widget* HTMLFrameOwnerElement::ownedWidget() const { | 292 FrameViewBase* HTMLFrameOwnerElement::ownedWidget() const { |
| 291 return m_widget.get(); | 293 return m_widget.get(); |
| 292 } | 294 } |
| 293 | 295 |
| 294 bool HTMLFrameOwnerElement::loadOrRedirectSubframe( | 296 bool HTMLFrameOwnerElement::loadOrRedirectSubframe( |
| 295 const KURL& url, | 297 const KURL& url, |
| 296 const AtomicString& frameName, | 298 const AtomicString& frameName, |
| 297 bool replaceCurrentItem) { | 299 bool replaceCurrentItem) { |
| 298 LocalFrame* parentFrame = document().frame(); | 300 LocalFrame* parentFrame = document().frame(); |
| 299 if (contentFrame()) { | 301 if (contentFrame()) { |
| 300 contentFrame()->navigate(document(), url, replaceCurrentItem, | 302 contentFrame()->navigate(document(), url, replaceCurrentItem, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 328 } | 330 } |
| 329 | 331 |
| 330 DEFINE_TRACE(HTMLFrameOwnerElement) { | 332 DEFINE_TRACE(HTMLFrameOwnerElement) { |
| 331 visitor->trace(m_contentFrame); | 333 visitor->trace(m_contentFrame); |
| 332 visitor->trace(m_widget); | 334 visitor->trace(m_widget); |
| 333 HTMLElement::trace(visitor); | 335 HTMLElement::trace(visitor); |
| 334 FrameOwner::trace(visitor); | 336 FrameOwner::trace(visitor); |
| 335 } | 337 } |
| 336 | 338 |
| 337 } // namespace blink | 339 } // namespace blink |
| OLD | NEW |