| Index: chrome/test/pyautolib/dom_mutation_observer.js
|
| ===================================================================
|
| --- chrome/test/pyautolib/dom_mutation_observer.js (revision 261231)
|
| +++ chrome/test/pyautolib/dom_mutation_observer.js (working copy)
|
| @@ -1,276 +0,0 @@
|
| -/* 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.
|
| - *
|
| - * Helper javascript injected whenever a DomMutationEventObserver is created.
|
| - *
|
| - * This script uses MutationObservers to watch for changes to the DOM, then
|
| - * reports the event to the observer using the DomAutomationController. An
|
| - * anonymous namespace is used to prevent conflict with other Javascript.
|
| - *
|
| - * Args:
|
| - * automation_id: Automation id used to route DomAutomationController messages.
|
| - * observer_id: Id of the observer who will be receiving the messages.
|
| - * observer_type: One of 'add', 'remove', 'change', or 'exists'.
|
| - * xpath: XPath used to specify the DOM node of interest.
|
| - * attribute: If |expected_value| is provided, check if this attribute of the
|
| - * DOM node matches |expected value|.
|
| - * expected_value: If not null, regular expression to match with the value of
|
| - * |attribute| after the mutation.
|
| - */
|
| -function(automation_id, observer_id, observer_type, xpath, attribute,
|
| - expected_value) {
|
| -
|
| - /* Raise an event for the DomMutationEventObserver. */
|
| - function raiseEvent() {
|
| - if (window.domAutomationController) {
|
| - console.log("Event sent to DomEventObserver with id=" +
|
| - observer_id + ".");
|
| - window.domAutomationController.sendWithId(
|
| - automation_id, "__dom_mutation_observer__:" + observer_id);
|
| - }
|
| - }
|
| -
|
| - /* Calls raiseEvent if the expected node has been added to the DOM.
|
| - *
|
| - * Args:
|
| - * mutations: A list of mutation objects.
|
| - * observer: The mutation observer object associated with this callback.
|
| - */
|
| - function addNodeCallback(mutations, observer) {
|
| - for (var j=0; j<mutations.length; j++) {
|
| - for (var i=0; i<mutations[j].addedNodes.length; i++) {
|
| - var node = mutations[j].addedNodes[i];
|
| - if (xpathMatchesNode(node, xpath) &&
|
| - nodeAttributeValueEquals(node, attribute, expected_value)) {
|
| - raiseEvent();
|
| - observer.disconnect();
|
| - delete observer;
|
| - return;
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - /* Calls raiseEvent if the expected node has been removed from the DOM.
|
| - *
|
| - * Args:
|
| - * mutations: A list of mutation objects.
|
| - * observer: The mutation observer object associated with this callback.
|
| - */
|
| - function removeNodeCallback(mutations, observer) {
|
| - var node = firstXPathNode(xpath);
|
| - if (!node) {
|
| - raiseEvent();
|
| - observer.disconnect();
|
| - delete observer;
|
| - }
|
| - }
|
| -
|
| - /* Calls raiseEvent if the given node has been changed to expected_value.
|
| - *
|
| - * Args:
|
| - * mutations: A list of mutation objects.
|
| - * observer: The mutation observer object associated with this callback.
|
| - */
|
| - function changeNodeCallback(mutations, observer) {
|
| - for (var j=0; j<mutations.length; j++) {
|
| - if (nodeAttributeValueEquals(mutations[j].target, attribute,
|
| - expected_value)) {
|
| - raiseEvent();
|
| - observer.disconnect();
|
| - delete observer;
|
| - return;
|
| - }
|
| - }
|
| - }
|
| -
|
| - /* Calls raiseEvent if the expected node exists in the DOM.
|
| - *
|
| - * Args:
|
| - * mutations: A list of mutation objects.
|
| - * observer: The mutation observer object associated with this callback.
|
| - */
|
| - function existsNodeCallback(mutations, observer) {
|
| - if (findNodeMatchingXPathAndValue(xpath, attribute, expected_value)) {
|
| - raiseEvent();
|
| - observer.disconnect();
|
| - delete observer;
|
| - return;
|
| - }
|
| - }
|
| -
|
| - /* Return true if the xpath matches the given node.
|
| - *
|
| - * Args:
|
| - * node: A node object from the DOM.
|
| - * xpath: An XPath used to compare with the DOM node.
|
| - */
|
| - function xpathMatchesNode(node, xpath) {
|
| - var con = document.evaluate(xpath, document, null,
|
| - XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null);
|
| - var thisNode = con.iterateNext();
|
| - while (thisNode) {
|
| - if (node == thisNode) {
|
| - return true;
|
| - }
|
| - thisNode = con.iterateNext();
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - /* Returns the first node in the DOM that matches the xpath.
|
| - *
|
| - * Args:
|
| - * xpath: XPath used to specify the DOM node of interest.
|
| - */
|
| - function firstXPathNode(xpath) {
|
| - return document.evaluate(xpath, document, null,
|
| - XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
|
| - }
|
| -
|
| - /* Returns the first node in the DOM that matches the xpath.
|
| - *
|
| - * Args:
|
| - * xpath: XPath used to specify the DOM node of interest.
|
| - * attribute: The attribute to match |expected_value| against.
|
| - * expected_value: A regular expression to match with the node's
|
| - * |attribute|. If null the match always succeeds.
|
| - */
|
| - function findNodeMatchingXPathAndValue(xpath, attribute, expected_value) {
|
| - var nodes = document.evaluate(xpath, document, null,
|
| - XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
|
| - var node;
|
| - while ( (node = nodes.iterateNext()) ) {
|
| - if (nodeAttributeValueEquals(node, attribute, expected_value))
|
| - return node;
|
| - }
|
| - return null;
|
| - }
|
| -
|
| - /* Returns true if the node's |attribute| value is matched by the regular
|
| - * expression |expected_value|, false otherwise.
|
| - *
|
| - * Args:
|
| - * node: A node object from the DOM.
|
| - * attribute: The attribute to match |expected_value| against.
|
| - * expected_value: A regular expression to match with the node's
|
| - * |attribute|. If null the test always passes.
|
| - */
|
| - function nodeAttributeValueEquals(node, attribute, expected_value) {
|
| - return expected_value == null ||
|
| - (node[attribute] && RegExp(expected_value, "").test(node[attribute]));
|
| - }
|
| -
|
| - /* Watch for a node matching xpath to be added to the DOM.
|
| - *
|
| - * Args:
|
| - * xpath: XPath used to specify the DOM node of interest.
|
| - */
|
| - function observeAdd(xpath) {
|
| - window.domAutomationController.send("success");
|
| - if (findNodeMatchingXPathAndValue(xpath, attribute, expected_value)) {
|
| - raiseEvent();
|
| - console.log("Matching node in DOM, assuming it was previously added.");
|
| - return;
|
| - }
|
| -
|
| - var obs = new MutationObserver(addNodeCallback);
|
| - obs.observe(document,
|
| - { childList: true,
|
| - attributes: true,
|
| - characterData: true,
|
| - subtree: true});
|
| - }
|
| -
|
| - /* Watch for a node matching xpath to be removed from the DOM.
|
| - *
|
| - * Args:
|
| - * xpath: XPath used to specify the DOM node of interest.
|
| - */
|
| - function observeRemove(xpath) {
|
| - window.domAutomationController.send("success");
|
| - if (!firstXPathNode(xpath)) {
|
| - raiseEvent();
|
| - console.log("No matching node in DOM, assuming it was already removed.");
|
| - return;
|
| - }
|
| -
|
| - var obs = new MutationObserver(removeNodeCallback);
|
| - obs.observe(document,
|
| - { childList: true,
|
| - attributes: true,
|
| - subtree: true});
|
| - }
|
| -
|
| - /* Watch for the textContent of a node matching xpath to change to
|
| - * expected_value.
|
| - *
|
| - * Args:
|
| - * xpath: XPath used to specify the DOM node of interest.
|
| - */
|
| - function observeChange(xpath) {
|
| - var node = firstXPathNode(xpath);
|
| - if (!node) {
|
| - console.log("No matching node in DOM.");
|
| - window.domAutomationController.send(
|
| - "No DOM node matching xpath exists.");
|
| - return;
|
| - }
|
| - window.domAutomationController.send("success");
|
| -
|
| - var obs = new MutationObserver(changeNodeCallback);
|
| - obs.observe(node,
|
| - { childList: true,
|
| - attributes: true,
|
| - characterData: true,
|
| - subtree: true});
|
| - }
|
| -
|
| - /* Watch for a node matching xpath to exist in the DOM.
|
| - *
|
| - * Args:
|
| - * xpath: XPath used to specify the DOM node of interest.
|
| - */
|
| - function observeExists(xpath) {
|
| - window.domAutomationController.send("success");
|
| - if (findNodeMatchingXPathAndValue(xpath, attribute, expected_value)) {
|
| - raiseEvent();
|
| - console.log("Node already exists in DOM.");
|
| - return;
|
| - }
|
| -
|
| - var obs = new MutationObserver(existsNodeCallback);
|
| - obs.observe(document,
|
| - { childList: true,
|
| - attributes: true,
|
| - characterData: true,
|
| - subtree: true});
|
| - }
|
| -
|
| - /* Interpret arguments and launch the requested observer function. */
|
| - function installMutationObserver() {
|
| - switch (observer_type) {
|
| - case "add":
|
| - observeAdd(xpath);
|
| - break;
|
| - case "remove":
|
| - observeRemove(xpath);
|
| - break;
|
| - case "change":
|
| - observeChange(xpath);
|
| - break;
|
| - case "exists":
|
| - observeExists(xpath);
|
| - break;
|
| - }
|
| - console.log("MutationObserver javscript injection completed.");
|
| - }
|
| -
|
| - /* Ensure the DOM is loaded before attempting to create MutationObservers. */
|
| - if (document.body) {
|
| - installMutationObserver();
|
| - } else {
|
| - window.addEventListener("DOMContentLoaded", installMutationObserver, true);
|
| - }
|
| -}
|
|
|