diff options
author | Keith Yeung <kungfukeith11@gmail.com> | 2016-05-19 04:46:51 -0400 |
---|---|---|
committer | Keith Yeung <kungfukeith11@gmail.com> | 2016-05-19 04:46:51 -0400 |
commit | deadfa65cc1b73f541e109d3dca88de773620d50 (patch) | |
tree | 544df124ec6afda58e2f91d33745c7c4bd42494f /components/script/dom/htmlanchorelement.rs | |
parent | dea610986dbf4a1e5898cbe6b57832784e786f3a (diff) | |
download | servo-deadfa65cc1b73f541e109d3dca88de773620d50.tar.gz servo-deadfa65cc1b73f541e109d3dca88de773620d50.zip |
Fix panic from update_href in HTMLAnchorElement
Diffstat (limited to 'components/script/dom/htmlanchorelement.rs')
-rw-r--r-- | components/script/dom/htmlanchorelement.rs | 180 |
1 files changed, 106 insertions, 74 deletions
diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs index cae38b2b733..4b733dbdcbd 100644 --- a/components/script/dom/htmlanchorelement.rs +++ b/components/script/dom/htmlanchorelement.rs @@ -80,8 +80,8 @@ impl HTMLAnchorElement { } // https://html.spec.whatwg.org/multipage/#update-href - fn update_href(&self, url: &Url) { - self.upcast::<Element>().set_string_attribute(&atom!("href"), DOMString::from(url.as_str())); + fn update_href(&self, url: DOMString) { + self.upcast::<Element>().set_string_attribute(&atom!("href"), url); } } @@ -160,14 +160,19 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 1. self.reinitialize_url(); - // Step 3. - if let Some(url) = self.url.borrow_mut().as_mut() { - if url.scheme() == "javascript" { return; } + // Step 2. + let url = match self.url.borrow_mut().as_mut() { + // Step 3. + Some(ref url) if url.scheme() == "javascript" => return, + None => return, // Steps 4-5. - UrlHelper::SetHash(url, value); - // Step 6. - self.update_href(url); - } + Some(url) => { + UrlHelper::SetHash(url, value); + DOMString::from(url.as_str()) + } + }; + // Step 6. + self.update_href(url); } // https://html.spec.whatwg.org/multipage/#dom-hyperlink-host @@ -194,16 +199,19 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 1. self.reinitialize_url(); - // Step 3. - if let Some(url) = self.url.borrow_mut().as_mut() { - if url.cannot_be_a_base() { - return; - } + // Step 2. + let url = match self.url.borrow_mut().as_mut() { + // Step 3. + Some(ref url) if url.cannot_be_a_base() => return, + None => return, // Step 4. - UrlHelper::SetHost(url, value); - // Step 5. - self.update_href(url); - } + Some(url) => { + UrlHelper::SetHost(url, value); + DOMString::from(url.as_str()) + } + }; + // Step 5. + self.update_href(url); } // https://html.spec.whatwg.org/multipage/#dom-hyperlink-hostname @@ -226,16 +234,19 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 1. self.reinitialize_url(); - // Step 3. - if let Some(url) = self.url.borrow_mut().as_mut() { - if url.cannot_be_a_base() { - return; - } + // Step 2. + let url = match self.url.borrow_mut().as_mut() { + // Step 3. + Some(ref url) if url.cannot_be_a_base() => return, + None => return, // Step 4. - UrlHelper::SetHostname(url, value); - // Step 5. - self.update_href(url); - } + Some(url) => { + UrlHelper::SetHostname(url, value); + DOMString::from(url.as_str()) + } + }; + // Step 5. + self.update_href(url); } // https://html.spec.whatwg.org/multipage/#dom-hyperlink-href @@ -282,16 +293,19 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 1. self.reinitialize_url(); - // Step 3. - if let Some(url) = self.url.borrow_mut().as_mut() { - if url.host().is_none() || url.cannot_be_a_base() { - return; - } + // Step 2. + let url = match self.url.borrow_mut().as_mut() { + // Step 3. + Some(ref url) if url.host().is_none() || url.cannot_be_a_base() => return, + None => return, // Step 4. - UrlHelper::SetPassword(url, value); - // Step 5. - self.update_href(url); - } + Some(url) => { + UrlHelper::SetPassword(url, value); + DOMString::from(url.as_str()) + } + }; + // Step 5. + self.update_href(url); } // https://html.spec.whatwg.org/multipage/#dom-hyperlink-pathname @@ -312,14 +326,19 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 1. self.reinitialize_url(); - // Step 3. - if let Some(url) = self.url.borrow_mut().as_mut() { - if url.cannot_be_a_base() { return; } + // Step 2. + let url = match self.url.borrow_mut().as_mut() { + // Step 3. + Some(ref url) if url.cannot_be_a_base() => return, + None => return, // Step 5. - UrlHelper::SetPathname(url, value); - // Step 6. - self.update_href(url); - } + Some(url) => { + UrlHelper::SetPathname(url, value); + DOMString::from(url.as_str()) + } + }; + // Step 6. + self.update_href(url); } // https://html.spec.whatwg.org/multipage/#dom-hyperlink-port @@ -341,17 +360,19 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { self.reinitialize_url(); // Step 3. - if let Some(url) = self.url.borrow_mut().as_mut() { - if url.host().is_none() || + let url = match self.url.borrow_mut().as_mut() { + Some(ref url) if url.host().is_none() || url.cannot_be_a_base() || - url.scheme() == "file" { - return; - } + url.scheme() == "file" => return, + None => return, // Step 4. - UrlHelper::SetPort(url, value); - // Step 5. - self.update_href(url); - } + Some(url) => { + UrlHelper::SetPort(url, value); + DOMString::from(url.as_str()) + } + }; + // Step 5. + self.update_href(url); } // https://html.spec.whatwg.org/multipage/#dom-hyperlink-protocol @@ -372,13 +393,17 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 1. self.reinitialize_url(); - // Step 2. - if let Some(url) = self.url.borrow_mut().as_mut() { + let url = match self.url.borrow_mut().as_mut() { + // Step 2. + None => return, // Step 3. - UrlHelper::SetProtocol(url, value); - // Step 4. - self.update_href(url); - } + Some(url) => { + UrlHelper::SetProtocol(url, value); + DOMString::from(url.as_str()) + } + }; + // Step 4. + self.update_href(url); } // https://html.spec.whatwg.org/multipage/#dom-hyperlink-search @@ -399,15 +424,20 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 1. self.reinitialize_url(); - // Step 3. - if let Some(url) = self.url.borrow_mut().as_mut() { + // Step 2. + let url = match self.url.borrow_mut().as_mut() { + // Step 3. + None => return, // Steps 4-5. // TODO add this element's node document character encoding as // encoding override (as described in the spec) - UrlHelper::SetSearch(url, value); - // Step 6. - self.update_href(url); - } + Some(url) => { + UrlHelper::SetSearch(url, value); + DOMString::from(url.as_str()) + } + }; + // Step 6. + self.update_href(url); } // https://html.spec.whatwg.org/multipage/#dom-hyperlink-username @@ -428,17 +458,19 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 1. self.reinitialize_url(); - // Step 3. - if let Some(url) = self.url.borrow_mut().as_mut() { - if url.host().is_none() || url.cannot_be_a_base() { - return; - } - + // Step 2. + let url = match self.url.borrow_mut().as_mut() { + // Step 3. + Some(ref url) if url.host().is_none() || url.cannot_be_a_base() => return, + None => return, // Step 4. - UrlHelper::SetUsername(url, value); - // Step 5. - self.update_href(url); - } + Some(url) => { + UrlHelper::SetUsername(url, value); + DOMString::from(url.as_str()) + } + }; + // Step 5. + self.update_href(url); } // https://html.spec.whatwg.org/multipage/#dom-hyperlink-href |