From e0b708fb084ab5ea4373e51bb800baa46ff2f1ed Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Thu, 4 Sep 2014 15:25:50 -0700 Subject: [PATCH] [added] Ability to transitionTo absolute URLs --- modules/actions/LocationActions.js | 29 +++++++++++++++++++++-------- modules/utils/isAbsoluteURL.js | 11 +++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 modules/utils/isAbsoluteURL.js diff --git a/modules/actions/LocationActions.js b/modules/actions/LocationActions.js index d6c9e699d5..0cf19f75bc 100644 --- a/modules/actions/LocationActions.js +++ b/modules/actions/LocationActions.js @@ -1,6 +1,11 @@ var LocationDispatcher = require('../dispatchers/LocationDispatcher'); +var isAbsoluteURL = require('../utils/isAbsoluteURL'); var makePath = require('../utils/makePath'); +function loadURL(url) { + window.location = url; +} + /** * Actions that modify the URL. */ @@ -16,10 +21,14 @@ var LocationActions = { * a new URL onto the history stack. */ transitionTo: function (to, params, query) { - LocationDispatcher.handleViewAction({ - type: LocationActions.PUSH, - path: makePath(to, params, query) - }); + if (isAbsoluteURL(to)) { + loadURL(to); + } else { + LocationDispatcher.handleViewAction({ + type: LocationActions.PUSH, + path: makePath(to, params, query) + }); + } }, /** @@ -27,10 +36,14 @@ var LocationActions = { * the current URL in the history stack. */ replaceWith: function (to, params, query) { - LocationDispatcher.handleViewAction({ - type: LocationActions.REPLACE, - path: makePath(to, params, query) - }); + if (isAbsoluteURL(to)) { + loadURL(to); + } else { + LocationDispatcher.handleViewAction({ + type: LocationActions.REPLACE, + path: makePath(to, params, query) + }); + } }, /** diff --git a/modules/utils/isAbsoluteURL.js b/modules/utils/isAbsoluteURL.js new file mode 100644 index 0000000000..bdcd806583 --- /dev/null +++ b/modules/utils/isAbsoluteURL.js @@ -0,0 +1,11 @@ +var ABSOLUTE_URL_FORMAT = /^https?:\/\//; + +/** + * Returns true if the given string contains an absolute URL + * according to http://tools.ietf.org/html/rfc3986#page-27. + */ +function isAbsoluteURL(string) { + return typeof string === 'string' && ABSOLUTE_URL_FORMAT.test(string); +} + +module.exports = isAbsoluteURL;