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

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

Issue 1228233007: Shows error messages in the inspector when .respondWith() is called with wrong responses. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: incorporated falken's comment Created 5 years, 5 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
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/RespondWithObserver.h" 6 #include "modules/serviceworkers/RespondWithObserver.h"
7 7
8 #include "bindings/core/v8/ScriptFunction.h" 8 #include "bindings/core/v8/ScriptFunction.h"
9 #include "bindings/core/v8/ScriptPromise.h" 9 #include "bindings/core/v8/ScriptPromise.h"
10 #include "bindings/core/v8/ScriptValue.h" 10 #include "bindings/core/v8/ScriptValue.h"
11 #include "bindings/core/v8/V8Binding.h" 11 #include "bindings/core/v8/V8Binding.h"
12 #include "bindings/modules/v8/V8Response.h" 12 #include "bindings/modules/v8/V8Response.h"
13 #include "core/dom/ExceptionCode.h" 13 #include "core/dom/ExceptionCode.h"
14 #include "core/dom/ExecutionContext.h" 14 #include "core/dom/ExecutionContext.h"
15 #include "core/inspector/ConsoleMessage.h" 15 #include "core/inspector/ConsoleMessage.h"
16 #include "core/streams/Stream.h" 16 #include "core/streams/Stream.h"
17 #include "modules/fetch/BodyStreamBuffer.h" 17 #include "modules/fetch/BodyStreamBuffer.h"
18 #include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h" 18 #include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h"
19 #include "platform/RuntimeEnabledFeatures.h" 19 #include "platform/RuntimeEnabledFeatures.h"
20 #include "public/platform/WebServiceWorkerResponse.h" 20 #include "public/platform/WebServiceWorkerResponse.h"
21 #include "wtf/Assertions.h" 21 #include "wtf/Assertions.h"
22 #include "wtf/RefPtr.h" 22 #include "wtf/RefPtr.h"
23 #include <v8.h> 23 #include <v8.h>
24 24
25 namespace blink { 25 namespace blink {
26 namespace {
27
28 // Returns the error message to let the developer know about the reason of the u nusual failures.
29 const String getMessageForResponseError(WebServiceWorkerResponseError error, con st KURL& requestURL)
30 {
31 String errorMessage = "The FetchEvent for \"" + requestURL.string() + "\" re sulted in a network error response: ";
32 switch (error) {
33 case WebServiceWorkerResponseErrorPromiseRejected:
34 errorMessage = errorMessage + "the promise was rejected.";
35 break;
36 case WebServiceWorkerResponseErrorDefaultPrevented:
37 errorMessage = errorMessage + "preventDefault() was called without calli ng respondWith().";
38 break;
39 case WebServiceWorkerResponseErrorNoV8Instance:
40 errorMessage = errorMessage + "an object that was not a Response was pas sed to respondWith().";
41 break;
42 case WebServiceWorkerResponseErrorResponseTypeError:
43 errorMessage = errorMessage + "the promise was resolved with an error re sponse object.";
44 break;
45 case WebServiceWorkerResponseErrorResponseTypeOpaque:
46 errorMessage = errorMessage + "an \"opaque\" response was used for a req uest whose type is not no-cors";
47 break;
48 case WebServiceWorkerResponseErrorResponseTypeNotBasicOrDefault:
49 errorMessage = errorMessage + "the response for a client request must ha ve type \"basic\" or \"default\".";
50 break;
51 case WebServiceWorkerResponseErrorBodyUsed:
52 errorMessage = errorMessage + "a Response whose \"bodyUsed\" is \"true\" cannot be used to respond to a request.";
53 break;
54 case WebServiceWorkerResponseErrorUnknown:
55 default:
56 errorMessage = errorMessage + "an unexpected error occurred.";
57 break;
58 }
59 return errorMessage;
60 }
61
62 } // namespace
26 63
27 class RespondWithObserver::ThenFunction final : public ScriptFunction { 64 class RespondWithObserver::ThenFunction final : public ScriptFunction {
28 public: 65 public:
29 enum ResolveType { 66 enum ResolveType {
30 Fulfilled, 67 Fulfilled,
31 Rejected, 68 Rejected,
32 }; 69 };
33 70
34 static v8::Local<v8::Function> createFunction(ScriptState* scriptState, Resp ondWithObserver* observer, ResolveType type) 71 static v8::Local<v8::Function> createFunction(ScriptState* scriptState, Resp ondWithObserver* observer, ResolveType type)
35 { 72 {
(...skipping 26 matching lines...) Expand all
62 m_observer->responseWasFulfilled(value); 99 m_observer->responseWasFulfilled(value);
63 } 100 }
64 m_observer = nullptr; 101 m_observer = nullptr;
65 return value; 102 return value;
66 } 103 }
67 104
68 Member<RespondWithObserver> m_observer; 105 Member<RespondWithObserver> m_observer;
69 ResolveType m_resolveType; 106 ResolveType m_resolveType;
70 }; 107 };
71 108
72 RespondWithObserver* RespondWithObserver::create(ExecutionContext* context, int eventID, WebURLRequest::FetchRequestMode requestMode, WebURLRequest::FrameType f rameType) 109 RespondWithObserver* RespondWithObserver::create(ExecutionContext* context, int eventID, const KURL& requestURL, WebURLRequest::FetchRequestMode requestMode, We bURLRequest::FrameType frameType)
73 { 110 {
74 return new RespondWithObserver(context, eventID, requestMode, frameType); 111 return new RespondWithObserver(context, eventID, requestURL, requestMode, fr ameType);
75 } 112 }
76 113
77 void RespondWithObserver::contextDestroyed() 114 void RespondWithObserver::contextDestroyed()
78 { 115 {
79 ContextLifecycleObserver::contextDestroyed(); 116 ContextLifecycleObserver::contextDestroyed();
80 m_state = Done; 117 m_state = Done;
81 } 118 }
82 119
83 void RespondWithObserver::didDispatchEvent(bool defaultPrevented) 120 void RespondWithObserver::didDispatchEvent(bool defaultPrevented)
84 { 121 {
(...skipping 19 matching lines...) Expand all
104 141
105 m_state = Pending; 142 m_state = Pending;
106 ScriptPromise::cast(scriptState, value).then( 143 ScriptPromise::cast(scriptState, value).then(
107 ThenFunction::createFunction(scriptState, this, ThenFunction::Fulfilled) , 144 ThenFunction::createFunction(scriptState, this, ThenFunction::Fulfilled) ,
108 ThenFunction::createFunction(scriptState, this, ThenFunction::Rejected)) ; 145 ThenFunction::createFunction(scriptState, this, ThenFunction::Rejected)) ;
109 } 146 }
110 147
111 void RespondWithObserver::responseWasRejected(WebServiceWorkerResponseError erro r) 148 void RespondWithObserver::responseWasRejected(WebServiceWorkerResponseError erro r)
112 { 149 {
113 ASSERT(executionContext()); 150 ASSERT(executionContext());
151 executionContext()->addConsoleMessage(ConsoleMessage::create(JSMessageSource , WarningMessageLevel, getMessageForResponseError(error, m_requestURL)));
152
114 // The default value of WebServiceWorkerResponse's status is 0, which maps 153 // The default value of WebServiceWorkerResponse's status is 0, which maps
115 // to a network error. 154 // to a network error.
116 WebServiceWorkerResponse webResponse; 155 WebServiceWorkerResponse webResponse;
117 webResponse.setError(error); 156 webResponse.setError(error);
118 ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleFetchEven t(m_eventID, webResponse); 157 ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleFetchEven t(m_eventID, webResponse);
119 m_state = Done; 158 m_state = Done;
120 } 159 }
121 160
122 void RespondWithObserver::responseWasFulfilled(const ScriptValue& value) 161 void RespondWithObserver::responseWasFulfilled(const ScriptValue& value)
123 { 162 {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 buffer->startLoading(loader, nullptr); 206 buffer->startLoading(loader, nullptr);
168 m_state = Done; 207 m_state = Done;
169 return; 208 return;
170 } 209 }
171 WebServiceWorkerResponse webResponse; 210 WebServiceWorkerResponse webResponse;
172 response->populateWebServiceWorkerResponse(webResponse); 211 response->populateWebServiceWorkerResponse(webResponse);
173 ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleFetchEven t(m_eventID, webResponse); 212 ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleFetchEven t(m_eventID, webResponse);
174 m_state = Done; 213 m_state = Done;
175 } 214 }
176 215
177 RespondWithObserver::RespondWithObserver(ExecutionContext* context, int eventID, WebURLRequest::FetchRequestMode requestMode, WebURLRequest::FrameType frameType ) 216 RespondWithObserver::RespondWithObserver(ExecutionContext* context, int eventID, const KURL& requestURL, WebURLRequest::FetchRequestMode requestMode, WebURLRequ est::FrameType frameType)
178 : ContextLifecycleObserver(context) 217 : ContextLifecycleObserver(context)
179 , m_eventID(eventID) 218 , m_eventID(eventID)
219 , m_requestURL(requestURL)
180 , m_requestMode(requestMode) 220 , m_requestMode(requestMode)
181 , m_frameType(frameType) 221 , m_frameType(frameType)
182 , m_state(Initial) 222 , m_state(Initial)
183 { 223 {
184 } 224 }
185 225
186 DEFINE_TRACE(RespondWithObserver) 226 DEFINE_TRACE(RespondWithObserver)
187 { 227 {
188 ContextLifecycleObserver::trace(visitor); 228 ContextLifecycleObserver::trace(visitor);
189 } 229 }
190 230
191 } // namespace blink 231 } // namespace blink
OLDNEW
« no previous file with comments | « Source/modules/serviceworkers/RespondWithObserver.h ('k') | Source/web/ServiceWorkerGlobalScopeProxy.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698