tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

desktop.py (2745B)


      1 # This Source Code Form is subject to the terms of the Mozilla Public
      2 # License, v. 2.0. If a copy of the MPL was not distributed with this
      3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
      4 import os
      5 import contextlib
      6 
      7 import attr
      8 from arsenic.services import Geckodriver, free_port, subprocess_based_service
      9 
     10 from condprof.util import (
     11    BaseEnv,
     12    latest_nightly,
     13    logger,
     14    get_version,
     15    get_current_platform,
     16    DEFAULT_PREFS,
     17 )
     18 
     19 
     20 @attr.s
     21 class DesktopGeckodriver(Geckodriver):
     22    async def start(self):
     23        port = free_port()
     24        await self._check_version()
     25        logger.info("Running Webdriver on port %d" % port)
     26        logger.info("Running Marionette on port 2828")
     27        pargs = [
     28            self.binary,
     29            "--log",
     30            "trace",
     31            "--port",
     32            str(port),
     33            "--marionette-port",
     34            "2828",
     35        ]
     36        try:
     37            return await subprocess_based_service(
     38                pargs, f"http://localhost:{port}", self.log_file
     39            )
     40        except ProcessLookupError as e:
     41            return await subprocess_based_service(
     42                pargs.extend(["--host", "127.0.0.1"]),
     43                f"http://localhost:{port}",
     44                self.log_file,
     45            )
     46 
     47 
     48 @contextlib.contextmanager
     49 def dummy_device(*args, **kw):
     50    yield None
     51 
     52 
     53 class DesktopEnv(BaseEnv):
     54    def get_target_platform(self):
     55        return get_current_platform()
     56 
     57    def get_device(self, *args, **kw):
     58        return dummy_device(*args, **kw)
     59 
     60    @contextlib.contextmanager
     61    def get_browser(self):
     62        with latest_nightly(self.firefox) as binary:
     63            self.firefox = os.path.abspath(binary)
     64            if not os.path.exists(self.firefox):
     65                raise IOError(self.firefox)
     66            yield
     67 
     68    def get_browser_args(self, headless, prefs=None):
     69        final_prefs = dict(DEFAULT_PREFS)
     70        if prefs is not None:
     71            final_prefs.update(prefs)
     72        options = ["--allow-downgrade", "-profile", self.profile]
     73        if headless:
     74            options.append("-headless")
     75        args = {"moz:firefoxOptions": {"args": options}}
     76        if self.firefox is not None:
     77            args["moz:firefoxOptions"]["binary"] = self.firefox
     78        args["moz:firefoxOptions"]["prefs"] = final_prefs
     79        args["moz:firefoxOptions"]["log"] = {"level": "trace"}
     80        return args
     81 
     82    def get_browser_version(self):
     83        try:
     84            return get_version(self.firefox)
     85        except Exception:
     86            logger.error("Could not get Firefox version", exc_info=True)
     87            return "unknown"
     88 
     89    def get_geckodriver(self, log_file):
     90        return DesktopGeckodriver(binary=self.geckodriver, log_file=log_file)