blob: e884252e83303b096fe839f46b37df96e45afa3a [file] [log] [blame] [edit]
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
/**
* @fileoverview Ready to inject atoms for manipulating the DOM.
*/
goog.provide('webdriver.atoms.inject.action');
goog.require('bot.action');
goog.require('bot.inject');
goog.require('goog.json');
goog.require('webdriver.atoms.element');
goog.require('webdriver.atoms.inject');
goog.require('webdriver.atoms.inputs');
/**
* Sends key events to simulating typing on an element.
*
* @param {bot.inject.JsonElement} element The element to submit.
* @param {!Array.<string>} keys The keys to type.
* @param {bot.inject.JsonWindow=} opt_window The optional window
* containing the element.
* @return {string} A stringified {@link bot.response.ResponseObject}.
*/
webdriver.atoms.inject.action.type = function(element, keys, opt_window) {
return webdriver.atoms.inject.action.executeActionFunction_(
webdriver.atoms.element.type, [element, keys], opt_window);
};
/**
* Submits the form containing the given element.
*
* @param {bot.inject.JsonElement} element The element to submit.
* @param {bot.inject.JsonWindow=} opt_window The optional window
* containing the element.
* @return {string} A stringified {@link bot.response.ResponseObject}.
* @deprecated Click on a submit button or type ENTER in a text box instead.
*/
webdriver.atoms.inject.action.submit = function(element, opt_window) {
return webdriver.atoms.inject.action.executeActionFunction_(bot.action.submit,
[element], opt_window);
};
/**
* Clear an element.
*
* @param {bot.inject.JsonElement} element The element to clear.
* @param {bot.inject.JsonWindow=} opt_window The optional window
* containing the element.
* @return {string} A stringified {@link bot.response.ResponseObject}.
* @see bot.action.clear
*/
webdriver.atoms.inject.action.clear = function(element, opt_window) {
return webdriver.atoms.inject.action.executeActionFunction_(bot.action.clear,
[element], opt_window);
};
/**
* Click an element.
*
* @param {bot.inject.JsonElement} element The element to click.
* @param {bot.inject.JsonWindow=} opt_window The optional window
* containing the element.
* @return {string} A stringified {@link bot.response.ResponseObject}.
* @see bot.action.click
*/
webdriver.atoms.inject.action.click = function (element, opt_window) {
return webdriver.atoms.inject.action.executeActionFunction_(bot.action.click,
[element], opt_window);
};
/**
* JSON representation of a {@link bot.Mouse.State} object.
* @typedef {{buttonPressed: ?bot.Mouse.Button,
* elementPressed: ?bot.inject.JsonElement,
* clientXY: {x: number, y: number},
* nextClickIsDoubleClick: boolean,
* hasEverInteracted: boolean,
* element: ?bot.inject.JsonElement}}
*/
webdriver.atoms.inject.action.JsonMouseState;
/**
* Clicks a mouse button.
*
* @param {bot.Mouse.Button} button The button to press.
* @param {webdriver.atoms.inject.action.JsonMouseState=} opt_mouseState The
* current state of the mouse.
* @param {bot.inject.JsonWindow=} opt_window The window context for
* the execution of the function.
* @return {string} A stringified {@link bot.response.ResponseObject}. The
* mouse's new state, as a
* {@link webdriver.atoms.inject.action.JsonMouseState} will be included
* as the response value.
*/
webdriver.atoms.inject.action.mouseClick = function(
button, opt_mouseState, opt_window) {
return webdriver.atoms.inject.action.executeActionFunction_(
webdriver.atoms.inputs.mouseClick,
[button, opt_mouseState], opt_window);
};
/**
* Types a sequence of key strokes on the active element.
* @param {!Array.<string>} keys The keys to type.
* @param {bot.Keyboard.State=} opt_keyboardState The keyboard's state.
* @param {bot.inject.JsonWindow=} opt_window The window context for
* the execution of the function.
* @return {string} A stringified {@link bot.response.ResponseObject}. The
* keyboard's new state, as a {@link bot.Keyboard.State} will be included
* as the response value.
*/
webdriver.atoms.inject.action.sendKeysToActiveElement = function(
keys, opt_keyboardState, opt_window) {
var persistModifiers = true;
return webdriver.atoms.inject.action.executeActionFunction_(
webdriver.atoms.inputs.sendKeys,
[null, keys, opt_keyboardState, persistModifiers], opt_window);
};
/**
* Moves the mouse to a specific element and/or coordinate location.
*
* @param {?bot.inject.JsonElement} element The element to move the mouse
* relative to, or `null` to use the mouse's current position.
* @param {?number} xOffset A horizontal offset, relative to the left edge of
* the given element, or the mouse's current position if no element is
* specified.
* @param {?number} yOffset A vertical offset, relative to the top edge of
* the given element, or the mouse's current position if no element
* is specified.
* @param {webdriver.atoms.inject.action.JsonMouseState=} opt_mouseState The
* current state of the mouse.
* @param {bot.inject.JsonWindow=} opt_window The window context for
* the execution of the function.
* @return {string} A stringified {@link bot.response.ResponseObject}. The
* mouse's new state, as a
* {@link webdriver.atoms.inject.action.JsonMouseState} will be included
* as the response value.
*/
webdriver.atoms.inject.action.mouseMove = function(
element, xOffset, yOffset, opt_mouseState, opt_window) {
return webdriver.atoms.inject.action.executeActionFunction_(
webdriver.atoms.inputs.mouseMove,
[element, xOffset, yOffset, opt_mouseState], opt_window);
};
/**
* Presses the primary mouse button at the current location.
*
* @param {webdriver.atoms.inject.action.JsonMouseState=} opt_mouseState The
* current state of the mouse.
* @param {bot.inject.JsonWindow=} opt_window The window context for
* the execution of the function.
* @return {string} A stringified {@link bot.response.ResponseObject}. The
* mouse's new state, as a
* {@link webdriver.atoms.inject.action.JsonMouseState} will be included
* as the response value.
*/
webdriver.atoms.inject.action.mouseButtonDown = function(opt_mouseState, opt_window) {
return webdriver.atoms.inject.action.executeActionFunction_(
webdriver.atoms.inputs.mouseButtonDown,
[opt_mouseState], opt_window);
};
/**
* Releases the primary mouse button at the current location.
*
* @param {webdriver.atoms.inject.action.JsonMouseState=} opt_mouseState The
* current state of the mouse.
* @param {bot.inject.JsonWindow=} opt_window The window context for
* the execution of the function.
* @return {string} A stringified {@link bot.response.ResponseObject}. The
* mouse's new state, as a
* {@link webdriver.atoms.inject.action.JsonMouseState} will be included
* as the response value.
*/
webdriver.atoms.inject.action.mouseButtonUp = function(opt_mouseState, opt_window) {
return webdriver.atoms.inject.action.executeActionFunction_(
webdriver.atoms.inputs.mouseButtonUp,
[opt_mouseState], opt_window);
};
/**
* Double-clicks the primary mouse button.
*
* @param {webdriver.atoms.inject.action.JsonMouseState=} opt_mouseState The
* current state of the mouse.
* @param {bot.inject.JsonWindow=} opt_window The window context for
* the execution of the function.
* @return {string} A stringified {@link bot.response.ResponseObject}. The
* mouse's new state, as a
* {@link webdriver.atoms.inject.action.JsonMouseState} will be included
* as the response value.
*/
webdriver.atoms.inject.action.doubleClick = function (
opt_mouseState, opt_window) {
return webdriver.atoms.inject.action.executeActionFunction_(
webdriver.atoms.inputs.doubleClick,
[opt_mouseState], opt_window);
};
/**
* @param {!Function} fn The function to call.
* @param {!Array.<*>} args An array of function arguments for the function.
* @param {bot.inject.JsonWindow=} opt_window The window context for
* the execution of the function.
* @return {string} The serialized JSON wire protocol result of the function.
* @private
*/
webdriver.atoms.inject.action.executeActionFunction_ = function (
fn, args, opt_window) {
var response;
try {
var targetWindow = webdriver.atoms.inject.getWindow(opt_window);
var unwrappedArgs = /** @type {Array} */(bot.inject.unwrapValue(
args, targetWindow.document));
var functionResult = fn.apply(null, unwrappedArgs);
response = bot.inject.wrapResponse(functionResult);
} catch (ex) {
response = bot.inject.wrapError(ex);
}
return goog.json.serialize(response);
};