Skip to content

Commit

Permalink
added createImageBitmap for workerglobalscope, promise object for Win…
Browse files Browse the repository at this point in the history
…dowOrWorkerGlobalScope, OffscreenCanvas type BitmapSource in window.rs
  • Loading branch information
ramyananth committed Apr 24, 2020
1 parent 6696e08 commit c140a34
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 21 deletions.
4 changes: 2 additions & 2 deletions components/script/dom/imagebitmap.rs
Expand Up @@ -43,11 +43,11 @@ impl ImageBitmap {
Ok(reflect_dom_object(imagebitmap, global))
}

pub fn set_bitmap_data(&self, data: DomRefCell<Vec<u8>>) {
pub fn set_bitmap_data(&mut self, data: DomRefCell<Vec<u8>>) {
self.bitmap_data = data;
}

pub fn set_origin_clean(&self, origin_is_clean: Cell<bool>) {
pub fn set_origin_clean(&mut self, origin_is_clean: Cell<bool>) {
self.origin_clean = origin_is_clean;
}
}
Expand Down
Expand Up @@ -24,7 +24,7 @@ interface mixin WindowOrWorkerGlobalScope {
void queueMicrotask(VoidFunction callback);

// ImageBitmap
// Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, optional ImageBitmapOptions options);
Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, optional ImageBitmapOptions options = {});
// Promise<ImageBitmap> createImageBitmap(
// ImageBitmapSource image, long sx, long sy, long sw, long sh, optional ImageBitmapOptions options);
};
Expand Down
55 changes: 38 additions & 17 deletions components/script/dom/window.rs
Expand Up @@ -141,7 +141,6 @@ use url::Position;
use webrender_api::units::{DeviceIntPoint, DeviceIntSize, LayoutPixel};
use webrender_api::{DocumentId, ExternalScrollId};
use crate::dom::bindings::codegen::Bindings::ImageBitmapBinding::{ImageBitmapSource, ImageBitmapOptions};
use crate::dom::bindings::reflector::Reflector;

/// Current state of the window object
#[derive(Clone, Copy, Debug, JSTraceable, MallocSizeOf, PartialEq)]
Expand Down Expand Up @@ -905,13 +904,12 @@ impl WindowMethods for Window {
p.reject_error(Error::InvalidState)
}

let mut imageBitmap = ImageBitmap {
reflector_: Reflector::new(),
width: 0,
height: 0,
bitmap_data: DomRefCell::new(vec![]),
origin_clean: Cell::new(true),
};
let mut imageBitmap = ImageBitmap::new(&global,0,0,Cell::new(true)).unwrap();
// global: &global,
// width: 0,
// height: 0,
// origin_clean: Cell::new(true),
// );

let promise = match image {
ImageBitmapSource::HTMLCanvasElement(ref canvas) => {
Expand All @@ -920,18 +918,41 @@ impl WindowMethods for Window {
p.reject_error(Error::InvalidState)
}

let Some((data, size)) = canvas.fetch_all_data();
let data = DomRefCell::new(data
.map(|data| data.to_vec())
.unwrap_or_else(|| vec![0; size.area() as usize * 4]));
if let Some((data, size)) = canvas.fetch_all_data() {
let data = DomRefCell::new(data
.map(|data| data.to_vec())
.unwrap_or_else(|| vec![0; size.area() as usize * 4]));

let origin_is_clean = Cell::new(canvas.origin_is_clean());
imageBitmap.set_bitmap_data(data);
imageBitmap.set_origin_clean(origin_is_clean);
p.resolve_native(&(imageBitmap));
}
p
}
ImageBitmapSource::OffscreenCanvas(ref canvas) => {
// https://html.spec.whatwg.org/multipage/#check-the-usability-of-the-image-argument
if !canvas.is_valid() {
p.reject_error(Error::InvalidState)
}

let origin_is_clean = Cell::new(canvas.origin_is_clean());
imageBitmap.set_bitmap_data(data);
imageBitmap.set_origin_clean(origin_is_clean);
p.resolve_native(&(imageBitmap));
if let Some((data, size)) = canvas.fetch_all_data() {
let data = DomRefCell::new(data
.map(|data| data.to_vec())
.unwrap_or_else(|| vec![0; size.area() as usize * 4]));

let origin_is_clean = Cell::new(canvas.origin_is_clean());
imageBitmap.set_bitmap_data(data);
imageBitmap.set_origin_clean(origin_is_clean);
p.resolve_native(&(imageBitmap));
}
p
}
_ => {
p
}
};
p
promise
}

