Changeset 291441 in webkit


Ignore:
Timestamp:
Mar 17, 2022 2:19:27 PM (4 months ago)
Author:
commit-queue@webkit.org
Message:

PerformanceNavigationTiming Response Start unavailable when using Service Worker Cache
https://bugs.webkit.org/show_bug.cgi?id=237317

Patch by Alex Christensen <achristensen@webkit.org> on 2022-03-17
Reviewed by Youenn Fablet.

Source/WebCore:

  • Modules/cache/DOMCache.cpp:

(WebCore::createResponse):

  • page/PerformanceNavigationTiming.cpp:

(WebCore::PerformanceNavigationTiming::navigationFinished):

  • platform/network/NetworkLoadMetrics.cpp:

(WebCore::NetworkLoadMetrics::updateFrom):
(WebCore::NetworkLoadMetrics::NetworkLoadMetrics): Deleted.

  • platform/network/NetworkLoadMetrics.h:

LayoutTests:

Test that these values are reasonable after loading the main resource from a service worker's cache.

  • http/wpt/service-workers/navigation-timing.https-expected.txt: Added.
  • http/wpt/service-workers/navigation-timing.https.html: Added.
  • http/wpt/service-workers/navigation-timing.js: Added.

(event.event.waitUntil.caches.open.string_appeared_here.then):
(event.event.respondWith.caches.open.string_appeared_here.then):

  • http/wpt/service-workers/resources/navigation-timing-part-2.html: Added.
