summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.cpp
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@digia.com>2013-09-13 12:51:20 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-19 20:50:05 +0200
commitd441d6f39bb846989d95bcf5caf387b42414718d (patch)
treee367e64a75991c554930278175d403c072de6bb8 /Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.cpp
parent0060b2994c07842f4c59de64b5e3e430525c4b90 (diff)
downloadqtwebkit-d441d6f39bb846989d95bcf5caf387b42414718d.tar.gz
Import Qt5x2 branch of QtWebkit for Qt 5.2
Importing a new snapshot of webkit. Change-Id: I2d01ad12cdc8af8cb015387641120a9d7ea5f10c Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
Diffstat (limited to 'Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.cpp')
-rw-r--r--Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.cpp200
1 files changed, 138 insertions, 62 deletions
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> 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<String, bool>& permissions)
{
RefPtr<ImmutableDictionary> knownPermissions = m_provider.notificationPermissions();
+
+ if (!knownPermissions)
+ return;
+
permissions.clear();
RefPtr<ImmutableArray> 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<WebNotification> notification = WebNotification::create(title, body, iconURL, tag, lang, dir, originString, globalNotificationID);
+ pair<uint64_t, uint64_t> 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<WebNotification> 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<uint64_t>&)
{
- if (!isNotificationIDValid(notificationID))
- return;
-
- RefPtr<WebNotification> 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<uint64_t>& desiredPageNotificationIDs)
{
- if (!isNotificationIDValid(notificationID))
- return;
+ return pageID == desiredPageID && desiredPageNotificationIDs.contains(pageNotificationID);
+}
- RefPtr<WebNotification> notification = m_notifications.take(notificationID);
- if (!notification)
- return;
+void WebNotificationManagerProxy::clearNotifications(WebPageProxy* webPage)
+{
+ clearNotifications(webPage, Vector<uint64_t>(), pageIDsMatch);
+}
- m_provider.didDestroyNotification(notification.get());
+void WebNotificationManagerProxy::clearNotifications(WebPageProxy* webPage, const Vector<uint64_t>& pageNotificationIDs)
+{
+ clearNotifications(webPage, pageNotificationIDs, pageAndNotificationIDsMatch);
}
-void WebNotificationManagerProxy::clearNotifications(const Vector<uint64_t>& notificationIDs)
+void WebNotificationManagerProxy::clearNotifications(WebPageProxy* webPage, const Vector<uint64_t>& 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<uint64_t> 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<uint64_t> vectorNotificationIDs;
- vectorNotificationIDs.reserveInitialCapacity(size);
+ HashMap<WebPageProxy*, Vector<uint64_t>> pageNotificationIDs;
+ size_t size = globalNotificationIDs->size();
for (size_t i = 0; i < size; ++i) {
- uint64_t notificationID = notificationIDs->at<WebUInt64>(i)->value();
- vectorNotificationIDs.append(notificationID);
+ auto it = m_globalNotificationMap.find(globalNotificationIDs->at<WebUInt64>(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<uint64_t> 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<WebSecurityOrigin>(i)->toString());
- m_context->sendToAllProcesses(Messages::WebNotificationManager::DidRemoveNotificationDecisions(originStrings));
+ context()->sendToAllProcesses(Messages::WebNotificationManager::DidRemoveNotificationDecisions(originStrings));
}
} // namespace WebKit