Index: Source/core/rendering/RenderObject.cpp |
diff --git a/Source/core/rendering/RenderObject.cpp b/Source/core/rendering/RenderObject.cpp |
index f96b3e8e279e98f33374b337fd121df94b189e8f..2dd2ca6df0d5909f864da5911f34d99281e9b157 100644 |
--- a/Source/core/rendering/RenderObject.cpp |
+++ b/Source/core/rendering/RenderObject.cpp |
@@ -96,6 +96,12 @@ using namespace std; |
namespace WebCore { |
+namespace { |
+ |
+static ModifyRenderTreeStructureMode gModifyRenderTreeStructureMode = ModifyRenderTreeStructureOnlyInRecalcStyle; |
+ |
+} // namespace |
+ |
using namespace HTMLNames; |
#ifndef NDEBUG |
@@ -143,6 +149,8 @@ void RenderObject::operator delete(void* ptr) |
RenderObject* RenderObject::createObject(Element* element, RenderStyle* style) |
{ |
+ ASSERT(isAllowedToModifyRenderTreeStructure(element->document())); |
+ |
// Minimal support for content properties replacing an entire element. |
// Works only if we have exactly one piece of content and it's a URL. |
// Otherwise acts as if we didn't support this feature. |
@@ -296,6 +304,8 @@ bool RenderObject::requiresAnonymousTableWrappers(const RenderObject* newChild) |
void RenderObject::addChild(RenderObject* newChild, RenderObject* beforeChild) |
{ |
+ ASSERT(isAllowedToModifyRenderTreeStructure(document())); |
+ |
RenderObjectChildList* children = virtualChildren(); |
ASSERT(children); |
if (!children) |
@@ -334,6 +344,8 @@ void RenderObject::addChild(RenderObject* newChild, RenderObject* beforeChild) |
void RenderObject::removeChild(RenderObject* oldChild) |
{ |
+ ASSERT(isAllowedToModifyRenderTreeStructure(document())); |
+ |
RenderObjectChildList* children = virtualChildren(); |
ASSERT(children); |
if (!children) |
@@ -2763,6 +2775,10 @@ void RenderObject::removeFromRenderFlowThreadRecursive(RenderFlowThread* renderF |
void RenderObject::destroyAndCleanupAnonymousWrappers() |
{ |
+ // FIXME: We should not modify the structure of the render tree outside of |
+ // recalc style. crbug.com/370463 |
+ DeprecatedDisableModifyRenderTreeStructureAsserts disabler; |
+ |
// If the tree is destroyed, there is no need for a clean-up phase. |
if (documentBeingDestroyed()) { |
destroy(); |
@@ -3411,6 +3427,16 @@ void RenderObject::clearRepaintState() |
setMayNeedInvalidation(false); |
} |
+bool RenderObject::isAllowedToModifyRenderTreeStructure(Document& document) |
+{ |
+ if (gModifyRenderTreeStructureMode == ModifyRenderTreeStructureAnyState) |
esprehn
2014/05/06 18:24:29
Put this bool in the disabler itself, then ask the
dsinclair
2014/05/07 16:24:40
Done.
|
+ return true; |
+ return document.lifecycle().state() == DocumentLifecycle::InStyleRecalc; |
esprehn
2014/05/06 18:24:29
This should be a method on DocumentLifecycle, ther
dsinclair
2014/05/07 16:24:40
Done.
|
+} |
+ |
+DeprecatedDisableModifyRenderTreeStructureAsserts::DeprecatedDisableModifyRenderTreeStructureAsserts() |
+ : m_disabler(gModifyRenderTreeStructureMode, ModifyRenderTreeStructureAnyState) { } |
+ |
} // namespace WebCore |
#ifndef NDEBUG |