Javascript  |  110行  |  3.06 KB

// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview JS utilities automatically injected by GTalk PyAuto tests.
 */

/**
 * Key codes to use with KeyboardEvent.
 */
$KEYS = {
  ENTER: 13,
  ESC: 27
};

/**
 * The first Chrome extension view with a URL containing the query.
 */
$VIEW = function(query) {
  var views = chrome.extension.getViews();
  for (var i = 0; i < views.length; i++) {
    var url = views[i].location.href;
    if (url && url.indexOf(query) >= 0) {
      return views[i];
    }
  }
  return null;
};

/**
 * The body element of the given window.
 */
$BODY = function(opt_window) {
  return (opt_window || window).document.body;
};

/**
 * Find the ancestor of the given element with a particular tag name.
 */
$FindByTagName = function(element, tag, index) {
  var tagElements = element.getElementsByTagName(tag);
  if (index < tagElements.length) {
    return tagElements[index];
  }
  return null;
};

/**
 * Find the first ancestor of the given element containing the given text.
 */
$FindByText = function(baseElement, text) {
  var allElements = baseElement.getElementsByTagName('*');
  for (var i = 0; i < allElements.length; i++) {
    var element = allElements[i];
    if (element.innerText && element.innerText.indexOf(text) >= 0) {
      var child = $FindByText(element, text);
      return child != null ? child : element;
    }
  }
  return null;
};

/**
 * Simulate a click on a given element.
 */
$Click = function(element) {
  var mouseEvent = element.ownerDocument.createEvent('MouseEvent');
  mouseEvent.initMouseEvent('click', true, true, window,
      1, 0, 0, 0, 0, false, false, false, false, 0, null);
  element.dispatchEvent(mouseEvent);
  return true;
};

/**
 * Simulate typing text on a given element.
 */
$Type = function(element, text) {
  var keyEvent = element.ownerDocument.createEvent('TextEvent');
  keyEvent.initTextEvent('textInput', true, true, window, text);
  element.dispatchEvent(keyEvent);
  return true;
};

/**
 * Simulate pressing a certain key on a given element.
 */
$Press = function(baseElement, keycode, opt_ctrlKey, opt_shiftKey,
    opt_altKey, opt_metaKey) {
  var sendKeyEvent = function(element, eventType) {
    // Unfortuantely, using the typical KeyboardEvent and initKeyboardEvent
    // fails in Chrome due to a webkit bug:
    // https://bugs.webkit.org/show_bug.cgi?id=16735
    // We employ a workaround of synthesizing a raw 'Event' suggested here:
    // http://code.google.com/p/selenium/issues/detail?id=567
    var keyEvent = element.ownerDocument.createEvent('Events');
    keyEvent.ctrlKey = Boolean(opt_ctrlKey);
    keyEvent.shiftKey = Boolean(opt_shiftKey);
    keyEvent.altKey = Boolean(opt_altKey);
    keyEvent.metaKey = Boolean(opt_metaKey);
    keyEvent.initEvent(eventType, true, true);
    keyEvent.keyCode = keycode;
    element.dispatchEvent(keyEvent);
  }
  sendKeyEvent(baseElement, 'keydown');
  sendKeyEvent(baseElement, 'keypress');
  sendKeyEvent(baseElement, 'keyup');
  return true;
};