Title: [159701] trunk/Source/WebKit2
Revision
159701
Author
ander...@apple.com
Date
2013-11-22 11:33:44 -0800 (Fri, 22 Nov 2013)

Log Message

Send out the right KVO callbacks when the page title changes
https://bugs.webkit.org/show_bug.cgi?id=124753

Reviewed by Simon Fraser.

* UIProcess/API/mac/WKBrowsingContextController.mm:
(PageLoadStateObserver::PageLoadStateObserver):
New class that sends the right KVO notifications when the load state changes.

(-[WKBrowsingContextController dealloc]):
Remove the observer.

(-[WKBrowsingContextController _initWithPageRef:]):
Allocate the observer and add it.

* UIProcess/PageLoadState.cpp:
(WebKit::PageLoadState::~PageLoadState):
Assert that we don't have any observers left.

(WebKit::PageLoadState::addObserver):
Add the observer to the list.

(WebKit::PageLoadState::removeObserver):
Remove the observer from the list.

(WebKit::PageLoadState::reset):
Call title change callbacks.

(WebKit::PageLoadState::setTitle):
Ditto.

(WebKit::PageLoadState::callObserverCallback):
Helper function to dispatch callbacks to observers.

* UIProcess/PageLoadState.h:
Add new members.

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (159700 => 159701)


--- trunk/Source/WebKit2/ChangeLog	2013-11-22 19:31:40 UTC (rev 159700)
+++ trunk/Source/WebKit2/ChangeLog	2013-11-22 19:33:44 UTC (rev 159701)
@@ -1,3 +1,42 @@
+2013-11-21  Anders Carlsson  <ander...@apple.com>
+
+        Send out the right KVO callbacks when the page title changes
+        https://bugs.webkit.org/show_bug.cgi?id=124753
+
+        Reviewed by Simon Fraser.
+
+        * UIProcess/API/mac/WKBrowsingContextController.mm:
+        (PageLoadStateObserver::PageLoadStateObserver):
+        New class that sends the right KVO notifications when the load state changes.
+
+        (-[WKBrowsingContextController dealloc]):
+        Remove the observer.
+
+        (-[WKBrowsingContextController _initWithPageRef:]):
+        Allocate the observer and add it.
+
+        * UIProcess/PageLoadState.cpp:
+        (WebKit::PageLoadState::~PageLoadState):
+        Assert that we don't have any observers left.
+
+        (WebKit::PageLoadState::addObserver):
+        Add the observer to the list.
+
+        (WebKit::PageLoadState::removeObserver):
+        Remove the observer from the list.
+
+        (WebKit::PageLoadState::reset):
+        Call title change callbacks.
+
+        (WebKit::PageLoadState::setTitle):
+        Ditto.
+
+        (WebKit::PageLoadState::callObserverCallback):
+        Helper function to dispatch callbacks to observers.
+
+        * UIProcess/PageLoadState.h:
+        Add new members.
+
 2013-11-21  Sergio Correia  <sergio.corr...@openbossa.org>
 
         [EFL][WK2] Fix build after r159656

Modified: trunk/Source/WebKit2/UIProcess/API/mac/WKBrowsingContextController.mm (159700 => 159701)


--- trunk/Source/WebKit2/UIProcess/API/mac/WKBrowsingContextController.mm	2013-11-22 19:31:40 UTC (rev 159700)
+++ trunk/Source/WebKit2/UIProcess/API/mac/WKBrowsingContextController.mm	2013-11-22 19:33:44 UTC (rev 159701)
@@ -54,6 +54,27 @@
 
 using namespace WebKit;
 
+class PageLoadStateObserver : public PageLoadState::Observer {
+public:
+    PageLoadStateObserver(WKBrowsingContextController *controller)
+        : m_controller(controller)
+    {
+    }
+
+private:
+    virtual void willChangeTitle() OVERRIDE
+    {
+        [m_controller willChangeValueForKey:@"title"];
+    }
+
+    virtual void didChangeTitle() OVERRIDE
+    {
+        [m_controller didChangeValueForKey:@"title"];
+    }
+
+    WKBrowsingContextController *m_controller;
+};
+
 static inline NSString *autoreleased(WKStringRef string)
 {
     return string ? CFBridgingRelease(WKStringCopyCFString(kCFAllocatorDefault, adoptWK(string).get())) : nil;
@@ -85,6 +106,8 @@
 #if WK_API_ENABLED
     // Delegate for policy callbacks.
     id<WKBrowsingContextPolicyDelegate> _policyDelegate;
+
+    std::unique_ptr<PageLoadStateObserver> _pageLoadStateObserver;
 #endif
 }
 @end
