Index: third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp |
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp |
index fbf8875ab740445df67843a341359250e6faa213..5ed7d7f1fe78a32333662b9cbebb869fefdb26ef 100644 |
--- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp |
+++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp |
@@ -74,183 +74,205 @@ |
namespace blink { |
-PassOwnPtr<ServiceWorkerGlobalScopeProxy> ServiceWorkerGlobalScopeProxy::create(WebEmbeddedWorkerImpl& embeddedWorker, Document& document, WebServiceWorkerContextClient& client) |
+PassOwnPtrWillBeRawPtr<ServiceWorkerGlobalScopeProxy> ServiceWorkerGlobalScopeProxy::create(WebEmbeddedWorkerImpl& embeddedWorker, Document& document, WebServiceWorkerContextClient& client) |
{ |
- return adoptPtr(new ServiceWorkerGlobalScopeProxy(embeddedWorker, document, client)); |
+ return adoptPtrWillBeNoop(new ServiceWorkerGlobalScopeProxy(embeddedWorker, document, client)); |
} |
ServiceWorkerGlobalScopeProxy::~ServiceWorkerGlobalScopeProxy() |
{ |
+ // Verify that the proxy has been detached. |
+ ASSERT(!m_embeddedWorker); |
+} |
+ |
+DEFINE_TRACE(ServiceWorkerGlobalScopeProxy) |
+{ |
+ visitor->trace(m_document); |
+ visitor->trace(m_workerGlobalScope); |
} |
void ServiceWorkerGlobalScopeProxy::setRegistration(WebPassOwnPtr<WebServiceWorkerRegistration::Handle> handle) |
{ |
- ASSERT(m_workerGlobalScope); |
- m_workerGlobalScope->setRegistration(handle); |
+ workerGlobalScope()->setRegistration(handle); |
} |
void ServiceWorkerGlobalScopeProxy::dispatchActivateEvent(int eventID) |
{ |
- ASSERT(m_workerGlobalScope); |
- WaitUntilObserver* observer = WaitUntilObserver::create(m_workerGlobalScope, WaitUntilObserver::Activate, eventID); |
+ WaitUntilObserver* observer = WaitUntilObserver::create(workerGlobalScope(), WaitUntilObserver::Activate, eventID); |
RefPtrWillBeRawPtr<Event> event(ExtendableEvent::create(EventTypeNames::activate, ExtendableEventInit(), observer)); |
- m_workerGlobalScope->dispatchExtendableEvent(event.release(), observer); |
+ workerGlobalScope()->dispatchExtendableEvent(event.release(), observer); |
} |
void ServiceWorkerGlobalScopeProxy::dispatchFetchEvent(int eventID, const WebServiceWorkerRequest& webRequest) |
{ |
- ASSERT(m_workerGlobalScope); |
- RespondWithObserver* observer = RespondWithObserver::create(m_workerGlobalScope, eventID, webRequest.url(), webRequest.mode(), webRequest.frameType(), webRequest.requestContext()); |
+ RespondWithObserver* observer = RespondWithObserver::create(workerGlobalScope(), eventID, webRequest.url(), webRequest.mode(), webRequest.frameType(), webRequest.requestContext()); |
bool defaultPrevented = false; |
- Request* request = Request::create(m_workerGlobalScope, webRequest); |
+ Request* request = Request::create(workerGlobalScope(), webRequest); |
request->headers()->setGuard(Headers::ImmutableGuard); |
FetchEventInit eventInit; |
eventInit.setCancelable(true); |
eventInit.setRequest(request); |
eventInit.setIsReload(webRequest.isReload()); |
RefPtrWillBeRawPtr<FetchEvent> fetchEvent(FetchEvent::create(EventTypeNames::fetch, eventInit, observer)); |
- defaultPrevented = !m_workerGlobalScope->dispatchEvent(fetchEvent.release()); |
+ defaultPrevented = !workerGlobalScope()->dispatchEvent(fetchEvent.release()); |
observer->didDispatchEvent(defaultPrevented); |
} |
void ServiceWorkerGlobalScopeProxy::dispatchGeofencingEvent(int eventID, WebGeofencingEventType eventType, const WebString& regionID, const WebCircularGeofencingRegion& region) |
{ |
- ASSERT(m_workerGlobalScope); |
const AtomicString& type = eventType == WebGeofencingEventTypeEnter ? EventTypeNames::geofenceenter : EventTypeNames::geofenceleave; |
- m_workerGlobalScope->dispatchEvent(GeofencingEvent::create(type, regionID, CircularGeofencingRegion::create(regionID, region))); |
+ workerGlobalScope()->dispatchEvent(GeofencingEvent::create(type, regionID, CircularGeofencingRegion::create(regionID, region))); |
} |
void ServiceWorkerGlobalScopeProxy::dispatchInstallEvent(int eventID) |
{ |
- ASSERT(m_workerGlobalScope); |
- WaitUntilObserver* observer = WaitUntilObserver::create(m_workerGlobalScope, WaitUntilObserver::Install, eventID); |
+ WaitUntilObserver* observer = WaitUntilObserver::create(workerGlobalScope(), WaitUntilObserver::Install, eventID); |
RefPtrWillBeRawPtr<Event> event; |
- if (RuntimeEnabledFeatures::foreignFetchEnabled()) { |
+ if (RuntimeEnabledFeatures::foreignFetchEnabled()) |
event = InstallEvent::create(EventTypeNames::install, ExtendableEventInit(), observer); |
- } else { |
+ else |
event = ExtendableEvent::create(EventTypeNames::install, ExtendableEventInit(), observer); |
- } |
- m_workerGlobalScope->dispatchExtendableEvent(event.release(), observer); |
+ workerGlobalScope()->dispatchExtendableEvent(event.release(), observer); |
} |
void ServiceWorkerGlobalScopeProxy::dispatchMessageEvent(const WebString& message, const WebMessagePortChannelArray& webChannels) |
{ |
- ASSERT(m_workerGlobalScope); |
- |
- MessagePortArray* ports = MessagePort::toMessagePortArray(m_workerGlobalScope, webChannels); |
+ MessagePortArray* ports = MessagePort::toMessagePortArray(workerGlobalScope(), webChannels); |
WebSerializedScriptValue value = WebSerializedScriptValue::fromString(message); |
- m_workerGlobalScope->dispatchEvent(MessageEvent::create(ports, value)); |
+ workerGlobalScope()->dispatchEvent(MessageEvent::create(ports, value)); |
} |
void ServiceWorkerGlobalScopeProxy::dispatchNotificationClickEvent(int eventID, int64_t notificationID, const WebNotificationData& data, int actionIndex) |
{ |
- ASSERT(m_workerGlobalScope); |
- WaitUntilObserver* observer = WaitUntilObserver::create(m_workerGlobalScope, WaitUntilObserver::NotificationClick, eventID); |
+ WaitUntilObserver* observer = WaitUntilObserver::create(workerGlobalScope(), WaitUntilObserver::NotificationClick, eventID); |
NotificationEventInit eventInit; |
- eventInit.setNotification(Notification::create(m_workerGlobalScope, notificationID, data)); |
+ eventInit.setNotification(Notification::create(workerGlobalScope(), notificationID, data)); |
if (0 <= actionIndex && actionIndex < static_cast<int>(data.actions.size())) |
eventInit.setAction(data.actions[actionIndex].action); |
RefPtrWillBeRawPtr<Event> event(NotificationEvent::create(EventTypeNames::notificationclick, eventInit, observer)); |
- m_workerGlobalScope->dispatchExtendableEvent(event.release(), observer); |
+ workerGlobalScope()->dispatchExtendableEvent(event.release(), observer); |
} |
void ServiceWorkerGlobalScopeProxy::dispatchPushEvent(int eventID, const WebString& data) |
{ |
- ASSERT(m_workerGlobalScope); |
- WaitUntilObserver* observer = WaitUntilObserver::create(m_workerGlobalScope, WaitUntilObserver::Push, eventID); |
+ WaitUntilObserver* observer = WaitUntilObserver::create(workerGlobalScope(), WaitUntilObserver::Push, eventID); |
RefPtrWillBeRawPtr<Event> event(PushEvent::create(EventTypeNames::push, PushMessageData::create(data), observer)); |
- m_workerGlobalScope->dispatchExtendableEvent(event.release(), observer); |
+ workerGlobalScope()->dispatchExtendableEvent(event.release(), observer); |
} |
void ServiceWorkerGlobalScopeProxy::dispatchServicePortConnectEvent(WebServicePortConnectEventCallbacks* rawCallbacks, const WebURL& targetURL, const WebString& origin, WebServicePortID portID) |
{ |
- ASSERT(m_workerGlobalScope); |
OwnPtr<WebServicePortConnectEventCallbacks> callbacks = adoptPtr(rawCallbacks); |
- ServicePortCollection* collection = WorkerNavigatorServices::services(m_workerGlobalScope, *m_workerGlobalScope->navigator()); |
+ ServicePortCollection* collection = WorkerNavigatorServices::services(workerGlobalScope(), *workerGlobalScope()->navigator()); |
collection->dispatchConnectEvent(callbacks.release(), targetURL, origin, portID); |
} |
void ServiceWorkerGlobalScopeProxy::dispatchSyncEvent(int eventID, const WebSyncRegistration& registration, LastChanceOption lastChance) |
{ |
- ASSERT(m_workerGlobalScope); |
if (!RuntimeEnabledFeatures::backgroundSyncEnabled()) { |
- ServiceWorkerGlobalScopeClient::from(m_workerGlobalScope)->didHandleSyncEvent(eventID, WebServiceWorkerEventResultCompleted); |
+ ServiceWorkerGlobalScopeClient::from(workerGlobalScope())->didHandleSyncEvent(eventID, WebServiceWorkerEventResultCompleted); |
return; |
} |
- WaitUntilObserver* observer = WaitUntilObserver::create(m_workerGlobalScope, WaitUntilObserver::Sync, eventID); |
+ WaitUntilObserver* observer = WaitUntilObserver::create(workerGlobalScope(), WaitUntilObserver::Sync, eventID); |
RefPtrWillBeRawPtr<Event> event(SyncEvent::create(EventTypeNames::sync, registration.tag, lastChance == IsLastChance, observer)); |
- m_workerGlobalScope->dispatchExtendableEvent(event.release(), observer); |
+ workerGlobalScope()->dispatchExtendableEvent(event.release(), observer); |
} |
void ServiceWorkerGlobalScopeProxy::dispatchCrossOriginMessageEvent(const WebCrossOriginServiceWorkerClient& webClient, const WebString& message, const WebMessagePortChannelArray& webChannels) |
{ |
- ASSERT(m_workerGlobalScope); |
- MessagePortArray* ports = MessagePort::toMessagePortArray(m_workerGlobalScope, webChannels); |
+ MessagePortArray* ports = MessagePort::toMessagePortArray(workerGlobalScope(), webChannels); |
WebSerializedScriptValue value = WebSerializedScriptValue::fromString(message); |
// FIXME: Have proper source for this MessageEvent. |
RefPtrWillBeRawPtr<MessageEvent> event = MessageEvent::create(ports, value, webClient.origin.string()); |
event->setType(EventTypeNames::crossoriginmessage); |
- m_workerGlobalScope->dispatchEvent(event); |
+ workerGlobalScope()->dispatchEvent(event); |
} |
void ServiceWorkerGlobalScopeProxy::reportException(const String& errorMessage, int lineNumber, int columnNumber, const String& sourceURL, int) |
{ |
- m_client.reportException(errorMessage, lineNumber, columnNumber, sourceURL); |
+ client().reportException(errorMessage, lineNumber, columnNumber, sourceURL); |
} |
void ServiceWorkerGlobalScopeProxy::reportConsoleMessage(PassRefPtrWillBeRawPtr<ConsoleMessage> consoleMessage) |
{ |
- m_client.reportConsoleMessage(consoleMessage->source(), consoleMessage->level(), consoleMessage->message(), consoleMessage->lineNumber(), consoleMessage->url()); |
+ client().reportConsoleMessage(consoleMessage->source(), consoleMessage->level(), consoleMessage->message(), consoleMessage->lineNumber(), consoleMessage->url()); |
} |
void ServiceWorkerGlobalScopeProxy::postMessageToPageInspector(const String& message) |
{ |
- m_document.postInspectorTask(BLINK_FROM_HERE, createCrossThreadTask(&WebEmbeddedWorkerImpl::postMessageToPageInspector, &m_embeddedWorker, message)); |
+ ASSERT(m_embeddedWorker); |
+ document().postInspectorTask(BLINK_FROM_HERE, createCrossThreadTask(&WebEmbeddedWorkerImpl::postMessageToPageInspector, m_embeddedWorker, message)); |
} |
void ServiceWorkerGlobalScopeProxy::didEvaluateWorkerScript(bool success) |
{ |
- m_client.didEvaluateWorkerScript(success); |
+ client().didEvaluateWorkerScript(success); |
} |
void ServiceWorkerGlobalScopeProxy::didInitializeWorkerContext() |
{ |
- ASSERT(m_workerGlobalScope); |
- ScriptState::Scope scope(m_workerGlobalScope->script()->scriptState()); |
- m_client.didInitializeWorkerContext(m_workerGlobalScope->script()->context(), WebURL(m_documentURL)); |
+ ScriptState::Scope scope(workerGlobalScope()->script()->scriptState()); |
+ client().didInitializeWorkerContext(workerGlobalScope()->script()->context(), WebURL(m_documentURL)); |
} |
void ServiceWorkerGlobalScopeProxy::workerGlobalScopeStarted(WorkerGlobalScope* workerGlobalScope) |
{ |
ASSERT(!m_workerGlobalScope); |
m_workerGlobalScope = static_cast<ServiceWorkerGlobalScope*>(workerGlobalScope); |
- m_client.workerContextStarted(this); |
+ client().workerContextStarted(this); |
} |
void ServiceWorkerGlobalScopeProxy::workerGlobalScopeClosed() |
{ |
- m_document.postTask(BLINK_FROM_HERE, createCrossThreadTask(&WebEmbeddedWorkerImpl::terminateWorkerContext, &m_embeddedWorker)); |
+ ASSERT(m_embeddedWorker); |
+ document().postTask(BLINK_FROM_HERE, createCrossThreadTask(&WebEmbeddedWorkerImpl::terminateWorkerContext, m_embeddedWorker)); |
} |
void ServiceWorkerGlobalScopeProxy::willDestroyWorkerGlobalScope() |
{ |
- v8::HandleScope handleScope(m_workerGlobalScope->thread()->isolate()); |
- m_client.willDestroyWorkerContext(m_workerGlobalScope->script()->context()); |
+ v8::HandleScope handleScope(workerGlobalScope()->thread()->isolate()); |
+ client().willDestroyWorkerContext(workerGlobalScope()->script()->context()); |
m_workerGlobalScope = nullptr; |
} |
void ServiceWorkerGlobalScopeProxy::workerThreadTerminated() |
{ |
- m_client.workerContextDestroyed(); |
+ client().workerContextDestroyed(); |
} |
ServiceWorkerGlobalScopeProxy::ServiceWorkerGlobalScopeProxy(WebEmbeddedWorkerImpl& embeddedWorker, Document& document, WebServiceWorkerContextClient& client) |
- : m_embeddedWorker(embeddedWorker) |
- , m_document(document) |
+ : m_embeddedWorker(&embeddedWorker) |
+ , m_document(&document) |
, m_documentURL(document.url().copy()) |
- , m_client(client) |
+ , m_client(&client) |
, m_workerGlobalScope(nullptr) |
{ |
} |
+void ServiceWorkerGlobalScopeProxy::detach() |
+{ |
+ m_embeddedWorker = nullptr; |
+ m_document = nullptr; |
+ m_client = nullptr; |
+ m_workerGlobalScope = nullptr; |
+} |
+ |
+WebServiceWorkerContextClient& ServiceWorkerGlobalScopeProxy::client() const |
+{ |
+ ASSERT(m_client); |
+ return *m_client; |
+} |
+ |
+Document& ServiceWorkerGlobalScopeProxy::document() const |
+{ |
+ ASSERT(m_document); |
+ return *m_document; |
+} |
+ |
+ServiceWorkerGlobalScope* ServiceWorkerGlobalScopeProxy::workerGlobalScope() const |
+{ |
+ ASSERT(m_workerGlobalScope); |
+ return m_workerGlobalScope; |
+} |
+ |
} // namespace blink |