Index: Source/core/dom/Document.cpp |
diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp |
index e3199112cca649bf8ae7e40a0ba871602fad2a2f..712a83d37297ce30887272a2ba477cf9f85c83b8 100644 |
--- a/Source/core/dom/Document.cpp |
+++ b/Source/core/dom/Document.cpp |
@@ -394,6 +394,39 @@ private: |
} |
}; |
+DocumentVisibilityObserver::DocumentVisibilityObserver(Document& document) |
+ : m_document(0) |
+{ |
+ registerObserver(document); |
+} |
+ |
+DocumentVisibilityObserver::~DocumentVisibilityObserver() |
+{ |
+ unregisterObserver(); |
+} |
+ |
+void DocumentVisibilityObserver::unregisterObserver() |
+{ |
+ if (m_document) { |
+ m_document->unregisterVisibilityObserver(this); |
+ m_document = 0; |
+ } |
+} |
+ |
+void DocumentVisibilityObserver::registerObserver(Document& document) |
+{ |
+ ASSERT(!m_document); |
+ m_document = &document; |
+ if (m_document) |
+ m_document->registerVisibilityObserver(this); |
+} |
+ |
+void DocumentVisibilityObserver::setObservedDocument(Document& document) |
+{ |
+ unregisterObserver(); |
+ registerObserver(document); |
+} |
+ |
Document::Document(const DocumentInit& initializer, DocumentClassFlags documentClasses) |
: ContainerNode(0, CreateDocument) |
, TreeScope(*this) |
@@ -516,6 +549,7 @@ Document::~Document() |
ASSERT(m_ranges.isEmpty()); |
ASSERT(!parentTreeScope()); |
ASSERT(!hasGuardRefCount()); |
+ ASSERT(m_visibilityObservers.isEmpty()); |
if (m_templateDocument) |
m_templateDocument->setTemplateDocumentHost(0); // balanced in templateDocument(). |
@@ -1405,11 +1439,28 @@ bool Document::hidden() const |
return pageVisibilityState() != PageVisibilityStateVisible; |
} |
-void Document::dispatchVisibilityStateChangeEvent() |
+void Document::didChangeVisibilityState() |
{ |
dispatchEvent(Event::create(EventTypeNames::visibilitychange)); |
// Also send out the deprecated version until it can be removed. |
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) |
+ (*it)->didChangeVisibilityState(state); |
+} |
+ |
+void Document::registerVisibilityObserver(DocumentVisibilityObserver* observer) |
+{ |
+ ASSERT(!m_visibilityObservers.contains(observer)); |
+ m_visibilityObservers.add(observer); |
+} |
+ |
+void Document::unregisterVisibilityObserver(DocumentVisibilityObserver* observer) |
+{ |
+ ASSERT(m_visibilityObservers.contains(observer)); |
+ m_visibilityObservers.remove(observer); |
} |
String Document::nodeName() const |