# Copyright (C) 2017 Igalia S.L.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

from webkitpy.webdriver_tests.webdriver_driver import WebDriver, register_driver


class WebDriverGtk(WebDriver):

    def __init__(self, port):
        super(WebDriverGtk, self).__init__(port)

    def binary_path(self):
        return self._port._build_path('bin', 'WebKitWebDriver')

    def browser_name(self):
        return 'MiniBrowser'

    def browser_path(self):
        return self._port._build_path('bin', 'MiniBrowser')

    def browser_args(self):
        return ['--automation', '--javascript-can-open-windows-automatically=true', '--enable-xss-auditor=false']

    def capabilities(self):
        return {'webkitgtk:browserOptions': {
            'binary': self.browser_path(),
            'args': self.browser_args()}}

    def selenium_name(self):
        return 'WebKitGTK'


register_driver('gtk', WebDriverGtk)