Location:
trunk
Files:
4 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r291435 r291441  
     12022-03-17  Alex Christensen  <achristensen@webkit.org>
     2
     3        PerformanceNavigationTiming Response Start unavailable when using Service Worker Cache
     4        https://bugs.webkit.org/show_bug.cgi?id=237317
     5
     6        Reviewed by Youenn Fablet.
     7
     8        Test that these values are reasonable after loading the main resource from a service worker's cache.
     9
     10        * http/wpt/service-workers/navigation-timing.https-expected.txt: Added.
     11        * http/wpt/service-workers/navigation-timing.https.html: Added.
     12        * http/wpt/service-workers/navigation-timing.js: Added.
     13        (event.event.waitUntil.caches.open.string_appeared_here.then):
     14        (event.event.respondWith.caches.open.string_appeared_here.then):
     15        * http/wpt/service-workers/resources/navigation-timing-part-2.html: Added.
     16
    1172022-03-17  Cameron McCormack  <heycam@apple.com>
    218
  • trunk/Source/WebCore/ChangeLog

    r291438 r291441  
     12022-03-17  Alex Christensen  <achristensen@webkit.org>
     2
     3        PerformanceNavigationTiming Response Start unavailable when using Service Worker Cache
     4        https://bugs.webkit.org/show_bug.cgi?id=237317
     5
     6        Reviewed by Youenn Fablet.
     7
     8        * Modules/cache/DOMCache.cpp:
     9        (WebCore::createResponse):
     10        * page/PerformanceNavigationTiming.cpp:
     11        (WebCore::PerformanceNavigationTiming::navigationFinished):
     12        * platform/network/NetworkLoadMetrics.cpp:
     13        (WebCore::NetworkLoadMetrics::updateFrom):
     14        (WebCore::NetworkLoadMetrics::NetworkLoadMetrics): Deleted.
     15        * platform/network/NetworkLoadMetrics.h:
     16
    1172022-03-17  Eric Carlson  <eric.carlson@apple.com>
    218
  • trunk/Source/WebCore/Modules/cache/DOMCache.cpp

    r291123 r291441  
    8080}
    8181
    82 static Ref<FetchResponse> createResponse(ScriptExecutionContext& context, const DOMCacheEngine::Record& record)
     82static Ref<FetchResponse> createResponse(ScriptExecutionContext& context, const DOMCacheEngine::Record& record, MonotonicTime requestStart)
    8383{
    8484    auto resourceResponse = record.response;
    8585    resourceResponse.setSource(ResourceResponse::Source::DOMCache);
     86
     87    auto metrics = Box<NetworkLoadMetrics>::create();
     88    metrics->requestStart = requestStart;
     89    metrics->responseStart = MonotonicTime::now();
     90    resourceResponse.setDeprecatedNetworkLoadMetrics(WTFMove(metrics));
     91
    8692    auto response = FetchResponse::create(&context, std::nullopt, record.responseHeadersGuard, WTFMove(resourceResponse));
    8793    response->setBodyData(copyResponseBody(record.responseBody), record.responseBodySize);
     
    101107
    102108    auto request = requestOrException.releaseReturnValue()->resourceRequest();
    103     queryCache(WTFMove(request), options, ShouldRetrieveResponses::Yes, [this, callback = WTFMove(callback)](auto&& result) mutable {
     109    auto requestStart = MonotonicTime::now();
     110    queryCache(WTFMove(request), options, ShouldRetrieveResponses::Yes, [this, callback = WTFMove(callback), requestStart](auto&& result) mutable {
    104111        if (result.hasException()) {
    105112            callback(result.releaseException());
     
    109116        RefPtr<FetchResponse> response;
    110117        if (!result.returnValue().isEmpty())
    111             response = createResponse(*scriptExecutionContext(), result.returnValue()[0]);
     118            response = createResponse(*scriptExecutionContext(), result.returnValue()[0], requestStart);
    112119
    113120        callback(WTFMove(response));
     
    115122}
    116123
    117 Vector<Ref<FetchResponse>> DOMCache::cloneResponses(const Vector<DOMCacheEngine::Record>& records)
    118 {
    119     return WTF::map(records, [this] (const auto& record) {
    120         return createResponse(*scriptExecutionContext(), record);
     124Vector<Ref<FetchResponse>> DOMCache::cloneResponses(const Vector<DOMCacheEngine::Record>& records, MonotonicTime requestStart)
     125{
     126    return WTF::map(records, [this, requestStart] (const auto& record) {
     127        return createResponse(*scriptExecutionContext(), record, requestStart);
    121128    });
    122129}
     
    137144    }
    138145
    139     queryCache(WTFMove(resourceRequest), options, ShouldRetrieveResponses::Yes, [this, promise = WTFMove(promise)](auto&& result) mutable {
    140         queueTaskKeepingObjectAlive(*this, TaskSource::DOMManipulation, [this, promise = WTFMove(promise), result = WTFMove(result)]() mutable {
     146    auto requestStart = MonotonicTime::now();
     147    queryCache(WTFMove(resourceRequest), options, ShouldRetrieveResponses::Yes, [this, promise = WTFMove(promise), requestStart](auto&& result) mutable {
     148        queueTaskKeepingObjectAlive(*this, TaskSource::DOMManipulation, [this, promise = WTFMove(promise), result = WTFMove(result), requestStart]() mutable {
    141149            if (result.hasException()) {
    142150                promise.reject(result.releaseException());
    143151                return;
    144152            }
    145             promise.resolve(cloneResponses(result.releaseReturnValue()));
     153            promise.resolve(cloneResponses(result.releaseReturnValue(), requestStart));
    146154        });
    147155    });
  • trunk/Source/WebCore/Modules/cache/DOMCache.h

    r287066 r291441  
    8383    void batchPutOperation(Vector<DOMCacheEngine::Record>&&, CompletionHandler<void(ExceptionOr<void>&&)>&&);
    8484
    85     Vector<Ref<FetchResponse>> cloneResponses(const Vector<DOMCacheEngine::Record>&);
     85    Vector<Ref<FetchResponse>> cloneResponses(const Vector<DOMCacheEngine::Record>&, MonotonicTime);
    8686    DOMCacheEngine::Record toConnectionRecord(const FetchRequest&, FetchResponse&, DOMCacheEngine::ResponseBody&&);
    8787
  • trunk/Source/WebCore/page/PerformanceNavigationTiming.cpp

    r285724 r291441  
    143143{
    144144    m_documentLoadTiming.markEndTime();
    145     m_resourceTiming.networkLoadMetrics() = metrics;
     145    m_resourceTiming.networkLoadMetrics().updateFromFinalMetrics(metrics);
    146146}
    147147
  • trunk/Source/WebCore/platform/network/NetworkLoadMetrics.cpp

    r282853 r291441  
    3131namespace WebCore {
    3232
    33 NetworkLoadMetrics::NetworkLoadMetrics()
    34     : complete(false)
    35     , cellular(false)
    36     , expensive(false)
    37     , constrained(false)
    38     , multipath(false)
    39     , isReusedConnection(false)
    40     , failsTAOCheck(false)
    41     , hasCrossOriginRedirect(false) { }
     33NetworkLoadMetrics::NetworkLoadMetrics() = default;
     34
     35void NetworkLoadMetrics::updateFromFinalMetrics(const NetworkLoadMetrics& other)
     36{
     37    MonotonicTime originalRedirectStart = redirectStart;
     38    MonotonicTime originalFetchStart = fetchStart;
     39    MonotonicTime originalDomainLookupStart = domainLookupStart;
     40    MonotonicTime originalDomainLookupEnd = domainLookupEnd;
     41    MonotonicTime originalConnectStart = connectStart;
     42    MonotonicTime originalSecureConnectionStart = secureConnectionStart;
     43    MonotonicTime originalConnectEnd = connectEnd;
     44    MonotonicTime originalRequestStart = requestStart;
     45    MonotonicTime originalResponseStart = responseStart;
     46    MonotonicTime originalResponseEnd = responseEnd;
     47
     48    *this = other;
     49
     50    if (!redirectStart)
     51        redirectStart = originalRedirectStart;
     52    if (!fetchStart)
     53        fetchStart = originalFetchStart;
     54    if (!domainLookupStart)
     55        domainLookupStart = originalDomainLookupStart;
     56    if (!domainLookupEnd)
     57        domainLookupEnd = originalDomainLookupEnd;
     58    if (!connectStart)
     59        connectStart = originalConnectStart;
     60    if (!secureConnectionStart)
     61        secureConnectionStart = originalSecureConnectionStart;
     62    if (!connectEnd)
     63        connectEnd = originalConnectEnd;
     64    if (!requestStart)
     65        requestStart = originalRequestStart;
     66    if (!responseStart)
     67        responseStart = originalResponseStart;
     68    if (!responseEnd)
     69        responseEnd = originalResponseEnd;
     70
     71    if (!responseEnd)
     72        responseEnd = MonotonicTime::now();
     73    complete = true;
     74}
    4275
    4376const NetworkLoadMetrics& NetworkLoadMetrics::emptyMetrics()
  • trunk/Source/WebCore/platform/network/NetworkLoadMetrics.h

    r290969 r291441  
    7676    void markComplete() { complete = true; }
    7777
     78    void updateFromFinalMetrics(const NetworkLoadMetrics&);
     79
    7880    // https://www.w3.org/TR/resource-timing-2/#attribute-descriptions
    7981    MonotonicTime redirectStart;
     
    9395    uint16_t redirectCount { 0 };
    9496
    95     bool complete : 1;
    96     bool cellular : 1;
    97     bool expensive : 1;
    98     bool constrained : 1;
    99     bool multipath : 1;
    100     bool isReusedConnection : 1;
    101     bool failsTAOCheck : 1;
    102     bool hasCrossOriginRedirect : 1;
     97    bool complete : 1 { false };
     98    bool cellular : 1 { false };
     99    bool expensive : 1 { false };
     100    bool constrained : 1 { false };
     101    bool multipath : 1 { false };
     102    bool isReusedConnection : 1 { false };
     103    bool failsTAOCheck : 1 { false };
     104    bool hasCrossOriginRedirect : 1 { false };
    103105
    104106    PrivacyStance privacyStance { PrivacyStance::Unknown };
Note: See TracChangeset for help on using the changeset viewer.