mirror of
https://github.com/openseadragon/openseadragon.git
synced 2024-11-22 05:06:09 +03:00
Merge pull request #421 from henri-astre-msft/memory_leak
Fix memory leak while destroying the viewer.
This commit is contained in:
commit
7ccacad70f
@ -302,6 +302,22 @@ $.Drawer.prototype = /** @lends OpenSeadragon.Drawer.prototype */{
|
||||
*/
|
||||
canRotate: function() {
|
||||
return this.useCanvas;
|
||||
},
|
||||
|
||||
/**
|
||||
* Destroy the drawer (unload current loaded tiles)
|
||||
* @method
|
||||
* @return null
|
||||
*/
|
||||
destroy: function() {
|
||||
//unload current loaded tiles (=empty TILE_CACHE)
|
||||
for ( var i = 0; i < this.tilesLoaded.length; ++i ) {
|
||||
this.tilesLoaded[i].unload();
|
||||
}
|
||||
|
||||
//force unloading of current canvas (1x1 will be gc later, trick not necessarily needed)
|
||||
this.canvas.width = 1;
|
||||
this.canvas.height = 1;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -252,6 +252,9 @@
|
||||
destroy: function () {
|
||||
stopTracking( this );
|
||||
this.element = null;
|
||||
|
||||
THIS[ this.hash ] = null;
|
||||
delete THIS[ this.hash ];
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -529,6 +529,12 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
||||
* @fires OpenSeadragon.Viewer.event:close
|
||||
*/
|
||||
close: function ( ) {
|
||||
|
||||
if ( !THIS[ this.hash ] ) {
|
||||
//this viewer has already been destroyed: returning immediately
|
||||
return this;
|
||||
}
|
||||
|
||||
if ( this._updateRequestId !== null ) {
|
||||
$.cancelAnimationFrame( this._updateRequestId );
|
||||
this._updateRequestId = null;
|
||||
@ -542,6 +548,10 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
||||
this.drawersContainer.innerHTML = "";
|
||||
this.overlaysContainer.innerHTML = "";
|
||||
|
||||
if ( this.drawer ) {
|
||||
this.drawer.destroy();
|
||||
}
|
||||
|
||||
this.source = null;
|
||||
this.drawer = null;
|
||||
this.drawers = [];
|
||||
@ -568,13 +578,26 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
||||
|
||||
|
||||
/**
|
||||
* Function to destroy the viewer and clean up everything created by
|
||||
* OpenSeadragon.
|
||||
* Function to destroy the viewer and clean up everything created by OpenSeadragon.
|
||||
*
|
||||
* Example:
|
||||
* var viewer = OpenSeadragon({
|
||||
* [...]
|
||||
* });
|
||||
*
|
||||
* //when you are done with the viewer:
|
||||
* viewer.destroy();
|
||||
* viewer = null; //important
|
||||
*
|
||||
* @function
|
||||
*/
|
||||
destroy: function( ) {
|
||||
this.close();
|
||||
|
||||
//TODO: implement this...
|
||||
//this.unbindSequenceControls()
|
||||
//this.unbindStandardControls()
|
||||
|
||||
this.removeAllHandlers();
|
||||
|
||||
// Go through top element (passed to us) and remove all children
|
||||
@ -597,6 +620,9 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
||||
this.outerTracker.destroy();
|
||||
}
|
||||
|
||||
THIS[ this.hash ] = null;
|
||||
delete THIS[ this.hash ];
|
||||
|
||||
// clear all our references to dom objects
|
||||
this.canvas = null;
|
||||
this.keyboardCommandArea = null;
|
||||
|
@ -295,6 +295,7 @@
|
||||
equal(null, viewer.container);
|
||||
equal(null, viewer.element);
|
||||
equal(true, closeCalled);
|
||||
viewer = null;
|
||||
start();
|
||||
});
|
||||
viewer.open('/test/data/testpattern.dzi');
|
||||
|
57
test/demo/memorycheck.html
Normal file
57
test/demo/memorycheck.html
Normal file
@ -0,0 +1,57 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>OpenSeadragon Memory Check Demo</title>
|
||||
<script type="text/javascript" src='../../build/openseadragon/openseadragon.js'></script>
|
||||
<style type="text/css">
|
||||
|
||||
.openseadragon1 {
|
||||
width: 800px;
|
||||
height: 600px;
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
Simple demo page to monitor OpenSeadragon Memory Usage.
|
||||
</div>
|
||||
<button onclick="createViewer()">Create</button>
|
||||
<button onclick="destroyViewer()">Destroy</button>
|
||||
|
||||
<div id="contentDiv" class="openseadragon1"></div>
|
||||
<script type="text/javascript">
|
||||
|
||||
var _viewer;
|
||||
|
||||
var generateUniqueHash = (function() {
|
||||
var counter = 0;
|
||||
return function() {
|
||||
return "openseadragon_" + (counter++);
|
||||
};
|
||||
})();
|
||||
|
||||
function createViewer() {
|
||||
if ( _viewer ) {
|
||||
destroyViewer();
|
||||
}
|
||||
|
||||
_viewer = OpenSeadragon({
|
||||
element: document.getElementById("contentDiv"),
|
||||
showNavigationControl: false,
|
||||
prefixUrl: "../../build/openseadragon/images/",
|
||||
hash: generateUniqueHash(), //this is only needed if you want to instantiate more than one viewer at a time.
|
||||
tileSources: "../data/testpattern.dzi"
|
||||
});
|
||||
}
|
||||
|
||||
function destroyViewer() {
|
||||
if ( _viewer ) {
|
||||
_viewer.destroy();
|
||||
}
|
||||
_viewer = null;
|
||||
}
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user