diff options
author | bors-servo <release+servo@mozilla.com> | 2013-11-24 15:52:04 -0800 |
---|---|---|
committer | bors-servo <release+servo@mozilla.com> | 2013-11-24 15:52:04 -0800 |
commit | f6646e17bfc0c91a4e9710d131082f178e7fe1cf (patch) | |
tree | e46afcdf6041cfaecf8eb8ceb9d25f1373040f19 /src | |
parent | 010b8cd4c3e82cd63b5b7707da8476a50f870269 (diff) | |
parent | f9433e357c22032e7067626131c5e702491a61aa (diff) | |
download | servo-f6646e17bfc0c91a4e9710d131082f178e7fe1cf.tar.gz servo-f6646e17bfc0c91a4e9710d131082f178e7fe1cf.zip |
auto merge of #1270 : evilpie/servo/url, r=jdm
I wasn't sure how to store @window in Location, so I just made it use @Page for now. I was going to implement stringifier, but sadly some of the webidl stuff is like 1 year out of sync.
Diffstat (limited to 'src')
-rw-r--r-- | src/components/script/dom/bindings/codegen/Bindings.conf | 3 | ||||
-rw-r--r-- | src/components/script/dom/bindings/codegen/Location.webidl | 21 | ||||
-rw-r--r-- | src/components/script/dom/bindings/codegen/URLUtils.webidl | 32 | ||||
-rw-r--r-- | src/components/script/dom/bindings/codegen/Window.webidl | 4 | ||||
-rw-r--r-- | src/components/script/dom/bindings/utils.rs | 20 | ||||
-rw-r--r-- | src/components/script/dom/location.rs | 134 | ||||
-rw-r--r-- | src/components/script/dom/window.rs | 36 | ||||
-rw-r--r-- | src/components/script/script.rc | 1 |
8 files changed, 229 insertions, 22 deletions
diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 4ced1397f02..18665606bba 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -280,6 +280,9 @@ DOMInterfaces = { 'workers': True, }], +'Location': { +}, + 'MozChannel': [ { 'nativeType': 'nsIChannel', diff --git a/src/components/script/dom/bindings/codegen/Location.webidl b/src/components/script/dom/bindings/codegen/Location.webidl new file mode 100644 index 00000000000..33d4c2e0d30 --- /dev/null +++ b/src/components/script/dom/bindings/codegen/Location.webidl @@ -0,0 +1,21 @@ +/* -*- 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://www.whatwg.org/specs/web-apps/current-work/#the-location-interface + * + * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and + * Opera Software ASA. You are granted a license to use, reproduce + * and create derivative works of this document. + */ + +// No support for [Unforgeable] on interfaces yet +//[Unforgeable] +interface Location { + void assign(DOMString url); + void replace(DOMString url); + void reload(); +}; +Location implements URLUtils; diff --git a/src/components/script/dom/bindings/codegen/URLUtils.webidl b/src/components/script/dom/bindings/codegen/URLUtils.webidl new file mode 100644 index 00000000000..f65514ca53d --- /dev/null +++ b/src/components/script/dom/bindings/codegen/URLUtils.webidl @@ -0,0 +1,32 @@ +/* -*- 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://url.spec.whatwg.org/#urlutils + * + * To the extent possible under law, the editors have waived all copyright + * and related or neighboring rights to this work. In addition, as of 17 + * February 2013, the editors have made this specification available under + * the Open Web Foundation Agreement Version 1.0, which is available at + * http://www.openwebfoundation.org/legal/the-owf-1-0-agreements/owfa-1-0. + */ + +[NoInterfaceObject] +interface URLUtils { + [SetterThrows] + /* stringifier */ attribute DOMString href; + readonly attribute DOMString origin; + + attribute DOMString protocol; + attribute DOMString username; + attribute DOMString password; + attribute DOMString host; + attribute DOMString hostname; + attribute DOMString port; + attribute DOMString pathname; + attribute DOMString search; + // attribute URLQuery? query; + attribute DOMString hash; +}; diff --git a/src/components/script/dom/bindings/codegen/Window.webidl b/src/components/script/dom/bindings/codegen/Window.webidl index 59ea26308e3..a2f541e61f2 100644 --- a/src/components/script/dom/bindings/codegen/Window.webidl +++ b/src/components/script/dom/bindings/codegen/Window.webidl @@ -14,8 +14,8 @@ [Replaceable] readonly attribute WindowProxy self;*/ [Unforgeable] readonly attribute Document document; attribute DOMString name; - /*[PutForwards=href, Unforgeable] readonly attribute Location location; - readonly attribute History history; + /* [PutForwards=href, Unforgeable] */ readonly attribute Location location; + /* readonly attribute History history; [Replaceable] readonly attribute BarProp locationbar; [Replaceable] readonly attribute BarProp menubar; [Replaceable] readonly attribute BarProp personalbar; diff --git a/src/components/script/dom/bindings/utils.rs b/src/components/script/dom/bindings/utils.rs index b076810785a..1163cdb783f 100644 --- a/src/components/script/dom/bindings/utils.rs +++ b/src/components/script/dom/bindings/utils.rs @@ -29,7 +29,7 @@ use js::jsapi::{JS_ValueToString, JS_GetReservedSlot, JS_SetReservedSlot}; use js::jsapi::{JSContext, JSObject, JSBool, jsid, JSClass, JSNative, JSTracer}; use js::jsapi::{JSFunctionSpec, JSPropertySpec, JSVal, JSPropertyDescriptor}; use js::jsapi::{JSPropertyOp, JSStrictPropertyOp, JS_NewGlobalObject, JS_InitStandardClasses}; -use js::jsapi::{JSString}; +use js::jsapi::{JSString, JS_CallTracer, JSTRACE_OBJECT}; use js::jsfriendapi::bindgen::JS_NewObjectWithUniqueType; use js::{JSPROP_ENUMERATE, JSVAL_NULL, JSCLASS_IS_GLOBAL, JSCLASS_IS_DOMJSCLASS}; use js::{JSPROP_PERMANENT, JSID_VOID, JSPROP_NATIVE_ACCESSORS, JSPROP_GETTER}; @@ -589,6 +589,24 @@ pub trait Traceable { } #[fixed_stack_segment] +pub fn trace_reflector(tracer: *mut JSTracer, description: &str, reflector: &Reflector) { + unsafe { + do description.to_c_str().with_ref |name| { + (*tracer).debugPrinter = ptr::null(); + (*tracer).debugPrintIndex = -1; + (*tracer).debugPrintArg = name as *libc::c_void; + debug!("tracing {:s}", description); + JS_CallTracer(tracer as *JSTracer, reflector.get_jsobject(), + JSTRACE_OBJECT as u32); + } + } +} + +pub fn trace_option<T: Reflectable>(tracer: *mut JSTracer, description: &str, option: Option<@mut T>) { + option.map(|some| trace_reflector(tracer, description, some.reflector())); +} + +#[fixed_stack_segment] pub fn initialize_global(global: *JSObject) { let protoArray = @mut ([0 as *JSObject, ..PrototypeList::id::_ID_Count as uint]); unsafe { diff --git a/src/components/script/dom/location.rs b/src/components/script/dom/location.rs new file mode 100644 index 00000000000..2c773c77b8d --- /dev/null +++ b/src/components/script/dom/location.rs @@ -0,0 +1,134 @@ +/* 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 dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; +use dom::bindings::utils::{DOMString, Fallible}; +use dom::bindings::codegen::LocationBinding; +use dom::window::Window; + +use script_task::{Page}; + +pub struct Location { + reflector_: Reflector, //XXXjdm cycle: window->Location->window + page: @mut Page +} + +impl Location { + pub fn new_inherited(page: @mut Page) -> Location { + Location { + reflector_: Reflector::new(), + page: page + } + } + + pub fn new(window: &Window, page: @mut Page) -> @mut Location { + reflect_dom_object(@mut Location::new_inherited(page), window, LocationBinding::Wrap) + } + + pub fn Assign(&self, _url: DOMString) { + + } + + pub fn Replace(&self, _url: DOMString) { + + } + + pub fn Reload(&self) { + + } + + pub fn Href(&self) -> DOMString { + self.page.url.get_ref().first().to_str() + } + + pub fn SetHref(&self, _href: DOMString) -> Fallible<()> { + Ok(()) + } + + pub fn Origin(&self) -> DOMString { + ~"" + } + + pub fn Protocol(&self) -> DOMString { + ~"" + } + + pub fn SetProtocol(&self, _protocol: DOMString) { + + } + + pub fn Username(&self) -> DOMString { + ~"" + } + + pub fn SetUsername(&self, _username: DOMString) { + + } + + pub fn Password(&self) -> DOMString { + ~"" + } + + pub fn SetPassword(&self, _password: DOMString) { + + } + + pub fn Host(&self) -> DOMString { + ~"" + } + + pub fn SetHost(&self, _host: DOMString) { + + } + + pub fn Hostname(&self) -> DOMString { + ~"" + } + + pub fn SetHostname(&self, _hostname: DOMString) { + + } + + pub fn Port(&self) -> DOMString { + ~"" + } + + pub fn SetPort(&self, _port: DOMString) { + + } + + pub fn Pathname(&self) -> DOMString { + ~"" + } + + pub fn SetPathname(&self, _pathname: DOMString) { + + } + + pub fn Search(&self) -> DOMString { + ~"" + } + + pub fn SetSearch(&self, _search: DOMString) { + + } + + pub fn Hash(&self) -> DOMString { + ~"" + } + + pub fn SetHash(&self, _hash: DOMString) { + + } +} + +impl Reflectable for Location { + fn reflector<'a>(&'a self) -> &'a Reflector { + &self.reflector_ + } + + fn mut_reflector<'a>(&'a mut self) -> &'a mut Reflector { + &mut self.reflector_ + } +} diff --git a/src/components/script/dom/window.rs b/src/components/script/dom/window.rs index 7303d5d81f0..4814550e42f 100644 --- a/src/components/script/dom/window.rs +++ b/src/components/script/dom/window.rs @@ -4,10 +4,12 @@ use dom::bindings::codegen::WindowBinding; use dom::bindings::utils::{Reflectable, Reflector, Traceable}; +use dom::bindings::utils::{trace_option, trace_reflector}; use dom::bindings::utils::DOMString; use dom::document::AbstractDocument; use dom::eventtarget::{EventTarget, WindowTypeId}; use dom::node::{AbstractNode, ScriptView}; +use dom::location::Location; use dom::navigator::Navigator; use layout_interface::ReflowForDisplay; @@ -16,8 +18,8 @@ use servo_msg::compositor_msg::ScriptListener; use servo_net::image_cache_task::ImageCacheTask; use js::glue::*; -use js::jsapi::{JSObject, JSContext, JS_DefineProperty, JS_CallTracer}; -use js::jsapi::{JSPropertyOp, JSStrictPropertyOp, JSTracer, JSTRACE_OBJECT}; +use js::jsapi::{JSObject, JSContext, JS_DefineProperty}; +use js::jsapi::{JSPropertyOp, JSStrictPropertyOp, JSTracer}; use js::{JSVAL_NULL, JSPROP_ENUMERATE}; use std::cell::Cell; @@ -43,6 +45,7 @@ pub struct Window { script_chan: ScriptChan, compositor: @ScriptListener, timer_chan: SharedChan<TimerControlMsg>, + location: Option<@mut Location>, navigator: Option<@mut Navigator>, image_cache_task: ImageCacheTask, active_timers: ~HashSet<i32>, @@ -116,6 +119,13 @@ impl Window { None } + pub fn Location(&mut self) -> @mut Location { + if self.location.is_none() { + self.location = Some(Location::new(self, self.page)); + } + self.location.unwrap() + } + pub fn Navigator(&mut self) -> @mut Navigator { if self.navigator.is_none() { self.navigator = Some(Navigator::new(self)); @@ -215,6 +225,7 @@ impl Window { } SharedChan::new(timer_chan) }, + location: None, navigator: None, image_cache_task: image_cache_task, active_timers: ~HashSet::new(), @@ -241,24 +252,11 @@ impl Window { } impl Traceable for Window { - #[fixed_stack_segment] fn trace(&self, tracer: *mut JSTracer) { debug!("tracing window"); - unsafe { - match self.page.frame { - Some(frame) => { - (*tracer).debugPrinter = ptr::null(); - (*tracer).debugPrintIndex = -1; - do "document".to_c_str().with_ref |name| { - (*tracer).debugPrintArg = name as *libc::c_void; - debug!("tracing document"); - JS_CallTracer(tracer as *JSTracer, - frame.document.reflector().get_jsobject(), - JSTRACE_OBJECT as u32); - } - } - None => () - } - } + + self.page.frame.map(|frame| trace_reflector(tracer, "document", frame.document.reflector())); + trace_option(tracer, "location", self.location); + trace_option(tracer, "navigator", self.navigator); } } diff --git a/src/components/script/script.rc b/src/components/script/script.rc index 874d8b1879c..5556da368c1 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -130,6 +130,7 @@ pub mod dom { pub mod htmlulistelement; pub mod htmlvideoelement; pub mod htmlunknownelement; + pub mod location; pub mod mouseevent; pub mod namespace; pub mod navigator; |