| 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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 } | 69 } |
| 70 | 70 |
| 71 static unsigned g_update_suspend_count = 0; | 71 static unsigned g_update_suspend_count = 0; |
| 72 | 72 |
| 73 HTMLFrameOwnerElement::UpdateSuspendScope::UpdateSuspendScope() { | 73 HTMLFrameOwnerElement::UpdateSuspendScope::UpdateSuspendScope() { |
| 74 ++g_update_suspend_count; | 74 ++g_update_suspend_count; |
| 75 } | 75 } |
| 76 | 76 |
| 77 void HTMLFrameOwnerElement::UpdateSuspendScope:: | 77 void HTMLFrameOwnerElement::UpdateSuspendScope:: |
| 78 PerformDeferredWidgetTreeOperations() { | 78 PerformDeferredWidgetTreeOperations() { |
| 79 VLOG(1) << "Performing deferred operations NewParent.size=" |
| 80 << FrameOrPluginNewParentMap().size() << ", TempRemoval.size=" |
| 81 << FrameOrPluginsPendingTemporaryRemovalFromParent().size() |
| 82 << ", Dispose.size=" << FrameOrPluginsPendingDispose().size(); |
| 79 FrameOrPluginToParentMap map; | 83 FrameOrPluginToParentMap map; |
| 80 FrameOrPluginNewParentMap().swap(map); | 84 FrameOrPluginNewParentMap().swap(map); |
| 81 for (const auto& entry : map) { | 85 for (const auto& entry : map) { |
| 82 FrameOrPlugin* child = entry.key; | 86 FrameOrPlugin* child = entry.key; |
| 83 FrameView* current_parent = child->Parent(); | 87 FrameView* current_parent = child->Parent(); |
| 84 FrameView* new_parent = entry.value; | 88 FrameView* new_parent = entry.value; |
| 85 if (new_parent != current_parent) { | 89 if (new_parent != current_parent) { |
| 86 if (current_parent) | 90 if (current_parent) |
| 87 current_parent->RemoveChild(child); | 91 current_parent->RemoveChild(child); |
| 88 if (new_parent) { | 92 if (new_parent) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 110 | 114 |
| 111 HTMLFrameOwnerElement::UpdateSuspendScope::~UpdateSuspendScope() { | 115 HTMLFrameOwnerElement::UpdateSuspendScope::~UpdateSuspendScope() { |
| 112 DCHECK_GT(g_update_suspend_count, 0u); | 116 DCHECK_GT(g_update_suspend_count, 0u); |
| 113 if (g_update_suspend_count == 1) | 117 if (g_update_suspend_count == 1) |
| 114 PerformDeferredWidgetTreeOperations(); | 118 PerformDeferredWidgetTreeOperations(); |
| 115 --g_update_suspend_count; | 119 --g_update_suspend_count; |
| 116 } | 120 } |
| 117 | 121 |
| 118 // Unlike MoveFrameOrPluginToParentSoon, this will not call dispose. | 122 // Unlike MoveFrameOrPluginToParentSoon, this will not call dispose. |
| 119 void TemporarilyRemoveFrameOrPluginFromParentSoon(FrameOrPlugin* child) { | 123 void TemporarilyRemoveFrameOrPluginFromParentSoon(FrameOrPlugin* child) { |
| 124 // child->SetFrameOrPluginState(FrameOrPlugin::kDeferred); |
| 120 if (g_update_suspend_count) { | 125 if (g_update_suspend_count) { |
| 126 VLOG(1) << "Defered temp remove child=" << child; |
| 127 if (VLOG_IS_ON(2)) |
| 128 base::debug::StackTrace(10).Print(); |
| 121 FrameOrPluginsPendingTemporaryRemovalFromParent().insert(child); | 129 FrameOrPluginsPendingTemporaryRemovalFromParent().insert(child); |
| 122 } else { | 130 } else { |
| 123 if (child->Parent()) | 131 if (child->Parent()) |
| 124 child->Parent()->RemoveChild(child); | 132 child->Parent()->RemoveChild(child); |
| 125 } | 133 } |
| 126 } | 134 } |
| 127 | 135 |
| 128 void MoveFrameOrPluginToParentSoon(FrameOrPlugin* child, FrameView* parent) { | 136 void MoveFrameOrPluginToParentSoon(FrameOrPlugin* child, FrameView* parent) { |
| 137 // child->SetFrameOrPluginState(FrameOrPlugin::kDeferred); |
| 129 if (!g_update_suspend_count) { | 138 if (!g_update_suspend_count) { |
| 130 if (parent) { | 139 if (parent) { |
| 131 DCHECK(child != parent && !child->Parent()); | 140 DCHECK(child != parent && !child->Parent()); |
| 132 child->SetParent(parent); | 141 child->SetParent(parent); |
| 133 } else if (child->Parent()) { | 142 } else if (child->Parent()) { |
| 134 child->Parent()->RemoveChild(child); | 143 child->Parent()->RemoveChild(child); |
| 135 child->Dispose(); | 144 child->Dispose(); |
| 136 } | 145 } |
| 137 return; | 146 return; |
| 138 } | 147 } |
| 148 VLOG(1) << "Deferred New Parent child=" << child << ", parent=" << parent; |
| 149 if (VLOG_IS_ON(2)) |
| 150 base::debug::StackTrace(10).Print(); |
| 139 FrameOrPluginNewParentMap().Set(child, parent); | 151 FrameOrPluginNewParentMap().Set(child, parent); |
| 140 } | 152 } |
| 141 | 153 |
| 142 HTMLFrameOwnerElement::HTMLFrameOwnerElement(const QualifiedName& tag_name, | 154 HTMLFrameOwnerElement::HTMLFrameOwnerElement(const QualifiedName& tag_name, |
| 143 Document& document) | 155 Document& document) |
| 144 : HTMLElement(tag_name, document), | 156 : HTMLElement(tag_name, document), |
| 145 content_frame_(nullptr), | 157 content_frame_(nullptr), |
| 146 widget_(nullptr), | 158 widget_(nullptr), |
| 147 sandbox_flags_(kSandboxNone) {} | 159 sandbox_flags_(kSandboxNone) {} |
| 148 | 160 |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 | 281 |
| 270 Document* HTMLFrameOwnerElement::getSVGDocument( | 282 Document* HTMLFrameOwnerElement::getSVGDocument( |
| 271 ExceptionState& exception_state) const { | 283 ExceptionState& exception_state) const { |
| 272 Document* doc = contentDocument(); | 284 Document* doc = contentDocument(); |
| 273 if (doc && doc->IsSVGDocument()) | 285 if (doc && doc->IsSVGDocument()) |
| 274 return doc; | 286 return doc; |
| 275 return nullptr; | 287 return nullptr; |
| 276 } | 288 } |
| 277 | 289 |
| 278 void HTMLFrameOwnerElement::SetWidget(FrameOrPlugin* frame_or_plugin) { | 290 void HTMLFrameOwnerElement::SetWidget(FrameOrPlugin* frame_or_plugin) { |
| 291 VLOG(1) << "SetWidget old=" << widget_ << ", new=" << frame_or_plugin |
| 292 << ", old parent=" << (!widget_ ? -1 : widget_ && widget_->Parent()) |
| 293 << ", count=" << g_update_suspend_count; |
| 279 if (frame_or_plugin == widget_) | 294 if (frame_or_plugin == widget_) |
| 280 return; | 295 return; |
| 281 | 296 |
| 282 Document* doc = contentDocument(); | 297 Document* doc = contentDocument(); |
| 283 if (doc && doc->GetFrame()) { | 298 if (doc && doc->GetFrame()) { |
| 284 bool will_be_display_none = !frame_or_plugin; | 299 bool will_be_display_none = !frame_or_plugin; |
| 285 if (IsDisplayNone() != will_be_display_none) { | 300 if (IsDisplayNone() != will_be_display_none) { |
| 286 doc->WillChangeFrameOwnerProperties( | 301 doc->WillChangeFrameOwnerProperties( |
| 287 MarginWidth(), MarginHeight(), ScrollingMode(), will_be_display_none); | 302 MarginWidth(), MarginHeight(), ScrollingMode(), will_be_display_none); |
| 288 } | 303 } |
| 289 } | 304 } |
| 290 | 305 |
| 291 if (widget_) { | 306 if (widget_) { |
| 292 if (widget_->Parent()) | 307 if (widget_->Parent()) |
| 293 MoveFrameOrPluginToParentSoon(widget_, nullptr); | 308 MoveFrameOrPluginToParentSoon(widget_, nullptr); |
| 294 } | 309 } |
| 295 | 310 |
| 296 widget_ = frame_or_plugin; | 311 widget_ = frame_or_plugin; |
| 297 FrameOwnerPropertiesChanged(); | 312 FrameOwnerPropertiesChanged(); |
| 298 | 313 |
| 299 LayoutPart* layout_part = ToLayoutPart(GetLayoutObject()); | 314 LayoutPart* layout_part = ToLayoutPart(GetLayoutObject()); |
| 300 LayoutPartItem layout_part_item = LayoutPartItem(layout_part); | 315 LayoutPartItem layout_part_item = LayoutPartItem(layout_part); |
| 301 if (layout_part_item.IsNull()) | 316 if (layout_part_item.IsNull()) { |
| 317 VLOG(1) << "SetWidget new=" << frame_or_plugin << ", parent=0"; |
| 302 return; | 318 return; |
| 319 } |
| 303 | 320 |
| 304 if (widget_) { | 321 if (widget_) { |
| 305 layout_part_item.UpdateOnWidgetChange(); | 322 layout_part_item.UpdateOnWidgetChange(); |
| 306 | 323 |
| 307 DCHECK_EQ(GetDocument().View(), layout_part_item.GetFrameView()); | 324 DCHECK_EQ(GetDocument().View(), layout_part_item.GetFrameView()); |
| 308 DCHECK(layout_part_item.GetFrameView()); | 325 DCHECK(layout_part_item.GetFrameView()); |
| 326 VLOG(1) << "SetWidget new=" << frame_or_plugin |
| 327 << ", parent=" << layout_part_item.GetFrameView(); |
| 309 MoveFrameOrPluginToParentSoon(widget_, layout_part_item.GetFrameView()); | 328 MoveFrameOrPluginToParentSoon(widget_, layout_part_item.GetFrameView()); |
| 310 } | 329 } |
| 311 | 330 |
| 312 if (AXObjectCache* cache = GetDocument().ExistingAXObjectCache()) | 331 if (AXObjectCache* cache = GetDocument().ExistingAXObjectCache()) |
| 313 cache->ChildrenChanged(layout_part); | 332 cache->ChildrenChanged(layout_part); |
| 314 } | 333 } |
| 315 | 334 |
| 316 FrameOrPlugin* HTMLFrameOwnerElement::ReleaseWidget() { | 335 FrameOrPlugin* HTMLFrameOwnerElement::ReleaseWidget() { |
| 317 if (!widget_) | 336 if (!widget_) |
| 318 return nullptr; | 337 return nullptr; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 } | 384 } |
| 366 | 385 |
| 367 DEFINE_TRACE(HTMLFrameOwnerElement) { | 386 DEFINE_TRACE(HTMLFrameOwnerElement) { |
| 368 visitor->Trace(content_frame_); | 387 visitor->Trace(content_frame_); |
| 369 visitor->Trace(widget_); | 388 visitor->Trace(widget_); |
| 370 HTMLElement::Trace(visitor); | 389 HTMLElement::Trace(visitor); |
| 371 FrameOwner::Trace(visitor); | 390 FrameOwner::Trace(visitor); |
| 372 } | 391 } |
| 373 | 392 |
| 374 } // namespace blink | 393 } // namespace blink |
| OLD | NEW |