diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/modules/serviceworkers/NavigatorServiceWorker.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/modules/serviceworkers/NavigatorServiceWorker.cpp | 158 |
1 files changed, 35 insertions, 123 deletions
diff --git a/chromium/third_party/WebKit/Source/modules/serviceworkers/NavigatorServiceWorker.cpp b/chromium/third_party/WebKit/Source/modules/serviceworkers/NavigatorServiceWorker.cpp index c68f1442c61..3af213969a3 100644 --- a/chromium/third_party/WebKit/Source/modules/serviceworkers/NavigatorServiceWorker.cpp +++ b/chromium/third_party/WebKit/Source/modules/serviceworkers/NavigatorServiceWorker.cpp @@ -1,60 +1,20 @@ -/* - * Copyright (C) 2013 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + #include "config.h" #include "modules/serviceworkers/NavigatorServiceWorker.h" -#include "RuntimeEnabledFeatures.h" -#include "bindings/v8/CallbackPromiseAdapter.h" -#include "bindings/v8/ScriptPromiseResolver.h" #include "core/dom/Document.h" -#include "core/dom/ExceptionCode.h" -#include "core/dom/ExecutionContext.h" -#include "core/frame/Frame.h" -#include "core/loader/DocumentLoader.h" -#include "core/loader/FrameLoaderClient.h" -#include "core/workers/SharedWorker.h" -#include "modules/serviceworkers/ServiceWorker.h" -#include "modules/serviceworkers/ServiceWorkerError.h" -#include "public/platform/WebServiceWorkerProvider.h" -#include "public/platform/WebServiceWorkerProviderClient.h" -#include "public/platform/WebString.h" -#include "public/platform/WebURL.h" - -using blink::WebServiceWorkerProvider; -using blink::WebString; +#include "core/frame/LocalDOMWindow.h" +#include "core/frame/LocalFrame.h" +#include "core/frame/Navigator.h" +#include "modules/serviceworkers/ServiceWorkerContainer.h" namespace WebCore { -NavigatorServiceWorker::NavigatorServiceWorker(Navigator* navigator) - : DOMWindowProperty(navigator->frame()) - , m_navigator(navigator) +NavigatorServiceWorker::NavigatorServiceWorker(Navigator& navigator) + : DOMWindowProperty(navigator.frame()) { } @@ -62,104 +22,56 @@ NavigatorServiceWorker::~NavigatorServiceWorker() { } -const char* NavigatorServiceWorker::supplementName() -{ - return "NavigatorServiceWorker"; -} - -WebServiceWorkerProvider* NavigatorServiceWorker::ensureProvider() +NavigatorServiceWorker* NavigatorServiceWorker::from(Document& document) { - ASSERT(m_navigator->frame()); - if (!m_provider) { - Frame* frame = m_navigator->frame(); - - FrameLoaderClient* client = frame->loader().client(); - // FIXME: This is temporarily hooked up here until we hook up to the loading process. - m_provider = client->createServiceWorkerProvider(nullptr); - } - return m_provider.get(); + if (!document.frame() || !document.frame()->domWindow()) + return 0; + Navigator& navigator = document.frame()->domWindow()->navigator(); + return &from(navigator); } -NavigatorServiceWorker* NavigatorServiceWorker::from(Navigator* navigator) +NavigatorServiceWorker& NavigatorServiceWorker::from(Navigator& navigator) { NavigatorServiceWorker* supplement = toNavigatorServiceWorker(navigator); if (!supplement) { supplement = new NavigatorServiceWorker(navigator); - provideTo(navigator, supplementName(), adoptPtr(supplement)); + provideTo(navigator, supplementName(), adoptPtrWillBeNoop(supplement)); + // Initialize ServiceWorkerContainer too. + supplement->serviceWorker(); } - return supplement; + return *supplement; } -ScriptPromise NavigatorServiceWorker::registerServiceWorker(ExecutionContext* context, Navigator* navigator, const String& pattern, const String& url, ExceptionState& exceptionState) +NavigatorServiceWorker* NavigatorServiceWorker::toNavigatorServiceWorker(Navigator& navigator) { - return from(navigator)->registerServiceWorker(context, pattern, url, exceptionState); + return static_cast<NavigatorServiceWorker*>(WillBeHeapSupplement<Navigator>::from(navigator, supplementName())); } -ScriptPromise NavigatorServiceWorker::registerServiceWorker(ExecutionContext* executionContext, const String& pattern, const String& scriptSrc, ExceptionState& exceptionState) +const char* NavigatorServiceWorker::supplementName() { - ASSERT(RuntimeEnabledFeatures::serviceWorkerEnabled()); - ScriptPromise promise = ScriptPromise::createPending(executionContext); - RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(promise, executionContext); - - Frame* frame = m_navigator->frame(); - if (!frame) { - resolver->reject(DOMError::create(InvalidStateError, "No document available.")); - return promise; - } - - RefPtr<SecurityOrigin> documentOrigin = frame->document()->securityOrigin(); - - KURL patternURL = executionContext->completeURL(pattern); - if (!documentOrigin->canRequest(patternURL)) { - resolver->reject(DOMError::create(SecurityError, "Can only register for patterns in the document's origin.")); - return promise; - } - - KURL scriptURL = executionContext->completeURL(scriptSrc); - if (!documentOrigin->canRequest(scriptURL)) { - resolver->reject(DOMError::create(SecurityError, "Script must be in document's origin.")); - return promise; - } - - ensureProvider()->registerServiceWorker(patternURL, scriptURL, new CallbackPromiseAdapter<ServiceWorker, ServiceWorkerError>(resolver, executionContext)); - return promise; + return "NavigatorServiceWorker"; } -ScriptPromise NavigatorServiceWorker::unregisterServiceWorker(ExecutionContext* context, Navigator* navigator, const String& pattern, ExceptionState& exceptionState) +ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker(Navigator& navigator) { - return from(navigator)->unregisterServiceWorker(context, pattern, exceptionState); + return NavigatorServiceWorker::from(navigator).serviceWorker(); } -ScriptPromise NavigatorServiceWorker::unregisterServiceWorker(ExecutionContext* executionContext, const String& pattern, ExceptionState& exceptionState) +ServiceWorkerContainer* NavigatorServiceWorker::serviceWorker() { - ASSERT(RuntimeEnabledFeatures::serviceWorkerEnabled()); - ScriptPromise promise = ScriptPromise::createPending(executionContext); - RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(promise, executionContext); - - Frame* frame = m_navigator->frame(); - if (!frame) { - resolver->reject(DOMError::create(InvalidStateError, "No document available.")); - return promise; + if (!m_serviceWorker && frame()) { + ASSERT(frame()->domWindow()); + m_serviceWorker = ServiceWorkerContainer::create(frame()->domWindow()->executionContext()); } - - RefPtr<SecurityOrigin> documentOrigin = frame->document()->securityOrigin(); - - KURL patternURL = executionContext->completeURL(pattern); - if (!documentOrigin->canRequest(patternURL)) { - resolver->reject(DOMError::create(SecurityError, "Can only unregister for patterns in the document's origin.")); - - return promise; - } - - ensureProvider()->unregisterServiceWorker(patternURL, new CallbackPromiseAdapter<ServiceWorker, ServiceWorkerError>(resolver, executionContext)); - return promise; + return m_serviceWorker.get(); } void NavigatorServiceWorker::willDetachGlobalObjectFromFrame() { - m_provider = nullptr; - DOMWindowProperty::willDetachGlobalObjectFromFrame(); + if (m_serviceWorker) { + m_serviceWorker->detachClient(); + m_serviceWorker = nullptr; + } } - } // namespace WebCore |