Chromium Code Reviews| Index: Source/core/dom/Document.cpp |
| diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp |
| index 15f087205287c8e6d9258c13149744eb81a00a9c..2172488dc5ab65d4cd0f917477c045d3e73840b1 100644 |
| --- a/Source/core/dom/Document.cpp |
| +++ b/Source/core/dom/Document.cpp |
| @@ -479,7 +479,7 @@ Document::Document(const DocumentInit& initializer, DocumentClassFlags documentC |
| , m_animationClock(AnimationClock::create()) |
| , m_timeline(DocumentTimeline::create(this)) |
| , m_transitionTimeline(TransitionTimeline::create(this)) |
| - , m_templateDocumentHost(0) |
| + , m_templateDocumentHost(nullptr) |
| , m_didAssociateFormControlsTimer(this, &Document::didAssociateFormControlsTimerFired) |
| , m_hasViewportUnits(false) |
| , m_styleRecalcElementCounter(0) |
| @@ -534,14 +534,16 @@ Document::~Document() |
| // When they die in the same GC round, the list of visibility observers |
| // will not be empty on Document destruction. |
| ASSERT(m_visibilityObservers.isEmpty()); |
| -#endif |
| if (m_templateDocument) |
| m_templateDocument->m_templateDocumentHost = 0; // balanced in ensureTemplateDocument(). |
| +#endif |
| m_scriptRunner.clear(); |
| +#if !ENABLE(OILPAN) |
| removeAllEventListenersRecursively(); |
| +#endif |
| // Currently we believe that Document can never outlive the parser. |
| // Although the Document may be replaced synchronously, DocumentParsers |
| @@ -568,11 +570,11 @@ Document::~Document() |
| m_timeline->detachFromDocument(); |
| m_transitionTimeline->detachFromDocument(); |
| +#if !ENABLE(OILPAN) |
| // We need to destroy CSSFontSelector before destroying m_fetcher. |
| if (m_styleEngine) |
| m_styleEngine->detachFromDocument(); |
| -#if !ENABLE(OILPAN) |
| if (m_elemSheet) |
| m_elemSheet->clearOwnerNode(); |
| #endif |
| @@ -600,7 +602,9 @@ Document::~Document() |
| void Document::dispose() |
|
Mads Ager (chromium)
2014/05/05 10:18:36
The Document::dispose method breaks a lot of refer
|
| { |
| +#if !ENABLE(OILPAN) |
| ASSERT_WITH_SECURITY_IMPLICATION(!m_deletionHasBegun); |
| + |
| // We must make sure not to be retaining any of our children through |
| // these extra pointers or we will create a reference cycle. |
| m_docType = nullptr; |
| @@ -625,13 +629,18 @@ void Document::dispose() |
| // removeDetachedChildren() doesn't always unregister IDs, |
| // so tear down scope information upfront to avoid having stale references in the map. |
| destroyTreeScopeData(); |
| + |
| removeDetachedChildren(); |
| +#endif |
| + |
| // removeDetachedChildren() can access FormController. |
| m_formController.clear(); |
| +#if !ENABLE(OILPAN) |
| m_markers->clear(); |
| m_cssCanvasElements.clear(); |
| +#endif |
| // FIXME: consider using ActiveDOMObject. |
| if (m_scriptedAnimationController) |
| @@ -641,7 +650,10 @@ void Document::dispose() |
| if (svgExtensions()) |
| accessSVGExtensions().pauseAnimations(); |
| +#if !ENABLE(OILPAN) |
| m_lifecycle.advanceTo(DocumentLifecycle::Disposed); |
| +#endif |
| + |
| lifecycleNotifier().notifyDocumentWasDisposed(); |
| } |
| @@ -1362,7 +1374,7 @@ void Document::setTitle(const String& title) |
| else if (!m_titleElement) { |
| if (HTMLElement* headElement = head()) { |
| m_titleElement = HTMLTitleElement::create(*this); |
| - headElement->appendChild(m_titleElement); |
| + headElement->appendChild(m_titleElement.get()); |
| } |
| } |
| @@ -2223,6 +2235,9 @@ void Document::detach(const AttachContext& context) |
| lifecycleNotifier().notifyDocumentWasDetached(); |
| m_lifecycle.advanceTo(DocumentLifecycle::Stopped); |
| +#if ENABLE(OILPAN) |
| + dispose(); |
| +#endif |
| } |
| void Document::prepareForDestruction() |
| @@ -3525,7 +3540,7 @@ bool Document::setFocusedElement(PassRefPtr<Element> prpNewFocusedElement, Focus |
| return true; |
| bool focusChangeBlocked = false; |
| - RefPtr<Element> oldFocusedElement = m_focusedElement; |
| + RefPtrWillBeRawPtr<Element> oldFocusedElement = m_focusedElement; |
| m_focusedElement = nullptr; |
| // Remove focus from the existing focus node (if any) |
| @@ -4878,7 +4893,7 @@ void Document::getCSSCanvasContext(const String& type, const String& name, int w |
| HTMLCanvasElement& Document::getCSSCanvasElement(const String& name) |
| { |
| - RefPtr<HTMLCanvasElement>& element = m_cssCanvasElements.add(name, nullptr).storedValue->value; |
| + RefPtrWillBeMember<HTMLCanvasElement>& element = m_cssCanvasElements.add(name, nullptr).storedValue->value; |
| if (!element) { |
| element = HTMLCanvasElement::create(*this); |
| element->setAccelerationDisabled(true); |
| @@ -5663,10 +5678,28 @@ void Document::clearWeakMembers(Visitor* visitor) |
| void Document::trace(Visitor* visitor) |
| { |
| + visitor->trace(m_docType); |
| + visitor->trace(m_autofocusElement); |
| + visitor->trace(m_focusedElement); |
| + visitor->trace(m_hoverNode); |
| + visitor->trace(m_activeHoverElement); |
| + visitor->trace(m_documentElement); |
| + visitor->trace(m_titleElement); |
| + visitor->trace(m_currentScriptStack); |
| + visitor->trace(m_transformSourceDocument); |
| + visitor->trace(m_cssCanvasElements); |
| + visitor->trace(m_topLayerElements); |
| + visitor->trace(m_mediaQueryMatcher); |
| + visitor->trace(m_elemSheet); |
| + visitor->trace(m_styleEngine); |
| visitor->trace(m_styleSheetList); |
| visitor->trace(m_mediaQueryMatcher); |
| + visitor->trace(m_associatedFormControls); |
| + visitor->trace(m_templateDocument); |
| + visitor->trace(m_templateDocumentHost); |
| visitor->trace(m_visibilityObservers); |
| visitor->trace(m_contextFeatures); |
| + visitor->trace(m_userActionElements); |
| visitor->registerWeakMembers<Document, &Document::clearWeakMembers>(this); |
| DocumentSupplementable::trace(visitor); |
| TreeScope::trace(visitor); |