Changeset 223148 in webkit


Ignore:
Timestamp:
Oct 10, 2017 2:51:47 PM (7 years ago)
Author:
commit-queue@webkit.org
Message:

Fix MSVC build with ENCRYPTED_MEDIA enabled
https://bugs.webkit.org/show_bug.cgi?id=177803

Patch by Yoshiaki Jitsukawa <Yoshiaki.Jitsukawa@sony.com> on 2017-10-10
Reviewed by Alex Christensen.

As a workaround for MSVC, a weak pointer of "this" is captured
at the outermost lambda expression.

  • Modules/encryptedmedia/MediaKeySession.cpp:

(WebCore::MediaKeySession::generateRequest):
(WebCore::MediaKeySession::load):
(WebCore::MediaKeySession::update):
(WebCore::MediaKeySession::close):
(WebCore::MediaKeySession::remove):

  • platform/encryptedmedia/clearkey/CDMClearKey.cpp:

(WebCore::CDMInstanceClearKey::updateLicense):
(WebCore::CDMInstanceClearKey::loadSession):
(WebCore::CDMInstanceClearKey::removeSessionData):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r223145 r223148  
     12017-10-10  Yoshiaki Jitsukawa  <Yoshiaki.Jitsukawa@sony.com>
     2
     3        Fix MSVC build with ENCRYPTED_MEDIA enabled
     4        https://bugs.webkit.org/show_bug.cgi?id=177803
     5
     6        Reviewed by Alex Christensen.
     7
     8        As a workaround for MSVC, a weak pointer of "this" is captured
     9        at the outermost lambda expression.
     10
     11        * Modules/encryptedmedia/MediaKeySession.cpp:
     12        (WebCore::MediaKeySession::generateRequest):
     13        (WebCore::MediaKeySession::load):
     14        (WebCore::MediaKeySession::update):
     15        (WebCore::MediaKeySession::close):
     16        (WebCore::MediaKeySession::remove):
     17        * platform/encryptedmedia/clearkey/CDMClearKey.cpp:
     18        (WebCore::CDMInstanceClearKey::updateLicense):
     19        (WebCore::CDMInstanceClearKey::loadSession):
     20        (WebCore::CDMInstanceClearKey::removeSessionData):
     21
    1222017-10-10  Joanmarie Diggs  <jdiggs@igalia.com>
    223
  • trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.cpp

    r222422 r223148  
    142142    // 9. Let promise be a new promise.
    143143    // 10. Run the following steps in parallel:
    144     m_taskQueue.enqueueTask([this, initData = SharedBuffer::create(initData.data(), initData.length()), initDataType, promise = WTFMove(promise)] () mutable {
     144    m_taskQueue.enqueueTask([this, weakThis = m_weakPtrFactory.createWeakPtr(*this), initData = SharedBuffer::create(initData.data(), initData.length()), initDataType, promise = WTFMove(promise)] () mutable {
    145145        // 10.1. If the init data is not valid for initDataType, reject promise with a newly created TypeError.
    146146        // 10.2. Let sanitized init data be a validated and sanitized version of init data.
     
    189189        }
    190190
    191         m_instance->requestLicense(m_sessionType, initDataType, WTFMove(initData), [this, weakThis = m_weakPtrFactory.createWeakPtr(*this), promise = WTFMove(promise)] (Ref<SharedBuffer>&& message, const String& sessionId, bool needsIndividualization, CDMInstance::SuccessValue succeeded) mutable {
     191        m_instance->requestLicense(m_sessionType, initDataType, WTFMove(initData), [this, weakThis, promise = WTFMove(promise)] (Ref<SharedBuffer>&& message, const String& sessionId, bool needsIndividualization, CDMInstance::SuccessValue succeeded) mutable {
    192192            if (!weakThis)
    193193                return;
     
    282282        // 8.7. Let cdm be the CDM instance represented by this object's cdm instance value.
    283283        // 8.8. Use the cdm to execute the following steps:
    284         m_instance->loadSession(m_sessionType, *sanitizedSessionId, origin, [this, weakThis = m_weakPtrFactory.createWeakPtr(*this), promise = WTFMove(promise), sanitizedSessionId = *sanitizedSessionId] (std::optional<CDMInstance::KeyStatusVector>&& knownKeys, std::optional<double>&& expiration, std::optional<CDMInstance::Message>&& message, CDMInstance::SuccessValue succeeded, CDMInstance::SessionLoadFailure failure) mutable {
     284        m_instance->loadSession(m_sessionType, *sanitizedSessionId, origin, [this, promise = WTFMove(promise), sanitizedSessionId = *sanitizedSessionId] (std::optional<CDMInstance::KeyStatusVector>&& knownKeys, std::optional<double>&& expiration, std::optional<CDMInstance::Message>&& message, CDMInstance::SuccessValue succeeded, CDMInstance::SessionLoadFailure failure) mutable {
    285285            // 8.8.1. If there is no data stored for the sanitized session ID in the origin, resolve promise with false and abort these steps.
    286286            // 8.8.2. If the stored session's session type is not the same as the current MediaKeySession session type, reject promise with a newly created TypeError.
     
    313313
    314314            // 8.9. Queue a task to run the following steps:
    315             m_taskQueue.enqueueTask([this, knownKeys = WTFMove(knownKeys), expiration = WTFMove(expiration), message = WTFMove(message), sanitizedSessionId, succeeded, promise = WTFMove(promise)] () mutable {
     315            m_taskQueue.enqueueTask([this, knownKeys = WTFMove(knownKeys), expiration = WTFMove(expiration), message = WTFMove(message), sanitizedSessionId = sanitizedSessionId, succeeded, promise = WTFMove(promise)] () mutable {
    316316                // 8.9.1. If any of the preceding steps failed, reject promise with a the appropriate error name.
    317317                if (succeeded == CDMInstance::SuccessValue::Failed) {
     
    368368    // 5. Let promise be a new promise.
    369369    // 6. Run the following steps in parallel:
    370     m_taskQueue.enqueueTask([this, response = SharedBuffer::create(response.data(), response.length()), promise = WTFMove(promise)] () mutable {
     370    m_taskQueue.enqueueTask([this, weakThis = m_weakPtrFactory.createWeakPtr(*this), response = SharedBuffer::create(response.data(), response.length()), promise = WTFMove(promise)] () mutable {
    371371        // 6.1. Let sanitized response be a validated and/or sanitized version of response copy.
    372372        RefPtr<SharedBuffer> sanitizedResponse = m_implementation->sanitizeResponse(response);
     
    383383        // 6.6. Let cdm be the CDM instance represented by this object's cdm instance value.
    384384        // 6.7. Use the cdm to execute the following steps:
    385         m_instance->updateLicense(m_sessionId, m_sessionType, *sanitizedResponse, [this, weakThis = m_weakPtrFactory.createWeakPtr(*this), promise = WTFMove(promise)] (bool sessionWasClosed, std::optional<CDMInstance::KeyStatusVector>&& changedKeys, std::optional<double>&& changedExpiration, std::optional<CDMInstance::Message>&& message, CDMInstance::SuccessValue succeeded) mutable {
     385        m_instance->updateLicense(m_sessionId, m_sessionType, *sanitizedResponse, [this, weakThis, promise = WTFMove(promise)](bool sessionWasClosed, std::optional<CDMInstance::KeyStatusVector>&& changedKeys, std::optional<double>&& changedExpiration, std::optional<CDMInstance::Message>&& message, CDMInstance::SuccessValue succeeded) mutable {
    386386            if (!weakThis)
    387387                return;
     
    492492    // 4. Let promise be a new promise.
    493493    // 5. Run the following steps in parallel:
    494     m_taskQueue.enqueueTask([this, promise = WTFMove(promise)] () mutable {
     494    m_taskQueue.enqueueTask([this, weakThis = m_weakPtrFactory.createWeakPtr(*this), promise = WTFMove(promise)] () mutable {
    495495        // 5.1. Let cdm be the CDM instance represented by session's cdm instance value.
    496496        // 5.2. Use cdm to close the key session associated with session.
    497         m_instance->closeSession(m_sessionId, [this, weakThis = m_weakPtrFactory.createWeakPtr(*this), promise = WTFMove(promise)] () mutable {
     497        m_instance->closeSession(m_sessionId, [this, weakThis, promise = WTFMove(promise)] () mutable {
    498498            if (!weakThis)
    499499                return;
     
    527527    // 3. Let promise be a new promise.
    528528    // 4. Run the following steps in parallel:
    529     m_taskQueue.enqueueTask([this, promise = WTFMove(promise)] () mutable {
     529    m_taskQueue.enqueueTask([this, weakThis = m_weakPtrFactory.createWeakPtr(*this), promise = WTFMove(promise)] () mutable {
    530530        // 4.1. Let cdm be the CDM instance represented by this object's cdm instance value.
    531531        // 4.2. Let message be null.
     
    533533
    534534        // 4.4. Use the cdm to execute the following steps:
    535         m_instance->removeSessionData(m_sessionId, m_sessionType, [this, weakThis = m_weakPtrFactory.createWeakPtr(*this), promise = WTFMove(promise)] (CDMInstance::KeyStatusVector&& keys, std::optional<Ref<SharedBuffer>>&& message, CDMInstance::SuccessValue succeeded) mutable {
     535        m_instance->removeSessionData(m_sessionId, m_sessionType, [this, weakThis, promise = WTFMove(promise)] (CDMInstance::KeyStatusVector&& keys, std::optional<Ref<SharedBuffer>>&& message, CDMInstance::SuccessValue succeeded) mutable {
    536536            if (!weakThis)
    537537                return;
  • trunk/Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp

    r222946 r223148  
    355355    // duplicated callOnMainThread() calls.
    356356    auto dispatchCallback =
    357         [this, &callback](bool sessionWasClosed, std::optional<KeyStatusVector>&& changedKeys, SuccessValue succeeded) {
     357        [this, weakThis = m_weakPtrFactory.createWeakPtr(*this), &callback](bool sessionWasClosed, std::optional<KeyStatusVector>&& changedKeys, SuccessValue succeeded) {
    358358            callOnMainThread(
    359                 [weakThis = m_weakPtrFactory.createWeakPtr(*this), callback = WTFMove(callback), sessionWasClosed, changedKeys = WTFMove(changedKeys), succeeded] () mutable {
     359                [weakThis, callback = WTFMove(callback), sessionWasClosed, changedKeys = WTFMove(changedKeys), succeeded] () mutable {
    360360                    if (!weakThis)
    361361                        return;
     
    459459    // Use a helper functor that schedules the callback dispatch, avoiding duplicated callOnMainThread() calls.
    460460    auto dispatchCallback =
    461         [this, &callback](std::optional<KeyStatusVector>&& existingKeys, SuccessValue success, SessionLoadFailure loadFailure) {
     461        [this, weakThis = m_weakPtrFactory.createWeakPtr(*this), &callback](std::optional<KeyStatusVector>&& existingKeys, SuccessValue success, SessionLoadFailure loadFailure) {
    462462            callOnMainThread(
    463                 [weakThis = m_weakPtrFactory.createWeakPtr(*this), callback = WTFMove(callback), existingKeys = WTFMove(existingKeys), success, loadFailure]() mutable {
     463                [weakThis, callback = WTFMove(callback), existingKeys = WTFMove(existingKeys), success, loadFailure]() mutable {
    464464                    if (!weakThis)
    465465                        return;
     
    503503    // Use a helper functor that schedules the callback dispatch, avoiding duplicated callOnMainThread() calls.
    504504    auto dispatchCallback =
    505         [this, &callback](KeyStatusVector&& keyStatusVector, std::optional<Ref<SharedBuffer>>&& message, SuccessValue success) {
     505        [this, weakThis = m_weakPtrFactory.createWeakPtr(*this), &callback](KeyStatusVector&& keyStatusVector, std::optional<Ref<SharedBuffer>>&& message, SuccessValue success) {
    506506            callOnMainThread(
    507                 [weakThis = m_weakPtrFactory.createWeakPtr(*this), callback = WTFMove(callback), keyStatusVector = WTFMove(keyStatusVector), message = WTFMove(message), success]() mutable {
     507                [weakThis, callback = WTFMove(callback), keyStatusVector = WTFMove(keyStatusVector), message = WTFMove(message), success]() mutable {
    508508                    if (!weakThis)
    509509                        return;
Note: See TracChangeset for help on using the changeset viewer.