aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/window.rs
diff options
context:
space:
mode:
authorJack Moffitt <jack@metajack.im>2014-09-15 17:03:54 -0600
committerJack Moffitt <jack@metajack.im>2014-09-15 17:03:54 -0600
commitd161d0ad47dbfbd5ff6e28d19008e0719f078eff (patch)
tree0627c29038e2f7bf0e8e22e576fe0c81c97eee98 /components/script/dom/window.rs
parent6ed9680ba5964f4e53700853a50fd43a22f39cc9 (diff)
parentb605929134aa072e3414eedb66c5b290eada9d1f (diff)
downloadservo-d161d0ad47dbfbd5ff6e28d19008e0719f078eff.tar.gz
servo-d161d0ad47dbfbd5ff6e28d19008e0719f078eff.zip
Merge pull request #3299 from servo/iframe-javascript-urls
Handle iframe.src with a javascript: URL.
Diffstat (limited to 'components/script/dom/window.rs')
-rw-r--r--components/script/dom/window.rs25
1 files changed, 23 insertions, 2 deletions
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index 23b6c71e029..ce60f3cdb19 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -29,14 +29,15 @@ use servo_net::image_cache_task::ImageCacheTask;
use servo_util::str::{DOMString,HTML_SPACE_CHARACTERS};
use servo_util::task::{spawn_named};
-use js::jsapi::JS_CallFunctionValue;
+use js::jsapi::{JS_CallFunctionValue, JS_EvaluateUCScript};
use js::jsapi::JSContext;
use js::jsapi::{JS_GC, JS_GetRuntime};
use js::jsval::JSVal;
-use js::jsval::NullValue;
+use js::jsval::{UndefinedValue, NullValue};
use js::rust::with_compartment;
use url::{Url, UrlParser};
+use libc;
use serialize::base64::{FromBase64, ToBase64, STANDARD};
use std::collections::hashmap::HashMap;
use std::cell::{Cell, RefCell};
@@ -358,6 +359,7 @@ pub trait WindowHelpers {
fn init_browser_context(&self, doc: &JSRef<Document>);
fn load_url(&self, href: DOMString);
fn handle_fire_timer(&self, timer_id: TimerId, cx: *mut JSContext);
+ fn evaluate_js_with_result(&self, code: &str) -> JSVal;
}
trait PrivateWindowHelpers {
@@ -365,6 +367,25 @@ trait PrivateWindowHelpers {
}
impl<'a> WindowHelpers for JSRef<'a, Window> {
+ fn evaluate_js_with_result(&self, code: &str) -> JSVal {
+ let global = self.reflector().get_jsobject();
+ let code: Vec<u16> = code.as_slice().utf16_units().collect();
+ let mut rval = UndefinedValue();
+ let filename = "".to_c_str();
+ let cx = self.get_cx();
+
+ with_compartment(cx, global, || {
+ unsafe {
+ if JS_EvaluateUCScript(cx, global, code.as_ptr(),
+ code.len() as libc::c_uint,
+ filename.as_ptr(), 1, &mut rval) == 0 {
+ debug!("error evaluating JS string");
+ }
+ rval
+ }
+ })
+ }
+
fn damage_and_reflow(&self, damage: DocumentDamageLevel) {
// FIXME This should probably be ReflowForQuery, not Display. All queries currently
// currently rely on the display list, which means we can't destroy it by