Skip to content

Commit

Permalink
fix: finalizeAndReportTiming
Browse files Browse the repository at this point in the history
  • Loading branch information
ronag committed Aug 13, 2021
1 parent 8305f78 commit 3d2dbc7
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 18 deletions.
80 changes: 62 additions & 18 deletions lib/fetch/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ const { Request, makeRequest } = require('./request')
const {
requestBadPort,
responseLocationURL,
requestCurrentURL
requestCurrentURL,
setRequestReferrerPolicyOnRedirect,
makeTimingInfo
} = require('./util')
const { kState, kHeaders, kGuard } = require('./symbols')
const { AbortError } = require('../core/errors')
Expand Down Expand Up @@ -158,6 +160,55 @@ async function fetch (resource, init) {
}

function finalizeAndReportTiming (response, initiatorType = 'other') {
// 1. If response’s URL list is null or empty, then return.
if (response.urlList.length === 0) {
return
}

// 2. Let originalURL be response’s URL list[0].
const originalURL = response.urlList[0]

// 3. Let timingInfo be response’s timing info.
let timingInfo = response.timingInfo

// 4. Let cacheState be response’s cache state.
let cacheState = response.cacheState

// 5. If timingInfo is null, then return.
if (timingInfo === null) {
return
}

// 6. If response’s timing allow passed flag is not set, then:
if (!timingInfo.timingAllowPassed) {
// 1. Set timingInfo to a new fetch timing info whose start time and
// post-redirect start time are timingInfo’s start time.
timingInfo = makeTimingInfo({
startTime: timingInfo.startTime,
postRedirectStartTime: timingInfo.postRedirectStartTime
})

// 2. Set cacheState to the empty string.
cacheState = ''
}

// 7. Set timingInfo’s end time to the coarsened shared current time
// given global’s relevant settings object’s cross-origin isolated
// capability.
// TODO: given global’s relevant settings object’s cross-origin isolated
// capability
response.timingInfo.endTime = performance.now()

// 8. Set response’s timing info to timingInfo.
response.timingInfo = timingInfo

// 9. Mark resource timing for timingInfo, originalURL, initiatorType,
// global, and cacheState.
markResourceTiming(timingInfo, originalURL, initiatorType, global, cacheState)
}

// https://w3c.github.io/resource-timing/#dfn-mark-resource-timing
function markResourceTiming () {
// TODO
}

Expand Down Expand Up @@ -220,19 +271,10 @@ function fetching ({ request, processResponse, processResponseDone }) {
// crossOriginIsolatedCapability.
// TODO: Coarsened shared current time given crossOriginIsolatedCapability?
const currenTime = performance.now()
const timingInfo = {
const timingInfo = makeTimingInfo({
startTime: currenTime,
redirectStartTime: 0,
redirectEndTime: 0,
postRedirectStartTime: currenTime,
finalServiceWorkerStartTime: 0,
finalNetworkResponseStartTime: 0,
finalNetworkRequestStartTime: 0,
endTime: 0,
encodedBodySize: 0,
decodedBodySize: 0,
finalConnectionTimingInfo: null
}
postRedirectStartTime: currenTime
})

// 6. Let fetchParams be a new fetch params whose request is request, timing
// info is timingInfo, process request body is processRequestBody,
Expand Down Expand Up @@ -813,22 +855,24 @@ async function httpRedirectFetch (fetchParams, response) {
const timingInfo = fetchParams.timingInfo

// 16. Set timingInfo’s redirect end time and post-redirect start time to the
// coarsened shared current time given fetchParams’s cross-origin isolated capability.
// coarsened shared current time given fetchParams’s cross-origin isolated
// capability.
// TODO: given fetchParams’s cross-origin isolated capability?
timingInfo.redirectEndTime = timingInfo.postRedirectStartTime =
performance.now()

// 17. If timingInfo’s redirect start time is 0, then set timingInfo’s redirect start
// time to timingInfo’s start time.
// 17. If timingInfo’s redirect start time is 0, then set timingInfo’s
// redirect start time to timingInfo’s start time.
if (timingInfo.redirectStartTime === 0) {
timingInfo.redirectStartTime = timingInfo.startTime
}

// 18. Append locationURL to request’s URL list.
request.urlList.push(locationURL)

// 19. Invoke set request’s referrer policy on redirect on request and actualResponse.
// TODO
// 19. Invoke set request’s referrer policy on redirect on request and
// actualResponse.
setRequestReferrerPolicyOnRedirect(request, actualResponse)

// 20. Return the result of running main fetch given fetchParams and true.
return mainFetch.call(this, fetchParams, true)
Expand Down
1 change: 1 addition & 0 deletions lib/fetch/response.js
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,7 @@ function makeResponse (init) {
type: 'default',
status: 200,
timingInfo: null,
cacheState: '',
statusText: '',
...init,
headersList: init.headersList
Expand Down
36 changes: 36 additions & 0 deletions lib/fetch/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -202,8 +202,44 @@ function toWebReadable (streamReadable) {
)
}

// https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect
function setRequestReferrerPolicyOnRedirect (request, actualResponse) {
// Given a request request and a response actualResponse, this algorithm
// updates request’s referrer policy according to the Referrer-Policy
// header (if any) in actualResponse.

// 1. Let policy be the result of executing § 8.1 Parse a referrer policy
// from a Referrer-Policy header on actualResponse.
// TODO: https://w3c.github.io/webappsec-referrer-policy/#parse-referrer-policy-from-header
const policy = ''

// 2. If policy is not the empty string, then set request’s referrer policy to policy.
if (policy !== '') {
request.referrerPolicy = policy
}
}

function makeTimingInfo (init) {
return {
startTime: 0,
redirectStartTime: 0,
redirectEndTime: 0,
postRedirectStartTime: 0,
finalServiceWorkerStartTime: 0,
finalNetworkResponseStartTime: 0,
finalNetworkRequestStartTime: 0,
endTime: 0,
encodedBodySize: 0,
decodedBodySize: 0,
finalConnectionTimingInfo: null,
...init
}
}

module.exports = {
toWebReadable,
makeTimingInfo,
setRequestReferrerPolicyOnRedirect,
isValidHTTPToken,
requestBadPort,
requestCurrentURL,
Expand Down

0 comments on commit 3d2dbc7

Please sign in to comment.