aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/script/dom/bindings/codegen/Bindings.conf4
-rw-r--r--src/components/script/dom/bindings/codegen/CodegenRust.py12
-rw-r--r--src/components/script/dom/bindings/codegen/DOMParser.webidl1
-rw-r--r--src/components/script/dom/bindings/codegen/Document.webidl337
-rw-r--r--src/components/script/dom/bindings/conversions.rs16
-rw-r--r--src/components/script/dom/bindings/document.rs196
-rw-r--r--src/components/script/dom/bindings/utils.rs2
-rw-r--r--src/components/script/dom/document.rs227
-rw-r--r--src/components/script/dom/node.rs1
-rw-r--r--src/components/script/script.rc2
10 files changed, 581 insertions, 217 deletions
diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf
index 8b65ab72a24..4d346afd9a7 100644
--- a/src/components/script/dom/bindings/codegen/Bindings.conf
+++ b/src/components/script/dom/bindings/codegen/Bindings.conf
@@ -134,6 +134,9 @@ DOMInterfaces = {
'prefable': True
},
+'Document': {
+},
+
'DOMParser': {
'nativeType': 'DOMParser',
},
@@ -521,7 +524,6 @@ addExternalIface('CanvasGradient', headerFile='nsIDOMCanvasRenderingContext2D.h'
addExternalIface('CanvasPattern', headerFile='nsIDOMCanvasRenderingContext2D.h')
addExternalIface('CSSRule')
addExternalIface('CSSValue')
-addExternalIface('Document', nativeType='Document', pointerType='@mut ')
addExternalIface('DOMStringList', nativeType='nsDOMStringList',
headerFile='nsDOMLists.h')
addExternalIface('Element', nativeType='AbstractNode<ScriptView>', pointerType='')
diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py
index f0c1f4def92..f20a4de0729 100644
--- a/src/components/script/dom/bindings/codegen/CodegenRust.py
+++ b/src/components/script/dom/bindings/codegen/CodegenRust.py
@@ -1573,15 +1573,15 @@ for (uint32_t i = 0; i < length; ++i) {
if type.nullable():
raise TypeError("We don't support nullable enumerated return types "
"yet")
- return ("""MOZ_ASSERT(uint32_t(%(result)s) < ArrayLength(%(strings)s));
-JSString* %(resultStr)s = JS_NewStringCopyN(cx, %(strings)s[uint32_t(%(result)s)].value, %(strings)s[uint32_t(%(result)s)].length);
-if (!%(resultStr)s) {
- return false;
+ return ("""assert!((%(result)s as uint) < %(strings)s.len());
+let %(resultStr)s: *JSString = JS_NewStringCopyN(cx, ptr::to_unsafe_ptr(&%(strings)s[%(result)s as u32].value[0]) as *i8, %(strings)s[%(result)s as u32].length as u64);
+if %(resultStr)s.is_null() {
+ return 0;
}
""" % { "result" : result,
"resultStr" : result + "_str",
"strings" : type.inner.identifier.name + "Values::strings" } +
- setValue("JS::StringValue(%s_str)" % result), False)
+ setValue("RUST_STRING_TO_JSVAL(%s_str)" % result), False)
if type.isCallback():
assert not type.isInterface()
@@ -2924,7 +2924,7 @@ class CGCallGenerator(CGThing):
call = CGList([call, CGWrapper(args, pre="(", post=");")])
if result is not None:
if declareResult:
- result = CGWrapper(result, pre="let result: ", post=";")
+ result = CGWrapper(result, pre="let mut result: ", post=";")
self.cgRoot.prepend(result)
if not resultOutParam:
call = CGWrapper(call, pre="result = ")
diff --git a/src/components/script/dom/bindings/codegen/DOMParser.webidl b/src/components/script/dom/bindings/codegen/DOMParser.webidl
index 435cd8dda92..2bfbd43a28b 100644
--- a/src/components/script/dom/bindings/codegen/DOMParser.webidl
+++ b/src/components/script/dom/bindings/codegen/DOMParser.webidl
@@ -9,7 +9,6 @@
/*interface Principal;
interface URI;
interface InputStream;*/
-interface Document;
enum SupportedType {
"text/html",
diff --git a/src/components/script/dom/bindings/codegen/Document.webidl b/src/components/script/dom/bindings/codegen/Document.webidl
new file mode 100644
index 00000000000..2e61ae1a27e
--- /dev/null
+++ b/src/components/script/dom/bindings/codegen/Document.webidl
@@ -0,0 +1,337 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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 origin of this IDL file is:
+ * http://dom.spec.whatwg.org/#interface-document
+ * http://www.whatwg.org/specs/web-apps/current-work/#the-document-object
+ * http://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#api
+ * http://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#extensions-to-the-document-interface
+ * http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#sec-document-interface
+ * http://dev.w3.org/csswg/cssom/#extensions-to-the-document-interface
+ * http://dev.w3.org/csswg/cssom-view/#extensions-to-the-document-interface
+ *
+ * http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/core/nsIDOMDocument.idl
+ */
+
+/*interface StyleSheetList;
+interface WindowProxy;
+interface nsISupports;
+interface URI;*/
+
+enum VisibilityState { "hidden", "visible" };
+
+/* http://dom.spec.whatwg.org/#interface-document */
+[Constructor]
+interface Document /*: Node*/ { //XXXjdm Requires servo/#623
+ /*[Throws]
+ readonly attribute DOMImplementation implementation;*/
+ readonly attribute DOMString URL;
+ readonly attribute DOMString documentURI;
+ readonly attribute DOMString compatMode;
+ readonly attribute DOMString characterSet;
+ readonly attribute DOMString contentType;
+
+ //readonly attribute DocumentType? doctype;
+ readonly attribute Element? documentElement;
+ HTMLCollection getElementsByTagName(DOMString localName);
+ HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
+ HTMLCollection getElementsByClassName(DOMString classNames);
+ Element? getElementById(DOMString elementId);
+
+ [Creator, Throws]
+ Element createElement(DOMString localName);
+ [Creator, Throws]
+ Element createElementNS(DOMString? namespace, DOMString qualifiedName);
+ /*[Creator]
+ DocumentFragment createDocumentFragment();
+ [Creator]
+ Text createTextNode(DOMString data);
+ [Creator]
+ Comment createComment(DOMString data);
+ [Creator, Throws]
+ ProcessingInstruction createProcessingInstruction(DOMString target, DOMString data);*/
+
+ /*[Throws]
+ Node importNode(Node node, optional boolean deep = true);
+ [Throws]
+ Node adoptNode(Node node);*/
+
+ [Creator, Throws]
+ Event createEvent(DOMString interface_);
+
+ /*[Creator, Throws]
+ Range createRange();*/
+
+ // NodeFilter.SHOW_ALL = 0xFFFFFFFF
+ /*[Creator, Throws]
+ NodeIterator createNodeIterator(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
+ [Creator, Throws]
+ TreeWalker createTreeWalker(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);*/
+
+ // NEW
+ // No support for prepend/append yet
+ // void prepend((Node or DOMString)... nodes);
+ // void append((Node or DOMString)... nodes);
+
+ // These are not in the spec, but leave them for now for backwards compat.
+ // So sort of like Gecko extensions
+ /*[Creator, Throws]
+ CDATASection createCDATASection(DOMString data);
+ [Creator, Throws]
+ Attr createAttribute(DOMString name);
+ [Creator, Throws]
+ Attr createAttributeNS(DOMString? namespace, DOMString name);*/
+ readonly attribute DOMString? inputEncoding;
+};
+
+// http://www.whatwg.org/specs/web-apps/current-work/#the-document-object
+partial interface Document {
+ //[PutForwards=href, Unforgeable] readonly attribute Location? location;
+ //(HTML only) attribute DOMString domain;
+ readonly attribute DOMString referrer;
+ //(HTML only) attribute DOMString cookie;
+ readonly attribute DOMString lastModified;
+ readonly attribute DOMString readyState;
+
+ // DOM tree accessors
+ //(Not proxy yet)getter object (DOMString name);
+ [SetterThrows]
+ attribute DOMString title;
+ attribute DOMString dir;
+ //(HTML only) attribute HTMLElement? body;
+ //(HTML only)readonly attribute HTMLHeadElement? head;
+ //(HTML only)readonly attribute HTMLCollection images;
+ //(HTML only)readonly attribute HTMLCollection embeds;
+ //(HTML only)readonly attribute HTMLCollection plugins;
+ //(HTML only)readonly attribute HTMLCollection links;
+ //(HTML only)readonly attribute HTMLCollection forms;
+ //(HTML only)readonly attribute HTMLCollection scripts;
+ /*NodeList*/ HTMLCollection getElementsByName(DOMString elementName); ////(HTML only)
+ //(HTML only)NodeList getItems(optional DOMString typeNames); // microdata
+ //(Not implemented)readonly attribute DOMElementMap cssElementMap;
+
+ // dynamic markup insertion
+ //(HTML only)Document open(optional DOMString type, optional DOMString replace);
+ //(HTML only)WindowProxy open(DOMString url, DOMString name, DOMString features, optional boolean replace);
+ //(HTML only)void close();
+ //(HTML only)void write(DOMString... text);
+ //(HTML only)void writeln(DOMString... text);
+
+ // user interaction
+ readonly attribute WindowProxy? defaultView;
+ readonly attribute Element? activeElement;
+ [Throws]
+ boolean hasFocus();
+ //(HTML only) attribute DOMString designMode;
+ //(HTML only)boolean execCommand(DOMString commandId);
+ //(HTML only)boolean execCommand(DOMString commandId, boolean showUI);
+ //(HTML only)boolean execCommand(DOMString commandId, boolean showUI, DOMString value);
+ //(HTML only)boolean queryCommandEnabled(DOMString commandId);
+ //(HTML only)boolean queryCommandIndeterm(DOMString commandId);
+ //(HTML only)boolean queryCommandState(DOMString commandId);
+ //(HTML only)boolean queryCommandSupported(DOMString commandId);
+ //(HTML only)DOMString queryCommandValue(DOMString commandId);
+ //(Not implemented)readonly attribute HTMLCollection commands;
+
+ // special event handler IDL attributes that only apply to Document objects
+ //[LenientThis, SetterThrows] attribute EventHandler onreadystatechange;
+
+ // Gecko extensions?
+ /*[LenientThis, SetterThrows] attribute EventHandler onmouseenter;
+ [LenientThis, SetterThrows] attribute EventHandler onmouseleave;
+ [SetterThrows] attribute EventHandler onwheel;
+ [SetterThrows] attribute EventHandler oncopy;
+ [SetterThrows] attribute EventHandler oncut;
+ [SetterThrows] attribute EventHandler onpaste;
+ [SetterThrows] attribute EventHandler onbeforescriptexecute;
+ [SetterThrows] attribute EventHandler onafterscriptexecute;*/
+ /**
+ * True if this document is synthetic : stand alone image, video, audio file,
+ * etc.
+ */
+ //[ChromeOnly] readonly attribute boolean mozSyntheticDocument;
+ /**
+ * Returns the script element whose script is currently being processed.
+ *
+ * @see <https://developer.mozilla.org/en/DOM/document.currentScript>
+ */
+ readonly attribute Element? currentScript;
+ /**
+ * Release the current mouse capture if it is on an element within this
+ * document.
+ *
+ * @see <https://developer.mozilla.org/en/DOM/document.releaseCapture>
+ */
+ void releaseCapture();
+ /**
+ * Use the given DOM element as the source image of target |-moz-element()|.
+ *
+ * This function introduces a new special ID (called "image element ID"),
+ * which is only used by |-moz-element()|, and associates it with the given
+ * DOM element. Image elements ID's have the higher precedence than general
+ * HTML id's, so if |document.mozSetImageElement(<id>, <element>)| is called,
+ * |-moz-element(#<id>)| uses |<element>| as the source image even if there
+ * is another element with id attribute = |<id>|. To unregister an image
+ * element ID |<id>|, call |document.mozSetImageElement(<id>, null)|.
+ *
+ * Example:
+ * <script>
+ * canvas = document.createElement("canvas");
+ * canvas.setAttribute("width", 100);
+ * canvas.setAttribute("height", 100);
+ * // draw to canvas
+ * document.mozSetImageElement("canvasbg", canvas);
+ * </script>
+ * <div style="background-image: -moz-element(#canvasbg);"></div>
+ *
+ * @param aImageElementId an image element ID to associate with
+ * |aImageElement|
+ * @param aImageElement a DOM element to be used as the source image of
+ * |-moz-element(#aImageElementId)|. If this is null, the function will
+ * unregister the image element ID |aImageElementId|.
+ *
+ * @see <https://developer.mozilla.org/en/DOM/document.mozSetImageElement>
+ */
+ /*void mozSetImageElement(DOMString aImageElementId,
+ Element? aImageElement);*/
+
+ /*[ChromeOnly]
+ readonly attribute URI? documentURIObject;*/
+
+};
+
+// http://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#api
+partial interface Document {
+ // Note: Per spec the 'S' in these two is lowercase, but the "Moz"
+ // versions hve it uppercase.
+ readonly attribute boolean mozFullScreenEnabled;
+ [Throws]
+ readonly attribute Element? mozFullScreenElement;
+
+ //(Renamed?)void exitFullscreen();
+
+ // Gecko-specific fullscreen bits
+ /*readonly attribute boolean mozFullScreen;
+ void mozCancelFullScreen();*/
+};
+
+// http://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#extensions-to-the-document-interface
+partial interface Document {
+ readonly attribute Element? mozPointerLockElement;
+ void mozExitPointerLock ();
+};
+
+//http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-document-register
+/*partial interface Document {
+ [Throws, Pref="dom.webcomponents.enabled"]
+ object register(DOMString name, optional ElementRegistrationOptions options);
+ };*/
+
+// http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#sec-document-interface
+partial interface Document {
+ readonly attribute boolean hidden;
+ readonly attribute boolean mozHidden;
+ readonly attribute VisibilityState visibilityState;
+ readonly attribute VisibilityState mozVisibilityState;
+};
+
+// http://dev.w3.org/csswg/cssom/#extensions-to-the-document-interface
+partial interface Document {
+ /*[Constant]
+ readonly attribute StyleSheetList styleSheets;*/
+ attribute DOMString? selectedStyleSheetSet;
+ readonly attribute DOMString? lastStyleSheetSet;
+ readonly attribute DOMString? preferredStyleSheetSet;
+ /*[Constant]
+ readonly attribute DOMStringList styleSheetSets;*/
+ void enableStyleSheetsForSet (DOMString? name);
+};
+
+// http://dev.w3.org/csswg/cssom-view/#extensions-to-the-document-interface
+partial interface Document {
+ Element? elementFromPoint (float x, float y);
+
+ //CaretPosition? caretPositionFromPoint (float x, float y);
+};
+
+// http://dvcs.w3.org/hg/undomanager/raw-file/tip/undomanager.html
+/*partial interface Document {
+ [Pref="dom.undo_manager.enabled"]
+ readonly attribute UndoManager? undoManager;
+ };*/
+
+// http://dev.w3.org/2006/webapi/selectors-api2/#interface-definitions
+partial interface Document {
+ [Throws]
+ Element? querySelector(DOMString selectors);
+ /*[Throws]
+ NodeList querySelectorAll(DOMString selectors);*/
+
+ //(Not implemented)Element? find(DOMString selectors, optional (Element or sequence<Node>)? refNodes);
+ //(Not implemented)NodeList findAll(DOMString selectors, optional (Element or sequence<Node>)? refNodes);
+};
+
+// Mozilla extensions of various sorts
+/*partial interface Document {
+ // nsIDOMDocumentXBL. Wish we could make these [ChromeOnly], but
+ // that would likely break bindings running with the page principal.
+ NodeList? getAnonymousNodes(Element elt);
+ Element? getAnonymousElementByAttribute(Element elt, DOMString attrName,
+ DOMString attrValue);
+ Element? getBindingParent(Node node);
+ [Throws]
+ void loadBindingDocument(DOMString documentURL);
+
+ // nsIDOMDocumentTouch
+ // XXXbz I can't find the sane spec for this stuff, so just cribbing
+ // from our xpidl for now.
+ [Creator, Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ Touch createTouch(optional Window? view = null,
+ optional EventTarget? target = null,
+ optional long identifier = 0,
+ optional long pageX = 0,
+ optional long pageY = 0,
+ optional long screenX = 0,
+ optional long screenY = 0,
+ optional long clientX = 0,
+ optional long clientY = 0,
+ optional long radiusX = 0,
+ optional long radiusY = 0,
+ optional float rotationAngle = 0,
+ optional float force = 0);
+ // XXXbz a hack to get around the fact that we don't support variadics as
+ // distinguishing arguments yet. Once this hack is removed. we can also
+ // remove the corresponding overload on nsIDocument, since Touch... and
+ // sequence<Touch> look the same in the C++.
+ [Creator, Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ TouchList createTouchList(Touch touch, Touch... touches);
+ // XXXbz and another hack for the fact that we can't usefully have optional
+ // distinguishing arguments but need a working zero-arg form of
+ // createTouchList().
+ [Creator, Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ TouchList createTouchList();
+ [Creator, Func="nsGenericHTMLElement::TouchEventsEnabled"]
+ TouchList createTouchList(sequence<Touch> touches);
+
+ [ChromeOnly]
+ attribute boolean styleSheetChangeEventsEnabled;
+
+ [ChromeOnly, Throws]
+ void obsoleteSheet(URI sheetURI);
+ [ChromeOnly, Throws]
+ void obsoleteSheet(DOMString sheetURI);
+};
+
+// Extension to give chrome JS the ability to determine when a document was
+// created to satisfy an iframe with srcdoc attribute.
+partial interface Document {
+ [ChromeOnly] readonly attribute boolean isSrcdocDocument;
+};
+
+Document implements XPathEvaluator;
+Document implements GlobalEventHandlers;
+Document implements NodeEventHandlers;
+Document implements TouchEventHandlers;
+Document implements ParentNode;*/
diff --git a/src/components/script/dom/bindings/conversions.rs b/src/components/script/dom/bindings/conversions.rs
index 0092ea66bff..14c9f3b5949 100644
--- a/src/components/script/dom/bindings/conversions.rs
+++ b/src/components/script/dom/bindings/conversions.rs
@@ -4,7 +4,7 @@
use js::jsapi::JSVal;
use js::{JSVAL_FALSE, JSVAL_TRUE};
-use js::glue::{RUST_UINT_TO_JSVAL, RUST_JSVAL_TO_INT};
+use js::glue::{RUST_UINT_TO_JSVAL, RUST_JSVAL_TO_INT, RUST_DOUBLE_TO_JSVAL, RUST_JSVAL_TO_DOUBLE};
pub trait JSValConvertible {
fn to_jsval(&self) -> JSVal;
@@ -71,4 +71,18 @@ impl JSValConvertible for bool {
None
}
}
+}
+
+impl JSValConvertible for f32 {
+ fn to_jsval(&self) -> JSVal {
+ unsafe {
+ RUST_DOUBLE_TO_JSVAL(*self as f64)
+ }
+ }
+
+ fn from_jsval(val: JSVal) -> Option<f32> {
+ unsafe {
+ Some(RUST_JSVAL_TO_DOUBLE(val) as f32)
+ }
+ }
} \ No newline at end of file
diff --git a/src/components/script/dom/bindings/document.rs b/src/components/script/dom/bindings/document.rs
deleted file mode 100644
index db966ce5739..00000000000
--- a/src/components/script/dom/bindings/document.rs
+++ /dev/null
@@ -1,196 +0,0 @@
-/* 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/. */
-
-use std::cast;
-use std::libc;
-use std::ptr;
-use std::result;
-use dom::bindings::utils::{DOMString, rust_box, squirrel_away, str};
-use dom::bindings::utils::{WrapperCache, DerivedWrapper};
-use dom::bindings::utils::{jsval_to_str, WrapNewBindingObject, CacheableWrapper};
-use dom::bindings::utils;
-use dom::document::Document;
-use dom::htmlcollection::HTMLCollection;
-use js::glue::*;
-use js::glue::{PROPERTY_STUB, STRICT_PROPERTY_STUB};
-use js::jsapi::{JS_DefineProperties};
-use js::jsapi::{JS_GetReservedSlot, JS_SetReservedSlot, JS_DefineFunctions};
-use js::jsapi::{JSContext, JSVal, JSObject, JSBool, JSFreeOp, JSPropertySpec, JSPropertyOpWrapper};
-use js::jsapi::{JSStrictPropertyOpWrapper, JSNativeWrapper, JSFunctionSpec};
-use js::rust::{Compartment, jsobj};
-use js::{JSPROP_NATIVE_ACCESSORS};
-use js::{JS_ARGV, JSPROP_ENUMERATE, JSPROP_SHARED, JSVAL_NULL, JS_THIS_OBJECT, JS_SET_RVAL};
-use script_task::task_from_context;
-
-use std::libc::c_uint;
-use std::ptr::null;
-
-extern fn getDocumentElement(cx: *JSContext, _argc: c_uint, vp: *mut JSVal) -> JSBool {
- unsafe {
- let obj = JS_THIS_OBJECT(cx, cast::transmute(vp));
- if obj.is_null() {
- return 0;
- }
-
- let doc = &mut (*unwrap(obj)).payload;
- let root = &mut doc.root;
- assert!(root.is_element());
- root.wrap(cx, ptr::null(), vp); //XXXjdm proper scope at some point
- return 1;
- }
-}
-
-extern fn getElementsByTagName(cx: *JSContext, _argc: c_uint, vp: *JSVal) -> JSBool {
- unsafe {
- let obj = JS_THIS_OBJECT(cx, vp);
-
- let argv = JS_ARGV(cx, cast::transmute(vp));
-
- let arg0: DOMString;
- let strval = jsval_to_str(cx, (*argv.offset(0)));
- if strval.is_err() {
- return 0;
- }
- arg0 = str(strval.get());
-
- let doc = &mut (*unwrap(obj)).payload;
- let rval: Option<@mut HTMLCollection>;
- rval = doc.getElementsByTagName(arg0);
- if rval.is_none() {
- JS_SET_RVAL(cx, vp, JSVAL_NULL);
- } else {
- let cache = doc.get_wrappercache();
- let rval = rval.get() as @mut CacheableWrapper;
- assert!(WrapNewBindingObject(cx, cache.get_wrapper(),
- rval,
- cast::transmute(vp)));
- }
- return 1;
- }
-}
-
-extern fn getElementsByName(cx: *JSContext, _argc: c_uint, vp: *JSVal) -> JSBool {
- unsafe {
- let obj = JS_THIS_OBJECT(cx, vp);
-
- let argv = JS_ARGV(cx, cast::transmute(vp));
-
- let arg0: DOMString;
- let strval = jsval_to_str(cx, (*argv.offset(0)));
- if strval.is_err() {
- return 0;
- }
- arg0 = str(strval.get());
-
- let doc = &mut (*unwrap(obj)).payload;
- let rval: Option<@mut HTMLCollection>;
- rval = doc.getElementsByName(arg0);
- if rval.is_none() {
- JS_SET_RVAL(cx, vp, JSVAL_NULL);
- } else {
- let cache = doc.get_wrappercache();
- let rval = rval.get() as @mut CacheableWrapper;
- assert!(WrapNewBindingObject(cx, cache.get_wrapper(),
- rval,
- cast::transmute(vp)));
- }
- return 1;
- }
-}
-
-unsafe fn unwrap(obj: *JSObject) -> *mut rust_box<Document> {
- //TODO: some kind of check if this is a Document object
- let val = JS_GetReservedSlot(obj, 0);
- RUST_JSVAL_TO_PRIVATE(val) as *mut rust_box<Document>
-}
-
-extern fn finalize(_fop: *JSFreeOp, obj: *JSObject) {
- debug!("document finalize!");
- unsafe {
- let val = JS_GetReservedSlot(obj, 0);
- let _doc: @Document = cast::transmute(RUST_JSVAL_TO_PRIVATE(val));
- }
-}
-
-pub fn init(compartment: @mut Compartment) {
- let obj = utils::define_empty_prototype(~"Document", None, compartment);
-
- let attrs = @~[
- JSPropertySpec {
- name: compartment.add_name(~"documentElement"),
- tinyid: 0,
- flags: (JSPROP_SHARED | JSPROP_ENUMERATE | JSPROP_NATIVE_ACCESSORS) as u8,
- getter: JSPropertyOpWrapper {op: getDocumentElement, info: null()},
- setter: JSStrictPropertyOpWrapper {op: null(), info: null()}},
- JSPropertySpec {
- name: null(),
- tinyid: 0,
- flags: (JSPROP_SHARED | JSPROP_ENUMERATE | JSPROP_NATIVE_ACCESSORS) as u8,
- getter: JSPropertyOpWrapper {op: null(), info: null()},
- setter: JSStrictPropertyOpWrapper {op: null(), info: null()}}];
- compartment.global_props.push(attrs);
- do attrs.as_imm_buf |specs, _len| {
- unsafe {
- assert!(JS_DefineProperties(compartment.cx.ptr, obj.ptr, specs) == 1);
- }
- }
-
- let methods = @~[JSFunctionSpec {name: compartment.add_name(~"getElementsByTagName"),
- call: JSNativeWrapper {op: getElementsByTagName, info: null()},
- nargs: 0,
- flags: 0,
- selfHostedName: null()},
- JSFunctionSpec {name: compartment.add_name(~"getElementsByName"),
- call: JSNativeWrapper {op: getElementsByName, info: null()},
- nargs: 0,
- flags: 0,
- selfHostedName: null()},
- JSFunctionSpec {name: null(),
- call: JSNativeWrapper {op: null(), info: null()},
- nargs: 0,
- flags: 0,
- selfHostedName: null()}];
- do methods.as_imm_buf |fns, _len| {
- unsafe {
- JS_DefineFunctions(compartment.cx.ptr, obj.ptr, fns);
- }
- }
-
- compartment.register_class(utils::instance_jsclass(~"DocumentInstance",
- finalize,
- ptr::null()));
-}
-
-pub fn create(compartment: @mut Compartment, doc: @mut Document) -> *JSObject {
- let instance : jsobj = result::unwrap(
- compartment.new_object_with_proto(~"DocumentInstance", ~"Document",
- compartment.global_obj.ptr));
- doc.wrapper.set_wrapper(instance.ptr);
-
- unsafe {
- let raw_ptr: *libc::c_void = cast::transmute(squirrel_away(doc));
- JS_SetReservedSlot(instance.ptr, 0, RUST_PRIVATE_TO_JSVAL(raw_ptr));
-
- compartment.define_property(~"document", RUST_OBJECT_TO_JSVAL(instance.ptr),
- GetJSClassHookStubPointer(PROPERTY_STUB) as *u8,
- GetJSClassHookStubPointer(STRICT_PROPERTY_STUB) as *u8,
- JSPROP_ENUMERATE);
- }
-
- instance.ptr
-}
-
-impl CacheableWrapper for Document {
- fn get_wrappercache(&mut self) -> &mut WrapperCache {
- unsafe { cast::transmute(&self.wrapper) }
- }
-
- fn wrap_object_shared(@mut self, cx: *JSContext, _scope: *JSObject) -> *JSObject {
- let script_context = task_from_context(cx);
- unsafe {
- create((*script_context).js_compartment, self)
- }
- }
-}
-
diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs
index f2dcf3471dd..67419b26dfc 100644
--- a/src/components/script/dom/bindings/utils.rs
+++ b/src/components/script/dom/bindings/utils.rs
@@ -615,7 +615,7 @@ pub extern fn ThrowingConstructor(_cx: *JSContext, _argc: uint, _vp: *JSVal) ->
}
pub fn initialize_global(global: *JSObject) {
- let protoArray = @mut ([0 as *JSObject, ..22]); //XXXjdm PrototyepList::id::_ID_Count
+ let protoArray = @mut ([0 as *JSObject, ..23]); //XXXjdm PrototyepList::id::_ID_Count
unsafe {
//XXXjdm we should be storing the box pointer instead of the inner
let box = squirrel_away(protoArray);
diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs
index 15e52846aec..f497e533fba 100644
--- a/src/components/script/dom/document.rs
+++ b/src/components/script/dom/document.rs
@@ -2,16 +2,26 @@
* 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/. */
-use dom::bindings::document;
-use dom::bindings::utils::{DOMString, WrapperCache};
+use dom::bindings::codegen::DocumentBinding;
+use dom::bindings::codegen::DocumentBinding::VisibilityState;
+use dom::bindings::codegen::DocumentBinding::VisibilityStateValues::Visible;
+use dom::bindings::utils::{DOMString, WrapperCache, ErrorResult, null_string};
+use dom::bindings::utils::{BindingObject, CacheableWrapper};
+use dom::element::{HTMLHtmlElement, HTMLHtmlElementTypeId, Element};
+use dom::event::Event_;
use dom::htmlcollection::HTMLCollection;
-use dom::node::{AbstractNode, ScriptView};
+use dom::node::{AbstractNode, ScriptView, Node};
use dom::window::Window;
+use dom::windowproxy::WindowProxy;
use script_task::global_script_context;
-use js::jsapi::{JS_AddObjectRoot, JS_RemoveObjectRoot};
+use js::JSPROP_ENUMERATE;
+use js::glue::*;
+use js::jsapi::{JS_AddObjectRoot, JS_RemoveObjectRoot, JSObject, JSContext};
use servo_util::tree::{TreeNodeRef, TreeUtils};
+use std::cast;
+use std::ptr;
use std::str::eq_slice;
pub struct Document {
@@ -33,13 +43,81 @@ pub fn Document(root: AbstractNode<ScriptView>, window: Option<@mut Window>) ->
let rootable = base.wrapper.get_rootable();
JS_AddObjectRoot(compartment.cx.ptr, rootable);
}
- document::create(compartment, doc);
+
+ let cx = global_script_context().js_compartment.cx.ptr;
+ doc.wrap_object_shared(cx, ptr::null()); //XXXjdm a proper scope would be nice
+
+ match window {
+ Some(win) => {
+ //FIXME: This is a hack until Window is autogenerated
+ let compartment = (*win.script_task).js_compartment;
+ compartment.define_property(~"document",
+ RUST_OBJECT_TO_JSVAL(doc.wrapper.wrapper),
+ GetJSClassHookStubPointer(PROPERTY_STUB) as *u8,
+ GetJSClassHookStubPointer(STRICT_PROPERTY_STUB) as *u8,
+ JSPROP_ENUMERATE);
+ }
+ None => ()
+ }
doc
}
}
+impl CacheableWrapper for Document {
+ fn get_wrappercache(&mut self) -> &mut WrapperCache {
+ unsafe { cast::transmute(&self.wrapper) }
+ }
+
+ fn wrap_object_shared(@mut self, cx: *JSContext, scope: *JSObject) -> *JSObject {
+ let mut unused = false;
+ DocumentBinding::Wrap(cx, scope, self, &mut unused)
+ }
+}
+
+impl BindingObject for Document {
+ fn GetParentObject(&self, _cx: *JSContext) -> @mut CacheableWrapper {
+ match self.window {
+ Some(win) => win as @mut CacheableWrapper,
+ None => fail!("whoops")
+ }
+ }
+}
+
impl Document {
- pub fn getElementsByTagName(&self, tag: DOMString) -> Option<@mut HTMLCollection> {
+ pub fn Constructor(_owner: @mut Window, _rv: &mut ErrorResult) -> @mut Document {
+ let root = ~HTMLHtmlElement {
+ parent: Element::new(HTMLHtmlElementTypeId, ~"html")
+ };
+
+ let root = unsafe { Node::as_abstract_node(root) };
+ Document(root, None)
+ }
+
+ pub fn URL(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn DocumentURI(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn CompatMode(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn CharacterSet(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn ContentType(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn GetDocumentElement(&self) -> Option<AbstractNode<ScriptView>> {
+ Some(self.root)
+ }
+
+ pub fn GetElementsByTagName(&self, tag: DOMString) -> @mut HTMLCollection {
let mut elements = ~[];
let tag = tag.to_str();
let _ = for self.root.traverse_preorder |child| {
@@ -51,10 +129,141 @@ impl Document {
}
}
};
- Some(HTMLCollection::new(elements))
+ HTMLCollection::new(elements)
+ }
+
+ pub fn GetElementsByTagNameNS(&self, _ns: DOMString, _tag: DOMString) -> @mut HTMLCollection {
+ HTMLCollection::new(~[])
+ }
+
+ pub fn GetElementsByClassName(&self, _class: DOMString) -> @mut HTMLCollection {
+ HTMLCollection::new(~[])
+
+ }
+
+ pub fn GetElementById(&self, _id: DOMString) -> Option<AbstractNode<ScriptView>> {
+ None
+ }
+
+ pub fn CreateElement(&self, _local_name: DOMString, _rv: &mut ErrorResult) -> AbstractNode<ScriptView> {
+ fail!("stub")
+ }
+
+ pub fn CreateElementNS(&self, _namespace: DOMString, _qualified_name: DOMString, _rv: &mut ErrorResult) -> AbstractNode<ScriptView> {
+ fail!("stub")
+ }
+
+ pub fn CreateEvent(&self, _interface: DOMString, _rv: &mut ErrorResult) -> @mut Event_ {
+ fail!("stub")
+ }
+
+ pub fn GetInputEncoding(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn Referrer(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn LastModified(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn ReadyState(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn Title(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn SetTitle(&self, _title: DOMString, _rv: &mut ErrorResult) {
+ }
+
+ pub fn Dir(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn SetDir(&self, _dir: DOMString) {
+ }
+
+ pub fn GetDefaultView(&self) -> Option<@mut WindowProxy> {
+ None
+ }
+
+ pub fn GetActiveElement(&self) -> Option<AbstractNode<ScriptView>> {
+ None
+ }
+
+ pub fn HasFocus(&self, _rv: &mut ErrorResult) -> bool {
+ false
+ }
+
+ pub fn GetCurrentScript(&self) -> Option<AbstractNode<ScriptView>> {
+ None
+ }
+
+ pub fn ReleaseCapture(&self) {
+ }
+
+ pub fn MozFullScreenEnabled(&self) -> bool {
+ false
+ }
+
+ pub fn GetMozFullScreenElement(&self, _rv: &mut ErrorResult) -> Option<AbstractNode<ScriptView>> {
+ None
+ }
+
+ pub fn GetMozPointerLockElement(&self) -> Option<AbstractNode<ScriptView>> {
+ None
+ }
+
+ pub fn MozExitPointerLock(&self) {
+ }
+
+ pub fn Hidden(&self) -> bool {
+ false
+ }
+
+ pub fn MozHidden(&self) -> bool {
+ self.Hidden()
+ }
+
+ pub fn VisibilityState(&self) -> VisibilityState {
+ Visible
+ }
+
+ pub fn MozVisibilityState(&self) -> VisibilityState {
+ self.VisibilityState()
+ }
+
+ pub fn GetSelectedStyleSheetSet(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn SetSelectedStyleSheetSet(&self, _sheet: DOMString) {
+ }
+
+ pub fn GetLastStyleSheetSet(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn GetPreferredStyleSheetSet(&self) -> DOMString {
+ null_string
+ }
+
+ pub fn EnableStyleSheetsForSet(&self, _name: DOMString) {
+ }
+
+ pub fn ElementFromPoint(&self, _x: f32, _y: f32) -> Option<AbstractNode<ScriptView>> {
+ None
+ }
+
+ pub fn QuerySelector(&self, _selectors: DOMString, _rv: &mut ErrorResult) -> Option<AbstractNode<ScriptView>> {
+ None
}
- pub fn getElementsByName(&self, name: DOMString) -> Option<@mut HTMLCollection> {
+ pub fn GetElementsByName(&self, name: DOMString) -> @mut HTMLCollection {
let mut elements = ~[];
let name = name.to_str();
let _ = for self.root.traverse_preorder |child| {
@@ -67,7 +276,7 @@ impl Document {
}
}
};
- Some(HTMLCollection::new(elements))
+ HTMLCollection::new(elements)
}
pub fn content_changed(&self) {
diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs
index 0936b9e490b..e7cd5f01d33 100644
--- a/src/components/script/dom/node.rs
+++ b/src/components/script/dom/node.rs
@@ -514,7 +514,6 @@ impl VoidPtrLike for AbstractNode<LayoutView> {
pub fn define_bindings(compartment: @mut Compartment) {
bindings::window::init(compartment);
- bindings::document::init(compartment);
bindings::node::init(compartment);
bindings::element::init(compartment);
bindings::text::init(compartment);
diff --git a/src/components/script/script.rc b/src/components/script/script.rc
index 013a410fd54..b6225a12429 100644
--- a/src/components/script/script.rc
+++ b/src/components/script/script.rc
@@ -24,7 +24,6 @@ extern mod extra;
pub mod dom {
pub mod bindings {
- pub mod document;
pub mod element;
pub mod node;
pub mod text;
@@ -37,6 +36,7 @@ pub mod dom {
pub mod BlobBinding;
pub mod ClientRectBinding;
pub mod ClientRectListBinding;
+ pub mod DocumentBinding;
pub mod DOMParserBinding;
pub mod EventBinding;
pub mod EventTargetBinding;