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