1from .base import Browser, ExecutorBrowser, require_arg
2from .base import get_timeout_multiplier   # noqa: F401
3from ..webdriver_server import InternetExplorerDriverServer
4from ..executors import executor_kwargs as base_executor_kwargs
5from ..executors.executorinternetexplorer import InternetExplorerDriverWdspecExecutor  # noqa: F401
6
7__wptrunner__ = {"product": "ie",
8                 "check_args": "check_args",
9                 "browser": "InternetExplorerBrowser",
10                 "executor": {"wdspec": "InternetExplorerDriverWdspecExecutor"},
11                 "browser_kwargs": "browser_kwargs",
12                 "executor_kwargs": "executor_kwargs",
13                 "env_extras": "env_extras",
14                 "env_options": "env_options",
15                 "timeout_multiplier": "get_timeout_multiplier"}
16
17
18def check_args(**kwargs):
19    require_arg(kwargs, "webdriver_binary")
20
21def browser_kwargs(test_type, run_info_data, config, **kwargs):
22    return {"webdriver_binary": kwargs["webdriver_binary"],
23            "webdriver_args": kwargs.get("webdriver_args")}
24
25def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
26                    **kwargs):
27    options = {}
28    options["requireWindowFocus"] = True
29    capabilities = {}
30    capabilities["se:ieOptions"] = options
31    executor_kwargs = base_executor_kwargs(test_type, server_config,
32                                           cache_manager, run_info_data, **kwargs)
33    executor_kwargs["close_after_done"] = True
34    executor_kwargs["capabilities"] = capabilities
35    return executor_kwargs
36
37def env_extras(**kwargs):
38    return []
39
40def env_options():
41    return {"supports_debugger": False}
42
43class InternetExplorerBrowser(Browser):
44    used_ports = set()
45
46    def __init__(self, logger, webdriver_binary, webdriver_args=None):
47        Browser.__init__(self, logger)
48        self.server = InternetExplorerDriverServer(self.logger,
49                                                   binary=webdriver_binary,
50                                                   args=webdriver_args)
51        self.webdriver_host = "localhost"
52        self.webdriver_port = self.server.port
53
54    def start(self, **kwargs):
55        self.server.start()
56
57    def stop(self, force=False):
58        self.server.stop(force=force)
59
60    def pid(self):
61        return self.server.pid
62
63    def is_alive(self):
64        # TODO(ato): This only indicates the server is alive,
65        # and doesn't say anything about whether a browser session
66        # is active.
67        return self.server.is_alive()
68
69    def cleanup(self):
70        self.stop()
71
72    def executor_browser(self):
73        return ExecutorBrowser, {"webdriver_url": self.server.url}
74