diff --git a/src/openseadragon.js b/src/openseadragon.js index d8520766..6eb8d09a 100644 --- a/src/openseadragon.js +++ b/src/openseadragon.js @@ -2208,6 +2208,24 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ return $.parseXml( string ); }, + /** + * Parses a JSON string into a Javascript object. + * @function + * @param {String} string + * @returns {Object} + */ + parseJSON: function(string) { + if (window.JSON && window.JSON.parse) { + $.parseJSON = window.JSON.parse; + } else { + // Should only be used by IE8 in non standards mode + $.parseJSON = function(string) { + /*jshint evil:true*/ + return eval('(' + string + ')'); + }; + } + return $.parseJSON(string); + }, /** * Reports whether the image format is supported for tiling in this diff --git a/src/tilesource.js b/src/tilesource.js index 48d5bf10..65841d25 100644 --- a/src/tilesource.js +++ b/src/tilesource.js @@ -613,8 +613,7 @@ function processResponse( xhr ){ data = xhr.responseText; } }else if( responseText.match(/\s*[\{\[].*/) ){ - /*jshint evil:true*/ - data = eval( '('+responseText+')' ); + data = $.parseJSON(responseText); }else{ data = responseText; } diff --git a/src/viewer.js b/src/viewer.js index 01560f01..b0ee7757 100644 --- a/src/viewer.js +++ b/src/viewer.js @@ -1996,8 +1996,7 @@ function getTileSourceImplementation( viewer, tileSource, successCallback, if ( tileSource.match( /\s*<.*/ ) ) { tileSource = $.parseXml( tileSource ); } else if ( tileSource.match( /\s*[\{\[].*/ ) ) { - /*jshint evil:true*/ - tileSource = eval( '(' + tileSource + ')' ); + tileSource = $.parseJSON(tileSource); } } diff --git a/test/modules/formats.js b/test/modules/formats.js index 3c0f0610..2cef3576 100644 --- a/test/modules/formats.js +++ b/test/modules/formats.js @@ -14,14 +14,18 @@ var viewer = null; // ---------- - var testOpen = function(name) { + var testOpenUrl = function(relativeUrl) { + testOpen('/test/data/' + relativeUrl); + }; + + var testOpen = function(tileSource) { $(document).ready(function() { var timeWatcher = Util.timeWatcher(7000); viewer = OpenSeadragon({ id: 'example', prefixUrl: '/build/openseadragon/images/', - tileSources: '/test/data/' + name + tileSources: tileSource }); ok(viewer, 'Viewer exists'); @@ -52,62 +56,90 @@ // ---------- asyncTest('DZI', function() { - testOpen('testpattern.dzi'); + testOpenUrl('testpattern.dzi'); }); // ---------- asyncTest('DZI JSONp', function() { - testOpen('testpattern.js'); + testOpenUrl('testpattern.js'); }); // ---------- asyncTest('DZI XML', function() { - testOpen('testpattern.xml'); + testOpenUrl('testpattern.xml'); }); // ---------- asyncTest('DZI XML with query parameter', function() { - testOpen('testpattern.xml?param=value'); + testOpenUrl('testpattern.xml?param=value'); }); // ---------- asyncTest('IIIF 1.0 JSON', function() { - testOpen('iiif_1_0_files/info.json'); + testOpenUrl('iiif_1_0_files/info.json'); }); // ---------- asyncTest('IIIF 1.0 XML', function() { - testOpen('iiif_1_0_files/info.xml'); + testOpenUrl('iiif_1_0_files/info.xml'); }); // ---------- asyncTest('IIIF 1.1 JSON', function() { - testOpen('iiif_1_1_tiled/info.json'); + testOpenUrl('iiif_1_1_tiled/info.json'); }); // ---------- asyncTest('IIIF No Tiles, Less than 256', function() { - testOpen('iiif_1_1_no_tiles_255/info.json'); + testOpenUrl('iiif_1_1_no_tiles_255/info.json'); }); // ---------- asyncTest('IIIF No Tiles, Bet. 256 and 512', function() { - testOpen('iiif_1_1_no_tiles_384/info.json'); + testOpenUrl('iiif_1_1_no_tiles_384/info.json'); }); // ---------- asyncTest('IIIF No Tiles, Bet. 512 and 1024', function() { - testOpen('iiif_1_1_no_tiles_768/info.json'); + testOpenUrl('iiif_1_1_no_tiles_768/info.json'); }); // ---------- asyncTest('IIIF No Tiles, Larger than 1024', function() { - testOpen('iiif_1_1_no_tiles_1048/info.json'); + testOpenUrl('iiif_1_1_no_tiles_1048/info.json'); }); // ---------- asyncTest('IIIF 2.0 JSON', function() { - testOpen('iiif_2_0_tiled/info.json'); + testOpenUrl('iiif_2_0_tiled/info.json'); + }); + + // ---------- + asyncTest('IIIF 2.0 JSON String', function() { + testOpen( + '{' + + ' "@context": "http://iiif.io/api/image/2/context.json",' + + ' "@id": "http://localhost:8000/test/data/iiif_2_0_tiled",' + + ' "protocol": "http://iiif.io/api/image",' + + ' "height": 1024,' + + ' "width": 775,' + + ' "tiles" : [{"width":256, "scaleFactors":[1,2,4,8]}],' + + ' "profile": ["http://iiif.io/api/image/2/level1.json",' + + ' {' + + ' "qualities": [' + + ' "native",' + + ' "bitonal",' + + ' "grey",' + + ' "color"' + + ' ],' + + ' "formats": [' + + ' "jpg",' + + ' "png",' + + ' "gif"' + + ' ]' + + ' }' + + ' ]' + + '}'); }); })();