mirror of
https://github.com/servo/servo.git
synced 2025-06-20 15:18:58 +01:00
auto merge of #1751 : Ms2ger/servo/image-loading, r=jdm
This commit is contained in:
commit
e006c111f5
6 changed files with 21 additions and 26 deletions
|
@ -16,9 +16,7 @@ use extra::url::Url;
|
||||||
use servo_util::geometry::to_px;
|
use servo_util::geometry::to_px;
|
||||||
use layout_interface::{ContentBoxQuery, ContentBoxResponse};
|
use layout_interface::{ContentBoxQuery, ContentBoxResponse};
|
||||||
use servo_net::image_cache_task;
|
use servo_net::image_cache_task;
|
||||||
use servo_net::image_cache_task::ImageCacheTask;
|
|
||||||
use servo_util::url::parse_url;
|
use servo_util::url::parse_url;
|
||||||
use servo_util::namespace::Null;
|
|
||||||
use servo_util::str::DOMString;
|
use servo_util::str::DOMString;
|
||||||
|
|
||||||
use extra::serialize::{Encoder, Encodable};
|
use extra::serialize::{Encoder, Encodable};
|
||||||
|
@ -66,11 +64,15 @@ impl HTMLImageElement {
|
||||||
impl HTMLImageElement {
|
impl HTMLImageElement {
|
||||||
/// Makes the local `image` member match the status of the `src` attribute and starts
|
/// Makes the local `image` member match the status of the `src` attribute and starts
|
||||||
/// prefetching the image. This method must be called after `src` is changed.
|
/// prefetching the image. This method must be called after `src` is changed.
|
||||||
pub fn update_image(&mut self, image_cache: ImageCacheTask, url: Option<Url>) {
|
fn update_image(&mut self, value: Option<DOMString>, url: Option<Url>) {
|
||||||
let elem = &mut self.htmlelement.element;
|
let elem = &mut self.htmlelement.element;
|
||||||
let src_opt = elem.get_attribute(Null, "src").map(|x| x.get().Value());
|
let document = elem.node.owner_doc();
|
||||||
match src_opt {
|
let window = document.get().window.get();
|
||||||
None => {}
|
let image_cache = &window.image_cache_task;
|
||||||
|
match value {
|
||||||
|
None => {
|
||||||
|
self.extra.image = None;
|
||||||
|
}
|
||||||
Some(src) => {
|
Some(src) => {
|
||||||
let img_url = parse_url(src, url);
|
let img_url = parse_url(src, url);
|
||||||
self.extra.image = Some(img_url.clone());
|
self.extra.image = Some(img_url.clone());
|
||||||
|
@ -85,23 +87,18 @@ impl HTMLImageElement {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn AfterSetAttr(&mut self, name: DOMString, _value: DOMString) {
|
pub fn AfterSetAttr(&mut self, name: DOMString, value: DOMString) {
|
||||||
if "src" == name {
|
if "src" == name {
|
||||||
let document = self.htmlelement.element.node.owner_doc();
|
let document = self.htmlelement.element.node.owner_doc();
|
||||||
let window = document.get().window.get();
|
let window = document.get().window.get();
|
||||||
let url = window.page.url.as_ref().map(|&(ref url, _)| url.clone());
|
let url = window.page.url.as_ref().map(|&(ref url, _)| url.clone());
|
||||||
self.update_image(window.image_cache_task.clone(), url);
|
self.update_image(Some(value), url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn AfterRemoveAttr(&mut self, name: DOMString) {
|
pub fn AfterRemoveAttr(&mut self, name: DOMString) {
|
||||||
// FIXME (#1469):
|
|
||||||
// This might not handle remove src attribute actually since
|
|
||||||
// `self.update_image()` will see the missing src attribute and return early.
|
|
||||||
if "src" == name {
|
if "src" == name {
|
||||||
let document = self.htmlelement.element.node.owner_doc();
|
self.update_image(None, None);
|
||||||
let window = document.get().window.get();
|
|
||||||
self.update_image(window.image_cache_task.clone(), None);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
use dom::bindings::codegen::InheritTypes::{NodeBase, NodeCast, TextCast, ElementCast};
|
use dom::bindings::codegen::InheritTypes::{NodeBase, NodeCast, TextCast, ElementCast};
|
||||||
use dom::bindings::codegen::InheritTypes::{HTMLIFrameElementCast, HTMLImageElementCast};
|
use dom::bindings::codegen::InheritTypes::HTMLIFrameElementCast;
|
||||||
use dom::bindings::js::JS;
|
use dom::bindings::js::JS;
|
||||||
use dom::bindings::utils::Reflectable;
|
use dom::bindings::utils::Reflectable;
|
||||||
use dom::document::Document;
|
use dom::document::Document;
|
||||||
use dom::element::{HTMLLinkElementTypeId, HTMLIframeElementTypeId, HTMLImageElementTypeId};
|
use dom::element::{HTMLLinkElementTypeId, HTMLIframeElementTypeId};
|
||||||
use dom::htmlelement::HTMLElement;
|
use dom::htmlelement::HTMLElement;
|
||||||
use dom::htmlheadingelement::{Heading1, Heading2, Heading3, Heading4, Heading5, Heading6};
|
use dom::htmlheadingelement::{Heading1, Heading2, Heading3, Heading4, Heading5, Heading6};
|
||||||
use dom::htmliframeelement::IFrameSize;
|
use dom::htmliframeelement::IFrameSize;
|
||||||
|
@ -21,7 +21,6 @@ use extra::url::Url;
|
||||||
use hubbub::hubbub;
|
use hubbub::hubbub;
|
||||||
use js::jsapi::JSContext;
|
use js::jsapi::JSContext;
|
||||||
use servo_msg::constellation_msg::SubpageId;
|
use servo_msg::constellation_msg::SubpageId;
|
||||||
use servo_net::image_cache_task::ImageCacheTask;
|
|
||||||
use servo_net::resource_task::{Load, Payload, Done, ResourceTask, load_whole_resource};
|
use servo_net::resource_task::{Load, Payload, Done, ResourceTask, load_whole_resource};
|
||||||
use servo_util::namespace::Null;
|
use servo_util::namespace::Null;
|
||||||
use servo_util::str::DOMString;
|
use servo_util::str::DOMString;
|
||||||
|
@ -251,7 +250,6 @@ pub fn parse_html(cx: *JSContext,
|
||||||
document: &mut JS<Document>,
|
document: &mut JS<Document>,
|
||||||
url: Url,
|
url: Url,
|
||||||
resource_task: ResourceTask,
|
resource_task: ResourceTask,
|
||||||
image_cache_task: ImageCacheTask,
|
|
||||||
next_subpage_id: SubpageId)
|
next_subpage_id: SubpageId)
|
||||||
-> HtmlParserResult {
|
-> HtmlParserResult {
|
||||||
debug!("Hubbub: parsing {:?}", url);
|
debug!("Hubbub: parsing {:?}", url);
|
||||||
|
@ -382,13 +380,6 @@ pub fn parse_html(cx: *JSContext,
|
||||||
sandboxed)));
|
sandboxed)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME: This should be taken care of by set_attr, but we don't have
|
|
||||||
// access to a window so HTMLImageElement::AfterSetAttr bails.
|
|
||||||
ElementNodeTypeId(HTMLImageElementTypeId) => {
|
|
||||||
let mut image_element: JS<HTMLImageElement> = HTMLImageElementCast::to(&element);
|
|
||||||
image_element.get_mut().update_image(image_cache_task.clone(), Some(url2.clone()));
|
|
||||||
}
|
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -722,7 +722,6 @@ impl ScriptTask {
|
||||||
&mut document,
|
&mut document,
|
||||||
url.clone(),
|
url.clone(),
|
||||||
self.resource_task.clone(),
|
self.resource_task.clone(),
|
||||||
self.image_cache_task.clone(),
|
|
||||||
page.next_subpage_id.clone());
|
page.next_subpage_id.clone());
|
||||||
|
|
||||||
let HtmlParserResult {
|
let HtmlParserResult {
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
== font_size_percentage.html font_size_em_ref.html
|
== font_size_percentage.html font_size_em_ref.html
|
||||||
== position_fixed_a.html position_fixed_b.html
|
== position_fixed_a.html position_fixed_b.html
|
||||||
== img_size_a.html img_size_b.html
|
== img_size_a.html img_size_b.html
|
||||||
|
== img_dynamic_remove.html img_dynamic_remove_ref.html
|
||||||
== upper_id_attr.html upper_id_attr_ref.html
|
== upper_id_attr.html upper_id_attr_ref.html
|
||||||
# inline_border_a.html inline_border_b.html
|
# inline_border_a.html inline_border_b.html
|
||||||
== anon_block_inherit_a.html anon_block_inherit_b.html
|
== anon_block_inherit_a.html anon_block_inherit_b.html
|
||||||
|
|
5
src/test/ref/img_dynamic_remove.html
Normal file
5
src/test/ref/img_dynamic_remove.html
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<!doctype html>
|
||||||
|
<img src=400x400_green.png>
|
||||||
|
<script>
|
||||||
|
document.getElementsByTagName("img")[0].removeAttribute("src");
|
||||||
|
</script>
|
2
src/test/ref/img_dynamic_remove_ref.html
Normal file
2
src/test/ref/img_dynamic_remove_ref.html
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
<!doctype html>
|
||||||
|
<img>
|
Loading…
Add table
Add a link
Reference in a new issue