| Index: Source/core/dom/Document.cpp
|
| diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp
|
| index f58cf8bd9d9fedc616b166dee9c489bdf7a52341..ab289432e3ffd27ff53f5643c25282d27ec29382 100644
|
| --- a/Source/core/dom/Document.cpp
|
| +++ b/Source/core/dom/Document.cpp
|
| @@ -376,7 +376,9 @@ DocumentVisibilityObserver::DocumentVisibilityObserver(Document& document)
|
|
|
| DocumentVisibilityObserver::~DocumentVisibilityObserver()
|
| {
|
| +#if !ENABLE(OILPAN)
|
| unregisterObserver();
|
| +#endif
|
| }
|
|
|
| void DocumentVisibilityObserver::unregisterObserver()
|
| @@ -522,7 +524,11 @@ Document::~Document()
|
| ASSERT(m_ranges.isEmpty());
|
| ASSERT(!parentTreeScope());
|
| ASSERT(!hasGuardRefCount());
|
| +#if !ENABLE(OILPAN)
|
| + // With oilpan the visibility obeservers and the document can die together
|
| + // at which point the weak collection of observers will not be empty.
|
| ASSERT(m_visibilityObservers.isEmpty());
|
| +#endif
|
|
|
| if (m_templateDocument)
|
| m_templateDocument->m_templateDocumentHost = 0; // balanced in ensureTemplateDocument().
|
| @@ -1419,8 +1425,8 @@ void Document::didChangeVisibilityState()
|
| dispatchEvent(Event::create(EventTypeNames::webkitvisibilitychange));
|
|
|
| PageVisibilityState state = pageVisibilityState();
|
| - HashSet<DocumentVisibilityObserver*>::const_iterator observerEnd = m_visibilityObservers.end();
|
| - for (HashSet<DocumentVisibilityObserver*>::const_iterator it = m_visibilityObservers.begin(); it != observerEnd; ++it)
|
| + WillBeHeapHashSet<RawPtrWillBeWeakMember<DocumentVisibilityObserver> >::const_iterator observerEnd = m_visibilityObservers.end();
|
| + for (WillBeHeapHashSet<RawPtrWillBeWeakMember<DocumentVisibilityObserver> >::const_iterator it = m_visibilityObservers.begin(); it != observerEnd; ++it)
|
| (*it)->didChangeVisibilityState(state);
|
| }
|
|
|
| @@ -4763,7 +4769,7 @@ void Document::detachRange(Range* range)
|
| m_ranges.remove(range);
|
| }
|
|
|
| -void Document::getCSSCanvasContext(const String& type, const String& name, int width, int height, bool& is2d, RefPtr<CanvasRenderingContext2D>& context2d, bool& is3d, RefPtr<WebGLRenderingContext>& context3d)
|
| +void Document::getCSSCanvasContext(const String& type, const String& name, int width, int height, bool& is2d, RefPtrWillBeRawPtr<CanvasRenderingContext2D>& context2d, bool& is3d, RefPtrWillBeRawPtr<WebGLRenderingContext>& context3d)
|
| {
|
| HTMLCanvasElement& element = getCSSCanvasElement(name);
|
| element.setSize(IntSize(width, height));
|
| @@ -5523,9 +5529,32 @@ void Document::invalidateNodeListCaches(const QualifiedName* attrName)
|
| (*it)->invalidateCache(attrName);
|
| }
|
|
|
| +void Document::clearWeakMembers(Visitor* visitor)
|
| +{
|
| + if (m_axObjectCache)
|
| + m_axObjectCache->clearWeakMembers(visitor);
|
| +
|
| + if (m_markers)
|
| + m_markers->clearWeakMembers(visitor);
|
| +
|
| + // FIXME: Oilpan: Use a weak counted set instead.
|
| + if (m_touchEventTargets) {
|
| + Vector<Node*> deadNodes;
|
| + for (TouchEventTargetSet::iterator it = m_touchEventTargets->begin(); it != m_touchEventTargets->end(); ++it) {
|
| + if (!visitor->isAlive(it->key))
|
| + deadNodes.append(it->key);
|
| + }
|
| + for (unsigned i = 0; i < deadNodes.size(); ++i)
|
| + didClearTouchEventHandlers(deadNodes[i]);
|
| + }
|
| +}
|
| +
|
| void Document::trace(Visitor* visitor)
|
| {
|
| + visitor->trace(m_visibilityObservers);
|
| + visitor->registerWeakMembers<Document, &Document::clearWeakMembers>(this);
|
| Supplementable<Document>::trace(visitor);
|
| + TreeScope::trace(visitor);
|
| ContainerNode::trace(visitor);
|
| }
|
|
|
|
|