summaryrefslogtreecommitdiff
path: root/op_crates
diff options
context:
space:
mode:
Diffstat (limited to 'op_crates')
-rw-r--r--op_crates/web/12_location.js188
-rw-r--r--op_crates/web/lib.deno_web.d.ts66
2 files changed, 161 insertions, 93 deletions
diff --git a/op_crates/web/12_location.js b/op_crates/web/12_location.js
index 79a9151f1..d6a132413 100644
--- a/op_crates/web/12_location.js
+++ b/op_crates/web/12_location.js
@@ -4,12 +4,19 @@
const { URL } = window.__bootstrap.url;
const locationConstructorKey = Symbol("locationConstuctorKey");
+ // The differences between the definitions of `Location` and `WorkerLocation`
+ // are because of the `LegacyUnforgeable` attribute only specified upon
+ // `Location`'s properties. See:
+ // - https://html.spec.whatwg.org/multipage/history.html#the-location-interface
+ // - https://heycam.github.io/webidl/#LegacyUnforgeable
class Location {
- constructor(href, key) {
+ constructor(href = null, key = null) {
if (key != locationConstructorKey) {
throw new TypeError("Illegal constructor.");
}
const url = new URL(href);
+ url.username = "";
+ url.password = "";
Object.defineProperties(this, {
hash: {
get() {
@@ -49,7 +56,7 @@
},
href: {
get() {
- return href;
+ return url.href;
},
set() {
throw new DOMException(
@@ -65,18 +72,6 @@
},
enumerable: true,
},
- password: {
- get() {
- return url.password;
- },
- set() {
- throw new DOMException(
- `Cannot set "location.password".`,
- "NotSupportedError",
- );
- },
- enumerable: true,
- },
pathname: {
get() {
return url.pathname;
@@ -125,18 +120,6 @@
},
enumerable: true,
},
- username: {
- get() {
- return url.username;
- },
- set() {
- throw new DOMException(
- `Cannot set "location.username".`,
- "NotSupportedError",
- );
- },
- enumerable: true,
- },
ancestorOrigins: {
get() {
// TODO(nayeemrmn): Replace with a `DOMStringList` instance.
@@ -177,7 +160,7 @@
},
toString: {
value: function toString() {
- return href;
+ return url.href;
},
enumerable: true,
},
@@ -192,10 +175,144 @@
},
});
+ const workerLocationUrls = new WeakMap();
+
+ class WorkerLocation {
+ constructor(href = null, key = null) {
+ if (key != locationConstructorKey) {
+ throw new TypeError("Illegal constructor.");
+ }
+ const url = new URL(href);
+ url.username = "";
+ url.password = "";
+ workerLocationUrls.set(this, url);
+ }
+ }
+
+ Object.defineProperties(WorkerLocation.prototype, {
+ hash: {
+ get() {
+ const url = workerLocationUrls.get(this);
+ if (url == null) {
+ throw new TypeError("Illegal invocation.");
+ }
+ return url.hash;
+ },
+ configurable: true,
+ enumerable: true,
+ },
+ host: {
+ get() {
+ const url = workerLocationUrls.get(this);
+ if (url == null) {
+ throw new TypeError("Illegal invocation.");
+ }
+ return url.host;
+ },
+ configurable: true,
+ enumerable: true,
+ },
+ hostname: {
+ get() {
+ const url = workerLocationUrls.get(this);
+ if (url == null) {
+ throw new TypeError("Illegal invocation.");
+ }
+ return url.hostname;
+ },
+ configurable: true,
+ enumerable: true,
+ },
+ href: {
+ get() {
+ const url = workerLocationUrls.get(this);
+ if (url == null) {
+ throw new TypeError("Illegal invocation.");
+ }
+ return url.href;
+ },
+ configurable: true,
+ enumerable: true,
+ },
+ origin: {
+ get() {
+ const url = workerLocationUrls.get(this);
+ if (url == null) {
+ throw new TypeError("Illegal invocation.");
+ }
+ return url.origin;
+ },
+ configurable: true,
+ enumerable: true,
+ },
+ pathname: {
+ get() {
+ const url = workerLocationUrls.get(this);
+ if (url == null) {
+ throw new TypeError("Illegal invocation.");
+ }
+ return url.pathname;
+ },
+ configurable: true,
+ enumerable: true,
+ },
+ port: {
+ get() {
+ const url = workerLocationUrls.get(this);
+ if (url == null) {
+ throw new TypeError("Illegal invocation.");
+ }
+ return url.port;
+ },
+ configurable: true,
+ enumerable: true,
+ },
+ protocol: {
+ get() {
+ const url = workerLocationUrls.get(this);
+ if (url == null) {
+ throw new TypeError("Illegal invocation.");
+ }
+ return url.protocol;
+ },
+ configurable: true,
+ enumerable: true,
+ },
+ search: {
+ get() {
+ const url = workerLocationUrls.get(this);
+ if (url == null) {
+ throw new TypeError("Illegal invocation.");
+ }
+ return url.search;
+ },
+ configurable: true,
+ enumerable: true,
+ },
+ toString: {
+ value: function toString() {
+ const url = workerLocationUrls.get(this);
+ if (url == null) {
+ throw new TypeError("Illegal invocation.");
+ }
+ return url.href;
+ },
+ configurable: true,
+ enumerable: true,
+ writable: true,
+ },
+ [Symbol.toStringTag]: {
+ value: "WorkerLocation",
+ configurable: true,
+ },
+ });
+
let location = null;
+ let workerLocation = null;
function setLocationHref(href) {
location = new Location(href, locationConstructorKey);
+ workerLocation = new WorkerLocation(href, locationConstructorKey);
}
window.__bootstrap = (window.__bootstrap || {});
@@ -205,6 +322,11 @@
configurable: true,
writable: true,
},
+ workerLocationConstructorDescriptor: {
+ value: WorkerLocation,
+ configurable: true,
+ writable: true,
+ },
locationDescriptor: {
get() {
if (location == null) {
@@ -219,6 +341,18 @@
},
enumerable: true,
},
+ workerLocationDescriptor: {
+ get() {
+ if (workerLocation == null) {
+ throw new Error(
+ `Assertion: "globalThis.location" must be defined in a worker.`,
+ );
+ }
+ return workerLocation;
+ },
+ configurable: true,
+ enumerable: true,
+ },
setLocationHref,
getLocationHref() {
return location?.href;
diff --git a/op_crates/web/lib.deno_web.d.ts b/op_crates/web/lib.deno_web.d.ts
index e9a6bc8ee..79b56f68e 100644
--- a/op_crates/web/lib.deno_web.d.ts
+++ b/op_crates/web/lib.deno_web.d.ts
@@ -313,69 +313,3 @@ declare var FileReader: {
readonly EMPTY: number;
readonly LOADING: number;
};
-
-/** The location (URL) of the object it is linked to. Changes done on it are
- * reflected on the object it relates to. Accessible via
- * `globalThis.location`. */
-declare class Location {
- constructor();
- /** Returns a DOMStringList object listing the origins of the ancestor
- * browsing contexts, from the parent browsing context to the top-level
- * browsing context.
- *
- * Always empty in Deno. */
- readonly ancestorOrigins: DOMStringList;
- /** Returns the Location object's URL's fragment (includes leading "#" if non-empty).
- *
- * Cannot be set in Deno. */
- hash: string;
- /** Returns the Location object's URL's host and port (if different from the default port for the scheme).
- *
- * Cannot be set in Deno. */
- host: string;
- /** Returns the Location object's URL's host.
- *
- * Cannot be set in Deno. */
- hostname: string;
- /** Returns the Location object's URL.
- *
- * Cannot be set in Deno. */
- href: string;
- toString(): string;
- /** Returns the Location object's URL's origin. */
- readonly origin: string;
- /** Returns the Location object's URL's path.
- *
- * Cannot be set in Deno. */
- pathname: string;
- /** Returns the Location object's URL's port.
- *
- * Cannot be set in Deno. */
- port: string;
- /** Returns the Location object's URL's scheme.
- *
- * Cannot be set in Deno. */
- protocol: string;
- /** Returns the Location object's URL's query (includes leading "?" if
- * non-empty).
- *
- * Cannot be set in Deno. */
- search: string;
- /** Navigates to the given URL.
- *
- * Cannot be set in Deno. */
- assign(url: string): void;
- /** Reloads the current page.
- *
- * Disabled in Deno. */
- reload(): void;
- /** @deprecated */
- reload(forcedReload: boolean): void;
- /** Removes the current page from the session history and navigates to the
- * given URL.
- *
- * Disabled in Deno. */
- replace(url: string): void;
-}
-
-declare var location: Location;