| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "modules/serviceworkers/ForeignFetchEvent.h" | 5 #include "modules/serviceworkers/ForeignFetchEvent.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/ToV8.h" |
| 8 #include "bindings/core/v8/V8HiddenValue.h" |
| 7 #include "modules/fetch/Request.h" | 9 #include "modules/fetch/Request.h" |
| 8 #include "modules/serviceworkers/ServiceWorkerGlobalScope.h" | 10 #include "modules/serviceworkers/ServiceWorkerGlobalScope.h" |
| 9 #include "wtf/RefPtr.h" | 11 #include "wtf/RefPtr.h" |
| 10 | 12 |
| 11 namespace blink { | 13 namespace blink { |
| 12 | 14 |
| 13 ForeignFetchEvent* ForeignFetchEvent::create() | 15 ForeignFetchEvent* ForeignFetchEvent::create() |
| 14 { | 16 { |
| 15 return new ForeignFetchEvent(); | 17 return new ForeignFetchEvent(); |
| 16 } | 18 } |
| 17 | 19 |
| 18 ForeignFetchEvent* ForeignFetchEvent::create(const AtomicString& type, const For
eignFetchEventInit& initializer) | 20 ForeignFetchEvent* ForeignFetchEvent::create(ScriptState* scriptState, const Ato
micString& type, const ForeignFetchEventInit& initializer) |
| 19 { | 21 { |
| 20 return new ForeignFetchEvent(type, initializer, nullptr); | 22 return new ForeignFetchEvent(scriptState, type, initializer, nullptr); |
| 21 } | 23 } |
| 22 | 24 |
| 23 ForeignFetchEvent* ForeignFetchEvent::create(const AtomicString& type, const For
eignFetchEventInit& initializer, ForeignFetchRespondWithObserver* observer) | 25 ForeignFetchEvent* ForeignFetchEvent::create(ScriptState* scriptState, const Ato
micString& type, const ForeignFetchEventInit& initializer, ForeignFetchRespondWi
thObserver* observer) |
| 24 { | 26 { |
| 25 return new ForeignFetchEvent(type, initializer, observer); | 27 return new ForeignFetchEvent(scriptState, type, initializer, observer); |
| 26 } | 28 } |
| 27 | 29 |
| 28 Request* ForeignFetchEvent::request() const | 30 Request* ForeignFetchEvent::request() const |
| 29 { | 31 { |
| 30 return m_request; | 32 return m_request; |
| 31 } | 33 } |
| 32 | 34 |
| 33 String ForeignFetchEvent::origin() const | 35 String ForeignFetchEvent::origin() const |
| 34 { | 36 { |
| 35 return m_origin; | 37 return m_origin; |
| 36 } | 38 } |
| 37 | 39 |
| 38 void ForeignFetchEvent::respondWith(ScriptState* scriptState, ScriptPromise scri
ptPromise, ExceptionState& exceptionState) | 40 void ForeignFetchEvent::respondWith(ScriptState* scriptState, ScriptPromise scri
ptPromise, ExceptionState& exceptionState) |
| 39 { | 41 { |
| 40 stopImmediatePropagation(); | 42 stopImmediatePropagation(); |
| 41 if (m_observer) | 43 if (m_observer) |
| 42 m_observer->respondWith(scriptState, scriptPromise, exceptionState); | 44 m_observer->respondWith(scriptState, scriptPromise, exceptionState); |
| 43 } | 45 } |
| 44 | 46 |
| 45 const AtomicString& ForeignFetchEvent::interfaceName() const | 47 const AtomicString& ForeignFetchEvent::interfaceName() const |
| 46 { | 48 { |
| 47 return EventNames::ForeignFetchEvent; | 49 return EventNames::ForeignFetchEvent; |
| 48 } | 50 } |
| 49 | 51 |
| 50 ForeignFetchEvent::ForeignFetchEvent() | 52 ForeignFetchEvent::ForeignFetchEvent() |
| 51 { | 53 { |
| 52 } | 54 } |
| 53 | 55 |
| 54 ForeignFetchEvent::ForeignFetchEvent(const AtomicString& type, const ForeignFetc
hEventInit& initializer, ForeignFetchRespondWithObserver* observer) | 56 ForeignFetchEvent::ForeignFetchEvent(ScriptState* scriptState, const AtomicStrin
g& type, const ForeignFetchEventInit& initializer, ForeignFetchRespondWithObserv
er* observer) |
| 55 : ExtendableEvent(type, initializer) | 57 : ExtendableEvent(type, initializer) |
| 56 , m_observer(observer) | 58 , m_observer(observer) |
| 57 { | 59 { |
| 58 if (initializer.hasRequest()) | |
| 59 m_request = initializer.request(); | |
| 60 if (initializer.hasOrigin()) | 60 if (initializer.hasOrigin()) |
| 61 m_origin = initializer.origin(); | 61 m_origin = initializer.origin(); |
| 62 if (initializer.hasRequest()) { |
| 63 m_request = initializer.request(); |
| 64 ScriptState::Scope scope(scriptState); |
| 65 m_request = initializer.request(); |
| 66 v8::Local<v8::Value> request = toV8(m_request, scriptState); |
| 67 v8::Local<v8::Value> event = toV8(this, scriptState); |
| 68 if (event.IsEmpty()) { |
| 69 // |toV8| can return an empty handle when the worker is terminating. |
| 70 // We don't want the renderer to crash in such cases. |
| 71 // TODO(yhirano): Replace this branch with an assertion when the |
| 72 // graceful shutdown mechanism is introduced. |
| 73 return; |
| 74 } |
| 75 DCHECK(event->IsObject()); |
| 76 // Sets a hidden value in order to teach V8 the dependency from |
| 77 // the event to the request. |
| 78 V8HiddenValue::setHiddenValue(scriptState, event.As<v8::Object>(), V8Hid
denValue::requestInFetchEvent(scriptState->isolate()), request); |
| 79 // From the same reason as above, setHiddenValue can return false. |
| 80 // TODO(yhirano): Add an assertion that it returns true once the |
| 81 // graceful shutdown mechanism is introduced. |
| 82 } |
| 62 } | 83 } |
| 63 | 84 |
| 64 DEFINE_TRACE(ForeignFetchEvent) | 85 DEFINE_TRACE(ForeignFetchEvent) |
| 65 { | 86 { |
| 66 visitor->trace(m_observer); | 87 visitor->trace(m_observer); |
| 67 visitor->trace(m_request); | 88 visitor->trace(m_request); |
| 68 ExtendableEvent::trace(visitor); | 89 ExtendableEvent::trace(visitor); |
| 69 } | 90 } |
| 70 | 91 |
| 71 } // namespace blink | 92 } // namespace blink |
| OLD | NEW |