mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Remove the fragment_node field from Page (fixes #3543).
Since Page isn't reflected, it cannot be rooted, and pointers to JS-managed objects inside it are not guaranteed to be traced. This may cause the pointer to become dangling.
This commit is contained in:
parent
5d335fd524
commit
7508ca94b3
2 changed files with 12 additions and 13 deletions
|
@ -4,8 +4,7 @@
|
|||
|
||||
use dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods;
|
||||
use dom::bindings::codegen::InheritTypes::NodeCast;
|
||||
use dom::bindings::js::{MutNullableJS, JS, JSRef, Temporary};
|
||||
use dom::bindings::js::OptionalRootable;
|
||||
use dom::bindings::js::{JS, JSRef, Temporary, OptionalRootable};
|
||||
use dom::bindings::trace::{Traceable, Untraceable};
|
||||
use dom::bindings::utils::GlobalStaticData;
|
||||
use dom::document::{Document, DocumentHelpers};
|
||||
|
@ -29,14 +28,12 @@ use servo_net::resource_task::ResourceTask;
|
|||
use servo_util::str::DOMString;
|
||||
use std::cell::{Cell, RefCell, Ref, RefMut};
|
||||
use std::comm::{channel, Receiver, Empty, Disconnected};
|
||||
use std::default::Default;
|
||||
use std::mem::replace;
|
||||
use std::rc::Rc;
|
||||
use url::Url;
|
||||
|
||||
/// Encapsulates a handle to a frame and its associated layout information.
|
||||
#[jstraceable]
|
||||
#[allow(unrooted_must_root)] // FIXME(#3543) should be must_root.
|
||||
pub struct Page {
|
||||
/// Pipeline id associated with this page.
|
||||
pub id: PipelineId,
|
||||
|
@ -79,7 +76,7 @@ pub struct Page {
|
|||
pub resize_event: Untraceable<Cell<Option<WindowSizeData>>>,
|
||||
|
||||
/// Pending scroll to fragment event, if any
|
||||
pub fragment_node: MutNullableJS<Element>,
|
||||
pub fragment_name: RefCell<Option<String>>,
|
||||
|
||||
/// Associated resource task for use by DOM objects like XMLHttpRequest
|
||||
pub resource_task: Untraceable<ResourceTask>,
|
||||
|
@ -153,7 +150,7 @@ impl Page {
|
|||
url: Untraceable::new(RefCell::new(None)),
|
||||
next_subpage_id: Traceable::new(Cell::new(SubpageId(0))),
|
||||
resize_event: Untraceable::new(Cell::new(None)),
|
||||
fragment_node: Default::default(),
|
||||
fragment_name: RefCell::new(None),
|
||||
last_reflow_id: Traceable::new(Cell::new(0)),
|
||||
resource_task: Untraceable::new(resource_task),
|
||||
constellation_chan: Untraceable::new(constellation_chan),
|
||||
|
|
|
@ -12,8 +12,7 @@ use dom::bindings::codegen::InheritTypes::{EventTargetCast, NodeCast, EventCast,
|
|||
use dom::bindings::conversions;
|
||||
use dom::bindings::conversions::{FromJSValConvertible, Empty};
|
||||
use dom::bindings::global;
|
||||
use dom::bindings::js::{JS, JSRef, RootCollection, Temporary, OptionalSettable};
|
||||
use dom::bindings::js::OptionalRootable;
|
||||
use dom::bindings::js::{JS, JSRef, RootCollection, Temporary, OptionalRootable};
|
||||
use dom::bindings::trace::JSTraceable;
|
||||
use dom::bindings::utils::Reflectable;
|
||||
use dom::bindings::utils::{wrap_for_same_compartment, pre_wrap};
|
||||
|
@ -800,8 +799,6 @@ impl ScriptTask {
|
|||
document.deref().content_changed();
|
||||
window.flush_layout(ReflowForDisplay);
|
||||
|
||||
let fragment = url.fragment.as_ref().map(|ref fragment| fragment.to_string());
|
||||
|
||||
{
|
||||
// No more reflow required
|
||||
let mut page_url = page.mut_url();
|
||||
|
@ -841,7 +838,7 @@ impl ScriptTask {
|
|||
let wintarget: JSRef<EventTarget> = EventTargetCast::from_ref(*window);
|
||||
let _ = wintarget.dispatch_event_with_target(Some(doctarget), *event);
|
||||
|
||||
page.fragment_node.assign(fragment.map_or(None, |fragid| page.find_fragment_node(fragid)));
|
||||
*page.fragment_name.borrow_mut() = url.fragment.clone();
|
||||
|
||||
let ConstellationChan(ref chan) = self.constellation_chan;
|
||||
chan.send(LoadCompleteMsg(page.id, url));
|
||||
|
@ -877,8 +874,13 @@ impl ScriptTask {
|
|||
page.reflow(ReflowForDisplay, self.control_chan.clone(), &*self.compositor)
|
||||
}
|
||||
|
||||
let mut fragment_node = page.fragment_node.get();
|
||||
match fragment_node.take().map(|node| node.root()) {
|
||||
let fragment_node = page.fragment_name
|
||||
.borrow()
|
||||
.as_ref()
|
||||
.and_then(|name| {
|
||||
page.find_fragment_node(name.clone())
|
||||
}).root();
|
||||
match fragment_node {
|
||||
Some(node) => self.scroll_fragment_point(pipeline_id, *node),
|
||||
None => {}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue