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 @@
+ + \ No newline at end of file diff --git a/test/util.js b/test/util.js new file mode 100644 index 00000000..a426bd52 --- /dev/null +++ b/test/util.js @@ -0,0 +1,32 @@ +(function() { + + // ---------- + window.Util = { + // ---------- + simulateViewerClick: function(viewer, widthFactor, heightFactor) { + if (widthFactor === undefined) { + widthFactor = 0.5; + } + + if (heightFactor === undefined) { + heightFactor = 0.5; + } + + widthFactor = Math.min(1, Math.max(0, widthFactor)); + heightFactor = Math.min(1, Math.max(0, heightFactor)); + + var $canvas = $(viewer.element).find('.openseadragon-canvas').not('.navigator .openseadragon-canvas'); + var offset = $canvas.offset(); + var event = { + clientX: offset.left + Math.floor($canvas.width() * widthFactor), + clientY: offset.top + Math.floor($canvas.height() * heightFactor) + }; + + $canvas + .simulate('mouseover', event) + .simulate('mousedown', event) + .simulate('mouseup', event); + } + }; + +})();