Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(634)

Side by Side Diff: tools/android/loading/request_dependencies_lens.py

Issue 1813723002: clovis: Identify prefetchable resources from dependencies and tracing. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright 2016 The Chromium Authors. All rights reserved. 1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 """Gathers and infers dependencies between requests. 5 """Gathers and infers dependencies between requests.
6 6
7 When executed as a script, loads a trace and outputs the dependencies. 7 When executed as a script, loads a trace and outputs the dependencies.
8 """ 8 """
9 9
10 import collections 10 import collections
(...skipping 12 matching lines...) Expand all
23 def __init__(self, trace): 23 def __init__(self, trace):
24 """Initializes an instance of RequestDependencyLens. 24 """Initializes an instance of RequestDependencyLens.
25 25
26 Args: 26 Args:
27 trace: (LoadingTrace) Loading trace. 27 trace: (LoadingTrace) Loading trace.
28 """ 28 """
29 self.loading_trace = trace 29 self.loading_trace = trace
30 self._requests = self.loading_trace.request_track.GetEvents() 30 self._requests = self.loading_trace.request_track.GetEvents()
31 self._requests_by_id = {r.request_id: r for r in self._requests} 31 self._requests_by_id = {r.request_id: r for r in self._requests}
32 self._requests_by_url = collections.defaultdict(list) 32 self._requests_by_url = collections.defaultdict(list)
33 self._deps = None
33 for request in self._requests: 34 for request in self._requests:
34 self._requests_by_url[request.url].append(request) 35 self._requests_by_url[request.url].append(request)
35 self._frame_to_parent = {} 36 self._frame_to_parent = {}
36 for event in self.loading_trace.page_track.GetEvents(): 37 for event in self.loading_trace.page_track.GetEvents():
37 if event['method'] == 'Page.frameAttached': 38 if event['method'] == 'Page.frameAttached':
38 self._frame_to_parent[event['frame_id']] = event['parent_frame_id'] 39 self._frame_to_parent[event['frame_id']] = event['parent_frame_id']
39 40
40 def GetRequestDependencies(self): 41 def GetRequestDependencies(self):
41 """Returns a list of request dependencies. 42 """Returns a list of request dependencies.
42 43
43 Returns: 44 Returns:
44 [(first, second, reason), ...] where first and second are instances of 45 [(first, second, reason), ...] where first and second are instances of
45 request_track.Request, and reason is in DEPENDENCIES. The second request 46 request_track.Request, and reason is in DEPENDENCIES. The second request
46 depends on the first one, with the listed reason. 47 depends on the first one, with the listed reason.
47 """ 48 """
48 deps = [] 49 self._ComputeRequestDependencies()
50 return copy.copy(self._deps)
51
52 def GetRedirectChain(self, request):
53 """Returns the whole redirect chain for a given request.
54
55 Note that this misses some JS-based redirects.
56
57 Returns:
58 A list of request, containing the request passed as a parameter.
59 """
60 self._ComputeRequestDependencies()
61 chain = [request]
62 while True:
63 for (first_request, second_request, why) in self._deps:
64 if first_request == request and why == 'redirect':
65 chain.append(second_request)
66 request = second_request
67 break
68 else:
69 return chain
70
71 def _ComputeRequestDependencies(self):
72 if self._deps is not None:
73 return
74 self._deps = []
49 for request in self._requests: 75 for request in self._requests:
50 dependency = self._GetDependency(request) 76 dependency = self._GetDependency(request)
51 if dependency: 77 if dependency:
52 deps.append(dependency) 78 self._deps.append(dependency)
53 return deps
54 79
55 def _GetDependency(self, request): 80 def _GetDependency(self, request):
56 """Returns (first, second, reason), or None. 81 """Returns (first, second, reason), or None.
57 82
58 |second| depends on |first|. 83 |second| depends on |first|.
59 84
60 Args: 85 Args:
61 request: (Request) the request we wish to get the initiator of. 86 request: (Request) the request we wish to get the initiator of.
62 87
63 Returns: 88 Returns:
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 if __name__ == '__main__': 240 if __name__ == '__main__':
216 import json 241 import json
217 import sys 242 import sys
218 trace_filename = sys.argv[1] 243 trace_filename = sys.argv[1]
219 json_dict = json.load(open(trace_filename, 'r')) 244 json_dict = json.load(open(trace_filename, 'r'))
220 lens = RequestDependencyLens( 245 lens = RequestDependencyLens(
221 loading_trace.LoadingTrace.FromJsonDict(json_dict)) 246 loading_trace.LoadingTrace.FromJsonDict(json_dict))
222 depedencies = lens.GetRequestDependencies() 247 depedencies = lens.GetRequestDependencies()
223 for (first, second, dep_reason) in depedencies: 248 for (first, second, dep_reason) in depedencies:
224 print '%s -> %s\t(%s)' % (first.request_id, second.request_id, dep_reason) 249 print '%s -> %s\t(%s)' % (first.request_id, second.request_id, dep_reason)
OLDNEW
« no previous file with comments | « tools/android/loading/prefetch_view_unittest.py ('k') | tools/android/loading/request_dependencies_lens_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698