aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/html
diff options
context:
space:
mode:
authorMechaXL <mechaxl@gmail.com>2014-08-20 15:09:01 -0500
committerMs2ger <ms2ger@gmail.com>2014-09-04 13:44:02 +0200
commite2bfdb30a071069eca1658f755992ab9ca03bb26 (patch)
tree930f076f64c111763e2c3de647597bf66cf77398 /src/components/script/html
parentf7877008d25fe3dad23430bbf108d0440079fa34 (diff)
downloadservo-e2bfdb30a071069eca1658f755992ab9ca03bb26.tar.gz
servo-e2bfdb30a071069eca1658f755992ab9ca03bb26.zip
Implement document.lastModified (fixes #2972, #3127).
Diffstat (limited to 'src/components/script/html')
-rw-r--r--src/components/script/html/hubbub_html_parser.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs
index c71a8845826..8b49a2bae03 100644
--- a/src/components/script/html/hubbub_html_parser.rs
+++ b/src/components/script/html/hubbub_html_parser.rs
@@ -33,6 +33,8 @@ use std::cell::RefCell;
use std::comm::{channel, Sender, Receiver};
use style::Stylesheet;
use url::{Url, UrlParser};
+use http::headers::HeaderEnum;
+use time;
macro_rules! handle_element(
($document: expr,
@@ -158,6 +160,30 @@ fn js_script_listener(to_parent: Sender<HtmlDiscoveryMessage>,
assert!(to_parent.send_opt(HtmlDiscoveredScript(result_vec)).is_ok());
}
+// Parses an RFC 2616 compliant date/time string, and returns a localized
+// date/time string in a format suitable for document.lastModified.
+fn parse_last_modified(timestamp: &str) -> String {
+ let format = "%m/%d/%Y %H:%M:%S";
+
+ // RFC 822, updated by RFC 1123
+ match time::strptime(timestamp, "%a, %d %b %Y %T %Z") {
+ Ok(t) => return t.to_local().strftime(format),
+ Err(_) => ()
+ }
+
+ // RFC 850, obsoleted by RFC 1036
+ match time::strptime(timestamp, "%A, %d-%b-%y %T %Z") {
+ Ok(t) => return t.to_local().strftime(format),
+ Err(_) => ()
+ }
+
+ // ANSI C's asctime() format
+ match time::strptime(timestamp, "%c") {
+ Ok(t) => t.to_local().strftime(format),
+ Err(_) => String::from_str("")
+ }
+}
+
// Silly macros to handle constructing DOM nodes. This produces bad code and should be optimized
// via atomization (issue #85).
@@ -323,6 +349,18 @@ pub fn parse_html(page: &Page,
debug!("Fetched page; metadata is {:?}", load_response.metadata);
+ load_response.metadata.headers.map(|headers| {
+ let header = headers.iter().find(|h|
+ h.header_name().as_slice().to_ascii_lower() == "last-modified".to_string()
+ );
+
+ match header {
+ Some(h) => document.set_last_modified(
+ parse_last_modified(h.header_value().as_slice())),
+ None => {},
+ };
+ });
+
let base_url = &load_response.metadata.final_url;
{