mirror of
https://github.com/servo/servo.git
synced 2025-06-21 07:38:59 +01:00
auto merge of #1447 : june0cho/servo/fix_crash_on_local_bookmark, r=kmcallister
Local bookmark which is implemented in #1262 is not currently working when executing URL with hashtag(e.g. `test_local_bookmark.html#h3`, `acid2.html#top`). Local bookmark has two matching processes(http://www.w3.org/TR/html5/browsers.html#scroll-to-fragid). Among two, this commit fixes the crash on ID attribute, and still has crash on `a` element with `name` attribute. As a result, with this commit, `test_local_bookmark.html#h3` works well, but `acid2.html#top` still does not work.
This commit is contained in:
commit
6dbdcd55ac
1 changed files with 26 additions and 15 deletions
|
@ -93,7 +93,10 @@ pub struct IOCompositor {
|
|||
constellation_chan: ConstellationChan,
|
||||
|
||||
/// The channel on which messages can be sent to the profiler.
|
||||
profiler_chan: ProfilerChan
|
||||
profiler_chan: ProfilerChan,
|
||||
|
||||
/// Pending scroll to fragment event, if any
|
||||
fragment_point: Option<Point2D<f32>>
|
||||
}
|
||||
|
||||
impl IOCompositor {
|
||||
|
@ -129,7 +132,8 @@ impl IOCompositor {
|
|||
zoom_time: 0f64,
|
||||
compositor_layer: None,
|
||||
constellation_chan: constellation_chan.clone(),
|
||||
profiler_chan: profiler_chan
|
||||
profiler_chan: profiler_chan,
|
||||
fragment_point: None
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -329,21 +333,22 @@ impl IOCompositor {
|
|||
id: PipelineId,
|
||||
new_size: Size2D<f32>,
|
||||
epoch: Epoch) {
|
||||
let ask: bool = match self.compositor_layer {
|
||||
let (ask, move): (bool, bool) = match self.compositor_layer {
|
||||
Some(ref mut layer) => {
|
||||
let window_size = &self.window_size;
|
||||
let world_zoom = self.world_zoom;
|
||||
let page_window = Size2D(window_size.width as f32 / world_zoom,
|
||||
window_size.height as f32 / world_zoom);
|
||||
assert!(layer.resize(id, new_size, page_window, epoch));
|
||||
true
|
||||
}
|
||||
None => {
|
||||
false
|
||||
let move = self.fragment_point.take().map_default(false, |point| layer.move(point, page_window));
|
||||
|
||||
(true, move)
|
||||
}
|
||||
None => (false, false)
|
||||
};
|
||||
|
||||
if ask {
|
||||
self.recomposite_if(move);
|
||||
self.ask_for_tiles();
|
||||
}
|
||||
}
|
||||
|
@ -431,19 +436,20 @@ impl IOCompositor {
|
|||
let world_zoom = self.world_zoom;
|
||||
let page_window = Size2D(self.window_size.width as f32 / world_zoom,
|
||||
self.window_size.height as f32 / world_zoom);
|
||||
let ask: bool = match self.compositor_layer {
|
||||
Some(ref mut layer) if layer.pipeline.id == id => {
|
||||
let recomposite = layer.move(point, page_window) | self.recomposite;
|
||||
self.recomposite = recomposite;
|
||||
let (ask, move): (bool, bool) = match self.compositor_layer {
|
||||
Some(ref mut layer) if layer.pipeline.id == id && !layer.hidden => {
|
||||
|
||||
true
|
||||
(true, layer.move(point, page_window))
|
||||
}
|
||||
Some(_) | None => {
|
||||
false
|
||||
self.fragment_point = Some(point);
|
||||
|
||||
(false, false)
|
||||
}
|
||||
};
|
||||
|
||||
if ask {
|
||||
self.recomposite_if(move);
|
||||
self.ask_for_tiles();
|
||||
}
|
||||
}
|
||||
|
@ -535,10 +541,11 @@ impl IOCompositor {
|
|||
cursor.y as f32 / world_zoom);
|
||||
let page_window = Size2D(self.window_size.width as f32 / world_zoom,
|
||||
self.window_size.height as f32 / world_zoom);
|
||||
let mut scroll = false;
|
||||
for layer in self.compositor_layer.mut_iter() {
|
||||
let recomposite = layer.scroll(page_delta, page_cursor, page_window) || self.recomposite;
|
||||
self.recomposite = recomposite;
|
||||
scroll = layer.scroll(page_delta, page_cursor, page_window) || scroll;
|
||||
}
|
||||
self.recomposite_if(scroll);
|
||||
self.ask_for_tiles();
|
||||
}
|
||||
|
||||
|
@ -650,4 +657,8 @@ impl IOCompositor {
|
|||
self.done = true;
|
||||
}
|
||||
}
|
||||
|
||||
fn recomposite_if(&mut self, result: bool) {
|
||||
self.recomposite = result || self.recomposite;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue