Index: Source/modules/serviceworkers/ServiceWorkerContainerTest.cpp |
diff --git a/Source/modules/serviceworkers/ServiceWorkerContainerTest.cpp b/Source/modules/serviceworkers/ServiceWorkerContainerTest.cpp |
index 73ef62c4c7fb035684857ff1acfadc06217a62d6..5205b50ec6eee4d8a75ba057ccfccf344165212d 100644 |
--- a/Source/modules/serviceworkers/ServiceWorkerContainerTest.cpp |
+++ b/Source/modules/serviceworkers/ServiceWorkerContainerTest.cpp |
@@ -205,6 +205,18 @@ protected: |
container->willBeDetachedFromFrame(); |
} |
+ void testGetRegistrationRejected(const String& documentURL, const ScriptValueTest& valueTest) |
+ { |
+ provide(adoptPtr(new NotReachedWebServiceWorkerProvider())); |
+ |
+ ServiceWorkerContainer* container = ServiceWorkerContainer::create(executionContext()); |
+ ScriptState::Scope scriptScope(scriptState()); |
+ ScriptPromise promise = container->getRegistration(scriptState(), documentURL); |
+ expectRejected(scriptState(), promise, valueTest); |
+ |
+ container->willBeDetachedFromFrame(); |
+ } |
+ |
private: |
OwnPtr<DummyPageHolder> m_page; |
}; |
@@ -252,11 +264,28 @@ TEST_F(ServiceWorkerContainerTest, Unregister_CrossOriginScopeIsRejected) |
ExpectDOMException("SecurityError", "The scope must match the current origin.")); |
} |
+TEST_F(ServiceWorkerContainerTest, GetRegistration_NonSecureOriginIsRejected) |
+{ |
+ setPageURL("http://www.example.com/"); |
+ testGetRegistrationRejected( |
+ "http://www.example.com/", |
+ ExpectDOMException("NotSupportedError", "Only secure origins are allowed. http://goo.gl/lq4gCo")); |
+} |
+ |
+TEST_F(ServiceWorkerContainerTest, GetRegistration_CrossOriginURLIsRejected) |
+{ |
+ setPageURL("https://www.example.com/"); |
+ testGetRegistrationRejected( |
+ "https://foo.example.com/", // Differs by host |
+ ExpectDOMException("SecurityError", "The documentURL must match the current origin.")); |
+} |
+ |
class StubWebServiceWorkerProvider { |
public: |
StubWebServiceWorkerProvider() |
: m_registerCallCount(0) |
, m_unregisterCallCount(0) |
+ , m_getRegistrationCallCount(0) |
{ |
} |
@@ -274,6 +303,8 @@ public: |
const WebURL& registerScriptURL() { return m_registerScriptURL; } |
size_t unregisterCallCount() { return m_unregisterCallCount; } |
const WebURL& unregisterScope() { return m_unregisterScope; } |
+ size_t getRegistrationCallCount() { return m_getRegistrationCallCount; } |
+ const WebURL& getRegistrationURL() { return m_getRegistrationURL; } |
private: |
class WebServiceWorkerProviderImpl : public WebServiceWorkerProvider { |
@@ -300,10 +331,18 @@ private: |
m_unregistrationCallbacksToDelete.append(adoptPtr(callbacks)); |
} |
+ virtual void getRegistration(const WebURL& documentURL, WebServiceWorkerGetRegistrationCallbacks* callbacks) OVERRIDE |
+ { |
+ m_owner.m_getRegistrationCallCount++; |
+ m_owner.m_getRegistrationURL = documentURL; |
+ m_getRegistrationCallbacksToDelete.append(adoptPtr(callbacks)); |
+ } |
+ |
private: |
StubWebServiceWorkerProvider& m_owner; |
Vector<OwnPtr<WebServiceWorkerRegistrationCallbacks> > m_registrationCallbacksToDelete; |
Vector<OwnPtr<WebServiceWorkerUnregistrationCallbacks> > m_unregistrationCallbacksToDelete; |
+ Vector<OwnPtr<WebServiceWorkerGetRegistrationCallbacks> > m_getRegistrationCallbacksToDelete; |
}; |
private: |
@@ -312,6 +351,8 @@ private: |
WebURL m_registerScriptURL; |
size_t m_unregisterCallCount; |
WebURL m_unregisterScope; |
+ size_t m_getRegistrationCallCount; |
+ WebURL m_getRegistrationURL; |
}; |
TEST_F(ServiceWorkerContainerTest, RegisterUnregister_NonHttpsSecureOriginDelegatesToProvider) |
@@ -347,5 +388,24 @@ TEST_F(ServiceWorkerContainerTest, RegisterUnregister_NonHttpsSecureOriginDelega |
container->willBeDetachedFromFrame(); |
} |
+TEST_F(ServiceWorkerContainerTest, GetRegistration_OmittedDocumentURLDefaultsToPageURL) |
+{ |
+ setPageURL("http://localhost/x/index.html"); |
+ |
+ StubWebServiceWorkerProvider stubProvider; |
+ provide(stubProvider.provider()); |
+ |
+ ServiceWorkerContainer* container = ServiceWorkerContainer::create(executionContext()); |
+ |
+ { |
+ ScriptState::Scope scriptScope(scriptState()); |
+ container->getRegistration(scriptState(), ""); |
+ EXPECT_EQ(1ul, stubProvider.getRegistrationCallCount()); |
+ EXPECT_EQ(WebURL(KURL(KURL(), "http://localhost/x/index.html")), stubProvider.getRegistrationURL()); |
+ } |
+ |
+ container->willBeDetachedFromFrame(); |
+} |
+ |
} // namespace |
} // namespace blink |