Skip to content

Commit

Permalink
- Further minor changes and clarifications based on the discussion here:
Browse files Browse the repository at this point in the history
#1 (comment)
- Fixed issue with playing/pausing through the cross domain protocol when the time machine is looping.
  • Loading branch information
pdille committed May 22, 2014
1 parent e92347e commit 9f5aac0
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 45 deletions.
31 changes: 19 additions & 12 deletions js/org/gigapan/timelapse/crossdomain_api.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,31 +52,37 @@ function setupPostMessageHandlers() {

// Handles the cross-domain iframe request to start playing a time machine.
pm.bind("timemachine-play", function() {
if (timelapse)
timelapse.play();
if (timelapse && timelapse.isPaused())
timelapse.handlePlayPause();
});

// Handles the cross-domain iframe request to pause a time machine.
pm.bind("timemachine-pause", function() {
if (timelapse)
timelapse.pause();
if (timelapse && !timelapse.isPaused())
timelapse.handlePlayPause();
});

// Handles the cross-domain iframe request to seek a time machine to the specified time.
pm.bind("timemachine-seek", function(unsafe_data) {
if (unsafe_data && typeof (unsafe_data) !== 'undefined' && timelapse)
timelapse.seek(unsafe_data);
if (unsafe_data && typeof (unsafe_data) !== 'undefined' && timelapse) {
var time = parseFloat(unsafe_data);
timelapse.seek(time);
}
});

// Handles the cross-domain iframe request to change the view of a time machine.
pm.bind("timemachine-set-view", function(unsafe_data) {
if (unsafe_data && typeof (unsafe_data) !== 'undefined' && timelapse) {
// Before we change the view, cancel any tours that may be playing.
var snaplapseTour = timelapse.getSnaplapseForSharedTour();
if (snaplapseTour)
snaplapseTour.clearSnaplapse();

// Sanitize data
var safe_data = {};
safe_data.view = timelapse.unsafeViewToView(unsafe_data.view);
safe_data.doWarp = !!unsafe_data.doWarp;
safe_data.doPlay = !!unsafe_data.doPlay;
timelapse.setNewView(safe_data.view, safe_data.doWarp, safe_data.doPlay);
var view = timelapse.unsafeViewToView(unsafe_data.view);
var doWarp = !!unsafe_data.doWarp;
var doPlay = !!unsafe_data.doPlay;
timelapse.setNewView(view, doWarp, doPlay);
}
});

Expand All @@ -92,9 +98,10 @@ function setupPostMessageHandlers() {
unsafe_data = org.gigapan.Util.unpackVars(unsafe_data);
}

// Before we change the view, cancel any tours that may be playing.
var snaplapseTour = timelapse.getSnaplapseForSharedTour();
if (snaplapseTour)
snaplapseTour.clearSnaplapse()
snaplapseTour.clearSnaplapse();

if (unsafe_data.v) {
var newView = timelapse.unsafeViewToView(unsafe_data.v.split(","));
Expand Down
68 changes: 35 additions & 33 deletions js/org/gigapan/timelapse/timelapse.js
Original file line number Diff line number Diff line change
Expand Up @@ -1003,31 +1003,33 @@ if (!window['$']) {
};
this.getShareView = getShareView;

// Extract a safe view object from an unsafe view string.
var unsafeViewToView = function(viewParam) {
// Extract a safe view from either a view object (i.e. {center:{x:val, y:val}, zoom:val}) or
// from an array of strings (i.e. a share URL, such as #v=44.96185,59.06233,4.5,latLng&t=0.10,
// that has been unpacked).
var unsafeViewToView = function(unsafe_viewParam) {
var view = null;

if (!viewParam)
return view;
if (!unsafe_viewParam)
return null;

// If the view is not a string (i.e an object) then we need to break it up into one
// so that we can sanitize it below.
if (viewParam.center || viewParam.bbox) {
// If we have a view object and not an array of strings (i.e. an unpacked share URL) then we need to unpack
// the view object into an array of strings so that it can be properly sanitized further down.
if (unsafe_viewParam.center || unsafe_viewParam.bbox) {
var tmpViewParam = [];
if (viewParam.center) {
if (unsafe_viewParam.center) {
var isLatLng = false;
var centerView = viewParam.center;
var centerView = unsafe_viewParam.center;
for (var key in centerView) {
tmpViewParam.push(centerView[key]);
if (key == "lat")
isLatLng = true;
}
tmpViewParam.push(viewParam.zoom);
tmpViewParam.push(unsafe_viewParam.zoom);
isLatLng ? tmpViewParam.push("latLng") : tmpViewParam.push("pts");
viewParam = tmpViewParam;
} else if (viewParam.bbox) {
unsafe_viewParam = tmpViewParam;
} else if (unsafe_viewParam.bbox) {
var isLatLng = false;
var bboxView = viewParam.bbox;
var bboxView = unsafe_viewParam.bbox;
for (var key in bboxView) {
if (key == "ne" || key == "sw") {
isLatLng = true;
Expand All @@ -1038,48 +1040,48 @@ if (!window['$']) {
}
}
isLatLng ? tmpViewParam.push("latLng") : tmpViewParam.push("pts");
viewParam = tmpViewParam;
unsafe_viewParam = tmpViewParam;
}
}

if (viewParam.indexOf("latLng") != -1) {
if (viewParam.length == 4)
if (unsafe_viewParam.indexOf("latLng") != -1) {
if (unsafe_viewParam.length == 4)
view = {
center: {
"lat": parseFloat(viewParam[0]),
"lng": parseFloat(viewParam[1])
"lat": parseFloat(unsafe_viewParam[0]),
"lng": parseFloat(unsafe_viewParam[1])
},
"zoom": parseFloat(viewParam[2])
"zoom": parseFloat(unsafe_viewParam[2])
};
else if (viewParam.length == 5)
else if (unsafe_viewParam.length == 5)
view = {
bbox: {
"ne": {
"lat": parseFloat(viewParam[0]),
"lng": parseFloat(viewParam[1])
"lat": parseFloat(unsafe_viewParam[0]),
"lng": parseFloat(unsafe_viewParam[1])
},
"sw": {
"lat": parseFloat(viewParam[2]),
"lng": parseFloat(viewParam[3])
"lat": parseFloat(unsafe_viewParam[2]),
"lng": parseFloat(unsafe_viewParam[3])
}
}
};
} else {// Assume points if the user did not specify latLng. Also allow for the omission of 'pts' param for backwards compatibility
if ((viewParam.indexOf("pts") == -1 && viewParam.length == 3) || viewParam.length == 4)
if ((unsafe_viewParam.indexOf("pts") == -1 && unsafe_viewParam.length == 3) || unsafe_viewParam.length == 4)
view = {
center: {
"x": parseFloat(viewParam[0]),
"y": parseFloat(viewParam[1])
"x": parseFloat(unsafe_viewParam[0]),
"y": parseFloat(unsafe_viewParam[1])
},
"zoom": parseFloat(viewParam[2])
"zoom": parseFloat(unsafe_viewParam[2])
};
else if ((viewParam.indexOf("pts") == -1 && viewParam.length == 4) || viewParam.length == 5)
else if ((unsafe_viewParam.indexOf("pts") == -1 && unsafe_viewParam.length == 4) || unsafe_viewParam.length == 5)
view = {
bbox: {
"xmin": parseFloat(viewParam[0]),
"xmax": parseFloat(viewParam[1]),
"ymin": parseFloat(viewParam[2]),
"ymax": parseFloat(viewParam[3])
"xmin": parseFloat(unsafe_viewParam[0]),
"xmax": parseFloat(unsafe_viewParam[1]),
"ymin": parseFloat(unsafe_viewParam[2]),
"ymax": parseFloat(unsafe_viewParam[3])
}
};
}
Expand Down

0 comments on commit 9f5aac0

Please sign in to comment.