@@ -92,11 +115,12 @@
 @implementation WKBrowsingContextControllerData
 @end
 
-
 @implementation WKBrowsingContextController
 
 - (void)dealloc
 {
+    toImpl(_data->_pageRef.get())->pageLoadState().removeObserver(*_data->_pageLoadStateObserver);
+
     WKPageSetPageLoaderClient(_data->_pageRef.get(), nullptr);
 
 #if WK_API_ENABLED
@@ -685,6 +709,9 @@
     _data = [[WKBrowsingContextControllerData alloc] init];
     _data->_pageRef = pageRef;
 
+    _data->_pageLoadStateObserver = std::make_unique<PageLoadStateObserver>(self);
+    toImpl(_data->_pageRef.get())->pageLoadState().addObserver(*_data->_pageLoadStateObserver);
+
     setUpPageLoaderClient(self, pageRef);
 
 #if WK_API_ENABLED

Modified: trunk/Source/WebKit2/UIProcess/PageLoadState.cpp (159700 => 159701)


--- trunk/Source/WebKit2/UIProcess/PageLoadState.cpp	2013-11-22 19:31:40 UTC (rev 159700)
+++ trunk/Source/WebKit2/UIProcess/PageLoadState.cpp	2013-11-22 19:33:44 UTC (rev 159701)
@@ -35,8 +35,24 @@
 
 PageLoadState::~PageLoadState()
 {
+    ASSERT(m_observers.isEmpty());
 }
 
+void PageLoadState::addObserver(Observer& observer)
+{
+    ASSERT(!m_observers.contains(&observer));
+
+    m_observers.append(&observer);
+}
+
+void PageLoadState::removeObserver(Observer& observer)
+{
+    ASSERT(m_observers.contains(&observer));
+
+    size_t index = m_observers.find(&observer);
+    m_observers.remove(index);
+}
+
 void PageLoadState::reset()
 {
     m_state = State::Finished;
@@ -47,7 +63,9 @@
     m_unreachableURL = String();
     m_lastUnreachableURL = String();
 
+    callObserverCallback(&Observer::willChangeTitle);
     m_title = String();
+    callObserverCallback(&Observer::didChangeTitle);
 }
 
 String PageLoadState::activeURL() const
@@ -161,7 +179,15 @@
 
 void PageLoadState::setTitle(const String& title)
 {
+    callObserverCallback(&Observer::willChangeTitle);
     m_title = title;
+    callObserverCallback(&Observer::didChangeTitle);
 }
 
+void PageLoadState::callObserverCallback(void (Observer::*callback)())
+{
+    for (auto* observer : m_observers)
+        (observer->*callback)();
+}
+
 } // namespace WebKit

Modified: trunk/Source/WebKit2/UIProcess/PageLoadState.h (159700 => 159701)


--- trunk/Source/WebKit2/UIProcess/PageLoadState.h	2013-11-22 19:31:40 UTC (rev 159700)
+++ trunk/Source/WebKit2/UIProcess/PageLoadState.h	2013-11-22 19:33:44 UTC (rev 159701)
@@ -41,6 +41,17 @@
         Finished
     };
 
+    class Observer {
+    public:
+        virtual ~Observer() { }
+
+        virtual void willChangeTitle() = 0;
+        virtual void didChangeTitle() = 0;
+    };
+
+    void addObserver(Observer&);
+    void removeObserver(Observer&);
+
     void reset();
 
     const String& provisionalURL() const { return m_provisionalURL; }
@@ -69,6 +80,10 @@
     void setTitle(const String&);
 
 private:
+    void callObserverCallback(void (Observer::*)());
+
+    Vector<Observer*> m_observers;
+
     State m_state;
 
     String m_pendingAPIRequestURL;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to