Commit 7e4d2558 authored by dominicc@chromium.org's avatar dominicc@chromium.org

Add the navigator.serviceWorker.waiting property.

The value of this property will be null because it is not being set by
the embedder yet.

BUG=379012

Review URL: https://codereview.chromium.org/313553002

git-svn-id: svn://svn.chromium.org/blink/trunk@175520 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent e738ef9f
......@@ -52,6 +52,7 @@ PASS window.cached_navigator_battery.onlevelchange is null
PASS window.cached_navigator_connection.ontypechange is null
PASS window.cached_navigator_connection.type is window.navigator.connection.type
PASS window.cached_navigator_serviceWorker.controller is null
PASS window.cached_navigator_serviceWorker.waiting is null
PASS window.cached_performance.onwebkitresourcetimingbufferfull is null
PASS window.cached_performance_navigation.redirectCount is 0
PASS window.cached_performance_navigation.type is 0
......
......@@ -52,6 +52,7 @@ PASS window.cached_navigator_battery.onlevelchange is null
PASS window.cached_navigator_connection.ontypechange is null
PASS window.cached_navigator_connection.type is window.navigator.connection.type
PASS window.cached_navigator_serviceWorker.controller is null
PASS window.cached_navigator_serviceWorker.waiting is null
PASS window.cached_performance.onwebkitresourcetimingbufferfull is null
PASS window.cached_performance_navigation.redirectCount is 0
PASS window.cached_performance_navigation.type is 0
......
......@@ -52,6 +52,7 @@ PASS window.cached_navigator_battery.onlevelchange is null
PASS window.cached_navigator_connection.ontypechange is null
PASS window.cached_navigator_connection.type is window.navigator.connection.type
PASS window.cached_navigator_serviceWorker.controller is null
PASS window.cached_navigator_serviceWorker.waiting is null
PASS window.cached_performance.onwebkitresourcetimingbufferfull is null
PASS window.cached_performance_navigation.redirectCount is 0
PASS window.cached_performance_navigation.type is 0
......
......@@ -60,6 +60,7 @@ PASS oldChildWindow.navigator.platform is newChildWindow.navigator.platform
PASS oldChildWindow.navigator.product is newChildWindow.navigator.product
PASS oldChildWindow.navigator.productSub is newChildWindow.navigator.productSub
PASS oldChildWindow.navigator.serviceWorker.controller is newChildWindow.navigator.serviceWorker.controller
PASS oldChildWindow.navigator.serviceWorker.waiting is newChildWindow.navigator.serviceWorker.waiting
PASS oldChildWindow.navigator.userAgent is newChildWindow.navigator.userAgent
PASS oldChildWindow.navigator.vendor is newChildWindow.navigator.vendor
PASS oldChildWindow.navigator.vendorSub is newChildWindow.navigator.vendorSub
......
......@@ -60,6 +60,7 @@ PASS childWindow.navigator.platform is window.navigator.platform
PASS childWindow.navigator.product is window.navigator.product
PASS childWindow.navigator.productSub is window.navigator.productSub
FAIL childWindow.navigator.serviceWorker.controller should be null. Threw exception TypeError: Cannot read property 'controller' of null
FAIL childWindow.navigator.serviceWorker.waiting should be null. Threw exception TypeError: Cannot read property 'waiting' of null
PASS childWindow.navigator.userAgent is ''
PASS childWindow.navigator.vendor is window.navigator.vendor
PASS childWindow.navigator.vendorSub is ''
......
......@@ -59,6 +59,7 @@ PASS childWindow.navigator.platform is window.navigator.platform
PASS childWindow.navigator.product is window.navigator.product
PASS childWindow.navigator.productSub is window.navigator.productSub
PASS childWindow.navigator.serviceWorker.controller is null
PASS childWindow.navigator.serviceWorker.waiting is null
PASS childWindow.navigator.userAgent is ''
PASS childWindow.navigator.vendor is window.navigator.vendor
PASS childWindow.navigator.vendorSub is ''
......
<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
function getPropertyDescriptor(name) {
return (
Object.getOwnPropertyDescriptor(ServiceWorkerContainer.prototype, name) ||
// FIXME: Remove this when http://crbug.com/43394 is fixed.
Object.getOwnPropertyDescriptor(navigator.serviceWorker, name));
}
test(function() {
assert_true('ServiceWorkerContainer' in window,
'the constructor should be defined');
assert_throws(null, function() { new ServiceWorkerContainer(); },
'the constructor should not be callable with "new"');
assert_throws(null, function() { ServiceWorkerContainer(); },
'the constructor should not be callable');
var descriptor = getPropertyDescriptor('waiting');
assert_false(descriptor.configurable,
'the waiting property should be Unforgeable');
}, 'ServiceWorkerContainer interface');
</script>
......@@ -137,21 +137,21 @@ const AtomicString& ServiceWorker::state() const
}
}
PassRefPtr<ServiceWorker> ServiceWorker::from(ScriptState* scriptState, WebType* worker)
PassRefPtr<ServiceWorker> ServiceWorker::from(ExecutionContext* executionContext, WebType* worker)
{
blink::WebServiceWorkerProxy* proxy = worker->proxy();
ServiceWorker* existingServiceWorker = proxy ? proxy->unwrap() : 0;
if (existingServiceWorker) {
ASSERT(existingServiceWorker->executionContext() == scriptState->executionContext());
ASSERT(existingServiceWorker->executionContext() == executionContext);
return existingServiceWorker;
}
return create(scriptState->executionContext(), adoptPtr(worker));
return create(executionContext, adoptPtr(worker));
}
PassRefPtr<ServiceWorker> ServiceWorker::from(ScriptPromiseResolverWithContext* resolver, WebType* worker)
{
RefPtr<ServiceWorker> serviceWorker = ServiceWorker::from(resolver->scriptState(), worker);
RefPtr<ServiceWorker> serviceWorker = ServiceWorker::from(resolver->scriptState()->executionContext(), worker);
ScriptState::Scope scope(resolver->scriptState());
serviceWorker->waitOnPromise(resolver->promise());
......
......@@ -52,15 +52,13 @@ class ServiceWorker
, public ScriptWrappable
, public blink::WebServiceWorkerProxy {
public:
static PassRefPtr<ServiceWorker> create(ExecutionContext*, PassOwnPtr<blink::WebServiceWorker>);
virtual ~ServiceWorker() { }
// For CallbackPromiseAdapter
typedef blink::WebServiceWorker WebType;
static PassRefPtr<ServiceWorker> from(ScriptPromiseResolverWithContext*, WebType* worker);
static PassRefPtr<ServiceWorker> from(ScriptState*, WebType*);
static PassRefPtr<ServiceWorker> from(ExecutionContext*, WebType*);
void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, ExceptionState&);
......@@ -79,6 +77,7 @@ public:
private:
class ThenFunction;
static PassRefPtr<ServiceWorker> create(ExecutionContext*, PassOwnPtr<blink::WebServiceWorker>);
ServiceWorker(ExecutionContext*, PassOwnPtr<blink::WebServiceWorker>);
void onPromiseResolved();
void waitOnPromise(ScriptPromise);
......
......@@ -160,13 +160,31 @@ void ServiceWorkerContainer::setCurrentServiceWorker(blink::WebServiceWorker* se
setController(serviceWorker);
}
// If the WebServiceWorker is up for adoption (does not have a
// WebServiceWorkerProxy owner), rejects the adoption by deleting the
// WebServiceWorker.
static void deleteIfNoExistingOwner(blink::WebServiceWorker* serviceWorker)
{
if (serviceWorker && !serviceWorker->proxy())
delete serviceWorker;
}
void ServiceWorkerContainer::setWaiting(blink::WebServiceWorker* serviceWorker)
{
if (!executionContext()) {
deleteIfNoExistingOwner(serviceWorker);
return;
}
m_waiting = ServiceWorker::from(executionContext(), serviceWorker);
}
void ServiceWorkerContainer::setController(blink::WebServiceWorker* serviceWorker)
{
if (!executionContext()) {
delete serviceWorker;
deleteIfNoExistingOwner(serviceWorker);
return;
}
m_controller = ServiceWorker::create(executionContext(), adoptPtr(serviceWorker));
m_controller = ServiceWorker::from(executionContext(), serviceWorker);
}
void ServiceWorkerContainer::dispatchMessageEvent(const blink::WebString& message, const blink::WebMessagePortChannelArray& webChannels)
......
......@@ -64,6 +64,7 @@ public:
void detachClient();
PassRefPtrWillBeRawPtr<ServiceWorker> waiting() { return m_waiting.get(); }
PassRefPtrWillBeRawPtr<ServiceWorker> controller() { return m_controller.get(); }
ScriptPromise ready(ScriptState*);
......@@ -71,6 +72,7 @@ public:
ScriptPromise unregisterServiceWorker(ScriptState*, const String& scope = String());
// WebServiceWorkerProviderClient overrides.
virtual void setWaiting(blink::WebServiceWorker*) OVERRIDE;
virtual void setController(blink::WebServiceWorker*) OVERRIDE;
virtual void dispatchMessageEvent(const blink::WebString& message, const blink::WebMessagePortChannelArray&) OVERRIDE;
......@@ -81,6 +83,7 @@ private:
explicit ServiceWorkerContainer(ExecutionContext*);
blink::WebServiceWorkerProvider* m_provider;
RefPtr<ServiceWorker> m_waiting;
RefPtr<ServiceWorker> m_controller;
};
......
......@@ -31,6 +31,8 @@
[
RuntimeEnabled=ServiceWorker
] interface ServiceWorkerContainer {
[Unforgeable] readonly attribute ServiceWorker waiting;
// FIXME: controller should be unforgeable
readonly attribute ServiceWorker controller;
[CallWith=ScriptState] readonly attribute Promise ready;
......
......@@ -43,7 +43,7 @@ class WebServiceWorkerProviderClient {
public:
virtual ~WebServiceWorkerProviderClient() { }
// The callee will take ownership of the given WebServiceWorker object.
virtual void setWaiting(WebServiceWorker*) = 0;
virtual void setController(WebServiceWorker*) = 0;
// FIXME: Remove when the embedder switches to setController.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment