mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Merge m-c to inbound. a=merge
This commit is contained in:
commit
f2018cb6a9
@ -430,6 +430,9 @@ let settingsToObserve = {
|
||||
'layers.dump': false,
|
||||
'layers.enable-tiles': true,
|
||||
'layers.simple-tiles': false,
|
||||
'layers.effect.invert': false,
|
||||
'layers.effect.grayscale': false,
|
||||
'layers.effect.contrast': "0.0",
|
||||
'privacy.donottrackheader.enabled': false,
|
||||
'ril.radio.disabled': false,
|
||||
'ril.mms.requestReadReport.enabled': {
|
||||
|
@ -15,7 +15,7 @@
|
||||
<project name="platform_build" path="build" remote="b2g" revision="53a59364ce4f14068034c8d6fe01f4f6b9f78f23">
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="39cad6c82122b964f12a66771bfbcc14fb342d9e"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="007f3c50cf69f044628a23c2376c6d88aa45f617"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3bb61a27cd2941b2ba9b616a11aaa44269210396"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
|
||||
@ -133,11 +133,11 @@
|
||||
<project name="platform/hardware/akm" path="hardware/akm" revision="6d3be412647b0eab0adff8a2768736cf4eb68039"/>
|
||||
<project groups="invensense" name="platform/hardware/invensense" path="hardware/invensense" revision="e6d9ab28b4f4e7684f6c07874ee819c9ea0002a2"/>
|
||||
<project name="platform/hardware/ril" path="hardware/ril" revision="865ce3b4a2ba0b3a31421ca671f4d6c5595f8690"/>
|
||||
<project name="kernel/common" path="kernel" revision="f3a717dd8dbb08e558c807c5ede071d83d454207"/>
|
||||
<project name="platform/system/core" path="system/core" revision="b5de04ae22343b6bdaa3455aee291bdf9a872738"/>
|
||||
<project name="kernel/common" path="kernel" revision="35bdd9bda8250f80923eb7ad62365d3a251110a0"/>
|
||||
<project name="platform/system/core" path="system/core" revision="53d584d4a4b4316e4de9ee5f210d662f89b44e7e"/>
|
||||
<project name="u-boot" path="u-boot" revision="d18f67c122a69f5ff7596a604cf484de5e824f9b"/>
|
||||
<project name="vendor/sprd/gps" path="vendor/sprd/gps" revision="7feb3df0e150053e0143ef525f6e082bda320aea"/>
|
||||
<project name="vendor/sprd/open-source" path="vendor/sprd/open-source" revision="8010ea42ca4963d610c88279dbe35dbaa2f6daf6"/>
|
||||
<project name="vendor/sprd/open-source" path="vendor/sprd/open-source" revision="f01aa91b3ec0f1a57206bdbfacb00e71e172f581"/>
|
||||
<project name="vendor/sprd/partner" path="vendor/sprd/partner" revision="8649c7145972251af11b0639997edfecabfc7c2e"/>
|
||||
<project name="vendor/sprd/proprietories" path="vendor/sprd/proprietories" revision="d994b716d979a5b57b11a61cc05d31fe7ca61d38"/>
|
||||
</manifest>
|
||||
|
@ -19,7 +19,7 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="39cad6c82122b964f12a66771bfbcc14fb342d9e"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="007f3c50cf69f044628a23c2376c6d88aa45f617"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3bb61a27cd2941b2ba9b616a11aaa44269210396"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="cd88d860656c31c7da7bb310d6a160d0011b0961"/>
|
||||
|
@ -17,7 +17,7 @@
|
||||
</project>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="39cad6c82122b964f12a66771bfbcc14fb342d9e"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="007f3c50cf69f044628a23c2376c6d88aa45f617"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3bb61a27cd2941b2ba9b616a11aaa44269210396"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="320650844ec7cba40a70317b761b88b47a8dca0e"/>
|
||||
|
@ -15,7 +15,7 @@
|
||||
<project name="platform_build" path="build" remote="b2g" revision="53a59364ce4f14068034c8d6fe01f4f6b9f78f23">
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="39cad6c82122b964f12a66771bfbcc14fb342d9e"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="007f3c50cf69f044628a23c2376c6d88aa45f617"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3bb61a27cd2941b2ba9b616a11aaa44269210396"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
|
||||
|
@ -19,7 +19,7 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="39cad6c82122b964f12a66771bfbcc14fb342d9e"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="007f3c50cf69f044628a23c2376c6d88aa45f617"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3bb61a27cd2941b2ba9b616a11aaa44269210396"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="cd88d860656c31c7da7bb310d6a160d0011b0961"/>
|
||||
|
@ -17,7 +17,7 @@
|
||||
</project>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="39cad6c82122b964f12a66771bfbcc14fb342d9e"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="007f3c50cf69f044628a23c2376c6d88aa45f617"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3bb61a27cd2941b2ba9b616a11aaa44269210396"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="320650844ec7cba40a70317b761b88b47a8dca0e"/>
|
||||
|
@ -4,6 +4,6 @@
|
||||
"remote": "",
|
||||
"branch": ""
|
||||
},
|
||||
"revision": "6fa1c6e992e9d7169e8e6cd8c714d1983087a87c",
|
||||
"revision": "4a07bce4cd6b25d48a1fcce3a2f96492c0e2f2d3",
|
||||
"repo_path": "/integration/gaia-central"
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="39cad6c82122b964f12a66771bfbcc14fb342d9e"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="007f3c50cf69f044628a23c2376c6d88aa45f617"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3bb61a27cd2941b2ba9b616a11aaa44269210396"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
|
||||
|
@ -15,7 +15,7 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="39cad6c82122b964f12a66771bfbcc14fb342d9e"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="007f3c50cf69f044628a23c2376c6d88aa45f617"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3bb61a27cd2941b2ba9b616a11aaa44269210396"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
|
||||
|
@ -17,7 +17,7 @@
|
||||
</project>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="39cad6c82122b964f12a66771bfbcc14fb342d9e"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="007f3c50cf69f044628a23c2376c6d88aa45f617"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3bb61a27cd2941b2ba9b616a11aaa44269210396"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="320650844ec7cba40a70317b761b88b47a8dca0e"/>
|
||||
|
@ -17,7 +17,7 @@
|
||||
<copyfile dest="Makefile" src="core/root.mk"/>
|
||||
</project>
|
||||
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="39cad6c82122b964f12a66771bfbcc14fb342d9e"/>
|
||||
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="007f3c50cf69f044628a23c2376c6d88aa45f617"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="3bb61a27cd2941b2ba9b616a11aaa44269210396"/>
|
||||
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
|
||||
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
|
||||
|
@ -563,6 +563,8 @@
|
||||
@BINPATH@/components/SystemMessageInternal.js
|
||||
@BINPATH@/components/SystemMessageManager.js
|
||||
@BINPATH@/components/SystemMessageManager.manifest
|
||||
@BINPATH@/components/HCIEventTransactionSystemMessage.manifest
|
||||
@BINPATH@/components/HCIEventTransactionSystemMessageConfigurator.js
|
||||
|
||||
@BINPATH@/components/Activities.manifest
|
||||
@BINPATH@/components/ActivityProxy.js
|
||||
|
@ -889,7 +889,13 @@ FeedWriter.prototype = {
|
||||
switch (handler) {
|
||||
case "web": {
|
||||
if (this._handlersMenuList) {
|
||||
var url = prefs.getComplexValue(getPrefWebForType(feedType), Ci.nsISupportsString).data;
|
||||
var url;
|
||||
try {
|
||||
url = prefs.getComplexValue(getPrefWebForType(feedType), Ci.nsISupportsString).data;
|
||||
} catch (ex) {
|
||||
LOG("FeedWriter._setSelectedHandler: invalid or no handler in prefs");
|
||||
return;
|
||||
}
|
||||
var handlers =
|
||||
this._handlersMenuList.getElementsByAttribute("webhandlerurl", url);
|
||||
if (handlers.length == 0) {
|
||||
@ -1039,6 +1045,10 @@ FeedWriter.prototype = {
|
||||
var handlers = wccr.getContentHandlers(this._getMimeTypeForFeedType(feedType));
|
||||
if (handlers.length != 0) {
|
||||
for (var i = 0; i < handlers.length; ++i) {
|
||||
if (!handlers[i].uri) {
|
||||
LOG("Handler with name " + handlers[i].name + " has no URI!? Skipping...");
|
||||
continue;
|
||||
}
|
||||
menuItem = liveBookmarksMenuItem.cloneNode(false);
|
||||
menuItem.removeAttribute("selected");
|
||||
menuItem.className = "menuitem-iconic";
|
||||
|
@ -29,6 +29,7 @@ const MAX_ORDINAL = 99;
|
||||
this.DevTools = function DevTools() {
|
||||
this._tools = new Map(); // Map<toolId, tool>
|
||||
this._themes = new Map(); // Map<themeId, theme>
|
||||
this._eventParsers = new Map(); // Map<parserID, [handlers]>
|
||||
this._toolboxes = new Map(); // Map<target, toolbox>
|
||||
|
||||
// destroy() is an observer's handler so we need to preserve context.
|
||||
@ -65,6 +66,10 @@ DevTools.prototype = {
|
||||
}
|
||||
},
|
||||
|
||||
get eventParsers() {
|
||||
return this._eventParsers;
|
||||
},
|
||||
|
||||
/**
|
||||
* Register a new developer tool.
|
||||
*
|
||||
@ -140,6 +145,85 @@ DevTools.prototype = {
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Register a new event parser to be used in the processing of event info.
|
||||
*
|
||||
* @param {Object} parserObj
|
||||
* Each parser must contain the following properties:
|
||||
* - parser, which must take the following form:
|
||||
* {
|
||||
* id {String}: "jQuery events", // Unique id.
|
||||
* getListeners: function(node) { }, // Function that takes a node and
|
||||
* // returns an array of eventInfo
|
||||
* // objects (see below).
|
||||
*
|
||||
* hasListeners: function(node) { }, // Optional function that takes a
|
||||
* // node and returns a boolean
|
||||
* // indicating whether a node has
|
||||
* // listeners attached.
|
||||
*
|
||||
* normalizeHandler: function(fnDO) { }, // Optional function that takes a
|
||||
* // Debugger.Object instance and
|
||||
* // climbs the scope chain to get
|
||||
* // the function that should be
|
||||
* // displayed in the event bubble
|
||||
* // see the following url for
|
||||
* // details:
|
||||
* // https://developer.mozilla.org/
|
||||
* // docs/Tools/Debugger-API/
|
||||
* // Debugger.Object
|
||||
* }
|
||||
*
|
||||
* An eventInfo object should take the following form:
|
||||
* {
|
||||
* type {String}: "click",
|
||||
* handler {Function}: event handler,
|
||||
* tags {String}: "jQuery,Live", // These tags will be displayed as
|
||||
* // attributes in the events popup.
|
||||
* hide: { // Hide or show fields:
|
||||
* debugger: false, // Debugger icon
|
||||
* type: false, // Event type e.g. click
|
||||
* filename: false, // Filename
|
||||
* capturing: false, // Capturing
|
||||
* dom0: false // DOM 0
|
||||
* },
|
||||
*
|
||||
* override: { // The following can be overridden:
|
||||
* type: "click",
|
||||
* origin: "http://www.mozilla.com",
|
||||
* searchString: 'onclick="doSomething()"',
|
||||
* DOM0: true,
|
||||
* capturing: true
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
registerEventParser: function(parserObj) {
|
||||
let parserId = parserObj.id;
|
||||
|
||||
if (!parserId) {
|
||||
throw new Error("Cannot register new event parser with id " + parserId);
|
||||
}
|
||||
if (this._eventParsers.has(parserId)) {
|
||||
throw new Error("Duplicate event parser id " + parserId);
|
||||
}
|
||||
|
||||
this._eventParsers.set(parserId, {
|
||||
getListeners: parserObj.getListeners,
|
||||
hasListeners: parserObj.hasListeners,
|
||||
normalizeHandler: parserObj.normalizeHandler
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Removes parser that matches a given parserId.
|
||||
*
|
||||
* @param {String} parserId
|
||||
* id of the event parser to unregister.
|
||||
*/
|
||||
unregisterEventParser: function(parserId) {
|
||||
this._eventParsers.delete(parserId);
|
||||
},
|
||||
|
||||
/**
|
||||
* Sorting function used for sorting tools based on their ordinals.
|
||||
*/
|
||||
@ -471,6 +555,10 @@ DevTools.prototype = {
|
||||
this.unregisterTool(key, true);
|
||||
}
|
||||
|
||||
for (let [id] of this._eventParsers) {
|
||||
this.unregisterEventParser(id, true);
|
||||
}
|
||||
|
||||
// Cleaning down the toolboxes: i.e.
|
||||
// for (let [target, toolbox] of this._toolboxes) toolbox.destroy();
|
||||
// Is taken care of by the gDevToolsBrowser.forgetBrowserWindow
|
||||
|
@ -21,6 +21,8 @@ loader.lazyGetter(this, "osString", () => Cc["@mozilla.org/xre/app-info;1"].getS
|
||||
|
||||
let events = require("sdk/system/events");
|
||||
|
||||
require("devtools/toolkit/event-parsers");
|
||||
|
||||
// Panels
|
||||
loader.lazyGetter(this, "OptionsPanel", () => require("devtools/framework/toolbox-options").OptionsPanel);
|
||||
loader.lazyGetter(this, "InspectorPanel", () => require("devtools/inspector/inspector-panel").InspectorPanel);
|
||||
|
@ -3,6 +3,7 @@ subsuite = devtools
|
||||
support-files =
|
||||
doc_markup_edit.html
|
||||
doc_markup_events.html
|
||||
doc_markup_events_jquery.html
|
||||
doc_markup_events-overflow.html
|
||||
doc_markup_flashing.html
|
||||
doc_markup_mutation.html
|
||||
@ -15,7 +16,17 @@ support-files =
|
||||
doc_markup_tooltip.png
|
||||
head.js
|
||||
helper_attributes_test_runner.js
|
||||
helper_events_test_runner.js
|
||||
helper_outerhtml_test_runner.js
|
||||
lib_jquery_1.0.js
|
||||
lib_jquery_1.1.js
|
||||
lib_jquery_1.2_min.js
|
||||
lib_jquery_1.3_min.js
|
||||
lib_jquery_1.4_min.js
|
||||
lib_jquery_1.6_min.js
|
||||
lib_jquery_1.7_min.js
|
||||
lib_jquery_1.11.1_min.js
|
||||
lib_jquery_2.1.1_min.js
|
||||
|
||||
[browser_markupview_copy_image_data.js]
|
||||
[browser_markupview_css_completion_style_attribute.js]
|
||||
@ -29,6 +40,24 @@ skip-if = e10s # Bug 985597 - The XUL-based highlighter isn't e10s compatible
|
||||
skip-if = e10s # Bug 985597 - The XUL-based highlighter isn't e10s compatible
|
||||
[browser_markupview_highlight_hover_03.js]
|
||||
skip-if = e10s # Bug 985597 - The XUL-based highlighter isn't e10s compatible
|
||||
[browser_markupview_events_jquery_1.0.js]
|
||||
skip-if = e10s # Bug 1040751 - CodeMirror editor.destroy() isn't e10s compatible
|
||||
[browser_markupview_events_jquery_1.1.js]
|
||||
skip-if = e10s # Bug 1040751 - CodeMirror editor.destroy() isn't e10s compatible
|
||||
[browser_markupview_events_jquery_1.2.js]
|
||||
skip-if = e10s # Bug 1040751 - CodeMirror editor.destroy() isn't e10s compatible
|
||||
[browser_markupview_events_jquery_1.3.js]
|
||||
skip-if = e10s # Bug 1040751 - CodeMirror editor.destroy() isn't e10s compatible
|
||||
[browser_markupview_events_jquery_1.4.js]
|
||||
skip-if = e10s # Bug 1040751 - CodeMirror editor.destroy() isn't e10s compatible
|
||||
[browser_markupview_events_jquery_1.6.js]
|
||||
skip-if = e10s # Bug 1040751 - CodeMirror editor.destroy() isn't e10s compatible
|
||||
[browser_markupview_events_jquery_1.7.js]
|
||||
skip-if = e10s # Bug 1040751 - CodeMirror editor.destroy() isn't e10s compatible
|
||||
[browser_markupview_events_jquery_1.11.1.js]
|
||||
skip-if = e10s # Bug 1040751 - CodeMirror editor.destroy() isn't e10s compatible
|
||||
[browser_markupview_events_jquery_2.1.1.js]
|
||||
skip-if = e10s # Bug 1040751 - CodeMirror editor.destroy() isn't e10s compatible
|
||||
[browser_markupview_html_edit_01.js]
|
||||
[browser_markupview_html_edit_02.js]
|
||||
[browser_markupview_html_edit_03.js]
|
||||
|
@ -67,16 +67,19 @@ let test = asyncTest(function*() {
|
||||
|
||||
info("Event handler expanded.");
|
||||
|
||||
// Wait for any scrolling to finish.
|
||||
yield promiseNextTick();
|
||||
|
||||
if (data.alignTop) {
|
||||
let headerRect = header.getBoundingClientRect();
|
||||
|
||||
is(headerRect.top, containerRect.top,
|
||||
is(Math.round(headerRect.top), Math.round(containerRect.top),
|
||||
"Clicked header is aligned with the container top.");
|
||||
|
||||
} else if (data.alignBottom) {
|
||||
let editorRect = header.nextElementSibling.getBoundingClientRect();
|
||||
|
||||
is(editorRect.bottom, containerRect.bottom,
|
||||
is(Math.round(editorRect.bottom), Math.round(containerRect.bottom),
|
||||
"Clicked event handler code is aligned with the container bottom.");
|
||||
|
||||
} else {
|
||||
|
@ -4,183 +4,154 @@
|
||||
|
||||
"use strict";
|
||||
|
||||
// Test that markup view event bubbles show the correct event info for DOM
|
||||
// events.
|
||||
|
||||
const TEST_URL = TEST_URL_ROOT + "doc_markup_events.html";
|
||||
|
||||
let test = asyncTest(function*() {
|
||||
let {inspector} = yield addTab(TEST_URL).then(openInspector);
|
||||
loadHelperScript("helper_events_test_runner.js");
|
||||
|
||||
yield inspector.markup.expandAll();
|
||||
const TEST_DATA = [
|
||||
{
|
||||
selector: "html",
|
||||
expected: [
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL,
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM0"
|
||||
],
|
||||
handler: "init();"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#container",
|
||||
expected: [
|
||||
{
|
||||
type: "mouseover",
|
||||
filename: TEST_URL + ":62",
|
||||
attributes: [
|
||||
"Capturing",
|
||||
"DOM2"
|
||||
],
|
||||
handler: 'function mouseoverHandler(event) {\n' +
|
||||
' if (event.target.id !== "container") {\n' +
|
||||
' let output = document.getElementById("output");\n' +
|
||||
' output.textContent = event.target.textContent;\n' +
|
||||
' }\n' +
|
||||
'}'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#multiple",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":69",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: 'function clickHandler(event) {\n' +
|
||||
' let output = document.getElementById("output");\n' +
|
||||
' output.textContent = "click";\n' +
|
||||
'}'
|
||||
},
|
||||
{
|
||||
type: "mouseup",
|
||||
filename: TEST_URL + ":78",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: 'function mouseupHandler(event) {\n' +
|
||||
' let output = document.getElementById("output");\n' +
|
||||
' output.textContent = "mouseup";\n' +
|
||||
'}'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#DOM0",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL,
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM0"
|
||||
],
|
||||
handler: "alert('hi')"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#handleevent",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":89",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: 'handleEvent: function(blah) {\n' +
|
||||
' alert("handleEvent clicked");\n' +
|
||||
'}'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#fatarrow",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":57",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: 'event => {\n' +
|
||||
' alert("Yay for the fat arrow!");\n' +
|
||||
'}'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#boundhe",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":101",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: 'handleEvent: function() {\n' +
|
||||
' alert("boundHandleEvent clicked");\n' +
|
||||
'}'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#bound",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":74",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: 'function boundClickHandler(event) {\n' +
|
||||
' alert("Bound event clicked");\n' +
|
||||
'}'
|
||||
}
|
||||
]
|
||||
},
|
||||
];
|
||||
|
||||
yield checkEventsForNode("html", [
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL,
|
||||
bubbling: true,
|
||||
dom0: true,
|
||||
handler: "init();"
|
||||
}
|
||||
]);
|
||||
|
||||
yield checkEventsForNode("#container", [
|
||||
{
|
||||
type: "mouseover",
|
||||
filename: TEST_URL + ":62",
|
||||
bubbling: false,
|
||||
dom0: false,
|
||||
handler: 'function mouseoverHandler(event) {\n' +
|
||||
' if (event.target.id !== "container") {\n' +
|
||||
' let output = document.getElementById("output");\n' +
|
||||
' output.textContent = event.target.textContent;\n' +
|
||||
' }\n' +
|
||||
'}'
|
||||
}
|
||||
]);
|
||||
|
||||
yield checkEventsForNode("#multiple", [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":69",
|
||||
bubbling: true,
|
||||
dom0: false,
|
||||
handler: 'function clickHandler(event) {\n' +
|
||||
' let output = document.getElementById("output");\n' +
|
||||
' output.textContent = "click";\n' +
|
||||
'}'
|
||||
},
|
||||
{
|
||||
type: "mouseup",
|
||||
filename: TEST_URL + ":78",
|
||||
bubbling: true,
|
||||
dom0: false,
|
||||
handler: 'function mouseupHandler(event) {\n' +
|
||||
' let output = document.getElementById("output");\n' +
|
||||
' output.textContent = "mouseup";\n' +
|
||||
'}'
|
||||
}
|
||||
]);
|
||||
|
||||
yield checkEventsForNode("#DOM0", [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL,
|
||||
bubbling: true,
|
||||
dom0: true,
|
||||
handler: "alert('hi')"
|
||||
}
|
||||
]);
|
||||
|
||||
yield checkEventsForNode("#handleevent", [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":89",
|
||||
bubbling: true,
|
||||
dom0: false,
|
||||
handler: 'handleEvent: function(blah) {\n' +
|
||||
' alert("handleEvent clicked");\n' +
|
||||
'}'
|
||||
}
|
||||
]);
|
||||
|
||||
yield checkEventsForNode("#fatarrow", [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":57",
|
||||
bubbling: true,
|
||||
dom0: false,
|
||||
handler: 'event => {\n' +
|
||||
' alert("Yay for the fat arrow!");\n' +
|
||||
'}'
|
||||
}
|
||||
]);
|
||||
|
||||
yield checkEventsForNode("#boundhe", [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":101",
|
||||
bubbling: true,
|
||||
dom0: false,
|
||||
handler: 'handleEvent: function() {\n' +
|
||||
' alert("boundHandleEvent clicked");\n' +
|
||||
'}'
|
||||
}
|
||||
]);
|
||||
|
||||
yield checkEventsForNode("#bound", [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":74",
|
||||
bubbling: true,
|
||||
dom0: false,
|
||||
handler: 'function boundClickHandler(event) {\n' +
|
||||
' alert("Bound event clicked");\n' +
|
||||
'}'
|
||||
}
|
||||
]);
|
||||
|
||||
gBrowser.removeCurrentTab();
|
||||
|
||||
// Wait for promises to avoid leaks when running this as a single test.
|
||||
// We need to do this because we have opened a bunch of popups and don't them
|
||||
// to affect other test runs when they are GCd.
|
||||
yield promiseNextTick();
|
||||
|
||||
function* checkEventsForNode(selector, expected) {
|
||||
let container = yield getContainerForSelector(selector, inspector);
|
||||
let evHolder = container.elt.querySelector(".markupview-events");
|
||||
let tooltip = inspector.markup.tooltip;
|
||||
|
||||
yield selectNode(selector, inspector);
|
||||
|
||||
// Click button to show tooltip
|
||||
info("Clicking evHolder");
|
||||
EventUtils.synthesizeMouseAtCenter(evHolder, {}, inspector.markup.doc.defaultView);
|
||||
yield tooltip.once("shown");
|
||||
info("tooltip shown");
|
||||
|
||||
// Check values
|
||||
let content = tooltip.content;
|
||||
let result = content.querySelectorAll("label,.event-tooltip-content-box");
|
||||
let nodeFront = container.node;
|
||||
let cssSelector = nodeFront.nodeName + "#" + nodeFront.id;
|
||||
|
||||
let out = [];
|
||||
|
||||
for (let i = 0; i < result.length;) {
|
||||
let type = result[i++];
|
||||
let filename = result[i++];
|
||||
let bubbling = result[i++];
|
||||
let dom0 = result[i++];
|
||||
let content = result[i++];
|
||||
|
||||
EventUtils.synthesizeMouseAtCenter(type, {}, type.ownerGlobal);
|
||||
|
||||
yield tooltip.once("event-tooltip-ready");
|
||||
|
||||
let editor = tooltip.eventEditors.get(content).editor;
|
||||
|
||||
out.push({
|
||||
type: type.getAttribute("value"),
|
||||
filename: filename.getAttribute("value"),
|
||||
bubbling: bubbling.getAttribute("value") === "Bubbling",
|
||||
dom0: dom0.getAttribute("value") === "DOM0",
|
||||
handler: editor.getText()
|
||||
});
|
||||
}
|
||||
|
||||
for (let i = 0; i < out.length; i++) {
|
||||
is(out[i].type, expected[i].type, "type matches for " + cssSelector);
|
||||
is(out[i].filename, expected[i].filename, "filename matches for " + cssSelector);
|
||||
is(out[i].bubbling, expected[i].bubbling, "bubbling matches for " + cssSelector);
|
||||
is(out[i].dom0, expected[i].dom0, "dom0 matches for " + cssSelector);
|
||||
is(out[i].handler, expected[i].handler, "handlers matches for " + cssSelector);
|
||||
}
|
||||
|
||||
tooltip.hide();
|
||||
}
|
||||
|
||||
function promiseNextTick() {
|
||||
let deferred = promise.defer();
|
||||
executeSoon(deferred.resolve);
|
||||
return deferred.promise;
|
||||
}
|
||||
});
|
||||
let test = asyncTest(runEventPopupTests);
|
||||
|
@ -0,0 +1,230 @@
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
// Test that markup view event bubbles show the correct event info for jQuery
|
||||
// and jQuery Live events (jQuery version 1.0).
|
||||
|
||||
const TEST_LIB = "lib_jquery_1.0.js";
|
||||
const TEST_URL = TEST_URL_ROOT + "doc_markup_events_jquery.html?" + TEST_LIB;
|
||||
|
||||
loadHelperScript("helper_events_test_runner.js");
|
||||
|
||||
const TEST_DATA = [
|
||||
{
|
||||
selector: "html",
|
||||
expected: [
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL_ROOT + TEST_LIB,
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "// Handle when the DOM is ready\n" +
|
||||
"ready: function() {\n" +
|
||||
" // Make sure that the DOM is not already loaded\n" +
|
||||
" if (!jQuery.isReady) {\n" +
|
||||
" // Remember that the DOM is ready\n" +
|
||||
" jQuery.isReady = true;\n" +
|
||||
"\n" +
|
||||
" // If there are functions bound, to execute\n" +
|
||||
" if (jQuery.readyList) {\n" +
|
||||
" // Execute all of them\n" +
|
||||
" for (var i = 0; i < jQuery.readyList.length; i++)\n" +
|
||||
" jQuery.readyList[i].apply(document);\n" +
|
||||
"\n" +
|
||||
" // Reset the list of functions\n" +
|
||||
" jQuery.readyList = null;\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL,
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM0"
|
||||
],
|
||||
handler: "() => {\n" +
|
||||
" var handler1 = function liveDivDblClick() {\n" +
|
||||
" alert(1);\n" +
|
||||
" };\n" +
|
||||
" var handler2 = function liveDivDragStart() {\n" +
|
||||
" alert(2);\n" +
|
||||
" };\n" +
|
||||
" var handler3 = function liveDivDragLeave() {\n" +
|
||||
" alert(3);\n" +
|
||||
" };\n" +
|
||||
" var handler4 = function liveDivDragEnd() {\n" +
|
||||
" alert(4);\n" +
|
||||
" };\n" +
|
||||
" var handler5 = function liveDivDrop() {\n" +
|
||||
" alert(5);\n" +
|
||||
" };\n" +
|
||||
" var handler6 = function liveDivDragOver() {\n" +
|
||||
" alert(6);\n" +
|
||||
" };\n" +
|
||||
" var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
" };\n" +
|
||||
" var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
" };\n" +
|
||||
" var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
" };\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").live) {\n" +
|
||||
" $(\"#livediv\").live(\"dblclick\", handler1);\n" +
|
||||
" $(\"#livediv\").live(\"dragstart\", handler2);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").delegate) {\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragleave\", handler3);\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragend\", handler4);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").on) {\n" +
|
||||
" $(document).on(\"drop\", \"#livediv\", handler5);\n" +
|
||||
" $(document).on(\"dragover\", \"#livediv\", handler6);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" var div = $(\"div\")[0];\n" +
|
||||
" $(div).click(handler7);\n" +
|
||||
" $(div).click(handler8);\n" +
|
||||
" $(div).keydown(handler9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL_ROOT + TEST_LIB,
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM0"
|
||||
],
|
||||
handler: "handle: function(event) {\n" +
|
||||
" if (typeof jQuery == \"undefined\") return;\n" +
|
||||
"\n" +
|
||||
" event = event || jQuery.event.fix(window.event);\n" +
|
||||
"\n" +
|
||||
" // If no correct event was found, fail\n" +
|
||||
" if (!event) return;\n" +
|
||||
"\n" +
|
||||
" var returnValue = true;\n" +
|
||||
"\n" +
|
||||
" var c = this.events[event.type];\n" +
|
||||
"\n" +
|
||||
" for (var j in c) {\n" +
|
||||
" if (c[j].apply(this, [event]) === false) {\n" +
|
||||
" event.preventDefault();\n" +
|
||||
" event.stopPropagation();\n" +
|
||||
" returnValue = false;\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" return returnValue;\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#testdiv",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":34",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":35",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL + ":36",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":894",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "handle: function(event) {\n" +
|
||||
" if (typeof jQuery == \"undefined\") return;\n" +
|
||||
"\n" +
|
||||
" event = event || jQuery.event.fix(window.event);\n" +
|
||||
"\n" +
|
||||
" // If no correct event was found, fail\n" +
|
||||
" if (!event) return;\n" +
|
||||
"\n" +
|
||||
" var returnValue = true;\n" +
|
||||
"\n" +
|
||||
" var c = this.events[event.type];\n" +
|
||||
"\n" +
|
||||
" for (var j in c) {\n" +
|
||||
" if (c[j].apply(this, [event]) === false) {\n" +
|
||||
" event.preventDefault();\n" +
|
||||
" event.stopPropagation();\n" +
|
||||
" returnValue = false;\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" return returnValue;\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":894",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "handle: function(event) {\n" +
|
||||
" if (typeof jQuery == \"undefined\") return;\n" +
|
||||
"\n" +
|
||||
" event = event || jQuery.event.fix(window.event);\n" +
|
||||
"\n" +
|
||||
" // If no correct event was found, fail\n" +
|
||||
" if (!event) return;\n" +
|
||||
"\n" +
|
||||
" var returnValue = true;\n" +
|
||||
"\n" +
|
||||
" var c = this.events[event.type];\n" +
|
||||
"\n" +
|
||||
" for (var j in c) {\n" +
|
||||
" if (c[j].apply(this, [event]) === false) {\n" +
|
||||
" event.preventDefault();\n" +
|
||||
" event.stopPropagation();\n" +
|
||||
" returnValue = false;\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" return returnValue;\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
];
|
||||
|
||||
let test = asyncTest(runEventPopupTests);
|
@ -0,0 +1,264 @@
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
// Test that markup view event bubbles show the correct event info for jQuery
|
||||
// and jQuery Live events (jQuery version 1.1).
|
||||
|
||||
const TEST_LIB = "lib_jquery_1.1.js";
|
||||
const TEST_URL = TEST_URL_ROOT + "doc_markup_events_jquery.html?" + TEST_LIB;
|
||||
|
||||
loadHelperScript("helper_events_test_runner.js");
|
||||
|
||||
const TEST_DATA = [
|
||||
{
|
||||
selector: "html",
|
||||
expected: [
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL_ROOT + TEST_LIB,
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "// Handle when the DOM is ready\n" +
|
||||
"ready: function() {\n" +
|
||||
" // Make sure that the DOM is not already loaded\n" +
|
||||
" if (!jQuery.isReady) {\n" +
|
||||
" // Remember that the DOM is ready\n" +
|
||||
" jQuery.isReady = true;\n" +
|
||||
"\n" +
|
||||
" // If there are functions bound, to execute\n" +
|
||||
" if (jQuery.readyList) {\n" +
|
||||
" // Execute all of them\n" +
|
||||
" jQuery.each(jQuery.readyList, function() {\n" +
|
||||
" this.apply(document);\n" +
|
||||
" });\n" +
|
||||
"\n" +
|
||||
" // Reset the list of functions\n" +
|
||||
" jQuery.readyList = null;\n" +
|
||||
" }\n" +
|
||||
" // Remove event lisenter to avoid memory leak\n" +
|
||||
" if (jQuery.browser.mozilla || jQuery.browser.opera)\n" +
|
||||
" document.removeEventListener(\"DOMContentLoaded\", jQuery.ready, false);\n" +
|
||||
" }\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL,
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM0"
|
||||
],
|
||||
handler: "() => {\n" +
|
||||
" var handler1 = function liveDivDblClick() {\n" +
|
||||
" alert(1);\n" +
|
||||
" };\n" +
|
||||
" var handler2 = function liveDivDragStart() {\n" +
|
||||
" alert(2);\n" +
|
||||
" };\n" +
|
||||
" var handler3 = function liveDivDragLeave() {\n" +
|
||||
" alert(3);\n" +
|
||||
" };\n" +
|
||||
" var handler4 = function liveDivDragEnd() {\n" +
|
||||
" alert(4);\n" +
|
||||
" };\n" +
|
||||
" var handler5 = function liveDivDrop() {\n" +
|
||||
" alert(5);\n" +
|
||||
" };\n" +
|
||||
" var handler6 = function liveDivDragOver() {\n" +
|
||||
" alert(6);\n" +
|
||||
" };\n" +
|
||||
" var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
" };\n" +
|
||||
" var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
" };\n" +
|
||||
" var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
" };\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").live) {\n" +
|
||||
" $(\"#livediv\").live(\"dblclick\", handler1);\n" +
|
||||
" $(\"#livediv\").live(\"dragstart\", handler2);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").delegate) {\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragleave\", handler3);\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragend\", handler4);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").on) {\n" +
|
||||
" $(document).on(\"drop\", \"#livediv\", handler5);\n" +
|
||||
" $(document).on(\"dragover\", \"#livediv\", handler6);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" var div = $(\"div\")[0];\n" +
|
||||
" $(div).click(handler7);\n" +
|
||||
" $(div).click(handler8);\n" +
|
||||
" $(div).keydown(handler9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL_ROOT + TEST_LIB,
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM0"
|
||||
],
|
||||
handler: "handle: function(event) {\n" +
|
||||
" if (typeof jQuery == \"undefined\") return false;\n" +
|
||||
"\n" +
|
||||
" // Empty object is for triggered events with no data\n" +
|
||||
" event = jQuery.event.fix(event || window.event || {});\n" +
|
||||
"\n" +
|
||||
" // returned undefined or false\n" +
|
||||
" var returnValue;\n" +
|
||||
"\n" +
|
||||
" var c = this.events[event.type];\n" +
|
||||
"\n" +
|
||||
" var args = [].slice.call(arguments, 1);\n" +
|
||||
" args.unshift(event);\n" +
|
||||
"\n" +
|
||||
" for (var j in c) {\n" +
|
||||
" // Pass in a reference to the handler function itself\n" +
|
||||
" // So that we can later remove it\n" +
|
||||
" args[0].handler = c[j];\n" +
|
||||
" args[0].data = c[j].data;\n" +
|
||||
"\n" +
|
||||
" if (c[j].apply(this, args) === false) {\n" +
|
||||
" event.preventDefault();\n" +
|
||||
" event.stopPropagation();\n" +
|
||||
" returnValue = false;\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" // Clean up added properties in IE to prevent memory leak\n" +
|
||||
" if (jQuery.browser.msie) event.target = event.preventDefault = event.stopPropagation = event.handler = event.data = null;\n" +
|
||||
"\n" +
|
||||
" return returnValue;\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#testdiv",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":34",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":35",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL + ":36",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":1224",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "handle: function(event) {\n" +
|
||||
" if (typeof jQuery == \"undefined\") return false;\n" +
|
||||
"\n" +
|
||||
" // Empty object is for triggered events with no data\n" +
|
||||
" event = jQuery.event.fix(event || window.event || {});\n" +
|
||||
"\n" +
|
||||
" // returned undefined or false\n" +
|
||||
" var returnValue;\n" +
|
||||
"\n" +
|
||||
" var c = this.events[event.type];\n" +
|
||||
"\n" +
|
||||
" var args = [].slice.call(arguments, 1);\n" +
|
||||
" args.unshift(event);\n" +
|
||||
"\n" +
|
||||
" for (var j in c) {\n" +
|
||||
" // Pass in a reference to the handler function itself\n" +
|
||||
" // So that we can later remove it\n" +
|
||||
" args[0].handler = c[j];\n" +
|
||||
" args[0].data = c[j].data;\n" +
|
||||
"\n" +
|
||||
" if (c[j].apply(this, args) === false) {\n" +
|
||||
" event.preventDefault();\n" +
|
||||
" event.stopPropagation();\n" +
|
||||
" returnValue = false;\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" // Clean up added properties in IE to prevent memory leak\n" +
|
||||
" if (jQuery.browser.msie) event.target = event.preventDefault = event.stopPropagation = event.handler = event.data = null;\n" +
|
||||
"\n" +
|
||||
" return returnValue;\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":1224",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "handle: function(event) {\n" +
|
||||
" if (typeof jQuery == \"undefined\") return false;\n" +
|
||||
"\n" +
|
||||
" // Empty object is for triggered events with no data\n" +
|
||||
" event = jQuery.event.fix(event || window.event || {});\n" +
|
||||
"\n" +
|
||||
" // returned undefined or false\n" +
|
||||
" var returnValue;\n" +
|
||||
"\n" +
|
||||
" var c = this.events[event.type];\n" +
|
||||
"\n" +
|
||||
" var args = [].slice.call(arguments, 1);\n" +
|
||||
" args.unshift(event);\n" +
|
||||
"\n" +
|
||||
" for (var j in c) {\n" +
|
||||
" // Pass in a reference to the handler function itself\n" +
|
||||
" // So that we can later remove it\n" +
|
||||
" args[0].handler = c[j];\n" +
|
||||
" args[0].data = c[j].data;\n" +
|
||||
"\n" +
|
||||
" if (c[j].apply(this, args) === false) {\n" +
|
||||
" event.preventDefault();\n" +
|
||||
" event.stopPropagation();\n" +
|
||||
" returnValue = false;\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" // Clean up added properties in IE to prevent memory leak\n" +
|
||||
" if (jQuery.browser.msie) event.target = event.preventDefault = event.stopPropagation = event.handler = event.data = null;\n" +
|
||||
"\n" +
|
||||
" return returnValue;\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
let test = asyncTest(runEventPopupTests);
|
@ -0,0 +1,188 @@
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
// Test that markup view event bubbles show the correct event info for jQuery
|
||||
// and jQuery Live events (jQuery version 1.11.1).
|
||||
|
||||
const TEST_LIB = "lib_jquery_1.11.1_min.js";
|
||||
const TEST_URL = TEST_URL_ROOT + "doc_markup_events_jquery.html?" + TEST_LIB;
|
||||
|
||||
loadHelperScript("helper_events_test_runner.js");
|
||||
|
||||
const TEST_DATA = [
|
||||
{
|
||||
selector: "html",
|
||||
expected: [
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL + ":27",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "() => {\n" +
|
||||
" var handler1 = function liveDivDblClick() {\n" +
|
||||
" alert(1);\n" +
|
||||
" };\n" +
|
||||
" var handler2 = function liveDivDragStart() {\n" +
|
||||
" alert(2);\n" +
|
||||
" };\n" +
|
||||
" var handler3 = function liveDivDragLeave() {\n" +
|
||||
" alert(3);\n" +
|
||||
" };\n" +
|
||||
" var handler4 = function liveDivDragEnd() {\n" +
|
||||
" alert(4);\n" +
|
||||
" };\n" +
|
||||
" var handler5 = function liveDivDrop() {\n" +
|
||||
" alert(5);\n" +
|
||||
" };\n" +
|
||||
" var handler6 = function liveDivDragOver() {\n" +
|
||||
" alert(6);\n" +
|
||||
" };\n" +
|
||||
" var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
" };\n" +
|
||||
" var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
" };\n" +
|
||||
" var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
" };\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").live) {\n" +
|
||||
" $(\"#livediv\").live(\"dblclick\", handler1);\n" +
|
||||
" $(\"#livediv\").live(\"dragstart\", handler2);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").delegate) {\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragleave\", handler3);\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragend\", handler4);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").on) {\n" +
|
||||
" $(document).on(\"drop\", \"#livediv\", handler5);\n" +
|
||||
" $(document).on(\"dragover\", \"#livediv\", handler6);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" var div = $(\"div\")[0];\n" +
|
||||
" $(div).click(handler7);\n" +
|
||||
" $(div).click(handler8);\n" +
|
||||
" $(div).keydown(handler9);\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
selector: "#testdiv",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":34",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":35",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL + ":36",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":3",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "k = r.handle = function(a) {\n" +
|
||||
" return typeof m === K || a && m.event.triggered === a.type ? void 0 : m.event.dispatch.apply(k.elem, arguments)\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":3",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "k = r.handle = function(a) {\n" +
|
||||
" return typeof m === K || a && m.event.triggered === a.type ? void 0 : m.event.dispatch.apply(k.elem, arguments)\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
selector: "#livediv",
|
||||
expected: [
|
||||
{
|
||||
type: "dragleave",
|
||||
filename: TEST_URL + ":30",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler3 = function liveDivDragLeave() {\n" +
|
||||
" alert(3);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragend",
|
||||
filename: TEST_URL + ":31",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler4 = function liveDivDragEnd() {\n" +
|
||||
" alert(4);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "drop",
|
||||
filename: TEST_URL + ":32",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler5 = function liveDivDrop() {\n" +
|
||||
" alert(5);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragover",
|
||||
filename: TEST_URL + ":33",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler6 = function liveDivDragOver() {\n" +
|
||||
" alert(6);\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
];
|
||||
|
||||
let test = asyncTest(runEventPopupTests);
|
@ -0,0 +1,183 @@
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
// Test that markup view event bubbles show the correct event info for jQuery
|
||||
// and jQuery Live events (jQuery version 1.2).
|
||||
|
||||
const TEST_LIB = "lib_jquery_1.2_min.js";
|
||||
const TEST_URL = TEST_URL_ROOT + "doc_markup_events_jquery.html?" + TEST_LIB;
|
||||
|
||||
loadHelperScript("helper_events_test_runner.js");
|
||||
|
||||
const TEST_DATA = [
|
||||
{
|
||||
selector: "html",
|
||||
expected: [
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL + ":27",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "() => {\n" +
|
||||
" var handler1 = function liveDivDblClick() {\n" +
|
||||
" alert(1);\n" +
|
||||
" };\n" +
|
||||
" var handler2 = function liveDivDragStart() {\n" +
|
||||
" alert(2);\n" +
|
||||
" };\n" +
|
||||
" var handler3 = function liveDivDragLeave() {\n" +
|
||||
" alert(3);\n" +
|
||||
" };\n" +
|
||||
" var handler4 = function liveDivDragEnd() {\n" +
|
||||
" alert(4);\n" +
|
||||
" };\n" +
|
||||
" var handler5 = function liveDivDrop() {\n" +
|
||||
" alert(5);\n" +
|
||||
" };\n" +
|
||||
" var handler6 = function liveDivDragOver() {\n" +
|
||||
" alert(6);\n" +
|
||||
" };\n" +
|
||||
" var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
" };\n" +
|
||||
" var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
" };\n" +
|
||||
" var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
" };\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").live) {\n" +
|
||||
" $(\"#livediv\").live(\"dblclick\", handler1);\n" +
|
||||
" $(\"#livediv\").live(\"dragstart\", handler2);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").delegate) {\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragleave\", handler3);\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragend\", handler4);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").on) {\n" +
|
||||
" $(document).on(\"drop\", \"#livediv\", handler5);\n" +
|
||||
" $(document).on(\"dragover\", \"#livediv\", handler6);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" var div = $(\"div\")[0];\n" +
|
||||
" $(div).click(handler7);\n" +
|
||||
" $(div).click(handler8);\n" +
|
||||
" $(div).keydown(handler9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL_ROOT + TEST_LIB,
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM0"
|
||||
],
|
||||
handler: "handle: function(event) {\n" +
|
||||
" if (typeof jQuery == \"undefined\") return false;\n" +
|
||||
"\n" +
|
||||
" // Empty object is for triggered events with no data\n" +
|
||||
" event = jQuery.event.fix(event || window.event || {});\n" +
|
||||
"\n" +
|
||||
" // returned undefined or false\n" +
|
||||
" var returnValue;\n" +
|
||||
"\n" +
|
||||
" var c = this.events[event.type];\n" +
|
||||
"\n" +
|
||||
" var args = [].slice.call(arguments, 1);\n" +
|
||||
" args.unshift(event);\n" +
|
||||
"\n" +
|
||||
" for (var j in c) {\n" +
|
||||
" // Pass in a reference to the handler function itself\n" +
|
||||
" // So that we can later remove it\n" +
|
||||
" args[0].handler = c[j];\n" +
|
||||
" args[0].data = c[j].data;\n" +
|
||||
"\n" +
|
||||
" if (c[j].apply(this, args) === false) {\n" +
|
||||
" event.preventDefault();\n" +
|
||||
" event.stopPropagation();\n" +
|
||||
" returnValue = false;\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" // Clean up added properties in IE to prevent memory leak\n" +
|
||||
" if (jQuery.browser.msie) event.target = event.preventDefault = event.stopPropagation = event.handler = event.data = null;\n" +
|
||||
"\n" +
|
||||
" return returnValue;\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#testdiv",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":34",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":35",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL + ":36",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":24",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "function() {\n" +
|
||||
" var val;\n" +
|
||||
" if (typeof jQuery == \"undefined\" || jQuery.event.triggered) return val;\n" +
|
||||
" val = jQuery.event.handle.apply(element, arguments);\n" +
|
||||
" return val;\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":24",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "function() {\n" +
|
||||
" var val;\n" +
|
||||
" if (typeof jQuery == \"undefined\" || jQuery.event.triggered) return val;\n" +
|
||||
" val = jQuery.event.handle.apply(element, arguments);\n" +
|
||||
" return val;\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
];
|
||||
|
||||
let test = asyncTest(runEventPopupTests);
|
@ -0,0 +1,216 @@
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
// Test that markup view event bubbles show the correct event info for jQuery
|
||||
// and jQuery Live events (jQuery version 1.3).
|
||||
|
||||
const TEST_LIB = "lib_jquery_1.3_min.js";
|
||||
const TEST_URL = TEST_URL_ROOT + "doc_markup_events_jquery.html?" + TEST_LIB;
|
||||
|
||||
loadHelperScript("helper_events_test_runner.js");
|
||||
|
||||
const TEST_DATA = [
|
||||
{
|
||||
selector: "html",
|
||||
expected: [
|
||||
{
|
||||
type: "unload",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":19",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "function(H) {\n" +
|
||||
" n(this).unbind(H, D);\n" +
|
||||
" return (E || G).apply(this, arguments)\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":19",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "ready: function() {\n" +
|
||||
" if (!n.isReady) {\n" +
|
||||
" n.isReady = true;\n" +
|
||||
" if (n.readyList) {\n" +
|
||||
" n.each(n.readyList, function() {\n" +
|
||||
" this.call(document, n)\n" +
|
||||
" });\n" +
|
||||
" n.readyList = null\n" +
|
||||
" }\n" +
|
||||
" n(document).triggerHandler(\"ready\")\n" +
|
||||
" }\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL + ":27",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "() => {\n" +
|
||||
" var handler1 = function liveDivDblClick() {\n" +
|
||||
" alert(1);\n" +
|
||||
" };\n" +
|
||||
" var handler2 = function liveDivDragStart() {\n" +
|
||||
" alert(2);\n" +
|
||||
" };\n" +
|
||||
" var handler3 = function liveDivDragLeave() {\n" +
|
||||
" alert(3);\n" +
|
||||
" };\n" +
|
||||
" var handler4 = function liveDivDragEnd() {\n" +
|
||||
" alert(4);\n" +
|
||||
" };\n" +
|
||||
" var handler5 = function liveDivDrop() {\n" +
|
||||
" alert(5);\n" +
|
||||
" };\n" +
|
||||
" var handler6 = function liveDivDragOver() {\n" +
|
||||
" alert(6);\n" +
|
||||
" };\n" +
|
||||
" var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
" };\n" +
|
||||
" var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
" };\n" +
|
||||
" var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
" };\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").live) {\n" +
|
||||
" $(\"#livediv\").live(\"dblclick\", handler1);\n" +
|
||||
" $(\"#livediv\").live(\"dragstart\", handler2);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").delegate) {\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragleave\", handler3);\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragend\", handler4);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").on) {\n" +
|
||||
" $(document).on(\"drop\", \"#livediv\", handler5);\n" +
|
||||
" $(document).on(\"dragover\", \"#livediv\", handler6);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" var div = $(\"div\")[0];\n" +
|
||||
" $(div).click(handler7);\n" +
|
||||
" $(div).click(handler8);\n" +
|
||||
" $(div).keydown(handler9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "unload",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":19",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "function() {\n" +
|
||||
" return typeof n !== \"undefined\" && !n.event.triggered ? n.event.handle.apply(arguments.callee.elem, arguments) : g\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":19",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "function() {\n" +
|
||||
" return typeof n !== \"undefined\" && !n.event.triggered ? n.event.handle.apply(arguments.callee.elem, arguments) : g\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#testdiv",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":34",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":35",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL + ":36",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":19",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "function() {\n" +
|
||||
" return typeof n !== \"undefined\" && !n.event.triggered ? n.event.handle.apply(arguments.callee.elem, arguments) : g\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":19",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "function() {\n" +
|
||||
" return typeof n !== \"undefined\" && !n.event.triggered ? n.event.handle.apply(arguments.callee.elem, arguments) : g\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#livediv",
|
||||
expected: [
|
||||
{
|
||||
type: "dblclick",
|
||||
filename: TEST_URL + ":28",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler1 = function liveDivDblClick() {\n" +
|
||||
" alert(1);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragstart",
|
||||
filename: TEST_URL + ":29",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler2 = function liveDivDragStart() {\n" +
|
||||
" alert(2);\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
];
|
||||
|
||||
let test = asyncTest(runEventPopupTests);
|
@ -0,0 +1,279 @@
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
// Test that markup view event bubbles show the correct event info for jQuery
|
||||
// and jQuery Live events (jQuery version 1.4).
|
||||
|
||||
const TEST_LIB = "lib_jquery_1.4_min.js";
|
||||
const TEST_URL = TEST_URL_ROOT + "doc_markup_events_jquery.html?" + TEST_LIB;
|
||||
|
||||
loadHelperScript("helper_events_test_runner.js");
|
||||
|
||||
const TEST_DATA = [
|
||||
{
|
||||
selector: "html",
|
||||
expected: [
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL + ":27",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "() => {\n" +
|
||||
" var handler1 = function liveDivDblClick() {\n" +
|
||||
" alert(1);\n" +
|
||||
" };\n" +
|
||||
" var handler2 = function liveDivDragStart() {\n" +
|
||||
" alert(2);\n" +
|
||||
" };\n" +
|
||||
" var handler3 = function liveDivDragLeave() {\n" +
|
||||
" alert(3);\n" +
|
||||
" };\n" +
|
||||
" var handler4 = function liveDivDragEnd() {\n" +
|
||||
" alert(4);\n" +
|
||||
" };\n" +
|
||||
" var handler5 = function liveDivDrop() {\n" +
|
||||
" alert(5);\n" +
|
||||
" };\n" +
|
||||
" var handler6 = function liveDivDragOver() {\n" +
|
||||
" alert(6);\n" +
|
||||
" };\n" +
|
||||
" var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
" };\n" +
|
||||
" var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
" };\n" +
|
||||
" var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
" };\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").live) {\n" +
|
||||
" $(\"#livediv\").live(\"dblclick\", handler1);\n" +
|
||||
" $(\"#livediv\").live(\"dragstart\", handler2);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").delegate) {\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragleave\", handler3);\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragend\", handler4);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").on) {\n" +
|
||||
" $(document).on(\"drop\", \"#livediv\", handler5);\n" +
|
||||
" $(document).on(\"dragover\", \"#livediv\", handler6);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" var div = $(\"div\")[0];\n" +
|
||||
" $(div).click(handler7);\n" +
|
||||
" $(div).click(handler8);\n" +
|
||||
" $(div).keydown(handler9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":26",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "ready: function() {\n" +
|
||||
" if (!c.isReady) {\n" +
|
||||
" if (!s.body) return setTimeout(c.ready, 13);\n" +
|
||||
" c.isReady = true;\n" +
|
||||
" if (Q) {\n" +
|
||||
" for (var a, b = 0; a = Q[b++];) a.call(s, c);\n" +
|
||||
" Q = null\n" +
|
||||
" }\n" +
|
||||
" c.fn.triggerHandler && c(s).triggerHandler(\"ready\")\n" +
|
||||
" }\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#testdiv",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":34",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":35",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL + ":36",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":48",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "j = function() {\n" +
|
||||
" return typeof c !== \"undefined\" && !c.event.triggered ? c.event.handle.apply(j.elem, arguments) : w\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":48",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "j = function() {\n" +
|
||||
" return typeof c !== \"undefined\" && !c.event.triggered ? c.event.handle.apply(j.elem, arguments) : w\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#livediv",
|
||||
expected: [
|
||||
{
|
||||
type: "dblclick",
|
||||
filename: TEST_URL + ":28",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler1 = function liveDivDblClick() {\n" +
|
||||
" alert(1);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragstart",
|
||||
filename: TEST_URL + ":29",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler2 = function liveDivDragStart() {\n" +
|
||||
" alert(2);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dblclick",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":17",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "function qa(a) {\n" +
|
||||
" var b = true,\n" +
|
||||
" d = [],\n" +
|
||||
" f = [],\n" +
|
||||
" e = arguments,\n" +
|
||||
" i, j, o, p, n, t = c.extend({}, c.data(this, \"events\").live);\n" +
|
||||
" for (p in t) {\n" +
|
||||
" j = t[p];\n" +
|
||||
" if (j.live === a.type || j.altLive && c.inArray(a.type, j.altLive) > -1) {\n" +
|
||||
" i = j.data;\n" +
|
||||
" i.beforeFilter && i.beforeFilter[a.type] && !i.beforeFilter[a.type](a) || f.push(j.selector)\n" +
|
||||
" } else delete t[p]\n" +
|
||||
" }\n" +
|
||||
" i = c(a.target).closest(f, a.currentTarget);\n" +
|
||||
" n = 0;\n" +
|
||||
" for (l = i.length; n < l; n++)\n" +
|
||||
" for (p in t) {\n" +
|
||||
" j = t[p];\n" +
|
||||
" o = i[n].elem;\n" +
|
||||
" f = null;\n" +
|
||||
" if (i[n].selector === j.selector) {\n" +
|
||||
" if (j.live === \"mouseenter\" || j.live === \"mouseleave\") f = c(a.relatedTarget).closest(j.selector)[0];\n" +
|
||||
" if (!f || f !== o) d.push({\n" +
|
||||
" elem: o,\n" +
|
||||
" fn: j\n" +
|
||||
" })\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" n = 0;\n" +
|
||||
" for (l = d.length; n < l; n++) {\n" +
|
||||
" i = d[n];\n" +
|
||||
" a.currentTarget = i.elem;\n" +
|
||||
" a.data = i.fn.data;\n" +
|
||||
" if (i.fn.apply(i.elem, e) === false) {\n" +
|
||||
" b = false;\n" +
|
||||
" break\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" return b\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragstart",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":17",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "function qa(a) {\n" +
|
||||
" var b = true,\n" +
|
||||
" d = [],\n" +
|
||||
" f = [],\n" +
|
||||
" e = arguments,\n" +
|
||||
" i, j, o, p, n, t = c.extend({}, c.data(this, \"events\").live);\n" +
|
||||
" for (p in t) {\n" +
|
||||
" j = t[p];\n" +
|
||||
" if (j.live === a.type || j.altLive && c.inArray(a.type, j.altLive) > -1) {\n" +
|
||||
" i = j.data;\n" +
|
||||
" i.beforeFilter && i.beforeFilter[a.type] && !i.beforeFilter[a.type](a) || f.push(j.selector)\n" +
|
||||
" } else delete t[p]\n" +
|
||||
" }\n" +
|
||||
" i = c(a.target).closest(f, a.currentTarget);\n" +
|
||||
" n = 0;\n" +
|
||||
" for (l = i.length; n < l; n++)\n" +
|
||||
" for (p in t) {\n" +
|
||||
" j = t[p];\n" +
|
||||
" o = i[n].elem;\n" +
|
||||
" f = null;\n" +
|
||||
" if (i[n].selector === j.selector) {\n" +
|
||||
" if (j.live === \"mouseenter\" || j.live === \"mouseleave\") f = c(a.relatedTarget).closest(j.selector)[0];\n" +
|
||||
" if (!f || f !== o) d.push({\n" +
|
||||
" elem: o,\n" +
|
||||
" fn: j\n" +
|
||||
" })\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" n = 0;\n" +
|
||||
" for (l = d.length; n < l; n++) {\n" +
|
||||
" i = d[n];\n" +
|
||||
" a.currentTarget = i.elem;\n" +
|
||||
" a.data = i.fn.data;\n" +
|
||||
" if (i.fn.apply(i.elem, e) === false) {\n" +
|
||||
" b = false;\n" +
|
||||
" break\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" return b\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
];
|
||||
|
||||
let test = asyncTest(runEventPopupTests);
|
@ -0,0 +1,378 @@
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
// Test that markup view event bubbles show the correct event info for jQuery
|
||||
// and jQuery Live events (jQuery version 1.6).
|
||||
|
||||
const TEST_LIB = "lib_jquery_1.6_min.js";
|
||||
const TEST_URL = TEST_URL_ROOT + "doc_markup_events_jquery.html?" + TEST_LIB;
|
||||
|
||||
loadHelperScript("helper_events_test_runner.js");
|
||||
|
||||
const TEST_DATA = [
|
||||
{
|
||||
selector: "html",
|
||||
expected: [
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL + ":27",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "() => {\n" +
|
||||
" var handler1 = function liveDivDblClick() {\n" +
|
||||
" alert(1);\n" +
|
||||
" };\n" +
|
||||
" var handler2 = function liveDivDragStart() {\n" +
|
||||
" alert(2);\n" +
|
||||
" };\n" +
|
||||
" var handler3 = function liveDivDragLeave() {\n" +
|
||||
" alert(3);\n" +
|
||||
" };\n" +
|
||||
" var handler4 = function liveDivDragEnd() {\n" +
|
||||
" alert(4);\n" +
|
||||
" };\n" +
|
||||
" var handler5 = function liveDivDrop() {\n" +
|
||||
" alert(5);\n" +
|
||||
" };\n" +
|
||||
" var handler6 = function liveDivDragOver() {\n" +
|
||||
" alert(6);\n" +
|
||||
" };\n" +
|
||||
" var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
" };\n" +
|
||||
" var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
" };\n" +
|
||||
" var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
" };\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").live) {\n" +
|
||||
" $(\"#livediv\").live(\"dblclick\", handler1);\n" +
|
||||
" $(\"#livediv\").live(\"dragstart\", handler2);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").delegate) {\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragleave\", handler3);\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragend\", handler4);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").on) {\n" +
|
||||
" $(document).on(\"drop\", \"#livediv\", handler5);\n" +
|
||||
" $(document).on(\"dragover\", \"#livediv\", handler6);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" var div = $(\"div\")[0];\n" +
|
||||
" $(div).click(handler7);\n" +
|
||||
" $(div).click(handler8);\n" +
|
||||
" $(div).keydown(handler9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":16",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "ready: function(a) {\n" +
|
||||
" if (a === !0 && !--e.readyWait || a !== !0 && !e.isReady) {\n" +
|
||||
" if (!c.body) return setTimeout(e.ready, 1);\n" +
|
||||
" e.isReady = !0;\n" +
|
||||
" if (a !== !0 && --e.readyWait > 0) return;\n" +
|
||||
" y.resolveWith(c, [e]), e.fn.trigger && e(c).trigger(\"ready\").unbind(\"ready\")\n" +
|
||||
" }\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#testdiv",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":34",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":35",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL + ":36",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":16",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "i.handle = k = function(a) {\n" +
|
||||
" return typeof f != \"undefined\" && (!a || f.event.triggered !== a.type) ? f.event.handle.apply(k.elem, arguments) : b\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":16",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "i.handle = k = function(a) {\n" +
|
||||
" return typeof f != \"undefined\" && (!a || f.event.triggered !== a.type) ? f.event.handle.apply(k.elem, arguments) : b\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#livediv",
|
||||
expected: [
|
||||
{
|
||||
type: "dblclick",
|
||||
filename: TEST_URL + ":28",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler1 = function liveDivDblClick() {\n" +
|
||||
" alert(1);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragstart",
|
||||
filename: TEST_URL + ":29",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler2 = function liveDivDragStart() {\n" +
|
||||
" alert(2);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragleave",
|
||||
filename: TEST_URL + ":30",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler3 = function liveDivDragLeave() {\n" +
|
||||
" alert(3);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragend",
|
||||
filename: TEST_URL + ":31",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler4 = function liveDivDragEnd() {\n" +
|
||||
" alert(4);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dblclick",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":16",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "function M(a) {\n" +
|
||||
" var b, c, d, e, g, h, i, j, k, l, m, n, o, p = [],\n" +
|
||||
" q = [],\n" +
|
||||
" r = f._data(this, \"events\");\n" +
|
||||
" if (!(a.liveFired === this || !r || !r.live || a.target.disabled || a.button && a.type === \"click\")) {\n" +
|
||||
" a.namespace && (n = new RegExp(\"(^|\\\\.)\" + a.namespace.split(\".\").join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\")), a.liveFired = this;\n" +
|
||||
" var s = r.live.slice(0);\n" +
|
||||
" for (i = 0; i < s.length; i++) g = s[i], g.origType.replace(x, \"\") === a.type ? q.push(g.selector) : s.splice(i--, 1);\n" +
|
||||
" e = f(a.target).closest(q, a.currentTarget);\n" +
|
||||
" for (j = 0, k = e.length; j < k; j++) {\n" +
|
||||
" m = e[j];\n" +
|
||||
" for (i = 0; i < s.length; i++) {\n" +
|
||||
" g = s[i];\n" +
|
||||
" if (m.selector === g.selector && (!n || n.test(g.namespace)) && !m.elem.disabled) {\n" +
|
||||
" h = m.elem, d = null;\n" +
|
||||
" if (g.preType === \"mouseenter\" || g.preType === \"mouseleave\") a.type = g.preType, d = f(a.relatedTarget).closest(g.selector)[0], d && f.contains(h, d) && (d = h);\n" +
|
||||
" (!d || d !== h) && p.push({\n" +
|
||||
" elem: h,\n" +
|
||||
" handleObj: g,\n" +
|
||||
" level: m.level\n" +
|
||||
" })\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" for (j = 0, k = p.length; j < k; j++) {\n" +
|
||||
" e = p[j];\n" +
|
||||
" if (c && e.level > c) break;\n" +
|
||||
" a.currentTarget = e.elem, a.data = e.handleObj.data, a.handleObj = e.handleObj, o = e.handleObj.origHandler.apply(e.elem, arguments);\n" +
|
||||
" if (o === !1 || a.isPropagationStopped()) {\n" +
|
||||
" c = e.level, o === !1 && (b = !1);\n" +
|
||||
" if (a.isImmediatePropagationStopped()) break\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" return b\n" +
|
||||
" }\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragstart",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":16",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "function M(a) {\n" +
|
||||
" var b, c, d, e, g, h, i, j, k, l, m, n, o, p = [],\n" +
|
||||
" q = [],\n" +
|
||||
" r = f._data(this, \"events\");\n" +
|
||||
" if (!(a.liveFired === this || !r || !r.live || a.target.disabled || a.button && a.type === \"click\")) {\n" +
|
||||
" a.namespace && (n = new RegExp(\"(^|\\\\.)\" + a.namespace.split(\".\").join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\")), a.liveFired = this;\n" +
|
||||
" var s = r.live.slice(0);\n" +
|
||||
" for (i = 0; i < s.length; i++) g = s[i], g.origType.replace(x, \"\") === a.type ? q.push(g.selector) : s.splice(i--, 1);\n" +
|
||||
" e = f(a.target).closest(q, a.currentTarget);\n" +
|
||||
" for (j = 0, k = e.length; j < k; j++) {\n" +
|
||||
" m = e[j];\n" +
|
||||
" for (i = 0; i < s.length; i++) {\n" +
|
||||
" g = s[i];\n" +
|
||||
" if (m.selector === g.selector && (!n || n.test(g.namespace)) && !m.elem.disabled) {\n" +
|
||||
" h = m.elem, d = null;\n" +
|
||||
" if (g.preType === \"mouseenter\" || g.preType === \"mouseleave\") a.type = g.preType, d = f(a.relatedTarget).closest(g.selector)[0], d && f.contains(h, d) && (d = h);\n" +
|
||||
" (!d || d !== h) && p.push({\n" +
|
||||
" elem: h,\n" +
|
||||
" handleObj: g,\n" +
|
||||
" level: m.level\n" +
|
||||
" })\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" for (j = 0, k = p.length; j < k; j++) {\n" +
|
||||
" e = p[j];\n" +
|
||||
" if (c && e.level > c) break;\n" +
|
||||
" a.currentTarget = e.elem, a.data = e.handleObj.data, a.handleObj = e.handleObj, o = e.handleObj.origHandler.apply(e.elem, arguments);\n" +
|
||||
" if (o === !1 || a.isPropagationStopped()) {\n" +
|
||||
" c = e.level, o === !1 && (b = !1);\n" +
|
||||
" if (a.isImmediatePropagationStopped()) break\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" return b\n" +
|
||||
" }\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragleave",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":16",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "function M(a) {\n" +
|
||||
" var b, c, d, e, g, h, i, j, k, l, m, n, o, p = [],\n" +
|
||||
" q = [],\n" +
|
||||
" r = f._data(this, \"events\");\n" +
|
||||
" if (!(a.liveFired === this || !r || !r.live || a.target.disabled || a.button && a.type === \"click\")) {\n" +
|
||||
" a.namespace && (n = new RegExp(\"(^|\\\\.)\" + a.namespace.split(\".\").join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\")), a.liveFired = this;\n" +
|
||||
" var s = r.live.slice(0);\n" +
|
||||
" for (i = 0; i < s.length; i++) g = s[i], g.origType.replace(x, \"\") === a.type ? q.push(g.selector) : s.splice(i--, 1);\n" +
|
||||
" e = f(a.target).closest(q, a.currentTarget);\n" +
|
||||
" for (j = 0, k = e.length; j < k; j++) {\n" +
|
||||
" m = e[j];\n" +
|
||||
" for (i = 0; i < s.length; i++) {\n" +
|
||||
" g = s[i];\n" +
|
||||
" if (m.selector === g.selector && (!n || n.test(g.namespace)) && !m.elem.disabled) {\n" +
|
||||
" h = m.elem, d = null;\n" +
|
||||
" if (g.preType === \"mouseenter\" || g.preType === \"mouseleave\") a.type = g.preType, d = f(a.relatedTarget).closest(g.selector)[0], d && f.contains(h, d) && (d = h);\n" +
|
||||
" (!d || d !== h) && p.push({\n" +
|
||||
" elem: h,\n" +
|
||||
" handleObj: g,\n" +
|
||||
" level: m.level\n" +
|
||||
" })\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" for (j = 0, k = p.length; j < k; j++) {\n" +
|
||||
" e = p[j];\n" +
|
||||
" if (c && e.level > c) break;\n" +
|
||||
" a.currentTarget = e.elem, a.data = e.handleObj.data, a.handleObj = e.handleObj, o = e.handleObj.origHandler.apply(e.elem, arguments);\n" +
|
||||
" if (o === !1 || a.isPropagationStopped()) {\n" +
|
||||
" c = e.level, o === !1 && (b = !1);\n" +
|
||||
" if (a.isImmediatePropagationStopped()) break\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" return b\n" +
|
||||
" }\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragend",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":16",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "function M(a) {\n" +
|
||||
" var b, c, d, e, g, h, i, j, k, l, m, n, o, p = [],\n" +
|
||||
" q = [],\n" +
|
||||
" r = f._data(this, \"events\");\n" +
|
||||
" if (!(a.liveFired === this || !r || !r.live || a.target.disabled || a.button && a.type === \"click\")) {\n" +
|
||||
" a.namespace && (n = new RegExp(\"(^|\\\\.)\" + a.namespace.split(\".\").join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\")), a.liveFired = this;\n" +
|
||||
" var s = r.live.slice(0);\n" +
|
||||
" for (i = 0; i < s.length; i++) g = s[i], g.origType.replace(x, \"\") === a.type ? q.push(g.selector) : s.splice(i--, 1);\n" +
|
||||
" e = f(a.target).closest(q, a.currentTarget);\n" +
|
||||
" for (j = 0, k = e.length; j < k; j++) {\n" +
|
||||
" m = e[j];\n" +
|
||||
" for (i = 0; i < s.length; i++) {\n" +
|
||||
" g = s[i];\n" +
|
||||
" if (m.selector === g.selector && (!n || n.test(g.namespace)) && !m.elem.disabled) {\n" +
|
||||
" h = m.elem, d = null;\n" +
|
||||
" if (g.preType === \"mouseenter\" || g.preType === \"mouseleave\") a.type = g.preType, d = f(a.relatedTarget).closest(g.selector)[0], d && f.contains(h, d) && (d = h);\n" +
|
||||
" (!d || d !== h) && p.push({\n" +
|
||||
" elem: h,\n" +
|
||||
" handleObj: g,\n" +
|
||||
" level: m.level\n" +
|
||||
" })\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" for (j = 0, k = p.length; j < k; j++) {\n" +
|
||||
" e = p[j];\n" +
|
||||
" if (c && e.level > c) break;\n" +
|
||||
" a.currentTarget = e.elem, a.data = e.handleObj.data, a.handleObj = e.handleObj, o = e.handleObj.origHandler.apply(e.elem, arguments);\n" +
|
||||
" if (o === !1 || a.isPropagationStopped()) {\n" +
|
||||
" c = e.level, o === !1 && (b = !1);\n" +
|
||||
" if (a.isImmediatePropagationStopped()) break\n" +
|
||||
" }\n" +
|
||||
" }\n" +
|
||||
" return b\n" +
|
||||
" }\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
];
|
||||
|
||||
let test = asyncTest(runEventPopupTests);
|
@ -0,0 +1,224 @@
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
// Test that markup view event bubbles show the correct event info for jQuery
|
||||
// and jQuery Live events (jQuery version 1.7).
|
||||
|
||||
const TEST_LIB = "lib_jquery_1.7_min.js";
|
||||
const TEST_URL = TEST_URL_ROOT + "doc_markup_events_jquery.html?" + TEST_LIB;
|
||||
|
||||
loadHelperScript("helper_events_test_runner.js");
|
||||
|
||||
const TEST_DATA = [
|
||||
{
|
||||
selector: "html",
|
||||
expected: [
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL + ":27",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "() => {\n" +
|
||||
" var handler1 = function liveDivDblClick() {\n" +
|
||||
" alert(1);\n" +
|
||||
" };\n" +
|
||||
" var handler2 = function liveDivDragStart() {\n" +
|
||||
" alert(2);\n" +
|
||||
" };\n" +
|
||||
" var handler3 = function liveDivDragLeave() {\n" +
|
||||
" alert(3);\n" +
|
||||
" };\n" +
|
||||
" var handler4 = function liveDivDragEnd() {\n" +
|
||||
" alert(4);\n" +
|
||||
" };\n" +
|
||||
" var handler5 = function liveDivDrop() {\n" +
|
||||
" alert(5);\n" +
|
||||
" };\n" +
|
||||
" var handler6 = function liveDivDragOver() {\n" +
|
||||
" alert(6);\n" +
|
||||
" };\n" +
|
||||
" var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
" };\n" +
|
||||
" var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
" };\n" +
|
||||
" var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
" };\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").live) {\n" +
|
||||
" $(\"#livediv\").live(\"dblclick\", handler1);\n" +
|
||||
" $(\"#livediv\").live(\"dragstart\", handler2);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").delegate) {\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragleave\", handler3);\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragend\", handler4);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").on) {\n" +
|
||||
" $(document).on(\"drop\", \"#livediv\", handler5);\n" +
|
||||
" $(document).on(\"dragover\", \"#livediv\", handler6);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" var div = $(\"div\")[0];\n" +
|
||||
" $(div).click(handler7);\n" +
|
||||
" $(div).click(handler8);\n" +
|
||||
" $(div).keydown(handler9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":2",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "ready: function(a) {\n" +
|
||||
" if (a === !0 && !--e.readyWait || a !== !0 && !e.isReady) {\n" +
|
||||
" if (!c.body) return setTimeout(e.ready, 1);\n" +
|
||||
" e.isReady = !0;\n" +
|
||||
" if (a !== !0 && --e.readyWait > 0) return;\n" +
|
||||
" B.fireWith(c, [e]), e.fn.trigger && e(c).trigger(\"ready\").unbind(\"ready\")\n" +
|
||||
" }\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#testdiv",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":34",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":35",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL + ":36",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":3",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "h.handle = i = function(a) {\n" +
|
||||
" return typeof f != \"undefined\" && (!a || f.event.triggered !== a.type) ? f.event.dispatch.apply(i.elem, arguments) : b\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":3",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "h.handle = i = function(a) {\n" +
|
||||
" return typeof f != \"undefined\" && (!a || f.event.triggered !== a.type) ? f.event.dispatch.apply(i.elem, arguments) : b\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#livediv",
|
||||
expected: [
|
||||
{
|
||||
type: "dblclick",
|
||||
filename: TEST_URL + ":28",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler1 = function liveDivDblClick() {\n" +
|
||||
" alert(1);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragstart",
|
||||
filename: TEST_URL + ":29",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler2 = function liveDivDragStart() {\n" +
|
||||
" alert(2);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragleave",
|
||||
filename: TEST_URL + ":30",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler3 = function liveDivDragLeave() {\n" +
|
||||
" alert(3);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragend",
|
||||
filename: TEST_URL + ":31",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler4 = function liveDivDragEnd() {\n" +
|
||||
" alert(4);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "drop",
|
||||
filename: TEST_URL + ":32",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler5 = function liveDivDrop() {\n" +
|
||||
" alert(5);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragover",
|
||||
filename: TEST_URL + ":33",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler6 = function liveDivDragOver() {\n" +
|
||||
" alert(6);\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
];
|
||||
|
||||
let test = asyncTest(runEventPopupTests);
|
@ -0,0 +1,186 @@
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
// Test that markup view event bubbles show the correct event info for jQuery
|
||||
// and jQuery Live events (jQuery version 2.1.1).
|
||||
|
||||
const TEST_LIB = "lib_jquery_2.1.1_min.js";
|
||||
const TEST_URL = TEST_URL_ROOT + "doc_markup_events_jquery.html?" + TEST_LIB;
|
||||
|
||||
loadHelperScript("helper_events_test_runner.js");
|
||||
|
||||
const TEST_DATA = [
|
||||
{
|
||||
selector: "html",
|
||||
expected: [
|
||||
{
|
||||
type: "load",
|
||||
filename: TEST_URL + ":27",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "() => {\n" +
|
||||
" var handler1 = function liveDivDblClick() {\n" +
|
||||
" alert(1);\n" +
|
||||
" };\n" +
|
||||
" var handler2 = function liveDivDragStart() {\n" +
|
||||
" alert(2);\n" +
|
||||
" };\n" +
|
||||
" var handler3 = function liveDivDragLeave() {\n" +
|
||||
" alert(3);\n" +
|
||||
" };\n" +
|
||||
" var handler4 = function liveDivDragEnd() {\n" +
|
||||
" alert(4);\n" +
|
||||
" };\n" +
|
||||
" var handler5 = function liveDivDrop() {\n" +
|
||||
" alert(5);\n" +
|
||||
" };\n" +
|
||||
" var handler6 = function liveDivDragOver() {\n" +
|
||||
" alert(6);\n" +
|
||||
" };\n" +
|
||||
" var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
" };\n" +
|
||||
" var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
" };\n" +
|
||||
" var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
" };\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").live) {\n" +
|
||||
" $(\"#livediv\").live(\"dblclick\", handler1);\n" +
|
||||
" $(\"#livediv\").live(\"dragstart\", handler2);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").delegate) {\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragleave\", handler3);\n" +
|
||||
" $(document).delegate(\"#livediv\", \"dragend\", handler4);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" if ($(\"#livediv\").on) {\n" +
|
||||
" $(document).on(\"drop\", \"#livediv\", handler5);\n" +
|
||||
" $(document).on(\"dragover\", \"#livediv\", handler6);\n" +
|
||||
" }\n" +
|
||||
"\n" +
|
||||
" var div = $(\"div\")[0];\n" +
|
||||
" $(div).click(handler7);\n" +
|
||||
" $(div).click(handler8);\n" +
|
||||
" $(div).keydown(handler9);\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#testdiv",
|
||||
expected: [
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":34",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler7 = function divClick1() {\n" +
|
||||
" alert(7);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL + ":35",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler8 = function divClick2() {\n" +
|
||||
" alert(8);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL + ":36",
|
||||
attributes: [
|
||||
"jQuery"
|
||||
],
|
||||
handler: "var handler9 = function divKeyDown() {\n" +
|
||||
" alert(9);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "click",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":3",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "g = r.handle = function(b) {\n" +
|
||||
" return typeof n !== U && n.event.triggered !== b.type ? n.event.dispatch.apply(a, arguments) : void 0\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "keydown",
|
||||
filename: TEST_URL_ROOT + TEST_LIB + ":3",
|
||||
attributes: [
|
||||
"Bubbling",
|
||||
"DOM2"
|
||||
],
|
||||
handler: "g = r.handle = function(b) {\n" +
|
||||
" return typeof n !== U && n.event.triggered !== b.type ? n.event.dispatch.apply(a, arguments) : void 0\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
selector: "#livediv",
|
||||
expected: [
|
||||
{
|
||||
type: "dragleave",
|
||||
filename: TEST_URL + ":30",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler3 = function liveDivDragLeave() {\n" +
|
||||
" alert(3);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragend",
|
||||
filename: TEST_URL + ":31",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler4 = function liveDivDragEnd() {\n" +
|
||||
" alert(4);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "drop",
|
||||
filename: TEST_URL + ":32",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler5 = function liveDivDrop() {\n" +
|
||||
" alert(5);\n" +
|
||||
"}"
|
||||
},
|
||||
{
|
||||
type: "dragover",
|
||||
filename: TEST_URL + ":33",
|
||||
attributes: [
|
||||
"jQuery",
|
||||
"Live"
|
||||
],
|
||||
handler: "var handler6 = function liveDivDragOver() {\n" +
|
||||
" alert(6);\n" +
|
||||
"}"
|
||||
}
|
||||
]
|
||||
},
|
||||
];
|
||||
|
||||
let test = asyncTest(runEventPopupTests);
|
@ -0,0 +1,65 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
|
||||
<style>
|
||||
input {
|
||||
margin: 5px 3px 10px 10px;
|
||||
}
|
||||
|
||||
div {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: 1px solid #000;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script type="application/javascript;version=1.8">
|
||||
let jq = document.location.search.substr(1);
|
||||
|
||||
let script = document.createElement("script");
|
||||
script.setAttribute("type", "text/javascript");
|
||||
script.setAttribute("src", jq);
|
||||
|
||||
document.head.appendChild(script);
|
||||
|
||||
window.addEventListener("load", () => {
|
||||
var handler1 = function liveDivDblClick() { alert(1); };
|
||||
var handler2 = function liveDivDragStart() { alert(2); };
|
||||
var handler3 = function liveDivDragLeave() { alert(3); };
|
||||
var handler4 = function liveDivDragEnd() { alert(4); };
|
||||
var handler5 = function liveDivDrop() { alert(5); };
|
||||
var handler6 = function liveDivDragOver() { alert(6); };
|
||||
var handler7 = function divClick1() { alert(7); };
|
||||
var handler8 = function divClick2() { alert(8); };
|
||||
var handler9 = function divKeyDown() { alert(9); };
|
||||
|
||||
if ($("#livediv").live) {
|
||||
$("#livediv").live( "dblclick", handler1);
|
||||
$("#livediv").live( "dragstart", handler2);
|
||||
}
|
||||
|
||||
if ($("#livediv").delegate) {
|
||||
$(document).delegate( "#livediv", "dragleave", handler3);
|
||||
$(document).delegate( "#livediv", "dragend", handler4);
|
||||
}
|
||||
|
||||
if ($("#livediv").on) {
|
||||
$(document).on( "drop", "#livediv", handler5);
|
||||
$(document).on( "dragover", "#livediv", handler6);
|
||||
}
|
||||
|
||||
var div = $("div")[0];
|
||||
$(div).click(handler7);
|
||||
$(div).click(handler8);
|
||||
$(div).keydown(handler9);
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="testdiv"></div>
|
||||
<br>
|
||||
<div id="livediv"></div>
|
||||
</body>
|
||||
</html>
|
@ -439,3 +439,13 @@ function wait(ms) {
|
||||
content.setTimeout(def.resolve, ms);
|
||||
return def.promise;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for all current promises to be resolved. See this as executeSoon that
|
||||
* can be used with yield.
|
||||
*/
|
||||
function promiseNextTick() {
|
||||
let deferred = promise.defer();
|
||||
executeSoon(deferred.resolve);
|
||||
return deferred.promise;
|
||||
}
|
||||
|
@ -0,0 +1,83 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/**
|
||||
* Generator function that runs checkEventsForNode() for each object in the
|
||||
* TEST_DATA array.
|
||||
*/
|
||||
function* runEventPopupTests() {
|
||||
let {inspector} = yield addTab(TEST_URL).then(openInspector);
|
||||
|
||||
yield inspector.markup.expandAll();
|
||||
|
||||
for (let {selector, expected} of TEST_DATA) {
|
||||
yield checkEventsForNode(selector, expected, inspector);
|
||||
}
|
||||
|
||||
gBrowser.removeCurrentTab();
|
||||
|
||||
// Wait for promises to avoid leaks when running this as a single test.
|
||||
// We need to do this because we have opened a bunch of popups and don't them
|
||||
// to affect other test runs when they are GCd.
|
||||
yield promiseNextTick();
|
||||
}
|
||||
|
||||
/**
|
||||
* Generator function that takes a selector and expected results and returns
|
||||
* the event info.
|
||||
*
|
||||
* @param {String} selector
|
||||
* Selector pointing at the node to be inspected
|
||||
*/
|
||||
function* checkEventsForNode(selector, expected, inspector) {
|
||||
let container = yield getContainerForSelector(selector, inspector);
|
||||
let evHolder = container.elt.querySelector(".markupview-events");
|
||||
let tooltip = inspector.markup.tooltip;
|
||||
|
||||
yield selectNode(selector, inspector);
|
||||
|
||||
// Click button to show tooltip
|
||||
info("Clicking evHolder");
|
||||
EventUtils.synthesizeMouseAtCenter(evHolder, {}, inspector.markup.doc.defaultView);
|
||||
yield tooltip.once("shown");
|
||||
info("tooltip shown");
|
||||
|
||||
// Check values
|
||||
let content = tooltip.content;
|
||||
let headers = content.querySelectorAll(".event-header");
|
||||
let nodeFront = container.node;
|
||||
let cssSelector = nodeFront.nodeName + "#" + nodeFront.id;
|
||||
|
||||
for (let i = 0; i < headers.length; i++) {
|
||||
info("Processing header[" + i + "] for " + cssSelector);
|
||||
|
||||
let header = headers[i];
|
||||
let type = header.querySelector(".event-tooltip-event-type");
|
||||
let filename = header.querySelector(".event-tooltip-filename");
|
||||
let attributes = header.querySelectorAll(".event-tooltip-attributes");
|
||||
let contentBox = header.nextElementSibling;
|
||||
|
||||
is(type.getAttribute("value"), expected[i].type,
|
||||
"type matches for " + cssSelector);
|
||||
is(filename.getAttribute("value"), expected[i].filename,
|
||||
"filename matches for " + cssSelector);
|
||||
|
||||
is(attributes.length, expected[i].attributes.length,
|
||||
"we have the correct number of attributes");
|
||||
|
||||
for (let j = 0; j < expected[i].attributes.length; j++) {
|
||||
is(attributes[j].getAttribute("value"), expected[i].attributes[j],
|
||||
"attribute[" + j + "] matches for " + cssSelector);
|
||||
}
|
||||
|
||||
EventUtils.synthesizeMouseAtCenter(header, {}, type.ownerGlobal);
|
||||
yield tooltip.once("event-tooltip-ready");
|
||||
|
||||
let editor = tooltip.eventEditors.get(contentBox).editor;
|
||||
is(editor.getText(), expected[i].handler,
|
||||
"handler matches for " + cssSelector);
|
||||
}
|
||||
|
||||
tooltip.hide();
|
||||
}
|
1814
browser/devtools/markupview/test/lib_jquery_1.0.js
Normal file
1814
browser/devtools/markupview/test/lib_jquery_1.0.js
Normal file
File diff suppressed because it is too large
Load Diff
2172
browser/devtools/markupview/test/lib_jquery_1.1.js
Normal file
2172
browser/devtools/markupview/test/lib_jquery_1.1.js
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
32
browser/devtools/markupview/test/lib_jquery_1.2_min.js
Normal file
32
browser/devtools/markupview/test/lib_jquery_1.2_min.js
Normal file
File diff suppressed because one or more lines are too long
19
browser/devtools/markupview/test/lib_jquery_1.3_min.js
Normal file
19
browser/devtools/markupview/test/lib_jquery_1.3_min.js
Normal file
File diff suppressed because one or more lines are too long
151
browser/devtools/markupview/test/lib_jquery_1.4_min.js
Normal file
151
browser/devtools/markupview/test/lib_jquery_1.4_min.js
Normal file
@ -0,0 +1,151 @@
|
||||
/*!
|
||||
* jQuery JavaScript Library v1.4
|
||||
* http://jquery.com/
|
||||
*
|
||||
* Copyright 2010, John Resig
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://docs.jquery.com/License
|
||||
*
|
||||
* Includes Sizzle.js
|
||||
* http://sizzlejs.com/
|
||||
* Copyright 2010, The Dojo Foundation
|
||||
* Released under the MIT, BSD, and GPL Licenses.
|
||||
*
|
||||
* Date: Wed Jan 13 15:23:05 2010 -0500
|
||||
*/
|
||||
(function(A,w){function oa(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(oa,1);return}c.ready()}}function La(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function $(a,b,d,f,e,i){var j=a.length;if(typeof b==="object"){for(var o in b)$(a,o,b[o],f,e,d);return a}if(d!==w){f=!i&&f&&c.isFunction(d);for(o=0;o<j;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,i);return a}return j?
|
||||
e(a[0],b):null}function K(){return(new Date).getTime()}function aa(){return false}function ba(){return true}function pa(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function qa(a){var b=true,d=[],f=[],e=arguments,i,j,o,p,n,t=c.extend({},c.data(this,"events").live);for(p in t){j=t[p];if(j.live===a.type||j.altLive&&c.inArray(a.type,j.altLive)>-1){i=j.data;i.beforeFilter&&i.beforeFilter[a.type]&&!i.beforeFilter[a.type](a)||f.push(j.selector)}else delete t[p]}i=c(a.target).closest(f,a.currentTarget);
|
||||
n=0;for(l=i.length;n<l;n++)for(p in t){j=t[p];o=i[n].elem;f=null;if(i[n].selector===j.selector){if(j.live==="mouseenter"||j.live==="mouseleave")f=c(a.relatedTarget).closest(j.selector)[0];if(!f||f!==o)d.push({elem:o,fn:j})}}n=0;for(l=d.length;n<l;n++){i=d[n];a.currentTarget=i.elem;a.data=i.fn.data;if(i.fn.apply(i.elem,e)===false){b=false;break}}return b}function ra(a,b){return["live",a,b.replace(/\./g,"`").replace(/ /g,"&")].join(".")}function sa(a){return!a||!a.parentNode||a.parentNode.nodeType===
|
||||
11}function ta(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var i in f)for(var j in f[i])c.event.add(this,i,f[i][j],f[i][j].data)}}})}function ua(a,b,d){var f,e,i;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&a[0].indexOf("<option")<0){e=true;if(i=c.fragments[a[0]])if(i!==1)f=i}if(!f){b=b&&b[0]?b[0].ownerDocument||b[0]:s;f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=
|
||||
i?f:1;return{fragment:f,cacheable:e}}function T(a){for(var b=0,d,f;(d=a[b])!=null;b++)if(!c.noData[d.nodeName.toLowerCase()]&&(f=d[H]))delete c.cache[f]}function L(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ma=A.jQuery,Na=A.$,s=A.document,U,Oa=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Pa=/^.[^:#\[\.,]*$/,Qa=/\S/,
|
||||
Ra=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Sa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],M,ca=Object.prototype.toString,da=Object.prototype.hasOwnProperty,ea=Array.prototype.push,R=Array.prototype.slice,V=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(typeof a==="string")if((d=Oa.exec(a))&&(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Sa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];
|
||||
c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=ua([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return U.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a)}else return!b||b.jquery?(b||U).find(a):c(b).find(a);else if(c.isFunction(a))return U.ready(a);if(a.selector!==w){this.selector=a.selector;
|
||||
this.context=a.context}return c.isArray(a)?this.setArray(a):c.makeArray(a,this)},selector:"",jquery:"1.4",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){a=c(a||null);a.prevObject=this;a.context=this.context;if(b==="find")a.selector=this.selector+(this.selector?" ":"")+d;else if(b)a.selector=this.selector+"."+b+"("+d+")";return a},setArray:function(a){this.length=
|
||||
0;ea.apply(this,a);return this},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||
|
||||
c(null)},push:ea,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,i,j,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(i in e){j=a[i];o=e[i];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){j=j&&(c.isPlainObject(j)||c.isArray(j))?j:c.isArray(o)?[]:{};a[i]=c.extend(f,j,o)}else if(o!==w)a[i]=
|
||||
o}return a};c.extend({noConflict:function(a){A.$=Na;if(a)A.jQuery=Ma;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",M,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",
|
||||
M);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&oa()}}},isFunction:function(a){return ca.call(a)==="[object Function]"},isArray:function(a){return ca.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||ca.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!da.call(a,"constructor")&&!da.call(a.constructor.prototype,"isPrototypeOf"))return false;var b;for(b in a);return b===w||da.call(a,b)},
|
||||
isEmptyObject:function(a){for(var b in a)return false;return true},noop:function(){},globalEval:function(a){if(a&&Qa.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,i=a.length,j=i===w||c.isFunction(a);
|
||||
if(d)if(j)for(f in a){if(b.apply(a[f],d)===false)break}else for(;e<i;){if(b.apply(a[e++],d)===false)break}else if(j)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<i&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Ra,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ea.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=
|
||||
0,f=b.length;d<f;d++)if(b[d]===a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,i=a.length;e<i;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,i=0,j=a.length;i<j;i++){e=b(a[i],i,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b===
|
||||
"string"){d=a;a=d[b];b=w}else if(b&&!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){var b={browser:""};a=a.toLowerCase();if(/webkit/.test(a))b={browser:"webkit",version:/webkit[\/ ]([\w.]+)/};else if(/opera/.test(a))b={browser:"opera",version:/version/.test(a)?/version[\/ ]([\w.]+)/:/opera[\/ ]([\w.]+)/};else if(/msie/.test(a))b={browser:"msie",version:/msie ([\w.]+)/};else if(/mozilla/.test(a)&&
|
||||
!/compatible/.test(a))b={browser:"mozilla",version:/rv:([\w.]+)/};b.version=(b.version&&b.version.exec(a)||[0,"0"])[1];return b},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=true;if(V)c.inArray=function(a,b){return V.call(b,a)};U=c(s);if(s.addEventListener)M=function(){s.removeEventListener("DOMContentLoaded",M,false);c.ready()};else if(s.attachEvent)M=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",
|
||||
M);c.ready()}};if(V)c.inArray=function(a,b){return V.call(b,a)};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+K();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=d.getElementsByTagName("*"),i=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!i)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,
|
||||
htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(i.getAttribute("style")),hrefNormalized:i.getAttribute("href")==="/a",opacity:/^0.55$/.test(i.style.opacity),cssFloat:!!i.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(j){}a.insertBefore(b,
|
||||
a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function o(){c.support.noCloneEvent=false;d.detachEvent("onclick",o)});d.cloneNode(true).fireEvent("onclick")}c(function(){var o=s.createElement("div");o.style.width=o.style.paddingLeft="1px";s.body.appendChild(o);c.boxModel=c.support.boxModel=o.offsetWidth===2;s.body.removeChild(o).style.display="none"});a=function(o){var p=s.createElement("div");o="on"+o;var n=o in
|
||||
p;if(!n){p.setAttribute(o,"return;");n=typeof p[o]==="function"}return n};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=i=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var H="jQuery"+K(),Ta=0,ya={},Ua={};c.extend({cache:{},expando:H,noData:{embed:true,object:true,applet:true},data:function(a,
|
||||
b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?ya:a;var f=a[H],e=c.cache;if(!b&&!f)return null;f||(f=++Ta);if(typeof b==="object"){a[H]=f;e=e[f]=c.extend(true,{},b)}else e=e[f]?e[f]:typeof d==="undefined"?Ua:(e[f]={});if(d!==w){a[H]=f;e[b]=d}return typeof b==="string"?e[b]:e}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?ya:a;var d=a[H],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{try{delete a[H]}catch(i){a.removeAttribute&&
|
||||
a.removeAttribute(H)}delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,
|
||||
a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,
|
||||
a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var za=/[\n\t]/g,fa=/\s+/,Va=/\r/g,Wa=/href|src|style/,Xa=/(button|input)/i,Ya=/(button|input|object|select|textarea)/i,Za=/^(a|area)$/i,Aa=/radio|checkbox/;c.fn.extend({attr:function(a,
|
||||
b){return $(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(p){var n=c(this);n.addClass(a.call(this,p,n.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(fa),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className)for(var i=" "+e.className+" ",j=0,o=b.length;j<o;j++){if(i.indexOf(" "+b[j]+" ")<0)e.className+=
|
||||
" "+b[j]}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(p){var n=c(this);n.removeClass(a.call(this,p,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(fa),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var i=(" "+e.className+" ").replace(za," "),j=0,o=b.length;j<o;j++)i=i.replace(" "+b[j]+" "," ");e.className=i.substring(1,i.length-1)}else e.className=""}return this},toggleClass:function(a,
|
||||
b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var i=c(this);i.toggleClass(a.call(this,e,i.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,i=0,j=c(this),o=b,p=a.split(fa);e=p[i++];){o=f?o:!j.hasClass(e);j[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=
|
||||
" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(za," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var i=b?d:0;for(d=b?d+1:e.length;i<d;i++){var j=e[i];if(j.selected){a=c(j).val();if(b)return a;f.push(a)}}return f}if(Aa.test(b.type)&&
|
||||
!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Va,"")}return w}var o=c.isFunction(a);return this.each(function(p){var n=c(this),t=a;if(this.nodeType===1){if(o)t=a.call(this,p,n.val());if(typeof t==="number")t+="";if(c.isArray(t)&&Aa.test(this.type))this.checked=c.inArray(n.val(),t)>=0;else if(c.nodeName(this,"select")){var z=c.makeArray(t);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),z)>=0});if(!z.length)this.selectedIndex=
|
||||
-1}else this.value=t}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var i=Wa.test(b);if(b in a&&f&&!i){if(e){if(b==="type"&&Xa.test(a.nodeName)&&a.parentNode)throw"type property can't be changed";a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;
|
||||
if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Ya.test(a.nodeName)||Za.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&i?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var $a=function(a){return a.replace(/[^\w\s\.\|`]/g,function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===
|
||||
3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;if(!d.guid)d.guid=c.guid++;if(f!==w){d=c.proxy(d);d.data=f}var e=c.data(a,"events")||c.data(a,"events",{}),i=c.data(a,"handle"),j;if(!i){j=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(j.elem,arguments):w};i=c.data(a,"handle",j)}if(i){i.elem=a;b=b.split(/\s+/);for(var o,p=0;o=b[p++];){var n=o.split(".");o=n.shift();d.type=n.slice(0).sort().join(".");var t=e[o],z=this.special[o]||{};if(!t){t=e[o]={};
|
||||
if(!z.setup||z.setup.call(a,f,n,d)===false)if(a.addEventListener)a.addEventListener(o,i,false);else a.attachEvent&&a.attachEvent("on"+o,i)}if(z.add)if((n=z.add.call(a,d,f,n,t))&&c.isFunction(n)){n.guid=n.guid||d.guid;d=n}t[d.guid]=d;this.global[o]=true}a=null}}},global:{},remove:function(a,b,d){if(!(a.nodeType===3||a.nodeType===8)){var f=c.data(a,"events"),e,i,j;if(f){if(b===w||typeof b==="string"&&b.charAt(0)===".")for(i in f)this.remove(a,i+(b||""));else{if(b.type){d=b.handler;b=b.type}b=b.split(/\s+/);
|
||||
for(var o=0;i=b[o++];){var p=i.split(".");i=p.shift();var n=!p.length,t=c.map(p.slice(0).sort(),$a);t=new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.)?")+"(\\.|$)");var z=this.special[i]||{};if(f[i]){if(d){j=f[i][d.guid];delete f[i][d.guid]}else for(var B in f[i])if(n||t.test(f[i][B].type))delete f[i][B];z.remove&&z.remove.call(a,p,j);for(e in f[i])break;if(!e){if(!z.teardown||z.teardown.call(a,p)===false)if(a.removeEventListener)a.removeEventListener(i,c.data(a,"handle"),false);else a.detachEvent&&a.detachEvent("on"+
|
||||
i,c.data(a,"handle"));e=null;delete f[i]}}}}for(e in f)break;if(!e){if(B=c.data(a,"handle"))B.elem=null;c.removeData(a,"events");c.removeData(a,"handle")}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[H]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();this.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
|
||||
8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;var i=c.data(d,"handle");i&&i.apply(d,b);var j,o;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()])){j=d[e];o=d["on"+e]}}catch(p){}i=c.nodeName(d,"a")&&e==="click";if(!f&&j&&!a.isDefaultPrevented()&&!i){this.triggered=true;try{d[e]()}catch(n){}}else if(o&&d["on"+e].apply(d,b)===false)a.result=false;this.triggered=false;if(!a.isPropagationStopped())(d=d.parentNode||d.ownerDocument)&&c.event.trigger(a,b,d,true)},
|
||||
handle:function(a){var b,d;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;d=a.type.split(".");a.type=d.shift();b=!d.length&&!a.exclusive;var f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)");d=(c.data(this,"events")||{})[a.type];for(var e in d){var i=d[e];if(b||f.test(i.type)){a.handler=i;a.data=i.data;i=i.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}return a.result},
|
||||
props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[H])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||
|
||||
s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&
|
||||
a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a,b){c.extend(a,b||{});a.guid+=b.selector+b.live;c.event.add(this,b.live,qa,b)},remove:function(a){if(a.length){var b=0,d=new RegExp("(^|\\.)"+a[0]+"(\\.|$)");c.each(c.data(this,"events").live||{},function(){d.test(this.type)&&b++});b<1&&c.event.remove(this,a[0],qa)}},special:{}},beforeunload:{setup:function(a,
|
||||
b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=K();this[H]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ba;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=
|
||||
ba;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ba;this.stopPropagation()},isDefaultPrevented:aa,isPropagationStopped:aa,isImmediatePropagationStopped:aa};var Ba=function(a){for(var b=a.relatedTarget;b&&b!==this;)try{b=b.parentNode}catch(d){break}if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}},Ca=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",
|
||||
mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ca:Ba,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ca:Ba)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(a,b,d){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="submit"||i==="image")&&c(e).closest("form").length)return pa("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit."+
|
||||
d.guid,function(f){var e=f.target,i=e.type;if((i==="text"||i==="password")&&c(e).closest("form").length&&f.keyCode===13)return pa("submit",this,arguments)})}else return false},remove:function(a,b){c.event.remove(this,"click.specialSubmit"+(b?"."+b.guid:""));c.event.remove(this,"keypress.specialSubmit"+(b?"."+b.guid:""))}};if(!c.support.changeBubbles){var ga=/textarea|input|select/i;function Da(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>
|
||||
-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d}function ha(a,b){var d=a.target,f,e;if(!(!ga.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Da(d);if(e!==f){if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",e);if(d.type!=="select"&&(f!=null||e)){a.type="change";return c.event.trigger(a,b,this)}}}}c.event.special.change={filters:{focusout:ha,click:function(a){var b=a.target,d=b.type;if(d===
|
||||
"radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return ha.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return ha.call(this,a)},beforeactivate:function(a){a=a.target;a.nodeName.toLowerCase()==="input"&&a.type==="radio"&&c.data(a,"_change_data",Da(a))}},setup:function(a,b,d){for(var f in W)c.event.add(this,f+".specialChange."+d.guid,W[f]);return ga.test(this.nodeName)},
|
||||
remove:function(a,b){for(var d in W)c.event.remove(this,d+".specialChange"+(b?"."+b.guid:""),W[d]);return ga.test(this.nodeName)}};var W=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,
|
||||
f,e){if(typeof d==="object"){for(var i in d)this[b](i,f,d[i],e);return this}if(c.isFunction(f)){thisObject=e;e=f;f=w}var j=b==="one"?c.proxy(e,function(o){c(this).unbind(o,j);return e.apply(this,arguments)}):e;return d==="unload"&&b!=="one"?this.one(d,f,e,thisObject):this.each(function(){c.event.add(this,d,j,f)})}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault){for(var d in a)this.unbind(d,a[d]);return this}return this.each(function(){c.event.remove(this,a,b)})},trigger:function(a,
|
||||
b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||
|
||||
a)},live:function(a,b,d){if(c.isFunction(b)){d=b;b=w}c(this.context).bind(ra(a,this.selector),{data:b,selector:this.selector,live:a},d);return this},die:function(a,b){c(this.context).unbind(ra(a,this.selector),b?{guid:b.guid+this.selector+a}:null);return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d){return d?
|
||||
this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",k,m=0;g[m];m++){k=g[m];if(k.nodeType===3||k.nodeType===4)h+=k.nodeValue;else if(k.nodeType!==8)h+=a(k.childNodes)}return h}function b(g,h,k,m,r,q){r=0;for(var v=m.length;r<v;r++){var u=m[r];if(u){u=u[g];for(var y=false;u;){if(u.sizcache===
|
||||
k){y=m[u.sizset];break}if(u.nodeType===1&&!q){u.sizcache=k;u.sizset=r}if(u.nodeName.toLowerCase()===h){y=u;break}u=u[g]}m[r]=y}}}function d(g,h,k,m,r,q){r=0;for(var v=m.length;r<v;r++){var u=m[r];if(u){u=u[g];for(var y=false;u;){if(u.sizcache===k){y=m[u.sizset];break}if(u.nodeType===1){if(!q){u.sizcache=k;u.sizset=r}if(typeof h!=="string"){if(u===h){y=true;break}}else if(p.filter(h,[u]).length>0){y=u;break}}u=u[g]}m[r]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
|
||||
e=0,i=Object.prototype.toString,j=false,o=true;[0,0].sort(function(){o=false;return 0});var p=function(g,h,k,m){k=k||[];var r=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return k;for(var q=[],v,u,y,S,I=true,N=x(h),J=g;(f.exec(""),v=f.exec(J))!==null;){J=v[3];q.push(v[1]);if(v[2]){S=v[3];break}}if(q.length>1&&t.exec(g))if(q.length===2&&n.relative[q[0]])u=ia(q[0]+q[1],h);else for(u=n.relative[q[0]]?[h]:p(q.shift(),h);q.length;){g=q.shift();if(n.relative[g])g+=q.shift();
|
||||
u=ia(g,u)}else{if(!m&&q.length>1&&h.nodeType===9&&!N&&n.match.ID.test(q[0])&&!n.match.ID.test(q[q.length-1])){v=p.find(q.shift(),h,N);h=v.expr?p.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:q.pop(),set:B(m)}:p.find(q.pop(),q.length===1&&(q[0]==="~"||q[0]==="+")&&h.parentNode?h.parentNode:h,N);u=v.expr?p.filter(v.expr,v.set):v.set;if(q.length>0)y=B(u);else I=false;for(;q.length;){var E=q.pop();v=E;if(n.relative[E])v=q.pop();else E="";if(v==null)v=h;n.relative[E](y,v,N)}}else y=[]}y||(y=u);if(!y)throw"Syntax error, unrecognized expression: "+
|
||||
(E||g);if(i.call(y)==="[object Array]")if(I)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&F(h,y[g])))k.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&k.push(u[g]);else k.push.apply(k,y);else B(y,k);if(S){p(S,r,k,m);p.uniqueSort(k)}return k};p.uniqueSort=function(g){if(D){j=o;g.sort(D);if(j)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};p.matches=function(g,h){return p(g,null,null,h)};p.find=function(g,h,k){var m,r;if(!g)return[];
|
||||
for(var q=0,v=n.order.length;q<v;q++){var u=n.order[q];if(r=n.leftMatch[u].exec(g)){var y=r[1];r.splice(1,1);if(y.substr(y.length-1)!=="\\"){r[1]=(r[1]||"").replace(/\\/g,"");m=n.find[u](r,h,k);if(m!=null){g=g.replace(n.match[u],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};p.filter=function(g,h,k,m){for(var r=g,q=[],v=h,u,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var I in n.filter)if((u=n.leftMatch[I].exec(g))!=null&&u[2]){var N=n.filter[I],J,E;E=u[1];y=false;u.splice(1,1);if(E.substr(E.length-
|
||||
1)!=="\\"){if(v===q)q=[];if(n.preFilter[I])if(u=n.preFilter[I](u,v,k,q,m,S)){if(u===true)continue}else y=J=true;if(u)for(var X=0;(E=v[X])!=null;X++)if(E){J=N(E,u,X,v);var Ea=m^!!J;if(k&&J!=null)if(Ea)y=true;else v[X]=false;else if(Ea){q.push(E);y=true}}if(J!==w){k||(v=q);g=g.replace(n.match[I],"");if(!y)return[];break}}}if(g===r)if(y==null)throw"Syntax error, unrecognized expression: "+g;else break;r=g}return v};var n=p.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
|
||||
CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
|
||||
relative:{"+":function(g,h){var k=typeof h==="string",m=k&&!/\W/.test(h);k=k&&!m;if(m)h=h.toLowerCase();m=0;for(var r=g.length,q;m<r;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=k||q&&q.nodeName.toLowerCase()===h?q||false:q===h}k&&p.filter(h,g,true)},">":function(g,h){var k=typeof h==="string";if(k&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,r=g.length;m<r;m++){var q=g[m];if(q){k=q.parentNode;g[m]=k.nodeName.toLowerCase()===h?k:false}}}else{m=0;for(r=g.length;m<r;m++)if(q=g[m])g[m]=
|
||||
k?q.parentNode:q.parentNode===h;k&&p.filter(h,g,true)}},"":function(g,h,k){var m=e++,r=d;if(typeof h==="string"&&!/\W/.test(h)){var q=h=h.toLowerCase();r=b}r("parentNode",h,m,g,q,k)},"~":function(g,h,k){var m=e++,r=d;if(typeof h==="string"&&!/\W/.test(h)){var q=h=h.toLowerCase();r=b}r("previousSibling",h,m,g,q,k)}},find:{ID:function(g,h,k){if(typeof h.getElementById!=="undefined"&&!k)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var k=[];
|
||||
h=h.getElementsByName(g[1]);for(var m=0,r=h.length;m<r;m++)h[m].getAttribute("name")===g[1]&&k.push(h[m]);return k.length===0?null:k}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,k,m,r,q){g=" "+g[1].replace(/\\/g,"")+" ";if(q)return g;q=0;for(var v;(v=h[q])!=null;q++)if(v)if(r^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))k||m.push(v);else if(k)h[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
|
||||
CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,k,m,r,q){h=g[1].replace(/\\/g,"");if(!q&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,k,m,r){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=p(g[3],null,null,h);else{g=p.filter(g[3],h,k,true^r);k||m.push.apply(m,
|
||||
g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,k){return!!p(k[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
|
||||
text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
|
||||
setFilters:{first:function(g,h){return h===0},last:function(g,h,k,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,k){return h<k[3]-0},gt:function(g,h,k){return h>k[3]-0},nth:function(g,h,k){return k[3]-0===h},eq:function(g,h,k){return k[3]-0===h}},filter:{PSEUDO:function(g,h,k,m){var r=h[1],q=n.filters[r];if(q)return q(g,k,h,m);else if(r==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(r==="not"){h=
|
||||
h[3];k=0;for(m=h.length;k<m;k++)if(h[k]===g)return false;return true}else throw"Syntax error, unrecognized expression: "+r;},CHILD:function(g,h){var k=h[1],m=g;switch(k){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(k==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":k=h[2];var r=h[3];if(k===1&&r===0)return true;h=h[0];var q=g.parentNode;if(q&&(q.sizcache!==h||!g.nodeIndex)){var v=0;for(m=q.firstChild;m;m=
|
||||
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;q.sizcache=h}g=g.nodeIndex-r;return k===0?g===0:g%k===0&&g/k>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var k=h[1];g=n.attrHandle[k]?n.attrHandle[k](g):g[k]!=null?g[k]:g.getAttribute(k);k=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
|
||||
"="?k===h:m==="*="?k.indexOf(h)>=0:m==="~="?(" "+k+" ").indexOf(h)>=0:!h?k&&g!==false:m==="!="?k!==h:m==="^="?k.indexOf(h)===0:m==="$="?k.substr(k.length-h.length)===h:m==="|="?k===h||k.substr(0,h.length+1)===h+"-":false},POS:function(g,h,k,m){var r=n.setFilters[h[2]];if(r)return r(g,k,h,m)}}},t=n.match.POS;for(var z in n.match){n.match[z]=new RegExp(n.match[z].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[z]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[z].source.replace(/\\(\d+)/g,function(g,
|
||||
h){return"\\"+(h-0+1)}))}var B=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){B=function(g,h){h=h||[];if(i.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var k=0,m=g.length;k<m;k++)h.push(g[k]);else for(k=0;g[k];k++)h.push(g[k]);return h}}var D;if(s.documentElement.compareDocumentPosition)D=function(g,h){if(!g.compareDocumentPosition||
|
||||
!h.compareDocumentPosition){if(g==h)j=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)j=true;return g};else if("sourceIndex"in s.documentElement)D=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)j=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)j=true;return g};else if(s.createRange)D=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)j=true;return g.ownerDocument?-1:1}var k=g.ownerDocument.createRange(),m=
|
||||
h.ownerDocument.createRange();k.setStart(g,0);k.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=k.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)j=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var k=s.documentElement;k.insertBefore(g,k.firstChild);if(s.getElementById(h)){n.find.ID=function(m,r,q){if(typeof r.getElementById!=="undefined"&&!q)return(r=r.getElementById(m[1]))?r.id===m[1]||typeof r.getAttributeNode!=="undefined"&&
|
||||
r.getAttributeNode("id").nodeValue===m[1]?[r]:w:[]};n.filter.ID=function(m,r){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===r}}k.removeChild(g);k=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,k){k=k.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;k[m];m++)k[m].nodeType===1&&h.push(k[m]);k=h}return k};g.innerHTML="<a href='#'></a>";
|
||||
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=p,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){p=function(m,r,q,v){r=r||s;if(!v&&r.nodeType===9&&!x(r))try{return B(r.querySelectorAll(m),q)}catch(u){}return g(m,r,q,v)};for(var k in g)p[k]=g[k];h=null}}();
|
||||
(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,k,m){if(typeof k.getElementsByClassName!=="undefined"&&!m)return k.getElementsByClassName(h[1])};g=null}}})();var F=s.compareDocumentPosition?function(g,h){return g.compareDocumentPosition(h)&16}:function(g,
|
||||
h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ia=function(g,h){var k=[],m="",r;for(h=h.nodeType?[h]:h;r=n.match.PSEUDO.exec(g);){m+=r[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;r=0;for(var q=h.length;r<q;r++)p(g,h[r],k);return p.filter(m,k)};c.find=p;c.expr=p.selectors;c.expr[":"]=c.expr.filters;c.unique=p.uniqueSort;c.getText=a;c.isXMLDoc=x;c.contains=F})();var ab=/Until$/,bb=/^(?:parents|prevUntil|prevAll)/,
|
||||
cb=/,/;R=Array.prototype.slice;var Fa=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,i){return!!b.call(e,i,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Pa.test(b))return c.filter(b,f,!d);else b=c.filter(b,a)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
|
||||
c.find(a,this[f],b);if(f>0)for(var i=d;i<b.length;i++)for(var j=0;j<d;j++)if(b[j]===b[i]){b.splice(i--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Fa(this,a,false),"not",a)},filter:function(a){return this.pushStack(Fa(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,i=
|
||||
{},j;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){j=a[e];i[j]||(i[j]=c.expr.match.POS.test(j)?c(j,b||this.context):j)}for(;f&&f.ownerDocument&&f!==b;){for(j in i){e=i[j];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:j,elem:f});delete i[j]}}f=f.parentNode}}return d}var p=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,t){for(;t&&t.ownerDocument&&t!==b;){if(p?p.index(t)>-1:c(t).is(a))return t;t=t.parentNode}return null})},index:function(a){if(!a||typeof a===
|
||||
"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(sa(a[0])||sa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
|
||||
d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
|
||||
a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);ab.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||cb.test(f))&&bb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||!c(a).is(d));){a.nodeType===
|
||||
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ga=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,db=/(<([\w:]+)[^>]*?)\/>/g,eb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,Ha=/<([\w:]+)/,fb=/<tbody/i,gb=/<|&\w+;/,hb=function(a,b,d){return eb.test(d)?a:b+"></"+d+">"},G={option:[1,"<select multiple='multiple'>","</select>"],
|
||||
legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};G.optgroup=G.option;G.tbody=G.tfoot=G.colgroup=G.caption=G.thead;G.th=G.td;if(!c.support.htmlSerialize)G._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);
|
||||
return d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.getText(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
|
||||
wrapInner:function(a){return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&
|
||||
this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,
|
||||
"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ga,"").replace(Y,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ta(this,b);ta(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===
|
||||
1?this[0].innerHTML.replace(Ga,""):null;else if(typeof a==="string"&&!/<script/i.test(a)&&(c.support.leadingWhitespace||!Y.test(a))&&!G[(Ha.exec(a)||["",""])[1].toLowerCase()])try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){T(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}else c.isFunction(a)?this.each(function(e){var i=c(this),j=i.html();i.empty().append(function(){return a.call(this,e,j)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
|
||||
this[0].parentNode){c.isFunction(a)||(a=c(a).detach());return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(t){return c.nodeName(t,"table")?t.getElementsByTagName("tbody")[0]||t.appendChild(t.ownerDocument.createElement("tbody")):t}var e,i,j=a[0],o=[];if(c.isFunction(j))return this.each(function(t){var z=
|
||||
c(this);a[0]=j.call(this,t,b?z.html():w);return z.domManip(a,b,d)});if(this[0]){e=a[0]&&a[0].parentNode&&a[0].parentNode.nodeType===11?{fragment:a[0].parentNode}:ua(a,this,o);if(i=e.fragment.firstChild){b=b&&c.nodeName(i,"tr");for(var p=0,n=this.length;p<n;p++)d.call(b?f(this[p],i):this[p],e.cacheable||this.length>1||p>0?e.fragment.cloneNode(true):e.fragment)}o&&c.each(o,La)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},
|
||||
function(a,b){c.fn[a]=function(d){var f=[];d=c(d);for(var e=0,i=d.length;e<i;e++){var j=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),j);f=f.concat(j)}return this.pushStack(f,a,d.selector)}});c.each({remove:function(a,b){if(!a||c.filter(a,[this]).length){if(!b&&this.nodeType===1){T(this.getElementsByTagName("*"));T([this])}this.parentNode&&this.parentNode.removeChild(this)}},empty:function(){for(this.nodeType===1&&T(this.getElementsByTagName("*"));this.firstChild;)this.removeChild(this.firstChild)}},
|
||||
function(a,b){c.fn[a]=function(){return this.each(b,arguments)}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;var e=[];c.each(a,function(i,j){if(typeof j==="number")j+="";if(j){if(typeof j==="string"&&!gb.test(j))j=b.createTextNode(j);else if(typeof j==="string"){j=j.replace(db,hb);var o=(Ha.exec(j)||["",""])[1].toLowerCase(),p=G[o]||G._default,n=p[0];i=b.createElement("div");for(i.innerHTML=p[1]+j+p[2];n--;)i=i.lastChild;
|
||||
if(!c.support.tbody){n=fb.test(j);o=o==="table"&&!n?i.firstChild&&i.firstChild.childNodes:p[1]==="<table>"&&!n?i.childNodes:[];for(p=o.length-1;p>=0;--p)c.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!c.support.leadingWhitespace&&Y.test(j)&&i.insertBefore(b.createTextNode(Y.exec(j)[0]),i.firstChild);j=c.makeArray(i.childNodes)}if(j.nodeType)e.push(j);else e=c.merge(e,j)}});if(d)for(a=0;e[a];a++)if(f&&c.nodeName(e[a],"script")&&(!e[a].type||e[a].type.toLowerCase()===
|
||||
"text/javascript"))f.push(e[a].parentNode?e[a].parentNode.removeChild(e[a]):e[a]);else{e[a].nodeType===1&&e.splice.apply(e,[a+1,0].concat(c.makeArray(e[a].getElementsByTagName("script"))));d.appendChild(e[a])}return e}});var ib=/z-?index|font-?weight|opacity|zoom|line-?height/i,Ia=/alpha\([^)]*\)/,Ja=/opacity=([^)]*)/,ja=/float/i,ka=/-([a-z])/ig,jb=/([A-Z])/g,kb=/^-?\d+(?:px)?$/i,lb=/^-?\d/,mb={position:"absolute",visibility:"hidden",display:"block"},nb=["Left","Right"],ob=["Top","Bottom"],pb=s.defaultView&&
|
||||
s.defaultView.getComputedStyle,Ka=c.support.cssFloat?"cssFloat":"styleFloat",la=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return $(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!ib.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""===
|
||||
"NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=Ia.test(a)?a.replace(Ia,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Ja.exec(f.filter)[1])/100+"":""}if(ja.test(b))b=Ka;b=b.replace(ka,la);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,i=b==="width"?nb:ob;function j(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(i,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=
|
||||
parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,"border"+this+"Width",true))||0})}a.offsetWidth!==0?j():c.swap(a,mb,j);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Ja.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ja.test(b))b=Ka;if(!d&&e&&e[b])f=e[b];else if(pb){if(ja.test(b))b="float";b=b.replace(jb,"-$1").toLowerCase();e=
|
||||
a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ka,la);f=a.currentStyle[b]||a.currentStyle[d];if(!kb.test(f)&&lb.test(f)){b=e.left;var i=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=i}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=
|
||||
f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var qb=K(),rb=/<script(.|\s)*?\/script>/gi,sb=/select|textarea/i,tb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,O=/=\?(&|$)/,ma=/\?/,ub=/(\?|&)_=.*?(&|$)/,vb=/^(\w+:)?\/\/([^\/?#]+)/,
|
||||
wb=/%20/g;c.fn.extend({_load:c.fn.load,load:function(a,b,d){if(typeof a!=="string")return this._load(a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}c.ajax({url:a,type:f,dataType:"html",data:b,context:this,complete:function(i,j){if(j==="success"||j==="notmodified")this.html(e?c("<div />").append(i.responseText.replace(rb,
|
||||
"")).find(e):i.responseText);d&&this.each(d,[i.responseText,j,i])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||sb.test(this.nodeName)||tb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});
|
||||
c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},
|
||||
ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",
|
||||
text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&e.success.call(p,o,j,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(p,x,j);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(r,q){(e.context?c(e.context):c.event).trigger(r,q)}var e=c.extend(true,{},c.ajaxSettings,a),i,j,o,p=e.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,
|
||||
e.traditional);if(e.dataType==="jsonp"){if(n==="GET")O.test(e.url)||(e.url+=(ma.test(e.url)?"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!O.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&O.test(e.data)||O.test(e.url))){i=e.jsonpCallback||"jsonp"+qb++;if(e.data)e.data=(e.data+"").replace(O,"="+i+"$1");e.url=e.url.replace(O,"="+i+"$1");e.dataType="script";A[i]=A[i]||function(r){o=r;b();d();A[i]=w;try{delete A[i]}catch(q){}B&&
|
||||
B.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===false&&n==="GET"){var t=K(),z=e.url.replace(ub,"$1_="+t+"$2");e.url=z+(z===e.url?(ma.test(e.url)?"&":"?")+"_="+t:"")}if(e.data&&n==="GET")e.url+=(ma.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");t=(t=vb.exec(e.url))&&(t[1]&&t[1]!==location.protocol||t[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&t){var B=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");
|
||||
C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!i){var D=false;C.onload=C.onreadystatechange=function(){if(!D&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){D=true;b();d();C.onload=C.onreadystatechange=null;B&&C.parentNode&&B.removeChild(C)}}}B.insertBefore(C,B.firstChild);return w}var F=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",
|
||||
e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}t||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ia){}if(e.beforeSend&&e.beforeSend.call(p,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",
|
||||
[x,e]);var g=x.onreadystatechange=function(r){if(!x||x.readyState===0){F||d();F=true;if(x)x.onreadystatechange=c.noop}else if(!F&&x&&(x.readyState===4||r==="timeout")){F=true;x.onreadystatechange=c.noop;j=r==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";if(j==="success")try{o=c.httpData(x,e.dataType,e)}catch(q){j="parsererror"}if(j==="success"||j==="notmodified")i||b();else c.handleError(e,x,j);d();r==="timeout"&&x.abort();if(e.async)x=
|
||||
null}};try{var h=x.abort;x.abort=function(){if(x){h.call(x);if(x)x.readyState=0}g()}}catch(k){}e.async&&e.timeout>0&&setTimeout(function(){x&&!F&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||A,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol===
|
||||
"file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;if(e&&a.documentElement.nodeName==="parsererror")throw"parsererror";if(d&&
|
||||
d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&f.indexOf("json")>=0)if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))a=A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+a))();else throw"Invalid JSON: "+a;else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(e,i){i=
|
||||
c.isFunction(i)?i():i;f[f.length]=encodeURIComponent(e)+"="+encodeURIComponent(i)}var f=[];if(b===w)b=c.ajaxSettings.traditional;c.isArray(a)||a.jquery?c.each(a,function(){d(this.name,this.value)}):c.each(a,function e(i,j){if(c.isArray(j))c.each(j,function(o,p){b?d(i,p):e(i+"["+(typeof p==="object"||c.isArray(p)?o:"")+"]",p)});else!b&&j!=null&&typeof j==="object"?c.each(j,function(o,p){e(i+"["+o+"]",p)}):d(i,j)});return f.join("&").replace(wb,"+")}});var na={},xb=/toggle|show|hide/,yb=/^([+-]=)?([\d+-.]+)(.*)$/,
|
||||
Z,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a!=null)return this.animate(L("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(na[d])f=na[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();
|
||||
na[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a!=null)return this.animate(L("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&
|
||||
c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(L("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var i=c.extend({},e),j,o=this.nodeType===1&&c(this).is(":hidden"),
|
||||
p=this;for(j in a){var n=j.replace(ka,la);if(j!==n){a[n]=a[j];delete a[j];j=n}if(a[j]==="hide"&&o||a[j]==="show"&&!o)return i.complete.call(this);if((j==="height"||j==="width")&&this.style){i.display=c.css(this,"display");i.overflow=this.style.overflow}if(c.isArray(a[j])){(i.specialEasing=i.specialEasing||{})[j]=a[j][1];a[j]=a[j][0]}}if(i.overflow!=null)this.style.overflow="hidden";i.curAnim=c.extend({},a);c.each(a,function(t,z){var B=new c.fx(p,i,t);if(xb.test(z))B[z==="toggle"?o?"show":"hide":z](a);
|
||||
else{var C=yb.exec(z),D=B.cur(true)||0;if(C){z=parseFloat(C[2]);var F=C[3]||"px";if(F!=="px"){p.style[t]=(z||1)+F;D=(z||1)/B.cur(true)*D;p.style[t]=D+F}if(C[1])z=(C[1]==="-="?-1:1)*z+D;B.custom(D,z,F)}else B.custom(D,z,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:L("show",1),slideUp:L("hide",1),slideToggle:L("toggle",
|
||||
1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration==="number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,
|
||||
b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==
|
||||
null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(i){return e.step(i)}this.startTime=K();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!Z)Z=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop===
|
||||
"width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=K(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=
|
||||
this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=
|
||||
c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},stop:function(){clearInterval(Z);Z=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=
|
||||
null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),
|
||||
f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(t){c.offset.setOffset(this,a,t)});if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=
|
||||
b,e=b.ownerDocument,i,j=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var p=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==j;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;i=e?e.getComputedStyle(b,null):b.currentStyle;p-=b.scrollTop;n-=b.scrollLeft;if(b===d){p+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){p+=parseFloat(i.borderTopWidth)||
|
||||
0;n+=parseFloat(i.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&i.overflow!=="visible"){p+=parseFloat(i.borderTopWidth)||0;n+=parseFloat(i.borderLeftWidth)||0}f=i}if(f.position==="relative"||f.position==="static"){p+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){p+=Math.max(j.scrollTop,o.scrollTop);n+=Math.max(j.scrollLeft,o.scrollLeft)}return{top:p,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),
|
||||
d,f,e,i=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);
|
||||
d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i;a.removeChild(b);c.offset.initialize=c.noop},
|
||||
bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),i=parseInt(c.curCSS(a,"top",true),10)||0,j=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,d,e);d={top:b.top-e.top+i,left:b.left-
|
||||
e.left+j};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=
|
||||
this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],i;if(!e)return null;if(f!==w)return this.each(function(){if(i=wa(this))i.scrollTo(!a?f:c(i).scrollLeft(),a?f:c(i).scrollTop());else this[d]=f});else return(i=wa(e))?"pageXOffset"in i?i[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&i.document.documentElement[d]||i.document.body[d]:e[d]}});
|
||||
c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;return"scrollTo"in e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+
|
||||
b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
|
16
browser/devtools/markupview/test/lib_jquery_1.6_min.js
Normal file
16
browser/devtools/markupview/test/lib_jquery_1.6_min.js
Normal file
File diff suppressed because one or more lines are too long
4
browser/devtools/markupview/test/lib_jquery_1.7_min.js
Normal file
4
browser/devtools/markupview/test/lib_jquery_1.7_min.js
Normal file
File diff suppressed because one or more lines are too long
4
browser/devtools/markupview/test/lib_jquery_2.1.1_min.js
Normal file
4
browser/devtools/markupview/test/lib_jquery_2.1.1_min.js
Normal file
File diff suppressed because one or more lines are too long
@ -465,6 +465,9 @@ Tooltip.prototype = {
|
||||
|
||||
this.empty();
|
||||
this.panel.removeAttribute("clamped-dimensions");
|
||||
this.panel.removeAttribute("clamped-dimensions-no-min-height");
|
||||
this.panel.removeAttribute("clamped-dimensions-no-max-or-min-height");
|
||||
this.panel.removeAttribute("wide");
|
||||
|
||||
if (content) {
|
||||
this.panel.appendChild(content);
|
||||
@ -1155,44 +1158,73 @@ EventTooltip.prototype = {
|
||||
header.className = "event-header devtools-toolbar";
|
||||
container.appendChild(header);
|
||||
|
||||
let debuggerIcon = doc.createElement("image");
|
||||
debuggerIcon.className = "event-tooltip-debugger-icon";
|
||||
debuggerIcon.setAttribute("src", "chrome://browser/skin/devtools/tool-debugger.svg");
|
||||
let openInDebugger = l10n.strings.GetStringFromName("eventsTooltip.openInDebugger");
|
||||
debuggerIcon.setAttribute("tooltiptext", openInDebugger);
|
||||
header.appendChild(debuggerIcon);
|
||||
if (!listener.hide.debugger) {
|
||||
let debuggerIcon = doc.createElement("image");
|
||||
debuggerIcon.className = "event-tooltip-debugger-icon";
|
||||
debuggerIcon.setAttribute("src", "chrome://browser/skin/devtools/tool-debugger.svg");
|
||||
let openInDebugger = l10n.strings.GetStringFromName("eventsTooltip.openInDebugger");
|
||||
debuggerIcon.setAttribute("tooltiptext", openInDebugger);
|
||||
header.appendChild(debuggerIcon);
|
||||
}
|
||||
|
||||
let eventTypeLabel = doc.createElement("label");
|
||||
eventTypeLabel.className = "event-tooltip-event-type";
|
||||
eventTypeLabel.setAttribute("value", listener.type);
|
||||
eventTypeLabel.setAttribute("tooltiptext", listener.type);
|
||||
header.appendChild(eventTypeLabel);
|
||||
if (!listener.hide.type) {
|
||||
let eventTypeLabel = doc.createElement("label");
|
||||
eventTypeLabel.className = "event-tooltip-event-type";
|
||||
eventTypeLabel.setAttribute("value", listener.type);
|
||||
eventTypeLabel.setAttribute("tooltiptext", listener.type);
|
||||
header.appendChild(eventTypeLabel);
|
||||
}
|
||||
|
||||
let filename = doc.createElement("label");
|
||||
filename.className = "event-tooltip-filename devtools-monospace";
|
||||
filename.setAttribute("value", listener.origin);
|
||||
filename.setAttribute("tooltiptext", listener.origin);
|
||||
filename.setAttribute("crop", "left");
|
||||
header.appendChild(filename);
|
||||
if (!listener.hide.filename) {
|
||||
let filename = doc.createElement("label");
|
||||
filename.className = "event-tooltip-filename devtools-monospace";
|
||||
filename.setAttribute("value", listener.origin);
|
||||
filename.setAttribute("tooltiptext", listener.origin);
|
||||
filename.setAttribute("crop", "left");
|
||||
header.appendChild(filename);
|
||||
}
|
||||
|
||||
let attributesBox = doc.createElement("box");
|
||||
attributesBox.setAttribute("class", "event-tooltip-attributes-container");
|
||||
header.appendChild(attributesBox);
|
||||
let attributesContainer = doc.createElement("hbox");
|
||||
attributesContainer.setAttribute("class", "event-tooltip-attributes-container");
|
||||
header.appendChild(attributesContainer);
|
||||
|
||||
let capturing = doc.createElement("label");
|
||||
capturing.className = "event-tooltip-attributes";
|
||||
capturing.setAttribute("value", phase);
|
||||
capturing.setAttribute("tooltiptext", phase);
|
||||
attributesBox.appendChild(capturing);
|
||||
if (!listener.hide.capturing) {
|
||||
let attributesBox = doc.createElement("box");
|
||||
attributesBox.setAttribute("class", "event-tooltip-attributes-box");
|
||||
attributesContainer.appendChild(attributesBox);
|
||||
|
||||
let attributesBox2 = attributesBox.cloneNode(false);
|
||||
header.appendChild(attributesBox2);
|
||||
let capturing = doc.createElement("label");
|
||||
capturing.className = "event-tooltip-attributes";
|
||||
capturing.setAttribute("value", phase);
|
||||
capturing.setAttribute("tooltiptext", phase);
|
||||
attributesBox.appendChild(capturing);
|
||||
}
|
||||
|
||||
let dom0 = doc.createElement("label");
|
||||
dom0.className = "event-tooltip-attributes";
|
||||
dom0.setAttribute("value", level);
|
||||
dom0.setAttribute("tooltiptext", level);
|
||||
attributesBox2.appendChild(dom0);
|
||||
if (listener.tags) {
|
||||
for (let tag of listener.tags.split(",")) {
|
||||
let attributesBox = doc.createElement("box");
|
||||
attributesBox.setAttribute("class", "event-tooltip-attributes-box");
|
||||
attributesContainer.appendChild(attributesBox);
|
||||
|
||||
let tagBox = doc.createElement("label");
|
||||
tagBox.className = "event-tooltip-attributes";
|
||||
tagBox.setAttribute("value", tag);
|
||||
tagBox.setAttribute("tooltiptext", tag);
|
||||
attributesBox.appendChild(tagBox);
|
||||
}
|
||||
}
|
||||
|
||||
if (!listener.hide.dom0) {
|
||||
let attributesBox = doc.createElement("box");
|
||||
attributesBox.setAttribute("class", "event-tooltip-attributes-box");
|
||||
attributesContainer.appendChild(attributesBox);
|
||||
|
||||
let dom0 = doc.createElement("label");
|
||||
dom0.className = "event-tooltip-attributes";
|
||||
dom0.setAttribute("value", level);
|
||||
dom0.setAttribute("tooltiptext", level);
|
||||
attributesBox.appendChild(dom0);
|
||||
}
|
||||
|
||||
// Content
|
||||
let content = doc.createElement("box");
|
||||
@ -1213,7 +1245,8 @@ EventTooltip.prototype = {
|
||||
}
|
||||
|
||||
this._tooltip.content = container;
|
||||
this._tooltip.panel.setAttribute("clamped-dimensions-no-min-height", "");
|
||||
this._tooltip.panel.setAttribute("clamped-dimensions-no-max-or-min-height", "");
|
||||
this._tooltip.panel.setAttribute("wide", "");
|
||||
|
||||
this._tooltip.panel.addEventListener("popuphiding", () => {
|
||||
this.destroy(container);
|
||||
|
@ -5,29 +5,8 @@
|
||||
"use strict";
|
||||
|
||||
const gcli = require("gcli/index");
|
||||
const EventEmitter = require("devtools/toolkit/event-emitter");
|
||||
const { gDevTools } = require("resource:///modules/devtools/gDevTools.jsm");
|
||||
|
||||
const eventEmitter = new EventEmitter();
|
||||
|
||||
gDevTools.on("toolbox-ready", (e, toolbox) => {
|
||||
if (!toolbox.target) {
|
||||
return;
|
||||
}
|
||||
|
||||
let fireChangeForTab = () => {
|
||||
eventEmitter.emit("changed", { target: toolbox.target });
|
||||
};
|
||||
|
||||
toolbox.on("split-console", fireChangeForTab);
|
||||
toolbox.on("select", fireChangeForTab);
|
||||
|
||||
toolbox.once("destroyed", () => {
|
||||
toolbox.off("split-console", fireChangeForTab);
|
||||
toolbox.off("select", fireChangeForTab);
|
||||
});
|
||||
});
|
||||
|
||||
exports.items = [
|
||||
{
|
||||
name: 'splitconsole',
|
||||
@ -41,11 +20,20 @@ exports.items = [
|
||||
return !!(toolbox && toolbox.splitConsole);
|
||||
},
|
||||
onChange: function(target, changeHandler) {
|
||||
eventEmitter.on("changed", changeHandler);
|
||||
},
|
||||
offChange: function(target, changeHandler) {
|
||||
eventEmitter.off("changed", changeHandler);
|
||||
},
|
||||
// Register handlers for when a change event should be fired
|
||||
// (which resets the checked state of the button).
|
||||
let toolbox = gDevTools.getToolbox(target);
|
||||
let callback = changeHandler.bind(null, "changed", { target: target });
|
||||
|
||||
if (!toolbox) {
|
||||
return;
|
||||
}
|
||||
|
||||
toolbox.on("split-console", callback);
|
||||
toolbox.once("destroyed", () => {
|
||||
toolbox.off("split-console", callback);
|
||||
});
|
||||
}
|
||||
},
|
||||
exec: function(args, context) {
|
||||
let target = context.environment.target;
|
||||
|
@ -18,8 +18,10 @@ function test() {
|
||||
toolbox = yield gDevTools.showToolbox(target, "inspector");
|
||||
|
||||
ok(!toolbox.splitConsole, "Split console is hidden by default.");
|
||||
ok(!isCommandButtonChecked(), "Split console button is unchecked by default.");
|
||||
yield toggleSplitConsoleWithEscape();
|
||||
ok(toolbox.splitConsole, "Split console is now visible.");
|
||||
ok(isCommandButtonChecked(), "Split console button is now checked.");
|
||||
ok(getVisiblePrefValue(), "Visibility pref is true");
|
||||
|
||||
is(getHeightPrefValue(), toolbox.webconsolePanel.height, "Panel height matches the pref");
|
||||
@ -33,6 +35,7 @@ function test() {
|
||||
toolbox = yield gDevTools.showToolbox(target, "inspector");
|
||||
|
||||
ok(toolbox.splitConsole, "Split console is visible by default.");
|
||||
ok(isCommandButtonChecked(), "Split console button is checked by default.");
|
||||
is(getHeightPrefValue(), 200, "Height is set based on panel height after closing");
|
||||
|
||||
// Use the binding element since jsterm.inputNode is a XUL textarea element.
|
||||
@ -51,6 +54,7 @@ function test() {
|
||||
|
||||
yield toggleSplitConsoleWithEscape();
|
||||
ok(!toolbox.splitConsole, "Split console is now hidden.");
|
||||
ok(!isCommandButtonChecked(), "Split console button is now unchecked.");
|
||||
ok(!getVisiblePrefValue(), "Visibility pref is false");
|
||||
|
||||
yield toolbox.destroy();
|
||||
@ -85,6 +89,11 @@ function test() {
|
||||
return Services.prefs.getIntPref("devtools.toolbox.splitconsoleHeight");
|
||||
}
|
||||
|
||||
function isCommandButtonChecked() {
|
||||
return toolbox.doc.querySelector("#command-button-splitconsole").
|
||||
hasAttribute("checked");
|
||||
}
|
||||
|
||||
function toggleSplitConsoleWithEscape() {
|
||||
let onceSplitConsole = toolbox.once("split-console");
|
||||
let contentWindow = toolbox.frame.contentWindow;
|
||||
|
@ -324,6 +324,14 @@ Experiments.Policy.prototype = {
|
||||
telemetryPayload: function () {
|
||||
return TelemetryPing.getPayload();
|
||||
},
|
||||
|
||||
/**
|
||||
* For testing a race condition, one of the tests delays the callback of
|
||||
* writing the cache by replacing this policy function.
|
||||
*/
|
||||
delayCacheWrite: function(promise) {
|
||||
return promise;
|
||||
},
|
||||
};
|
||||
|
||||
function AlreadyShutdownError(message="already shut down") {
|
||||
@ -1001,7 +1009,7 @@ Experiments.Experiments.prototype = {
|
||||
let encoder = new TextEncoder();
|
||||
let data = encoder.encode(textData);
|
||||
let options = { tmpPath: path + ".tmp", compression: "lz4" };
|
||||
yield OS.File.writeAtomic(path, data, options);
|
||||
yield this._policy.delayCacheWrite(OS.File.writeAtomic(path, data, options));
|
||||
} catch (e) {
|
||||
// We failed to write the cache, it's still dirty.
|
||||
this._dirty = true;
|
||||
|
33
browser/experiments/test/addons/experiment-racybranch/bootstrap.js
vendored
Normal file
33
browser/experiments/test/addons/experiment-racybranch/bootstrap.js
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
let {classes: Cc, interfaces: Ci, utils: Cu} = Components;
|
||||
|
||||
Cu.import("resource:///modules/experiments/Experiments.jsm");
|
||||
|
||||
let gStarted = false;
|
||||
|
||||
function startup(data, reasonCode) {
|
||||
if (gStarted) {
|
||||
return;
|
||||
}
|
||||
gStarted = true;
|
||||
|
||||
// delay realstartup to trigger the race condition
|
||||
Cc['@mozilla.org/thread-manager;1'].getService(Ci.nsIThreadManager)
|
||||
.mainThread.dispatch(realstartup, 0);
|
||||
}
|
||||
|
||||
function realstartup() {
|
||||
let experiments = Experiments.instance();
|
||||
let experiment = experiments._getActiveExperiment();
|
||||
if (experiment.branch) {
|
||||
Cu.reportError("Found pre-existing branch: " + experiment.branch);
|
||||
return;
|
||||
}
|
||||
|
||||
let branch = "racy-set";
|
||||
experiments.setExperimentBranch(experiment.id, branch)
|
||||
.then(null, Cu.reportError);
|
||||
}
|
||||
|
||||
function shutdown() { }
|
||||
function install() { }
|
||||
function uninstall() { }
|
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
|
||||
|
||||
<Description about="urn:mozilla:install-manifest">
|
||||
<em:id>test-experiment-racybranch@tests.mozilla.org</em:id>
|
||||
<em:version>1</em:version>
|
||||
<em:type>128</em:type>
|
||||
|
||||
<!-- Front End MetaData -->
|
||||
<em:name>Test experiment racybranch</em:name>
|
||||
<em:description>An experiment that sets the experiment branch in a potentially racy way.</em:description>
|
||||
|
||||
</Description>
|
||||
</RDF>
|
@ -7,7 +7,6 @@ Cu.import("resource://testing-common/httpd.js");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "Experiments",
|
||||
"resource:///modules/experiments/Experiments.jsm");
|
||||
|
||||
const FILE_MANIFEST = "experiments.manifest";
|
||||
const MANIFEST_HANDLER = "manifests/handler";
|
||||
|
||||
const SEC_IN_ONE_DAY = 24 * 60 * 60;
|
||||
|
111
browser/experiments/test/xpcshell/test_cacherace.js
Normal file
111
browser/experiments/test/xpcshell/test_cacherace.js
Normal file
@ -0,0 +1,111 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
Cu.import("resource://testing-common/httpd.js");
|
||||
Cu.import("resource://gre/modules/Timer.jsm");
|
||||
|
||||
const MANIFEST_HANDLER = "manifests/handler";
|
||||
|
||||
const SEC_IN_ONE_DAY = 24 * 60 * 60;
|
||||
const MS_IN_ONE_DAY = SEC_IN_ONE_DAY * 1000;
|
||||
|
||||
let gProfileDir = null;
|
||||
let gHttpServer = null;
|
||||
let gHttpRoot = null;
|
||||
let gDataRoot = null;
|
||||
let gReporter = null;
|
||||
let gPolicy = null;
|
||||
let gManifestObject = null;
|
||||
let gManifestHandlerURI = null;
|
||||
|
||||
function run_test() {
|
||||
run_next_test();
|
||||
}
|
||||
|
||||
add_task(function* test_setup() {
|
||||
loadAddonManager();
|
||||
gProfileDir = do_get_profile();
|
||||
yield removeCacheFile();
|
||||
|
||||
gHttpServer = new HttpServer();
|
||||
gHttpServer.start(-1);
|
||||
let port = gHttpServer.identity.primaryPort;
|
||||
gHttpRoot = "http://localhost:" + port + "/";
|
||||
gDataRoot = gHttpRoot + "data/";
|
||||
gManifestHandlerURI = gHttpRoot + MANIFEST_HANDLER;
|
||||
gHttpServer.registerDirectory("/data/", do_get_cwd());
|
||||
gHttpServer.registerPathHandler("/" + MANIFEST_HANDLER, (request, response) => {
|
||||
response.setStatusLine(null, 200, "OK");
|
||||
response.write(JSON.stringify(gManifestObject));
|
||||
response.processAsync();
|
||||
response.finish();
|
||||
});
|
||||
do_register_cleanup(() => gHttpServer.stop(() => {}));
|
||||
|
||||
Services.prefs.setBoolPref(PREF_EXPERIMENTS_ENABLED, true);
|
||||
Services.prefs.setIntPref(PREF_LOGGING_LEVEL, 0);
|
||||
Services.prefs.setBoolPref(PREF_LOGGING_DUMP, true);
|
||||
Services.prefs.setCharPref(PREF_MANIFEST_URI, gManifestHandlerURI);
|
||||
Services.prefs.setIntPref(PREF_FETCHINTERVAL, 0);
|
||||
|
||||
gReporter = yield getReporter("json_payload_simple");
|
||||
yield gReporter.collectMeasurements();
|
||||
let payload = yield gReporter.getJSONPayload(true);
|
||||
do_register_cleanup(() => gReporter._shutdown());
|
||||
|
||||
let ExperimentsScope = Cu.import("resource:///modules/experiments/Experiments.jsm");
|
||||
let Experiments = ExperimentsScope.Experiments;
|
||||
|
||||
gPolicy = new Experiments.Policy();
|
||||
patchPolicy(gPolicy, {
|
||||
updatechannel: () => "nightly",
|
||||
healthReportPayload: () => "{}",
|
||||
delayCacheWrite: (promise) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
promise.then(
|
||||
(result) => { setTimeout(() => resolve(result), 500); },
|
||||
(err) => { reject(err); }
|
||||
);
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
let now = new Date(2014, 5, 1, 12);
|
||||
defineNow(gPolicy, now);
|
||||
|
||||
let experimentName = "experiment-racybranch.xpi";
|
||||
let experimentPath = getExperimentPath(experimentName);
|
||||
let experimentHash = "sha1:" + sha1File(experimentPath);
|
||||
|
||||
gManifestObject = {
|
||||
version: 1,
|
||||
experiments: [
|
||||
{
|
||||
id: "test-experiment-racybranch@tests.mozilla.org",
|
||||
xpiURL: gDataRoot + "experiment-racybranch.xpi",
|
||||
xpiHash: experimentHash,
|
||||
maxActiveSeconds: 10 * SEC_IN_ONE_DAY,
|
||||
appName: ["XPCShell"],
|
||||
channel: ["nightly"],
|
||||
startTime: dateToSeconds(futureDate(now, -MS_IN_ONE_DAY)),
|
||||
endTime: dateToSeconds(futureDate(now, MS_IN_ONE_DAY)),
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
do_print("gManifestObject: " + JSON.stringify(gManifestObject));
|
||||
|
||||
// In order for the addon manager to work properly, we hack
|
||||
// Experiments.instance which is used by the XPIProvider
|
||||
let experiments = new Experiments.Experiments(gPolicy);
|
||||
Assert.strictEqual(ExperimentsScope.gExperiments, null);
|
||||
ExperimentsScope.gExperiments = experiments;
|
||||
|
||||
yield experiments.updateManifest();
|
||||
let active = experiments._getActiveExperiment();
|
||||
Assert.ok(active);
|
||||
Assert.equal(active.branch, "racy-set");
|
||||
Assert.ok(!experiments._dirty);
|
||||
});
|
@ -7,14 +7,17 @@ support-files =
|
||||
experiment-1.xpi
|
||||
experiment-1a.xpi
|
||||
experiment-2.xpi
|
||||
experiment-racybranch.xpi
|
||||
generated-files =
|
||||
experiment-1.xpi
|
||||
experiment-1a.xpi
|
||||
experiment-2.xpi
|
||||
experiment-racybranch.xpi
|
||||
|
||||
[test_activate.js]
|
||||
[test_api.js]
|
||||
[test_cache.js]
|
||||
[test_cacherace.js]
|
||||
[test_conditions.js]
|
||||
[test_disableExperiments.js]
|
||||
[test_fetch.js]
|
||||
|
@ -28,12 +28,25 @@ webrtcIndicator.sharingApplicationWith.menuitem = Sharing an Application with "%
|
||||
webrtcIndicator.sharingScreenWith.menuitem = Sharing Screen with "%S"
|
||||
webrtcIndicator.sharingWindowWith.menuitem = Sharing a Window with "%S"
|
||||
webrtcIndicator.controlSharing.menuitem = Control Sharing
|
||||
# LOCALIZATION NOTE (webrtcIndicator.sharing*WithNTabs.menuitem):
|
||||
# Semicolon-separated list of plural forms.
|
||||
# LOCALIZATION NOTE (webrtcIndicator.sharingCameraWithNTabs.menuitem):
|
||||
# Semicolon-separated list of plural forms. See:
|
||||
# http://developer.mozilla.org/en/docs/Localization_and_Plurals
|
||||
webrtcIndicator.sharingCameraWithNTabs.menuitem = Sharing Camera with #1 tab;Sharing Camera with #1 tabs
|
||||
# LOCALIZATION NOTE (webrtcIndicator.sharingMicrophoneWithNTabs.menuitem):
|
||||
# Semicolon-separated list of plural forms. See:
|
||||
# http://developer.mozilla.org/en/docs/Localization_and_Plurals
|
||||
webrtcIndicator.sharingMicrophoneWithNTabs.menuitem = Sharing Microphone with #1 tab;Sharing Microphone with #1 tabs
|
||||
# LOCALIZATION NOTE (webrtcIndicator.sharingApplicationWithNTabs.menuitem):
|
||||
# Semicolon-separated list of plural forms. See:
|
||||
# http://developer.mozilla.org/en/docs/Localization_and_Plurals
|
||||
webrtcIndicator.sharingApplicationWithNTabs.menuitem = Sharing an Application with #1 tab;Sharing Applications with #1 tabs
|
||||
# LOCALIZATION NOTE (webrtcIndicator.sharingScreenWithNTabs.menuitem):
|
||||
# Semicolon-separated list of plural forms. See:
|
||||
# http://developer.mozilla.org/en/docs/Localization_and_Plurals
|
||||
webrtcIndicator.sharingScreenWithNTabs.menuitem = Sharing Screen with #1 tab;Sharing Screen with #1 tabs
|
||||
# LOCALIZATION NOTE (webrtcIndicator.sharingWindowWithNTabs.menuitem):
|
||||
# Semicolon-separated list of plural forms. See:
|
||||
# http://developer.mozilla.org/en/docs/Localization_and_Plurals
|
||||
webrtcIndicator.sharingWindowWithNTabs.menuitem = Sharing a Window with #1 tab;Sharing Windows with #1 tabs
|
||||
# LOCALIZATION NOTE (webrtcIndicator.controlSharingOn.menuitem):
|
||||
# %S is the title of the tab using the share.
|
||||
|
@ -169,10 +169,18 @@
|
||||
min-width: 100px;
|
||||
max-width: 400px;
|
||||
}
|
||||
.devtools-tooltip[clamped-dimensions-no-max-or-min-height] {
|
||||
min-width: 400px;
|
||||
max-width: 400px;
|
||||
}
|
||||
.devtools-tooltip[clamped-dimensions] .panel-arrowcontent,
|
||||
.devtools-tooltip[clamped-dimensions-no-min-height] .panel-arrowcontent {
|
||||
.devtools-tooltip[clamped-dimensions-no-min-height] .panel-arrowcontent,
|
||||
.devtools-tooltip[clamped-dimensions-no-max-or-min-height] .panel-arrowcontent {
|
||||
overflow: hidden;
|
||||
}
|
||||
.devtools-tooltip[wide] {
|
||||
max-width: 600px;
|
||||
}
|
||||
|
||||
/* Tooltip: Simple Text */
|
||||
|
||||
|
@ -43,8 +43,8 @@
|
||||
|
||||
#devtools-tooltip-events-container {
|
||||
margin: -4px; /* Compensate for the .panel-arrowcontent padding. */
|
||||
max-width: 390px;
|
||||
overflow: auto;
|
||||
max-width: 590px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.event-header {
|
||||
@ -105,12 +105,19 @@
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.theme-dark .event-tooltip-attributes-container {
|
||||
.theme-dark .event-tooltip-attributes-box {
|
||||
background-color: #B6BABF;
|
||||
color: #343C45;
|
||||
}
|
||||
|
||||
.event-tooltip-attributes-container {
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
flex-grow: 1;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.event-tooltip-attributes-box {
|
||||
display: flex;
|
||||
flex-shrink: 0;
|
||||
align-items: center;
|
||||
@ -125,7 +132,7 @@
|
||||
padding-top: 2px;
|
||||
}
|
||||
|
||||
.theme-light .event-tooltip-attributes-container {
|
||||
.theme-light .event-tooltip-attributes-box {
|
||||
background-color: #585959;
|
||||
color: #F0F1F2;
|
||||
}
|
||||
|
@ -85,6 +85,15 @@
|
||||
min-width: inherit;
|
||||
}
|
||||
|
||||
/* Command buttons with menupopups should be styled slightly differently -
|
||||
no background color and a bit more narrow */
|
||||
#toolbox-buttons .devtools-toolbarbutton:not([text-as-image]):not(:hover):not([open=true]) {
|
||||
background: transparent;
|
||||
}
|
||||
#toolbox-buttons .devtools-toolbarbutton[type=menu] > .toolbarbutton-menu-dropmarker {
|
||||
padding: 0 2px;
|
||||
}
|
||||
|
||||
.devtools-toolbarbutton:not([label]) > .toolbarbutton-text {
|
||||
display: none;
|
||||
}
|
||||
@ -567,6 +576,9 @@
|
||||
.command-button[checked=true] > image {
|
||||
background-position: -48px center;
|
||||
}
|
||||
.command-button[open=true] > image {
|
||||
background-position: 0 center;
|
||||
}
|
||||
|
||||
#command-button-paintflashing > image {
|
||||
background-image: url("chrome://browser/skin/devtools/command-paintflashing.png");
|
||||
|
@ -344,6 +344,11 @@ this.PermissionsTable = { geolocation: {
|
||||
privileged: DENY_ACTION,
|
||||
certified: ALLOW_ACTION
|
||||
},
|
||||
"nfc-hci-events": {
|
||||
app: DENY_ACTION,
|
||||
privileged: DENY_ACTION,
|
||||
certified: ALLOW_ACTION
|
||||
},
|
||||
"speaker-control": {
|
||||
app: DENY_ACTION,
|
||||
privileged: ALLOW_ACTION,
|
||||
|
@ -3703,7 +3703,7 @@ this.DOMApplicationRegistry = {
|
||||
response = "Webapps:Uninstall:Return:KO";
|
||||
}
|
||||
|
||||
if (aMm = aMm.get()) {
|
||||
if ((aMm = aMm.get())) {
|
||||
aMm.sendAsyncMessage(response, aData);
|
||||
}
|
||||
}),
|
||||
|
@ -108,6 +108,9 @@ this.SystemMessagePermissionsTable = {
|
||||
"cdma-info-rec-received": {
|
||||
"mobileconnection": []
|
||||
},
|
||||
"nfc-hci-event-transaction": {
|
||||
"nfc-hci-events": []
|
||||
},
|
||||
"nfc-manager-tech-discovered": {
|
||||
"nfc-manager": []
|
||||
},
|
||||
|
@ -113,47 +113,47 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () {
|
||||
_registerMessageListeners: function _registerMessageListeners() {
|
||||
ppmm.addMessageListener("child-process-shutdown", this);
|
||||
|
||||
for (let msgname of NFC_IPC_MSG_NAMES) {
|
||||
ppmm.addMessageListener(msgname, this);
|
||||
for (let message of NFC_IPC_MSG_NAMES) {
|
||||
ppmm.addMessageListener(message, this);
|
||||
}
|
||||
|
||||
for (let msgname of NFC_IPC_READ_PERM_MSG_NAMES) {
|
||||
ppmm.addMessageListener(msgname, this);
|
||||
for (let message of NFC_IPC_READ_PERM_MSG_NAMES) {
|
||||
ppmm.addMessageListener(message, this);
|
||||
}
|
||||
|
||||
for (let msgname of NFC_IPC_WRITE_PERM_MSG_NAMES) {
|
||||
ppmm.addMessageListener(msgname, this);
|
||||
for (let message of NFC_IPC_WRITE_PERM_MSG_NAMES) {
|
||||
ppmm.addMessageListener(message, this);
|
||||
}
|
||||
|
||||
for (let msgname of NFC_IPC_MANAGER_PERM_MSG_NAMES) {
|
||||
ppmm.addMessageListener(msgname, this);
|
||||
for (let message of NFC_IPC_MANAGER_PERM_MSG_NAMES) {
|
||||
ppmm.addMessageListener(message, this);
|
||||
}
|
||||
},
|
||||
|
||||
_unregisterMessageListeners: function _unregisterMessageListeners() {
|
||||
ppmm.removeMessageListener("child-process-shutdown", this);
|
||||
|
||||
for (let msgname of NFC_IPC_MSG_NAMES) {
|
||||
ppmm.removeMessageListener(msgname, this);
|
||||
for (let message of NFC_IPC_MSG_NAMES) {
|
||||
ppmm.removeMessageListener(message, this);
|
||||
}
|
||||
|
||||
for (let msgname of NFC_IPC_READ_PERM_MSG_NAMES) {
|
||||
ppmm.removeMessageListener(msgname, this);
|
||||
for (let message of NFC_IPC_READ_PERM_MSG_NAMES) {
|
||||
ppmm.removeMessageListener(message, this);
|
||||
}
|
||||
|
||||
for (let msgname of NFC_IPC_WRITE_PERM_MSG_NAMES) {
|
||||
ppmm.removeMessageListener(msgname, this);
|
||||
for (let message of NFC_IPC_WRITE_PERM_MSG_NAMES) {
|
||||
ppmm.removeMessageListener(message, this);
|
||||
}
|
||||
|
||||
for (let msgname of NFC_IPC_MANAGER_PERM_MSG_NAMES) {
|
||||
ppmm.removeMessageListener(msgname, this);
|
||||
for (let message of NFC_IPC_MANAGER_PERM_MSG_NAMES) {
|
||||
ppmm.removeMessageListener(message, this);
|
||||
}
|
||||
|
||||
ppmm = null;
|
||||
},
|
||||
|
||||
registerPeerReadyTarget: function registerPeerReadyTarget(msg) {
|
||||
let appInfo = msg.json;
|
||||
registerPeerReadyTarget: function registerPeerReadyTarget(message) {
|
||||
let appInfo = message.data;
|
||||
let targets = this.peerTargetsMap;
|
||||
let targetInfo = targets[appInfo.appId];
|
||||
// If the application Id is already registered
|
||||
@ -162,13 +162,13 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () {
|
||||
}
|
||||
|
||||
// Target not registered yet! Add to the target map
|
||||
let newTargetInfo = { target : msg.target,
|
||||
let newTargetInfo = { target : message.target,
|
||||
isPeerReadyCalled: false };
|
||||
targets[appInfo.appId] = newTargetInfo;
|
||||
},
|
||||
|
||||
unregisterPeerReadyTarget: function unregisterPeerReadyTarget(msg) {
|
||||
let appInfo = msg.json;
|
||||
unregisterPeerReadyTarget: function unregisterPeerReadyTarget(message) {
|
||||
let appInfo = message.data;
|
||||
let targets = this.peerTargetsMap;
|
||||
let targetInfo = targets[appInfo.appId];
|
||||
if (targetInfo) {
|
||||
@ -206,20 +206,20 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () {
|
||||
});
|
||||
},
|
||||
|
||||
checkP2PRegistration: function checkP2PRegistration(msg) {
|
||||
checkP2PRegistration: function checkP2PRegistration(message) {
|
||||
// Check if the session and application id yeild a valid registered
|
||||
// target. It should have registered for NFC_PEER_EVENT_READY
|
||||
let isValid = !!this.nfc.sessionTokenMap[this.nfc._currentSessionId] &&
|
||||
this.isPeerReadyTarget(msg.json.appId);
|
||||
this.isPeerReadyTarget(message.data.appId);
|
||||
// Remember the current AppId if registered.
|
||||
this.currentPeerAppId = (isValid) ? msg.json.appId : null;
|
||||
this.currentPeerAppId = (isValid) ? message.data.appId : null;
|
||||
|
||||
let respMsg = { requestId: msg.json.requestId };
|
||||
let respMsg = { requestId: message.data.requestId };
|
||||
if(!isValid) {
|
||||
respMsg.errorMsg = this.nfc.getErrorMessage(NFC.NFC_GECKO_ERROR_P2P_REG_INVALID);
|
||||
}
|
||||
// Notify the content process immediately of the status
|
||||
msg.target.sendAsyncMessage(msg.name + "Response", respMsg);
|
||||
message.target.sendAsyncMessage(message.name + "Response", respMsg);
|
||||
},
|
||||
|
||||
onPeerLost: function onPeerLost(sessionToken) {
|
||||
@ -236,79 +236,79 @@ XPCOMUtils.defineLazyGetter(this, "gMessageManager", function () {
|
||||
* nsIMessageListener interface methods.
|
||||
*/
|
||||
|
||||
receiveMessage: function receiveMessage(msg) {
|
||||
debug("Received '" + msg.name + "' message from content process");
|
||||
if (msg.name == "child-process-shutdown") {
|
||||
this.removePeerTarget(msg.target);
|
||||
receiveMessage: function receiveMessage(message) {
|
||||
debug("Received '" + JSON.stringify(message) + "' message from content process");
|
||||
if (message.name == "child-process-shutdown") {
|
||||
this.removePeerTarget(message.target);
|
||||
return null;
|
||||
}
|
||||
|
||||
if (NFC_IPC_MSG_NAMES.indexOf(msg.name) != -1) {
|
||||
if (NFC_IPC_MSG_NAMES.indexOf(message.name) != -1) {
|
||||
// Do nothing.
|
||||
} else if (NFC_IPC_READ_PERM_MSG_NAMES.indexOf(msg.name) != -1) {
|
||||
if (!msg.target.assertPermission("nfc-read")) {
|
||||
debug("Nfc message " + msg.name +
|
||||
} else if (NFC_IPC_READ_PERM_MSG_NAMES.indexOf(message.name) != -1) {
|
||||
if (!message.target.assertPermission("nfc-read")) {
|
||||
debug("Nfc message " + message.name +
|
||||
" from a content process with no 'nfc-read' privileges.");
|
||||
return null;
|
||||
}
|
||||
} else if (NFC_IPC_WRITE_PERM_MSG_NAMES.indexOf(msg.name) != -1) {
|
||||
if (!msg.target.assertPermission("nfc-write")) {
|
||||
debug("Nfc Peer message " + msg.name +
|
||||
} else if (NFC_IPC_WRITE_PERM_MSG_NAMES.indexOf(message.name) != -1) {
|
||||
if (!message.target.assertPermission("nfc-write")) {
|
||||
debug("Nfc Peer message " + message.name +
|
||||
" from a content process with no 'nfc-write' privileges.");
|
||||
return null;
|
||||
}
|
||||
} else if (NFC_IPC_MANAGER_PERM_MSG_NAMES.indexOf(msg.name) != -1) {
|
||||
if (!msg.target.assertPermission("nfc-manager")) {
|
||||
} else if (NFC_IPC_MANAGER_PERM_MSG_NAMES.indexOf(message.name) != -1) {
|
||||
if (!message.target.assertPermission("nfc-manager")) {
|
||||
debug("NFC message " + message.name +
|
||||
" from a content process with no 'nfc-manager' privileges.");
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
debug("Ignoring unknown message type: " + msg.name);
|
||||
debug("Ignoring unknown message type: " + message.name);
|
||||
return null;
|
||||
}
|
||||
|
||||
switch (msg.name) {
|
||||
switch (message.name) {
|
||||
case "NFC:CheckSessionToken":
|
||||
if (msg.json.sessionToken !== this.nfc.sessionTokenMap[this.nfc._currentSessionId]) {
|
||||
debug("Received invalid Session Token: " + msg.json.sessionToken +
|
||||
if (message.data.sessionToken !== this.nfc.sessionTokenMap[this.nfc._currentSessionId]) {
|
||||
debug("Received invalid Session Token: " + message.data.sessionToken +
|
||||
", current SessionToken: " + this.nfc.sessionTokenMap[this.nfc._currentSessionId]);
|
||||
return NFC.NFC_ERROR_BAD_SESSION_ID;
|
||||
}
|
||||
return NFC.NFC_SUCCESS;
|
||||
case "NFC:RegisterPeerReadyTarget":
|
||||
this.registerPeerReadyTarget(msg);
|
||||
this.registerPeerReadyTarget(message);
|
||||
return null;
|
||||
case "NFC:UnregisterPeerReadyTarget":
|
||||
this.unregisterPeerReadyTarget(msg);
|
||||
this.unregisterPeerReadyTarget(message);
|
||||
return null;
|
||||
case "NFC:CheckP2PRegistration":
|
||||
this.checkP2PRegistration(msg);
|
||||
this.checkP2PRegistration(message);
|
||||
return null;
|
||||
case "NFC:NotifyUserAcceptedP2P":
|
||||
// Notify the 'NFC_PEER_EVENT_READY' since user has acknowledged
|
||||
if (!this.isPeerReadyTarget(msg.json.appId)) {
|
||||
debug("Application ID : " + msg.json.appId + " is not a registered PeerReadytarget");
|
||||
if (!this.isPeerReadyTarget(message.data.appId)) {
|
||||
debug("Application ID : " + message.data.appId + " is not a registered PeerReadytarget");
|
||||
return null;
|
||||
}
|
||||
|
||||
let targetInfo = this.peerTargetsMap[msg.json.appId];
|
||||
let targetInfo = this.peerTargetsMap[message.data.appId];
|
||||
targetInfo.IsPeerReadyCalled = true;
|
||||
let sessionToken = this.nfc.sessionTokenMap[this.nfc._currentSessionId];
|
||||
this.notifyPeerEvent(msg.json.appId, NFC.NFC_PEER_EVENT_READY, sessionToken);
|
||||
this.notifyPeerEvent(message.data.appId, NFC.NFC_PEER_EVENT_READY, sessionToken);
|
||||
return null;
|
||||
case "NFC:NotifySendFileStatus":
|
||||
// Upon receiving the status of sendFile operation, send the response
|
||||
// to appropriate content process.
|
||||
msg.json.type = "NotifySendFileStatus";
|
||||
if (msg.json.status !== NFC.NFC_SUCCESS) {
|
||||
msg.json.errorMsg =
|
||||
message.data.type = "NotifySendFileStatus";
|
||||
if (message.data.status !== NFC.NFC_SUCCESS) {
|
||||
message.data.errorMsg =
|
||||
this.nfc.getErrorMessage(NFC.NFC_GECKO_ERROR_SEND_FILE_FAILED);
|
||||
}
|
||||
this.nfc.sendNfcResponse(msg.json);
|
||||
this.nfc.sendNfcResponse(message.data);
|
||||
return null;
|
||||
default:
|
||||
return this.nfc.receiveMessage(msg);
|
||||
return this.nfc.receiveMessage(message);
|
||||
}
|
||||
},
|
||||
|
||||
@ -397,8 +397,8 @@ Nfc.prototype = {
|
||||
}
|
||||
|
||||
let nfcMsgType = message.name + "Response";
|
||||
message.json.errorMsg = this.getErrorMessage(errorCode);
|
||||
message.target.sendAsyncMessage(nfcMsgType, message.json);
|
||||
message.data.errorMsg = this.getErrorMessage(errorCode);
|
||||
message.target.sendAsyncMessage(nfcMsgType, message.data);
|
||||
},
|
||||
|
||||
getErrorMessage: function getErrorMessage(errorCode) {
|
||||
@ -452,6 +452,9 @@ Nfc.prototype = {
|
||||
delete this.sessionTokenMap[this._currentSessionId];
|
||||
this._currentSessionId = null;
|
||||
|
||||
break;
|
||||
case "HCIEventTransactionNotification":
|
||||
this.notifyHCIEventTransaction(message);
|
||||
break;
|
||||
case "ConfigResponse":
|
||||
if (message.status === NFC.NFC_SUCCESS) {
|
||||
@ -473,6 +476,26 @@ Nfc.prototype = {
|
||||
}
|
||||
},
|
||||
|
||||
// HCI Event Transaction
|
||||
notifyHCIEventTransaction: function notifyHCIEventTransaction(message) {
|
||||
delete message.type;
|
||||
/**
|
||||
* FIXME:
|
||||
* GSMA 6.0 7.4 UI Application triggering requirements
|
||||
* This specifies the need for the following parameters to be derived and
|
||||
* sent. One unclear spec is what the URI format "secure:0" refers to, given
|
||||
* SEName can be something like "SIM1" or "SIM2".
|
||||
*
|
||||
* 1) Mime-type - Secure Element application dependent
|
||||
* 2) URI, of the format: nfc://secure:0/<SEName>/<AID>
|
||||
* - SEName reflects the originating SE. It must be compliant with
|
||||
* SIMAlliance Open Mobile APIs
|
||||
* - AID reflects the originating UICC applet identifier
|
||||
* 3) Data - Data payload of the transaction notification, if any.
|
||||
*/
|
||||
gSystemMessenger.broadcastMessage("nfc-hci-event-transaction", message);
|
||||
},
|
||||
|
||||
nfcService: null,
|
||||
|
||||
sessionTokenMap: null,
|
||||
@ -480,11 +503,9 @@ Nfc.prototype = {
|
||||
targetsByRequestId: null,
|
||||
|
||||
/**
|
||||
* Process a message from the content process.
|
||||
* Process a message from the gMessageManager.
|
||||
*/
|
||||
receiveMessage: function receiveMessage(message) {
|
||||
debug("Received '" + JSON.stringify(message) + "' message from content process");
|
||||
|
||||
let isPowerAPI = message.name == "NFC:StartPoll" ||
|
||||
message.name == "NFC:StopPoll" ||
|
||||
message.name == "NFC:PowerOff";
|
||||
@ -497,13 +518,13 @@ Nfc.prototype = {
|
||||
}
|
||||
|
||||
// Update the current sessionId before sending to the NFC service.
|
||||
message.json.sessionId = this._currentSessionId;
|
||||
message.data.sessionId = this._currentSessionId;
|
||||
}
|
||||
|
||||
// Sanity check on sessionId
|
||||
let sessionToken = this.sessionTokenMap[this._currentSessionId];
|
||||
if (message.json.sessionToken && (message.json.sessionToken !== sessionToken)) {
|
||||
debug("Invalid Session Token: " + message.json.sessionToken +
|
||||
if (message.data.sessionToken && (message.data.sessionToken !== sessionToken)) {
|
||||
debug("Invalid Session Token: " + message.data.sessionToken +
|
||||
" Expected Session Token: " + sessionToken);
|
||||
this.sendNfcErrorResponse(message, NFC.NFC_ERROR_BAD_SESSION_ID);
|
||||
return null;
|
||||
@ -512,33 +533,33 @@ Nfc.prototype = {
|
||||
switch (message.name) {
|
||||
case "NFC:StartPoll":
|
||||
this.setConfig({powerLevel: NFC.NFC_POWER_LEVEL_ENABLED,
|
||||
requestId: message.json.requestId});
|
||||
requestId: message.data.requestId});
|
||||
break;
|
||||
case "NFC:StopPoll":
|
||||
this.setConfig({powerLevel: NFC.NFC_POWER_LEVEL_LOW,
|
||||
requestId: message.json.requestId});
|
||||
requestId: message.data.requestId});
|
||||
break;
|
||||
case "NFC:PowerOff":
|
||||
this.setConfig({powerLevel: NFC.NFC_POWER_LEVEL_DISABLED,
|
||||
requestId: message.json.requestId});
|
||||
requestId: message.data.requestId});
|
||||
break;
|
||||
case "NFC:GetDetailsNDEF":
|
||||
this.sendToNfcService("getDetailsNDEF", message.json);
|
||||
this.sendToNfcService("getDetailsNDEF", message.data);
|
||||
break;
|
||||
case "NFC:ReadNDEF":
|
||||
this.sendToNfcService("readNDEF", message.json);
|
||||
this.sendToNfcService("readNDEF", message.data);
|
||||
break;
|
||||
case "NFC:WriteNDEF":
|
||||
this.sendToNfcService("writeNDEF", message.json);
|
||||
this.sendToNfcService("writeNDEF", message.data);
|
||||
break;
|
||||
case "NFC:MakeReadOnlyNDEF":
|
||||
this.sendToNfcService("makeReadOnlyNDEF", message.json);
|
||||
this.sendToNfcService("makeReadOnlyNDEF", message.data);
|
||||
break;
|
||||
case "NFC:Connect":
|
||||
this.sendToNfcService("connect", message.json);
|
||||
this.sendToNfcService("connect", message.data);
|
||||
break;
|
||||
case "NFC:Close":
|
||||
this.sendToNfcService("close", message.json);
|
||||
this.sendToNfcService("close", message.data);
|
||||
break;
|
||||
case "NFC:SendFile":
|
||||
// Chrome process is the arbitrator / mediator between
|
||||
@ -549,13 +570,13 @@ Nfc.prototype = {
|
||||
|
||||
// Notify system app to initiate BT send file operation
|
||||
gSystemMessenger.broadcastMessage("nfc-manager-send-file",
|
||||
message.json);
|
||||
message.data);
|
||||
break;
|
||||
default:
|
||||
debug("UnSupported : Message Name " + message.name);
|
||||
return null;
|
||||
}
|
||||
this.targetsByRequestId[message.json.requestId] = message.target;
|
||||
this.targetsByRequestId[message.data.requestId] = message.target;
|
||||
|
||||
return null;
|
||||
},
|
||||
|
@ -8,7 +8,7 @@
|
||||
namespace mozilla {
|
||||
|
||||
#define NFCD_MAJOR_VERSION 1
|
||||
#define NFCD_MINOR_VERSION 7
|
||||
#define NFCD_MINOR_VERSION 8
|
||||
|
||||
enum NfcRequest {
|
||||
ConfigReq = 0,
|
||||
@ -31,6 +31,7 @@ enum NfcNotification {
|
||||
Initialized = 2000,
|
||||
TechDiscovered,
|
||||
TechLost,
|
||||
HCIEventTransaction,
|
||||
};
|
||||
|
||||
enum NfcTechlogy {
|
||||
@ -75,6 +76,12 @@ enum NfcErrorCode {
|
||||
FailDisableLowPowerMode = -31,
|
||||
};
|
||||
|
||||
enum SecureElementOrigin {
|
||||
SIM = 0,
|
||||
ESE = 1,
|
||||
ASSD = 2,
|
||||
};
|
||||
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // NfcGonkMessage_h
|
||||
|
@ -33,6 +33,8 @@ static const char* kCloseResponse = "CloseResponse";
|
||||
static const char* kInitializedNotification = "InitializedNotification";
|
||||
static const char* kTechDiscoveredNotification = "TechDiscoveredNotification";
|
||||
static const char* kTechLostNotification = "TechLostNotification";
|
||||
static const char* kHCIEventTransactionNotification =
|
||||
"HCIEventTransactionNotification";
|
||||
|
||||
bool
|
||||
NfcMessageHandler::Marshall(Parcel& aParcel, const CommandOptions& aOptions)
|
||||
@ -94,6 +96,9 @@ NfcMessageHandler::Unmarshall(const Parcel& aParcel, EventOptions& aOptions)
|
||||
case NfcNotification::TechLost:
|
||||
result = TechLostNotification(aParcel, aOptions);
|
||||
break;
|
||||
case NfcNotification::HCIEventTransaction:
|
||||
result = HCIEventTransactionNotification(aParcel, aOptions);
|
||||
break;
|
||||
default:
|
||||
result = false;
|
||||
break;
|
||||
@ -297,6 +302,25 @@ NfcMessageHandler::TechLostNotification(const Parcel& aParcel, EventOptions& aOp
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
NfcMessageHandler::HCIEventTransactionNotification(const Parcel& aParcel, EventOptions& aOptions)
|
||||
{
|
||||
aOptions.mType = NS_ConvertUTF8toUTF16(kHCIEventTransactionNotification);
|
||||
|
||||
aOptions.mOriginType = aParcel.readInt32();
|
||||
aOptions.mOriginIndex = aParcel.readInt32();
|
||||
|
||||
int32_t aidLength = aParcel.readInt32();
|
||||
aOptions.mAid.AppendElements(
|
||||
static_cast<const uint8_t*>(aParcel.readInplace(aidLength)), aidLength);
|
||||
|
||||
int32_t payloadLength = aParcel.readInt32();
|
||||
aOptions.mPayload.AppendElements(
|
||||
static_cast<const uint8_t*>(aParcel.readInplace(payloadLength)), payloadLength);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
NfcMessageHandler::ReadNDEFMessage(const Parcel& aParcel, EventOptions& aOptions)
|
||||
{
|
||||
|
@ -39,6 +39,7 @@ private:
|
||||
bool InitializeNotification(const android::Parcel& aParcel, EventOptions& aOptions);
|
||||
bool TechDiscoveredNotification(const android::Parcel& aParcel, EventOptions& aOptions);
|
||||
bool TechLostNotification(const android::Parcel& aParcel, EventOptions& aOptions);
|
||||
bool HCIEventTransactionNotification(const android::Parcel& aParcel, EventOptions& aOptions);
|
||||
|
||||
bool ReadNDEFMessage(const android::Parcel& aParcel, EventOptions& aOptions);
|
||||
bool WriteNDEFMessage(android::Parcel& aParcel, const CommandOptions& aOptions);
|
||||
|
@ -83,7 +83,8 @@ struct EventOptions
|
||||
{
|
||||
EventOptions()
|
||||
: mType(EmptyString()), mStatus(-1), mSessionId(-1), mRequestId(EmptyString()), mMajorVersion(-1), mMinorVersion(-1),
|
||||
mIsReadOnly(-1), mCanBeMadeReadOnly(-1), mMaxSupportedLength(-1), mPowerLevel(-1)
|
||||
mIsReadOnly(-1), mCanBeMadeReadOnly(-1), mMaxSupportedLength(-1), mPowerLevel(-1), mOrigin(EmptyString()),
|
||||
mOriginType(-1), mOriginIndex(-1)
|
||||
{}
|
||||
|
||||
nsString mType;
|
||||
@ -98,6 +99,12 @@ struct EventOptions
|
||||
int32_t mCanBeMadeReadOnly;
|
||||
int32_t mMaxSupportedLength;
|
||||
int32_t mPowerLevel;
|
||||
|
||||
nsString mOrigin;
|
||||
int32_t mOriginType;
|
||||
int32_t mOriginIndex;
|
||||
nsTArray<uint8_t> mAid;
|
||||
nsTArray<uint8_t> mPayload;
|
||||
};
|
||||
|
||||
} // namespace mozilla
|
||||
|
@ -36,6 +36,12 @@ nsLiteralString NfcTechString[] = {
|
||||
NS_LITERAL_STRING("BARCODE")
|
||||
};
|
||||
|
||||
static const nsLiteralString SEOriginString[] = {
|
||||
NS_LITERAL_STRING("SIM"),
|
||||
NS_LITERAL_STRING("ESE"),
|
||||
NS_LITERAL_STRING("ASSD")
|
||||
};
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
static NfcService* gNfcService;
|
||||
@ -162,6 +168,27 @@ public:
|
||||
COPY_OPT_FIELD(mCanBeMadeReadOnly, -1)
|
||||
COPY_OPT_FIELD(mMaxSupportedLength, -1)
|
||||
|
||||
// HCI Event Transaction parameters.
|
||||
int size = sizeof(SEOriginString) / sizeof(nsLiteralString);
|
||||
// TODO: We need a map or something to more rigorously validate against
|
||||
// Gonk Message header values from inside NfcService.
|
||||
if ((mEvent.mOriginType != -1) && (mEvent.mOriginType < size)) {
|
||||
mEvent.mOrigin.Assign(SEOriginString[mEvent.mOriginType]);
|
||||
mEvent.mOrigin.AppendInt(mEvent.mOriginIndex, 16 /* radix */);
|
||||
event.mOrigin.Construct();
|
||||
event.mOrigin.Value() = mEvent.mOrigin;
|
||||
}
|
||||
|
||||
if (mEvent.mAid.Length() > 0) {
|
||||
event.mAid.Construct();
|
||||
event.mAid.Value().Init(Uint8Array::Create(cx, mEvent.mAid.Length(), mEvent.mAid.Elements()));
|
||||
}
|
||||
|
||||
if (mEvent.mPayload.Length() > 0) {
|
||||
event.mPayload.Construct();
|
||||
event.mPayload.Value().Init(Uint8Array::Create(cx, mEvent.mPayload.Length(), mEvent.mPayload.Elements()));
|
||||
}
|
||||
|
||||
#undef COPY_FIELD
|
||||
#undef COPY_OPT_FIELD
|
||||
|
||||
|
@ -0,0 +1,2 @@
|
||||
component {b501edd0-28bd-11e4-8c21-0800200c9a66} HCIEventTransactionSystemMessageConfigurator.js
|
||||
contract @mozilla.org/dom/system-messages/configurator/nfc-hci-event-transaction;1 {b501edd0-28bd-11e4-8c21-0800200c9a66}
|
114
dom/nfc/messages/HCIEventTransactionSystemMessageConfigurator.js
Normal file
114
dom/nfc/messages/HCIEventTransactionSystemMessageConfigurator.js
Normal file
@ -0,0 +1,114 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
|
||||
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Cu.import("resource://gre/modules/Promise.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyServiceGetter(this, "appsService",
|
||||
"@mozilla.org/AppsService;1",
|
||||
"nsIAppsService");
|
||||
|
||||
let DEBUG = false;
|
||||
function debug(aMsg) {
|
||||
if (DEBUG) {
|
||||
dump("-- HCIEventTransactionSystemMessageConfigurator.js " + Date.now() + " : " + aMsg + "\n");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* nsISystemMessagesConfigurator implementation.
|
||||
*/
|
||||
function HCIEventTransactionSystemMessageConfigurator() {
|
||||
debug("HCIEventTransactionSystemMessageConfigurator");
|
||||
}
|
||||
|
||||
HCIEventTransactionSystemMessageConfigurator.prototype = {
|
||||
get mustShowRunningApp() {
|
||||
debug("mustShowRunningApp returning true");
|
||||
return true;
|
||||
},
|
||||
|
||||
shouldDispatch: function shouldDispatch(aManifestURL, aPageURL, aType, aMessage, aExtra) {
|
||||
let deferred = Promise.defer();
|
||||
debug("message to dispatch: " + JSON.stringify(aMessage));
|
||||
debug("aManifest url: " + aManifestURL);
|
||||
if(!aMessage) {
|
||||
return deferred.resolve(false);
|
||||
}
|
||||
let aid = this._byteAIDToHex(aMessage.aid);
|
||||
let seName = aMessage.seName;
|
||||
|
||||
appsService.getManifestFor(aManifestURL)
|
||||
.then((aManifest) => this._checkAppManifest(seName, aid, aManifest))
|
||||
.then(() => {
|
||||
// FIXME: Bug 884594: Access Control Enforcer
|
||||
// Here we will call ace.isAllowed function which will also return
|
||||
// a Promise, for now we're just resolving shouldDispatch promise
|
||||
debug("dispatching message");
|
||||
deferred.resolve(true);
|
||||
})
|
||||
.catch(() => {
|
||||
// if the Promise chain was broken we don't dispatch the message
|
||||
debug("not dispatching");
|
||||
deferred.resolve(false);
|
||||
});
|
||||
|
||||
return deferred.promise;
|
||||
},
|
||||
|
||||
// we might be doing some async hash computations here, returning
|
||||
// a resolved/rejected promise for now so we can easily fit the method
|
||||
// into a Promise chain
|
||||
_checkAppManifest: function _checkAppManifest(aSeName, aAid, aManifest) {
|
||||
debug("aManifest " + JSON.stringify(aManifest));
|
||||
|
||||
let hciRules = aManifest["secure_element_access"] || [];
|
||||
let matchingRule = hciRules.find((rule) => {
|
||||
rule = rule.toUpperCase();
|
||||
if(rule === "*" || rule === (aSeName + "/" + aAid)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
let isMatching = (match, element) => {
|
||||
if(match === "*") {
|
||||
return true;
|
||||
}
|
||||
if(match.charAt(match.length - 1) === '*') {
|
||||
return element.indexOf(match.substr(0,match.length - 1)) === 0;
|
||||
}
|
||||
|
||||
return match === element;
|
||||
};
|
||||
|
||||
return isMatching(rule.split('/')[0], aSeName) &&
|
||||
isMatching(rule.split('/')[1], aAid);
|
||||
});
|
||||
|
||||
return (matchingRule) ? Promise.resolve() : Promise.reject();
|
||||
},
|
||||
|
||||
// FIXME: there is probably something which does this
|
||||
_byteAIDToHex: function _byteAIDToHex(uint8arr) {
|
||||
if (!uint8arr) {
|
||||
return "";
|
||||
}
|
||||
|
||||
var hexStr = "";
|
||||
for (var i = 0; i < uint8arr.length; i++) {
|
||||
var hex = (uint8arr[i] & 0xff).toString(16);
|
||||
hex = (hex.length === 1) ? '0' + hex : hex;
|
||||
hexStr += hex;
|
||||
}
|
||||
return hexStr.toUpperCase();
|
||||
},
|
||||
|
||||
classID: Components.ID("{b501edd0-28bd-11e4-8c21-0800200c9a66}"),
|
||||
QueryInterface: XPCOMUtils.generateQI([Ci.nsISystemMessagesConfigurator])
|
||||
}
|
||||
|
||||
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([HCIEventTransactionSystemMessageConfigurator]);
|
@ -34,6 +34,8 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk' and CONFIG['MOZ_NFC']:
|
||||
EXTRA_COMPONENTS += [
|
||||
'gonk/Nfc.js',
|
||||
'gonk/Nfc.manifest',
|
||||
'messages/HCIEventTransactionSystemMessage.manifest',
|
||||
'messages/HCIEventTransactionSystemMessageConfigurator.js',
|
||||
]
|
||||
EXTRA_JS_MODULES += [
|
||||
'gonk/nfc_consts.js',
|
||||
|
@ -43,4 +43,11 @@ dictionary NfcEventOptions
|
||||
long maxSupportedLength;
|
||||
|
||||
long powerLevel;
|
||||
|
||||
// HCI Event Transaction fields
|
||||
DOMString origin;
|
||||
long originType;
|
||||
long originIndex;
|
||||
Uint8Array aid;
|
||||
Uint8Array payload;
|
||||
};
|
||||
|
@ -303,7 +303,7 @@
|
||||
<div id="ed_fileNotFound">&fileNotFound.longDesc;</div>
|
||||
<div id="ed_malformedURI">&malformedURI.longDesc;</div>
|
||||
<div id="ed_unknownProtocolFound">&unknownProtocolFound.longDesc;</div>
|
||||
<div id="ed_connectionFailure">&connectionFailure.longDesc;</div>
|
||||
<div id="ed_connectionFailure">&connectionFailure.longDesc2;</div>
|
||||
<div id="ed_netTimeout">&netTimeout.longDesc2;</div>
|
||||
<div id="ed_redirectLoop">&redirectLoop.longDesc;</div>
|
||||
<div id="ed_unknownSocketType">&unknownSocketType.longDesc;</div>
|
||||
|
262
toolkit/devtools/event-parsers.js
Normal file
262
toolkit/devtools/event-parsers.js
Normal file
@ -0,0 +1,262 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
// This file contains event parsers that are then used by developer tools in
|
||||
// order to find information about events affecting an HTML element.
|
||||
|
||||
"use strict";
|
||||
|
||||
const {Cc, Ci, Cu} = require("chrome");
|
||||
const {gDevTools} = Cu.import("resource:///modules/devtools/gDevTools.jsm", {});
|
||||
|
||||
loader.lazyGetter(this, "eventListenerService", () => {
|
||||
return Cc["@mozilla.org/eventlistenerservice;1"]
|
||||
.getService(Ci.nsIEventListenerService);
|
||||
});
|
||||
|
||||
let eventParsers = [
|
||||
{
|
||||
id: "jQuery events",
|
||||
getListeners: function(node) {
|
||||
let global = node.ownerGlobal.wrappedJSObject;
|
||||
let hasJQuery = global.jQuery && global.jQuery.fn && global.jQuery.fn.jquery;
|
||||
|
||||
if (!hasJQuery) {
|
||||
return;
|
||||
}
|
||||
|
||||
let jQuery = global.jQuery;
|
||||
let handlers = [];
|
||||
|
||||
// jQuery 1.2+
|
||||
let data = jQuery._data || jQuery.data;
|
||||
if (data) {
|
||||
let eventsObj = data(node, "events");
|
||||
for (let type in eventsObj) {
|
||||
let events = eventsObj[type];
|
||||
for (let key in events) {
|
||||
let event = events[key];
|
||||
if (typeof event === "object" || typeof event === "function") {
|
||||
let eventInfo = {
|
||||
type: type,
|
||||
handler: event.handler || event,
|
||||
tags: "jQuery",
|
||||
hide: {
|
||||
capturing: true,
|
||||
dom0: true
|
||||
}
|
||||
};
|
||||
|
||||
handlers.push(eventInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// JQuery 1.0 & 1.1
|
||||
let entry = jQuery(node)[0];
|
||||
|
||||
if (!entry) {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
for (let type in entry.events) {
|
||||
let events = entry.events[type];
|
||||
for (let key in events) {
|
||||
if (typeof events[key] === "function") {
|
||||
let eventInfo = {
|
||||
type: type,
|
||||
handler: events[key],
|
||||
tags: "jQuery",
|
||||
hide: {
|
||||
capturing: true,
|
||||
dom0: true
|
||||
}
|
||||
};
|
||||
|
||||
handlers.push(eventInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return handlers;
|
||||
}
|
||||
},
|
||||
{
|
||||
id: "jQuery live events",
|
||||
hasListeners: function(node) {
|
||||
return jQueryLiveGetListeners(node, true);
|
||||
},
|
||||
getListeners: function(node) {
|
||||
return jQueryLiveGetListeners(node, false);
|
||||
},
|
||||
normalizeHandler: function(handlerDO) {
|
||||
let paths = [
|
||||
[".event.proxy/", ".event.proxy/", "*"],
|
||||
[".proxy/", "*"]
|
||||
];
|
||||
|
||||
let name = handlerDO.displayName;
|
||||
|
||||
if (!name) {
|
||||
return handlerDO;
|
||||
}
|
||||
|
||||
for (let path of paths) {
|
||||
if (name.contains(path[0])) {
|
||||
path.splice(0, 1);
|
||||
|
||||
for (let point of path) {
|
||||
let names = handlerDO.environment.names();
|
||||
|
||||
for (let varName of names) {
|
||||
let temp = handlerDO.environment.getVariable(varName);
|
||||
if (!temp) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let displayName = temp.displayName;
|
||||
if (!displayName) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (temp.class === "Function" &&
|
||||
(displayName.contains(point) || point === "*")) {
|
||||
handlerDO = temp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return handlerDO;
|
||||
}
|
||||
},
|
||||
{
|
||||
id: "DOM events",
|
||||
hasListeners: function(node) {
|
||||
let listeners;
|
||||
|
||||
if (node.nodeName.toLowerCase() === "html") {
|
||||
listeners = eventListenerService.getListenerInfoFor(node.ownerGlobal) || [];
|
||||
} else {
|
||||
listeners = eventListenerService.getListenerInfoFor(node) || [];
|
||||
}
|
||||
|
||||
for (let listener of listeners) {
|
||||
if (listener.listenerObject && listener.type) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
getListeners: function(node) {
|
||||
let handlers = [];
|
||||
let listeners = eventListenerService.getListenerInfoFor(node);
|
||||
|
||||
// The Node actor's getEventListenerInfo knows that when an html tag has
|
||||
// been passed we need the window object so we don't need to account for
|
||||
// event hoisting here as we did in hasListeners.
|
||||
|
||||
for (let listenerObj of listeners) {
|
||||
let listener = listenerObj.listenerObject;
|
||||
|
||||
// If there is no JS event listener skip this.
|
||||
if (!listener) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let eventInfo = {
|
||||
capturing: listenerObj.capturing,
|
||||
type: listenerObj.type,
|
||||
handler: listener
|
||||
};
|
||||
|
||||
handlers.push(eventInfo);
|
||||
}
|
||||
|
||||
return handlers;
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
for (let parserObj of eventParsers) {
|
||||
gDevTools.registerEventParser(parserObj);
|
||||
}
|
||||
|
||||
function jQueryLiveGetListeners(node, boolOnEventFound) {
|
||||
let global = node.ownerGlobal.wrappedJSObject;
|
||||
let hasJQuery = global.jQuery && global.jQuery.fn && global.jQuery.fn.jquery;
|
||||
|
||||
if (!hasJQuery) {
|
||||
return;
|
||||
}
|
||||
|
||||
let jQuery = global.jQuery;
|
||||
let handlers = [];
|
||||
let data = jQuery._data || jQuery.data;
|
||||
|
||||
if (data) {
|
||||
// Live events are added to the document and bubble up to all elements.
|
||||
// Any element matching the specified selector will trigger the live
|
||||
// event.
|
||||
let events = data(global.document, "events");
|
||||
|
||||
for (let type in events) {
|
||||
let eventHolder = events[type];
|
||||
|
||||
for (let idx in eventHolder) {
|
||||
if (typeof idx !== "string" || isNaN(parseInt(idx, 10))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let event = eventHolder[idx];
|
||||
let selector = event.selector;
|
||||
|
||||
if (!selector && event.data) {
|
||||
selector = event.data.selector || event.data || event.selector;
|
||||
}
|
||||
|
||||
if (!selector || !node.ownerDocument) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let matches = node.matches && node.matches(selector);
|
||||
if (boolOnEventFound && matches) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!matches) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!boolOnEventFound && (typeof event === "object" || typeof event === "function")) {
|
||||
let eventInfo = {
|
||||
type: event.origType || event.type.substr(selector.length + 1),
|
||||
handler: event.handler || event,
|
||||
tags: "jQuery,Live",
|
||||
hide: {
|
||||
dom0: true,
|
||||
capturing: true
|
||||
}
|
||||
};
|
||||
|
||||
if (!eventInfo.type && event.data && event.data.live) {
|
||||
eventInfo.type = event.data.live;
|
||||
}
|
||||
|
||||
handlers.push(eventInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (boolOnEventFound) {
|
||||
return false;
|
||||
}
|
||||
return handlers;
|
||||
}
|
@ -32,6 +32,7 @@ EXTRA_JS_MODULES.devtools += [
|
||||
'deprecated-sync-thenables.js',
|
||||
'DevToolsUtils.js',
|
||||
'event-emitter.js',
|
||||
'event-parsers.js',
|
||||
'output-parser.js',
|
||||
'touch-events.js',
|
||||
'worker-loader.js',
|
||||
|
@ -290,24 +290,18 @@ var NodeActor = exports.NodeActor = protocol.ActorClass({
|
||||
},
|
||||
|
||||
/**
|
||||
* Are event listeners that are listening on this node?
|
||||
* Are there event listeners that are listening on this node? This method
|
||||
* uses all parsers registered via gDevTools.registerEventParser() to check if
|
||||
* there are any event listeners.
|
||||
*/
|
||||
get _hasEventListeners() {
|
||||
let listeners;
|
||||
|
||||
if (this.rawNode.nodeName.toLowerCase() === "html") {
|
||||
listeners = eventListenerService.getListenerInfoFor(this.rawNode.ownerGlobal);
|
||||
} else {
|
||||
listeners = eventListenerService.getListenerInfoFor(this.rawNode) || [];
|
||||
let parsers = gDevTools.eventParsers;
|
||||
for (let [,{hasListeners}] of parsers) {
|
||||
if (hasListeners && hasListeners(this.rawNode)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
listeners = listeners.filter(listener => {
|
||||
return listener.listenerObject && listener.type && listener.listenerObject;
|
||||
});
|
||||
|
||||
let hasListeners = listeners.length > 0;
|
||||
|
||||
return hasListeners;
|
||||
return false;
|
||||
},
|
||||
|
||||
writeAttrs: function() {
|
||||
@ -333,120 +327,164 @@ var NodeActor = exports.NodeActor = protocol.ActorClass({
|
||||
},
|
||||
|
||||
/**
|
||||
* Get event listeners attached to a node.
|
||||
* Gets event listeners and adds their information to the events array.
|
||||
*
|
||||
* @param {Node} node
|
||||
* Node for which we are to get listeners.
|
||||
*/
|
||||
getEventListeners: function(node) {
|
||||
let parsers = gDevTools.eventParsers;
|
||||
let dbg = this.parent().tabActor.makeDebugger();
|
||||
let events = [];
|
||||
|
||||
for (let [,{getListeners, normalizeHandler}] of parsers) {
|
||||
let eventInfos = getListeners(node);
|
||||
|
||||
if (!eventInfos) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (let eventInfo of eventInfos) {
|
||||
if (normalizeHandler) {
|
||||
eventInfo.normalizeHandler = normalizeHandler;
|
||||
}
|
||||
|
||||
this.processHandlerForEvent(node, events, dbg, eventInfo);
|
||||
}
|
||||
}
|
||||
|
||||
return events;
|
||||
},
|
||||
|
||||
/**
|
||||
* Process a handler
|
||||
*
|
||||
* @param {Node} node
|
||||
* The node for which we want information.
|
||||
* @param {Array} events
|
||||
* The events array contains all event objects that we have gathered
|
||||
* so far.
|
||||
* @param {Debugger} dbg
|
||||
* JSDebugger instance.
|
||||
* @param {Object} eventInfo
|
||||
* See gDevTools.registerEventParser() for a description of the
|
||||
* eventInfo object.
|
||||
*
|
||||
* @return {Array}
|
||||
* An array of objects where a typical object looks like this:
|
||||
* {
|
||||
* type: "click",
|
||||
* handler: function() { doSomething() },
|
||||
* origin: "http://www.mozilla.com",
|
||||
* searchString: 'onclick="doSomething()"',
|
||||
* tags: tags,
|
||||
* DOM0: true,
|
||||
* capturing: true,
|
||||
* handler: "function() { doSomething() }",
|
||||
* origin: "http://www.mozilla.com",
|
||||
* searchString: 'onclick="doSomething()"'
|
||||
* hide: {
|
||||
* dom0: true
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
getEventListeners: function(node) {
|
||||
let dbg = this.parent().tabActor.makeDebugger();
|
||||
processHandlerForEvent: function(node, events, dbg, eventInfo) {
|
||||
let type = eventInfo.type || "";
|
||||
let handler = eventInfo.handler;
|
||||
let tags = eventInfo.tags || "";
|
||||
let hide = eventInfo.hide || {};
|
||||
let override = eventInfo.override || {};
|
||||
let global = Cu.getGlobalForObject(handler);
|
||||
let globalDO = dbg.addDebuggee(global);
|
||||
let listenerDO = globalDO.makeDebuggeeValue(handler);
|
||||
|
||||
let handlers = eventListenerService.getListenerInfoFor(node);
|
||||
let events = [];
|
||||
|
||||
for (let handler of handlers) {
|
||||
let listener = handler.listenerObject;
|
||||
|
||||
// If there is no JS event listener skip this.
|
||||
if (!listener) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let global = Cu.getGlobalForObject(listener);
|
||||
let globalDO = dbg.addDebuggee(global);
|
||||
let listenerDO = globalDO.makeDebuggeeValue(listener);
|
||||
|
||||
// If the listener is an object with a 'handleEvent' method, use that.
|
||||
if (listenerDO.class === "Object" || listenerDO.class === "XULElement") {
|
||||
let desc;
|
||||
|
||||
while (!desc && listenerDO) {
|
||||
desc = listenerDO.getOwnPropertyDescriptor("handleEvent");
|
||||
listenerDO = listenerDO.proto;
|
||||
}
|
||||
|
||||
if (desc && desc.value) {
|
||||
listenerDO = desc.value;
|
||||
}
|
||||
}
|
||||
|
||||
if (listenerDO.isBoundFunction) {
|
||||
listenerDO = listenerDO.boundTargetFunction;
|
||||
}
|
||||
|
||||
let script = listenerDO.script;
|
||||
let scriptSource = script.source.text;
|
||||
let functionSource =
|
||||
scriptSource.substr(script.sourceStart, script.sourceLength);
|
||||
|
||||
/*
|
||||
The script returned is the whole script and
|
||||
scriptSource.substr(script.sourceStart, script.sourceLength) returns
|
||||
something like:
|
||||
() { doSomething(); }
|
||||
|
||||
So we need to work back to the preceeding \n, ; or } so we can get the
|
||||
appropriate function info e.g.:
|
||||
() => { doSomething(); }
|
||||
function doit() { doSomething(); }
|
||||
doit: function() { doSomething(); }
|
||||
*/
|
||||
let scriptBeforeFunc = scriptSource.substr(0, script.sourceStart);
|
||||
let lastEnding = Math.max(
|
||||
scriptBeforeFunc.lastIndexOf(";"),
|
||||
scriptBeforeFunc.lastIndexOf("}"),
|
||||
scriptBeforeFunc.lastIndexOf("{"),
|
||||
scriptBeforeFunc.lastIndexOf("("),
|
||||
scriptBeforeFunc.lastIndexOf(","),
|
||||
scriptBeforeFunc.lastIndexOf("!")
|
||||
);
|
||||
|
||||
if (lastEnding !== -1) {
|
||||
let functionPrefix = scriptBeforeFunc.substr(lastEnding + 1);
|
||||
functionSource = functionPrefix + functionSource;
|
||||
}
|
||||
|
||||
let type = handler.type;
|
||||
let dom0 = false;
|
||||
|
||||
if (typeof node.hasAttribute !== "undefined") {
|
||||
dom0 = !!node.hasAttribute("on" + type);
|
||||
} else {
|
||||
dom0 = !!node["on" + type];
|
||||
}
|
||||
|
||||
let line = script.startLine;
|
||||
let url = script.url;
|
||||
let origin = url + (dom0 ? "" : ":" + line);
|
||||
let searchString;
|
||||
|
||||
if (dom0) {
|
||||
searchString = "on" + type + "=\"" + script.source.text + "\"";
|
||||
} else {
|
||||
scriptSource = " " + scriptSource;
|
||||
}
|
||||
|
||||
events.push({
|
||||
type: type,
|
||||
DOM0: dom0,
|
||||
capturing: handler.capturing,
|
||||
handler: functionSource.trim(),
|
||||
origin: origin,
|
||||
searchString: searchString
|
||||
});
|
||||
if (eventInfo.normalizeHandler) {
|
||||
listenerDO = eventInfo.normalizeHandler(listenerDO);
|
||||
}
|
||||
dbg.removeAllDebuggees();
|
||||
return events;
|
||||
|
||||
// If the listener is an object with a 'handleEvent' method, use that.
|
||||
if (listenerDO.class === "Object" || listenerDO.class === "XULElement") {
|
||||
let desc;
|
||||
|
||||
while (!desc && listenerDO) {
|
||||
desc = listenerDO.getOwnPropertyDescriptor("handleEvent");
|
||||
listenerDO = listenerDO.proto;
|
||||
}
|
||||
|
||||
if (desc && desc.value) {
|
||||
listenerDO = desc.value;
|
||||
}
|
||||
}
|
||||
|
||||
if (listenerDO.isBoundFunction) {
|
||||
listenerDO = listenerDO.boundTargetFunction;
|
||||
}
|
||||
|
||||
let script = listenerDO.script;
|
||||
let scriptSource = script.source.text;
|
||||
let functionSource =
|
||||
scriptSource.substr(script.sourceStart, script.sourceLength);
|
||||
|
||||
/*
|
||||
The script returned is the whole script and
|
||||
scriptSource.substr(script.sourceStart, script.sourceLength) returns
|
||||
something like:
|
||||
() { doSomething(); }
|
||||
|
||||
So we need to work back to the preceeding \n, ; or } so we can get the
|
||||
appropriate function info e.g.:
|
||||
() => { doSomething(); }
|
||||
function doit() { doSomething(); }
|
||||
doit: function() { doSomething(); }
|
||||
*/
|
||||
let scriptBeforeFunc = scriptSource.substr(0, script.sourceStart);
|
||||
let lastEnding = Math.max(
|
||||
scriptBeforeFunc.lastIndexOf(";"),
|
||||
scriptBeforeFunc.lastIndexOf("}"),
|
||||
scriptBeforeFunc.lastIndexOf("{"),
|
||||
scriptBeforeFunc.lastIndexOf("("),
|
||||
scriptBeforeFunc.lastIndexOf(","),
|
||||
scriptBeforeFunc.lastIndexOf("!")
|
||||
);
|
||||
|
||||
if (lastEnding !== -1) {
|
||||
let functionPrefix = scriptBeforeFunc.substr(lastEnding + 1);
|
||||
functionSource = functionPrefix + functionSource;
|
||||
}
|
||||
|
||||
let dom0 = false;
|
||||
|
||||
if (typeof node.hasAttribute !== "undefined") {
|
||||
dom0 = !!node.hasAttribute("on" + type);
|
||||
} else {
|
||||
dom0 = !!node["on" + type];
|
||||
}
|
||||
|
||||
let line = script.startLine;
|
||||
let url = script.url;
|
||||
let origin = url + (dom0 ? "" : ":" + line);
|
||||
let searchString;
|
||||
|
||||
if (dom0) {
|
||||
searchString = "on" + type + "=\"" + script.source.text + "\"";
|
||||
} else {
|
||||
scriptSource = " " + scriptSource;
|
||||
}
|
||||
|
||||
let eventObj = {
|
||||
type: typeof override.type !== "undefined" ? override.type : type,
|
||||
handler: functionSource.trim(),
|
||||
origin: typeof override.origin !== "undefined" ?
|
||||
override.origin : origin,
|
||||
searchString: typeof override.searchString !== "undefined" ?
|
||||
override.searchString : searchString,
|
||||
tags: tags,
|
||||
DOM0: typeof override.dom0 !== "undefined" ? override.dom0 : dom0,
|
||||
capturing: typeof override.capturing !== "undefined" ?
|
||||
override.capturing : eventInfo.capturing,
|
||||
hide: hide
|
||||
};
|
||||
|
||||
events.push(eventObj);
|
||||
|
||||
dbg.removeDebuggee(globalDO);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -6133,17 +6133,27 @@ AddonInternal.prototype = {
|
||||
}
|
||||
catch (e) { }
|
||||
|
||||
for (let platform of this.targetPlatforms) {
|
||||
if (platform.os == Services.appinfo.OS) {
|
||||
if (platform.abi) {
|
||||
needsABI = true;
|
||||
if (platform.abi === abi)
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
matchedOS = true;
|
||||
// Something is causing errors in here
|
||||
try {
|
||||
for (let platform of this.targetPlatforms) {
|
||||
if (platform.os == Services.appinfo.OS) {
|
||||
if (platform.abi) {
|
||||
needsABI = true;
|
||||
if (platform.abi === abi)
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
matchedOS = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
let message = "Problem with addon " + this.id + " targetPlatforms "
|
||||
+ JSON.stringify(this.targetPlatforms);
|
||||
logger.error(message, e);
|
||||
AddonManagerPrivate.recordException("XPI", message, e);
|
||||
// don't trust this add-on
|
||||
return false;
|
||||
}
|
||||
|
||||
return matchedOS && !needsABI;
|
||||
|
@ -358,7 +358,6 @@ add_task(function cancel_mismatch() {
|
||||
|
||||
// Clear the AddonRepository-last-updated preference to ensure that it reloads
|
||||
Services.prefs.clearUserPref(PREF_METADATA_LASTUPDATE);
|
||||
let observeUpdateDone = promise_observer("TEST:addon-repository-data-updated");
|
||||
let installsDone = promise_observer("TEST:all-updates-done");
|
||||
|
||||
// Don't pull compatibility data during add-on install
|
||||
@ -414,8 +413,6 @@ add_task(function cancel_mismatch_no_updates() {
|
||||
Services.prefs.setBoolPref(PREF_STRICT_COMPAT, true);
|
||||
Services.prefs.setCharPref(PREF_MIN_PLATFORM_COMPAT, "0");
|
||||
|
||||
let observeUpdateDone = promise_observer("TEST:addon-repository-data-updated");
|
||||
|
||||
// Don't pull compatibility data during add-on install
|
||||
Services.prefs.setBoolPref(PREF_GETADDONS_CACHE_ENABLED, false);
|
||||
// No delay on the .sjs this time because we want the cache to repopulate
|
||||
|
Loading…
Reference in New Issue
Block a user