blob: af6515690af4596caeff49588b524c14926d3ead [file] [log] [blame]
/*
* 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.
*/
#pragma once
#include "Actions.h"
#include "Capabilities.h"
#include <wtf/Forward.h>
#include <wtf/Function.h>
#include <wtf/HashSet.h>
#include <wtf/JSONValues.h>
#include <wtf/OptionSet.h>
#include <wtf/RefCounted.h>
#include <wtf/text/WTFString.h>
namespace WebDriver {
class CommandResult;
class SessionHost;
class Session : public RefCounted<Session> {
public:
static Ref<Session> create(std::unique_ptr<SessionHost>&& host)
{
return adoptRef(*new Session(WTFMove(host)));
}
~Session();
const String& id() const;
const Capabilities& capabilities() const;
bool isConnected() const;
double scriptTimeout() const { return m_scriptTimeout; }
double pageLoadTimeout() const { return m_pageLoadTimeout; }
double implicitWaitTimeout() const { return m_implicitWaitTimeout; }
static const String& webElementIdentifier();
enum class FindElementsMode { Single, Multiple };
enum class ExecuteScriptMode { Sync, Async };
struct Cookie {
String name;
String value;
std::optional<String> path;
std::optional<String> domain;
std::optional<bool> secure;
std::optional<bool> httpOnly;
std::optional<uint64_t> expiry;
std::optional<String> sameSite;
};
InputSource& getOrCreateInputSource(const String& id, InputSource::Type, std::optional<PointerType>);
void waitForNavigationToComplete(Function<void (CommandResult&&)>&&);
void createTopLevelBrowsingContext(Function<void (CommandResult&&)>&&);
void close(Function<void (CommandResult&&)>&&);
void getTimeouts(Function<void (CommandResult&&)>&&);
void setTimeouts(const Timeouts&, Function<void (CommandResult&&)>&&);
void go(const String& url, Function<void (CommandResult&&)>&&);
void getCurrentURL(Function<void (CommandResult&&)>&&);
void back(Function<void (CommandResult&&)>&&);
void forward(Function<void (CommandResult&&)>&&);
void refresh(Function<void (CommandResult&&)>&&);
void getTitle(Function<void (CommandResult&&)>&&);
void getWindowHandle(Function<void (CommandResult&&)>&&);
void closeWindow(Function<void (CommandResult&&)>&&);
void switchToWindow(const String& windowHandle, Function<void (CommandResult&&)>&&);
void getWindowHandles(Function<void (CommandResult&&)>&&);
void newWindow(std::optional<String> typeHint, Function<void (CommandResult&&)>&&);
void switchToFrame(RefPtr<JSON::Value>&&, Function<void (CommandResult&&)>&&);
void switchToParentFrame(Function<void (CommandResult&&)>&&);
void getWindowRect(Function<void (CommandResult&&)>&&);
void setWindowRect(std::optional<double> x, std::optional<double> y, std::optional<double> width, std::optional<double> height, Function<void (CommandResult&&)>&&);
void maximizeWindow(Function<void (CommandResult&&)>&&);
void minimizeWindow(Function<void (CommandResult&&)>&&);
void fullscreenWindow(Function<void (CommandResult&&)>&&);
void findElements(const String& strategy, const String& selector, FindElementsMode, const String& rootElementID, Function<void (CommandResult&&)>&&);
void getActiveElement(Function<void (CommandResult&&)>&&);
void isElementSelected(const String& elementID, Function<void (CommandResult&&)>&&);
void getElementAttribute(const String& elementID, const String& attribute, Function<void (CommandResult&&)>&&);
void getElementProperty(const String& elementID, const String& attribute, Function<void (CommandResult&&)>&&);
void getElementCSSValue(const String& elementID, const String& cssProperty, Function<void (CommandResult&&)>&&);
void getElementText(const String& elementID, Function<void (CommandResult&&)>&&);
void getElementTagName(const String& elementID, Function<void (CommandResult&&)>&&);
void getElementRect(const String& elementID, Function<void (CommandResult&&)>&&);
void isElementEnabled(const String& elementID, Function<void (CommandResult&&)>&&);
void isElementDisplayed(const String& elementID, Function<void (CommandResult&&)>&&);
void elementClick(const String& elementID, Function<void (CommandResult&&)>&&);
void elementClear(const String& elementID, Function<void (CommandResult&&)>&&);
void elementSendKeys(const String& elementID, const String& text, Function<void (CommandResult&&)>&&);
void getPageSource(Function<void (CommandResult&&)>&&);
void executeScript(const String& script, RefPtr<JSON::Array>&& arguments, ExecuteScriptMode, Function<void (CommandResult&&)>&&);
void getAllCookies(Function<void (CommandResult&&)>&&);
void getNamedCookie(const String& name, Function<void (CommandResult&&)>&&);
void addCookie(const Cookie&, Function<void (CommandResult&&)>&&);
void deleteCookie(const String& name, Function<void (CommandResult&&)>&&);
void deleteAllCookies(Function<void (CommandResult&&)>&&);
void performActions(Vector<Vector<Action>>&&, Function<void (CommandResult&&)>&&);
void releaseActions(Function<void (CommandResult&&)>&&);
void dismissAlert(Function<void (CommandResult&&)>&&);
void acceptAlert(Function<void (CommandResult&&)>&&);
void getAlertText(Function<void (CommandResult&&)>&&);
void sendAlertText(const String&, Function<void (CommandResult&&)>&&);
void takeScreenshot(std::optional<String> elementID, std::optional<bool> scrollIntoView, Function<void (CommandResult&&)>&&);
private:
Session(std::unique_ptr<SessionHost>&&);
void switchToTopLevelBrowsingContext(const String&);
void switchToBrowsingContext(const String&, Function<void(CommandResult&&)>&&);
void switchToBrowsingContext(const String& toplevelBrowsingContext, const String& browsingContext, Function<void(CommandResult&&)>&&);
void closeTopLevelBrowsingContext(const String& toplevelBrowsingContext, Function<void (CommandResult&&)>&&);
void closeAllToplevelBrowsingContexts(const String& toplevelBrowsingContext, Function<void (CommandResult&&)>&&);
void getToplevelBrowsingContextRect(Function<void (CommandResult&&)>&&);
std::optional<String> pageLoadStrategyString() const;
void handleUserPrompts(Function<void (CommandResult&&)>&&);
void handleUnexpectedAlertOpen(Function<void (CommandResult&&)>&&);
void dismissAndNotifyAlert(Function<void (CommandResult&&)>&&);
void acceptAndNotifyAlert(Function<void (CommandResult&&)>&&);
void reportUnexpectedAlertOpen(Function<void (CommandResult&&)>&&);
RefPtr<JSON::Object> createElement(RefPtr<JSON::Value>&&);
Ref<JSON::Object> createElement(const String& elementID);
RefPtr<JSON::Object> extractElement(JSON::Value&);
String extractElementID(JSON::Value&);
Ref<JSON::Value> handleScriptResult(Ref<JSON::Value>&&);
void elementIsEditable(const String& elementID, Function<void (CommandResult&&)>&&);
struct Point {
int x { 0 };
int y { 0 };
};
struct Size {
int width { 0 };
int height { 0 };
};
struct Rect {
Point origin;
Size size;
};
enum class ElementLayoutOption {
ScrollIntoViewIfNeeded = 1 << 0,
UseViewportCoordinates = 1 << 1,
};
void computeElementLayout(const String& elementID, OptionSet<ElementLayoutOption>, Function<void (std::optional<Rect>&&, std::optional<Point>&&, bool, RefPtr<JSON::Object>&&)>&&);
void elementIsFileUpload(const String& elementID, Function<void (CommandResult&&)>&&);
enum class FileUploadType { Single, Multiple };
std::optional<FileUploadType> parseElementIsFileUploadResult(const RefPtr<JSON::Value>&);
void selectOptionElement(const String& elementID, Function<void (CommandResult&&)>&&);
void setInputFileUploadFiles(const String& elementID, const String& text, bool multiple, Function<void (CommandResult&&)>&&);
void didSetInputFileUploadFiles(bool wasCancelled);
enum class MouseInteraction { Move, Down, Up, SingleClick, DoubleClick };
void performMouseInteraction(int x, int y, MouseButton, MouseInteraction, Function<void (CommandResult&&)>&&);
enum class KeyboardInteractionType { KeyPress, KeyRelease, InsertByKey };
struct KeyboardInteraction {
KeyboardInteractionType type { KeyboardInteractionType::InsertByKey };
std::optional<String> text;
std::optional<String> key;
};
enum KeyModifier {
None = 0,
Shift = 1 << 0,
Control = 1 << 1,
Alternate = 1 << 2,
Meta = 1 << 3,
};
String virtualKeyForKey(UChar, KeyModifier&);
void performKeyboardInteractions(Vector<KeyboardInteraction>&&, Function<void (CommandResult&&)>&&);
struct InputSourceState {
enum class Type { Null, Key, Pointer };
Type type;
String subtype;
std::optional<MouseButton> pressedButton;
std::optional<String> pressedKey;
HashSet<String> pressedVirtualKeys;
};
InputSourceState& inputSourceState(const String& id);
std::unique_ptr<SessionHost> m_host;
double m_scriptTimeout;
double m_pageLoadTimeout;
double m_implicitWaitTimeout;
std::optional<String> m_toplevelBrowsingContext;
std::optional<String> m_currentBrowsingContext;
std::optional<String> m_currentParentBrowsingContext;
HashMap<String, InputSource> m_activeInputSources;
HashMap<String, InputSourceState> m_inputStateTable;
};
} // WebDriver