From d441d6f39bb846989d95bcf5caf387b42414718d Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 13 Sep 2013 12:51:20 +0200 Subject: Import Qt5x2 branch of QtWebkit for Qt 5.2 Importing a new snapshot of webkit. Change-Id: I2d01ad12cdc8af8cb015387641120a9d7ea5f10c Reviewed-by: Allan Sandfeld Jensen --- .../Notifications/WebNotificationManagerProxy.cpp | 200 ++++++++++++++------- 1 file changed, 138 insertions(+), 62 deletions(-) (limited to 'Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.cpp') diff --git a/Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.cpp b/Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.cpp index 9dfe29b00..9e462af9b 100644 --- a/Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.cpp +++ b/Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Apple Inc. All rights reserved. + * Copyright (C) 2011, 2013 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,40 +31,67 @@ #include "WebContext.h" #include "WebNotification.h" #include "WebNotificationManagerMessages.h" -#include "WebNotificationManagerProxyMessages.h" #include "WebPageProxy.h" +#include "WebProcessProxy.h" #include "WebSecurityOrigin.h" +using namespace std; using namespace WTF; using namespace WebCore; namespace WebKit { +static uint64_t generateGlobalNotificationID() +{ + static uint64_t uniqueGlobalNotificationID = 1; + return uniqueGlobalNotificationID++; +} + +const char* WebNotificationManagerProxy::supplementName() +{ + return "WebNotificationManagerProxy"; +} + PassRefPtr WebNotificationManagerProxy::create(WebContext* context) { return adoptRef(new WebNotificationManagerProxy(context)); } WebNotificationManagerProxy::WebNotificationManagerProxy(WebContext* context) - : m_context(context) + : WebContextSupplement(context) { - m_context->addMessageReceiver(Messages::WebNotificationManagerProxy::messageReceiverName(), this); } -void WebNotificationManagerProxy::invalidate() +void WebNotificationManagerProxy::initializeProvider(const WKNotificationProvider *provider) +{ + m_provider.initialize(provider); + m_provider.addNotificationManager(this); +} + +// WebContextSupplement + +void WebNotificationManagerProxy::contextDestroyed() { m_provider.removeNotificationManager(this); } -void WebNotificationManagerProxy::initializeProvider(const WKNotificationProvider *provider) +void WebNotificationManagerProxy::refWebContextSupplement() { - m_provider.initialize(provider); - m_provider.addNotificationManager(this); + APIObject::ref(); +} + +void WebNotificationManagerProxy::derefWebContextSupplement() +{ + APIObject::deref(); } void WebNotificationManagerProxy::populateCopyOfNotificationPermissions(HashMap& permissions) { RefPtr knownPermissions = m_provider.notificationPermissions(); + + if (!knownPermissions) + return; + permissions.clear(); RefPtr knownOrigins = knownPermissions->keys(); for (size_t i = 0; i < knownOrigins->size(); ++i) { @@ -73,100 +100,149 @@ void WebNotificationManagerProxy::populateCopyOfNotificationPermissions(HashMap< } } -void WebNotificationManagerProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::MessageDecoder& decoder) +void WebNotificationManagerProxy::show(WebPageProxy* webPage, const String& title, const String& body, const String& iconURL, const String& tag, const String& lang, const String& dir, const String& originString, uint64_t pageNotificationID) { - didReceiveWebNotificationManagerProxyMessage(connection, messageID, decoder); + uint64_t globalNotificationID = generateGlobalNotificationID(); + RefPtr notification = WebNotification::create(title, body, iconURL, tag, lang, dir, originString, globalNotificationID); + pair notificationIDPair = make_pair(webPage->pageID(), pageNotificationID); + m_globalNotificationMap.set(globalNotificationID, notificationIDPair); + m_notifications.set(notificationIDPair, make_pair(globalNotificationID, notification)); + m_provider.show(webPage, notification.get()); } -void WebNotificationManagerProxy::show(WebPageProxy* page, const String& title, const String& body, const String& iconURL, const String& tag, const String& lang, const String& dir, const String& originString, uint64_t notificationID) +void WebNotificationManagerProxy::cancel(WebPageProxy* webPage, uint64_t pageNotificationID) { - if (!isNotificationIDValid(notificationID)) - return; + if (WebNotification* notification = m_notifications.get(make_pair(webPage->pageID(), pageNotificationID)).second.get()) + m_provider.cancel(notification); +} - RefPtr notification = WebNotification::create(title, body, iconURL, tag, lang, dir, originString, notificationID); - m_notifications.set(notificationID, notification); - m_provider.show(page, notification.get()); +void WebNotificationManagerProxy::didDestroyNotification(WebPageProxy* webPage, uint64_t pageNotificationID) +{ + auto globalIDNotificationPair = m_notifications.take(make_pair(webPage->pageID(), pageNotificationID)); + if (uint64_t globalNotificationID = globalIDNotificationPair.first) { + WebNotification* notification = globalIDNotificationPair.second.get(); + m_globalNotificationMap.remove(globalNotificationID); + m_provider.didDestroyNotification(notification); + } } -void WebNotificationManagerProxy::cancel(uint64_t notificationID) +static bool pageIDsMatch(uint64_t pageID, uint64_t, uint64_t desiredPageID, const Vector&) { - if (!isNotificationIDValid(notificationID)) - return; - - RefPtr notification = m_notifications.get(notificationID); - if (!notification) - return; - - m_provider.cancel(notification.get()); + return pageID == desiredPageID; } - -void WebNotificationManagerProxy::didDestroyNotification(uint64_t notificationID) + +static bool pageAndNotificationIDsMatch(uint64_t pageID, uint64_t pageNotificationID, uint64_t desiredPageID, const Vector& desiredPageNotificationIDs) { - if (!isNotificationIDValid(notificationID)) - return; + return pageID == desiredPageID && desiredPageNotificationIDs.contains(pageNotificationID); +} - RefPtr notification = m_notifications.take(notificationID); - if (!notification) - return; +void WebNotificationManagerProxy::clearNotifications(WebPageProxy* webPage) +{ + clearNotifications(webPage, Vector(), pageIDsMatch); +} - m_provider.didDestroyNotification(notification.get()); +void WebNotificationManagerProxy::clearNotifications(WebPageProxy* webPage, const Vector& pageNotificationIDs) +{ + clearNotifications(webPage, pageNotificationIDs, pageAndNotificationIDsMatch); } -void WebNotificationManagerProxy::clearNotifications(const Vector& notificationIDs) +void WebNotificationManagerProxy::clearNotifications(WebPageProxy* webPage, const Vector& pageNotificationIDs, NotificationFilterFunction filterFunction) { - m_provider.clearNotifications(notificationIDs); - size_t count = notificationIDs.size(); - for (size_t i = 0; i < count; ++i) - m_notifications.remove(notificationIDs[i]); + uint64_t targetPageID = webPage->pageID(); + + Vector globalNotificationIDs; + globalNotificationIDs.reserveCapacity(m_globalNotificationMap.size()); + + for (auto it = m_notifications.begin(), end = m_notifications.end(); it != end; ++it) { + uint64_t webPageID = it->key.first; + uint64_t pageNotificationID = it->key.second; + if (!filterFunction(webPageID, pageNotificationID, targetPageID, pageNotificationIDs)) + continue; + + uint64_t globalNotificationID = it->value.first; + globalNotificationIDs.append(globalNotificationID); + } + + for (auto it = globalNotificationIDs.begin(), end = globalNotificationIDs.end(); it != end; ++it) { + auto pageNotification = m_globalNotificationMap.take(*it); + m_notifications.remove(pageNotification); + } + + m_provider.clearNotifications(globalNotificationIDs); } -void WebNotificationManagerProxy::providerDidShowNotification(uint64_t notificationID) +void WebNotificationManagerProxy::providerDidShowNotification(uint64_t globalNotificationID) { - if (!m_context) + auto it = m_globalNotificationMap.find(globalNotificationID); + if (it == m_globalNotificationMap.end()) return; - - m_context->sendToAllProcesses(Messages::WebNotificationManager::DidShowNotification(notificationID)); + + uint64_t webPageID = it->value.first; + WebPageProxy* webPage = WebProcessProxy::webPage(webPageID); + if (!webPage) + return; + + uint64_t pageNotificationID = it->value.second; + webPage->process()->send(Messages::WebNotificationManager::DidShowNotification(pageNotificationID), 0); } -void WebNotificationManagerProxy::providerDidClickNotification(uint64_t notificationID) +void WebNotificationManagerProxy::providerDidClickNotification(uint64_t globalNotificationID) { - if (!m_context) + auto it = m_globalNotificationMap.find(globalNotificationID); + if (it == m_globalNotificationMap.end()) return; - m_context->sendToAllProcesses(Messages::WebNotificationManager::DidClickNotification(notificationID)); + uint64_t webPageID = it->value.first; + WebPageProxy* webPage = WebProcessProxy::webPage(webPageID); + if (!webPage) + return; + + uint64_t pageNotificationID = it->value.second; + webPage->process()->send(Messages::WebNotificationManager::DidClickNotification(pageNotificationID), 0); } -void WebNotificationManagerProxy::providerDidCloseNotifications(ImmutableArray* notificationIDs) +void WebNotificationManagerProxy::providerDidCloseNotifications(ImmutableArray* globalNotificationIDs) { - if (!m_context) - return; - - size_t size = notificationIDs->size(); - - Vector vectorNotificationIDs; - vectorNotificationIDs.reserveInitialCapacity(size); + HashMap> pageNotificationIDs; + size_t size = globalNotificationIDs->size(); for (size_t i = 0; i < size; ++i) { - uint64_t notificationID = notificationIDs->at(i)->value(); - vectorNotificationIDs.append(notificationID); + auto it = m_globalNotificationMap.find(globalNotificationIDs->at(i)->value()); + if (it == m_globalNotificationMap.end()) + continue; + + if (WebPageProxy* webPage = WebProcessProxy::webPage(it->value.first)) { + auto pageIt = pageNotificationIDs.find(webPage); + if (pageIt == pageNotificationIDs.end()) { + Vector newVector; + newVector.reserveInitialCapacity(size); + pageIt = pageNotificationIDs.add(webPage, newVector).iterator; + } + + uint64_t pageNotificationID = it->value.second; + pageIt->value.append(pageNotificationID); + } + + m_notifications.remove(it->value); + m_globalNotificationMap.remove(it); } - - if (vectorNotificationIDs.size()) - m_context->sendToAllProcesses(Messages::WebNotificationManager::DidCloseNotifications(vectorNotificationIDs)); + + for (auto it = pageNotificationIDs.begin(), end = pageNotificationIDs.end(); it != end; ++it) + it->key->process()->send(Messages::WebNotificationManager::DidCloseNotifications(it->value), 0); } void WebNotificationManagerProxy::providerDidUpdateNotificationPolicy(const WebSecurityOrigin* origin, bool allowed) { - if (!m_context) + if (!context()) return; - m_context->sendToAllProcesses(Messages::WebNotificationManager::DidUpdateNotificationDecision(origin->toString(), allowed)); + context()->sendToAllProcesses(Messages::WebNotificationManager::DidUpdateNotificationDecision(origin->toString(), allowed)); } void WebNotificationManagerProxy::providerDidRemoveNotificationPolicies(ImmutableArray* origins) { - if (!m_context) + if (!context()) return; size_t size = origins->size(); @@ -179,7 +255,7 @@ void WebNotificationManagerProxy::providerDidRemoveNotificationPolicies(Immutabl for (size_t i = 0; i < size; ++i) originStrings.append(origins->at(i)->toString()); - m_context->sendToAllProcesses(Messages::WebNotificationManager::DidRemoveNotificationDecisions(originStrings)); + context()->sendToAllProcesses(Messages::WebNotificationManager::DidRemoveNotificationDecisions(originStrings)); } } // namespace WebKit -- cgit v1.2.1