aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <release+servo@mozilla.com>2013-11-24 15:52:04 -0800
committerbors-servo <release+servo@mozilla.com>2013-11-24 15:52:04 -0800
commitf6646e17bfc0c91a4e9710d131082f178e7fe1cf (patch)
treee46afcdf6041cfaecf8eb8ceb9d25f1373040f19
parent010b8cd4c3e82cd63b5b7707da8476a50f870269 (diff)
parentf9433e357c22032e7067626131c5e702491a61aa (diff)
downloadservo-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.
-rw-r--r--src/components/script/dom/bindings/codegen/Bindings.conf3
-rw-r--r--src/components/script/dom/bindings/codegen/Location.webidl21
-rw-r--r--src/components/script/dom/bindings/codegen/URLUtils.webidl32
-rw-r--r--src/components/script/dom/bindings/codegen/Window.webidl4
-rw-r--r--src/components/script/dom/bindings/utils.rs20
-rw-r--r--src/components/script/dom/location.rs134
-rw-r--r--src/components/script/dom/window.rs36
-rw-r--r--src/components/script/script.rc1
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;