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

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

Issue 318393002: Initial implementation of ServiceWorkerGlobalScope.fetch() (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add fetch LayoutTest Created 6 years, 6 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
« no previous file with comments | « Source/modules/serviceworkers/FetchManager.h ('k') | Source/modules/serviceworkers/Request.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "FetchManager.h"
7
8 #include "bindings/v8/ScriptPromiseResolverWithContext.h"
9 #include "core/dom/DOMError.h"
yhirano 2014/06/11 06:51:30 DOMError is now not used.
horo 2014/06/11 09:06:23 Done.
10 #include "core/dom/ExceptionCode.h"
11 #include "core/fileapi/Blob.h"
12 #include "core/loader/ThreadableLoader.h"
13 #include "core/loader/ThreadableLoaderClient.h"
14 #include "modules/serviceworkers/Response.h"
15 #include "wtf/HashSet.h"
16
17 namespace WebCore {
18
19 class FetchManager::Loader : public ThreadableLoaderClient {
20 public:
21 Loader(ExecutionContext*, FetchManager*, PassRefPtr<ScriptPromiseResolverWit hContext>, PassOwnPtr<ResourceRequest>);
22 ~Loader();
23 virtual void didReceiveResponse(unsigned long, const ResourceResponse&);
24 virtual void didFinishLoading(unsigned long, double);
25 virtual void didFail(const ResourceError&);
26 virtual void didFailAccessControlCheck(const ResourceError&);
27 virtual void didFailRedirectCheck();
28 virtual void didDownloadData(int);
29
30 void start();
31 void cleanup();
32
33 private:
34 void failed();
35 void notiyfyFinished();
36
37 ExecutionContext* m_executionContext;
38 FetchManager* m_fetchManager;
39 RefPtr<ScriptPromiseResolverWithContext> m_resolver;
40 OwnPtr<ResourceRequest> m_request;
41 RefPtr<ThreadableLoader> m_loader;
42 ResourceResponse m_response;
43 long long m_downloadedBlobLength;
44 };
45
46 FetchManager::Loader::Loader(ExecutionContext* executionContext, FetchManager* f etchManager, PassRefPtr<ScriptPromiseResolverWithContext> resolver, PassOwnPtr<R esourceRequest> request)
47 : m_executionContext(executionContext)
48 , m_fetchManager(fetchManager)
49 , m_resolver(resolver)
50 , m_request(request)
51 , m_downloadedBlobLength(0)
52 {
53 }
54
55 FetchManager::Loader::~Loader()
56 {
57 if (m_loader)
58 m_loader->cancel();
59 }
60
61 void FetchManager::Loader::didReceiveResponse(unsigned long, const ResourceRespo nse& response)
62 {
63 m_response = response;
64 }
65
66 void FetchManager::Loader::didFinishLoading(unsigned long, double)
67 {
68 OwnPtr<BlobData> blobData = BlobData::create();
69 String filePath = m_response.downloadedFilePath();
70 if (!filePath.isEmpty() && m_downloadedBlobLength) {
71 blobData->appendFile(filePath);
72 // TODO(horo): Set the ContentType correctly.
73 }
74 Dictionary options;
75 // TODO(horo): fill options.
76 RefPtrWillBeRawPtr<Blob> blob = Blob::create(BlobDataHandle::create(blobData .release(), m_downloadedBlobLength));
77 // TODO(horo): Handle response status correctly.
78 m_resolver->resolve(Response::create(blob.get(), options));
79 notiyfyFinished();
80 }
81
82 void FetchManager::Loader::didFail(const ResourceError& error)
83 {
84 failed();
tyoshino (SeeGerritForStatus) 2014/06/11 09:12:01 I suggest that you have a flag e.g. m_failed to en
horo 2014/06/11 11:22:12 Done.
85 }
86
87 void FetchManager::Loader::didFailAccessControlCheck(const ResourceError& error)
88 {
89 failed();
90 }
91
92 void FetchManager::Loader::didFailRedirectCheck()
93 {
94 failed();
95 }
96
97 void FetchManager::Loader::didDownloadData(int dataLength)
98 {
99 m_downloadedBlobLength += dataLength;
100 }
101
102 void FetchManager::Loader::start()
103 {
104 m_request->setDownloadToFile(true);
105 ThreadableLoaderOptions options;
106 // TODO(horo): Fill options.
107 ResourceLoaderOptions resourceLoaderOptions;
108 resourceLoaderOptions.dataBufferingPolicy = DoNotBufferData;
109 // TODO(horo): Fill resourceLoaderOptions.
110 m_loader = ThreadableLoader::create(*m_executionContext, this, *m_request, o ptions, resourceLoaderOptions);
111 if (!m_loader)
112 m_resolver->reject(DOMException::create(InvalidStateError));
tyoshino (SeeGerritForStatus) 2014/06/11 09:12:01 maybe this also should be TypeError. is there any
horo 2014/06/11 11:22:12 Deleted this lines. m_executionContext->isWorkerGl
113 }
114
115 void FetchManager::Loader::cleanup()
116 {
117 m_fetchManager = 0;
tyoshino (SeeGerritForStatus) 2014/06/11 09:12:01 add comment like "prevent notification"
horo 2014/06/11 11:22:11 Done.
118 if (m_loader) {
119 m_loader->cancel();
120 m_loader.clear();
121 }
122 }
123
124 void FetchManager::Loader::failed()
125 {
126 m_resolver->reject(DOMException::create(NetworkError));
tyoshino (SeeGerritForStatus) 2014/06/11 09:12:01 This should be a TypeError. I also had doubts and
horo 2014/06/11 11:22:11 Could you please let me know how to create TypeErr
tyoshino (SeeGerritForStatus) 2014/06/12 03:27:24 snip How about this? ScriptState* state = m_reso
horo 2014/06/12 05:21:16 Done. Thank you.
127 notiyfyFinished();
128 }
129
130 void FetchManager::Loader::notiyfyFinished()
tyoshino (SeeGerritForStatus) 2014/06/11 09:12:01 notiyfy -> notify
horo 2014/06/11 11:22:12 Done.
131 {
132 if (m_fetchManager)
133 m_fetchManager->removeLoader(this);
134 }
135
136 FetchManager::FetchManager(ExecutionContext* executionContext)
137 : m_executionContext(executionContext)
138 {
139 }
140
141 FetchManager::~FetchManager()
142 {
143 for (HashSet<OwnPtr<Loader> >::iterator it = m_loaders.begin(); it != m_load ers.end(); ++it) {
144 (*it)->cleanup();
145 }
146 }
147
148 ScriptPromise FetchManager::fetch(ScriptState* scriptState, PassOwnPtr<ResourceR equest> request)
149 {
150 RefPtr<ScriptPromiseResolverWithContext> resolver = ScriptPromiseResolverWit hContext::create(scriptState);
151 ScriptPromise promise = resolver->promise();
152
153 OwnPtr<Loader> loader(adoptPtr(new Loader(m_executionContext, this, resolver , request)));
tyoshino (SeeGerritForStatus) 2014/06/11 09:12:01 resolver.release()
horo 2014/06/11 11:22:12 Done.
154 (*m_loaders.add(loader.release()).storedValue)->start();
155 return promise;
156 }
157
158 void FetchManager::removeLoader(Loader* loader)
tyoshino (SeeGerritForStatus) 2014/06/11 09:12:01 how about naming this like onLoaderFinished?
horo 2014/06/11 11:22:11 Done.
159 {
160 m_loaders.remove(loader);
161 }
162
163 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/modules/serviceworkers/FetchManager.h ('k') | Source/modules/serviceworkers/Request.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698