NotificationCenter.cpp [plain text]
#include "config.h"
#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
#include "NotificationCenter.h"
#include "Document.h"
#include "NotificationClient.h"
#include "SecurityOrigin.h"
#include "WorkerContext.h"
namespace WebCore {
PassRefPtr<NotificationCenter> NotificationCenter::create(ScriptExecutionContext* context, NotificationClient* client)
{
RefPtr<NotificationCenter> notificationCenter(adoptRef(new NotificationCenter(context, client)));
notificationCenter->suspendIfNeeded();
return notificationCenter.release();
}
NotificationCenter::NotificationCenter(ScriptExecutionContext* context, NotificationClient* client)
: ActiveDOMObject(context)
, m_client(client)
{
}
#if ENABLE(LEGACY_NOTIFICATIONS)
int NotificationCenter::checkPermission()
{
if (!client() || !scriptExecutionContext())
return NotificationClient::PermissionDenied;
switch (scriptExecutionContext()->securityOrigin()->canShowNotifications()) {
case SecurityOrigin::AlwaysAllow:
return NotificationClient::PermissionAllowed;
case SecurityOrigin::AlwaysDeny:
return NotificationClient::PermissionDenied;
case SecurityOrigin::Ask:
return m_client->checkPermission(scriptExecutionContext());
}
ASSERT_NOT_REACHED();
return m_client->checkPermission(scriptExecutionContext());
}
#endif
#if ENABLE(LEGACY_NOTIFICATIONS)
void NotificationCenter::requestPermission(PassRefPtr<VoidCallback> callback)
{
if (!client() || !scriptExecutionContext())
return;
switch (scriptExecutionContext()->securityOrigin()->canShowNotifications()) {
case SecurityOrigin::AlwaysAllow:
case SecurityOrigin::AlwaysDeny: {
m_callbacks.add(NotificationRequestCallback::createAndStartTimer(this, callback));
return;
}
case SecurityOrigin::Ask:
return m_client->requestPermission(scriptExecutionContext(), callback);
}
ASSERT_NOT_REACHED();
m_client->requestPermission(scriptExecutionContext(), callback);
}
#endif
void NotificationCenter::stop()
{
if (!m_client)
return;
m_client->cancelRequestsForPermission(scriptExecutionContext());
m_client->clearNotifications(scriptExecutionContext());
m_client = 0;
}
void NotificationCenter::requestTimedOut(NotificationCenter::NotificationRequestCallback* request)
{
m_callbacks.remove(request);
}
PassRefPtr<NotificationCenter::NotificationRequestCallback> NotificationCenter::NotificationRequestCallback::createAndStartTimer(NotificationCenter* center, PassRefPtr<VoidCallback> callback)
{
RefPtr<NotificationCenter::NotificationRequestCallback> requestCallback = adoptRef(new NotificationCenter::NotificationRequestCallback(center, callback));
requestCallback->startTimer();
return requestCallback.release();
}
NotificationCenter::NotificationRequestCallback::NotificationRequestCallback(NotificationCenter* center, PassRefPtr<VoidCallback> callback)
: m_notificationCenter(center)
, m_timer(this, &NotificationCenter::NotificationRequestCallback::timerFired)
, m_callback(callback)
{
}
void NotificationCenter::NotificationRequestCallback::startTimer()
{
m_timer.startOneShot(0);
}
void NotificationCenter::NotificationRequestCallback::timerFired(Timer<NotificationCenter::NotificationRequestCallback>*)
{
if (m_callback)
m_callback->handleEvent();
m_notificationCenter->requestTimedOut(this);
}
}
#endif // ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)