<?php

namespace Facebook\WebDriver;

/**
 * Used to locate a given frame or window.
 */
interface WebDriverTargetLocator
{
    /** @var string */
    public const WINDOW_TYPE_WINDOW = 'window';
    /** @var string */
    public const WINDOW_TYPE_TAB = 'tab';

    /**
     * Set the current browsing context to the current top-level browsing context.
     * This is the same as calling `RemoteTargetLocator::frame(null);`
     *
     * @return WebDriver The driver focused on the top window or the first frame.
     */
    public function defaultContent();

    /**
     * Switch to the iframe by its id or name.
     *
     * @param WebDriverElement|null|int|string $frame The WebDriverElement, the id or the name of the frame.
     * When null, switch to the current top-level browsing context When int, switch to the WindowProxy identified
     * by the value. When an Element, switch to that Element.
     *
     * @throws \InvalidArgumentException
     * @return WebDriver The driver focused on the given frame.
     */
    public function frame($frame);

    // TODO: Add in next major release (BC)
    ///**
    // * Switch to the parent iframe.
    // *
    // * @return WebDriver This driver focused on the parent frame
    // */
    //public function parent();

    /**
     * Switch the focus to another window by its handle.
     *
     * @param string $handle The handle of the window to be focused on.
     * @return WebDriver The driver focused on the given window.
     * @see WebDriver::getWindowHandles
     */
    public function window($handle);

    // TODO: Add in next major release (BC)
    //public function newWindow($windowType = self::WINDOW_TYPE_TAB);

    /**
     * Switch to the currently active modal dialog for this particular driver instance.
     *
     * @return WebDriverAlert
     */
    public function alert();

    /**
     * Switches to the element that currently has focus within the document currently "switched to",
     * or the body element if this cannot be detected.
     *
     * @return WebDriverElement
     */
    public function activeElement();
}
