1# Copyright 2012 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5from telemetry.core import forwarders 6from telemetry.core import webpagereplay 7 8 9# TODO(tonyg): Move webpagereplay.py's guts into this class and 10# make ReplayServer subclass LocalServer. 11 12 13def GetChromeFlags(replay_host, port_pairs): 14 return webpagereplay.GetChromeFlags(replay_host, port_pairs.http.remote_port, 15 port_pairs.https.remote_port) 16 17 18class ReplayServer(object): 19 def __init__(self, browser_backend, path, is_record_mode, is_append_mode, 20 make_javascript_deterministic): 21 self._browser_backend = browser_backend 22 self._forwarder = None 23 self._web_page_replay = None 24 self._is_record_mode = is_record_mode 25 self._is_append_mode = is_append_mode 26 27 wpr_args = browser_backend.browser_options.extra_wpr_args 28 if self._is_record_mode: 29 if self._is_append_mode: 30 wpr_args.append('--append') 31 else: 32 wpr_args.append('--record') 33 if not make_javascript_deterministic: 34 wpr_args.append('--inject_scripts=') 35 browser_backend.AddReplayServerOptions(wpr_args) 36 self._web_page_replay = webpagereplay.ReplayServer( 37 path, self._browser_backend.forwarder_factory.host_ip, 38 browser_backend.wpr_port_pairs.dns.local_port if 39 browser_backend.wpr_port_pairs.dns else 0, 40 browser_backend.wpr_port_pairs.http.local_port, 41 browser_backend.wpr_port_pairs.https.local_port, 42 wpr_args) 43 # Remove --no-dns_forwarding if it wasn't explicitly requested by backend. 44 if '--no-dns_forwarding' not in wpr_args: 45 self._web_page_replay.replay_options.remove('--no-dns_forwarding') 46 self._web_page_replay.StartServer() 47 48 browser_backend.wpr_port_pairs = forwarders.PortPairs( 49 http=forwarders.PortPair( 50 self._web_page_replay.http_port, 51 browser_backend.wpr_port_pairs.http.remote_port or 52 self._web_page_replay.http_port), 53 https=forwarders.PortPair( 54 self._web_page_replay.https_port, 55 browser_backend.wpr_port_pairs.https.remote_port or 56 self._web_page_replay.https_port), 57 dns=forwarders.PortPair( 58 self._web_page_replay.dns_port, 59 browser_backend.wpr_port_pairs.dns.remote_port or 60 self._web_page_replay.dns_port) 61 if browser_backend.wpr_port_pairs.dns else None) 62 63 self._forwarder = browser_backend.forwarder_factory.Create( 64 browser_backend.wpr_port_pairs) 65 66 def __enter__(self): 67 return self 68 69 def __exit__(self, *args): 70 self.Close() 71 72 def Close(self): 73 if self._forwarder: 74 self._forwarder.Close() 75 self._forwarder = None 76 if self._web_page_replay: 77 self._web_page_replay.StopServer() 78 self._web_page_replay = None 79