// https://html.spec.whatwg.org/multipage/#dom-window
Expand Down
70 changes: 69 additions & 1 deletion components/script/dom/workerglobalscope.rs
Expand Up @@ -25,7 +25,7 @@ use crate::dom::window::{base64_atob, base64_btoa};
use crate::dom::workerlocation::WorkerLocation;
use crate::dom::workernavigator::WorkerNavigator;
use crate::fetch;
use crate::realms::{enter_realm, InRealm};
use crate::realms::{enter_realm, InRealm, AlreadyInRealm};
use crate::script_runtime::JSContext;
use crate::script_runtime::{get_reports, CommonScriptMsg, Runtime, ScriptChan, ScriptPort};
use crate::task::TaskCanceller;
Expand Down Expand Up @@ -58,6 +58,9 @@ use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use time::precise_time_ns;
use uuid::Uuid;
use crate::dom::bindings::codegen::Bindings::ImageBitmapBinding::{ImageBitmapSource, ImageBitmapOptions};
use crate::dom::imagebitmap::ImageBitmap;
use std::cell::Cell;

pub fn prepare_workerscope_init(
global: &GlobalScope,
Expand Down Expand Up @@ -375,6 +378,71 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope {
.ascii_serialization(),
)
}

// https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#dom-createimagebitmap
fn CreateImageBitmap(&self, image: ImageBitmapSource, options: &ImageBitmapOptions) -> Rc<Promise> {
let global = self.global();
let in_realm_proof = AlreadyInRealm::assert(&global);
let p = Promise::new_in_current_realm(&global, InRealm::Already(&in_realm_proof));
if options.resizeWidth.unwrap() == 0 {
p.reject_error(Error::InvalidState)
}

if options.resizeHeight.unwrap() == 0 {
p.reject_error(Error::InvalidState)
}

let mut imageBitmap = ImageBitmap::new(&global,0,0,Cell::new(true)).unwrap();
// global: &global,
// width: 0,
// height: 0,
// origin_clean: Cell::new(true),
// );

let promise = match image {
ImageBitmapSource::HTMLCanvasElement(ref canvas) => {
// https://html.spec.whatwg.org/multipage/#check-the-usability-of-the-image-argument
if !canvas.is_valid() {
p.reject_error(Error::InvalidState)
}

if let Some((data, size)) = canvas.fetch_all_data() {
let data = DomRefCell::new(data
.map(|data| data.to_vec())
.unwrap_or_else(|| vec![0; size.area() as usize * 4]));

let origin_is_clean = Cell::new(canvas.origin_is_clean());
imageBitmap.set_bitmap_data(data);
imageBitmap.set_origin_clean(origin_is_clean);
p.resolve_native(&(imageBitmap));
}
p
}
ImageBitmapSource::OffscreenCanvas(ref canvas) => {
// https://html.spec.whatwg.org/multipage/#check-the-usability-of-the-image-argument
if !canvas.is_valid() {
p.reject_error(Error::InvalidState)
}

if let Some((data, size)) = canvas.fetch_all_data() {
let data = DomRefCell::new(data
.map(|data| data.to_vec())
.unwrap_or_else(|| vec![0; size.area() as usize * 4]));

let origin_is_clean = Cell::new(canvas.origin_is_clean());
imageBitmap.set_bitmap_data(data);
imageBitmap.set_origin_clean(origin_is_clean);
p.resolve_native(&(imageBitmap));
}
p
}
_ => {
p
}
};
promise
}

}

impl WorkerGlobalScope {
Expand Down

0 comments on commit c140a34

Please sign in to comment.