| Index: tools/android/loading/request_track.py
|
| diff --git a/tools/android/loading/request_track.py b/tools/android/loading/request_track.py
|
| index 60a54e56cf1f75b1d0eb2fc97dbd7760cfeefdc7..566fb3c36208f76388b61e676594d255abb96192 100644
|
| --- a/tools/android/loading/request_track.py
|
| +++ b/tools/android/loading/request_track.py
|
| @@ -46,7 +46,7 @@ class Request(object):
|
| third_party/WebKit/Source/devtools/protocol.json.
|
|
|
| Fields:
|
| - request_id: (str) unique request ID. Postfixed with REDIRECT_SUFFIX for
|
| + request_id: (str) unique request ID. Postfixed with _REDIRECT_SUFFIX for
|
| redirects.
|
| frame_id: (str) unique frame identifier.
|
| loader_id: (str) unique frame identifier.
|
| @@ -77,7 +77,9 @@ class Request(object):
|
| RESOURCE_TYPES = ('Document', 'Stylesheet', 'Image', 'Media', 'Font',
|
| 'Script', 'TextTrack', 'XHR', 'Fetch', 'EventSource',
|
| 'WebSocket', 'Manifest', 'Other')
|
| - INITIATORS = ('parser', 'script', 'other')
|
| + INITIATORS = ('parser', 'script', 'other', 'redirect')
|
| + INITIATING_REQUEST = 'initiating_request'
|
| + ORIGINAL_INITIATOR = 'original_initiator'
|
| def __init__(self):
|
| self.request_id = None
|
| self.frame_id = None
|
| @@ -172,7 +174,7 @@ class Request(object):
|
|
|
| class RequestTrack(devtools_monitor.Track):
|
| """Aggregates request data."""
|
| - REDIRECT_SUFFIX = '.redirect'
|
| + _REDIRECT_SUFFIX = '.redirect'
|
| # Request status
|
| _STATUS_SENT = 0
|
| _STATUS_RESPONSE = 1
|
| @@ -183,12 +185,14 @@ class RequestTrack(devtools_monitor.Track):
|
| _EVENTS_KEY = 'events'
|
| _METADATA_KEY = 'metadata'
|
| _DUPLICATES_KEY = 'duplicates_count'
|
| + _INCONSISTENT_INITIATORS_KEY = 'inconsistent_initiators'
|
| def __init__(self, connection):
|
| super(RequestTrack, self).__init__(connection)
|
| self._connection = connection
|
| self._requests = []
|
| self._requests_in_flight = {} # requestId -> (request, status)
|
| self._completed_requests_by_id = {}
|
| + self._redirects_count_by_id = collections.defaultdict(int)
|
| if connection: # Optional for testing.
|
| for method in RequestTrack._METHOD_TO_HANDLER:
|
| self._connection.RegisterListener(method, self)
|
| @@ -196,6 +200,7 @@ class RequestTrack(devtools_monitor.Track):
|
| # detect this.
|
| self._request_id_to_response_received = {}
|
| self.duplicates_count = 0
|
| + self.inconsistent_initiators_count = 0
|
|
|
| def Handle(self, method, msg):
|
| assert method in RequestTrack._METHOD_TO_HANDLER
|
| @@ -214,7 +219,10 @@ class RequestTrack(devtools_monitor.Track):
|
| logging.warning('Requests in flight, will be ignored in the dump')
|
| return {self._EVENTS_KEY: [
|
| request.ToJsonDict() for request in self._requests],
|
| - self._METADATA_KEY: {self._DUPLICATES_KEY: self.duplicates_count}}
|
| + self._METADATA_KEY: {
|
| + self._DUPLICATES_KEY: self.duplicates_count,
|
| + self._INCONSISTENT_INITIATORS_KEY:
|
| + self.inconsistent_initiators_count}}
|
|
|
| @classmethod
|
| def FromJsonDict(cls, json_dict):
|
| @@ -224,14 +232,18 @@ class RequestTrack(devtools_monitor.Track):
|
| requests = [Request.FromJsonDict(request)
|
| for request in json_dict[cls._EVENTS_KEY]]
|
| result._requests = requests
|
| - result.duplicates_count = json_dict[cls._METADATA_KEY][cls._DUPLICATES_KEY]
|
| + metadata = json_dict[cls._METADATA_KEY]
|
| + result.duplicates_count = metadata.get(cls._DUPLICATES_KEY, 0)
|
| + result.inconsistent_initiators_count = metadata.get(
|
| + cls._INCONSISTENT_INITIATORS_KEY, 0)
|
| return result
|
|
|
| def _RequestWillBeSent(self, request_id, params):
|
| # Several "requestWillBeSent" events can be dispatched in a row in the case
|
| # of redirects.
|
| + redirect_initiator = None
|
| if request_id in self._requests_in_flight:
|
| - self._HandleRedirect(request_id, params)
|
| + redirect_initiator = self._HandleRedirect(request_id, params)
|
| assert (request_id not in self._requests_in_flight
|
| and request_id not in self._completed_requests_by_id)
|
| r = Request()
|
| @@ -247,6 +259,16 @@ class RequestTrack(devtools_monitor.Track):
|
| ('headers', 'headers'),
|
| ('initialPriority', 'initial_priority')))
|
| r.resource_type = params.get('type', 'Other')
|
| + if redirect_initiator:
|
| + original_initiator = r.initiator
|
| + r.initiator = redirect_initiator
|
| + r.initiator[Request.ORIGINAL_INITIATOR] = original_initiator
|
| + initiating_request = self._completed_requests_by_id[
|
| + redirect_initiator[Request.INITIATING_REQUEST]]
|
| + initiating_initiator = initiating_request.initiator.get(
|
| + Request.ORIGINAL_INITIATOR, initiating_request.initiator)
|
| + if initiating_initiator != original_initiator:
|
| + self.inconsistent_initiators_count += 1
|
| self._requests_in_flight[request_id] = (r, RequestTrack._STATUS_SENT)
|
|
|
| def _HandleRedirect(self, request_id, params):
|
| @@ -256,15 +278,23 @@ class RequestTrack(devtools_monitor.Track):
|
| # one. Finalize the first request.
|
| assert 'redirectResponse' in params
|
| redirect_response = params['redirectResponse']
|
| +
|
| _CopyFromDictToObject(redirect_response, r,
|
| (('headers', 'response_headers'),
|
| ('encodedDataLength', 'encoded_data_length'),
|
| ('fromDiskCache', 'from_disk_cache')))
|
| r.timing = TimingFromDict(redirect_response['timing'])
|
| - r.request_id = request_id + self.REDIRECT_SUFFIX
|
| +
|
| + redirect_index = self._redirects_count_by_id[request_id]
|
| + self._redirects_count_by_id[request_id] += 1
|
| + r.request_id = '%s%s.%d' % (request_id, self._REDIRECT_SUFFIX,
|
| + redirect_index + 1)
|
| + initiator = {
|
| + 'type': 'redirect', Request.INITIATING_REQUEST: r.request_id}
|
| self._requests_in_flight[r.request_id] = (r, RequestTrack._STATUS_FINISHED)
|
| del self._requests_in_flight[request_id]
|
| self._FinalizeRequest(r.request_id)
|
| + return initiator
|
|
|
| def _RequestServedFromCache(self, request_id, _):
|
| assert request_id in self._requests_in_flight
|
|
|