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

Side by Side Diff: tools/skp/webpages_playback.py

Issue 1047703003: Add ability to capture SKPs from Chromium's pagesets (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: Comment out cr pagesets for now Created 5 years, 8 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Archives or replays webpages and creates SKPs in a Google Storage location. 6 """Archives or replays webpages and creates SKPs in a Google Storage location.
7 7
8 To archive webpages and store SKP files (archives should be rarely updated): 8 To archive webpages and store SKP files (archives should be rarely updated):
9 9
10 cd skia 10 cd skia
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 CREDENTIALS_GS_PATH = '/playback/credentials/credentials.json' 108 CREDENTIALS_GS_PATH = '/playback/credentials/credentials.json'
109 109
110 X11_DISPLAY = os.getenv('DISPLAY', ':0') 110 X11_DISPLAY = os.getenv('DISPLAY', ':0')
111 111
112 GS_PREDEFINED_ACL = gs_utils.GSUtils.PredefinedACL.PRIVATE 112 GS_PREDEFINED_ACL = gs_utils.GSUtils.PredefinedACL.PRIVATE
113 GS_FINE_GRAINED_ACL_LIST = [ 113 GS_FINE_GRAINED_ACL_LIST = [
114 (gs_utils.GSUtils.IdType.GROUP_BY_DOMAIN, 'google.com', 114 (gs_utils.GSUtils.IdType.GROUP_BY_DOMAIN, 'google.com',
115 gs_utils.GSUtils.Permission.READ), 115 gs_utils.GSUtils.Permission.READ),
116 ] 116 ]
117 117
118 # Path to Chromium's page sets.
119 CHROMIUM_PAGE_SETS_PATH = os.path.join('tools', 'perf', 'page_sets')
120
121 # Dictionary of supported Chromium page sets to their file prefixes.
122 CHROMIUM_PAGE_SETS_TO_PREFIX = {
123 # 'key_mobile_sites_smooth.py': 'keymobi',
124 # TODO(rmistry): Uncomment the below after it is verified that the above
125 # works.
126 # 'top_25_smooth.py': 'top25desk',
127 }
128
129
118 def remove_prefix(s, prefix): 130 def remove_prefix(s, prefix):
119 if s.startswith(prefix): 131 if s.startswith(prefix):
120 return s[len(prefix):] 132 return s[len(prefix):]
121 return s 133 return s
122 134
135
123 class SkPicturePlayback(object): 136 class SkPicturePlayback(object):
124 """Class that archives or replays webpages and creates SKPs.""" 137 """Class that archives or replays webpages and creates SKPs."""
125 138
126 def __init__(self, parse_options): 139 def __init__(self, parse_options):
127 """Constructs a SkPicturePlayback BuildStep instance.""" 140 """Constructs a SkPicturePlayback BuildStep instance."""
128 assert parse_options.browser_executable, 'Must specify --browser_executable' 141 assert parse_options.browser_executable, 'Must specify --browser_executable'
129 self._browser_executable = parse_options.browser_executable 142 self._browser_executable = parse_options.browser_executable
130 143
144 self._chrome_page_sets_path = os.path.join(parse_options.chrome_src_path,
145 CHROMIUM_PAGE_SETS_PATH)
131 self._all_page_sets_specified = parse_options.page_sets == 'all' 146 self._all_page_sets_specified = parse_options.page_sets == 'all'
132 self._page_sets = self._ParsePageSets(parse_options.page_sets) 147 self._page_sets = self._ParsePageSets(parse_options.page_sets)
133 148
134 self._record = parse_options.record 149 self._record = parse_options.record
135 self._skia_tools = parse_options.skia_tools 150 self._skia_tools = parse_options.skia_tools
136 self._non_interactive = parse_options.non_interactive 151 self._non_interactive = parse_options.non_interactive
137 self._upload = parse_options.upload 152 self._upload = parse_options.upload
138 data_store_location = parse_options.data_store 153 data_store_location = parse_options.data_store
139 if data_store_location.startswith(gs_utils.GS_PREFIX): 154 if data_store_location.startswith(gs_utils.GS_PREFIX):
140 self.gs = GoogleStorageDataStore(data_store_location) 155 self.gs = GoogleStorageDataStore(data_store_location)
(...skipping 15 matching lines...) Expand all
156 if not page_sets: 171 if not page_sets:
157 raise ValueError('Must specify at least one page_set!') 172 raise ValueError('Must specify at least one page_set!')
158 elif self._all_page_sets_specified: 173 elif self._all_page_sets_specified:
159 # Get everything from the page_sets directory. 174 # Get everything from the page_sets directory.
160 page_sets_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)), 175 page_sets_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)),
161 'page_sets') 176 'page_sets')
162 ps = [os.path.join(page_sets_dir, page_set) 177 ps = [os.path.join(page_sets_dir, page_set)
163 for page_set in os.listdir(page_sets_dir) 178 for page_set in os.listdir(page_sets_dir)
164 if not os.path.isdir(os.path.join(page_sets_dir, page_set)) and 179 if not os.path.isdir(os.path.join(page_sets_dir, page_set)) and
165 page_set.endswith('.py')] 180 page_set.endswith('.py')]
181 chromium_ps = [
182 os.path.join(self._chrome_page_sets_path, cr_page_set)
183 for cr_page_set in CHROMIUM_PAGE_SETS_TO_PREFIX]
184 ps.extend(chromium_ps)
166 elif '*' in page_sets: 185 elif '*' in page_sets:
167 # Explode and return the glob. 186 # Explode and return the glob.
168 ps = glob.glob(page_sets) 187 ps = glob.glob(page_sets)
169 else: 188 else:
170 ps = page_sets.split(',') 189 ps = page_sets.split(',')
171 ps.sort() 190 ps.sort()
172 return ps 191 return ps
173 192
193 def _IsChromiumPageSet(self, page_set):
194 """Returns true if the specified page set is a Chromium page set."""
195 return page_set.startswith(self._chrome_page_sets_path)
196
174 def Run(self): 197 def Run(self):
175 """Run the SkPicturePlayback BuildStep.""" 198 """Run the SkPicturePlayback BuildStep."""
176 199
177 # Download the credentials file if it was not previously downloaded. 200 # Download the credentials file if it was not previously downloaded.
178 if not os.path.isfile(CREDENTIALS_FILE_PATH): 201 if not os.path.isfile(CREDENTIALS_FILE_PATH):
179 # Download the credentials.json file from Google Storage. 202 # Download the credentials.json file from Google Storage.
180 self.gs.download_file(CREDENTIALS_GS_PATH, CREDENTIALS_FILE_PATH) 203 self.gs.download_file(CREDENTIALS_GS_PATH, CREDENTIALS_FILE_PATH)
181 204
182 if not os.path.isfile(CREDENTIALS_FILE_PATH): 205 if not os.path.isfile(CREDENTIALS_FILE_PATH):
183 print """\n\nCould not locate credentials file in the storage. 206 print """\n\nCould not locate credentials file in the storage.
(...skipping 26 matching lines...) Expand all
210 start_time = time.time() 233 start_time = time.time()
211 234
212 # Loop through all page_sets. 235 # Loop through all page_sets.
213 for page_set in self._page_sets: 236 for page_set in self._page_sets:
214 237
215 page_set_basename = os.path.basename(page_set).split('.')[0] 238 page_set_basename = os.path.basename(page_set).split('.')[0]
216 page_set_json_name = page_set_basename + '.json' 239 page_set_json_name = page_set_basename + '.json'
217 wpr_data_file = page_set.split(os.path.sep)[-1].split('.')[0] + '_000.wpr' 240 wpr_data_file = page_set.split(os.path.sep)[-1].split('.')[0] + '_000.wpr'
218 page_set_dir = os.path.dirname(page_set) 241 page_set_dir = os.path.dirname(page_set)
219 242
220 if self._record: 243 if self._IsChromiumPageSet(page_set):
244 print 'Using Chromium\'s captured archives for Chromium\'s page sets.'
245 elif self._record:
221 # Create an archive of the specified webpages if '--record=True' is 246 # Create an archive of the specified webpages if '--record=True' is
222 # specified. 247 # specified.
223 record_wpr_cmd = ( 248 record_wpr_cmd = (
224 'PYTHONPATH=%s:$PYTHONPATH' % page_set_dir, 249 'PYTHONPATH=%s:$PYTHONPATH' % page_set_dir,
225 'DISPLAY=%s' % X11_DISPLAY, 250 'DISPLAY=%s' % X11_DISPLAY,
226 os.path.join(self._telemetry_binaries_dir, 'record_wpr'), 251 os.path.join(self._telemetry_binaries_dir, 'record_wpr'),
227 '--extra-browser-args=--disable-setuid-sandbox', 252 '--extra-browser-args=--disable-setuid-sandbox',
228 '--browser=exact', 253 '--browser=exact',
229 '--browser-executable=%s' % self._browser_executable, 254 '--browser-executable=%s' % self._browser_executable,
230 '%s_page_set' % page_set_basename, 255 '%s_page_set' % page_set_basename,
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 print '\n\n=======New SKPs have been uploaded to %s =======\n\n' % ( 365 print '\n\n=======New SKPs have been uploaded to %s =======\n\n' % (
341 posixpath.join(self.gs.target_name(), dest_dir_name, 366 posixpath.join(self.gs.target_name(), dest_dir_name,
342 SKPICTURES_DIR_NAME)) 367 SKPICTURES_DIR_NAME))
343 else: 368 else:
344 print '\n\n=======Not Uploading to %s=======\n\n' % self.gs.target_type() 369 print '\n\n=======Not Uploading to %s=======\n\n' % self.gs.target_type()
345 print 'Generated resources are available in %s\n\n' % ( 370 print 'Generated resources are available in %s\n\n' % (
346 LOCAL_PLAYBACK_ROOT_DIR) 371 LOCAL_PLAYBACK_ROOT_DIR)
347 372
348 return 0 373 return 0
349 374
375 def _GetSkiaSkpFileName(self, page_set):
376 """Returns the SKP file name for Skia page sets."""
377 # /path/to/skia_yahooanswers_desktop.py -> skia_yahooanswers_desktop.py
378 ps_filename = os.path.basename(page_set)
379 # skia_yahooanswers_desktop.py -> skia_yahooanswers_desktop
380 ps_basename, _ = os.path.splitext(ps_filename)
381 # skia_yahooanswers_desktop -> skia, yahooanswers, desktop
382 _, page_name, device = ps_basename.split('_')
383 basename = '%s_%s' % (DEVICE_TO_PLATFORM_PREFIX[device], page_name)
384 return basename[:MAX_SKP_BASE_NAME_LEN] + '.skp'
385
386 def _GetChromiumSkpFileName(self, page_set, site):
387 """Returns the SKP file name for Chromium page sets."""
388 # /path/to/http___mobile_news_sandbox_pt0 -> http___mobile_news_sandbox_pt0
389 _, webpage = os.path.split(site)
390 # http___mobile_news_sandbox_pt0 -> mobile_news_sandbox_pt0
391 webpage = webpage.lstrip('http___').lstrip('https___')
392 # /path/to/skia_yahooanswers_desktop.py -> skia_yahooanswers_desktop.py
393 ps_filename = os.path.basename(page_set)
394 # http___mobile_news_sandbox -> pagesetprefix_http___mobile_news_sandbox
395 basename = '%s_%s' % (CHROMIUM_PAGE_SETS_TO_PREFIX[ps_filename], webpage)
396 return basename[:MAX_SKP_BASE_NAME_LEN] + '.skp'
397
350 def _RenameSkpFiles(self, page_set): 398 def _RenameSkpFiles(self, page_set):
351 """Rename generated SKP files into more descriptive names. 399 """Rename generated SKP files into more descriptive names.
352 400
353 Look into the subdirectory of TMP_SKP_DIR and find the most interesting 401 Look into the subdirectory of TMP_SKP_DIR and find the most interesting
354 .skp in there to be this page_set's representative .skp. 402 .skp in there to be this page_set's representative .skp.
355 """ 403 """
356 # Here's where we're assuming there's one page per pageset. 404 subdirs = glob.glob(os.path.join(TMP_SKP_DIR, '*'))
357 # If there were more than one, we'd overwrite filename below. 405 for site in subdirs:
406 if self._IsChromiumPageSet(page_set):
407 filename = self._GetChromiumSkpFileName(page_set, site)
408 else:
409 filename = self._GetSkiaSkpFileName(page_set)
358 410
359 # /path/to/skia_yahooanswers_desktop.json -> skia_yahooanswers_desktop.json
360 _, ps_filename = os.path.split(page_set)
361 # skia_yahooanswers_desktop.json -> skia_yahooanswers_desktop
362 ps_basename, _ = os.path.splitext(ps_filename)
363 # skia_yahooanswers_desktop -> skia, yahooanswers, desktop
364 _, page_name, device = ps_basename.split('_')
365
366 basename = '%s_%s' % (DEVICE_TO_PLATFORM_PREFIX[device], page_name)
367 filename = basename[:MAX_SKP_BASE_NAME_LEN] + '.skp'
368
369 subdirs = glob.glob(os.path.join(TMP_SKP_DIR, '*'))
370 assert len(subdirs) == 1
371 for site in subdirs:
372 # We choose the largest .skp as the most likely to be interesting. 411 # We choose the largest .skp as the most likely to be interesting.
373 largest_skp = max(glob.glob(os.path.join(site, '*.skp')), 412 largest_skp = max(glob.glob(os.path.join(site, '*.skp')),
374 key=lambda path: os.stat(path).st_size) 413 key=lambda path: os.stat(path).st_size)
375 dest = os.path.join(self._local_skp_dir, filename) 414 dest = os.path.join(self._local_skp_dir, filename)
376 print 'Moving', largest_skp, 'to', dest 415 print 'Moving', largest_skp, 'to', dest
377 shutil.move(largest_skp, dest) 416 shutil.move(largest_skp, dest)
378 self._skp_files.append(filename) 417 self._skp_files.append(filename)
379 shutil.rmtree(site) 418 shutil.rmtree(site)
380 419
381 def _CreateLocalStorageDirs(self): 420 def _CreateLocalStorageDirs(self):
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 def does_storage_object_exist(self, *args): 455 def does_storage_object_exist(self, *args):
417 raise NotImplementedError() 456 raise NotImplementedError()
418 def download_file(self, *args): 457 def download_file(self, *args):
419 raise NotImplementedError() 458 raise NotImplementedError()
420 def upload_dir_contents(self, source_dir, **kwargs): 459 def upload_dir_contents(self, source_dir, **kwargs):
421 raise NotImplementedError() 460 raise NotImplementedError()
422 461
423 class GoogleStorageDataStore(DataStore): 462 class GoogleStorageDataStore(DataStore):
424 def __init__(self, data_store_url): 463 def __init__(self, data_store_url):
425 self._data_store_url = data_store_url 464 self._data_store_url = data_store_url
426 self._bucket = remove_prefix(self._data_store_url.lstrip(), 465 self._bucket = remove_prefix(self._data_store_url.lstrip(),
427 gs_utils.GS_PREFIX) 466 gs_utils.GS_PREFIX)
428 self.gs = gs_utils.GSUtils() 467 self.gs = gs_utils.GSUtils()
429 def target_name(self): 468 def target_name(self):
430 return self._data_store_url 469 return self._data_store_url
431 def target_type(self): 470 def target_type(self):
432 return 'Google Storage' 471 return 'Google Storage'
433 def does_storage_object_exist(self, *args): 472 def does_storage_object_exist(self, *args):
434 return self.gs.does_storage_object_exist(self._bucket, *args) 473 return self.gs.does_storage_object_exist(self._bucket, *args)
435 def download_file(self, *args): 474 def download_file(self, *args):
436 self.gs.download_file(self._bucket, *args) 475 self.gs.download_file(self._bucket, *args)
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 default=None) 550 default=None)
512 option_parser.add_option( 551 option_parser.add_option(
513 '', '--non-interactive', action='store_true', 552 '', '--non-interactive', action='store_true',
514 help='Runs the script without any prompts. If this flag is specified and ' 553 help='Runs the script without any prompts. If this flag is specified and '
515 '--skia_tools is specified then the debugger is not run.', 554 '--skia_tools is specified then the debugger is not run.',
516 default=False) 555 default=False)
517 options, unused_args = option_parser.parse_args() 556 options, unused_args = option_parser.parse_args()
518 557
519 playback = SkPicturePlayback(options) 558 playback = SkPicturePlayback(options)
520 sys.exit(playback.Run()) 559 sys.exit(playback.Run())
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698