Added:
/trunk/firefox/src/js/timer.js
Modified:
/trunk/firefox/build.desc
/trunk/firefox/src/extension/components/firefoxDriver.js
=======================================
--- /dev/null
+++ /trunk/firefox/src/js/timer.js Thu Sep 30 06:35:48 2010
@@ -0,0 +1,54 @@
+/*
+ Copyright 2010 WebDriver committers
+ Copyright 2010 Google Inc.
+
+ Licensed 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 An implementation of a timer that can be used without an
+ * assocuated window.
+ */
+
+
+var CC = Components.classes;
+var CI = Components.interfaces;
+
+
+
+
+/**
+ * @constructor
+ */
+function Timer() { /* Empty */ }
+
+
+/**
+ * Set a callback to be executed after a specified time out. The default
time
+ * out is 10ms.
+ *
+ * @param {!function(*=): *} callback The callback to use.
+ * @param {number=} opt_timeout An optional timeout to use.
+ */
+Timer.prototype.setTimeout = function(callback, opt_timeout) {
+ var timeout = opt_timeout || 10;
+ var timer = CC['@mozilla.org/timer;1'].createInstance(CI['nsITimer']);
+
+ timer.initWithCallback({
+ notify: function() {
+ callback.apply(null);
+ }
+ }, timeout, CI.nsITimer.TYPE_ONE_SHOT);
+};
+
+var EXPORTED_SYMBOLS = [ 'Timer' ];
=======================================
--- /trunk/firefox/build.desc Thu Sep 23 11:21:43 2010
+++ /trunk/firefox/build.desc Thu Sep 30 06:35:48 2010
@@ -47,6 +47,7 @@
{ ":libwebdriver_firefox_so64" : "platform/Linux_x86_64-gcc3/components/libwebdriver-firefox.so"
},
{ ":atoms" : "resource/modules/atoms.js" },
{ "src/js/errorcode.js" : "resource/modules/errorcode.js" },
+ { "src/js/timer.js" : "resource/modules/timer.js" },
{ "src/js/utils.js" : "resource/modules/utils.js" },
{ "src/js/evaluate.js" : "resource/evaluate.js" },
{ "//third_party/js/sizzle" : "resource/sizzle.js" }
=======================================
--- /trunk/firefox/src/extension/components/firefoxDriver.js Thu Sep 30
06:00:09 2010
+++ /trunk/firefox/src/extension/components/firefoxDriver.js Thu Sep 30
06:35:48 2010
@@ -29,6 +29,7 @@
//
https://groups.google.com/group/mozilla.dev.apps.firefox/browse_thread/thread/e178d41afa2ccc87?hl=en&pli=1#
var resources = [
"atoms.js",
+ "timer.js",
"utils.js"
];
@@ -172,39 +173,45 @@
}
// Attach the listener to the DOM
- if (!doc.getUserData('webdriver-evaluate-attached')) {
- var element = doc.createElement("script");
- element.setAttribute("type", "text/javascript");
- element.innerHTML = FirefoxDriver.listenerScript;
- doc.body.appendChild(element);
- element.parentNode.removeChild(element);
- }
-
- doc.setUserData('webdriver-evaluate-args', converted, null);
-
- var script =
- 'var args = document.getUserData("webdriver-evaluate-args"); ' +
- '(function() { ' + rawScript + '}).apply(null, args);';
- doc.setUserData('webdriver-evaluate-script', script, null);
-
- var handler = function(event) {
- doc.removeEventListener('webdriver-evaluate-response', handler, true);
-
- var unwrapped = doc.wrappedJSObject ? doc.wrappedJSObject : doc;
- var result = unwrapped.getUserData('webdriver-evaluate-result');
- respond.value = Utils.wrapResult(result, doc);
- respond.status = doc.getUserData('webdriver-evaluate-code');
-
- doc.setUserData('webdriver-evaluate-result', null, null);
- doc.setUserData('webdriver-evaluate-code', null, null);
-
- respond.send();
+ var addListener = function() {
+ if (!doc.getUserData('webdriver-evaluate-attached')) {
+ var element = doc.createElement("script");
+ element.setAttribute("type", "text/javascript");
+ element.innerHTML = FirefoxDriver.listenerScript;
+ doc.body.appendChild(element);
+ element.parentNode.removeChild(element);
+ }
+ };
+
+ var runScript = function() {
+ doc.setUserData('webdriver-evaluate-args', converted, null);
+
+ var script =
+ 'var args = document.getUserData("webdriver-evaluate-args"); ' +
+ '(function() { ' + rawScript + '}).apply(null, args);';
+ doc.setUserData('webdriver-evaluate-script', script, null);
+
+ var handler = function(event) {
+ doc.removeEventListener('webdriver-evaluate-response', handler,
true);
+
+ var unwrapped = doc.wrappedJSObject ? doc.wrappedJSObject : doc;
+ var result = unwrapped.getUserData('webdriver-evaluate-result');
+ respond.value = Utils.wrapResult(result, doc);
+ respond.status = doc.getUserData('webdriver-evaluate-code');
+
+ doc.setUserData('webdriver-evaluate-result', null, null);
+ doc.setUserData('webdriver-evaluate-code', null, null);
+
+ respond.send();
+ };
+ doc.addEventListener('webdriver-evaluate-response', handler, true);
+
+ var event = doc.createEvent('Events');
+ event.initEvent('webdriver-evaluate', true, false);
+ doc.dispatchEvent(event);
};
- doc.addEventListener('webdriver-evaluate-response', handler, true);
-
- var event = doc.createEvent('Events');
- event.initEvent('webdriver-evaluate', true, false);
- doc.dispatchEvent(event);
+
+ // Wait until "doc.body" is present, or we've waited too long.
};
@@ -418,15 +425,10 @@
selector: selector
})));
} else {
- var self = this;
- var timer = Components.classes['@mozilla.org/timer;1'].
- createInstance(Components.interfaces.nsITimer);
- timer.initWithCallback({
- notify: function() {
- self.findElementInternal_(respond, method, selector,
+ var callback = goog.bind(this.findElementInternal_, this, respond,
method, selector,
opt_parentElementId, startTime);
- }
- }, 10, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
+
+ new Timer().setTimeout(callback, 10);
}
}
};