summaryrefslogtreecommitdiff
path: root/op_crates/web
diff options
context:
space:
mode:
Diffstat (limited to 'op_crates/web')
-rw-r--r--op_crates/web/12_location.js227
-rw-r--r--op_crates/web/lib.deno_web.d.ts66
-rw-r--r--op_crates/web/lib.rs4
3 files changed, 297 insertions, 0 deletions
diff --git a/op_crates/web/12_location.js b/op_crates/web/12_location.js
new file mode 100644
index 000000000..d56ccc1e4
--- /dev/null
+++ b/op_crates/web/12_location.js
@@ -0,0 +1,227 @@
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+
+((window) => {
+ const { URL } = window.__bootstrap.url;
+ const locationConstructorKey = Symbol("locationConstuctorKey");
+
+ class Location {
+ constructor(href, key) {
+ if (key != locationConstructorKey) {
+ throw new TypeError("Illegal constructor.");
+ }
+ const url = new URL(href);
+ Object.defineProperties(this, {
+ hash: {
+ get() {
+ return url.hash;
+ },
+ set() {
+ throw new DOMException(
+ `Cannot set "location.hash".`,
+ "NotSupportedError",
+ );
+ },
+ enumerable: true,
+ },
+ host: {
+ get() {
+ return url.host;
+ },
+ set() {
+ throw new DOMException(
+ `Cannot set "location.host".`,
+ "NotSupportedError",
+ );
+ },
+ enumerable: true,
+ },
+ hostname: {
+ get() {
+ return url.hostname;
+ },
+ set() {
+ throw new DOMException(
+ `Cannot set "location.hostname".`,
+ "NotSupportedError",
+ );
+ },
+ enumerable: true,
+ },
+ href: {
+ get() {
+ return href;
+ },
+ set() {
+ throw new DOMException(
+ `Cannot set "location.href".`,
+ "NotSupportedError",
+ );
+ },
+ enumerable: true,
+ },
+ origin: {
+ get() {
+ return url.origin;
+ },
+ enumerable: true,
+ },
+ password: {
+ get() {
+ return url.password;
+ },
+ set() {
+ throw new DOMException(
+ `Cannot set "location.password".`,
+ "NotSupportedError",
+ );
+ },
+ enumerable: true,
+ },
+ pathname: {
+ get() {
+ return url.pathname;
+ },
+ set() {
+ throw new DOMException(
+ `Cannot set "location.pathname".`,
+ "NotSupportedError",
+ );
+ },
+ enumerable: true,
+ },
+ port: {
+ get() {
+ return url.port;
+ },
+ set() {
+ throw new DOMException(
+ `Cannot set "location.port".`,
+ "NotSupportedError",
+ );
+ },
+ enumerable: true,
+ },
+ protocol: {
+ get() {
+ return url.protocol;
+ },
+ set() {
+ throw new DOMException(
+ `Cannot set "location.protocol".`,
+ "NotSupportedError",
+ );
+ },
+ enumerable: true,
+ },
+ search: {
+ get() {
+ return url.search;
+ },
+ set() {
+ throw new DOMException(
+ `Cannot set "location.search".`,
+ "NotSupportedError",
+ );
+ },
+ 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.
+ return {
+ length: 0,
+ item: () => null,
+ contains: () => false,
+ };
+ },
+ enumerable: true,
+ },
+ assign: {
+ value: function assign() {
+ throw new DOMException(
+ `Cannot call "location.assign()".`,
+ "NotSupportedError",
+ );
+ },
+ enumerable: true,
+ },
+ reload: {
+ value: function reload() {
+ throw new DOMException(
+ `Cannot call "location.reload()".`,
+ "NotSupportedError",
+ );
+ },
+ enumerable: true,
+ },
+ replace: {
+ value: function replace() {
+ throw new DOMException(
+ `Cannot call "location.replace()".`,
+ "NotSupportedError",
+ );
+ },
+ enumerable: true,
+ },
+ toString: {
+ value: function toString() {
+ return href;
+ },
+ enumerable: true,
+ },
+ });
+ }
+ }
+
+ Object.defineProperties(Location.prototype, {
+ [Symbol.toStringTag]: {
+ value: "Location",
+ configurable: true,
+ },
+ });
+
+ let location = null;
+
+ function setLocationHref(href) {
+ location = new Location(href, locationConstructorKey);
+ }
+
+ window.__bootstrap = (window.__bootstrap || {});
+ window.__bootstrap.location = {
+ locationConstructorDescriptor: {
+ value: Location,
+ configurable: true,
+ writable: true,
+ },
+ locationDescriptor: {
+ get() {
+ if (location == null) {
+ throw new ReferenceError(
+ `Access to "location", run again with --location <href>.`,
+ );
+ }
+ return location;
+ },
+ set() {
+ throw new DOMException(`Cannot set "location".`, "NotSupportedError");
+ },
+ enumerable: true,
+ },
+ setLocationHref,
+ getLocationHref() {
+ return location?.href;
+ },
+ };
+})(this);
diff --git a/op_crates/web/lib.deno_web.d.ts b/op_crates/web/lib.deno_web.d.ts
index 33d867753..491a0ee84 100644
--- a/op_crates/web/lib.deno_web.d.ts
+++ b/op_crates/web/lib.deno_web.d.ts
@@ -312,3 +312,69 @@ 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;
diff --git a/op_crates/web/lib.rs b/op_crates/web/lib.rs
index 958d11177..33bb0a33f 100644
--- a/op_crates/web/lib.rs
+++ b/op_crates/web/lib.rs
@@ -62,6 +62,10 @@ pub fn init(isolate: &mut JsRuntime) {
),
("deno:op_crates/web/11_url.js", include_str!("11_url.js")),
(
+ "deno:op_crates/web/12_location.js",
+ include_str!("12_location.js"),
+ ),
+ (
"deno:op_crates/web/21_filereader.js",
include_str!("21_filereader.js"),
),