diff --git a/Gruntfile.js b/Gruntfile.js
index 33e45459..e20b5e7c 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -9,10 +9,12 @@ module.exports = function(grunt) {
grunt.loadNpmTasks("grunt-contrib-connect");
grunt.loadNpmTasks("grunt-contrib-watch");
grunt.loadNpmTasks("grunt-contrib-clean");
+ grunt.loadNpmTasks("grunt-git-describe");
// ----------
var distribution = "build/openseadragon/openseadragon.js",
minified = "build/openseadragon/openseadragon.min.js",
+ releaseRoot = "../site-build/built-openseadragon/",
sources = [
"src/openseadragon.js",
"src/fullscreen.js",
@@ -51,11 +53,7 @@ module.exports = function(grunt) {
clean: {
build: ["build"],
release: {
- src: [
- "../site-build/openseadragon",
- "../site-build/openseadragon.zip",
- "../site-build/openseadragon.tar"
- ],
+ src: [releaseRoot],
options: {
force: true
}
@@ -65,6 +63,7 @@ module.exports = function(grunt) {
options: {
banner: "//! <%= pkg.name %> <%= pkg.version %>\n"
+ "//! Built on <%= grunt.template.today('yyyy-mm-dd') %>\n"
+ + "//! Git commit: <%= gitInfo %>\n"
+ "//! http://openseadragon.github.com\n\n",
process: true
},
@@ -130,6 +129,13 @@ module.exports = function(grunt) {
},
beforeconcat: sources,
afterconcat: [ distribution ]
+ },
+ "git-describe": {
+ build: {
+ options: {
+ prop: "gitInfo"
+ }
+ }
}
});
@@ -140,14 +146,16 @@ module.exports = function(grunt) {
grunt.file.recurse("images", function(abspath, rootdir, subdir, filename) {
grunt.file.copy(abspath, "build/openseadragon/images/" + (subdir || "") + filename);
});
+
+ grunt.file.copy("changelog.txt", "build/changelog.txt");
});
// ----------
// Copy:release task.
- // Copies the contents of the build folder into ../site-build.
+ // Copies the contents of the build folder into the release folder.
grunt.registerTask("copy:release", function() {
grunt.file.recurse("build", function(abspath, rootdir, subdir, filename) {
- var dest = "../site-build/"
+ var dest = releaseRoot
+ (subdir ? subdir + "/" : '/')
+ filename;
@@ -159,7 +167,7 @@ module.exports = function(grunt) {
// Build task.
// Cleans out the build folder and builds the code and images into it, checking lint.
grunt.registerTask("build", [
- "clean:build", "jshint:beforeconcat", "concat", "jshint:afterconcat", "uglify", "copy:build"
+ "clean:build", "jshint:beforeconcat", "git-describe", "concat", "jshint:afterconcat", "uglify", "copy:build"
]);
// ----------
@@ -174,7 +182,7 @@ module.exports = function(grunt) {
// ----------
// Publish task.
- // Cleans the built files out of ../site-build and copies newly built ones over.
+ // Cleans the built files out of the release folder and copies newly built ones over.
grunt.registerTask("publish", ["package", "clean:release", "copy:release"]);
// ----------
diff --git a/README.md b/README.md
index aaac7786..ae259f02 100644
--- a/README.md
+++ b/README.md
@@ -6,18 +6,6 @@ This project is a fork of the OpenSeadragon project at http://openseadragon.code
http://openseadragon.github.com/
-## We've upgraded to Grunt 0.4.0! Please follow these directions if you've built OpenSeadragon prior to Feb 22, 2013:
-
-If you're new here, you can skip down to the "First Time Setup" section.
-
-1. If you had already installed Grunt globally, you now need to uninstall it: `npm uninstall -g grunt`
-1. Delete the `build` and `node_modules` folders in your openseadragon directory
-1. On the command line, go in to the openseadragon folder
-1. Run `npm install -g grunt-cli` (this will install the Grunt command line runner)
-1. Run `npm install`
-
-For more information on the upgrade, see http://gruntjs.com/upgrading-from-0.3-to-0.4
-
## First Time Setup
All command-line operations are scripted using [Grunt](http://gruntjs.com/) which is based on [Node.js](http://nodejs.org/). To get set up:
diff --git a/changelog.txt b/changelog.txt
new file mode 100644
index 00000000..ccbcc5d6
--- /dev/null
+++ b/changelog.txt
@@ -0,0 +1,23 @@
+OPENSEADRAGON CHANGELOG
+=======================
+
+
+0.9.124:
+
+* Performance enhancements.
+
+
+0.9.123:
+
+* Real fullscreen support.
+
+
+0.9.122:
+
+* Performance enhancements.
+
+
+0.9.121:
+
+* Touch pan now works on Android.
+* Pinch zoom is better on all devices.
diff --git a/package.json b/package.json
index 193b912e..0a50b62a 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,8 @@
"grunt-contrib-qunit": "~0.1.1",
"grunt-contrib-connect": "~0.1.2",
"grunt-contrib-watch": "~0.2.0",
- "grunt-contrib-clean": "~0.4.0"
+ "grunt-contrib-clean": "~0.4.0",
+ "grunt-git-describe": "~2.0.0"
},
"scripts": {
"test": "grunt test"
diff --git a/test/basic.js b/test/basic.js
index 5e99f6b7..ca4556c8 100644
--- a/test/basic.js
+++ b/test/basic.js
@@ -1,5 +1,8 @@
(function() {
+ // TODO: Tighten up springs and use "immediate" where possible, so tests run faster
+ // TODO: Test drag
+
var viewer = null;
// ----------
@@ -17,7 +20,7 @@
var openHandler = function(eventSender, eventData) {
viewer.removeHandler('open', openHandler);
ok(true, 'Open event was sent');
- ok(eventSender === viewer, 'Sender of open event was viewer');
+ equal(eventSender, viewer, 'Sender of open event was viewer');
ok(eventData, 'Handler also received event data');
ok(viewer.viewport, 'Viewport exists');
start();
@@ -30,11 +33,11 @@
// ----------
asyncTest('Zoom', function() {
var viewport = viewer.viewport;
- ok(viewport.getZoom() === 1, 'We start out unzoomed');
+ equal(viewport.getZoom(), 1, 'We start out unzoomed');
var zoomHandler = function() {
viewer.removeHandler('animationfinish', zoomHandler);
- ok(viewport.getZoom() === 2, 'Zoomed correctly');
+ equal(viewport.getZoom(), 2, 'Zoomed correctly');
start();
};
@@ -59,6 +62,44 @@
viewport.panTo(new OpenSeadragon.Point(0.1, 0.1));
});
+ // ----------
+ asyncTest('Home', function() {
+ var viewport = viewer.viewport;
+ var center = viewport.getCenter();
+ ok(center.x !== 0.5 && center.y !== 0.5, 'We start out panned');
+ notEqual(viewport.getZoom(), 1, 'We start out zoomed');
+
+ var homeHandler = function() {
+ viewer.removeHandler('animationfinish', homeHandler);
+ center = viewport.getCenter();
+ ok(center.x === 0.5 && center.y === 0.5, 'We end up unpanned');
+ equal(viewport.getZoom(), 1, 'We end up unzoomed');
+ start();
+ };
+
+ viewer.addHandler('animationfinish', homeHandler);
+ viewport.goHome(true);
+ });
+
+ // ----------
+ asyncTest('Click', function() {
+ var viewport = viewer.viewport;
+ center = viewport.getCenter();
+ ok(center.x === 0.5 && center.y === 0.5, 'We start out unpanned');
+ equal(viewport.getZoom(), 1, 'We start out unzoomed');
+
+ var clickHandler = function() {
+ viewer.removeHandler('animationfinish', clickHandler);
+ center = viewport.getCenter();
+ ok(center.x > 0.37 && center.x < 0.38 && center.y > 0.37 && center.y < 0.38, 'Panned correctly');
+ equal(viewport.getZoom(), 2, 'Zoomed correctly');
+ start();
+ };
+
+ viewer.addHandler('animationfinish', clickHandler);
+ Util.simulateViewerClick(viewer, 0.25, 0.25);
+ });
+
// ----------
asyncTest('Close', function() {
var closeHandler = function() {
@@ -68,7 +109,6 @@
};
viewer.addHandler('close', closeHandler);
-
viewer.close();
});
diff --git a/test/data/tall.dzi b/test/data/tall.dzi
new file mode 100644
index 00000000..ae97400c
--- /dev/null
+++ b/test/data/tall.dzi
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/test/data/tall_files/0/0_0.jpg b/test/data/tall_files/0/0_0.jpg
new file mode 100644
index 00000000..f4539bd5
Binary files /dev/null and b/test/data/tall_files/0/0_0.jpg differ
diff --git a/test/data/tall_files/1/0_0.jpg b/test/data/tall_files/1/0_0.jpg
new file mode 100644
index 00000000..41814a0a
Binary files /dev/null and b/test/data/tall_files/1/0_0.jpg differ
diff --git a/test/data/tall_files/10/0_0.jpg b/test/data/tall_files/10/0_0.jpg
new file mode 100644
index 00000000..8fda66ad
Binary files /dev/null and b/test/data/tall_files/10/0_0.jpg differ
diff --git a/test/data/tall_files/10/0_1.jpg b/test/data/tall_files/10/0_1.jpg
new file mode 100644
index 00000000..45a6df84
Binary files /dev/null and b/test/data/tall_files/10/0_1.jpg differ
diff --git a/test/data/tall_files/10/0_2.jpg b/test/data/tall_files/10/0_2.jpg
new file mode 100644
index 00000000..6be93c69
Binary files /dev/null and b/test/data/tall_files/10/0_2.jpg differ
diff --git a/test/data/tall_files/10/0_3.jpg b/test/data/tall_files/10/0_3.jpg
new file mode 100644
index 00000000..f171102a
Binary files /dev/null and b/test/data/tall_files/10/0_3.jpg differ
diff --git a/test/data/tall_files/11/0_0.jpg b/test/data/tall_files/11/0_0.jpg
new file mode 100644
index 00000000..8f1f1208
Binary files /dev/null and b/test/data/tall_files/11/0_0.jpg differ
diff --git a/test/data/tall_files/11/0_1.jpg b/test/data/tall_files/11/0_1.jpg
new file mode 100644
index 00000000..989e6ef8
Binary files /dev/null and b/test/data/tall_files/11/0_1.jpg differ
diff --git a/test/data/tall_files/11/0_2.jpg b/test/data/tall_files/11/0_2.jpg
new file mode 100644
index 00000000..4cc29c68
Binary files /dev/null and b/test/data/tall_files/11/0_2.jpg differ
diff --git a/test/data/tall_files/11/0_3.jpg b/test/data/tall_files/11/0_3.jpg
new file mode 100644
index 00000000..a2eebefa
Binary files /dev/null and b/test/data/tall_files/11/0_3.jpg differ
diff --git a/test/data/tall_files/11/0_4.jpg b/test/data/tall_files/11/0_4.jpg
new file mode 100644
index 00000000..151233df
Binary files /dev/null and b/test/data/tall_files/11/0_4.jpg differ
diff --git a/test/data/tall_files/11/0_5.jpg b/test/data/tall_files/11/0_5.jpg
new file mode 100644
index 00000000..abbfae7e
Binary files /dev/null and b/test/data/tall_files/11/0_5.jpg differ
diff --git a/test/data/tall_files/11/0_6.jpg b/test/data/tall_files/11/0_6.jpg
new file mode 100644
index 00000000..ecb131c5
Binary files /dev/null and b/test/data/tall_files/11/0_6.jpg differ
diff --git a/test/data/tall_files/11/0_7.jpg b/test/data/tall_files/11/0_7.jpg
new file mode 100644
index 00000000..260e113c
Binary files /dev/null and b/test/data/tall_files/11/0_7.jpg differ
diff --git a/test/data/tall_files/11/1_0.jpg b/test/data/tall_files/11/1_0.jpg
new file mode 100644
index 00000000..fc22c286
Binary files /dev/null and b/test/data/tall_files/11/1_0.jpg differ
diff --git a/test/data/tall_files/11/1_1.jpg b/test/data/tall_files/11/1_1.jpg
new file mode 100644
index 00000000..9bf60a2d
Binary files /dev/null and b/test/data/tall_files/11/1_1.jpg differ
diff --git a/test/data/tall_files/11/1_2.jpg b/test/data/tall_files/11/1_2.jpg
new file mode 100644
index 00000000..b1c61b11
Binary files /dev/null and b/test/data/tall_files/11/1_2.jpg differ
diff --git a/test/data/tall_files/11/1_3.jpg b/test/data/tall_files/11/1_3.jpg
new file mode 100644
index 00000000..76ac9a05
Binary files /dev/null and b/test/data/tall_files/11/1_3.jpg differ
diff --git a/test/data/tall_files/11/1_4.jpg b/test/data/tall_files/11/1_4.jpg
new file mode 100644
index 00000000..abd973c2
Binary files /dev/null and b/test/data/tall_files/11/1_4.jpg differ
diff --git a/test/data/tall_files/11/1_5.jpg b/test/data/tall_files/11/1_5.jpg
new file mode 100644
index 00000000..c747e948
Binary files /dev/null and b/test/data/tall_files/11/1_5.jpg differ
diff --git a/test/data/tall_files/11/1_6.jpg b/test/data/tall_files/11/1_6.jpg
new file mode 100644
index 00000000..f6b9f0c0
Binary files /dev/null and b/test/data/tall_files/11/1_6.jpg differ
diff --git a/test/data/tall_files/11/1_7.jpg b/test/data/tall_files/11/1_7.jpg
new file mode 100644
index 00000000..00c74b8d
Binary files /dev/null and b/test/data/tall_files/11/1_7.jpg differ
diff --git a/test/data/tall_files/2/0_0.jpg b/test/data/tall_files/2/0_0.jpg
new file mode 100644
index 00000000..9551d08d
Binary files /dev/null and b/test/data/tall_files/2/0_0.jpg differ
diff --git a/test/data/tall_files/3/0_0.jpg b/test/data/tall_files/3/0_0.jpg
new file mode 100644
index 00000000..37f6d160
Binary files /dev/null and b/test/data/tall_files/3/0_0.jpg differ
diff --git a/test/data/tall_files/4/0_0.jpg b/test/data/tall_files/4/0_0.jpg
new file mode 100644
index 00000000..679a80bb
Binary files /dev/null and b/test/data/tall_files/4/0_0.jpg differ
diff --git a/test/data/tall_files/5/0_0.jpg b/test/data/tall_files/5/0_0.jpg
new file mode 100644
index 00000000..97783402
Binary files /dev/null and b/test/data/tall_files/5/0_0.jpg differ
diff --git a/test/data/tall_files/6/0_0.jpg b/test/data/tall_files/6/0_0.jpg
new file mode 100644
index 00000000..defd756e
Binary files /dev/null and b/test/data/tall_files/6/0_0.jpg differ
diff --git a/test/data/tall_files/7/0_0.jpg b/test/data/tall_files/7/0_0.jpg
new file mode 100644
index 00000000..dfdc4264
Binary files /dev/null and b/test/data/tall_files/7/0_0.jpg differ
diff --git a/test/data/tall_files/8/0_0.jpg b/test/data/tall_files/8/0_0.jpg
new file mode 100644
index 00000000..56df114e
Binary files /dev/null and b/test/data/tall_files/8/0_0.jpg differ
diff --git a/test/data/tall_files/9/0_0.jpg b/test/data/tall_files/9/0_0.jpg
new file mode 100644
index 00000000..c797a643
Binary files /dev/null and b/test/data/tall_files/9/0_0.jpg differ
diff --git a/test/data/tall_files/9/0_1.jpg b/test/data/tall_files/9/0_1.jpg
new file mode 100644
index 00000000..858a9b70
Binary files /dev/null and b/test/data/tall_files/9/0_1.jpg differ
diff --git a/test/data/wide.dzi b/test/data/wide.dzi
new file mode 100644
index 00000000..e6877fd9
--- /dev/null
+++ b/test/data/wide.dzi
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/test/data/wide_files/0/0_0.jpg b/test/data/wide_files/0/0_0.jpg
new file mode 100644
index 00000000..f4539bd5
Binary files /dev/null and b/test/data/wide_files/0/0_0.jpg differ
diff --git a/test/data/wide_files/1/0_0.jpg b/test/data/wide_files/1/0_0.jpg
new file mode 100644
index 00000000..dfb59057
Binary files /dev/null and b/test/data/wide_files/1/0_0.jpg differ
diff --git a/test/data/wide_files/10/0_0.jpg b/test/data/wide_files/10/0_0.jpg
new file mode 100644
index 00000000..37dcf406
Binary files /dev/null and b/test/data/wide_files/10/0_0.jpg differ
diff --git a/test/data/wide_files/10/1_0.jpg b/test/data/wide_files/10/1_0.jpg
new file mode 100644
index 00000000..5c62e66e
Binary files /dev/null and b/test/data/wide_files/10/1_0.jpg differ
diff --git a/test/data/wide_files/10/2_0.jpg b/test/data/wide_files/10/2_0.jpg
new file mode 100644
index 00000000..09c0b4b3
Binary files /dev/null and b/test/data/wide_files/10/2_0.jpg differ
diff --git a/test/data/wide_files/10/3_0.jpg b/test/data/wide_files/10/3_0.jpg
new file mode 100644
index 00000000..a075a45e
Binary files /dev/null and b/test/data/wide_files/10/3_0.jpg differ
diff --git a/test/data/wide_files/11/0_0.jpg b/test/data/wide_files/11/0_0.jpg
new file mode 100644
index 00000000..a8141fac
Binary files /dev/null and b/test/data/wide_files/11/0_0.jpg differ
diff --git a/test/data/wide_files/11/0_1.jpg b/test/data/wide_files/11/0_1.jpg
new file mode 100644
index 00000000..8c76a0bf
Binary files /dev/null and b/test/data/wide_files/11/0_1.jpg differ
diff --git a/test/data/wide_files/11/1_0.jpg b/test/data/wide_files/11/1_0.jpg
new file mode 100644
index 00000000..9ab32b4f
Binary files /dev/null and b/test/data/wide_files/11/1_0.jpg differ
diff --git a/test/data/wide_files/11/1_1.jpg b/test/data/wide_files/11/1_1.jpg
new file mode 100644
index 00000000..f3a7e82c
Binary files /dev/null and b/test/data/wide_files/11/1_1.jpg differ
diff --git a/test/data/wide_files/11/2_0.jpg b/test/data/wide_files/11/2_0.jpg
new file mode 100644
index 00000000..7744b9c6
Binary files /dev/null and b/test/data/wide_files/11/2_0.jpg differ
diff --git a/test/data/wide_files/11/2_1.jpg b/test/data/wide_files/11/2_1.jpg
new file mode 100644
index 00000000..77da6f71
Binary files /dev/null and b/test/data/wide_files/11/2_1.jpg differ
diff --git a/test/data/wide_files/11/3_0.jpg b/test/data/wide_files/11/3_0.jpg
new file mode 100644
index 00000000..7ea21cfa
Binary files /dev/null and b/test/data/wide_files/11/3_0.jpg differ
diff --git a/test/data/wide_files/11/3_1.jpg b/test/data/wide_files/11/3_1.jpg
new file mode 100644
index 00000000..486dba59
Binary files /dev/null and b/test/data/wide_files/11/3_1.jpg differ
diff --git a/test/data/wide_files/11/4_0.jpg b/test/data/wide_files/11/4_0.jpg
new file mode 100644
index 00000000..1ea7c926
Binary files /dev/null and b/test/data/wide_files/11/4_0.jpg differ
diff --git a/test/data/wide_files/11/4_1.jpg b/test/data/wide_files/11/4_1.jpg
new file mode 100644
index 00000000..d55b44bc
Binary files /dev/null and b/test/data/wide_files/11/4_1.jpg differ
diff --git a/test/data/wide_files/11/5_0.jpg b/test/data/wide_files/11/5_0.jpg
new file mode 100644
index 00000000..c87ba066
Binary files /dev/null and b/test/data/wide_files/11/5_0.jpg differ
diff --git a/test/data/wide_files/11/5_1.jpg b/test/data/wide_files/11/5_1.jpg
new file mode 100644
index 00000000..241fc4a4
Binary files /dev/null and b/test/data/wide_files/11/5_1.jpg differ
diff --git a/test/data/wide_files/11/6_0.jpg b/test/data/wide_files/11/6_0.jpg
new file mode 100644
index 00000000..74c2b4ec
Binary files /dev/null and b/test/data/wide_files/11/6_0.jpg differ
diff --git a/test/data/wide_files/11/6_1.jpg b/test/data/wide_files/11/6_1.jpg
new file mode 100644
index 00000000..3630ca68
Binary files /dev/null and b/test/data/wide_files/11/6_1.jpg differ
diff --git a/test/data/wide_files/11/7_0.jpg b/test/data/wide_files/11/7_0.jpg
new file mode 100644
index 00000000..97bbe8e9
Binary files /dev/null and b/test/data/wide_files/11/7_0.jpg differ
diff --git a/test/data/wide_files/11/7_1.jpg b/test/data/wide_files/11/7_1.jpg
new file mode 100644
index 00000000..58d0be3e
Binary files /dev/null and b/test/data/wide_files/11/7_1.jpg differ
diff --git a/test/data/wide_files/2/0_0.jpg b/test/data/wide_files/2/0_0.jpg
new file mode 100644
index 00000000..032339aa
Binary files /dev/null and b/test/data/wide_files/2/0_0.jpg differ
diff --git a/test/data/wide_files/3/0_0.jpg b/test/data/wide_files/3/0_0.jpg
new file mode 100644
index 00000000..25ccad52
Binary files /dev/null and b/test/data/wide_files/3/0_0.jpg differ
diff --git a/test/data/wide_files/4/0_0.jpg b/test/data/wide_files/4/0_0.jpg
new file mode 100644
index 00000000..c3d28c32
Binary files /dev/null and b/test/data/wide_files/4/0_0.jpg differ
diff --git a/test/data/wide_files/5/0_0.jpg b/test/data/wide_files/5/0_0.jpg
new file mode 100644
index 00000000..e52b385a
Binary files /dev/null and b/test/data/wide_files/5/0_0.jpg differ
diff --git a/test/data/wide_files/6/0_0.jpg b/test/data/wide_files/6/0_0.jpg
new file mode 100644
index 00000000..6e40a830
Binary files /dev/null and b/test/data/wide_files/6/0_0.jpg differ
diff --git a/test/data/wide_files/7/0_0.jpg b/test/data/wide_files/7/0_0.jpg
new file mode 100644
index 00000000..724c581b
Binary files /dev/null and b/test/data/wide_files/7/0_0.jpg differ
diff --git a/test/data/wide_files/8/0_0.jpg b/test/data/wide_files/8/0_0.jpg
new file mode 100644
index 00000000..85330803
Binary files /dev/null and b/test/data/wide_files/8/0_0.jpg differ
diff --git a/test/data/wide_files/9/0_0.jpg b/test/data/wide_files/9/0_0.jpg
new file mode 100644
index 00000000..c8a44d26
Binary files /dev/null and b/test/data/wide_files/9/0_0.jpg differ
diff --git a/test/data/wide_files/9/1_0.jpg b/test/data/wide_files/9/1_0.jpg
new file mode 100644
index 00000000..54213e7a
Binary files /dev/null and b/test/data/wide_files/9/1_0.jpg differ
diff --git a/test/lib/jquery.simulate.js b/test/lib/jquery.simulate.js
new file mode 100644
index 00000000..6e2f3ba8
--- /dev/null
+++ b/test/lib/jquery.simulate.js
@@ -0,0 +1,324 @@
+ /*!
+ * jQuery Simulate v0.0.1 - simulate browser mouse and keyboard events
+ * https://github.com/jquery/jquery-simulate
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * Date: Sun Dec 9 12:15:33 2012 -0500
+ */
+
+;(function( $, undefined ) {
+
+var rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|contextmenu)|click/;
+
+$.fn.simulate = function( type, options ) {
+ return this.each(function() {
+ new $.simulate( this, type, options );
+ });
+};
+
+$.simulate = function( elem, type, options ) {
+ var method = $.camelCase( "simulate-" + type );
+
+ this.target = elem;
+ this.options = options;
+
+ if ( this[ method ] ) {
+ this[ method ]();
+ } else {
+ this.simulateEvent( elem, type, options );
+ }
+};
+
+$.extend( $.simulate, {
+
+ keyCode: {
+ BACKSPACE: 8,
+ COMMA: 188,
+ DELETE: 46,
+ DOWN: 40,
+ END: 35,
+ ENTER: 13,
+ ESCAPE: 27,
+ HOME: 36,
+ LEFT: 37,
+ NUMPAD_ADD: 107,
+ NUMPAD_DECIMAL: 110,
+ NUMPAD_DIVIDE: 111,
+ NUMPAD_ENTER: 108,
+ NUMPAD_MULTIPLY: 106,
+ NUMPAD_SUBTRACT: 109,
+ PAGE_DOWN: 34,
+ PAGE_UP: 33,
+ PERIOD: 190,
+ RIGHT: 39,
+ SPACE: 32,
+ TAB: 9,
+ UP: 38
+ },
+
+ buttonCode: {
+ LEFT: 0,
+ MIDDLE: 1,
+ RIGHT: 2
+ }
+});
+
+$.extend( $.simulate.prototype, {
+
+ simulateEvent: function( elem, type, options ) {
+ var event = this.createEvent( type, options );
+ this.dispatchEvent( elem, type, event, options );
+ },
+
+ createEvent: function( type, options ) {
+ if ( rkeyEvent.test( type ) ) {
+ return this.keyEvent( type, options );
+ }
+
+ if ( rmouseEvent.test( type ) ) {
+ return this.mouseEvent( type, options );
+ }
+ },
+
+ mouseEvent: function( type, options ) {
+ var event, eventDoc, doc, body;
+ options = $.extend({
+ bubbles: true,
+ cancelable: (type !== "mousemove"),
+ view: window,
+ detail: 0,
+ screenX: 0,
+ screenY: 0,
+ clientX: 1,
+ clientY: 1,
+ ctrlKey: false,
+ altKey: false,
+ shiftKey: false,
+ metaKey: false,
+ button: 0,
+ relatedTarget: undefined
+ }, options );
+
+ if ( document.createEvent ) {
+ event = document.createEvent( "MouseEvents" );
+ event.initMouseEvent( type, options.bubbles, options.cancelable,
+ options.view, options.detail,
+ options.screenX, options.screenY, options.clientX, options.clientY,
+ options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
+ options.button, options.relatedTarget || document.body.parentNode );
+
+ // IE 9+ creates events with pageX and pageY set to 0.
+ // Trying to modify the properties throws an error,
+ // so we define getters to return the correct values.
+ if ( event.pageX === 0 && event.pageY === 0 && Object.defineProperty ) {
+ eventDoc = event.relatedTarget.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ Object.defineProperty( event, "pageX", {
+ get: function() {
+ return options.clientX +
+ ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
+ ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ }
+ });
+ Object.defineProperty( event, "pageY", {
+ get: function() {
+ return options.clientY +
+ ( doc && doc.scrollTop || body && body.scrollTop || 0 ) -
+ ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+ });
+ }
+ } else if ( document.createEventObject ) {
+ event = document.createEventObject();
+ $.extend( event, options );
+ // standards event.button uses constants defined here: http://msdn.microsoft.com/en-us/library/ie/ff974877(v=vs.85).aspx
+ // old IE event.button uses constants defined here: http://msdn.microsoft.com/en-us/library/ie/ms533544(v=vs.85).aspx
+ // so we actually need to map the standard back to oldIE
+ event.button = {
+ 0: 1,
+ 1: 4,
+ 2: 2
+ }[ event.button ] || event.button;
+ }
+
+ return event;
+ },
+
+ keyEvent: function( type, options ) {
+ var event;
+ options = $.extend({
+ bubbles: true,
+ cancelable: true,
+ view: window,
+ ctrlKey: false,
+ altKey: false,
+ shiftKey: false,
+ metaKey: false,
+ keyCode: 0,
+ charCode: undefined
+ }, options );
+
+ if ( document.createEvent ) {
+ try {
+ event = document.createEvent( "KeyEvents" );
+ event.initKeyEvent( type, options.bubbles, options.cancelable, options.view,
+ options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
+ options.keyCode, options.charCode );
+ // initKeyEvent throws an exception in WebKit
+ // see: http://stackoverflow.com/questions/6406784/initkeyevent-keypress-only-works-in-firefox-need-a-cross-browser-solution
+ // and also https://bugs.webkit.org/show_bug.cgi?id=13368
+ // fall back to a generic event until we decide to implement initKeyboardEvent
+ } catch( err ) {
+ event = document.createEvent( "Events" );
+ event.initEvent( type, options.bubbles, options.cancelable );
+ $.extend( event, {
+ view: options.view,
+ ctrlKey: options.ctrlKey,
+ altKey: options.altKey,
+ shiftKey: options.shiftKey,
+ metaKey: options.metaKey,
+ keyCode: options.keyCode,
+ charCode: options.charCode
+ });
+ }
+ } else if ( document.createEventObject ) {
+ event = document.createEventObject();
+ $.extend( event, options );
+ }
+
+ if ( !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ) || (({}).toString.call( window.opera ) === "[object Opera]") ) {
+ event.keyCode = (options.charCode > 0) ? options.charCode : options.keyCode;
+ event.charCode = undefined;
+ }
+
+ return event;
+ },
+
+ dispatchEvent: function( elem, type, event ) {
+ if ( elem.dispatchEvent ) {
+ elem.dispatchEvent( event );
+ } else if ( elem.fireEvent ) {
+ elem.fireEvent( "on" + type, event );
+ }
+ },
+
+ simulateFocus: function() {
+ var focusinEvent,
+ triggered = false,
+ element = $( this.target );
+
+ function trigger() {
+ triggered = true;
+ }
+
+ element.bind( "focus", trigger );
+ element[ 0 ].focus();
+
+ if ( !triggered ) {
+ focusinEvent = $.Event( "focusin" );
+ focusinEvent.preventDefault();
+ element.trigger( focusinEvent );
+ element.triggerHandler( "focus" );
+ }
+ element.unbind( "focus", trigger );
+ },
+
+ simulateBlur: function() {
+ var focusoutEvent,
+ triggered = false,
+ element = $( this.target );
+
+ function trigger() {
+ triggered = true;
+ }
+
+ element.bind( "blur", trigger );
+ element[ 0 ].blur();
+
+ // blur events are async in IE
+ setTimeout(function() {
+ // IE won't let the blur occur if the window is inactive
+ if ( element[ 0 ].ownerDocument.activeElement === element[ 0 ] ) {
+ element[ 0 ].ownerDocument.body.focus();
+ }
+
+ // Firefox won't trigger events if the window is inactive
+ // IE doesn't trigger events if we had to manually focus the body
+ if ( !triggered ) {
+ focusoutEvent = $.Event( "focusout" );
+ focusoutEvent.preventDefault();
+ element.trigger( focusoutEvent );
+ element.triggerHandler( "blur" );
+ }
+ element.unbind( "blur", trigger );
+ }, 1 );
+ }
+});
+
+
+
+/** complex events **/
+
+function findCenter( elem ) {
+ var offset,
+ document = $( elem.ownerDocument );
+ elem = $( elem );
+ offset = elem.offset();
+
+ return {
+ x: offset.left + elem.outerWidth() / 2 - document.scrollLeft(),
+ y: offset.top + elem.outerHeight() / 2 - document.scrollTop()
+ };
+}
+
+function findCorner( elem ) {
+ var offset,
+ document = $( elem.ownerDocument );
+ elem = $( elem );
+ offset = elem.offset();
+
+ return {
+ x: offset.left - document.scrollLeft(),
+ y: offset.top - document.scrollTop()
+ };
+}
+
+$.extend( $.simulate.prototype, {
+ simulateDrag: function() {
+ var i = 0,
+ target = this.target,
+ options = this.options,
+ center = options.handle === "corner" ? findCorner( target ) : findCenter( target ),
+ x = Math.floor( center.x ),
+ y = Math.floor( center.y ),
+ coord = { clientX: x, clientY: y },
+ dx = options.dx || ( options.x !== undefined ? options.x - x : 0 ),
+ dy = options.dy || ( options.y !== undefined ? options.y - y : 0 ),
+ moves = options.moves || 3;
+
+ this.simulateEvent( target, "mousedown", coord );
+
+ for ( ; i < moves ; i++ ) {
+ x += dx / moves;
+ y += dy / moves;
+
+ coord = {
+ clientX: Math.round( x ),
+ clientY: Math.round( y )
+ };
+
+ this.simulateEvent( document, "mousemove", coord );
+ }
+
+ this.simulateEvent( target, "mouseup", coord );
+ this.simulateEvent( target, "click", coord );
+ }
+});
+
+})( jQuery );
diff --git a/test/test.html b/test/test.html
index a88ca967..37a9afe4 100644
--- a/test/test.html
+++ b/test/test.html
@@ -12,7 +12,9 @@
+
+