mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
auto merge of #5346 : saneyuki/servo/binding, r=jdm
- Fix #707 - Take over from #5106
This commit is contained in:
commit
e77c4e2d76
23 changed files with 372 additions and 152 deletions
|
@ -87,7 +87,9 @@ pub fn handle_get_layout(page: &Rc<Page>, pipeline: PipelineId, node_id: String,
|
|||
let node = find_node_by_unique_id(&*page, pipeline, node_id).root();
|
||||
let elem: JSRef<Element> = ElementCast::to_ref(node.r()).expect("should be getting layout of element");
|
||||
let rect = elem.GetBoundingClientRect().root();
|
||||
reply.send((rect.r().Width(), rect.r().Height())).unwrap();
|
||||
let width = *rect.r().Width();
|
||||
let height = *rect.r().Height();
|
||||
reply.send((width, height)).unwrap();
|
||||
}
|
||||
|
||||
pub fn handle_modify_attribute(page: &Rc<Page>, pipeline: PipelineId, node_id: String, modifications: Vec<Modification>) {
|
||||
|
|
|
@ -80,8 +80,10 @@ builtinNames = {
|
|||
IDLType.Tags.uint16: 'u16',
|
||||
IDLType.Tags.uint32: 'u32',
|
||||
IDLType.Tags.uint64: 'u64',
|
||||
IDLType.Tags.float: 'f32',
|
||||
IDLType.Tags.double: 'f64'
|
||||
IDLType.Tags.unrestricted_float: 'f32',
|
||||
IDLType.Tags.float: 'Finite<f32>',
|
||||
IDLType.Tags.unrestricted_double: 'f64',
|
||||
IDLType.Tags.double: 'Finite<f64>'
|
||||
}
|
||||
|
||||
numericTags = [
|
||||
|
@ -89,7 +91,8 @@ numericTags = [
|
|||
IDLType.Tags.int16, IDLType.Tags.uint16,
|
||||
IDLType.Tags.int32, IDLType.Tags.uint32,
|
||||
IDLType.Tags.int64, IDLType.Tags.uint64,
|
||||
IDLType.Tags.float, IDLType.Tags.double
|
||||
IDLType.Tags.unrestricted_float, IDLType.Tags.float,
|
||||
IDLType.Tags.unrestricted_double, IDLType.Tags.double
|
||||
]
|
||||
|
||||
class CastableObjectUnwrapper():
|
||||
|
@ -884,12 +887,23 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None,
|
|||
if type.nullable():
|
||||
declType = CGWrapper(declType, pre="Option<", post=">")
|
||||
|
||||
#XXXjdm support conversionBehavior here
|
||||
template = (
|
||||
"match FromJSValConvertible::from_jsval(cx, ${val}, ()) {\n"
|
||||
" Ok(v) => v,\n"
|
||||
" Err(_) => { %s }\n"
|
||||
"}" % exceptionCode)
|
||||
template = ""
|
||||
if type.isFloat() and not type.isUnrestricted():
|
||||
template = (
|
||||
"match FromJSValConvertible::from_jsval(cx, ${val}, ()) {\n"
|
||||
" Ok(v) => v,\n"
|
||||
" Err(_) => {\n"
|
||||
" throw_type_error(cx, \"this argument is not a finite floating-point value\");\n"
|
||||
" %s\n"
|
||||
" }\n"
|
||||
"}" % exceptionCode)
|
||||
else:
|
||||
#XXXjdm support conversionBehavior here
|
||||
template = (
|
||||
"match FromJSValConvertible::from_jsval(cx, ${val}, ()) {\n"
|
||||
" Ok(v) => v,\n"
|
||||
" Err(_) => { %s }\n"
|
||||
"}" % exceptionCode)
|
||||
|
||||
if defaultValue is not None:
|
||||
if isinstance(defaultValue, IDLNullValue):
|
||||
|
@ -962,7 +976,8 @@ def convertConstIDLValueToJSVal(value):
|
|||
return "DoubleVal(%s)" % (value.value)
|
||||
if tag == IDLType.Tags.bool:
|
||||
return "BoolVal(true)" if value.value else "BoolVal(false)"
|
||||
if tag in [IDLType.Tags.float, IDLType.Tags.double]:
|
||||
if tag in [IDLType.Tags.unrestricted_float, IDLType.Tags.float,
|
||||
IDLType.Tags.unrestricted_double, IDLType.Tags.double]:
|
||||
return "DoubleVal(%s)" % (value.value)
|
||||
raise TypeError("Const value of unhandled type: " + value.type)
|
||||
|
||||
|
@ -2880,7 +2895,8 @@ def convertConstIDLValueToRust(value):
|
|||
IDLType.Tags.int16, IDLType.Tags.uint16,
|
||||
IDLType.Tags.int32, IDLType.Tags.uint32,
|
||||
IDLType.Tags.int64, IDLType.Tags.uint64,
|
||||
IDLType.Tags.float, IDLType.Tags.double]:
|
||||
IDLType.Tags.unrestricted_float, IDLType.Tags.float,
|
||||
IDLType.Tags.unrestricted_double, IDLType.Tags.double]:
|
||||
return str(value.value)
|
||||
|
||||
if tag == IDLType.Tags.bool:
|
||||
|
@ -4683,6 +4699,7 @@ class CGBindingRoot(CGThing):
|
|||
'dom::bindings::proxyhandler',
|
||||
'dom::bindings::proxyhandler::{fill_property_descriptor, get_expando_object}',
|
||||
'dom::bindings::proxyhandler::{get_property_descriptor}',
|
||||
'dom::bindings::num::Finite',
|
||||
'dom::bindings::str::ByteString',
|
||||
'dom::bindings::str::USVString',
|
||||
'libc',
|
||||
|
|
|
@ -16,8 +16,10 @@
|
|||
//! | unsigned long | `u32` |
|
||||
//! | long long | `i64` |
|
||||
//! | unsigned long long | `u64` |
|
||||
//! | float | `f32` |
|
||||
//! | double | `f64` |
|
||||
//! | unrestricted float | `f32` |
|
||||
//! | float | `Finite<f32>` |
|
||||
//! | unrestricted double | `f64` |
|
||||
//! | double | `Finite<f64>` |
|
||||
//! | DOMString | `DOMString` |
|
||||
//! | USVString | `USVString` |
|
||||
//! | ByteString | `ByteString` |
|
||||
|
@ -32,6 +34,7 @@
|
|||
|
||||
use dom::bindings::codegen::PrototypeList;
|
||||
use dom::bindings::js::{JSRef, Root, Unrooted};
|
||||
use dom::bindings::num::Finite;
|
||||
use dom::bindings::str::{ByteString, USVString};
|
||||
use dom::bindings::utils::{Reflectable, Reflector, DOMClass};
|
||||
use util::str::DOMString;
|
||||
|
@ -254,6 +257,24 @@ impl FromJSValConvertible for f32 {
|
|||
}
|
||||
}
|
||||
|
||||
impl ToJSValConvertible for Finite<f32> {
|
||||
fn to_jsval(&self, cx: *mut JSContext) -> JSVal {
|
||||
let value = **self;
|
||||
value.to_jsval(cx)
|
||||
}
|
||||
}
|
||||
|
||||
impl FromJSValConvertible for Finite<f32> {
|
||||
type Config = ();
|
||||
fn from_jsval(cx: *mut JSContext, val: JSVal, option: ()) -> Result<Finite<f32>, ()> {
|
||||
let result = FromJSValConvertible::from_jsval(cx, val, option);
|
||||
let result = result.and_then(|v| {
|
||||
Finite::<f32>::new(v).ok_or(())
|
||||
});
|
||||
result
|
||||
}
|
||||
}
|
||||
|
||||
impl ToJSValConvertible for f64 {
|
||||
fn to_jsval(&self, _cx: *mut JSContext) -> JSVal {
|
||||
unsafe {
|
||||
|
@ -269,6 +290,25 @@ impl FromJSValConvertible for f64 {
|
|||
}
|
||||
}
|
||||
|
||||
impl ToJSValConvertible for Finite<f64> {
|
||||
#[inline]
|
||||
fn to_jsval(&self, cx: *mut JSContext) -> JSVal {
|
||||
let value = **self;
|
||||
value.to_jsval(cx)
|
||||
}
|
||||
}
|
||||
|
||||
impl FromJSValConvertible for Finite<f64> {
|
||||
type Config = ();
|
||||
fn from_jsval(cx: *mut JSContext, val: JSVal, option: ()) -> Result<Finite<f64>, ()> {
|
||||
let result = FromJSValConvertible::from_jsval(cx, val, option);
|
||||
let result = result.and_then(|v| {
|
||||
Finite::<f64>::new(v).ok_or(())
|
||||
});
|
||||
result
|
||||
}
|
||||
}
|
||||
|
||||
impl ToJSValConvertible for str {
|
||||
fn to_jsval(&self, cx: *mut JSContext) -> JSVal {
|
||||
unsafe {
|
||||
|
|
|
@ -37,6 +37,7 @@ pub mod callback;
|
|||
pub mod error;
|
||||
pub mod conversions;
|
||||
pub mod proxyhandler;
|
||||
pub mod num;
|
||||
pub mod str;
|
||||
pub mod structuredclone;
|
||||
pub mod trace;
|
||||
|
|
43
components/script/dom/bindings/num.rs
Normal file
43
components/script/dom/bindings/num.rs
Normal file
|
@ -0,0 +1,43 @@
|
|||
/* 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/. */
|
||||
|
||||
//! The `Finite<T>` struct.
|
||||
|
||||
use core::nonzero::Zeroable;
|
||||
use std::num::Float;
|
||||
use std::ops::Deref;
|
||||
|
||||
/// Encapsulates the IDL restricted float type.
|
||||
#[derive(Clone,Eq,PartialEq)]
|
||||
#[jstraceable]
|
||||
pub struct Finite<T: Float>(T);
|
||||
|
||||
unsafe impl<T: Float> Zeroable for Finite<T> {}
|
||||
|
||||
impl<T: Float> Finite<T> {
|
||||
/// Create a new `Finite<T: Float>` safely.
|
||||
pub fn new(value: T) -> Option<Finite<T>> {
|
||||
if value.is_finite() {
|
||||
Some(Finite(value))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
/// Create a new `Finite<T: Float>`.
|
||||
#[inline]
|
||||
pub fn wrap(value: T) -> Finite<T> {
|
||||
assert!(value.is_finite(), "Finite<T> doesn't encapsulate unrestricted value.");
|
||||
Finite(value)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Float> Deref for Finite<T> {
|
||||
type Target = T;
|
||||
|
||||
fn deref(&self) -> &T {
|
||||
let &Finite(ref value) = self;
|
||||
value
|
||||
}
|
||||
}
|
|
@ -9,6 +9,7 @@ use dom::bindings::codegen::Bindings::CanvasGradientBinding;
|
|||
use dom::bindings::codegen::Bindings::CanvasGradientBinding::CanvasGradientMethods;
|
||||
use dom::bindings::global::GlobalRef;
|
||||
use dom::bindings::js::{JSRef, Temporary};
|
||||
use dom::bindings::num::Finite;
|
||||
use dom::bindings::utils::{Reflector, reflect_dom_object};
|
||||
use dom::canvasrenderingcontext2d::parse_color;
|
||||
|
||||
|
@ -41,7 +42,7 @@ impl CanvasGradient {
|
|||
}
|
||||
|
||||
impl<'a> CanvasGradientMethods for JSRef<'a, CanvasGradient> {
|
||||
fn AddColorStop(self, offset: f32, color: String) {
|
||||
fn AddColorStop(self, offset: Finite<f32>, color: String) {
|
||||
let default_black = RGBA {
|
||||
red: 0.0,
|
||||
green: 0.0,
|
||||
|
@ -50,7 +51,7 @@ impl<'a> CanvasGradientMethods for JSRef<'a, CanvasGradient> {
|
|||
};
|
||||
|
||||
self.stops.borrow_mut().push(CanvasGradientStop {
|
||||
offset: offset as f64,
|
||||
offset: (*offset) as f64,
|
||||
color: parse_color(color.as_slice()).unwrap_or(default_black),
|
||||
});
|
||||
}
|
||||
|
|
|
@ -8,10 +8,11 @@ use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasWin
|
|||
use dom::bindings::codegen::Bindings::ImageDataBinding::ImageDataMethods;
|
||||
use dom::bindings::codegen::UnionTypes::HTMLCanvasElementOrCanvasRenderingContext2D;
|
||||
use dom::bindings::codegen::UnionTypes::StringOrCanvasGradientOrCanvasPattern;
|
||||
use dom::bindings::error::Error::{IndexSize, TypeError};
|
||||
use dom::bindings::error::Error::{IndexSize, NotSupported, TypeError};
|
||||
use dom::bindings::error::Fallible;
|
||||
use dom::bindings::global::{GlobalRef, GlobalField};
|
||||
use dom::bindings::js::{JS, JSRef, LayoutJS, Temporary};
|
||||
use dom::bindings::num::Finite;
|
||||
use dom::bindings::utils::{Reflector, reflect_dom_object};
|
||||
use dom::canvasgradient::{CanvasGradient, CanvasGradientStyle, ToFillOrStrokeStyle};
|
||||
use dom::htmlcanvaselement::{HTMLCanvasElement, HTMLCanvasElementHelpers};
|
||||
|
@ -206,22 +207,44 @@ impl LayoutCanvasRenderingContext2DHelpers for LayoutJS<CanvasRenderingContext2D
|
|||
}
|
||||
}
|
||||
|
||||
// We add a guard to each of methods by the spec:
|
||||
// http://www.w3.org/html/wg/drafts/2dcontext/html5_canvas_CR/
|
||||
//
|
||||
// > Except where otherwise specified, for the 2D context interface,
|
||||
// > any method call with a numeric argument whose value is infinite or a NaN value must be ignored.
|
||||
//
|
||||
// Restricted values are guarded in glue code. Therefore we need not add a guard.
|
||||
//
|
||||
// FIXME: this behavior should might be generated by some annotattions to idl.
|
||||
impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D> {
|
||||
fn Canvas(self) -> Temporary<HTMLCanvasElement> {
|
||||
Temporary::new(self.canvas)
|
||||
}
|
||||
|
||||
fn Scale(self, x: f64, y: f64) {
|
||||
if !(x.is_finite() && y.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.transform.set(self.transform.get().scale(x as f32, y as f32));
|
||||
self.update_transform()
|
||||
}
|
||||
|
||||
fn Translate(self, x: f64, y: f64) {
|
||||
if !(x.is_finite() && y.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.transform.set(self.transform.get().translate(x as f32, y as f32));
|
||||
self.update_transform()
|
||||
}
|
||||
|
||||
fn Transform(self, a: f64, b: f64, c: f64, d: f64, e: f64, f: f64) {
|
||||
if !(a.is_finite() && b.is_finite() && c.is_finite() &&
|
||||
d.is_finite() && e.is_finite() && f.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.transform.set(self.transform.get().mul(&Matrix2D::new(a as f32,
|
||||
b as f32,
|
||||
c as f32,
|
||||
|
@ -232,6 +255,11 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
|||
}
|
||||
|
||||
fn SetTransform(self, a: f64, b: f64, c: f64, d: f64, e: f64, f: f64) {
|
||||
if !(a.is_finite() && b.is_finite() && c.is_finite() &&
|
||||
d.is_finite() && e.is_finite() && f.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.transform.set(Matrix2D::new(a as f32,
|
||||
b as f32,
|
||||
c as f32,
|
||||
|
@ -242,16 +270,31 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
|||
}
|
||||
|
||||
fn FillRect(self, x: f64, y: f64, width: f64, height: f64) {
|
||||
if !(x.is_finite() && y.is_finite() &&
|
||||
width.is_finite() && height.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
let rect = Rect(Point2D(x as f32, y as f32), Size2D(width as f32, height as f32));
|
||||
self.renderer.send(CanvasMsg::FillRect(rect)).unwrap();
|
||||
}
|
||||
|
||||
fn ClearRect(self, x: f64, y: f64, width: f64, height: f64) {
|
||||
if !(x.is_finite() && y.is_finite() &&
|
||||
width.is_finite() && height.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
let rect = Rect(Point2D(x as f32, y as f32), Size2D(width as f32, height as f32));
|
||||
self.renderer.send(CanvasMsg::ClearRect(rect)).unwrap();
|
||||
}
|
||||
|
||||
fn StrokeRect(self, x: f64, y: f64, width: f64, height: f64) {
|
||||
if !(x.is_finite() && y.is_finite() &&
|
||||
width.is_finite() && height.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
let rect = Rect(Point2D(x as f32, y as f32), Size2D(width as f32, height as f32));
|
||||
self.renderer.send(CanvasMsg::StrokeRect(rect)).unwrap();
|
||||
}
|
||||
|
@ -271,6 +314,9 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
|||
// https://html.spec.whatwg.org/multipage/scripting.html#dom-context-2d-drawimage
|
||||
fn DrawImage(self, image: HTMLCanvasElementOrCanvasRenderingContext2D,
|
||||
dx: f64, dy: f64) -> Fallible<()> {
|
||||
if !(dx.is_finite() && dy.is_finite()) {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
// From rules described in the spec:
|
||||
// If the sx, sy, sw, and sh arguments are omitted, they must default to 0, 0,
|
||||
|
@ -310,6 +356,10 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
|||
// https://html.spec.whatwg.org/multipage/scripting.html#dom-context-2d-drawimage
|
||||
fn DrawImage_(self, image: HTMLCanvasElementOrCanvasRenderingContext2D,
|
||||
dx: f64, dy: f64, dw: f64, dh: f64) -> Fallible<()> {
|
||||
if !(dx.is_finite() && dy.is_finite() &&
|
||||
dw.is_finite() && dh.is_finite()) {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
// From rules described in the spec:
|
||||
// If the sx, sy, sw, and sh arguments are omitted, they must default to 0, 0,
|
||||
|
@ -346,6 +396,11 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
|||
fn DrawImage__(self, image: HTMLCanvasElementOrCanvasRenderingContext2D,
|
||||
sx: f64, sy: f64, sw: f64, sh: f64,
|
||||
dx: f64, dy: f64, dw: f64, dh: f64) -> Fallible<()> {
|
||||
if !(sx.is_finite() && sy.is_finite() && sw.is_finite() && sh.is_finite() &&
|
||||
dx.is_finite() && dy.is_finite() && dw.is_finite() && dh.is_finite()) {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
match image {
|
||||
HTMLCanvasElementOrCanvasRenderingContext2D::eHTMLCanvasElement(image) => {
|
||||
let canvas = image.root();
|
||||
|
@ -365,25 +420,49 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
|||
}
|
||||
|
||||
fn MoveTo(self, x: f64, y: f64) {
|
||||
if !(x.is_finite() && y.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.renderer.send(CanvasMsg::MoveTo(Point2D(x as f32, y as f32))).unwrap();
|
||||
}
|
||||
|
||||
fn LineTo(self, x: f64, y: f64) {
|
||||
if !(x.is_finite() && y.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.renderer.send(CanvasMsg::LineTo(Point2D(x as f32, y as f32))).unwrap();
|
||||
}
|
||||
|
||||
fn QuadraticCurveTo(self, cpx: f64, cpy: f64, x: f64, y: f64) {
|
||||
if !(cpx.is_finite() && cpy.is_finite() &&
|
||||
x.is_finite() && y.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.renderer.send(CanvasMsg::QuadraticCurveTo(Point2D(cpx as f32, cpy as f32),
|
||||
Point2D(x as f32, y as f32))).unwrap();
|
||||
}
|
||||
|
||||
fn BezierCurveTo(self, cp1x: f64, cp1y: f64, cp2x: f64, cp2y: f64, x: f64, y: f64) {
|
||||
if !(cp1x.is_finite() && cp1y.is_finite() && cp2x.is_finite() && cp2y.is_finite() &&
|
||||
x.is_finite() && y.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.renderer.send(CanvasMsg::BezierCurveTo(Point2D(cp1x as f32, cp1y as f32),
|
||||
Point2D(cp2x as f32, cp2y as f32),
|
||||
Point2D(x as f32, y as f32))).unwrap();
|
||||
}
|
||||
|
||||
fn Arc(self, x: f64, y: f64, r: f64, start: f64, end: f64, ccw: bool) {
|
||||
fn Arc(self, x: Finite<f64>, y: Finite<f64>, r: Finite<f64>, start: Finite<f64>, end: Finite<f64>, ccw: bool) {
|
||||
let x = *x;
|
||||
let y = *y;
|
||||
let r = *r;
|
||||
let start = *start;
|
||||
let end = *end;
|
||||
|
||||
self.renderer.send(CanvasMsg::Arc(Point2D(x as f32, y as f32), r as f32,
|
||||
start as f32, end as f32, ccw)).unwrap();
|
||||
}
|
||||
|
@ -456,6 +535,10 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
|||
}
|
||||
|
||||
fn CreateImageData(self, sw: f64, sh: f64) -> Fallible<Temporary<ImageData>> {
|
||||
if !(sw.is_finite() && sh.is_finite()) {
|
||||
return Err(NotSupported);
|
||||
}
|
||||
|
||||
if sw == 0.0 || sh == 0.0 {
|
||||
return Err(IndexSize)
|
||||
}
|
||||
|
@ -467,7 +550,10 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
|||
Ok(ImageData::new(self.global.root().r(), imagedata.Width(), imagedata.Height(), None))
|
||||
}
|
||||
|
||||
fn GetImageData(self, sx: f64, sy: f64, sw: f64, sh: f64) -> Fallible<Temporary<ImageData>> {
|
||||
fn GetImageData(self, sx: Finite<f64>, sy: Finite<f64>, sw: Finite<f64>, sh: Finite<f64>) -> Fallible<Temporary<ImageData>> {
|
||||
let sw = *sw;
|
||||
let sh = *sh;
|
||||
|
||||
if sw == 0.0 || sh == 0.0 {
|
||||
return Err(IndexSize)
|
||||
}
|
||||
|
@ -480,15 +566,27 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
|||
Ok(ImageData::new(self.global.root().r(), sw.abs().to_u32().unwrap(), sh.abs().to_u32().unwrap(), Some(data)))
|
||||
}
|
||||
|
||||
fn PutImageData(self, imagedata: JSRef<ImageData>, dx: f64, dy: f64) {
|
||||
fn PutImageData(self, imagedata: JSRef<ImageData>, dx: Finite<f64>, dy: Finite<f64>) {
|
||||
// XXX:
|
||||
// By the spec: http://www.w3.org/html/wg/drafts/2dcontext/html5_canvas_CR/#dom-context-2d-putimagedata
|
||||
// "If any of the arguments to the method are infinite or NaN, the method must throw a NotSupportedError exception"
|
||||
// But this arguments are stricted value, so if they are not finite values,
|
||||
// they will be TypeError by WebIDL spec before call this methods.
|
||||
|
||||
let data = imagedata.get_data_array(&self.global.root().r());
|
||||
let image_data_rect = Rect(Point2D(dx.to_i32().unwrap(), dy.to_i32().unwrap()), imagedata.get_size());
|
||||
let dirty_rect = None;
|
||||
self.renderer.send(CanvasMsg::PutImageData(data, image_data_rect, dirty_rect)).unwrap()
|
||||
}
|
||||
|
||||
fn PutImageData_(self, imagedata: JSRef<ImageData>, dx: f64, dy: f64,
|
||||
dirtyX: f64, dirtyY: f64, dirtyWidth: f64, dirtyHeight: f64) {
|
||||
fn PutImageData_(self, imagedata: JSRef<ImageData>, dx: Finite<f64>, dy: Finite<f64>,
|
||||
dirtyX: Finite<f64>, dirtyY: Finite<f64>, dirtyWidth: Finite<f64>, dirtyHeight: Finite<f64>) {
|
||||
// XXX:
|
||||
// By the spec: http://www.w3.org/html/wg/drafts/2dcontext/html5_canvas_CR/#dom-context-2d-putimagedata
|
||||
// "If any of the arguments to the method are infinite or NaN, the method must throw a NotSupportedError exception"
|
||||
// But this arguments are stricted value, so if they are not finite values,
|
||||
// they will be TypeError by WebIDL spec before call this methods.
|
||||
|
||||
let data = imagedata.get_data_array(&self.global.root().r());
|
||||
let image_data_rect = Rect(Point2D(dx.to_i32().unwrap(), dy.to_i32().unwrap()),
|
||||
Size2D(imagedata.Width().to_i32().unwrap(),
|
||||
|
@ -499,7 +597,13 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
|||
self.renderer.send(CanvasMsg::PutImageData(data, image_data_rect, dirty_rect)).unwrap()
|
||||
}
|
||||
|
||||
fn CreateLinearGradient(self, x0: f64, y0: f64, x1: f64, y1: f64) -> Fallible<Temporary<CanvasGradient>> {
|
||||
fn CreateLinearGradient(self, x0: Finite<f64>, y0: Finite<f64>,
|
||||
x1: Finite<f64>, y1: Finite<f64>) -> Fallible<Temporary<CanvasGradient>> {
|
||||
let x0 = *x0;
|
||||
let y0 = *y0;
|
||||
let x1 = *x1;
|
||||
let y1 = *y1;
|
||||
|
||||
if [x0, y0, x1, y1].iter().any(|x| x.is_nan() || x.is_infinite()) {
|
||||
return Err(TypeError("One of the arguments of createLinearGradient() is not a finite floating-point value.".to_owned()));
|
||||
}
|
||||
|
@ -507,7 +611,15 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
|||
CanvasGradientStyle::Linear(LinearGradientStyle::new(x0, y0, x1, y1, Vec::new()))))
|
||||
}
|
||||
|
||||
fn CreateRadialGradient(self, x0: f64, y0: f64, r0: f64, x1: f64, y1: f64, r1: f64) -> Fallible<Temporary<CanvasGradient>> {
|
||||
fn CreateRadialGradient(self, x0: Finite<f64>, y0: Finite<f64>, r0: Finite<f64>,
|
||||
x1: Finite<f64>, y1: Finite<f64>, r1: Finite<f64>) -> Fallible<Temporary<CanvasGradient>> {
|
||||
let x0 = *x0;
|
||||
let y0 = *y0;
|
||||
let r0 = *r0;
|
||||
let x1 = *x1;
|
||||
let y1 = *y1;
|
||||
let r1 = *r1;
|
||||
|
||||
if [x0, y0, r0, x1, y1, r1].iter().any(|x| x.is_nan() || x.is_infinite()) {
|
||||
return Err(TypeError("One of the arguments of createRadialGradient() is not a finite floating-point value.".to_owned()));
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ use dom::bindings::codegen::Bindings::DOMRectBinding;
|
|||
use dom::bindings::codegen::Bindings::DOMRectBinding::DOMRectMethods;
|
||||
use dom::bindings::global::GlobalRef;
|
||||
use dom::bindings::js::{JSRef, Temporary};
|
||||
use dom::bindings::num::Finite;
|
||||
use dom::bindings::utils::{Reflector, reflect_dom_object};
|
||||
use dom::window::Window;
|
||||
use util::geometry::Au;
|
||||
|
@ -41,28 +42,30 @@ impl DOMRect {
|
|||
}
|
||||
|
||||
impl<'a> DOMRectMethods for JSRef<'a, DOMRect> {
|
||||
fn Top(self) -> f32 {
|
||||
self.top
|
||||
fn Top(self) -> Finite<f32> {
|
||||
Finite::wrap(self.top)
|
||||
}
|
||||
|
||||
fn Bottom(self) -> f32 {
|
||||
self.bottom
|
||||
fn Bottom(self) -> Finite<f32> {
|
||||
Finite::wrap(self.bottom)
|
||||
}
|
||||
|
||||
fn Left(self) -> f32 {
|
||||
self.left
|
||||
fn Left(self) -> Finite<f32> {
|
||||
Finite::wrap(self.left)
|
||||
}
|
||||
|
||||
fn Right(self) -> f32 {
|
||||
self.right
|
||||
fn Right(self) -> Finite<f32> {
|
||||
Finite::wrap(self.right)
|
||||
}
|
||||
|
||||
fn Width(self) -> f32 {
|
||||
(self.right - self.left).abs()
|
||||
fn Width(self) -> Finite<f32> {
|
||||
let result = (self.right - self.left).abs();
|
||||
Finite::wrap(result)
|
||||
}
|
||||
|
||||
fn Height(self) -> f32 {
|
||||
(self.bottom - self.top).abs()
|
||||
fn Height(self) -> Finite<f32> {
|
||||
let result = (self.bottom - self.top).abs();
|
||||
Finite::wrap(result)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,12 +6,13 @@ use dom::bindings::codegen::Bindings::PerformanceBinding;
|
|||
use dom::bindings::codegen::Bindings::PerformanceBinding::PerformanceMethods;
|
||||
use dom::bindings::global::GlobalRef;
|
||||
use dom::bindings::js::{JS, JSRef, Temporary};
|
||||
use dom::bindings::num::Finite;
|
||||
use dom::bindings::utils::{Reflector, reflect_dom_object};
|
||||
use dom::performancetiming::{PerformanceTiming, PerformanceTimingHelpers};
|
||||
use dom::window::Window;
|
||||
use time;
|
||||
|
||||
pub type DOMHighResTimeStamp = f64;
|
||||
pub type DOMHighResTimeStamp = Finite<f64>;
|
||||
|
||||
#[dom_struct]
|
||||
pub struct Performance {
|
||||
|
@ -50,7 +51,8 @@ impl<'a> PerformanceMethods for JSRef<'a, Performance> {
|
|||
// https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/HighResolutionTime/Overview.html#dom-performance-now
|
||||
fn Now(self) -> DOMHighResTimeStamp {
|
||||
let navStart = self.timing.root().r().NavigationStartPrecise();
|
||||
(time::precise_time_ns() as f64 - navStart) * 1000000u as DOMHighResTimeStamp
|
||||
let now = (time::precise_time_ns() as f64 - navStart) * 1000000u as f64;
|
||||
Finite::wrap(now)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@ use dom::bindings::codegen::UnionTypes::HTMLElementOrLong;
|
|||
use dom::bindings::codegen::UnionTypes::HTMLElementOrLong::eLong;
|
||||
use dom::bindings::global::GlobalField;
|
||||
use dom::bindings::js::{JSRef, Temporary};
|
||||
use dom::bindings::num::Finite;
|
||||
use dom::bindings::str::{ByteString, USVString};
|
||||
use dom::bindings::utils::{Reflector, Reflectable};
|
||||
use dom::blob::Blob;
|
||||
|
@ -49,10 +50,14 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> {
|
|||
fn SetLongLongAttribute(self, _: i64) {}
|
||||
fn UnsignedLongLongAttribute(self) -> u64 { 0 }
|
||||
fn SetUnsignedLongLongAttribute(self, _: u64) {}
|
||||
fn FloatAttribute(self) -> f32 { 0. }
|
||||
fn SetFloatAttribute(self, _: f32) {}
|
||||
fn DoubleAttribute(self) -> f64 { 0. }
|
||||
fn SetDoubleAttribute(self, _: f64) {}
|
||||
fn UnrestrictedFloatAttribute(self) -> f32 { 0. }
|
||||
fn SetUnrestrictedFloatAttribute(self, _: f32) {}
|
||||
fn FloatAttribute(self) -> Finite<f32> { Finite::wrap(0.) }
|
||||
fn SetFloatAttribute(self, _: Finite<f32>) {}
|
||||
fn UnrestrictedDoubleAttribute(self) -> f64 { 0. }
|
||||
fn SetUnrestrictedDoubleAttribute(self, _: f64) {}
|
||||
fn DoubleAttribute(self) -> Finite<f64> { Finite::wrap(0.) }
|
||||
fn SetDoubleAttribute(self, _: Finite<f64>) {}
|
||||
fn StringAttribute(self) -> DOMString { "".to_owned() }
|
||||
fn SetStringAttribute(self, _: DOMString) {}
|
||||
fn UsvstringAttribute(self) -> USVString { USVString("".to_owned()) }
|
||||
|
@ -92,10 +97,14 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> {
|
|||
fn SetLongLongAttributeNullable(self, _: Option<i64>) {}
|
||||
fn GetUnsignedLongLongAttributeNullable(self) -> Option<u64> { Some(0) }
|
||||
fn SetUnsignedLongLongAttributeNullable(self, _: Option<u64>) {}
|
||||
fn GetFloatAttributeNullable(self) -> Option<f32> { Some(0.) }
|
||||
fn SetFloatAttributeNullable(self, _: Option<f32>) {}
|
||||
fn GetDoubleAttributeNullable(self) -> Option<f64> { Some(0.) }
|
||||
fn SetDoubleAttributeNullable(self, _: Option<f64>) {}
|
||||
fn GetUnrestrictedFloatAttributeNullable(self) -> Option<f32> { Some(0.) }
|
||||
fn SetUnrestrictedFloatAttributeNullable(self, _: Option<f32>) {}
|
||||
fn GetFloatAttributeNullable(self) -> Option<Finite<f32>> { Some(Finite::wrap(0.)) }
|
||||
fn SetFloatAttributeNullable(self, _: Option<Finite<f32>>) {}
|
||||
fn GetUnrestrictedDoubleAttributeNullable(self) -> Option<f64> { Some(0.) }
|
||||
fn SetUnrestrictedDoubleAttributeNullable(self, _: Option<f64>) {}
|
||||
fn GetDoubleAttributeNullable(self) -> Option<Finite<f64>> { Some(Finite::wrap(0.)) }
|
||||
fn SetDoubleAttributeNullable(self, _: Option<Finite<f64>>) {}
|
||||
fn GetByteStringAttributeNullable(self) -> Option<ByteString> { Some(ByteString::new(vec!())) }
|
||||
fn SetByteStringAttributeNullable(self, _: Option<ByteString>) {}
|
||||
fn GetStringAttributeNullable(self) -> Option<DOMString> { Some("".to_owned()) }
|
||||
|
@ -125,8 +134,10 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> {
|
|||
fn ReceiveUnsignedLong(self) -> u32 { 0 }
|
||||
fn ReceiveLongLong(self) -> i64 { 0 }
|
||||
fn ReceiveUnsignedLongLong(self) -> u64 { 0 }
|
||||
fn ReceiveFloat(self) -> f32 { 0. }
|
||||
fn ReceiveDouble(self) -> f64 { 0. }
|
||||
fn ReceiveUnrestrictedFloat(self) -> f32 { 0. }
|
||||
fn ReceiveFloat(self) -> Finite<f32> { Finite::wrap(0.) }
|
||||
fn ReceiveUnrestrictedDouble(self) -> f64 { 0. }
|
||||
fn ReceiveDouble(self) -> Finite<f64> { Finite::wrap(0.) }
|
||||
fn ReceiveString(self) -> DOMString { "".to_owned() }
|
||||
fn ReceiveUsvstring(self) -> USVString { USVString("".to_owned()) }
|
||||
fn ReceiveByteString(self) -> ByteString { ByteString::new(vec!()) }
|
||||
|
@ -148,8 +159,10 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> {
|
|||
fn ReceiveNullableUnsignedLong(self) -> Option<u32> { Some(0) }
|
||||
fn ReceiveNullableLongLong(self) -> Option<i64> { Some(0) }
|
||||
fn ReceiveNullableUnsignedLongLong(self) -> Option<u64> { Some(0) }
|
||||
fn ReceiveNullableFloat(self) -> Option<f32> { Some(0.) }
|
||||
fn ReceiveNullableDouble(self) -> Option<f64> { Some(0.) }
|
||||
fn ReceiveNullableUnrestrictedFloat(self) -> Option<f32> { Some(0.) }
|
||||
fn ReceiveNullableFloat(self) -> Option<Finite<f32>> { Some(Finite::wrap(0.)) }
|
||||
fn ReceiveNullableUnrestrictedDouble(self) -> Option<f64> { Some(0.) }
|
||||
fn ReceiveNullableDouble(self) -> Option<Finite<f64>> { Some(Finite::wrap(0.)) }
|
||||
fn ReceiveNullableString(self) -> Option<DOMString> { Some("".to_owned()) }
|
||||
fn ReceiveNullableUsvstring(self) -> Option<USVString> { Some(USVString("".to_owned())) }
|
||||
fn ReceiveNullableByteString(self) -> Option<ByteString> { Some(ByteString::new(vec!())) }
|
||||
|
@ -170,8 +183,10 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> {
|
|||
fn PassUnsignedLong(self, _: u32) {}
|
||||
fn PassLongLong(self, _: i64) {}
|
||||
fn PassUnsignedLongLong(self, _: u64) {}
|
||||
fn PassFloat(self, _: f32) {}
|
||||
fn PassDouble(self, _: f64) {}
|
||||
fn PassUnrestrictedFloat(self, _: f32) {}
|
||||
fn PassFloat(self, _: Finite<f32>) {}
|
||||
fn PassUnrestrictedDouble(self, _: f64) {}
|
||||
fn PassDouble(self, _: Finite<f64>) {}
|
||||
fn PassString(self, _: DOMString) {}
|
||||
fn PassUsvstring(self, _: USVString) {}
|
||||
fn PassByteString(self, _: ByteString) {}
|
||||
|
@ -193,8 +208,10 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> {
|
|||
fn PassNullableUnsignedLong(self, _: Option<u32>) {}
|
||||
fn PassNullableLongLong(self, _: Option<i64>) {}
|
||||
fn PassNullableUnsignedLongLong(self, _: Option<u64>) {}
|
||||
fn PassNullableFloat(self, _: Option<f32>) {}
|
||||
fn PassNullableDouble(self, _: Option<f64>) {}
|
||||
fn PassNullableUnrestrictedFloat(self, _: Option<f32>) {}
|
||||
fn PassNullableFloat(self, _: Option<Finite<f32>>) {}
|
||||
fn PassNullableUnrestrictedDouble(self, _: Option<f64>) {}
|
||||
fn PassNullableDouble(self, _: Option<Finite<f64>>) {}
|
||||
fn PassNullableString(self, _: Option<DOMString>) {}
|
||||
fn PassNullableUsvstring(self, _: Option<USVString>) {}
|
||||
fn PassNullableByteString(self, _: Option<ByteString>) {}
|
||||
|
@ -214,8 +231,10 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> {
|
|||
fn PassOptionalUnsignedLong(self, _: Option<u32>) {}
|
||||
fn PassOptionalLongLong(self, _: Option<i64>) {}
|
||||
fn PassOptionalUnsignedLongLong(self, _: Option<u64>) {}
|
||||
fn PassOptionalFloat(self, _: Option<f32>) {}
|
||||
fn PassOptionalDouble(self, _: Option<f64>) {}
|
||||
fn PassOptionalUnrestrictedFloat(self, _: Option<f32>) {}
|
||||
fn PassOptionalFloat(self, _: Option<Finite<f32>>) {}
|
||||
fn PassOptionalUnrestrictedDouble(self, _: Option<f64>) {}
|
||||
fn PassOptionalDouble(self, _: Option<Finite<f64>>) {}
|
||||
fn PassOptionalString(self, _: Option<DOMString>) {}
|
||||
fn PassOptionalUsvstring(self, _: Option<USVString>) {}
|
||||
fn PassOptionalByteString(self, _: Option<ByteString>) {}
|
||||
|
@ -236,8 +255,10 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> {
|
|||
fn PassOptionalNullableUnsignedLong(self, _: Option<Option<u32>>) {}
|
||||
fn PassOptionalNullableLongLong(self, _: Option<Option<i64>>) {}
|
||||
fn PassOptionalNullableUnsignedLongLong(self, _: Option<Option<u64>>) {}
|
||||
fn PassOptionalNullableFloat(self, _: Option<Option<f32>>) {}
|
||||
fn PassOptionalNullableDouble(self, _: Option<Option<f64>>) {}
|
||||
fn PassOptionalNullableUnrestrictedFloat(self, _: Option<Option<f32>>) {}
|
||||
fn PassOptionalNullableFloat(self, _: Option<Option<Finite<f32>>>) {}
|
||||
fn PassOptionalNullableUnrestrictedDouble(self, _: Option<Option<f64>>) {}
|
||||
fn PassOptionalNullableDouble(self, _: Option<Option<Finite<f64>>>) {}
|
||||
fn PassOptionalNullableString(self, _: Option<Option<DOMString>>) {}
|
||||
fn PassOptionalNullableUsvstring(self, _: Option<Option<USVString>>) {}
|
||||
fn PassOptionalNullableByteString(self, _: Option<Option<ByteString>>) {}
|
||||
|
@ -270,8 +291,10 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> {
|
|||
fn PassOptionalNullableUnsignedLongWithDefault(self, _: Option<u32>) {}
|
||||
fn PassOptionalNullableLongLongWithDefault(self, _: Option<i64>) {}
|
||||
fn PassOptionalNullableUnsignedLongLongWithDefault(self, _: Option<u64>) {}
|
||||
// fn PassOptionalNullableFloatWithDefault(self, _: Option<f32>) {}
|
||||
// fn PassOptionalNullableDoubleWithDefault(self, _: Option<f64>) {}
|
||||
// fn PassOptionalNullableUnrestrictedFloatWithDefault(self, _: Option<f32>) {}
|
||||
// fn PassOptionalNullableFloatWithDefault(self, _: Option<Finite<f32>>) {}
|
||||
// fn PassOptionalNullableUnrestrictedDoubleWithDefault(self, _: Option<f64>) {}
|
||||
// fn PassOptionalNullableDoubleWithDefault(self, _: Option<Finite<f64>>) {}
|
||||
fn PassOptionalNullableStringWithDefault(self, _: Option<DOMString>) {}
|
||||
fn PassOptionalNullableUsvstringWithDefault(self, _: Option<USVString>) {}
|
||||
fn PassOptionalNullableByteStringWithDefault(self, _: Option<ByteString>) {}
|
||||
|
@ -292,8 +315,10 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> {
|
|||
fn PassOptionalNullableUnsignedLongWithNonNullDefault(self, _: Option<u32>) {}
|
||||
fn PassOptionalNullableLongLongWithNonNullDefault(self, _: Option<i64>) {}
|
||||
fn PassOptionalNullableUnsignedLongLongWithNonNullDefault(self, _: Option<u64>) {}
|
||||
// fn PassOptionalNullableFloatWithNonNullDefault(self, _: Option<f32>) {}
|
||||
// fn PassOptionalNullableDoubleWithNonNullDefault(self, _: Option<f64>) {}
|
||||
// fn PassOptionalNullableUnrestrictedFloatWithNonNullDefault(self, _: Option<f32>) {}
|
||||
// fn PassOptionalNullableFloatWithNonNullDefault(self, _: Option<Finite<f32>>) {}
|
||||
// fn PassOptionalNullableUnrestrictedDoubleWithNonNullDefault(self, _: Option<f64>) {}
|
||||
// fn PassOptionalNullableDoubleWithNonNullDefault(self, _: Option<Finite<f64>>) {}
|
||||
fn PassOptionalNullableStringWithNonNullDefault(self, _: Option<DOMString>) {}
|
||||
fn PassOptionalNullableUsvstringWithNonNullDefault(self, _: Option<USVString>) {}
|
||||
// fn PassOptionalNullableEnumWithNonNullDefault(self, _: Option<TestEnum>) {}
|
||||
|
@ -307,8 +332,10 @@ impl<'a> TestBindingMethods for JSRef<'a, TestBinding> {
|
|||
fn PassVariadicUnsignedLong(self, _: Vec<u32>) {}
|
||||
fn PassVariadicLongLong(self, _: Vec<i64>) {}
|
||||
fn PassVariadicUnsignedLongLong(self, _: Vec<u64>) {}
|
||||
fn PassVariadicFloat(self, _: Vec<f32>) {}
|
||||
fn PassVariadicDouble(self, _: Vec<f64>) {}
|
||||
fn PassVariadicUnrestrictedFloat(self, _: Vec<f32>) {}
|
||||
fn PassVariadicFloat(self, _: Vec<Finite<f32>>) {}
|
||||
fn PassVariadicUnrestrictedDouble(self, _: Vec<f64>) {}
|
||||
fn PassVariadicDouble(self, _: Vec<Finite<f64>>) {}
|
||||
fn PassVariadicString(self, _: Vec<DOMString>) {}
|
||||
fn PassVariadicUsvstring(self, _: Vec<USVString>) {}
|
||||
fn PassVariadicByteString(self, _: Vec<ByteString>) {}
|
||||
|
|
|
@ -31,21 +31,21 @@ interface CanvasRenderingContext2D {
|
|||
|
||||
// transformations (default transform is the identity matrix)
|
||||
// attribute SVGMatrix currentTransform;
|
||||
void scale(/*unrestricted*/ double x, /*unrestricted*/ double y);
|
||||
void scale(unrestricted double x, unrestricted double y);
|
||||
//void rotate(unrestricted double angle);
|
||||
void translate(/*unrestricted*/ double x, /*unrestricted*/ double y);
|
||||
void transform(/*unrestricted*/ double a,
|
||||
/*unrestricted*/ double b,
|
||||
/*unrestricted*/ double c,
|
||||
/*unrestricted*/ double d,
|
||||
/*unrestricted*/ double e,
|
||||
/*unrestricted*/ double f);
|
||||
void setTransform(/*unrestricted*/ double a,
|
||||
/*unrestricted*/ double b,
|
||||
/*unrestricted*/ double c,
|
||||
/*unrestricted*/ double d,
|
||||
/*unrestricted*/ double e,
|
||||
/*unrestricted*/ double f);
|
||||
void translate(unrestricted double x, unrestricted double y);
|
||||
void transform(unrestricted double a,
|
||||
unrestricted double b,
|
||||
unrestricted double c,
|
||||
unrestricted double d,
|
||||
unrestricted double e,
|
||||
unrestricted double f);
|
||||
void setTransform(unrestricted double a,
|
||||
unrestricted double b,
|
||||
unrestricted double c,
|
||||
unrestricted double d,
|
||||
unrestricted double e,
|
||||
unrestricted double f);
|
||||
//void resetTransform();
|
||||
|
||||
// compositing
|
||||
|
@ -71,15 +71,12 @@ interface CanvasRenderingContext2D {
|
|||
// attribute DOMString shadowColor; // (default transparent black)
|
||||
|
||||
// rects
|
||||
//void clearRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
|
||||
//[LenientFloat]
|
||||
void clearRect(double x, double y, double w, double h);
|
||||
//void fillRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
|
||||
void clearRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
|
||||
//[LenientFloat]
|
||||
void fillRect(double x, double y, double w, double h);
|
||||
//void strokeRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
|
||||
void fillRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
|
||||
//[LenientFloat]
|
||||
void strokeRect(double x, double y, double w, double h);
|
||||
void strokeRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
|
||||
|
||||
// path API (see also CanvasPathMethods)
|
||||
void beginPath();
|
||||
|
@ -108,11 +105,15 @@ interface CanvasRenderingContext2D {
|
|||
|
||||
// drawing images
|
||||
[Throws]
|
||||
void drawImage(CanvasImageSource image, /* unrestricted */ double dx, /* unrestricted */ double dy);
|
||||
void drawImage(CanvasImageSource image, unrestricted double dx, unrestricted double dy);
|
||||
[Throws]
|
||||
void drawImage(CanvasImageSource image, /* unrestricted */ double dx, /* unrestricted */ double dy, /* unrestricted */ double dw, /* unrestricted */ double dh);
|
||||
void drawImage(CanvasImageSource image, unrestricted double dx, unrestricted double dy,
|
||||
unrestricted double dw, unrestricted double dh);
|
||||
[Throws]
|
||||
void drawImage(CanvasImageSource image, /* unrestricted */ double sx, /* unrestricted */ double sy, /* unrestricted */ double sw, /* unrestricted */ double sh, /* unrestricted */ double dx, /* unrestricted */ double dy, /* unrestricted */ double dw, /* unrestricted */ double dh);
|
||||
void drawImage(CanvasImageSource image, unrestricted double sx, unrestricted double sy,
|
||||
unrestricted double sw, unrestricted double sh,
|
||||
unrestricted double dx, unrestricted double dy,
|
||||
unrestricted double dw, unrestricted double dh);
|
||||
|
||||
// hit regions
|
||||
//void addHitRegion(optional HitRegionOptions options);
|
||||
|
@ -120,7 +121,7 @@ interface CanvasRenderingContext2D {
|
|||
|
||||
// pixel manipulation
|
||||
[Throws]
|
||||
ImageData createImageData(double sw, double sh);
|
||||
ImageData createImageData(unrestricted double sw, unrestricted double sh);
|
||||
[Throws]
|
||||
ImageData createImageData(ImageData imagedata);
|
||||
[Throws]
|
||||
|
@ -133,16 +134,16 @@ interface CanvasRenderingContext2D {
|
|||
interface CanvasPathMethods {
|
||||
// shared path API methods
|
||||
void closePath();
|
||||
void moveTo(/*unrestricted*/ double x, /*unrestricted*/ double y);
|
||||
void lineTo(double x, double y);
|
||||
void quadraticCurveTo(double cpx, double cpy, double x, double y);
|
||||
void moveTo(unrestricted double x, unrestricted double y);
|
||||
void lineTo(unrestricted double x, unrestricted double y);
|
||||
void quadraticCurveTo(unrestricted double cpx, unrestricted double cpy, unrestricted double x, unrestricted double y);
|
||||
|
||||
void bezierCurveTo(/*unrestricted*/ double cp1x,
|
||||
/*unrestricted*/ double cp1y,
|
||||
/*unrestricted*/ double cp2x,
|
||||
/*unrestricted*/ double cp2y,
|
||||
/*unrestricted*/ double x,
|
||||
/*unrestricted*/ double y);
|
||||
void bezierCurveTo(unrestricted double cp1x,
|
||||
unrestricted double cp1y,
|
||||
unrestricted double cp2x,
|
||||
unrestricted double cp2y,
|
||||
unrestricted double x,
|
||||
unrestricted double y);
|
||||
|
||||
//void arcTo(double x1, double y1, double x2, double y2, double radius);
|
||||
// NOT IMPLEMENTED [LenientFloat] void arcTo(double x1, double y1, double x2, double y2, double radiusX, double radiusY, double rotation);
|
||||
|
|
|
@ -14,7 +14,9 @@ dictionary TestDictionary {
|
|||
unsigned long unsignedLongValue;
|
||||
long long longLongValue;
|
||||
unsigned long long unsignedLongLongValue;
|
||||
unrestricted float unrestrictedFloatValue;
|
||||
float floatValue;
|
||||
unrestricted double unrestrictedDoubleValue;
|
||||
double doubleValue;
|
||||
DOMString stringValue;
|
||||
USVString usvstringValue;
|
||||
|
@ -33,7 +35,9 @@ dictionary TestDictionaryDefaults {
|
|||
unsigned long unsignedLongValue = 7;
|
||||
long long longLongValue = 7;
|
||||
unsigned long long unsignedLongLongValue = 7;
|
||||
// unrestricted float unrestrictedFloatValue = 7.0;
|
||||
// float floatValue = 7.0;
|
||||
// unrestricted double UnrestrictedDoubleValue = 7.0;
|
||||
// double doubleValue = 7.0;
|
||||
DOMString stringValue = "foo";
|
||||
USVString usvstringValue = "foo";
|
||||
|
@ -49,7 +53,9 @@ dictionary TestDictionaryDefaults {
|
|||
unsigned long? nullableUnsignedLongValue = 7;
|
||||
long long? nullableLongLongValue = 7;
|
||||
unsigned long long? nullableUnsignedLongLongValue = 7;
|
||||
// unrestricted float? nullableUnrestrictedFloatValue = 7.0;
|
||||
// float? nullableFloatValue = 7.0;
|
||||
// unrestricted double? nullableUnrestrictedDoubleValue = 7.0;
|
||||
// double? nullableDoubleValue = 7.0;
|
||||
DOMString? nullableStringValue = "foo";
|
||||
USVString? nullableUsvstringValue = "foo";
|
||||
|
@ -66,7 +72,9 @@ interface TestBinding {
|
|||
attribute unsigned long unsignedLongAttribute;
|
||||
attribute long long longLongAttribute;
|
||||
attribute unsigned long long unsignedLongLongAttribute;
|
||||
attribute unrestricted float unrestrictedFloatAttribute;
|
||||
attribute float floatAttribute;
|
||||
attribute unrestricted double unrestrictedDoubleAttribute;
|
||||
attribute double doubleAttribute;
|
||||
attribute DOMString stringAttribute;
|
||||
attribute USVString usvstringAttribute;
|
||||
|
@ -87,7 +95,9 @@ interface TestBinding {
|
|||
attribute unsigned long? unsignedLongAttributeNullable;
|
||||
attribute long long? longLongAttributeNullable;
|
||||
attribute unsigned long long? unsignedLongLongAttributeNullable;
|
||||
attribute unrestricted float? unrestrictedFloatAttributeNullable;
|
||||
attribute float? floatAttributeNullable;
|
||||
attribute unrestricted double? unrestrictedDoubleAttributeNullable;
|
||||
attribute double? doubleAttributeNullable;
|
||||
attribute DOMString? stringAttributeNullable;
|
||||
attribute USVString? usvstringAttributeNullable;
|
||||
|
@ -109,7 +119,9 @@ interface TestBinding {
|
|||
unsigned long receiveUnsignedLong();
|
||||
long long receiveLongLong();
|
||||
unsigned long long receiveUnsignedLongLong();
|
||||
unrestricted float receiveUnrestrictedFloat();
|
||||
float receiveFloat();
|
||||
unrestricted double receiveUnrestrictedDouble();
|
||||
double receiveDouble();
|
||||
DOMString receiveString();
|
||||
USVString receiveUsvstring();
|
||||
|
@ -129,7 +141,9 @@ interface TestBinding {
|
|||
unsigned long? receiveNullableUnsignedLong();
|
||||
long long? receiveNullableLongLong();
|
||||
unsigned long long? receiveNullableUnsignedLongLong();
|
||||
unrestricted float? receiveNullableUnrestrictedFloat();
|
||||
float? receiveNullableFloat();
|
||||
unrestricted double? receiveNullableUnrestrictedDouble();
|
||||
double? receiveNullableDouble();
|
||||
DOMString? receiveNullableString();
|
||||
USVString? receiveNullableUsvstring();
|
||||
|
@ -148,7 +162,9 @@ interface TestBinding {
|
|||
void passUnsignedLong(unsigned long arg);
|
||||
void passLongLong(long long arg);
|
||||
void passUnsignedLongLong(unsigned long long arg);
|
||||
void passUnrestrictedFloat(unrestricted float arg);
|
||||
void passFloat(float arg);
|
||||
void passUnrestrictedDouble(unrestricted double arg);
|
||||
void passDouble(double arg);
|
||||
void passString(DOMString arg);
|
||||
void passUsvstring(USVString arg);
|
||||
|
@ -171,7 +187,9 @@ interface TestBinding {
|
|||
void passNullableUnsignedLong(unsigned long? arg);
|
||||
void passNullableLongLong(long long? arg);
|
||||
void passNullableUnsignedLongLong(unsigned long long? arg);
|
||||
void passNullableUnrestrictedFloat(unrestricted float? arg);
|
||||
void passNullableFloat(float? arg);
|
||||
void passNullableUnrestrictedDouble(unrestricted double? arg);
|
||||
void passNullableDouble(double? arg);
|
||||
void passNullableString(DOMString? arg);
|
||||
void passNullableUsvstring(USVString? arg);
|
||||
|
@ -192,7 +210,9 @@ interface TestBinding {
|
|||
void passOptionalUnsignedLong(optional unsigned long arg);
|
||||
void passOptionalLongLong(optional long long arg);
|
||||
void passOptionalUnsignedLongLong(optional unsigned long long arg);
|
||||
void passOptionalUnrestrictedFloat(optional unrestricted float arg);
|
||||
void passOptionalFloat(optional float arg);
|
||||
void passOptionalUnrestrictedDouble(optional unrestricted double arg);
|
||||
void passOptionalDouble(optional double arg);
|
||||
void passOptionalString(optional DOMString arg);
|
||||
void passOptionalUsvstring(optional USVString arg);
|
||||
|
@ -214,7 +234,9 @@ interface TestBinding {
|
|||
void passOptionalNullableUnsignedLong(optional unsigned long? arg);
|
||||
void passOptionalNullableLongLong(optional long long? arg);
|
||||
void passOptionalNullableUnsignedLongLong(optional unsigned long long? arg);
|
||||
void passOptionalNullableUnrestrictedFloat(optional unrestricted float? arg);
|
||||
void passOptionalNullableFloat(optional float? arg);
|
||||
void passOptionalNullableUnrestrictedDouble(optional unrestricted double? arg);
|
||||
void passOptionalNullableDouble(optional double? arg);
|
||||
void passOptionalNullableString(optional DOMString? arg);
|
||||
void passOptionalNullableUsvstring(optional USVString? arg);
|
||||
|
@ -270,7 +292,9 @@ interface TestBinding {
|
|||
void passOptionalNullableUnsignedLongWithNonNullDefault(optional unsigned long? arg = 7);
|
||||
void passOptionalNullableLongLongWithNonNullDefault(optional long long? arg = 7);
|
||||
void passOptionalNullableUnsignedLongLongWithNonNullDefault(optional unsigned long long? arg = 7);
|
||||
// void passOptionalNullableUnrestrictedFloatWithNonNullDefault(optional unrestricted float? arg = 0.0);
|
||||
// void passOptionalNullableFloatWithNonNullDefault(optional float? arg = 0.0);
|
||||
// void passOptionalNullableUnrestrictedDoubleWithNonNullDefault(optional unrestricted double? arg = 0.0);
|
||||
// void passOptionalNullableDoubleWithNonNullDefault(optional double? arg = 0.0);
|
||||
void passOptionalNullableStringWithNonNullDefault(optional DOMString? arg = "x");
|
||||
void passOptionalNullableUsvstringWithNonNullDefault(optional USVString? arg = "x");
|
||||
|
@ -287,7 +311,9 @@ interface TestBinding {
|
|||
void passVariadicUnsignedLong(unsigned long... args);
|
||||
void passVariadicLongLong(long long... args);
|
||||
void passVariadicUnsignedLongLong(unsigned long long... args);
|
||||
void passVariadicUnrestrictedFloat(unrestricted float... args);
|
||||
void passVariadicFloat(float... args);
|
||||
void passVariadicUnrestrictedDouble(unrestricted double... args);
|
||||
void passVariadicDouble(double... args);
|
||||
void passVariadicString(DOMString... args);
|
||||
void passVariadicUsvstring(USVString... args);
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
[2d.clearRect.nonfinite.html]
|
||||
type: testharness
|
||||
[clearRect() with Infinity/NaN is ignored]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.path.bezierCurveTo.nonfinite.html]
|
||||
type: testharness
|
||||
[bezierCurveTo() with Infinity/NaN is ignored]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.path.lineTo.nonfinite.html]
|
||||
type: testharness
|
||||
[lineTo() with Infinity/NaN is ignored]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.path.moveTo.nonfinite.html]
|
||||
type: testharness
|
||||
[moveTo() with Infinity/NaN is ignored]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.path.quadraticCurveTo.nonfinite.html]
|
||||
type: testharness
|
||||
[quadraticCurveTo() with Infinity/NaN is ignored]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.imageData.get.nonfinite.html]
|
||||
type: testharness
|
||||
[getImageData() throws TypeError if arguments are not finite]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.imageData.put.nonfinite.html]
|
||||
type: testharness
|
||||
[putImageData() throws TypeError if arguments are not finite]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.transformation.scale.nonfinite.html]
|
||||
type: testharness
|
||||
[scale() with Infinity/NaN is ignored]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.transformation.setTransform.nonfinite.html]
|
||||
type: testharness
|
||||
[setTransform() with Infinity/NaN is ignored]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.transformation.transform.nonfinite.html]
|
||||
type: testharness
|
||||
[transform() with Infinity/NaN is ignored]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.transformation.translate.nonfinite.html]
|
||||
type: testharness
|
||||
[translate() with Infinity/NaN is ignored]
|
||||
expected: FAIL
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue