| "use strict"; |
| |
| var URL = require("url"); |
| var resolveHref = require("../utils").resolveHref; |
| var NOT_IMPLEMENTED = require("./utils").NOT_IMPLEMENTED; |
| |
| module.exports = Location; |
| |
| function Location(urlString, document) { |
| this._url = URL.parse(urlString); |
| this._document = document; |
| } |
| |
| Location.prototype = { |
| constructor: Location, |
| reload: function () { |
| NOT_IMPLEMENTED(this._document, "location.reload")(); |
| }, |
| get protocol() { return this._url.protocol || ":"; }, |
| get host() { return this._url.host || ""; }, |
| get auth() { return this._url.auth; }, |
| get hostname() { return this._url.hostname || ""; }, |
| get origin() { |
| return ((this._url.protocol !== undefined && this._url.protocol !== null) ? |
| this._url.protocol + "//" : |
| this._url.protocol) + |
| this._url.host || ""; |
| }, |
| get port() { return this._url.port || ""; }, |
| get pathname() { return this._url.pathname || ""; }, |
| get href() { return this._url.href; }, |
| get hash() { return this._url.hash || ""; }, |
| get search() { return this._url.search || ""; }, |
| |
| set href(val) { |
| var oldUrl = this._url.href; |
| var oldProtocol = this._url.protocol; |
| var oldHost = this._url.host; |
| var oldPathname = this._url.pathname; |
| var oldHash = this._url.hash || ""; |
| |
| this._url = URL.parse(resolveHref(oldUrl, val)); |
| var newUrl = this._url.href; |
| var newProtocol = this._url.protocol; |
| var newHost = this._url.host; |
| var newPathname = this._url.pathname; |
| var newHash = this._url.hash || ""; |
| |
| if (oldProtocol === newProtocol && oldHost === newHost && oldPathname === newPathname && oldHash !== newHash) { |
| this._signalHashChange(oldUrl, newUrl); |
| } else { |
| NOT_IMPLEMENTED(this._document, "location.href (no reload)")(); |
| } |
| }, |
| |
| set hash(val) { |
| var oldUrl = this._url.href; |
| var oldHash = this._url.hash || ""; |
| |
| if (val.lastIndexOf("#", 0) !== 0) { |
| val = "#" + val; |
| } |
| |
| this._url = URL.parse(resolveHref(oldUrl, val)); |
| var newUrl = this._url.href; |
| var newHash = this._url.hash || ""; |
| |
| if (oldHash !== newHash) { |
| this._signalHashChange(oldUrl, newUrl); |
| } |
| }, |
| |
| set search(val) { |
| var oldUrl = this._url.href; |
| var oldHash = this._url.hash || ""; |
| if (val.length) { |
| if (val.lastIndexOf("?", 0) !== 0) { |
| val = "?" + val; |
| } |
| this._url = URL.parse(resolveHref(oldUrl, val + oldHash)); |
| } else { |
| this._url = URL.parse(oldUrl.replace(/\?([^#]+)/, "")); |
| } |
| }, |
| |
| replace: function (val) { |
| this.href = val; |
| }, |
| |
| toString: function () { |
| return this._url.href; |
| }, |
| |
| _signalHashChange: function (oldUrl, newUrl) { |
| var ev = this._document.createEvent("HTMLEvents"); |
| ev.initEvent("hashchange", false, false); |
| ev.oldUrl = oldUrl; |
| ev.newUrl = newUrl; |
| process.nextTick(function () { |
| this._document.parentWindow.dispatchEvent(ev); |
| }.bind(this)); |
| } |
| }; |