Replace uses of ArgumentEncoder/ArgumentDecoder with MessageEncoder/MessageDecoder
[WebKit-https.git] / Source / WebKit2 / UIProcess / Notifications / WebNotificationManagerProxy.cpp
1 /*
2  * Copyright (C) 2011 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "WebNotificationManagerProxy.h"
28
29 #include "ImmutableArray.h"
30 #include "ImmutableDictionary.h"
31 #include "WebContext.h"
32 #include "WebNotification.h"
33 #include "WebNotificationManagerMessages.h"
34 #include "WebPageProxy.h"
35 #include "WebSecurityOrigin.h"
36
37 using namespace WTF;
38 using namespace WebCore;
39
40 namespace WebKit {
41
42 PassRefPtr<WebNotificationManagerProxy> WebNotificationManagerProxy::create(WebContext* context)
43 {
44     return adoptRef(new WebNotificationManagerProxy(context));
45 }
46
47 WebNotificationManagerProxy::WebNotificationManagerProxy(WebContext* context)
48     : m_context(context)
49 {
50     m_context->addMessageReceiver(CoreIPC::MessageClassWebNotificationManagerProxy, this);
51 }
52
53 void WebNotificationManagerProxy::invalidate()
54 {
55     m_provider.removeNotificationManager(this);
56 }
57
58 void WebNotificationManagerProxy::initializeProvider(const WKNotificationProvider *provider)
59 {
60     m_provider.initialize(provider);
61     m_provider.addNotificationManager(this);
62 }
63
64 void WebNotificationManagerProxy::populateCopyOfNotificationPermissions(HashMap<String, bool>& permissions)
65 {
66     RefPtr<ImmutableDictionary> knownPermissions = m_provider.notificationPermissions();
67     permissions.clear();
68     RefPtr<ImmutableArray> knownOrigins = knownPermissions->keys();
69     for (size_t i = 0; i < knownOrigins->size(); ++i) {
70         WebString* origin = knownOrigins->at<WebString>(i);
71         permissions.set(origin->string(), knownPermissions->get<WebBoolean>(origin->string())->value());
72     }
73 }
74
75 void WebNotificationManagerProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::MessageDecoder& decoder)
76 {
77     didReceiveWebNotificationManagerProxyMessage(connection, messageID, decoder);
78 }
79
80 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)
81 {
82     if (!isNotificationIDValid(notificationID))
83         return;
84     
85     RefPtr<WebNotification> notification = WebNotification::create(title, body, iconURL, tag, lang, dir, originString, notificationID);
86     m_notifications.set(notificationID, notification);
87     m_provider.show(page, notification.get());
88 }
89
90 void WebNotificationManagerProxy::cancel(uint64_t notificationID)
91 {
92     if (!isNotificationIDValid(notificationID))
93         return;
94
95     RefPtr<WebNotification> notification = m_notifications.get(notificationID);
96     if (!notification)
97         return;
98
99     m_provider.cancel(notification.get());
100 }
101     
102 void WebNotificationManagerProxy::didDestroyNotification(uint64_t notificationID)
103 {
104     if (!isNotificationIDValid(notificationID))
105         return;
106
107     RefPtr<WebNotification> notification = m_notifications.take(notificationID);
108     if (!notification)
109         return;
110
111     m_provider.didDestroyNotification(notification.get());
112 }
113
114 void WebNotificationManagerProxy::clearNotifications(const Vector<uint64_t>& notificationIDs)
115 {
116     m_provider.clearNotifications(notificationIDs);
117     size_t count = notificationIDs.size();
118     for (size_t i = 0; i < count; ++i)
119         m_notifications.remove(notificationIDs[i]);
120 }
121
122 void WebNotificationManagerProxy::providerDidShowNotification(uint64_t notificationID)
123 {
124     if (!m_context)
125         return;
126     
127     m_context->sendToAllProcesses(Messages::WebNotificationManager::DidShowNotification(notificationID));
128 }
129
130 void WebNotificationManagerProxy::providerDidClickNotification(uint64_t notificationID)
131 {
132     if (!m_context)
133         return;
134     
135     m_context->sendToAllProcesses(Messages::WebNotificationManager::DidClickNotification(notificationID));
136 }
137
138
139 void WebNotificationManagerProxy::providerDidCloseNotifications(ImmutableArray* notificationIDs)
140 {
141     if (!m_context)
142         return;
143     
144     size_t size = notificationIDs->size();
145     
146     Vector<uint64_t> vectorNotificationIDs;
147     vectorNotificationIDs.reserveInitialCapacity(size);
148     
149     for (size_t i = 0; i < size; ++i) {
150         uint64_t notificationID = notificationIDs->at<WebUInt64>(i)->value();
151         vectorNotificationIDs.append(notificationID);
152     }
153     
154     if (vectorNotificationIDs.size())
155         m_context->sendToAllProcesses(Messages::WebNotificationManager::DidCloseNotifications(vectorNotificationIDs));
156 }
157
158 void WebNotificationManagerProxy::providerDidUpdateNotificationPolicy(const WebSecurityOrigin* origin, bool allowed)
159 {
160     if (!m_context)
161         return;
162
163     m_context->sendToAllProcesses(Messages::WebNotificationManager::DidUpdateNotificationDecision(origin->toString(), allowed));
164 }
165
166 void WebNotificationManagerProxy::providerDidRemoveNotificationPolicies(ImmutableArray* origins)
167 {
168     if (!m_context)
169         return;
170
171     size_t size = origins->size();
172     if (!size)
173         return;
174     
175     Vector<String> originStrings;
176     originStrings.reserveInitialCapacity(size);
177     
178     for (size_t i = 0; i < size; ++i)
179         originStrings.append(origins->at<WebSecurityOrigin>(i)->toString());
180     
181     m_context->sendToAllProcesses(Messages::WebNotificationManager::DidRemoveNotificationDecisions(originStrings));
182 }
183
184 } // namespace WebKit