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