Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2060)

Unified Diff: Source/modules/serviceworkers/NavigatorServiceWorker.cpp

Issue 26078002: Rename WebServiceWorkerRegistry to WebServiceWorkerProvider (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: resolver tweak Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/modules/serviceworkers/NavigatorServiceWorker.cpp
diff --git a/Source/modules/serviceworkers/NavigatorServiceWorker.cpp b/Source/modules/serviceworkers/NavigatorServiceWorker.cpp
index 172589dabc8495c7d21d80b0122b92f60e03ac66..8d78b642fff1143b54212d9beb6a31e12a98c92a 100644
--- a/Source/modules/serviceworkers/NavigatorServiceWorker.cpp
+++ b/Source/modules/serviceworkers/NavigatorServiceWorker.cpp
@@ -34,6 +34,7 @@
#include "V8ServiceWorker.h"
#include "bindings/v8/ScriptPromiseResolver.h"
#include "core/dom/Document.h"
+#include "core/dom/ExceptionCode.h"
#include "core/loader/DocumentLoader.h"
#include "core/loader/FrameLoaderClient.h"
#include "core/page/Frame.h"
@@ -41,10 +42,14 @@
#include "core/workers/SharedWorker.h"
#include "modules/serviceworkers/CallbackPromiseAdapter.h"
#include "modules/serviceworkers/ServiceWorker.h"
-#include "public/platform/WebServiceWorkerRegistry.h"
+#include "public/platform/WebServiceWorkerProvider.h"
+#include "public/platform/WebServiceWorkerProviderClient.h"
#include "public/platform/WebString.h"
#include "public/platform/WebURL.h"
+using WebKit::WebServiceWorkerProvider;
+using WebKit::WebString;
+
namespace WebCore {
NavigatorServiceWorker::NavigatorServiceWorker(Navigator* navigator)
@@ -61,6 +66,20 @@ const char* NavigatorServiceWorker::supplementName()
return "NavigatorServiceWorker";
}
+WebServiceWorkerProvider* NavigatorServiceWorker::serviceWorkerProvider()
+{
+ if (!m_provider) {
+ Frame* frame = m_navigator->frame();
+ if (!frame)
+ return 0;
+
+ 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();
+}
+
NavigatorServiceWorker* NavigatorServiceWorker::from(Navigator* navigator)
{
NavigatorServiceWorker* supplement = toNavigatorServiceWorker(navigator);
@@ -76,20 +95,37 @@ ScriptPromise NavigatorServiceWorker::registerServiceWorker(ScriptExecutionConte
return from(navigator)->registerServiceWorker(context, pattern, url, es);
}
-
ScriptPromise NavigatorServiceWorker::registerServiceWorker(ScriptExecutionContext* scriptExecutionContext, const String& pattern, const String& scriptSrc, ExceptionState& es)
{
ASSERT(RuntimeEnabledFeatures::serviceWorkerEnabled());
- FrameLoaderClient* client = m_navigator->frame()->loader()->client();
- // WTF? Surely there's a better way to resolve a url?
- KURL scriptUrl = m_navigator->frame()->document()->completeURL(scriptSrc);
- WebKit::WebServiceWorkerRegistry* peer = client->serviceWorkerRegistry();
- RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptExecutionContext);
+ Frame* frame = m_navigator->frame();
+
+ if (!frame) {
+ es.throwDOMException(InvalidStateError, "No document available.");
+ return ScriptPromise();
+ }
+
+ KURL documentUrl = frame->document()->url();
+ RefPtr<SecurityOrigin> documentOrigin = SecurityOrigin::create(documentUrl);
abarth-chromium 2013/10/11 18:08:14 Instead of creating a new security origin from the
alecflett 2013/10/11 18:52:23 Done.
- if (peer)
- peer->registerServiceWorker(pattern, scriptUrl, new CallbackPromiseAdapter(resolver, scriptExecutionContext));
+ KURL patternUrl = scriptExecutionContext->completeURL(pattern);
+ if (SecurityOrigin::create(patternUrl)->equal(documentOrigin.get())) {
abarth-chromium 2013/10/11 18:08:14 It's extremely rare that you want to call Security
alecflett 2013/10/11 18:52:23 Thanks I really wasn't sure what was appropriate t
+ es.throwSecurityError("Can only register for patterns in the document's origin.");
+ return ScriptPromise();
+ }
+
+ KURL scriptUrl = scriptExecutionContext->completeURL(scriptSrc);
+ if (SecurityOrigin::create(scriptUrl)->equal(documentOrigin.get())) {
abarth-chromium 2013/10/11 18:08:14 Ditto.
+ es.throwSecurityError("Script must be in document's origin.");
+ return ScriptPromise();
+ }
+
+ RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptExecutionContext);
+ WebKit::WebServiceWorkerProvider* provider = serviceWorkerProvider();
+ if (provider)
abarth-chromium 2013/10/11 18:08:14 How can this function return |0|? The only case w
+ provider->registerServiceWorker(patternUrl, scriptUrl, new CallbackPromiseAdapter(resolver, scriptExecutionContext));
else
- resolver->reject(PassRefPtr<ServiceWorker>(0));
+ resolver->reject(ScriptValue());
abarth-chromium 2013/10/11 18:08:14 I don't think this case can ever occur.
// call here?
return resolver->promise();
}
@@ -102,13 +138,27 @@ ScriptPromise NavigatorServiceWorker::unregisterServiceWorker(ScriptExecutionCon
ScriptPromise NavigatorServiceWorker::unregisterServiceWorker(ScriptExecutionContext* scriptExecutionContext, const String& pattern, ExceptionState& es)
{
ASSERT(RuntimeEnabledFeatures::serviceWorkerEnabled());
- FrameLoaderClient* client = m_navigator->frame()->loader()->client();
- WebKit::WebServiceWorkerRegistry* peer = client->serviceWorkerRegistry();
+ Frame* frame = m_navigator->frame();
+ if (!frame) {
+ es.throwDOMException(InvalidStateError, "No document available.");
+ return ScriptPromise();
+ }
+
+ KURL documentUrl = frame->document()->url();
+ RefPtr<SecurityOrigin> documentOrigin = SecurityOrigin::create(documentUrl);
abarth-chromium 2013/10/11 18:08:14 Same problem.
+
+ KURL patternUrl = scriptExecutionContext->completeURL(pattern);
+ if (SecurityOrigin::create(patternUrl)->equal(documentOrigin.get())) {
abarth-chromium 2013/10/11 18:08:14 ditto
+ es.throwSecurityError("Can only unregister for patterns in the document's origin.");
+ return ScriptPromise();
+ }
+
+ WebKit::WebServiceWorkerProvider* provider = serviceWorkerProvider();
RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptExecutionContext);
- if (peer)
- peer->unregisterServiceWorker(pattern, new CallbackPromiseAdapter(resolver, scriptExecutionContext));
+ if (provider)
abarth-chromium 2013/10/11 18:08:14 ditto
+ provider->unregisterServiceWorker(patternUrl, new CallbackPromiseAdapter(resolver, scriptExecutionContext));
else
- resolver->reject(PassRefPtr<ServiceWorker>(0));
+ resolver->reject(ScriptValue());
return resolver->promise();
}

Powered by Google App Engine
This is Rietveld 408576698