Skip to content

Commit

Permalink
servo: Merge #5777 - Make Attr::prefix an Atom (from tamird:ICE-attr-…
Browse files Browse the repository at this point in the history
…prefix-atom); r=jdm

Rebase of https://github.com/Ms2ger/servo/commits/ICE-attr-prefix-atom

Some of the changes weren't necessary since the internals had been refactored some in the interim. In any case, I was unable to reproduce the ICE reported in rust-lang/rust#18957.

Ms2ger

Source-Repo: https://github.com/servo/servo
Source-Revision: b0a7d1bf865eff7b6ca3bae874004a61c19b3c27

UltraBlame original commit: 4af16b10e9d304b2651a66dcca09f497c38fa55d
  • Loading branch information
marco-c committed Sep 30, 2019
1 parent 8a32c2d commit fed7075
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 22 deletions.
10 changes: 5 additions & 5 deletions servo/components/script/dom/attr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,15 @@ pub struct Attr {
value: DOMRefCell<AttrValue>,
name: Atom,
namespace: Namespace,
prefix: Option<DOMString>,
prefix: Option<Atom>,


owner: MutNullableHeap<JS<Element>>,
}

impl Attr {
fn new_inherited(local_name: Atom, value: AttrValue, name: Atom, namespace: Namespace,
prefix: Option<DOMString>, owner: Option<JSRef<Element>>) -> Attr {
prefix: Option<Atom>, owner: Option<JSRef<Element>>) -> Attr {
Attr {
reflector_: Reflector::new(),
local_name: local_name,
Expand All @@ -123,7 +123,7 @@ impl Attr {

pub fn new(window: JSRef<Window>, local_name: Atom, value: AttrValue,
name: Atom, namespace: Namespace,
prefix: Option<DOMString>, owner: Option<JSRef<Element>>) -> Temporary<Attr> {
prefix: Option<Atom>, owner: Option<JSRef<Element>>) -> Temporary<Attr> {
reflect_dom_object(
box Attr::new_inherited(local_name, value, name, namespace, prefix, owner),
GlobalRef::Window(window),
Expand All @@ -141,7 +141,7 @@ impl Attr {
}

#[inline]
pub fn prefix<'a>(&'a self) -> &'a Option<DOMString> {
pub fn prefix<'a>(&'a self) -> &'a Option<Atom> {
&self.prefix
}
}
Expand Down Expand Up @@ -205,7 +205,7 @@ impl<'a> AttrMethods for JSRef<'a, Attr> {

// https://dom.spec.whatwg.org/#dom-attr-prefix
fn GetPrefix(self) -> Option<DOMString> {
self.prefix.clone()
self.prefix().as_ref().map(|p| (**p).to_owned())
}

// https://dom.spec.whatwg.org/#dom-attr-ownerelement
Expand Down
5 changes: 2 additions & 3 deletions servo/components/script/dom/bindings/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ use util::str::DOMString;

use libc;
use libc::c_uint;
use std::borrow::ToOwned;
use std::boxed;
use std::cell::Cell;
use std::ffi::CString;
Expand Down Expand Up @@ -628,7 +627,7 @@ pub fn validate_qualified_name(qualified_name: &str) -> ErrorResult {


pub fn validate_and_extract(namespace: Option<DOMString>, qualified_name: &str)
-> Fallible<(Namespace, Option<DOMString>, Atom)> {
-> Fallible<(Namespace, Option<Atom>, Atom)> {

let namespace = namespace::from_domstring(namespace);

Expand Down Expand Up @@ -667,7 +666,7 @@ pub fn validate_and_extract(namespace: Option<DOMString>, qualified_name: &str)
},
(ns, p) => {
// Step 10.
Ok((ns, p.map(|s| s.to_owned()), Atom::from_slice(local_name)))
Ok((ns, p.map(Atom::from_slice), Atom::from_slice(local_name)))
}
}
}
Expand Down
8 changes: 4 additions & 4 deletions servo/components/script/dom/create.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,15 +76,15 @@ use dom::htmlulistelement::HTMLUListElement;
use dom::htmlunknownelement::HTMLUnknownElement;
use dom::htmlvideoelement::HTMLVideoElement;

use util::str::DOMString;

use string_cache::QualName;
use string_cache::{Atom, QualName};

use std::borrow::ToOwned;

pub fn create_element(name: QualName, prefix: Option<DOMString>,
pub fn create_element(name: QualName, prefix: Option<Atom>,
document: JSRef<Document>, creator: ElementCreator)
-> Temporary<Element> {
let prefix = prefix.map(|p| (*p).to_owned());

if name.ns != ns!(HTML) {
return Element::new((*name.local).to_owned(), name.ns, prefix, document);
}
Expand Down
15 changes: 7 additions & 8 deletions servo/components/script/dom/element.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ pub enum ElementCreator {


impl Element {
pub fn create(name: QualName, prefix: Option<DOMString>,
pub fn create(name: QualName, prefix: Option<Atom>,
document: JSRef<Document>, creator: ElementCreator)
-> Temporary<Element> {
create_element(name, prefix, document, creator)
Expand Down Expand Up @@ -670,12 +670,12 @@ pub trait AttributeHandlers {
fn set_attribute_from_parser(self,
name: QualName,
value: DOMString,
prefix: Option<DOMString>);
prefix: Option<Atom>);
fn set_attribute(self, name: &Atom, value: AttrValue);
fn set_custom_attribute(self, name: DOMString, value: DOMString) -> ErrorResult;
fn do_set_attribute<F>(self, local_name: Atom, value: AttrValue,
name: Atom, namespace: Namespace,
prefix: Option<DOMString>, cb: F)
prefix: Option<Atom>, cb: F)
where F: Fn(JSRef<Attr>) -> bool;
fn parse_attribute(self, namespace: &Namespace, local_name: &Atom,
value: DOMString) -> AttrValue;
Expand Down Expand Up @@ -743,7 +743,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
fn set_attribute_from_parser(self,
qname: QualName,
value: DOMString,
prefix: Option<DOMString>) {
prefix: Option<Atom>) {
// Don't set if the attribute already exists, so we can handle add_attrs_if_missing
if self.attrs.borrow().iter().map(|attr| attr.root())
.any(|a| *a.r().local_name() == qname.local && *a.r().namespace() == qname.ns) {
Expand All @@ -753,7 +753,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
let name = match prefix {
None => qname.local.clone(),
Some(ref prefix) => {
let name = format!("{}:{}", *prefix, &*qname.local);
let name = format!("{}:{}", &**prefix, &*qname.local);
Atom::from_slice(&name)
},
};
Expand Down Expand Up @@ -791,7 +791,7 @@ impl<'a> AttributeHandlers for JSRef<'a, Element> {
value: AttrValue,
name: Atom,
namespace: Namespace,
prefix: Option<DOMString>,
prefix: Option<Atom>,
cb: F)
where F: Fn(JSRef<Attr>) -> bool
{
Expand Down Expand Up @@ -1099,8 +1099,7 @@ impl<'a> ElementMethods for JSRef<'a, Element> {
let qualified_name = Atom::from_slice(&qualified_name);
let value = self.parse_attribute(&namespace, &local_name, value);
self.do_set_attribute(local_name.clone(), value, qualified_name,
namespace.clone(), prefix.map(|s| s.to_owned()),
|attr| {
namespace.clone(), prefix, |attr| {
*attr.local_name() == local_name &&
*attr.namespace() == namespace
});
Expand Down
4 changes: 2 additions & 2 deletions servo/components/script/dom/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ use std::iter::{FilterMap, Peekable};
use std::mem;
use std::sync::Arc;
use uuid;
use string_cache::QualName;
use string_cache::{Atom, QualName};



Expand Down Expand Up @@ -1735,7 +1735,7 @@ impl Node {
local: element.local_name().clone()
};
let element = Element::create(name,
element.prefix().as_ref().map(|p| (**p).to_owned()),
element.prefix().as_ref().map(|p| Atom::from_slice(&p)),
document.r(), ElementCreator::ScriptCreated);
NodeCast::from_temporary(element)
},
Expand Down

0 comments on commit fed7075

Please sign in to comment.