Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement async fetching of extenal script sources via interruptible parsing. #5197

Closed
wants to merge 14 commits into from
Prev

Fix page loading double-panic if a request fails.

  • Loading branch information
jdm committed Mar 11, 2015
commit 24161eb4842557b46b77eadb0632b7f61aae2ea4
@@ -91,6 +91,12 @@ impl<T: Reflectable> Unrooted<T> {
}
}

/// Create a new unrooted value from a `Temporary<T>`.
#[allow(unrooted_must_root)]
pub fn from_temporary(ptr: Temporary<T>) -> Unrooted<T> {
Unrooted::from_js(ptr.inner)
}

/// Get the `Reflector` for this pointer.
pub fn reflector<'a>(&'a self) -> &'a Reflector {
unsafe {
@@ -138,6 +138,14 @@ pub struct Window {
}

impl Window {
#[allow(unsafe_blocks)]
pub fn clear_js_context_for_script_deallocation(&self) {
unsafe {
*self.js_context.borrow_for_script_deallocation() = None;
*self.browser_context.borrow_for_script_deallocation() = None;
}
}

pub fn get_cx(&self) -> *mut JSContext {
self.js_context.borrow().as_ref().unwrap().ptr
}
@@ -398,7 +406,6 @@ impl<'a> WindowMethods for JSRef<'a, Window> {

pub trait WindowHelpers {
fn clear_js_context(self);
fn clear_js_context_for_script_deallocation(self);
fn init_browser_context(self, doc: JSRef<Document>, frame_element: Option<JSRef<Element>>);
fn load_url(self, href: DOMString);
fn handle_fire_timer(self, timer_id: TimerId);
@@ -472,14 +479,6 @@ impl<'a> WindowHelpers for JSRef<'a, Window> {
*self.browser_context.borrow_mut() = None;
}

#[allow(unsafe_blocks)]
fn clear_js_context_for_script_deallocation(self) {
unsafe {
*self.js_context.borrow_for_script_deallocation() = None;
*self.browser_context.borrow_for_script_deallocation() = None;
}
}

/// Reflows the page if it's possible to do so and the page is dirty. This method will wait
/// for the layout thread to complete (but see the `TODO` below). If there is no window size
/// yet, the page is presumed invisible and no reflow is performed.
@@ -25,7 +25,7 @@ use dom::bindings::codegen::InheritTypes::{ElementCast, EventTargetCast, HTMLIFr
use dom::bindings::conversions::FromJSValConvertible;
use dom::bindings::conversions::StringificationBehavior;
use dom::bindings::js::{JS, JSRef, Temporary, OptionalRootable, RootedReference};
use dom::bindings::js::{RootCollection, RootCollectionPtr};
use dom::bindings::js::{RootCollection, RootCollectionPtr, Unrooted};
use dom::bindings::refcounted::{LiveDOMReferences, Trusted, TrustedReference};
use dom::bindings::structuredclone::StructuredCloneData;
use dom::bindings::trace::JSTraceable;
@@ -312,14 +312,15 @@ impl<'a> ScriptMemoryFailsafe<'a> {

#[unsafe_destructor]
impl<'a> Drop for ScriptMemoryFailsafe<'a> {
#[allow(unrooted_must_root)]
fn drop(&mut self) {
match self.owner {
Some(owner) => {
unsafe {
let page = owner.page.borrow_for_script_deallocation();
for page in page.iter() {
let window = page.window().root();
window.r().clear_js_context_for_script_deallocation();
let window = Unrooted::from_temporary(page.window());
(*window.unsafe_get()).clear_js_context_for_script_deallocation();
}
*owner.js_context.borrow_for_script_deallocation() = None;
}
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.