diff options
Diffstat (limited to '')
-rw-r--r-- | dom/chrome-webidl/ChannelWrapper.webidl | 578 |
1 files changed, 578 insertions, 0 deletions
diff --git a/dom/chrome-webidl/ChannelWrapper.webidl b/dom/chrome-webidl/ChannelWrapper.webidl new file mode 100644 index 0000000000..b932e79c76 --- /dev/null +++ b/dom/chrome-webidl/ChannelWrapper.webidl @@ -0,0 +1,578 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +interface LoadInfo; +interface MozChannel; +interface RemoteTab; +interface URI; +interface nsISupports; + +/** + * Load types that correspond to the external types in nsIContentPolicy.idl. + * Please also update that IDL when updating this list. + */ +enum MozContentPolicyType { + "main_frame", + "sub_frame", + "stylesheet", + "script", + "image", + "object", + "object_subrequest", + "xmlhttprequest", + "fetch", + "xslt", + "ping", + "beacon", + "xml_dtd", + "font", + "media", + "websocket", + "csp_report", + "imageset", + "web_manifest", + "speculative", + "other" +}; + +/** + * String versions of CLASSIFIED_* tracking flags from nsIClassifiedChannel.idl + */ +enum MozUrlClassificationFlags { + "fingerprinting", + "fingerprinting_content", + "cryptomining", + "cryptomining_content", + "emailtracking", + "emailtracking_content", + "tracking", + "tracking_ad", + "tracking_analytics", + "tracking_social", + "tracking_content", + "socialtracking", + "socialtracking_facebook", + "socialtracking_linkedin", + "socialtracking_twitter", + "any_basic_tracking", + "any_strict_tracking", + "any_social_tracking" +}; + +/** + * A thin wrapper around nsIChannel and nsIHttpChannel that allows JS + * callers to access them without XPConnect overhead. + */ +[ChromeOnly, Exposed=Window] +interface ChannelWrapper : EventTarget { + /** + * Returns the wrapper instance for the given channel. The same wrapper is + * always returned for a given channel. + */ + static ChannelWrapper get(MozChannel channel); + + /** + * Returns the wrapper instance for the given channel. The same wrapper is + * always returned for a given channel. + */ + static ChannelWrapper? getRegisteredChannel(unsigned long long aChannelId, + WebExtensionPolicy extension, + RemoteTab? remoteTab); + + /** + * A unique ID for for the requests which remains constant throughout the + * redirect chain. + */ + [Constant, StoreInSlot] + readonly attribute unsigned long long id; + + // Not technically pure, since it's backed by a weak reference, but if JS + // has a reference to the previous value, we can depend on it not being + // collected. + [Pure] + attribute MozChannel? channel; + + + /** + * Cancels the request with the given nsresult status code. + * + * The optional reason parameter should be one of the BLOCKING_REASON + * constants from nsILoadInfo.idl + */ + [Throws] + undefined cancel(unsigned long result, optional unsigned long reason = 0); + + /** + * Redirects the wrapped HTTP channel to the given URI. For other channel + * types, this method will throw. The redirect is an internal redirect, and + * the behavior is the same as nsIHttpChannel.redirectTo. + */ + [Throws] + undefined redirectTo(URI url); + + /** + * Requests an upgrade of the HTTP channel to a secure request. For other channel + * types, this method will throw. The redirect is an internal redirect, and + * the behavior is the same as nsIHttpChannel.upgradeToSecure. Setting this + * flag is only effective during the WebRequest.onBeforeRequest in + * Web Extensions, calling this at any other point during the request will + * have no effect. Setting this flag in addition to calling redirectTo + * results in the redirect happening rather than the upgrade request. + */ + [Throws] + undefined upgradeToSecure(); + + /** + * Suspends the underlying channel. The profilerText parameter is only used + * to annotate profiles. + */ + [Throws] + undefined suspend(ByteString profileMarkerText); + + /** + * Resumes (un-suspends) the underlying channel. + */ + [Throws] + undefined resume(); + + /** + * The content type of the request, usually as read from the Content-Type + * header. This should be used in preference to the header to determine the + * content type of the channel. + */ + [Pure] + attribute ByteString contentType; + + + /** + * For HTTP requests, the request method (e.g., GET, POST, HEAD). For other + * request types, returns an empty string. + */ + [Cached, Pure] + readonly attribute ByteString method; + + /** + * For requests with LoadInfo, the content policy type that corresponds to + * the request. For requests without LoadInfo, returns "other". + */ + [Cached, Pure] + readonly attribute MozContentPolicyType type; + + + /** + * When true, the request is currently suspended by the wrapper. When false, + * the request is not suspended by the wrapper, but may still be suspended + * by another caller. + */ + [Pure] + readonly attribute boolean suspended; + + + /** + * The final URI of the channel (as returned by NS_GetFinalChannelURI) after + * any redirects have been processed. + */ + [Cached, Pure] + readonly attribute URI finalURI; + + /** + * The string version of finalURI (but cheaper to access than + * finalURI.spec). + */ + [Cached, Pure] + readonly attribute DOMString finalURL; + + + /** + * Returns true if the request matches the given request filter, and the + * given extension has permission to access it. + */ + boolean matches(optional MozRequestFilter filter = {}, + optional WebExtensionPolicy? extension = null, + optional MozRequestMatchOptions options = {}); + + + /** + * Register's this channel as traceable by the given add-on when accessed + * via the process of the given RemoteTab. + */ + undefined registerTraceableChannel(WebExtensionPolicy extension, RemoteTab? remoteTab); + + /** + * The current HTTP status code of the request. This will be 0 if a response + * has not yet been received, or if the request is not an HTTP request. + */ + [Cached, Pure] + readonly attribute unsigned long statusCode; + + /** + * The HTTP status line for the request (e.g., "HTTP/1.0 200 Success"). This + * will be an empty string if a response has not yet been received, or if + * the request is not an HTTP request. + */ + [Cached, Pure] + readonly attribute ByteString statusLine; + + + /** + * If the request has failed or been canceled, an opaque string representing + * the error. For requests that failed at the NSS layer, this is an NSS + * error message. For requests that failed for any other reason, it is the + * name of an nsresult error code. For requests which haven't failed, this + * is null. + * + * This string is used in the error message when notifying extension + * webRequest listeners of failure. The documentation specifically states + * that this value MUST NOT be parsed, and is only meant to be displayed to + * humans, but we all know how that works in real life. + */ + [Cached, Pure] + readonly attribute DOMString? errorString; + + /** + * Dispatched when the channel is closed with an error status. Check + * errorString for the error details. + */ + attribute EventHandler onerror; + + /** + * Checks the request's current status and dispatches an error event if the + * request has failed and one has not already been dispatched. + */ + undefined errorCheck(); + + + /** + * Dispatched when the channel begins receiving data. + */ + attribute EventHandler onstart; + + /** + * Dispatched when the channel has finished receiving data. + */ + attribute EventHandler onstop; + + + /** + * Information about the proxy server which is handling this request, or + * null if the request is not proxied. + */ + [Cached, Frozen, GetterThrows, Pure] + readonly attribute MozProxyInfo? proxyInfo; + + /** + * For HTTP requests, the IP address of the remote server handling the + * request. For other request types, returns null. + */ + [Cached, Pure] + readonly attribute ByteString? remoteAddress; + + + /** + * The LoadInfo object for this channel, if available. Null for channels + * without load info, until support for those is removed. + */ + [Cached, Pure] + readonly attribute LoadInfo? loadInfo; + + /** + * True if this load for a service worker script (either a main script or import scripts). + */ + [Cached, Pure] + readonly attribute boolean isServiceWorkerScript; + + /** + * True if this load was triggered by a system caller. This currently always + * false if the request has no LoadInfo or is a top-level document load. + */ + [Cached, Pure] + readonly attribute boolean isSystemLoad; + + /** + * The URL of the principal that triggered this load. This is equivalent to + * the LoadInfo's triggeringPrincipal, and will only ever be null for + * requests without LoadInfo. + */ + [Cached, Pure] + readonly attribute ByteString? originURL; + + /** + * The URL of the document loading the content for this request. This is + * equivalent to the LoadInfo's loadingPrincipal. This may only ever be null + * for top-level requests and requests without LoadInfo. + */ + [Cached, Pure] + readonly attribute ByteString? documentURL; + + /** + * The URI version of originURL. Will be null only when originURL is null. + */ + [Pure] + readonly attribute URI? originURI; + + /** + * The URI version of documentURL. Will be null only when documentURL is + * null. + */ + [Pure] + readonly attribute URI? documentURI; + + + /** + * True if extensions may modify this request. This is currently false only + * if the request belongs to a document which has access to the + * mozAddonManager API. + */ + [Cached, GetterThrows, Pure] + readonly attribute boolean canModify; + + + /** + * The BrowsingContext ID of the frame that the request belongs to, or 0 if it + * is a top-level load or does not belong to a document. + */ + [Cached, Constant] + readonly attribute long long frameId; + + /** + * The BrowsingContext ID of the parent frame of the window that the request + * belongs to, 0 if that parent frame is the top-level frame, and -1 if the + * request belongs to a top-level frame. + */ + [Cached, Constant] + readonly attribute long long parentFrameId; + + /** + * For cross-process requests, the <browser> or <iframe> element to which the + * content loading this request belongs. For requests that don't originate + * from a remote browser, this is null. + * + * This is not an Element because those are by default only exposed in + * Window, but we're exposed in System. + */ + [Cached, Pure] + readonly attribute nsISupports? browserElement; + + /** + * Returns an array of objects that combine the url and frameId from the + * ancestorPrincipals and ancestorOuterWindowIDs on loadInfo. + * The immediate parent is the first entry, the last entry is always the top + * level frame. It will be an empty list for toplevel window loads and + * non-subdocument resource loads within a toplevel window. For the latter, + * originURL will provide information on what window is doing the load. It + * will be null if the request is not associated with a window (e.g. XHR with + * mozBackgroundRequest = true). + */ + [Cached, Frozen, GetterThrows, Pure] + readonly attribute sequence<MozFrameAncestorInfo>? frameAncestors; + + /** + * For HTTP requests, returns an array of request headers which will be, or + * have been, sent with this request. + * + * For non-HTTP requests, throws NS_ERROR_UNEXPECTED. + */ + [Throws] + sequence<MozHTTPHeader> getRequestHeaders(); + + /** + * For HTTP requests: returns the value of the request header, null if not set. + * + * For non-HTTP requests, throws NS_ERROR_UNEXPECTED. + */ + [Throws] + ByteString? getRequestHeader(ByteString header); + + /** + * For HTTP requests, returns an array of response headers which were + * received for this request, in the same format as returned by + * getRequestHeaders. + + * Throws NS_ERROR_NOT_AVAILABLE if a response has not yet been received, or + * NS_ERROR_UNEXPECTED if the channel is not an HTTP channel. + * + * Note: The Content-Type header is handled specially. That header is + * usually not mutable after the request has been received, and the content + * type must instead be changed via the contentType attribute. If a caller + * attempts to set the Content-Type header via setRequestHeader, however, + * that value is assigned to the contentType attribute and its original + * string value is cached. That original value is returned in place of the + * actual Content-Type header. + */ + [Throws] + sequence<MozHTTPHeader> getResponseHeaders(); + + /** + * Sets the given request header to the given value, overwriting any + * previous value. Setting a header to a null string has the effect of + * removing it. If merge is true, then the passed value will be merged + * to any existing value that exists for the header. Otherwise, any prior + * value for the header will be overwritten. Merge is ignored for headers + * that cannot be merged. + * + * For non-HTTP requests, throws NS_ERROR_UNEXPECTED. + */ + [Throws] + undefined setRequestHeader(ByteString header, + ByteString value, + optional boolean merge = false); + + /** + * Sets the given response header to the given value, overwriting any + * previous value. Setting a header to a null string has the effect of + * removing it. If merge is true, then the passed value will be merged + * to any existing value that exists for the header (e.g. handling multiple + * Set-Cookie headers). Otherwise, any prior value for the header will be + * overwritten. Merge is ignored for headers that cannot be merged. + * + * For non-HTTP requests, throws NS_ERROR_UNEXPECTED. + * + * Note: The content type header is handled specially by this function. See + * getResponseHeaders() for details. + */ + [Throws] + undefined setResponseHeader(ByteString header, + ByteString value, + optional boolean merge = false); + + /** + * Provides the tracking classification data when it is available. + */ + [Cached, Frozen, GetterThrows, Pure] + readonly attribute MozUrlClassification? urlClassification; + + /** + * Indicates if this response and its content window hierarchy is third + * party. + */ + [Cached, Constant] + readonly attribute boolean thirdParty; + + /** + * The current bytes sent of the request. This will be 0 if a request has not + * sent yet, or if the request is not an HTTP request. + */ + [Cached, Pure] + readonly attribute unsigned long long requestSize; + + /** + * The current bytes received of the response. This will be 0 if a response + * has not recieved yet, or if the request is not an HTTP response. + */ + [Cached, Pure] + readonly attribute unsigned long long responseSize; +}; + +/** + * Wrapper for first and third party tracking classification data. + */ +dictionary MozUrlClassification { + required sequence<MozUrlClassificationFlags> firstParty; + required sequence<MozUrlClassificationFlags> thirdParty; +}; + +/** + * Information about the proxy server handing a request. This is approximately + * equivalent to nsIProxyInfo. + */ +dictionary MozProxyInfo { + /** + * The hostname of the server. + */ + required ByteString host; + /** + * The TCP port of the server. + */ + required long port; + /** + * The type of proxy (e.g., HTTP, SOCKS). + */ + required ByteString type; + + /** + * True if the proxy is responsible for DNS lookups. + */ + required boolean proxyDNS; + + /** + * The authentication username for the proxy, if any. + */ + ByteString? username = null; + + /** + * The timeout, in seconds, before the network stack will failover to the + * next candidate proxy server if it has not received a response. + */ + unsigned long failoverTimeout; + + /** + * Any non-empty value will be passed directly as Proxy-Authorization header + * value for the CONNECT request attempt. However, this header set on the + * resource request itself takes precedence. + */ + ByteString? proxyAuthorizationHeader = null; + + /** + * An optional key used for additional isolation of this proxy connection. + */ + ByteString? connectionIsolationKey = null; +}; + +/** + * MozFrameAncestorInfo combines loadInfo::AncestorPrincipals with + * loadInfo::AncestorOuterWindowIDs for easier access in the WebRequest API. + * + * url represents the parent of the loading window. + * frameId is the outerWindowID for the parent of the loading window. + * + * For further details see nsILoadInfo.idl and Document::AncestorPrincipals. + */ +dictionary MozFrameAncestorInfo { + required ByteString url; + required unsigned long long frameId; +}; + +/** + * Represents an HTTP request or response header. + */ +dictionary MozHTTPHeader { + /** + * The case-insensitive, non-case-normalized header name. + */ + required ByteString name; + /** + * The header value. + */ + required ByteString value; +}; + +/** + * An object used for filtering requests. + */ +dictionary MozRequestFilter { + /** + * If present, the request only matches if its `type` attribute matches one + * of the given types. + */ + sequence<MozContentPolicyType>? types = null; + + /** + * If present, the request only matches if its finalURI matches the given + * match pattern set. + */ + MatchPatternSet? urls = null; + + /** + * If present, the request only matches if the loadInfo privateBrowsingId matches + * against the given incognito value. + */ + boolean? incognito = null; +}; + +dictionary MozRequestMatchOptions { + /** + * True if we're matching for the proxy portion of a proxied request. + */ + boolean isProxy = false; +}; |