| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Apple Inc. All rights reserved. | 2 * Copyright (C) 2013 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 #include "bindings/core/v8/DOMWrapperWorld.h" | 29 #include "bindings/core/v8/DOMWrapperWorld.h" |
| 30 #include "bindings/core/v8/ScriptPromise.h" | 30 #include "bindings/core/v8/ScriptPromise.h" |
| 31 #include "bindings/core/v8/ScriptPromiseResolver.h" | 31 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 32 #include "bindings/core/v8/ScriptState.h" | 32 #include "bindings/core/v8/ScriptState.h" |
| 33 #include "core/dom/DOMArrayBuffer.h" | 33 #include "core/dom/DOMArrayBuffer.h" |
| 34 #include "core/dom/DOMArrayBufferView.h" | 34 #include "core/dom/DOMArrayBufferView.h" |
| 35 #include "core/dom/ExceptionCode.h" | 35 #include "core/dom/ExceptionCode.h" |
| 36 #include "core/events/Event.h" | 36 #include "core/events/Event.h" |
| 37 #include "core/events/GenericEventQueue.h" | 37 #include "core/events/GenericEventQueue.h" |
| 38 #include "core/html/MediaKeyError.h" | 38 #include "core/html/MediaKeyError.h" |
| 39 #include "modules/encryptedmedia/ContentDecryptionModuleResultPromise.h" |
| 39 #include "modules/encryptedmedia/MediaKeyMessageEvent.h" | 40 #include "modules/encryptedmedia/MediaKeyMessageEvent.h" |
| 40 #include "modules/encryptedmedia/MediaKeys.h" | 41 #include "modules/encryptedmedia/MediaKeys.h" |
| 41 #include "modules/encryptedmedia/SimpleContentDecryptionModuleResult.h" | 42 #include "modules/encryptedmedia/SimpleContentDecryptionModuleResultPromise.h" |
| 42 #include "platform/ContentDecryptionModuleResult.h" | 43 #include "platform/ContentDecryptionModuleResult.h" |
| 43 #include "platform/ContentType.h" | 44 #include "platform/ContentType.h" |
| 44 #include "platform/Logging.h" | 45 #include "platform/Logging.h" |
| 45 #include "platform/MIMETypeRegistry.h" | 46 #include "platform/MIMETypeRegistry.h" |
| 46 #include "platform/Timer.h" | 47 #include "platform/Timer.h" |
| 47 #include "public/platform/WebContentDecryptionModule.h" | 48 #include "public/platform/WebContentDecryptionModule.h" |
| 48 #include "public/platform/WebContentDecryptionModuleException.h" | 49 #include "public/platform/WebContentDecryptionModuleException.h" |
| 49 #include "public/platform/WebContentDecryptionModuleSession.h" | 50 #include "public/platform/WebContentDecryptionModuleSession.h" |
| 50 #include "public/platform/WebString.h" | 51 #include "public/platform/WebString.h" |
| 51 #include "public/platform/WebURL.h" | 52 #include "public/platform/WebURL.h" |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 const Member<ContentDecryptionModuleResult> m_result; | 195 const Member<ContentDecryptionModuleResult> m_result; |
| 195 const String m_stringData; | 196 const String m_stringData; |
| 196 const RefPtr<DOMArrayBuffer> m_data; | 197 const RefPtr<DOMArrayBuffer> m_data; |
| 197 }; | 198 }; |
| 198 | 199 |
| 199 // This class wraps the promise resolver used when initializing a new session | 200 // This class wraps the promise resolver used when initializing a new session |
| 200 // and is passed to Chromium to fullfill the promise. This implementation of | 201 // and is passed to Chromium to fullfill the promise. This implementation of |
| 201 // completeWithSession() will resolve the promise with void, while | 202 // completeWithSession() will resolve the promise with void, while |
| 202 // completeWithError() will reject the promise with an exception. complete() | 203 // completeWithError() will reject the promise with an exception. complete() |
| 203 // is not expected to be called, and will reject the promise. | 204 // is not expected to be called, and will reject the promise. |
| 204 class NewSessionResult : public ContentDecryptionModuleResult { | 205 class NewSessionResultPromise : public ContentDecryptionModuleResultPromise { |
| 205 public: | 206 public: |
| 206 NewSessionResult(ScriptState* scriptState, MediaKeySession* session) | 207 NewSessionResultPromise(ScriptState* scriptState, MediaKeySession* session) |
| 207 : m_resolver(ScriptPromiseResolver::create(scriptState)) | 208 : ContentDecryptionModuleResultPromise(scriptState) |
| 208 , m_session(session) | 209 , m_session(session) |
| 209 { | 210 { |
| 210 WTF_LOG(Media, "NewSessionResult(%p)", this); | |
| 211 } | 211 } |
| 212 | 212 |
| 213 virtual ~NewSessionResult() | 213 virtual ~NewSessionResultPromise() |
| 214 { | 214 { |
| 215 WTF_LOG(Media, "~NewSessionResult(%p)", this); | |
| 216 } | 215 } |
| 217 | 216 |
| 218 // ContentDecryptionModuleResult implementation. | 217 // ContentDecryptionModuleResult implementation. |
| 219 virtual void complete() override | |
| 220 { | |
| 221 ASSERT_NOT_REACHED(); | |
| 222 completeWithDOMException(InvalidStateError, "Unexpected completion."); | |
| 223 } | |
| 224 | |
| 225 virtual void completeWithSession(WebContentDecryptionModuleResult::SessionSt
atus status) override | 218 virtual void completeWithSession(WebContentDecryptionModuleResult::SessionSt
atus status) override |
| 226 { | 219 { |
| 227 if (status != WebContentDecryptionModuleResult::NewSession) { | 220 if (status != WebContentDecryptionModuleResult::NewSession) { |
| 228 ASSERT_NOT_REACHED(); | 221 ASSERT_NOT_REACHED(); |
| 229 completeWithDOMException(InvalidStateError, "Unexpected completion."
); | 222 reject(InvalidStateError, "Unexpected completion."); |
| 230 } | 223 } |
| 231 | 224 |
| 232 m_session->finishGenerateRequest(); | 225 m_session->finishGenerateRequest(); |
| 233 m_resolver->resolve(); | 226 resolve(); |
| 234 m_resolver.clear(); | |
| 235 } | 227 } |
| 236 | 228 |
| 237 virtual void completeWithError(WebContentDecryptionModuleException exception
Code, unsigned long systemCode, const WebString& errorMessage) override | |
| 238 { | |
| 239 completeWithDOMException(WebCdmExceptionToExceptionCode(exceptionCode),
errorMessage); | |
| 240 } | |
| 241 | |
| 242 // It is only valid to call this before completion. | |
| 243 ScriptPromise promise() { return m_resolver->promise(); } | |
| 244 | |
| 245 void trace(Visitor* visitor) | 229 void trace(Visitor* visitor) |
| 246 { | 230 { |
| 247 visitor->trace(m_session); | 231 visitor->trace(m_session); |
| 248 ContentDecryptionModuleResult::trace(visitor); | 232 ContentDecryptionModuleResultPromise::trace(visitor); |
| 249 } | 233 } |
| 250 | 234 |
| 251 private: | 235 private: |
| 252 // Reject the promise with a DOMException. | |
| 253 void completeWithDOMException(ExceptionCode code, const String& errorMessage
) | |
| 254 { | |
| 255 m_resolver->reject(DOMException::create(code, errorMessage)); | |
| 256 m_resolver.clear(); | |
| 257 } | |
| 258 | |
| 259 RefPtr<ScriptPromiseResolver> m_resolver; | |
| 260 Member<MediaKeySession> m_session; | 236 Member<MediaKeySession> m_session; |
| 261 }; | 237 }; |
| 262 | 238 |
| 263 // This class wraps the promise resolver used when loading a session | 239 // This class wraps the promise resolver used when loading a session |
| 264 // and is passed to Chromium to fullfill the promise. This implementation of | 240 // and is passed to Chromium to fullfill the promise. This implementation of |
| 265 // completeWithSession() will resolve the promise with true/false, while | 241 // completeWithSession() will resolve the promise with true/false, while |
| 266 // completeWithError() will reject the promise with an exception. complete() | 242 // completeWithError() will reject the promise with an exception. complete() |
| 267 // is not expected to be called, and will reject the promise. | 243 // is not expected to be called, and will reject the promise. |
| 268 class LoadSessionResult : public ContentDecryptionModuleResult { | 244 class LoadSessionResultPromise : public ContentDecryptionModuleResultPromise { |
| 269 public: | 245 public: |
| 270 LoadSessionResult(ScriptState* scriptState, MediaKeySession* session) | 246 LoadSessionResultPromise(ScriptState* scriptState, MediaKeySession* session) |
| 271 : m_resolver(ScriptPromiseResolver::create(scriptState)) | 247 : ContentDecryptionModuleResultPromise(scriptState) |
| 272 , m_session(session) | 248 , m_session(session) |
| 273 { | 249 { |
| 274 WTF_LOG(Media, "LoadSessionResult(%p)", this); | |
| 275 } | 250 } |
| 276 | 251 |
| 277 virtual ~LoadSessionResult() | 252 virtual ~LoadSessionResultPromise() |
| 278 { | 253 { |
| 279 WTF_LOG(Media, "~LoadSessionResult(%p)", this); | |
| 280 } | 254 } |
| 281 | 255 |
| 282 // ContentDecryptionModuleResult implementation. | 256 // ContentDecryptionModuleResult implementation. |
| 283 virtual void complete() override | |
| 284 { | |
| 285 ASSERT_NOT_REACHED(); | |
| 286 completeWithDOMException(InvalidStateError, "Unexpected completion."); | |
| 287 } | |
| 288 | |
| 289 virtual void completeWithSession(WebContentDecryptionModuleResult::SessionSt
atus status) override | 257 virtual void completeWithSession(WebContentDecryptionModuleResult::SessionSt
atus status) override |
| 290 { | 258 { |
| 291 bool result = false; | 259 bool result = false; |
| 292 switch (status) { | 260 switch (status) { |
| 293 case WebContentDecryptionModuleResult::NewSession: | 261 case WebContentDecryptionModuleResult::NewSession: |
| 294 result = true; | 262 result = true; |
| 295 break; | 263 break; |
| 296 | 264 |
| 297 case WebContentDecryptionModuleResult::SessionNotFound: | 265 case WebContentDecryptionModuleResult::SessionNotFound: |
| 298 result = false; | 266 result = false; |
| 299 break; | 267 break; |
| 300 | 268 |
| 301 case WebContentDecryptionModuleResult::SessionAlreadyExists: | 269 case WebContentDecryptionModuleResult::SessionAlreadyExists: |
| 302 ASSERT_NOT_REACHED(); | 270 ASSERT_NOT_REACHED(); |
| 303 completeWithDOMException(InvalidStateError, "Unexpected completion."
); | 271 reject(InvalidStateError, "Unexpected completion."); |
| 304 return; | 272 return; |
| 305 } | 273 } |
| 306 | 274 |
| 307 m_session->finishLoad(); | 275 m_session->finishLoad(); |
| 308 m_resolver->resolve(result); | 276 resolve(result); |
| 309 m_resolver.clear(); | |
| 310 } | 277 } |
| 311 | 278 |
| 312 virtual void completeWithError(WebContentDecryptionModuleException exception
Code, unsigned long systemCode, const WebString& errorMessage) override | |
| 313 { | |
| 314 completeWithDOMException(WebCdmExceptionToExceptionCode(exceptionCode),
errorMessage); | |
| 315 } | |
| 316 | |
| 317 // It is only valid to call this before completion. | |
| 318 ScriptPromise promise() { return m_resolver->promise(); } | |
| 319 | |
| 320 void trace(Visitor* visitor) | 279 void trace(Visitor* visitor) |
| 321 { | 280 { |
| 322 visitor->trace(m_session); | 281 visitor->trace(m_session); |
| 323 ContentDecryptionModuleResult::trace(visitor); | 282 ContentDecryptionModuleResultPromise::trace(visitor); |
| 324 } | 283 } |
| 325 | 284 |
| 326 private: | 285 private: |
| 327 // Reject the promise with a DOMException. | |
| 328 void completeWithDOMException(ExceptionCode code, const String& errorMessage
) | |
| 329 { | |
| 330 m_resolver->reject(DOMException::create(code, errorMessage)); | |
| 331 m_resolver.clear(); | |
| 332 } | |
| 333 | |
| 334 RefPtr<ScriptPromiseResolver> m_resolver; | |
| 335 Member<MediaKeySession> m_session; | 286 Member<MediaKeySession> m_session; |
| 336 }; | 287 }; |
| 337 | 288 |
| 338 MediaKeySession* MediaKeySession::create(ScriptState* scriptState, MediaKeys* me
diaKeys, const String& sessionType) | 289 MediaKeySession* MediaKeySession::create(ScriptState* scriptState, MediaKeys* me
diaKeys, const String& sessionType) |
| 339 { | 290 { |
| 340 ASSERT(sessionType == kTemporary || sessionType == kPersistent); | 291 ASSERT(sessionType == kTemporary || sessionType == kPersistent); |
| 341 RefPtrWillBeRawPtr<MediaKeySession> session = new MediaKeySession(scriptStat
e, mediaKeys, sessionType); | 292 RefPtrWillBeRawPtr<MediaKeySession> session = new MediaKeySession(scriptStat
e, mediaKeys, sessionType); |
| 342 session->suspendIfNeeded(); | 293 session->suspendIfNeeded(); |
| 343 return session.get(); | 294 return session.get(); |
| 344 } | 295 } |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 scriptState, DOMException::create(NotSupportedError, "The initializa
tion data type '" + initDataType + "' is not supported by the key system.")); | 424 scriptState, DOMException::create(NotSupportedError, "The initializa
tion data type '" + initDataType + "' is not supported by the key system.")); |
| 474 } | 425 } |
| 475 | 426 |
| 476 // 7. Let init data be a copy of the contents of the initData parameter. | 427 // 7. Let init data be a copy of the contents of the initData parameter. |
| 477 // (Done before calling this method.) | 428 // (Done before calling this method.) |
| 478 | 429 |
| 479 // 8. Let session type be this object's session type. | 430 // 8. Let session type be this object's session type. |
| 480 // (Done in constructor.) | 431 // (Done in constructor.) |
| 481 | 432 |
| 482 // 9. Let promise be a new promise. | 433 // 9. Let promise be a new promise. |
| 483 NewSessionResult* result = new NewSessionResult(scriptState, this); | 434 NewSessionResultPromise* result = new NewSessionResultPromise(scriptState, t
his); |
| 484 ScriptPromise promise = result->promise(); | 435 ScriptPromise promise = result->promise(); |
| 485 | 436 |
| 486 // 10. Run the following steps asynchronously (documented in | 437 // 10. Run the following steps asynchronously (documented in |
| 487 // actionTimerFired()) | 438 // actionTimerFired()) |
| 488 m_pendingActions.append(PendingAction::CreatePendingGenerateRequest(result,
initDataType, initData)); | 439 m_pendingActions.append(PendingAction::CreatePendingGenerateRequest(result,
initDataType, initData)); |
| 489 ASSERT(!m_actionTimer.isActive()); | 440 ASSERT(!m_actionTimer.isActive()); |
| 490 m_actionTimer.startOneShot(0, FROM_HERE); | 441 m_actionTimer.startOneShot(0, FROM_HERE); |
| 491 | 442 |
| 492 // 11. Return promise. | 443 // 11. Return promise. |
| 493 return promise; | 444 return promise; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 // (Done in constructor.) | 480 // (Done in constructor.) |
| 530 ASSERT(m_mediaKeys); | 481 ASSERT(m_mediaKeys); |
| 531 | 482 |
| 532 // 6. If the content decryption module corresponding to media keys's | 483 // 6. If the content decryption module corresponding to media keys's |
| 533 // keySystem attribute does not support loading previous sessions, | 484 // keySystem attribute does not support loading previous sessions, |
| 534 // return a promise rejected with a new DOMException whose name is | 485 // return a promise rejected with a new DOMException whose name is |
| 535 // "NotSupportedError". | 486 // "NotSupportedError". |
| 536 // (Done by CDM.) | 487 // (Done by CDM.) |
| 537 | 488 |
| 538 // 7. Let promise be a new promise. | 489 // 7. Let promise be a new promise. |
| 539 LoadSessionResult* result = new LoadSessionResult(scriptState, this); | 490 LoadSessionResultPromise* result = new LoadSessionResultPromise(scriptState,
this); |
| 540 ScriptPromise promise = result->promise(); | 491 ScriptPromise promise = result->promise(); |
| 541 | 492 |
| 542 // 8. Run the following steps asynchronously (documented in | 493 // 8. Run the following steps asynchronously (documented in |
| 543 // actionTimerFired()) | 494 // actionTimerFired()) |
| 544 m_pendingActions.append(PendingAction::CreatePendingLoadRequest(result, sess
ionId)); | 495 m_pendingActions.append(PendingAction::CreatePendingLoadRequest(result, sess
ionId)); |
| 545 ASSERT(!m_actionTimer.isActive()); | 496 ASSERT(!m_actionTimer.isActive()); |
| 546 m_actionTimer.startOneShot(0, FROM_HERE); | 497 m_actionTimer.startOneShot(0, FROM_HERE); |
| 547 | 498 |
| 548 // 9. Return promise. | 499 // 9. Return promise. |
| 549 return promise; | 500 return promise; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 575 // message "The response parameter is empty." | 526 // message "The response parameter is empty." |
| 576 if (!response->byteLength()) { | 527 if (!response->byteLength()) { |
| 577 return ScriptPromise::rejectWithDOMException( | 528 return ScriptPromise::rejectWithDOMException( |
| 578 scriptState, DOMException::create(InvalidAccessError, "The response
parameter is empty.")); | 529 scriptState, DOMException::create(InvalidAccessError, "The response
parameter is empty.")); |
| 579 } | 530 } |
| 580 | 531 |
| 581 // 2. Let message be a copy of the contents of the response parameter. | 532 // 2. Let message be a copy of the contents of the response parameter. |
| 582 // (Copied in the caller.) | 533 // (Copied in the caller.) |
| 583 | 534 |
| 584 // 3. Let promise be a new promise. | 535 // 3. Let promise be a new promise. |
| 585 SimpleContentDecryptionModuleResult* result = new SimpleContentDecryptionMod
uleResult(scriptState); | 536 SimpleContentDecryptionModuleResultPromise* result = new SimpleContentDecryp
tionModuleResultPromise(scriptState); |
| 586 ScriptPromise promise = result->promise(); | 537 ScriptPromise promise = result->promise(); |
| 587 | 538 |
| 588 // 4. Run the following steps asynchronously (documented in | 539 // 4. Run the following steps asynchronously (documented in |
| 589 // actionTimerFired()) | 540 // actionTimerFired()) |
| 590 m_pendingActions.append(PendingAction::CreatePendingUpdate(result, response)
); | 541 m_pendingActions.append(PendingAction::CreatePendingUpdate(result, response)
); |
| 591 if (!m_actionTimer.isActive()) | 542 if (!m_actionTimer.isActive()) |
| 592 m_actionTimer.startOneShot(0, FROM_HERE); | 543 m_actionTimer.startOneShot(0, FROM_HERE); |
| 593 | 544 |
| 594 // 5. Return promise. | 545 // 5. Return promise. |
| 595 return promise; | 546 return promise; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 612 return ScriptPromise::rejectWithDOMException( | 563 return ScriptPromise::rejectWithDOMException( |
| 613 scriptState, DOMException::create(InvalidStateError, "The session is
not callable.")); | 564 scriptState, DOMException::create(InvalidStateError, "The session is
not callable.")); |
| 614 } | 565 } |
| 615 | 566 |
| 616 // 2. If the Session Close algorithm has been run on this object, | 567 // 2. If the Session Close algorithm has been run on this object, |
| 617 // return a resolved promise. | 568 // return a resolved promise. |
| 618 if (m_isClosed) | 569 if (m_isClosed) |
| 619 return ScriptPromise::cast(scriptState, ScriptValue()); | 570 return ScriptPromise::cast(scriptState, ScriptValue()); |
| 620 | 571 |
| 621 // 3. Let promise be a new promise. | 572 // 3. Let promise be a new promise. |
| 622 SimpleContentDecryptionModuleResult* result = new SimpleContentDecryptionMod
uleResult(scriptState); | 573 SimpleContentDecryptionModuleResultPromise* result = new SimpleContentDecryp
tionModuleResultPromise(scriptState); |
| 623 ScriptPromise promise = result->promise(); | 574 ScriptPromise promise = result->promise(); |
| 624 | 575 |
| 625 // 4. Run the following steps asynchronously (documented in | 576 // 4. Run the following steps asynchronously (documented in |
| 626 // actionTimerFired()). | 577 // actionTimerFired()). |
| 627 m_pendingActions.append(PendingAction::CreatePendingClose(result)); | 578 m_pendingActions.append(PendingAction::CreatePendingClose(result)); |
| 628 if (!m_actionTimer.isActive()) | 579 if (!m_actionTimer.isActive()) |
| 629 m_actionTimer.startOneShot(0, FROM_HERE); | 580 m_actionTimer.startOneShot(0, FROM_HERE); |
| 630 | 581 |
| 631 // 5. Return promise. | 582 // 5. Return promise. |
| 632 return promise; | 583 return promise; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 656 | 607 |
| 657 // 3. If the Session Close algorithm has been run on this object, return a | 608 // 3. If the Session Close algorithm has been run on this object, return a |
| 658 // promise rejected with a new DOMException whose name is | 609 // promise rejected with a new DOMException whose name is |
| 659 // "InvalidStateError". | 610 // "InvalidStateError". |
| 660 if (m_isClosed) { | 611 if (m_isClosed) { |
| 661 return ScriptPromise::rejectWithDOMException( | 612 return ScriptPromise::rejectWithDOMException( |
| 662 scriptState, DOMException::create(InvalidStateError, "The session is
already closed.")); | 613 scriptState, DOMException::create(InvalidStateError, "The session is
already closed.")); |
| 663 } | 614 } |
| 664 | 615 |
| 665 // 4. Let promise be a new promise. | 616 // 4. Let promise be a new promise. |
| 666 SimpleContentDecryptionModuleResult* result = new SimpleContentDecryptionMod
uleResult(scriptState); | 617 SimpleContentDecryptionModuleResultPromise* result = new SimpleContentDecryp
tionModuleResultPromise(scriptState); |
| 667 ScriptPromise promise = result->promise(); | 618 ScriptPromise promise = result->promise(); |
| 668 | 619 |
| 669 // 5. Run the following steps asynchronously (documented in | 620 // 5. Run the following steps asynchronously (documented in |
| 670 // actionTimerFired()). | 621 // actionTimerFired()). |
| 671 m_pendingActions.append(PendingAction::CreatePendingRemove(result)); | 622 m_pendingActions.append(PendingAction::CreatePendingRemove(result)); |
| 672 if (!m_actionTimer.isActive()) | 623 if (!m_actionTimer.isActive()) |
| 673 m_actionTimer.startOneShot(0, FROM_HERE); | 624 m_actionTimer.startOneShot(0, FROM_HERE); |
| 674 | 625 |
| 675 // 6. Return promise. | 626 // 6. Return promise. |
| 676 return promise; | 627 return promise; |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1002 { | 953 { |
| 1003 visitor->trace(m_error); | 954 visitor->trace(m_error); |
| 1004 visitor->trace(m_asyncEventQueue); | 955 visitor->trace(m_asyncEventQueue); |
| 1005 visitor->trace(m_pendingActions); | 956 visitor->trace(m_pendingActions); |
| 1006 visitor->trace(m_mediaKeys); | 957 visitor->trace(m_mediaKeys); |
| 1007 visitor->trace(m_closedPromise); | 958 visitor->trace(m_closedPromise); |
| 1008 EventTargetWithInlineData::trace(visitor); | 959 EventTargetWithInlineData::trace(visitor); |
| 1009 } | 960 } |
| 1010 | 961 |
| 1011 } // namespace blink | 962 } // namespace blink |
| OLD | NEW |