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

Side by Side Diff: Source/modules/serviceworkers/ServiceWorkerClients.cpp

Issue 779133003: [WORK IN PROGRESS] ServiceWorkerClients.openWindow() [Blink] (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased Created 5 years, 11 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "modules/serviceworkers/ServiceWorkerClients.h" 6 #include "modules/serviceworkers/ServiceWorkerClients.h"
7 7
8 #include "bindings/core/v8/CallbackPromiseAdapter.h" 8 #include "bindings/core/v8/CallbackPromiseAdapter.h"
9 #include "bindings/core/v8/ScriptPromiseResolver.h" 9 #include "bindings/core/v8/ScriptPromiseResolver.h"
10 #include "core/dom/ExceptionCode.h" 10 #include "core/dom/ExceptionCode.h"
11 #include "core/workers/WorkerGlobalScope.h"
12 #include "core/workers/WorkerLocation.h"
11 #include "modules/serviceworkers/ServiceWorkerError.h" 13 #include "modules/serviceworkers/ServiceWorkerError.h"
12 #include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h" 14 #include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h"
13 #include "modules/serviceworkers/ServiceWorkerWindowClient.h" 15 #include "modules/serviceworkers/ServiceWorkerWindowClient.h"
14 #include "public/platform/WebServiceWorkerClientsInfo.h" 16 #include "public/platform/WebServiceWorkerClientsInfo.h"
15 #include "wtf/RefPtr.h" 17 #include "wtf/RefPtr.h"
16 #include "wtf/Vector.h" 18 #include "wtf/Vector.h"
17 19
18 namespace blink { 20 namespace blink {
19 21
20 namespace { 22 namespace {
(...skipping 15 matching lines...) Expand all
36 delete webClientsRaw; 38 delete webClientsRaw;
37 } 39 }
38 40
39 private: 41 private:
40 WTF_MAKE_NONCOPYABLE(ClientArray); 42 WTF_MAKE_NONCOPYABLE(ClientArray);
41 ClientArray() = delete; 43 ClientArray() = delete;
42 }; 44 };
43 45
44 } // namespace 46 } // namespace
45 47
48 class ServiceWorkerClients::OpenWindowCallbacks : public WebServiceWorkerOpenWin dowCallbacks {
49 WTF_MAKE_NONCOPYABLE(OpenWindowCallbacks);
50 public:
51 explicit OpenWindowCallbacks(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> r esolver)
52 : m_resolver(resolver) { }
53 virtual ~OpenWindowCallbacks() { }
54
55 void onSuccess(int clientId, const WebURL& url) override
56 {
57 WebServiceWorkerClientInfo info;
58 // FIXME: Payload should include state snapshot of visibility, focused
59 info.clientID = clientId;
60 info.frameType = WebURLRequest::FrameTypeTopLevel;
61 info.url = url;
62 m_resolver->resolve(ServiceWorkerClient::create(info));
63 m_resolver.clear();
64 }
65
66 void onError() override
67 {
68 // FIXME: Route back a useful error message of some sort.
69 m_resolver->reject(DOMException::create(SecurityError, "Failed to open t he requested URL."));
70 m_resolver.clear();
71 }
72
73 private:
74 RefPtrWillBePersistent<ScriptPromiseResolver> m_resolver;
75 };
76
46 ServiceWorkerClients* ServiceWorkerClients::create() 77 ServiceWorkerClients* ServiceWorkerClients::create()
47 { 78 {
48 return new ServiceWorkerClients(); 79 return new ServiceWorkerClients();
49 } 80 }
50 81
51 ServiceWorkerClients::ServiceWorkerClients() 82 ServiceWorkerClients::ServiceWorkerClients()
52 { 83 {
53 } 84 }
54 85
55 ScriptPromise ServiceWorkerClients::getAll(ScriptState* scriptState, const Clien tQueryOptions& options) 86 ScriptPromise ServiceWorkerClients::getAll(ScriptState* scriptState, const Clien tQueryOptions& options)
(...skipping 10 matching lines...) Expand all
66 if (options.type() != "window") { 97 if (options.type() != "window") {
67 // FIXME: Currently we only support WindowClients. 98 // FIXME: Currently we only support WindowClients.
68 resolver->reject(DOMException::create(NotSupportedError, "type parameter of getAll is not supported.")); 99 resolver->reject(DOMException::create(NotSupportedError, "type parameter of getAll is not supported."));
69 return promise; 100 return promise;
70 } 101 }
71 102
72 ServiceWorkerGlobalScopeClient::from(scriptState->executionContext())->getCl ients(new CallbackPromiseAdapter<ClientArray, ServiceWorkerError>(resolver)); 103 ServiceWorkerGlobalScopeClient::from(scriptState->executionContext())->getCl ients(new CallbackPromiseAdapter<ClientArray, ServiceWorkerError>(resolver));
73 return promise; 104 return promise;
74 } 105 }
75 106
107 ScriptPromise ServiceWorkerClients::openWindow(ScriptState* scriptState, const S tring& url)
108 {
109 RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver:: create(scriptState);
110 ExecutionContext* context = scriptState->executionContext();
111 ScriptPromise promise = resolver->promise();
112
113 KURL parsedURL = KURL(toWorkerGlobalScope(context)->location()->url(), url);
114 if (!parsedURL.isValid()) {
115 resolver->reject(DOMException::create(SyntaxError, "'" + url + "' is not a valid URL."));
116 return promise;
117 }
118
119 // FIXME: Is this (1) correct and (2) sufficient?
120 if (!context->securityOrigin()->canRequest(parsedURL)) {
121 resolver->reject(DOMException::create(SecurityError, "Can only open docu ments in the worker's origin."));
122 return promise;
123 }
124
125 ServiceWorkerGlobalScopeClient::from(context)->openWindow(parsedURL, new Ope nWindowCallbacks(resolver));
126 return promise;
127 }
128
76 } // namespace blink 129 } // namespace blink
OLDNEW
« no previous file with comments | « Source/modules/serviceworkers/ServiceWorkerClients.h ('k') | Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698