diff --git a/components/net/image_cache.rs b/components/net/image_cache.rs index 2f0968f3aa4..d7dc1e171d6 100644 --- a/components/net/image_cache.rs +++ b/components/net/image_cache.rs @@ -41,6 +41,7 @@ use crate::resource_thread::CoreResourceThreadPool; // ====================================================================== fn decode_bytes_sync(key: LoadKey, bytes: &[u8], cors: CorsStatus) -> DecoderMsg { + // decode let image = load_from_memory(bytes, cors); DecoderMsg { key, image } } diff --git a/components/script/dom/domexception.rs b/components/script/dom/domexception.rs index c058136a8b5..2267148626f 100644 --- a/components/script/dom/domexception.rs +++ b/components/script/dom/domexception.rs @@ -41,6 +41,7 @@ pub enum DOMErrorName { TimeoutError = DOMExceptionConstants::TIMEOUT_ERR, InvalidNodeTypeError = DOMExceptionConstants::INVALID_NODE_TYPE_ERR, DataCloneError = DOMExceptionConstants::DATA_CLONE_ERR, + EncodingError, NotReadableError, OperationError, } @@ -70,6 +71,7 @@ impl DOMErrorName { "TimeoutError" => Some(DOMErrorName::TimeoutError), "InvalidNodeTypeError" => Some(DOMErrorName::InvalidNodeTypeError), "DataCloneError" => Some(DOMErrorName::DataCloneError), + "EncodingError" => Some(DOMErrorName::EncodingError), "NotReadableError" => Some(DOMErrorName::NotReadableError), "OperationError" => Some(DOMErrorName::OperationError), _ => None, @@ -115,6 +117,9 @@ impl DOMException { "The supplied node is incorrect or has an incorrect ancestor for this operation." }, DOMErrorName::DataCloneError => "The object can not be cloned.", + DOMErrorName::EncodingError => { + "The encoding operation (either encoded or decoding) failed." + }, DOMErrorName::NotReadableError => "The I/O read operation failed.", DOMErrorName::OperationError => { "The operation failed for an operation-specific reason." diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 80c016b6b9d..2b60b93203a 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -5,6 +5,7 @@ use std::cell::Cell; use std::collections::HashSet; use std::default::Default; +use std::rc::Rc; use std::sync::{Arc, Mutex}; use std::{char, i32, mem}; @@ -47,6 +48,8 @@ use style::values::specified::AbsoluteLength; use style_traits::ParsingMode; use url::Url; +use super::domexception::DOMErrorName; +use super::types::DOMException; use crate::document_loader::{LoadBlocker, LoadType}; use crate::dom::activation::Activatable; use crate::dom::attr::Attr; @@ -84,6 +87,7 @@ use crate::dom::node::{ UnbindContext, }; use crate::dom::performanceresourcetiming::InitiatorType; +use crate::dom::promise::Promise; use crate::dom::values::UNSIGNED_LONG_MAX; use crate::dom::virtualmethods::VirtualMethods; use crate::dom::window::Window; @@ -1605,6 +1609,26 @@ impl HTMLImageElementMethods for HTMLImageElement { } } + /// + fn Decode(&self) -> Rc { + // Step 1 + let promise = Promise::new(&self.global()); + + // Step 2 + let document = document_from_node(self); + if !document.is_fully_active() { + promise.reject_native(&DOMException::new( + &self.global(), + DOMErrorName::EncodingError, + )); + } else if self.current_request.borrow().image.is_some() { + promise.resolve_native(&()); + } + + // Step 3 + promise + } + // https://html.spec.whatwg.org/multipage/#dom-img-name make_getter!(Name, "name"); diff --git a/components/script/dom/webidls/HTMLImageElement.webidl b/components/script/dom/webidls/HTMLImageElement.webidl index 0d242fefb26..faae1c8992b 100644 --- a/components/script/dom/webidls/HTMLImageElement.webidl +++ b/components/script/dom/webidls/HTMLImageElement.webidl @@ -29,6 +29,9 @@ interface HTMLImageElement : HTMLElement { readonly attribute USVString currentSrc; [CEReactions] attribute DOMString referrerPolicy; + + Promise decode(); + // also has obsolete members };