From 3b3f3f8b8ad8f068b771174754cc2930f8d11cf0 Mon Sep 17 00:00:00 2001 From: Junyoung Cho Date: Thu, 22 Aug 2013 19:05:21 +0900 Subject: [PATCH 01/29] Implement 'vertical-align' and fix 'line-height'. --- src/components/main/layout/box.rs | 6 +- src/components/main/layout/inline.rs | 227 +++++++++++++++++++++------ 2 files changed, 183 insertions(+), 50 deletions(-) diff --git a/src/components/main/layout/box.rs b/src/components/main/layout/box.rs index 2d30a2d584b..844e37954f5 100644 --- a/src/components/main/layout/box.rs +++ b/src/components/main/layout/box.rs @@ -30,7 +30,7 @@ use newcss::units::{Cursive, Fantasy, Monospace, SansSerif, Serif}; use newcss::values::{CSSClearNone, CSSClearLeft, CSSClearRight, CSSClearBoth}; use newcss::values::{CSSFontFamilyFamilyName, CSSFontFamilyGenericFamily}; use newcss::values::{CSSFontSizeLength, CSSFontStyleItalic, CSSFontStyleNormal}; -use newcss::values::{CSSFontStyleOblique, CSSTextAlign, CSSTextDecoration, CSSLineHeight}; +use newcss::values::{CSSFontStyleOblique, CSSTextAlign, CSSTextDecoration, CSSLineHeight, CSSVerticalAlign}; use newcss::values::{CSSTextDecorationNone, CSSFloatNone, CSSPositionStatic}; use newcss::values::{CSSDisplayInlineBlock, CSSDisplayInlineTable}; use script::dom::node::{AbstractNode, LayoutView}; @@ -817,6 +817,10 @@ impl RenderBox { self.nearest_ancestor_element().style().line_height() } + pub fn vertical_align(&self) -> CSSVerticalAlign { + self.nearest_ancestor_element().style().vertical_align() + } + /// Returns the text decoration of the computed style of the nearest `Element` node pub fn text_decoration(&self) -> CSSTextDecoration { /// Computes the propagated value of text-decoration, as specified in CSS 2.1 § 16.3.1 diff --git a/src/components/main/layout/inline.rs b/src/components/main/layout/inline.rs index 08119ee308c..60b940130a2 100644 --- a/src/components/main/layout/inline.rs +++ b/src/components/main/layout/inline.rs @@ -2,6 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +use css::node_style::StyledNode; use std::cell::Cell; use layout::box::{CannotSplit, GenericRenderBoxClass, ImageRenderBoxClass, RenderBox}; use layout::box::{SplitDidFit, SplitDidNotFit, TextRenderBoxClass}; @@ -17,9 +18,13 @@ use std::util; use geom::{Point2D, Rect, Size2D}; use gfx::display_list::DisplayList; use gfx::geometry::Au; -use newcss::values::{CSSTextAlignLeft, CSSTextAlignCenter, CSSTextAlignRight, CSSTextAlignJustify}; use newcss::units::{Em, Px}; +use newcss::values::{CSSFontSizeLength}; +use newcss::values::{CSSTextAlignLeft, CSSTextAlignCenter, CSSTextAlignRight, CSSTextAlignJustify}; use newcss::values::{CSSLineHeightNormal, CSSLineHeightNumber, CSSLineHeightLength, CSSLineHeightPercentage}; +use newcss::values::{CSSVerticalAlignBaseline, CSSVerticalAlignMiddle, CSSVerticalAlignSub, CSSVerticalAlignSuper, + CSSVerticalAlignTextTop, CSSVerticalAlignTextBottom, CSSVerticalAlignTop, CSSVerticalAlignBottom, + CSSVerticalAlignLength, CSSVerticalAlignPercentage}; use servo_util::range::Range; use servo_util::tree::TreeNodeRef; use extra::container::Deque; @@ -164,6 +169,16 @@ impl LineboxScanner { self.reset_linebox(); } + fn calculate_line_height(&self, box: RenderBox, font_size: Au) -> Au { + match box.line_height() { + CSSLineHeightNormal => font_size.scale_by(1.14f), + CSSLineHeightNumber(l) => font_size.scale_by(l), + CSSLineHeightLength(Em(l)) => font_size.scale_by(l), + CSSLineHeightLength(Px(l)) => Au::from_frac_px(l), + CSSLineHeightPercentage(p) => font_size.scale_by(p / 100.0f) + } + } + fn box_height(&self, box: RenderBox) -> Au { match box { ImageRenderBoxClass(image_box) => { @@ -180,13 +195,7 @@ impl LineboxScanner { // Compute the height based on the line-height and font size let text_bounds = run.metrics_for_range(range).bounding_box; let em_size = text_bounds.size.height; - let line_height = match box.line_height() { - CSSLineHeightNormal => em_size.scale_by(1.14f), - CSSLineHeightNumber(l) => em_size.scale_by(l), - CSSLineHeightLength(Em(l)) => em_size.scale_by(l), - CSSLineHeightLength(Px(l)) => Au::from_frac_px(l), - CSSLineHeightPercentage(p) => em_size.scale_by(p / 100.0f) - }; + let line_height = self.calculate_line_height(box, em_size); line_height } @@ -654,78 +663,198 @@ impl InlineFlowData { } }; + let mut topmost = Au(0); + let mut bottommost = Au(0); + // bottommost of boxes with 'top' value + let mut bottommost_of_top = Au(0); + // topmost of boxes with 'bottom' value + let mut topmost_of_bottom = Au(0); - // Get the baseline offset, assuming that the tallest text box will determine - // the baseline. - let mut baseline_offset = Au(0); - let mut max_height = Au(0); for box_i in line.range.eachi() { let cur_box = self.boxes[box_i]; - match cur_box { + let (top_from_base, bottom_from_base, ascent) = match cur_box { ImageRenderBoxClass(image_box) => { let size = image_box.image.get_size(); - let height = Au::from_px(size.unwrap_or_default(Size2D(0, 0)).height); + let mut height = Au::from_px(size.unwrap_or_default(Size2D(0, 0)).height); + + // TODO: margin, border, padding's top and bottom should be calculated in advance, + // since baseline of image is bottom margin edge. + let mut top = Au(0); + let mut bottom = Au(0); + do cur_box.with_model |model| { + top = model.border.top + model.padding.top + model.margin.top; + bottom = model.border.bottom + model.padding.bottom + model.margin.bottom; + } + let noncontent_height = top + bottom; + height = height + noncontent_height; image_box.base.position.size.height = height; + image_box.base.position.translate(&Point2D(Au(0), -height)); - image_box.base.position.translate(&Point2D(Au(0), -height)) - } + let ascent = height + bottom; + (height, Au(0), ascent) + }, TextRenderBoxClass(text_box) => { - let range = &text_box.range; let run = &text_box.run; // Compute the height based on the line-height and font size let text_bounds = run.metrics_for_range(range).bounding_box; let em_size = text_bounds.size.height; - let line_height = match cur_box.line_height() { - CSSLineHeightNormal => em_size.scale_by(1.14f), - CSSLineHeightNumber(l) => em_size.scale_by(l), - CSSLineHeightLength(Em(l)) => em_size.scale_by(l), - CSSLineHeightLength(Px(l)) => Au::from_frac_px(l), - CSSLineHeightPercentage(p) => em_size.scale_by(p / 100.0f) - }; + let line_height = scanner.calculate_line_height(cur_box, em_size); - // If this is the current tallest box then use it for baseline - // calculations. - // TODO: this will need to take into account type of line-height - // and the vertical-align value. - if line_height > max_height { - max_height = line_height; - let linebox_height = line.bounds.size.height; - // Offset from the top of the linebox is 1/2 of the leading + ascent - baseline_offset = text_box.run.font.metrics.ascent + - (linebox_height - em_size).scale_by(0.5f); - } - text_bounds.translate(&Point2D(text_box.base.position.origin.x, Au(0))) - } + // Find the top and bottom of the content area. + // Those are used in text-top and text-bottom value of 'vertex-align' + let text_ascent = text_box.run.font.metrics.ascent; + + // Offset from the top of the box is 1/2 of the leading + ascent + let text_offset = text_ascent + (line_height - em_size).scale_by(0.5f); + text_bounds.translate(&Point2D(text_box.base.position.origin.x, Au(0))); + + (text_offset, line_height - text_offset, text_ascent) + }, GenericRenderBoxClass(generic_box) => { - generic_box.position - } + (generic_box.position.size.height, Au(0), generic_box.position.size.height) + }, // FIXME(pcwalton): This isn't very type safe! _ => { fail!(fmt!("Tried to assign height to unknown Box variant: %s", cur_box.debug_str())) } }; + let mut top_from_base = top_from_base; + let mut bottom_from_base = bottom_from_base; + + // TODO: We should find the top and bottom of the content area of parent box. + // Those are used in text-top and text-bottom value of 'vertex-align'. + // Assume that top is font_size of parent and bottom is 0. + let mut parent_text_top = Au(0); + let parent_text_bottom = Au(0); + do cur_box.with_mut_base |base| { + //get parent node + let mut parent = base.node; + match base.node.parent_node() { + None => {}, + Some(parent_node) => parent = parent_node + } + let font_size = match parent.style().font_size() { + CSSFontSizeLength(Px(length)) => length, + // todo: this is based on a hard coded font size, should be the parent element's font size + CSSFontSizeLength(Em(length)) => length * 16f, + _ => 16f // px units + }; + parent_text_top = Au::from_frac_px(font_size); + } + + let mut no_update_flag = false; + let offset = match cur_box.vertical_align() { + CSSVerticalAlignBaseline => { + -ascent + }, + CSSVerticalAlignMiddle => { + // TODO: x-height value should be used from font info. + let xheight = Au(0); + -(xheight + scanner.box_height(cur_box)).scale_by(0.5) + }, + CSSVerticalAlignSub => { + // TODO: The proper position for subscripts should be used. + // Lower the baseline to the proper position for subscripts + let sub_offset = Au(0); + (sub_offset - ascent) + }, + CSSVerticalAlignSuper => { + // TODO: The proper position for superscripts should be used. + // Raise the baseline to the proper position for superscripts + let super_offset = Au(0); + (-super_offset - ascent) + }, + CSSVerticalAlignTextTop => { + let box_height = top_from_base + bottom_from_base; + let prev_bottom_from_base = bottom_from_base; + top_from_base = parent_text_top; + bottom_from_base = box_height - top_from_base; + (bottom_from_base - prev_bottom_from_base - ascent) + }, + CSSVerticalAlignTextBottom => { + let box_height = top_from_base + bottom_from_base; + let prev_bottom_from_base = bottom_from_base; + bottom_from_base = parent_text_bottom; + top_from_base = box_height - bottom_from_base; + (bottom_from_base - prev_bottom_from_base - ascent) + }, + CSSVerticalAlignTop => { + if bottommost_of_top < (top_from_base + bottom_from_base) { + bottommost_of_top = top_from_base + bottom_from_base; + } + let offset_top = top_from_base - ascent; + no_update_flag = true; + offset_top + }, + CSSVerticalAlignBottom => { + if topmost_of_bottom < (top_from_base + bottom_from_base) { + topmost_of_bottom = top_from_base + bottom_from_base; + } + let offset_bottom = -(bottom_from_base + ascent); + no_update_flag = true; + offset_bottom + }, + CSSVerticalAlignLength(length) => { + let length_offset = match length { + Em(l) => Au::from_frac_px(cur_box.font_style().pt_size * l), + Px(l) => Au::from_frac_px(l), + }; + -(length_offset + ascent) + }, + CSSVerticalAlignPercentage(p) => { + let pt_size = cur_box.font_style().pt_size; + let line_height = scanner.calculate_line_height(cur_box, Au::from_pt(pt_size)); + let percent_offset = line_height.scale_by(p / 100.0f); + -(percent_offset + ascent) + } + }; + + if !no_update_flag && top_from_base > topmost { + topmost = top_from_base; + } + if !no_update_flag && bottom_from_base > bottommost { + bottommost = bottom_from_base; + } + + do cur_box.with_mut_base |base| { + base.position.origin.y = line.bounds.origin.y + offset; + } } - // Now go back and adjust the Y coordinates to match the baseline we determined. + //Offset of boxes with 'bottom' value. + topmost_of_bottom = topmost_of_bottom - bottommost; + if topmost_of_bottom > topmost { + topmost = topmost_of_bottom; + } + + //Offset of boxes with 'top' value. + bottommost_of_top = bottommost_of_top - topmost; + if bottommost_of_top > bottommost { + //topmost_of_bottom = topmost_of_bottom - (bottommost_of_top - bottommost); + bottommost = bottommost_of_top; + } + + let baseline_offset = topmost; for box_i in line.range.eachi() { let cur_box = self.boxes[box_i]; - - // TODO(#226): This is completely wrong. We need to use the element's `line-height` - // when calculating line box height. Then we should go back over and set Y offsets - // according to the `vertical-align` property of the containing block. - let offset = match cur_box { - TextRenderBoxClass(text_box) => { - baseline_offset - text_box.run.font.metrics.ascent + let adjust_offset = match cur_box.vertical_align() { + CSSVerticalAlignTop => { + Au(0) }, - _ => Au(0), + CSSVerticalAlignBottom => { + baseline_offset + bottommost + }, + _ => { + baseline_offset + } }; do cur_box.with_mut_base |base| { - base.position.origin.y = offset + line.bounds.origin.y; + base.position.origin.y = base.position.origin.y + adjust_offset; } } } // End of `lines.each` loop. From 127c7b9066c8b18fb3687e0e264c13162b05b43b Mon Sep 17 00:00:00 2001 From: Junyoung Cho Date: Thu, 22 Aug 2013 19:17:53 +0900 Subject: [PATCH 02/29] Add a test case for vertical_align and line-height --- src/test/html/lineheight-simple.css | 2 +- src/test/html/lineheight-simple.html | 2 +- src/test/html/vertical_align_simple.html | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 src/test/html/vertical_align_simple.html diff --git a/src/test/html/lineheight-simple.css b/src/test/html/lineheight-simple.css index bd8510f8061..6baa2fa488a 100644 --- a/src/test/html/lineheight-simple.css +++ b/src/test/html/lineheight-simple.css @@ -5,6 +5,6 @@ #larger2 { font-size: 30px; - line-height: 1; + line-height: 3; } diff --git a/src/test/html/lineheight-simple.html b/src/test/html/lineheight-simple.html index ed18ccdac80..f9c748da88b 100644 --- a/src/test/html/lineheight-simple.html +++ b/src/test/html/lineheight-simple.html @@ -5,6 +5,6 @@
Regular font Even larger with line-height 2
-
Large line 2!
+
line-height 3!
diff --git a/src/test/html/vertical_align_simple.html b/src/test/html/vertical_align_simple.html new file mode 100644 index 00000000000..a33ca2135ad --- /dev/null +++ b/src/test/html/vertical_align_simple.html @@ -0,0 +1,24 @@ + + + + +

+ [test1] baseline +

+

+ [test2] vertical-align:top +

+

+ [test3] vertical-align:middle +

+

+ [test4] vertical-align:bottom +

+

+ [test5] img=>text-top +

+

+ [test6] img=>text-bottom +

+ + From 672d7f1c317077246d700d2d58c439a2df9266ae Mon Sep 17 00:00:00 2001 From: Junyoung Cho Date: Thu, 22 Aug 2013 20:06:48 +0900 Subject: [PATCH 03/29] Update linebox's height which is changed by vertical-align. --- src/components/main/layout/inline.rs | 10 +++++++++- src/test/html/test-lineheight-verticalalign.html | 13 +++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 src/test/html/test-lineheight-verticalalign.html diff --git a/src/components/main/layout/inline.rs b/src/components/main/layout/inline.rs index 60b940130a2..44d5595444e 100644 --- a/src/components/main/layout/inline.rs +++ b/src/components/main/layout/inline.rs @@ -609,8 +609,10 @@ impl InlineFlowData { let mut scanner = LineboxScanner::new(scanner_floats); scanner.scan_for_lines(self); + let mut line_height_offset = Au(0); + // Now, go through each line and lay out the boxes inside - for line in self.lines.iter() { + for line in self.lines.mut_iter() { // We need to distribute extra width based on text-align. let mut slack_width = line.green_zone.width - line.bounds.size.width; if slack_width < Au(0) { @@ -663,6 +665,10 @@ impl InlineFlowData { } }; + // Update the line's y position before setting the box's y position + // since the previous line's height can be modified. + line.bounds.origin.y = line.bounds.origin.y + line_height_offset; + let mut topmost = Au(0); let mut bottommost = Au(0); // bottommost of boxes with 'top' value @@ -857,6 +863,8 @@ impl InlineFlowData { base.position.origin.y = base.position.origin.y + adjust_offset; } } + line_height_offset = topmost + bottommost - line.bounds.size.height; + line.bounds.size.height = topmost + bottommost; } // End of `lines.each` loop. self.common.position.size.height = diff --git a/src/test/html/test-lineheight-verticalalign.html b/src/test/html/test-lineheight-verticalalign.html new file mode 100644 index 00000000000..e9fcd0019f3 --- /dev/null +++ b/src/test/html/test-lineheight-verticalalign.html @@ -0,0 +1,13 @@ + + + + + +
[line-height 10] + [line-height:3 + vertical-align:top] + [line-height:1 + vertical-align:top] + [Split inline, still line-height 5] +
+
New line, line-height 3
+ + From 8cd9a6ba87e6d7abb730d50c6d1da5d120a09056 Mon Sep 17 00:00:00 2001 From: Junyoung Cho Date: Fri, 23 Aug 2013 18:32:18 +0900 Subject: [PATCH 04/29] Fix the line-height error in a multi-line page --- src/components/main/layout/inline.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/main/layout/inline.rs b/src/components/main/layout/inline.rs index 44d5595444e..892cc532b63 100644 --- a/src/components/main/layout/inline.rs +++ b/src/components/main/layout/inline.rs @@ -863,7 +863,7 @@ impl InlineFlowData { base.position.origin.y = base.position.origin.y + adjust_offset; } } - line_height_offset = topmost + bottommost - line.bounds.size.height; + line_height_offset = line_height_offset + topmost + bottommost - line.bounds.size.height; line.bounds.size.height = topmost + bottommost; } // End of `lines.each` loop. From e84c1274005b1a74f6ddc2f74cd2175fc4ebb6f9 Mon Sep 17 00:00:00 2001 From: eschweic Date: Mon, 26 Aug 2013 21:11:34 -0400 Subject: [PATCH 05/29] Initial compositor support for position:fixed elements --- .../main/compositing/compositor_layer.rs | 63 ++++++++++++------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/src/components/main/compositing/compositor_layer.rs b/src/components/main/compositing/compositor_layer.rs index 53403578187..e1a5324ef3e 100644 --- a/src/components/main/compositing/compositor_layer.rs +++ b/src/components/main/compositing/compositor_layer.rs @@ -47,6 +47,8 @@ pub struct CompositorLayer { /// A monotonically increasing counter that keeps track of the current epoch. /// add_buffer() calls that don't match the current epoch will be ignored. epoch: Epoch, + /// The behavior of this layer when a scroll message is received. + scroll_behavior: ScrollBehavior, } /// Helper struct for keeping CompositorLayer children organized. @@ -65,6 +67,16 @@ enum MaybeQuadtree { NoTree(uint, Option), } +/// Determines the behavior of the layer when a scroll message is recieved. +enum ScrollBehavior { + /// Normal scrolling behavior. + Scroll, + /// Scrolling messages targeted at this layer are ignored, but can be + /// passed on to child layers. + FixedPosition, +} + + impl CompositorLayer { /// Creates a new CompositorLayer with an optional page size. If no page size is given, /// the layer is initially hidden and initialized without a quadtree. @@ -85,6 +97,7 @@ impl CompositorLayer { root_layer: @mut ContainerLayer(), hidden: true, epoch: Epoch(0), + scroll_behavior: Scroll, } } @@ -141,29 +154,35 @@ impl CompositorLayer { } } - // Scroll this layer! - let old_origin = self.scroll_offset; - self.scroll_offset = self.scroll_offset + delta; - - // bounds checking - let page_size = match self.page_size { - Some(size) => size, - None => fail!("CompositorLayer: tried to scroll with no page size set"), - }; - let min_x = (window_size.width - page_size.width).min(&0.0); - self.scroll_offset.x = self.scroll_offset.x.clamp(&min_x, &0.0); - let min_y = (window_size.height - page_size.height).min(&0.0); - self.scroll_offset.y = self.scroll_offset.y.clamp(&min_y, &0.0); - - // check to see if we scrolled - if old_origin - self.scroll_offset == Point2D(0f32, 0f32) { - return false; - } + // This scroll event is mine! + match self.scroll_behavior { + Scroll => { + // Scroll this layer! + let old_origin = self.scroll_offset; + self.scroll_offset = self.scroll_offset + delta; - self.root_layer.common.set_transform(identity().translate(self.scroll_offset.x, - self.scroll_offset.y, - 0.0)); - true + // bounds checking + let page_size = match self.page_size { + Some(size) => size, + None => fail!("CompositorLayer: tried to scroll with no page size set"), + }; + let min_x = (window_size.width - page_size.width).min(&0.0); + self.scroll_offset.x = self.scroll_offset.x.clamp(&min_x, &0.0); + let min_y = (window_size.height - page_size.height).min(&0.0); + self.scroll_offset.y = self.scroll_offset.y.clamp(&min_y, &0.0); + + // check to see if we scrolled + if old_origin - self.scroll_offset == Point2D(0f32, 0f32) { + return false; + } + + self.root_layer.common.set_transform(identity().translate(self.scroll_offset.x, + self.scroll_offset.y, + 0.0)); + true + } + FixedPosition => false, // Ignore this scroll event. + } } // Takes in a MouseWindowEvent, determines if it should be passed to children, and From 729ac0c79609de1a1ac24d0c7b99c5c3c0b47f9d Mon Sep 17 00:00:00 2001 From: Junyoung Cho Date: Tue, 27 Aug 2013 18:19:37 +0900 Subject: [PATCH 06/29] Fix and add comments. Use `map_default`. --- src/components/main/layout/inline.rs | 66 ++++++++++++++++++---------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/src/components/main/layout/inline.rs b/src/components/main/layout/inline.rs index 892cc532b63..418c5fce73f 100644 --- a/src/components/main/layout/inline.rs +++ b/src/components/main/layout/inline.rs @@ -665,16 +665,19 @@ impl InlineFlowData { } }; - // Update the line's y position before setting the box's y position - // since the previous line's height can be modified. + // Set the top y position of the current linebox. + // `line_height_offset` is updated at the end of the previous loop. line.bounds.origin.y = line.bounds.origin.y + line_height_offset; + // Calculate the distance from baseline to the top of the linebox. let mut topmost = Au(0); + // Calculate the distance from baseline to the bottom of the linebox. let mut bottommost = Au(0); - // bottommost of boxes with 'top' value - let mut bottommost_of_top = Au(0); - // topmost of boxes with 'bottom' value - let mut topmost_of_bottom = Au(0); + + // Calculate the biggest height among boxes with 'top' value. + let mut biggest_top = Au(0); + // Calculate the biggest height among boxes with 'bottom' value. + let mut biggest_bottom = Au(0); for box_i in line.range.eachi() { let cur_box = self.boxes[box_i]; @@ -731,18 +734,22 @@ impl InlineFlowData { let mut top_from_base = top_from_base; let mut bottom_from_base = bottom_from_base; - // TODO: We should find the top and bottom of the content area of parent box. - // Those are used in text-top and text-bottom value of 'vertex-align'. - // Assume that top is font_size of parent and bottom is 0. + // To calculate text-top and text-bottom value of 'vertex-align', + // we should find the top and bottom of the content area of parent box. + // The content area is defined in "http://www.w3.org/TR/CSS2/visudet.html#inline-non-replaced". + // TODO: We should extract em-box info from font size of parent + // and calcuate the distances from baseline to the top and the bottom of parent's content area. + + // It should calculate the distance from baseline to the top of parent's content area. + // But, it is assumed now as font size of parent. let mut parent_text_top = Au(0); + // It should calculate the distance from baseline to the bottom of parent's content area. + // But, it is assumed now as 0. let parent_text_bottom = Au(0); do cur_box.with_mut_base |base| { - //get parent node - let mut parent = base.node; - match base.node.parent_node() { - None => {}, - Some(parent_node) => parent = parent_node - } + // Get parent node + let parent = base.node.parent_node().map_default(base.node, |parent| *parent); + // TODO: When the calculation of font-size style is supported, it should be updated. let font_size = match parent.style().font_size() { CSSFontSizeLength(Px(length)) => length, // todo: this is based on a hard coded font size, should be the parent element's font size @@ -752,7 +759,10 @@ impl InlineFlowData { parent_text_top = Au::from_frac_px(font_size); } + // This flag decides whether topmost and bottommost are updated or not. + // That is, if the box has top or bottom value, no_update_flag becomes true. let mut no_update_flag = false; + // Calculate a relative offset from baseline. let offset = match cur_box.vertical_align() { CSSVerticalAlignBaseline => { -ascent @@ -789,16 +799,16 @@ impl InlineFlowData { (bottom_from_base - prev_bottom_from_base - ascent) }, CSSVerticalAlignTop => { - if bottommost_of_top < (top_from_base + bottom_from_base) { - bottommost_of_top = top_from_base + bottom_from_base; + if biggest_top < (top_from_base + bottom_from_base) { + biggest_top = top_from_base + bottom_from_base; } let offset_top = top_from_base - ascent; no_update_flag = true; offset_top }, CSSVerticalAlignBottom => { - if topmost_of_bottom < (top_from_base + bottom_from_base) { - topmost_of_bottom = top_from_base + bottom_from_base; + if biggest_bottom < (top_from_base + bottom_from_base) { + biggest_bottom = top_from_base + bottom_from_base; } let offset_bottom = -(bottom_from_base + ascent); no_update_flag = true; @@ -819,6 +829,8 @@ impl InlineFlowData { } }; + // If the current box has 'top' or 'bottom' value, no_update_flag is true. + // Otherwise, topmost and bottomost are updated. if !no_update_flag && top_from_base > topmost { topmost = top_from_base; } @@ -831,20 +843,24 @@ impl InlineFlowData { } } - //Offset of boxes with 'bottom' value. - topmost_of_bottom = topmost_of_bottom - bottommost; + // Calculate the distance from baseline to the top of the biggest box with 'bottom' value. + // Then, if necessary, update the topmost. + let topmost_of_bottom = biggest_bottom - bottommost; if topmost_of_bottom > topmost { topmost = topmost_of_bottom; } - //Offset of boxes with 'top' value. - bottommost_of_top = bottommost_of_top - topmost; + // Calculate the distance from baseline to the bottom of the biggest box with 'top' value. + // Then, if necessary, update the bottommost. + let bottommost_of_top = biggest_top - topmost; if bottommost_of_top > bottommost { - //topmost_of_bottom = topmost_of_bottom - (bottommost_of_top - bottommost); bottommost = bottommost_of_top; } + // Now, the baseline offset from the top of linebox is set as topmost. let baseline_offset = topmost; + + // All boxes' y position is updated following the new baseline offset. for box_i in line.range.eachi() { let cur_box = self.boxes[box_i]; let adjust_offset = match cur_box.vertical_align() { @@ -863,6 +879,8 @@ impl InlineFlowData { base.position.origin.y = base.position.origin.y + adjust_offset; } } + + // This is used to set the top y position of the next linebox in the next loop. line_height_offset = line_height_offset + topmost + bottommost - line.bounds.size.height; line.bounds.size.height = topmost + bottommost; } // End of `lines.each` loop. From d31e308d3fd0f15d50865a003cc00d32f3a567c3 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Tue, 27 Aug 2013 17:36:37 -0400 Subject: [PATCH 07/29] Remove many long ugly lists of imports of HTML element types. They can now be obtained via dom::types::*, which is autogenerated. --- .../script/dom/bindings/codegen/Bindings.conf | 8 +- .../dom/bindings/codegen/CodegenRust.py | 83 ++----- .../script/dom/bindings/codegen/GlobalGen.py | 6 + src/components/script/dom/bindings/element.rs | 123 ++++++++++ src/components/script/dom/bindings/node.rs | 47 +--- src/components/script/dom/bindings/text.rs | 3 +- src/components/script/dom/document.rs | 6 +- src/components/script/dom/domparser.rs | 3 +- src/components/script/dom/element.rs | 222 +----------------- src/components/script/dom/htmldivelement.rs | 19 ++ src/components/script/dom/htmlformelement.rs | 9 + src/components/script/dom/htmlheadelement.rs | 9 + src/components/script/dom/htmlhtmlelement.rs | 19 ++ .../script/dom/htmlparagraphelement.rs | 19 ++ src/components/script/dom/htmlspanelement.rs | 9 + src/components/script/dom/node.rs | 46 +--- src/components/script/dom/text.rs | 55 +++++ .../script/html/hubbub_html_parser.rs | 54 +---- src/components/script/script.rc | 82 ++----- 19 files changed, 327 insertions(+), 495 deletions(-) create mode 100644 src/components/script/dom/htmldivelement.rs create mode 100644 src/components/script/dom/htmlformelement.rs create mode 100644 src/components/script/dom/htmlheadelement.rs create mode 100644 src/components/script/dom/htmlhtmlelement.rs create mode 100644 src/components/script/dom/htmlparagraphelement.rs create mode 100644 src/components/script/dom/htmlspanelement.rs create mode 100644 src/components/script/dom/text.rs diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 2ee86c3cca1..a06d1f2d989 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -230,6 +230,12 @@ DOMInterfaces = { 'pointerType': '', }, +'HTMLFormElement': { + 'nativeType': 'AbstractNode', + 'pointerType': '', + 'register': False +}, + 'HTMLOptionsCollection': [ { 'nativeType': 'nsHTMLOptionCollection', @@ -565,7 +571,7 @@ addHTMLElement('HTMLElement') addHTMLElement('HTMLEmbedElement') addHTMLElement('HTMLFieldSetElement') addHTMLElement('HTMLFontElement') -addHTMLElement('HTMLFormElement') +#addHTMLElement('HTMLFormElement') addHTMLElement('HTMLFrameElement') addHTMLElement('HTMLFrameSetElement') addHTMLElement('HTMLHeadElement') diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index c9dc5d28aee..e524f927e47 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -4612,75 +4612,15 @@ class CGBindingRoot(CGThing): 'js::jsapi::*', 'js::jsfriendapi::bindgen::*', 'js::glue::*', - 'dom::characterdata::CharacterData', #XXXjdm - 'dom::node::{AbstractNode, Node, Text}', #XXXjdm - 'dom::document::{Document, AbstractDocument}', #XXXjdm - 'dom::element::{Element, HTMLHeadElement, HTMLHtmlElement}', #XXXjdm - 'dom::element::{HTMLDivElement, HTMLSpanElement, HTMLParagraphElement}', #XXXjdm - 'dom::htmlanchorelement::HTMLAnchorElement', #XXXjdm - 'dom::htmlappletelement::HTMLAppletElement', #XXXjune0cho - 'dom::htmlareaelement::HTMLAreaElement', #XXXjune0cho - 'dom::htmlbaseelement::HTMLBaseElement', #XXXjune0cho - 'dom::htmlbodyelement::HTMLBodyElement', #XXXjune0cho - 'dom::htmlbrelement::HTMLBRElement', #XXXrecrack - 'dom::htmlbuttonelement::HTMLButtonElement', #XXXjdm - 'dom::htmlcanvaselement::HTMLCanvasElement', - 'dom::htmldataelement::HTMLDataElement', #XXXjune0cho - 'dom::htmldatalistelement::HTMLDataListElement', - 'dom::htmldlistelement::HTMLDListElement', - 'dom::htmldirectoryelement::HTMLDirectoryElement', - 'dom::htmlelement::HTMLElement', #XXXjdm - 'dom::htmlembedelement::HTMLEmbedElement', #XXXjdm - 'dom::htmlfieldsetelement::HTMLFieldSetElement', #XXXjdm - 'dom::htmlfontelement::HTMLFontElement', #XXXjdm - 'dom::htmlframeelement::HTMLFrameElement', #XXXjdm - 'dom::htmlframesetelement::HTMLFrameSetElement', #XXXjdm - 'dom::htmldocument::HTMLDocument', #XXXjdm - 'dom::htmlheadingelement::HTMLHeadingElement', - 'dom::htmlhrelement::HTMLHRElement', - 'dom::htmliframeelement::HTMLIFrameElement', #XXXjdm - 'dom::htmlimageelement::HTMLImageElement', #XXXjdm - 'dom::htmlinputelement::HTMLInputElement', - 'dom::htmllielement::HTMLLIElement', - 'dom::htmllinkelement::HTMLLinkElement', #XXXrecrack - 'dom::htmlmapelement::HTMLMapElement', - 'dom::htmlmetaelement::HTMLMetaElement', - 'dom::htmlolistelement::HTMLOListElement', - 'dom::htmlprogresselement::HTMLProgressElement', - 'dom::htmlquoteelement::HTMLQuoteElement', - 'dom::htmlscriptelement::HTMLScriptElement', - 'dom::htmlsourceelement::HTMLSourceElement', - 'dom::htmlstyleelement::HTMLStyleElement', - 'dom::htmltablecaptionelement::HTMLTableCaptionElement', - 'dom::htmltableelement::HTMLTableElement', - 'dom::htmltablecellelement::HTMLTableCellElement', - 'dom::htmltablecolelement::HTMLTableColElement', - 'dom::htmltablerowelement::HTMLTableRowElement', - 'dom::htmltablesectionelement::HTMLTableSectionElement', - 'dom::htmltextareaelement::HTMLTextAreaElement', - 'dom::htmltimeelement::HTMLTimeElement', - 'dom::htmltitleelement::HTMLTitleElement', #XXXyusukesuzuki - 'dom::htmlulistelement::HTMLUListElement', + 'dom::types::*', 'dom::bindings::utils::*', 'dom::bindings::conversions::*', - 'dom::blob::*', #XXXjdm - 'dom::clientrect::*', #XXXjdm - 'dom::clientrectlist::*', #XXXjdm - 'dom::htmlcollection::*', #XXXjdm - 'dom::bindings::proxyhandler::*', - 'dom::domparser::*', #XXXjdm - 'dom::event::*', #XXXjdm - 'dom::eventtarget::*', #XXXjdm - 'dom::formdata::*', #XXXjdm - 'dom::mouseevent::*', #XXXjdm - 'dom::uievent::*', #XXXjdm - 'dom::validitystate::*', #XXXjdm - 'dom::windowproxy::*', #XXXjdm - 'dom::window::Window', #XXXjdm 'dom::bindings::codegen::*', #XXXjdm 'script_task::{JSPageInfo, page_from_context}', 'dom::bindings::utils::EnumEntry', - 'dom::node::ScriptView', + 'dom::bindings::proxyhandler::*', + 'dom::document::AbstractDocument', + 'dom::node::{AbstractNode, ScriptView}', 'servo_util::vec::zip_copies', 'std::cast', 'std::libc', @@ -4782,3 +4722,18 @@ class GlobalGenRoots(): # Done. return curr + @staticmethod + def InterfaceTypes(config): + + descriptors = [d.name for d in config.getDescriptors(register=True)] + curr = CGList([CGGeneric(declare="pub use dom::%s::%s;\n" % (name.lower(), name)) for name in descriptors]) + curr = CGWrapper(curr, pre=AUTOGENERATED_WARNING_COMMENT) + return curr + + @staticmethod + def BindingDeclarations(config): + + descriptors = [d.name for d in config.getDescriptors(register=True)] + curr = CGList([CGGeneric(declare="pub mod %sBinding;\n" % name) for name in descriptors]) + curr = CGWrapper(curr, pre=AUTOGENERATED_WARNING_COMMENT) + return curr diff --git a/src/components/script/dom/bindings/codegen/GlobalGen.py b/src/components/script/dom/bindings/codegen/GlobalGen.py index ab6427a638c..9f46c786065 100644 --- a/src/components/script/dom/bindings/codegen/GlobalGen.py +++ b/src/components/script/dom/bindings/codegen/GlobalGen.py @@ -80,6 +80,12 @@ def main(): # Generate the common code. generate_file(config, 'RegisterBindings', 'declare+define') + # Generate the type list. + generate_file(config, 'InterfaceTypes', 'declare+define') + + # Generate the module declarations. + generate_file(config, 'BindingDeclarations', 'declare+define') + #XXXjdm No union support yet #generate_file(config, 'UnionTypes', 'declare') #generate_file(config, 'UnionConversions', 'declare') diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs index 60d4ca9cfc2..b7e6e013b9c 100644 --- a/src/components/script/dom/bindings/element.rs +++ b/src/components/script/dom/bindings/element.rs @@ -2,10 +2,13 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +use dom::types::*; +use dom::bindings::codegen::*; use dom::bindings::node::unwrap; use dom::bindings::utils::jsval_to_str; use dom::bindings::utils::{domstring_to_jsval, WrapNewBindingObject}; use dom::bindings::utils::{str, CacheableWrapper, DOM_OBJECT_SLOT, DOMString}; +use dom::bindings::utils::{BindingObject, WrapperCache}; use dom::element::Element; use dom::element::{HTMLImageElementTypeId, HTMLHeadElementTypeId, HTMLScriptElementTypeId, HTMLDivElementTypeId}; @@ -306,3 +309,123 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> jsobj { return obj; } + +pub macro_rules! generate_cacheable_wrapper( + ($name: ident, $wrap: path) => ( + impl CacheableWrapper for $name { + fn get_wrappercache(&mut self) -> &mut WrapperCache { + self.parent.get_wrappercache() + } + + fn wrap_object_shared(@mut self, cx: *JSContext, scope: *JSObject) -> *JSObject { + let mut unused = false; + $wrap(cx, scope, self, &mut unused) + } + } + ) +) + +pub macro_rules! generate_binding_object( + ($name: ident) => ( + impl BindingObject for $name { + fn GetParentObject(&self, cx: *JSContext) -> Option<@mut CacheableWrapper> { + self.parent.GetParentObject(cx) + } + } + ) +) + +generate_cacheable_wrapper!(HTMLHeadElement, HTMLHeadElementBinding::Wrap) +generate_binding_object!(HTMLHeadElement) +generate_cacheable_wrapper!(HTMLAnchorElement, HTMLAnchorElementBinding::Wrap) +generate_binding_object!(HTMLAnchorElement) +generate_cacheable_wrapper!(HTMLAppletElement, HTMLAppletElementBinding::Wrap) +generate_binding_object!(HTMLAppletElement) +generate_cacheable_wrapper!(HTMLAreaElement, HTMLAreaElementBinding::Wrap) +generate_binding_object!(HTMLAreaElement) +generate_cacheable_wrapper!(HTMLBaseElement, HTMLBaseElementBinding::Wrap) +generate_binding_object!(HTMLBaseElement) +generate_cacheable_wrapper!(HTMLBodyElement, HTMLBodyElementBinding::Wrap) +generate_binding_object!(HTMLBodyElement) +generate_cacheable_wrapper!(HTMLButtonElement, HTMLButtonElementBinding::Wrap) +generate_binding_object!(HTMLButtonElement) +generate_cacheable_wrapper!(HTMLCanvasElement, HTMLCanvasElementBinding::Wrap) +generate_binding_object!(HTMLCanvasElement) +generate_cacheable_wrapper!(HTMLDataListElement, HTMLDataListElementBinding::Wrap) +generate_binding_object!(HTMLDataListElement) +generate_cacheable_wrapper!(HTMLDListElement, HTMLDListElementBinding::Wrap) +generate_binding_object!(HTMLDListElement) +generate_cacheable_wrapper!(HTMLFrameElement, HTMLFrameElementBinding::Wrap) +generate_binding_object!(HTMLFrameElement) +generate_cacheable_wrapper!(HTMLFrameSetElement, HTMLFrameSetElementBinding::Wrap) +generate_binding_object!(HTMLFrameSetElement) +generate_cacheable_wrapper!(HTMLBRElement, HTMLBRElementBinding::Wrap) +generate_binding_object!(HTMLBRElement) +generate_cacheable_wrapper!(HTMLHRElement, HTMLHRElementBinding::Wrap) +generate_binding_object!(HTMLHRElement) +generate_cacheable_wrapper!(HTMLHtmlElement, HTMLHtmlElementBinding::Wrap) +generate_binding_object!(HTMLHtmlElement) +generate_cacheable_wrapper!(HTMLDataElement, HTMLDataElementBinding::Wrap) +generate_binding_object!(HTMLDataElement) +generate_cacheable_wrapper!(HTMLDirectoryElement, HTMLDirectoryElementBinding::Wrap) +generate_binding_object!(HTMLDirectoryElement) +generate_cacheable_wrapper!(HTMLDivElement, HTMLDivElementBinding::Wrap) +generate_binding_object!(HTMLDivElement) +generate_cacheable_wrapper!(HTMLEmbedElement, HTMLEmbedElementBinding::Wrap) +generate_binding_object!(HTMLEmbedElement) +generate_cacheable_wrapper!(HTMLFieldSetElement, HTMLFieldSetElementBinding::Wrap) +generate_binding_object!(HTMLFieldSetElement) +generate_cacheable_wrapper!(HTMLFontElement, HTMLFontElementBinding::Wrap) +generate_binding_object!(HTMLFontElement) +generate_cacheable_wrapper!(HTMLHeadingElement, HTMLHeadingElementBinding::Wrap) +generate_binding_object!(HTMLHeadingElement) +generate_cacheable_wrapper!(HTMLIFrameElement, HTMLIFrameElementBinding::Wrap) +generate_binding_object!(HTMLIFrameElement) +generate_cacheable_wrapper!(HTMLImageElement, HTMLImageElementBinding::Wrap) +generate_binding_object!(HTMLImageElement) +generate_cacheable_wrapper!(HTMLInputElement, HTMLInputElementBinding::Wrap) +generate_binding_object!(HTMLInputElement) +generate_cacheable_wrapper!(HTMLLIElement, HTMLLIElementBinding::Wrap) +generate_binding_object!(HTMLLIElement) +generate_cacheable_wrapper!(HTMLLinkElement, HTMLLinkElementBinding::Wrap) +generate_binding_object!(HTMLLinkElement) +generate_cacheable_wrapper!(HTMLMapElement, HTMLMapElementBinding::Wrap) +generate_binding_object!(HTMLMapElement) +generate_cacheable_wrapper!(HTMLMetaElement, HTMLMetaElementBinding::Wrap) +generate_binding_object!(HTMLMetaElement) +generate_cacheable_wrapper!(HTMLOListElement, HTMLOListElementBinding::Wrap) +generate_binding_object!(HTMLOListElement) +generate_cacheable_wrapper!(HTMLParagraphElement, HTMLParagraphElementBinding::Wrap) +generate_binding_object!(HTMLParagraphElement) +generate_cacheable_wrapper!(HTMLProgressElement, HTMLProgressElementBinding::Wrap) +generate_binding_object!(HTMLProgressElement) +generate_cacheable_wrapper!(HTMLQuoteElement, HTMLQuoteElementBinding::Wrap) +generate_binding_object!(HTMLQuoteElement) +generate_cacheable_wrapper!(HTMLScriptElement, HTMLScriptElementBinding::Wrap) +generate_binding_object!(HTMLScriptElement) +generate_cacheable_wrapper!(HTMLSourceElement, HTMLSourceElementBinding::Wrap) +generate_binding_object!(HTMLSourceElement) +generate_cacheable_wrapper!(HTMLSpanElement, HTMLSpanElementBinding::Wrap) +generate_binding_object!(HTMLSpanElement) +generate_cacheable_wrapper!(HTMLStyleElement, HTMLStyleElementBinding::Wrap) +generate_binding_object!(HTMLStyleElement) +generate_cacheable_wrapper!(HTMLTableElement, HTMLTableElementBinding::Wrap) +generate_binding_object!(HTMLTableElement) +generate_cacheable_wrapper!(HTMLTableCaptionElement, HTMLTableCaptionElementBinding::Wrap) +generate_binding_object!(HTMLTableCaptionElement) +generate_cacheable_wrapper!(HTMLTableCellElement, HTMLTableCellElementBinding::Wrap) +generate_binding_object!(HTMLTableCellElement) +generate_cacheable_wrapper!(HTMLTableColElement, HTMLTableColElementBinding::Wrap) +generate_binding_object!(HTMLTableColElement) +generate_cacheable_wrapper!(HTMLTableRowElement, HTMLTableRowElementBinding::Wrap) +generate_binding_object!(HTMLTableRowElement) +generate_cacheable_wrapper!(HTMLTableSectionElement, HTMLTableSectionElementBinding::Wrap) +generate_binding_object!(HTMLTableSectionElement) +generate_cacheable_wrapper!(HTMLTextAreaElement, HTMLTextAreaElementBinding::Wrap) +generate_binding_object!(HTMLTextAreaElement) +generate_cacheable_wrapper!(HTMLTitleElement, HTMLTitleElementBinding::Wrap) +generate_binding_object!(HTMLTitleElement) +generate_cacheable_wrapper!(HTMLTimeElement, HTMLTimeElementBinding::Wrap) +generate_binding_object!(HTMLTimeElement) +generate_cacheable_wrapper!(HTMLUListElement, HTMLUListElementBinding::Wrap) +generate_binding_object!(HTMLUListElement) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index 0d7b99776d4..f7681775e24 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -25,52 +25,9 @@ use dom::element::{HTMLElementTypeId, HTMLTableColElementTypeId, HTMLTableRowElementTypeId, HTMLTableSectionElementTypeId, HTMLTimeElementTypeId, HTMLTitleElementTypeId, HTMLUListElementTypeId, HTMLDListElementTypeId}; -use dom::element::{HTMLHeadElement,HTMLHtmlElement, HTMLDivElement, HTMLParagraphElement, HTMLSpanElement}; -use dom::htmlelement::HTMLElement; -use dom::htmlanchorelement::HTMLAnchorElement; -use dom::htmlappletelement::HTMLAppletElement; -use dom::htmlareaelement::HTMLAreaElement; -use dom::htmlbaseelement::HTMLBaseElement; -use dom::htmlbodyelement::HTMLBodyElement; -use dom::htmlbuttonelement::HTMLButtonElement; -use dom::htmlhrelement::HTMLHRElement; -use dom::htmlbrelement::HTMLBRElement; -use dom::htmlcanvaselement::HTMLCanvasElement; -use dom::htmldataelement::HTMLDataElement; -use dom::htmldatalistelement::HTMLDataListElement; -use dom::htmldirectoryelement::HTMLDirectoryElement; -use dom::htmldlistelement::HTMLDListElement; -use dom::htmlembedelement::HTMLEmbedElement; -use dom::htmlfieldsetelement::HTMLFieldSetElement; -use dom::htmlfontelement::HTMLFontElement; -use dom::htmlframeelement::HTMLFrameElement; -use dom::htmlframesetelement::HTMLFrameSetElement; -use dom::htmlheadingelement::HTMLHeadingElement; -use dom::htmliframeelement::HTMLIFrameElement; -use dom::htmlimageelement::HTMLImageElement; -use dom::htmlinputelement::HTMLInputElement; -use dom::htmllielement::HTMLLIElement; -use dom::htmllinkelement::HTMLLinkElement; -use dom::htmlmapelement::HTMLMapElement; -use dom::htmlmetaelement::HTMLMetaElement; -use dom::htmlolistelement::HTMLOListElement; -use dom::htmlprogresselement::HTMLProgressElement; -use dom::htmlquoteelement::HTMLQuoteElement; -use dom::htmlscriptelement::HTMLScriptElement; -use dom::htmlsourceelement::HTMLSourceElement; -use dom::htmlstyleelement::HTMLStyleElement; -use dom::htmltableelement::HTMLTableElement; -use dom::htmltablecaptionelement::HTMLTableCaptionElement; -use dom::htmltablecellelement::HTMLTableCellElement; -use dom::htmltablecolelement::HTMLTableColElement; -use dom::htmltablerowelement::HTMLTableRowElement; -use dom::htmltablesectionelement::HTMLTableSectionElement; -use dom::htmltextareaelement::HTMLTextAreaElement; -use dom::htmltimeelement::HTMLTimeElement; -use dom::htmltitleelement::HTMLTitleElement; -use dom::htmlulistelement::HTMLUListElement; +use dom::types::*; use dom::node::{AbstractNode, Node, ElementNodeTypeId, TextNodeTypeId, CommentNodeTypeId}; -use dom::node::{DoctypeNodeTypeId, ScriptView, Text}; +use dom::node::{DoctypeNodeTypeId, ScriptView}; use std::cast; use std::libc::c_uint; diff --git a/src/components/script/dom/bindings/text.rs b/src/components/script/dom/bindings/text.rs index efa8cc90206..9b231d7087d 100644 --- a/src/components/script/dom/bindings/text.rs +++ b/src/components/script/dom/bindings/text.rs @@ -6,8 +6,9 @@ use dom::bindings::element; use dom::bindings::node::unwrap; use dom::bindings::utils; use dom::bindings::utils::{DOM_OBJECT_SLOT, CacheableWrapper}; -use dom::node::{AbstractNode, Text, Comment, Doctype, TextNodeTypeId, CommentNodeTypeId}; +use dom::node::{AbstractNode, Comment, Doctype, TextNodeTypeId, CommentNodeTypeId}; use dom::node::{DoctypeNodeTypeId, ScriptView}; +use dom::text::Text; use js::jsapi::{JSFreeOp, JSObject, JSContext}; use js::jsapi::{JS_SetReservedSlot}; diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 8547a0e3cc7..2048e8f7988 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -5,13 +5,15 @@ use dom::bindings::codegen::DocumentBinding; use dom::bindings::utils::{DOMString, WrapperCache, ErrorResult, null_string, str}; use dom::bindings::utils::{BindingObject, CacheableWrapper, rust_box, DerivedWrapper}; -use dom::element::{Element, HTMLHtmlElement}; +use dom::element::{Element}; use dom::element::{HTMLHtmlElementTypeId, HTMLHeadElementTypeId, HTMLTitleElementTypeId}; use dom::event::Event; use dom::htmlcollection::HTMLCollection; use dom::htmldocument::HTMLDocument; use dom::htmlelement::HTMLElement; -use dom::node::{AbstractNode, ScriptView, Node, ElementNodeTypeId, Text}; +use dom::htmlhtmlelement::HTMLHtmlElement; +use dom::node::{AbstractNode, ScriptView, Node, ElementNodeTypeId}; +use dom::text::Text; use dom::window::Window; use dom::windowproxy::WindowProxy; use dom::htmltitleelement::HTMLTitleElement; diff --git a/src/components/script/dom/domparser.rs b/src/components/script/dom/domparser.rs index 58756ca8710..6d11ab8a8c7 100644 --- a/src/components/script/dom/domparser.rs +++ b/src/components/script/dom/domparser.rs @@ -6,9 +6,10 @@ use dom::bindings::codegen::DOMParserBinding; use dom::bindings::codegen::DOMParserBinding::SupportedTypeValues::{Text_html, Text_xml}; use dom::bindings::utils::{DOMString, ErrorResult, WrapperCache, CacheableWrapper}; use dom::document::{AbstractDocument, Document, XML}; -use dom::element::{HTMLHtmlElement, HTMLHtmlElementTypeId}; +use dom::element::HTMLHtmlElementTypeId; use dom::htmldocument::HTMLDocument; use dom::htmlelement::HTMLElement; +use dom::htmlhtmlelement::HTMLHtmlElement; use dom::node::Node; use dom::window::Window; diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 8a296c5d3d0..c4484bcd38d 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -4,77 +4,12 @@ //! Element nodes. -use dom::bindings::codegen::{HTMLAnchorElementBinding, HTMLAppletElementBinding, - HTMLAreaElementBinding, HTMLBaseElementBinding, - HTMLBodyElementBinding, HTMLBRElementBinding, - HTMLButtonElementBinding, HTMLCanvasElementBinding, - HTMLDataElementBinding, HTMLDataListElementBinding, - HTMLDirectoryElementBinding, HTMLDListElementBinding, - HTMLDivElementBinding, HTMLEmbedElementBinding, - HTMLFieldSetElementBinding, HTMLFontElementBinding, - HTMLFrameElementBinding, HTMLFrameSetElementBinding, - HTMLHeadElementBinding, HTMLHeadingElementBinding, - HTMLHRElementBinding, HTMLHtmlElementBinding, - HTMLIFrameElementBinding, HTMLImageElementBinding, - HTMLInputElementBinding, HTMLLIElementBinding, - HTMLLinkElementBinding, HTMLMapElementBinding, - HTMLMetaElementBinding, - HTMLOListElementBinding, HTMLParagraphElementBinding, - HTMLProgressElementBinding, HTMLQuoteElementBinding, - HTMLScriptElementBinding, HTMLSourceElementBinding, HTMLSpanElementBinding, - HTMLStyleElementBinding, HTMLTableElementBinding, - HTMLTableCaptionElementBinding, HTMLTableCellElementBinding, - HTMLTableColElementBinding, HTMLTableRowElementBinding, - HTMLTableSectionElementBinding, HTMLTextAreaElementBinding, - HTMLTimeElementBinding, HTMLTitleElementBinding, HTMLUListElementBinding}; use dom::bindings::utils::{null_string, str}; use dom::bindings::utils::{BindingObject, CacheableWrapper, DOMString, ErrorResult, WrapperCache}; +use dom::htmlelement::HTMLElement; +use dom::htmlcollection::HTMLCollection; use dom::clientrect::ClientRect; use dom::clientrectlist::ClientRectList; -use dom::htmlanchorelement::HTMLAnchorElement; -use dom::htmlappletelement::HTMLAppletElement; -use dom::htmlareaelement::HTMLAreaElement; -use dom::htmlbaseelement::HTMLBaseElement; -use dom::htmlbodyelement::HTMLBodyElement; -use dom::htmlbrelement::HTMLBRElement; -use dom::htmlbuttonelement::HTMLButtonElement; -use dom::htmlcanvaselement::HTMLCanvasElement; -use dom::htmlcollection::HTMLCollection; -use dom::htmldataelement::HTMLDataElement; -use dom::htmldatalistelement::HTMLDataListElement; -use dom::htmldirectoryelement::HTMLDirectoryElement; -use dom::htmldlistelement::HTMLDListElement; -use dom::htmlelement::HTMLElement; -use dom::htmlembedelement::HTMLEmbedElement; -use dom::htmlfieldsetelement::HTMLFieldSetElement; -use dom::htmlfontelement::HTMLFontElement; -use dom::htmlframeelement::HTMLFrameElement; -use dom::htmlframesetelement::HTMLFrameSetElement; -use dom::htmlheadingelement::HTMLHeadingElement; -use dom::htmlhrelement::HTMLHRElement; -use dom::htmliframeelement::HTMLIFrameElement; -use dom::htmlimageelement::HTMLImageElement; -use dom::htmlinputelement::HTMLInputElement; -use dom::htmllielement::HTMLLIElement; -use dom::htmllinkelement::HTMLLinkElement; -use dom::htmlmapelement::HTMLMapElement; -use dom::htmlmetaelement::HTMLMetaElement; -use dom::htmlolistelement::HTMLOListElement; -use dom::htmlprogresselement::HTMLProgressElement; -use dom::htmlquoteelement::HTMLQuoteElement; -use dom::htmlscriptelement::HTMLScriptElement; -use dom::htmlsourceelement::HTMLSourceElement; -use dom::htmlstyleelement::HTMLStyleElement; -use dom::htmltableelement::HTMLTableElement; -use dom::htmltablecaptionelement::HTMLTableCaptionElement; -use dom::htmltablecellelement::HTMLTableCellElement; -use dom::htmltablecolelement::HTMLTableColElement; -use dom::htmltablerowelement::HTMLTableRowElement; -use dom::htmltablesectionelement::HTMLTableSectionElement; -use dom::htmltextareaelement::HTMLTextAreaElement; -use dom::htmltimeelement::HTMLTimeElement; -use dom::htmltitleelement::HTMLTitleElement; -use dom::htmlulistelement::HTMLUListElement; use dom::node::{ElementNodeTypeId, Node, ScriptView, AbstractNode}; use layout_interface::{ContentBoxQuery, ContentBoxResponse, ContentBoxesQuery}; use layout_interface::{ContentBoxesResponse}; @@ -171,164 +106,11 @@ pub enum ElementTypeId { // Regular old elements // -pub struct HTMLDivElement { parent: HTMLElement } -pub struct HTMLFormElement { parent: HTMLElement } -pub struct HTMLHeadElement { parent: HTMLElement } -pub struct HTMLHtmlElement { parent: HTMLElement } pub struct HTMLOptionElement { parent: HTMLElement } -pub struct HTMLParagraphElement { parent: HTMLElement } pub struct HTMLSelectElement { parent: HTMLElement } pub struct HTMLSmallElement { parent: HTMLElement } -pub struct HTMLSpanElement { parent: HTMLElement } pub struct UnknownElement { parent: HTMLElement } -impl HTMLHtmlElement { - pub fn Version(&self) -> DOMString { - null_string - } - - pub fn SetVersion(&mut self, _version: &DOMString, _rv: &mut ErrorResult) { - } -} - -impl HTMLDivElement { - pub fn Align(&self) -> DOMString { - null_string - } - - pub fn SetAlign(&mut self, _align: &DOMString, _rv: &mut ErrorResult) { - } -} - -impl HTMLParagraphElement { - pub fn Align(&self) -> DOMString { - null_string - } - - pub fn SetAlign(&mut self, _align: &DOMString, _rv: &mut ErrorResult) { - } -} - -pub macro_rules! generate_cacheable_wrapper( - ($name: ident, $wrap: path) => ( - impl CacheableWrapper for $name { - fn get_wrappercache(&mut self) -> &mut WrapperCache { - self.parent.get_wrappercache() - } - - fn wrap_object_shared(@mut self, cx: *JSContext, scope: *JSObject) -> *JSObject { - let mut unused = false; - $wrap(cx, scope, self, &mut unused) - } - } - ) -) - -pub macro_rules! generate_binding_object( - ($name: ident) => ( - impl BindingObject for $name { - fn GetParentObject(&self, cx: *JSContext) -> Option<@mut CacheableWrapper> { - self.parent.GetParentObject(cx) - } - } - ) -) - -generate_cacheable_wrapper!(HTMLHeadElement, HTMLHeadElementBinding::Wrap) -generate_binding_object!(HTMLHeadElement) -generate_cacheable_wrapper!(HTMLAnchorElement, HTMLAnchorElementBinding::Wrap) -generate_binding_object!(HTMLAnchorElement) -generate_cacheable_wrapper!(HTMLAppletElement, HTMLAppletElementBinding::Wrap) -generate_binding_object!(HTMLAppletElement) -generate_cacheable_wrapper!(HTMLAreaElement, HTMLAreaElementBinding::Wrap) -generate_binding_object!(HTMLAreaElement) -generate_cacheable_wrapper!(HTMLBaseElement, HTMLBaseElementBinding::Wrap) -generate_binding_object!(HTMLBaseElement) -generate_cacheable_wrapper!(HTMLBodyElement, HTMLBodyElementBinding::Wrap) -generate_binding_object!(HTMLBodyElement) -generate_cacheable_wrapper!(HTMLButtonElement, HTMLButtonElementBinding::Wrap) -generate_binding_object!(HTMLButtonElement) -generate_cacheable_wrapper!(HTMLCanvasElement, HTMLCanvasElementBinding::Wrap) -generate_binding_object!(HTMLCanvasElement) -generate_cacheable_wrapper!(HTMLDataListElement, HTMLDataListElementBinding::Wrap) -generate_binding_object!(HTMLDataListElement) -generate_cacheable_wrapper!(HTMLDListElement, HTMLDListElementBinding::Wrap) -generate_binding_object!(HTMLDListElement) -generate_cacheable_wrapper!(HTMLFrameElement, HTMLFrameElementBinding::Wrap) -generate_binding_object!(HTMLFrameElement) -generate_cacheable_wrapper!(HTMLFrameSetElement, HTMLFrameSetElementBinding::Wrap) -generate_binding_object!(HTMLFrameSetElement) -generate_cacheable_wrapper!(HTMLBRElement, HTMLBRElementBinding::Wrap) -generate_binding_object!(HTMLBRElement) -generate_cacheable_wrapper!(HTMLHRElement, HTMLHRElementBinding::Wrap) -generate_binding_object!(HTMLHRElement) -generate_cacheable_wrapper!(HTMLHtmlElement, HTMLHtmlElementBinding::Wrap) -generate_binding_object!(HTMLHtmlElement) -generate_cacheable_wrapper!(HTMLDataElement, HTMLDataElementBinding::Wrap) -generate_binding_object!(HTMLDataElement) -generate_cacheable_wrapper!(HTMLDirectoryElement, HTMLDirectoryElementBinding::Wrap) -generate_binding_object!(HTMLDirectoryElement) -generate_cacheable_wrapper!(HTMLDivElement, HTMLDivElementBinding::Wrap) -generate_binding_object!(HTMLDivElement) -generate_cacheable_wrapper!(HTMLEmbedElement, HTMLEmbedElementBinding::Wrap) -generate_binding_object!(HTMLEmbedElement) -generate_cacheable_wrapper!(HTMLFieldSetElement, HTMLFieldSetElementBinding::Wrap) -generate_binding_object!(HTMLFieldSetElement) -generate_cacheable_wrapper!(HTMLFontElement, HTMLFontElementBinding::Wrap) -generate_binding_object!(HTMLFontElement) -generate_cacheable_wrapper!(HTMLHeadingElement, HTMLHeadingElementBinding::Wrap) -generate_binding_object!(HTMLHeadingElement) -generate_cacheable_wrapper!(HTMLIFrameElement, HTMLIFrameElementBinding::Wrap) -generate_binding_object!(HTMLIFrameElement) -generate_cacheable_wrapper!(HTMLImageElement, HTMLImageElementBinding::Wrap) -generate_binding_object!(HTMLImageElement) -generate_cacheable_wrapper!(HTMLInputElement, HTMLInputElementBinding::Wrap) -generate_binding_object!(HTMLInputElement) -generate_cacheable_wrapper!(HTMLLIElement, HTMLLIElementBinding::Wrap) -generate_binding_object!(HTMLLIElement) -generate_cacheable_wrapper!(HTMLLinkElement, HTMLLinkElementBinding::Wrap) -generate_binding_object!(HTMLLinkElement) -generate_cacheable_wrapper!(HTMLMapElement, HTMLMapElementBinding::Wrap) -generate_binding_object!(HTMLMapElement) -generate_cacheable_wrapper!(HTMLMetaElement, HTMLMetaElementBinding::Wrap) -generate_binding_object!(HTMLMetaElement) -generate_cacheable_wrapper!(HTMLOListElement, HTMLOListElementBinding::Wrap) -generate_binding_object!(HTMLOListElement) -generate_cacheable_wrapper!(HTMLParagraphElement, HTMLParagraphElementBinding::Wrap) -generate_binding_object!(HTMLParagraphElement) -generate_cacheable_wrapper!(HTMLProgressElement, HTMLProgressElementBinding::Wrap) -generate_binding_object!(HTMLProgressElement) -generate_cacheable_wrapper!(HTMLQuoteElement, HTMLQuoteElementBinding::Wrap) -generate_binding_object!(HTMLQuoteElement) -generate_cacheable_wrapper!(HTMLScriptElement, HTMLScriptElementBinding::Wrap) -generate_binding_object!(HTMLScriptElement) -generate_cacheable_wrapper!(HTMLSourceElement, HTMLSourceElementBinding::Wrap) -generate_binding_object!(HTMLSourceElement) -generate_cacheable_wrapper!(HTMLSpanElement, HTMLSpanElementBinding::Wrap) -generate_binding_object!(HTMLSpanElement) -generate_cacheable_wrapper!(HTMLStyleElement, HTMLStyleElementBinding::Wrap) -generate_binding_object!(HTMLStyleElement) -generate_cacheable_wrapper!(HTMLTableElement, HTMLTableElementBinding::Wrap) -generate_binding_object!(HTMLTableElement) -generate_cacheable_wrapper!(HTMLTableCaptionElement, HTMLTableCaptionElementBinding::Wrap) -generate_binding_object!(HTMLTableCaptionElement) -generate_cacheable_wrapper!(HTMLTableCellElement, HTMLTableCellElementBinding::Wrap) -generate_binding_object!(HTMLTableCellElement) -generate_cacheable_wrapper!(HTMLTableColElement, HTMLTableColElementBinding::Wrap) -generate_binding_object!(HTMLTableColElement) -generate_cacheable_wrapper!(HTMLTableRowElement, HTMLTableRowElementBinding::Wrap) -generate_binding_object!(HTMLTableRowElement) -generate_cacheable_wrapper!(HTMLTableSectionElement, HTMLTableSectionElementBinding::Wrap) -generate_binding_object!(HTMLTableSectionElement) -generate_cacheable_wrapper!(HTMLTextAreaElement, HTMLTextAreaElementBinding::Wrap) -generate_binding_object!(HTMLTextAreaElement) -generate_cacheable_wrapper!(HTMLTitleElement, HTMLTitleElementBinding::Wrap) -generate_binding_object!(HTMLTitleElement) -generate_cacheable_wrapper!(HTMLTimeElement, HTMLTimeElementBinding::Wrap) -generate_binding_object!(HTMLTimeElement) -generate_cacheable_wrapper!(HTMLUListElement, HTMLUListElementBinding::Wrap) -generate_binding_object!(HTMLUListElement) - // // Element methods // diff --git a/src/components/script/dom/htmldivelement.rs b/src/components/script/dom/htmldivelement.rs new file mode 100644 index 00000000000..b46281234e7 --- /dev/null +++ b/src/components/script/dom/htmldivelement.rs @@ -0,0 +1,19 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::{DOMString, null_string, ErrorResult}; +use dom::htmlelement::HTMLElement; + +pub struct HTMLDivElement { + parent: HTMLElement +} + +impl HTMLDivElement { + pub fn Align(&self) -> DOMString { + null_string + } + + pub fn SetAlign(&mut self, _align: &DOMString, _rv: &mut ErrorResult) { + } +} diff --git a/src/components/script/dom/htmlformelement.rs b/src/components/script/dom/htmlformelement.rs new file mode 100644 index 00000000000..06ab7f52fc9 --- /dev/null +++ b/src/components/script/dom/htmlformelement.rs @@ -0,0 +1,9 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::htmlelement::HTMLElement; + +pub struct HTMLFormElement { + parent: HTMLElement +} diff --git a/src/components/script/dom/htmlheadelement.rs b/src/components/script/dom/htmlheadelement.rs new file mode 100644 index 00000000000..577e8a1584c --- /dev/null +++ b/src/components/script/dom/htmlheadelement.rs @@ -0,0 +1,9 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::htmlelement::HTMLElement; + +pub struct HTMLHeadElement { + parent: HTMLElement +} diff --git a/src/components/script/dom/htmlhtmlelement.rs b/src/components/script/dom/htmlhtmlelement.rs new file mode 100644 index 00000000000..7aa36abb90c --- /dev/null +++ b/src/components/script/dom/htmlhtmlelement.rs @@ -0,0 +1,19 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::{DOMString, null_string, ErrorResult}; +use dom::htmlelement::HTMLElement; + +pub struct HTMLHtmlElement { + parent: HTMLElement +} + +impl HTMLHtmlElement { + pub fn Version(&self) -> DOMString { + null_string + } + + pub fn SetVersion(&mut self, _version: &DOMString, _rv: &mut ErrorResult) { + } +} diff --git a/src/components/script/dom/htmlparagraphelement.rs b/src/components/script/dom/htmlparagraphelement.rs new file mode 100644 index 00000000000..618a22d94d9 --- /dev/null +++ b/src/components/script/dom/htmlparagraphelement.rs @@ -0,0 +1,19 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::{DOMString, null_string, ErrorResult}; +use dom::htmlelement::HTMLElement; + +pub struct HTMLParagraphElement { + parent: HTMLElement +} + +impl HTMLParagraphElement { + pub fn Align(&self) -> DOMString { + null_string + } + + pub fn SetAlign(&mut self, _align: &DOMString, _rv: &mut ErrorResult) { + } +} diff --git a/src/components/script/dom/htmlspanelement.rs b/src/components/script/dom/htmlspanelement.rs new file mode 100644 index 00000000000..d12e4ae922d --- /dev/null +++ b/src/components/script/dom/htmlspanelement.rs @@ -0,0 +1,9 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::htmlelement::HTMLElement; + +pub struct HTMLSpanElement { + parent: HTMLElement +} diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index e06c77577ed..23d76712022 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -4,7 +4,6 @@ //! The core DOM types. Defines the basic DOM hierarchy as well as all the HTML elements. -use dom::bindings::codegen::TextBinding; use dom::bindings::node; use dom::bindings::utils::{WrapperCache, DOMString, null_string, ErrorResult}; use dom::bindings::utils::{BindingObject, CacheableWrapper, rust_box}; @@ -15,7 +14,7 @@ use dom::element::{Element, ElementTypeId, HTMLImageElementTypeId, HTMLIframeEle use dom::element::{HTMLStyleElementTypeId}; use dom::htmlimageelement::HTMLImageElement; use dom::htmliframeelement::HTMLIFrameElement; -use dom::window::Window; +use dom::text::Text; use std::cast; use std::cast::transmute; @@ -143,33 +142,6 @@ impl Comment { } } -/// An HTML text node. -pub struct Text { - parent: CharacterData, -} - -impl Text { - /// Creates a new HTML text node. - pub fn new(text: ~str) -> Text { - Text { - parent: CharacterData::new(TextNodeTypeId, text) - } - } - - pub fn Constructor(owner: @mut Window, text: &DOMString, _rv: &mut ErrorResult) -> AbstractNode { - let cx = unsafe {(*owner.page).js_info.get_ref().js_compartment.cx.ptr}; - unsafe { Node::as_abstract_node(cx, @Text::new(text.to_str())) } - } - - pub fn SplitText(&self, _offset: u32, _rv: &mut ErrorResult) -> AbstractNode { - fail!("unimplemented") - } - - pub fn GetWholeText(&self, _rv: &mut ErrorResult) -> DOMString { - null_string - } -} - impl Clone for AbstractNode { fn clone(&self) -> AbstractNode { *self @@ -707,19 +679,3 @@ impl BindingObject for Node { } } -impl CacheableWrapper for Text { - fn get_wrappercache(&mut self) -> &mut WrapperCache { - self.parent.get_wrappercache() - } - - fn wrap_object_shared(@mut self, cx: *JSContext, scope: *JSObject) -> *JSObject { - let mut unused = false; - TextBinding::Wrap(cx, scope, self, &mut unused) - } -} - -impl BindingObject for Text { - fn GetParentObject(&self, cx: *JSContext) -> Option<@mut CacheableWrapper> { - self.parent.GetParentObject(cx) - } -} diff --git a/src/components/script/dom/text.rs b/src/components/script/dom/text.rs new file mode 100644 index 00000000000..95926d12d92 --- /dev/null +++ b/src/components/script/dom/text.rs @@ -0,0 +1,55 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::{DOMString, ErrorResult, null_string, CacheableWrapper}; +use dom::bindings::utils::{BindingObject, WrapperCache}; +use dom::bindings::codegen::TextBinding; +use dom::characterdata::CharacterData; +use dom::node::{AbstractNode, ScriptView, Node, TextNodeTypeId}; +use dom::window::Window; +use js::jsapi::{JSContext, JSObject}; + +/// An HTML text node. +pub struct Text { + parent: CharacterData, +} + +impl Text { + /// Creates a new HTML text node. + pub fn new(text: ~str) -> Text { + Text { + parent: CharacterData::new(TextNodeTypeId, text) + } + } + + pub fn Constructor(owner: @mut Window, text: &DOMString, _rv: &mut ErrorResult) -> AbstractNode { + let cx = unsafe {(*owner.page).js_info.get_ref().js_compartment.cx.ptr}; + unsafe { Node::as_abstract_node(cx, @Text::new(text.to_str())) } + } + + pub fn SplitText(&self, _offset: u32, _rv: &mut ErrorResult) -> AbstractNode { + fail!("unimplemented") + } + + pub fn GetWholeText(&self, _rv: &mut ErrorResult) -> DOMString { + null_string + } +} + +impl CacheableWrapper for Text { + fn get_wrappercache(&mut self) -> &mut WrapperCache { + self.parent.get_wrappercache() + } + + fn wrap_object_shared(@mut self, cx: *JSContext, scope: *JSObject) -> *JSObject { + let mut unused = false; + TextBinding::Wrap(cx, scope, self, &mut unused) + } +} + +impl BindingObject for Text { + fn GetParentObject(&self, cx: *JSContext) -> Option<@mut CacheableWrapper> { + self.parent.GetParentObject(cx) + } +} diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 8c912d28136..2b814b50700 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -23,59 +23,15 @@ use dom::element::{HTMLElementTypeId, HTMLTableRowElementTypeId, HTMLTextAreaElementTypeId, HTMLTimeElementTypeId, HTMLTitleElementTypeId, HTMLUListElementTypeId, UnknownElementTypeId}; -use dom::element::{HTMLDivElement, HTMLFormElement, - HTMLHeadElement, HTMLHtmlElement, - HTMLOptionElement, HTMLParagraphElement, - HTMLSelectElement, HTMLSmallElement, - HTMLSpanElement}; +use dom::element::{HTMLOptionElement, HTMLSelectElement, HTMLSmallElement}; use dom::element::{HTMLHeadingElementTypeId}; -use dom::htmlbrelement::HTMLBRElement; -use dom::htmlanchorelement::HTMLAnchorElement; -use dom::htmlappletelement::HTMLAppletElement; -use dom::htmlareaelement::HTMLAreaElement; -use dom::htmlbaseelement::HTMLBaseElement; -use dom::htmlbodyelement::HTMLBodyElement; -use dom::htmlbuttonelement::HTMLButtonElement; -use dom::htmlcanvaselement::HTMLCanvasElement; -use dom::htmldataelement::HTMLDataElement; -use dom::htmldatalistelement::HTMLDataListElement; -use dom::htmldirectoryelement::HTMLDirectoryElement; -use dom::htmldlistelement::HTMLDListElement; -use dom::htmlembedelement::HTMLEmbedElement; -use dom::htmlfieldsetelement::HTMLFieldSetElement; -use dom::htmlfontelement::HTMLFontElement; -use dom::htmlframeelement::HTMLFrameElement; -use dom::htmlframesetelement::HTMLFrameSetElement; -use dom::htmlheadingelement::{HTMLHeadingElement, Heading1, Heading2, Heading3, Heading4, - Heading5, Heading6}; -use dom::htmlhrelement::HTMLHRElement; -use dom::htmliframeelement::{IFrameSize, HTMLIFrameElement}; -use dom::htmlimageelement::HTMLImageElement; -use dom::htmlinputelement::HTMLInputElement; -use dom::htmllielement::HTMLLIElement; -use dom::htmllinkelement::HTMLLinkElement; -use dom::htmlmapelement::HTMLMapElement; -use dom::htmlmetaelement::HTMLMetaElement; -use dom::htmlolistelement::HTMLOListElement; -use dom::htmlprogresselement::HTMLProgressElement; -use dom::htmlquoteelement::HTMLQuoteElement; -use dom::htmlscriptelement::HTMLScriptElement; -use dom::htmlsourceelement::HTMLSourceElement; -use dom::htmlstyleelement::HTMLStyleElement; -use dom::htmltableelement::HTMLTableElement; -use dom::htmltablecaptionelement::HTMLTableCaptionElement; -use dom::htmltablecellelement::HTMLTableCellElement; -use dom::htmltablecolelement::HTMLTableColElement; -use dom::htmltablerowelement::HTMLTableRowElement; -use dom::htmltablesectionelement::HTMLTableSectionElement; -use dom::htmltextareaelement::HTMLTextAreaElement; -use dom::htmltimeelement::HTMLTimeElement; -use dom::htmltitleelement::HTMLTitleElement; -use dom::htmlulistelement::HTMLUListElement; +use dom::htmlheadingelement::{Heading1, Heading2, Heading3, Heading4, Heading5, Heading6}; +use dom::htmliframeelement::IFrameSize; +use dom::htmlformelement::HTMLFormElement; +use dom::types::*; use dom::element::Element; use dom::htmlelement::HTMLElement; use dom::node::{AbstractNode, Comment, Doctype, ElementNodeTypeId, Node, ScriptView}; -use dom::node::{Text}; use dom::bindings::utils::str; use html::cssparse::{InlineProvenance, StylesheetProvenance, UrlProvenance, spawn_css_parser}; use js::jsapi::JSContext; diff --git a/src/components/script/script.rc b/src/components/script/script.rc index 2cbf9333de9..1350113c498 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -32,77 +32,18 @@ pub mod dom { pub mod proxyhandler; pub mod domparser; pub mod codegen { - pub mod BlobBinding; - pub mod CharacterDataBinding; - pub mod ClientRectBinding; - pub mod ClientRectListBinding; - pub mod DocumentBinding; - pub mod DOMParserBinding; - pub mod ElementBinding; - pub mod EventBinding; - pub mod EventTargetBinding; - pub mod FormDataBinding; - pub mod HTMLAnchorElementBinding; - pub mod HTMLAppletElementBinding; - pub mod HTMLAreaElementBinding; - pub mod HTMLBaseElementBinding; - pub mod HTMLBodyElementBinding; - pub mod HTMLBRElementBinding; - pub mod HTMLButtonElementBinding; - pub mod HTMLCanvasElementBinding; - pub mod HTMLCollectionBinding; - pub mod HTMLDataElementBinding; - pub mod HTMLDataListElementBinding; - pub mod HTMLDirectoryElementBinding; - pub mod HTMLDListElementBinding; - pub mod HTMLDivElementBinding; - pub mod HTMLDocumentBinding; - pub mod HTMLElementBinding; - pub mod HTMLEmbedElementBinding; - pub mod HTMLFieldSetElementBinding; - pub mod HTMLFontElementBinding; - pub mod HTMLFrameElementBinding; - pub mod HTMLFrameSetElementBinding; - pub mod HTMLHeadElementBinding; - pub mod HTMLHeadingElementBinding; - pub mod HTMLHRElementBinding; - pub mod HTMLHtmlElementBinding; - pub mod HTMLIFrameElementBinding; - pub mod HTMLImageElementBinding; - pub mod HTMLInputElementBinding; - pub mod HTMLLIElementBinding; - pub mod HTMLLinkElementBinding; - pub mod HTMLMapElementBinding; - pub mod HTMLMetaElementBinding; - pub mod HTMLOListElementBinding; - pub mod HTMLParagraphElementBinding; - pub mod HTMLProgressElementBinding; - pub mod HTMLQuoteElementBinding; - pub mod HTMLScriptElementBinding; - pub mod HTMLSourceElementBinding; - pub mod HTMLSpanElementBinding; - pub mod HTMLStyleElementBinding; - pub mod HTMLTableElementBinding; - pub mod HTMLTableCaptionElementBinding; - pub mod HTMLTableCellElementBinding; - pub mod HTMLTableColElementBinding; - pub mod HTMLTableRowElementBinding; - pub mod HTMLTableSectionElementBinding; - pub mod HTMLTextAreaElementBinding; - pub mod HTMLTimeElementBinding; - pub mod HTMLTitleElementBinding; - pub mod HTMLUListElementBinding; - pub mod MouseEventBinding; - pub mod NodeBinding; + pub use self::BindingDeclarations::*; + pub mod InterfaceTypes; pub mod PrototypeList; pub mod RegisterBindings; - pub mod TextBinding; - pub mod UIEventBinding; - pub mod ValidityStateBinding; - pub mod WindowBinding; - pub mod WindowProxyBinding; + pub mod BindingDeclarations; } } + + pub mod types { + pub use super::bindings::codegen::InterfaceTypes::*; + } + pub mod blob; pub mod characterdata; pub mod clientrect; @@ -125,16 +66,20 @@ pub mod dom { pub mod htmldataelement; pub mod htmldatalistelement; pub mod htmldirectoryelement; + pub mod htmldivelement; pub mod htmldlistelement; pub mod htmldocument; pub mod htmlelement; pub mod htmlembedelement; pub mod htmlfieldsetelement; pub mod htmlfontelement; + pub mod htmlformelement; pub mod htmlframeelement; pub mod htmlframesetelement; + pub mod htmlheadelement; pub mod htmlheadingelement; pub mod htmlhrelement; + pub mod htmlhtmlelement; pub mod htmliframeelement; pub mod htmlimageelement; pub mod htmlinputelement; @@ -143,9 +88,11 @@ pub mod dom { pub mod htmlmapelement; pub mod htmlmetaelement; pub mod htmlolistelement; + pub mod htmlparagraphelement; pub mod htmlprogresselement; pub mod htmlquoteelement; pub mod htmlscriptelement; + pub mod htmlspanelement; pub mod htmlsourceelement; pub mod htmlstyleelement; pub mod htmltableelement; @@ -161,6 +108,7 @@ pub mod dom { pub mod mouseevent; pub mod node; pub mod uievent; + pub mod text; pub mod validitystate; pub mod window; pub mod windowproxy; From b5c8ca2043fe51caa442bac8bb335eace8f22f11 Mon Sep 17 00:00:00 2001 From: "aydin.kim" Date: Mon, 26 Aug 2013 17:32:28 +0900 Subject: [PATCH 08/29] Update README.md for android build instruction --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index d4dc3db67eb..49eaa9107c2 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,15 @@ sudo apt-get install autoconf2.13 curl freeglut3-dev libtool \ xorg-dev msttcorefonts ``` +On Debian-based Linuxes (cross-compilation for Android): + +``` sh +sudo apt-get install autoconf2.13 curl libtool ia32-libs +``` +And it needs pre-installed Android tools. +See wiki for [details](https://github.com/mozilla/servo/wiki/Doc-building-for-android) + + Servo builds its own copy of Rust, so there is no need to provide a Rust compiler. @@ -43,6 +52,16 @@ make && make check ./servo ../src/test/html/about-mozilla.html ``` +###Building for Android target + +``` sh +git clone https://github.com/mozilla/servo.git +cd servo +mkdir -p build && cd build +../configure --target-triples=arm-linux-androideabi --android-cross-path= --android-ndk-path= --android-sdk-path= +make +``` + ## Running ### Commandline Arguments From 823bbdd43c20a3f249ccf2f25d5ca68da0dbf185 Mon Sep 17 00:00:00 2001 From: Junyoung Cho Date: Wed, 28 Aug 2013 11:16:40 +0900 Subject: [PATCH 09/29] Fix typos made in PR #764 --- src/components/main/layout/inline.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/main/layout/inline.rs b/src/components/main/layout/inline.rs index 418c5fce73f..96312846d84 100644 --- a/src/components/main/layout/inline.rs +++ b/src/components/main/layout/inline.rs @@ -713,7 +713,7 @@ impl InlineFlowData { let line_height = scanner.calculate_line_height(cur_box, em_size); // Find the top and bottom of the content area. - // Those are used in text-top and text-bottom value of 'vertex-align' + // Those are used in text-top and text-bottom value of 'vertical-align' let text_ascent = text_box.run.font.metrics.ascent; // Offset from the top of the box is 1/2 of the leading + ascent @@ -734,7 +734,7 @@ impl InlineFlowData { let mut top_from_base = top_from_base; let mut bottom_from_base = bottom_from_base; - // To calculate text-top and text-bottom value of 'vertex-align', + // To calculate text-top and text-bottom value of 'vertical-align', // we should find the top and bottom of the content area of parent box. // The content area is defined in "http://www.w3.org/TR/CSS2/visudet.html#inline-non-replaced". // TODO: We should extract em-box info from font size of parent From 0fae7afa5453a6c65215e54c77e00d3aeed127f0 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 28 Aug 2013 01:20:44 -0400 Subject: [PATCH 10/29] Generate bindings for HTMLMeterElement. --- .../script/dom/bindings/codegen/Bindings.conf | 1 + .../bindings/codegen/HTMLMeterElement.webidl | 33 ++++++++++++ src/components/script/dom/bindings/element.rs | 2 + src/components/script/dom/bindings/node.rs | 3 +- src/components/script/dom/element.rs | 1 + src/components/script/dom/htmlmeterelement.rs | 54 +++++++++++++++++++ .../script/html/hubbub_html_parser.rs | 3 +- src/components/script/script.rc | 1 + 8 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 src/components/script/dom/bindings/codegen/HTMLMeterElement.webidl create mode 100644 src/components/script/dom/htmlmeterelement.rs diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index a06d1f2d989..6c085ece6b1 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -585,6 +585,7 @@ addHTMLElement('HTMLLIElement') addHTMLElement('HTMLLinkElement') addHTMLElement('HTMLMapElement') addHTMLElement('HTMLMetaElement') +addHTMLElement('HTMLMeterElement') addHTMLElement('HTMLOListElement') addHTMLElement('HTMLParagraphElement') addHTMLElement('HTMLProgressElement') diff --git a/src/components/script/dom/bindings/codegen/HTMLMeterElement.webidl b/src/components/script/dom/bindings/codegen/HTMLMeterElement.webidl new file mode 100644 index 00000000000..09cf523c462 --- /dev/null +++ b/src/components/script/dom/bindings/codegen/HTMLMeterElement.webidl @@ -0,0 +1,33 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.whatwg.org/specs/web-apps/current-work/#the-meter-element + * + * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and + * Opera Software ASA. You are granted a license to use, reproduce + * and create derivative works of this document. + */ + +// http://www.whatwg.org/specs/web-apps/current-work/#the-meter-element +interface HTMLMeterElement : HTMLElement { + [SetterThrows] + attribute double value; + [SetterThrows] + attribute double min; + [SetterThrows] + attribute double max; + [SetterThrows] + attribute double low; + [SetterThrows] + attribute double high; + [SetterThrows] + attribute double optimum; + + /** + * The labels attribute will be done with bug 556743. + */ + //readonly attribute NodeList labels; +}; diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs index b7e6e013b9c..5e7d66b8c33 100644 --- a/src/components/script/dom/bindings/element.rs +++ b/src/components/script/dom/bindings/element.rs @@ -393,6 +393,8 @@ generate_cacheable_wrapper!(HTMLMapElement, HTMLMapElementBinding::Wrap) generate_binding_object!(HTMLMapElement) generate_cacheable_wrapper!(HTMLMetaElement, HTMLMetaElementBinding::Wrap) generate_binding_object!(HTMLMetaElement) +generate_cacheable_wrapper!(HTMLMeterElement, HTMLMeterElementBinding::Wrap) +generate_binding_object!(HTMLMeterElement) generate_cacheable_wrapper!(HTMLOListElement, HTMLOListElementBinding::Wrap) generate_binding_object!(HTMLOListElement) generate_cacheable_wrapper!(HTMLParagraphElement, HTMLParagraphElementBinding::Wrap) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index f7681775e24..11ed1ba693d 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -17,7 +17,7 @@ use dom::element::{HTMLElementTypeId, HTMLHRElementTypeId, HTMLHtmlElementTypeId, HTMLIframeElementTypeId, HTMLImageElementTypeId, HTMLInputElementTypeId, HTMLLIElementTypeId, HTMLLinkElementTypeId, HTMLMapElementTypeId, HTMLMetaElementTypeId, - HTMLOListElementTypeId, HTMLParagraphElementTypeId, + HTMLMeterElementTypeId, HTMLOListElementTypeId, HTMLParagraphElementTypeId, HTMLProgressElementTypeId, HTMLQuoteElementTypeId, HTMLScriptElementTypeId, HTMLSpanElementTypeId, HTMLSourceElementTypeId, HTMLStyleElementTypeId, HTMLTextAreaElementTypeId, @@ -120,6 +120,7 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> *JSObject ElementNodeTypeId(HTMLLinkElementTypeId) => generate_element!(HTMLLinkElement), ElementNodeTypeId(HTMLMapElementTypeId) => generate_element!(HTMLMapElement), ElementNodeTypeId(HTMLMetaElementTypeId) => generate_element!(HTMLMetaElement), + ElementNodeTypeId(HTMLMeterElementTypeId) => generate_element!(HTMLMeterElement), ElementNodeTypeId(HTMLOListElementTypeId) => generate_element!(HTMLOListElement), ElementNodeTypeId(HTMLParagraphElementTypeId) => generate_element!(HTMLParagraphElement), ElementNodeTypeId(HTMLProgressElementTypeId) => generate_element!(HTMLProgressElement), diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index c4484bcd38d..40231b6d919 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -78,6 +78,7 @@ pub enum ElementTypeId { HTMLLIElementTypeId, HTMLMapElementTypeId, HTMLMetaElementTypeId, + HTMLMeterElementTypeId, HTMLOListElementTypeId, HTMLOptionElementTypeId, HTMLParagraphElementTypeId, diff --git a/src/components/script/dom/htmlmeterelement.rs b/src/components/script/dom/htmlmeterelement.rs new file mode 100644 index 00000000000..3a66308adcd --- /dev/null +++ b/src/components/script/dom/htmlmeterelement.rs @@ -0,0 +1,54 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::ErrorResult; +use dom::htmlelement::HTMLElement; + +pub struct HTMLMeterElement { + parent: HTMLElement +} + +impl HTMLMeterElement { + pub fn Value(&self) -> f64 { + 0.0 + } + + pub fn SetValue(&mut self, _value: f64, _rv: &mut ErrorResult) { + } + + pub fn Min(&self) -> f64 { + 0.0 + } + + pub fn SetMin(&mut self, _min: f64, _rv: &mut ErrorResult) { + } + + pub fn Max(&self) -> f64 { + 0.0 + } + + pub fn SetMax(&mut self, _max: f64, _rv: &mut ErrorResult) { + } + + pub fn Low(&self) -> f64 { + 0.0 + } + + pub fn SetLow(&mut self, _low: f64, _rv: &mut ErrorResult) { + } + + pub fn High(&self) -> f64 { + 0.0 + } + + pub fn SetHigh(&mut self, _high: f64, _rv: &mut ErrorResult) { + } + + pub fn Optimum(&self) -> f64 { + 0.0 + } + + pub fn SetOptimum(&mut self, _optimum: f64, _rv: &mut ErrorResult) { + } +} \ No newline at end of file diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 2b814b50700..2496560b813 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -13,7 +13,7 @@ use dom::element::{HTMLElementTypeId, HTMLHeadElementTypeId, HTMLHtmlElementTypeId, HTMLImageElementTypeId, HTMLIframeElementTypeId, HTMLInputElementTypeId, HTMLLinkElementTypeId, HTMLLIElementTypeId, HTMLMapElementTypeId, HTMLMetaElementTypeId, - HTMLOListElementTypeId, HTMLOptionElementTypeId, + HTMLMeterElementTypeId, HTMLOListElementTypeId, HTMLOptionElementTypeId, HTMLParagraphElementTypeId, HTMLProgressElementTypeId, HTMLQuoteElementTypeId, HTMLScriptElementTypeId, HTMLSelectElementTypeId, HTMLSmallElementTypeId, HTMLSourceElementTypeId, @@ -235,6 +235,7 @@ fn build_element_from_tag(cx: *JSContext, tag: &str) -> AbstractNode handle_element!(cx, tag, "li", HTMLLIElementTypeId, HTMLLIElement, []); handle_element!(cx, tag, "map", HTMLMapElementTypeId, HTMLMapElement, []); handle_element!(cx, tag, "meta", HTMLMetaElementTypeId, HTMLMetaElement, []); + handle_element!(cx, tag, "meter", HTMLMeterElementTypeId, HTMLMeterElement, []); handle_element!(cx, tag, "ol", HTMLOListElementTypeId, HTMLOListElement, []); handle_element!(cx, tag, "option", HTMLOptionElementTypeId, HTMLOptionElement, []); handle_element!(cx, tag, "p", HTMLParagraphElementTypeId, HTMLParagraphElement, []); diff --git a/src/components/script/script.rc b/src/components/script/script.rc index 1350113c498..280ae8f7d73 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -87,6 +87,7 @@ pub mod dom { pub mod htmllinkelement; pub mod htmlmapelement; pub mod htmlmetaelement; + pub mod htmlmeterelement; pub mod htmlolistelement; pub mod htmlparagraphelement; pub mod htmlprogresselement; From 35a5565f51f0101c253decf9d93dc5e6f2262864 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 28 Aug 2013 01:28:50 -0400 Subject: [PATCH 11/29] Remove more unnecessary lists of imports. --- src/components/script/dom/bindings/node.rs | 20 +----------- .../script/html/hubbub_html_parser.rs | 31 +++---------------- 2 files changed, 5 insertions(+), 46 deletions(-) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index 11ed1ba693d..eac6a91088a 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -6,25 +6,7 @@ use dom::bindings::element; use dom::bindings::text; use dom::bindings::utils; use dom::bindings::utils::{CacheableWrapper, WrapperCache, DerivedWrapper}; -use dom::element::{HTMLElementTypeId, - HTMLAnchorElementTypeId, HTMLAppletElementTypeId, - HTMLAreaElementTypeId, HTMLBaseElementTypeId, - HTMLBodyElementTypeId, HTMLBRElementTypeId, HTMLButtonElementTypeId, - HTMLCanvasElementTypeId, HTMLDataElementTypeId, HTMLDataListElementTypeId, - HTMLDirectoryElementTypeId, HTMLDivElementTypeId, HTMLEmbedElementTypeId, - HTMLFieldSetElementTypeId, HTMLFontElementTypeId, HTMLFrameElementTypeId, - HTMLFrameSetElementTypeId, HTMLHeadElementTypeId, HTMLHeadingElementTypeId, - HTMLHRElementTypeId, HTMLHtmlElementTypeId, HTMLIframeElementTypeId, - HTMLImageElementTypeId, HTMLInputElementTypeId, HTMLLIElementTypeId, - HTMLLinkElementTypeId, HTMLMapElementTypeId, HTMLMetaElementTypeId, - HTMLMeterElementTypeId, HTMLOListElementTypeId, HTMLParagraphElementTypeId, - HTMLProgressElementTypeId, HTMLQuoteElementTypeId, HTMLScriptElementTypeId, - HTMLSpanElementTypeId, HTMLSourceElementTypeId, - HTMLStyleElementTypeId, HTMLTextAreaElementTypeId, - HTMLTableElementTypeId, HTMLTableCaptionElementTypeId, HTMLTableCellElementTypeId, - HTMLTableColElementTypeId, - HTMLTableRowElementTypeId, HTMLTableSectionElementTypeId, HTMLTimeElementTypeId, - HTMLTitleElementTypeId, HTMLUListElementTypeId, HTMLDListElementTypeId}; +use dom::element::*; use dom::types::*; use dom::node::{AbstractNode, Node, ElementNodeTypeId, TextNodeTypeId, CommentNodeTypeId}; use dom::node::{DoctypeNodeTypeId, ScriptView}; diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 2496560b813..e88a4194e31 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -2,37 +2,14 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use dom::element::{HTMLElementTypeId, - HTMLAnchorElementTypeId, HTMLAppletElementTypeId, - HTMLAreaElementTypeId, HTMLBaseElementTypeId, HTMLBodyElementTypeId, - HTMLBRElementTypeId, HTMLButtonElementTypeId, HTMLCanvasElementTypeId, - HTMLDataElementTypeId, HTMLDataListElementTypeId, HTMLDivElementTypeId, - HTMLDirectoryElementTypeId, HTMLDListElementTypeId, HTMLEmbedElementTypeId, - HTMLFieldSetElementTypeId, HTMLFontElementTypeId, HTMLFormElementTypeId, - HTMLFrameElementTypeId, HTMLFrameSetElementTypeId, HTMLHRElementTypeId, - HTMLHeadElementTypeId, HTMLHtmlElementTypeId, HTMLImageElementTypeId, - HTMLIframeElementTypeId, HTMLInputElementTypeId, HTMLLinkElementTypeId, - HTMLLIElementTypeId, HTMLMapElementTypeId, HTMLMetaElementTypeId, - HTMLMeterElementTypeId, HTMLOListElementTypeId, HTMLOptionElementTypeId, - HTMLParagraphElementTypeId, HTMLProgressElementTypeId, - HTMLQuoteElementTypeId, HTMLScriptElementTypeId, - HTMLSelectElementTypeId, HTMLSmallElementTypeId, HTMLSourceElementTypeId, - HTMLSpanElementTypeId, HTMLStyleElementTypeId, HTMLTableSectionElementTypeId, - HTMLTableCellElementTypeId, HTMLTableElementTypeId, - HTMLTableCaptionElementTypeId, HTMLTableColElementTypeId, - HTMLTableRowElementTypeId, HTMLTextAreaElementTypeId, - HTMLTimeElementTypeId, HTMLTitleElementTypeId, HTMLUListElementTypeId, - UnknownElementTypeId}; -use dom::element::{HTMLOptionElement, HTMLSelectElement, HTMLSmallElement}; -use dom::element::{HTMLHeadingElementTypeId}; +use dom::bindings::utils::str; +use dom::element::*; +use dom::htmlelement::HTMLElement; use dom::htmlheadingelement::{Heading1, Heading2, Heading3, Heading4, Heading5, Heading6}; use dom::htmliframeelement::IFrameSize; use dom::htmlformelement::HTMLFormElement; -use dom::types::*; -use dom::element::Element; -use dom::htmlelement::HTMLElement; use dom::node::{AbstractNode, Comment, Doctype, ElementNodeTypeId, Node, ScriptView}; -use dom::bindings::utils::str; +use dom::types::*; use html::cssparse::{InlineProvenance, StylesheetProvenance, UrlProvenance, spawn_css_parser}; use js::jsapi::JSContext; use newcss::stylesheet::Stylesheet; From 4c928102911dd9aae2cc7230cc3614d0509c4905 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 28 Aug 2013 01:39:38 -0400 Subject: [PATCH 12/29] Generate bindings for HTMLModElement. --- .../script/dom/bindings/codegen/Bindings.conf | 1 + .../bindings/codegen/HTMLModElement.webidl | 19 ++++++++++++++ src/components/script/dom/bindings/element.rs | 2 ++ src/components/script/dom/bindings/node.rs | 1 + src/components/script/dom/element.rs | 1 + src/components/script/dom/htmlmodelement.rs | 26 +++++++++++++++++++ .../script/html/hubbub_html_parser.rs | 1 + src/components/script/script.rc | 1 + 8 files changed, 52 insertions(+) create mode 100644 src/components/script/dom/bindings/codegen/HTMLModElement.webidl create mode 100644 src/components/script/dom/htmlmodelement.rs diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 6c085ece6b1..aab4b270349 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -586,6 +586,7 @@ addHTMLElement('HTMLLinkElement') addHTMLElement('HTMLMapElement') addHTMLElement('HTMLMetaElement') addHTMLElement('HTMLMeterElement') +addHTMLElement('HTMLModElement') addHTMLElement('HTMLOListElement') addHTMLElement('HTMLParagraphElement') addHTMLElement('HTMLProgressElement') diff --git a/src/components/script/dom/bindings/codegen/HTMLModElement.webidl b/src/components/script/dom/bindings/codegen/HTMLModElement.webidl new file mode 100644 index 00000000000..45086ccebbf --- /dev/null +++ b/src/components/script/dom/bindings/codegen/HTMLModElement.webidl @@ -0,0 +1,19 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.whatwg.org/specs/web-apps/current-work/#attributes-common-to-ins-and-del-elements + * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and + * Opera Software ASA. You are granted a license to use, reproduce + * and create derivative works of this document. + */ + +// http://www.whatwg.org/specs/web-apps/current-work/#attributes-common-to-ins-and-del-elements +interface HTMLModElement : HTMLElement { + [SetterThrows, Pure] + attribute DOMString cite; + [SetterThrows, Pure] + attribute DOMString dateTime; +}; diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs index 5e7d66b8c33..e351f4f113d 100644 --- a/src/components/script/dom/bindings/element.rs +++ b/src/components/script/dom/bindings/element.rs @@ -395,6 +395,8 @@ generate_cacheable_wrapper!(HTMLMetaElement, HTMLMetaElementBinding::Wrap) generate_binding_object!(HTMLMetaElement) generate_cacheable_wrapper!(HTMLMeterElement, HTMLMeterElementBinding::Wrap) generate_binding_object!(HTMLMeterElement) +generate_cacheable_wrapper!(HTMLModElement, HTMLModElementBinding::Wrap) +generate_binding_object!(HTMLModElement) generate_cacheable_wrapper!(HTMLOListElement, HTMLOListElementBinding::Wrap) generate_binding_object!(HTMLOListElement) generate_cacheable_wrapper!(HTMLParagraphElement, HTMLParagraphElementBinding::Wrap) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index eac6a91088a..f68d25187b0 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -103,6 +103,7 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> *JSObject ElementNodeTypeId(HTMLMapElementTypeId) => generate_element!(HTMLMapElement), ElementNodeTypeId(HTMLMetaElementTypeId) => generate_element!(HTMLMetaElement), ElementNodeTypeId(HTMLMeterElementTypeId) => generate_element!(HTMLMeterElement), + ElementNodeTypeId(HTMLModElementTypeId) => generate_element!(HTMLModElement), ElementNodeTypeId(HTMLOListElementTypeId) => generate_element!(HTMLOListElement), ElementNodeTypeId(HTMLParagraphElementTypeId) => generate_element!(HTMLParagraphElement), ElementNodeTypeId(HTMLProgressElementTypeId) => generate_element!(HTMLProgressElement), diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 40231b6d919..571d50ca248 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -79,6 +79,7 @@ pub enum ElementTypeId { HTMLMapElementTypeId, HTMLMetaElementTypeId, HTMLMeterElementTypeId, + HTMLModElementTypeId, HTMLOListElementTypeId, HTMLOptionElementTypeId, HTMLParagraphElementTypeId, diff --git a/src/components/script/dom/htmlmodelement.rs b/src/components/script/dom/htmlmodelement.rs new file mode 100644 index 00000000000..aec788fc674 --- /dev/null +++ b/src/components/script/dom/htmlmodelement.rs @@ -0,0 +1,26 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::{DOMString, null_string, ErrorResult}; +use dom::htmlelement::HTMLElement; + +pub struct HTMLModElement { + parent: HTMLElement +} + +impl HTMLModElement { + pub fn Cite(&self) -> DOMString { + null_string + } + + pub fn SetCite(&mut self, _cite: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn DateTime(&self) -> DOMString { + null_string + } + + pub fn SetDateTime(&mut self, _datetime: &DOMString, _rv: &mut ErrorResult) { + } +} diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index e88a4194e31..157173b2720 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -213,6 +213,7 @@ fn build_element_from_tag(cx: *JSContext, tag: &str) -> AbstractNode handle_element!(cx, tag, "map", HTMLMapElementTypeId, HTMLMapElement, []); handle_element!(cx, tag, "meta", HTMLMetaElementTypeId, HTMLMetaElement, []); handle_element!(cx, tag, "meter", HTMLMeterElementTypeId, HTMLMeterElement, []); + handle_element!(cx, tag, "mod", HTMLModElementTypeId, HTMLModElement, []); handle_element!(cx, tag, "ol", HTMLOListElementTypeId, HTMLOListElement, []); handle_element!(cx, tag, "option", HTMLOptionElementTypeId, HTMLOptionElement, []); handle_element!(cx, tag, "p", HTMLParagraphElementTypeId, HTMLParagraphElement, []); diff --git a/src/components/script/script.rc b/src/components/script/script.rc index 280ae8f7d73..c4e3db1237c 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -88,6 +88,7 @@ pub mod dom { pub mod htmlmapelement; pub mod htmlmetaelement; pub mod htmlmeterelement; + pub mod htmlmodelement; pub mod htmlolistelement; pub mod htmlparagraphelement; pub mod htmlprogresselement; From 7058c16381d77c74ef7dd4e5d7b41755a23eb634 Mon Sep 17 00:00:00 2001 From: Youngmin Yoo Date: Tue, 27 Aug 2013 11:23:22 +0900 Subject: [PATCH 13/29] Update clean-servo in clean.mk --- mk/clean.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/mk/clean.mk b/mk/clean.mk index 63dc6cbf7b3..2b707718b2a 100644 --- a/mk/clean.mk +++ b/mk/clean.mk @@ -48,3 +48,4 @@ clean-script: clean-servo: clean-gfx clean-util clean-net clean-script clean-msg @$(call E, "cleaning servo") $(Q)rm -f servo servo-test libservo*.so + $(Q)cd $(BINDINGS_SRC) && rm -f *.pkl From a2739fd1962d1738216adb610f29a98a3ddb51f2 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 28 Aug 2013 09:22:08 -0400 Subject: [PATCH 14/29] Generate bindings for HTMLObjectElement. --- .../script/dom/bindings/codegen/Bindings.conf | 1 + .../bindings/codegen/HTMLObjectElement.webidl | 201 ++++++++++++++++++ src/components/script/dom/bindings/element.rs | 2 + src/components/script/dom/bindings/node.rs | 1 + src/components/script/dom/element.rs | 1 + .../script/dom/htmlobjectelement.rs | 163 ++++++++++++++ .../script/html/hubbub_html_parser.rs | 1 + src/components/script/script.rc | 1 + 8 files changed, 371 insertions(+) create mode 100644 src/components/script/dom/bindings/codegen/HTMLObjectElement.webidl create mode 100644 src/components/script/dom/htmlobjectelement.rs diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index aab4b270349..fc4d48cfb7d 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -587,6 +587,7 @@ addHTMLElement('HTMLMapElement') addHTMLElement('HTMLMetaElement') addHTMLElement('HTMLMeterElement') addHTMLElement('HTMLModElement') +addHTMLElement('HTMLObjectElement') addHTMLElement('HTMLOListElement') addHTMLElement('HTMLParagraphElement') addHTMLElement('HTMLProgressElement') diff --git a/src/components/script/dom/bindings/codegen/HTMLObjectElement.webidl b/src/components/script/dom/bindings/codegen/HTMLObjectElement.webidl new file mode 100644 index 00000000000..03e5984592f --- /dev/null +++ b/src/components/script/dom/bindings/codegen/HTMLObjectElement.webidl @@ -0,0 +1,201 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.whatwg.org/specs/web-apps/current-work/#the-object-element + * http://www.whatwg.org/specs/web-apps/current-work/#HTMLObjectElement-partial + * + * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and + * Opera Software ASA. You are granted a license to use, reproduce + * and create derivative works of this document. + */ + +// http://www.whatwg.org/specs/web-apps/current-work/#the-object-element +[NeedNewResolve] +interface HTMLObjectElement : HTMLElement { + [Pure, SetterThrows] + attribute DOMString data; + [Pure, SetterThrows] + attribute DOMString type; +// attribute boolean typeMustMatch; + [Pure, SetterThrows] + attribute DOMString name; + [Pure, SetterThrows] + attribute DOMString useMap; + [Pure] + readonly attribute HTMLFormElement? form; + [Pure, SetterThrows] + attribute DOMString width; + [Pure, SetterThrows] + attribute DOMString height; + // Not pure: can trigger about:blank instantiation + readonly attribute Document? contentDocument; + // Not pure: can trigger about:blank instantiation + readonly attribute WindowProxy? contentWindow; + + readonly attribute boolean willValidate; + readonly attribute ValidityState validity; + readonly attribute DOMString validationMessage; + boolean checkValidity(); + void setCustomValidity(DOMString error); + + /*[Throws] + legacycaller any (any... arguments);*/ +}; + +// http://www.whatwg.org/specs/web-apps/current-work/#HTMLObjectElement-partial +partial interface HTMLObjectElement { + [Pure, SetterThrows] + attribute DOMString align; + [Pure, SetterThrows] + attribute DOMString archive; + [Pure, SetterThrows] + attribute DOMString code; + [Pure, SetterThrows] + attribute boolean declare; + [Pure, SetterThrows] + attribute unsigned long hspace; + [Pure, SetterThrows] + attribute DOMString standby; + [Pure, SetterThrows] + attribute unsigned long vspace; + [Pure, SetterThrows] + attribute DOMString codeBase; + [Pure, SetterThrows] + attribute DOMString codeType; + + [TreatNullAs=EmptyString, Pure, SetterThrows] + attribute DOMString border; +}; + +partial interface HTMLObjectElement { + // GetSVGDocument + Document? getSVGDocument(); +}; + +/*[NoInterfaceObject] +interface MozObjectLoadingContent { + // Mirrored chrome-only scriptable nsIObjectLoadingContent methods. Please + // make sure to update this list if nsIObjectLoadingContent changes. Also, + // make sure everything on here is [ChromeOnly]. + [ChromeOnly] + const unsigned long TYPE_LOADING = 0; + [ChromeOnly] + const unsigned long TYPE_IMAGE = 1; + [ChromeOnly] + const unsigned long TYPE_PLUGIN = 2; + [ChromeOnly] + const unsigned long TYPE_DOCUMENT = 3; + [ChromeOnly] + const unsigned long TYPE_NULL = 4; + + // The content type is not supported (e.g. plugin not installed) + [ChromeOnly] + const unsigned long PLUGIN_UNSUPPORTED = 0; + // Showing alternate content + [ChromeOnly] + const unsigned long PLUGIN_ALTERNATE = 1; + // The plugin exists, but is disabled + [ChromeOnly] + const unsigned long PLUGIN_DISABLED = 2; + // The plugin is blocklisted and disabled + [ChromeOnly] + const unsigned long PLUGIN_BLOCKLISTED = 3; + // The plugin is considered outdated, but not disabled + [ChromeOnly] + const unsigned long PLUGIN_OUTDATED = 4; + // The plugin has crashed + [ChromeOnly] + const unsigned long PLUGIN_CRASHED = 5; + // Suppressed by security policy + [ChromeOnly] + const unsigned long PLUGIN_SUPPRESSED = 6; + // Blocked by content policy + [ChromeOnly] + const unsigned long PLUGIN_USER_DISABLED = 7; + /// ** All values >= PLUGIN_CLICK_TO_PLAY are plugin placeholder types that + /// would be replaced by a real plugin if activated (playPlugin()) + /// ** Furthermore, values >= PLUGIN_CLICK_TO_PLAY and + /// <= PLUGIN_VULNERABLE_NO_UPDATE are click-to-play types. + // The plugin is disabled until the user clicks on it + [ChromeOnly] + const unsigned long PLUGIN_CLICK_TO_PLAY = 8; + // The plugin is vulnerable (update available) + [ChromeOnly] + const unsigned long PLUGIN_VULNERABLE_UPDATABLE = 9; + // The plugin is vulnerable (no update available) + [ChromeOnly] + const unsigned long PLUGIN_VULNERABLE_NO_UPDATE = 10; + // The plugin is in play preview mode + [ChromeOnly] + const unsigned long PLUGIN_PLAY_PREVIEW = 11;*/ + + /** + * The actual mime type (the one we got back from the network + * request) for the element. + */ +/*[ChromeOnly] + readonly attribute DOMString actualType;*/ + + /** + * Gets the type of the content that's currently loaded. See + * the constants above for the list of possible values. + */ +/*[ChromeOnly] + readonly attribute unsigned long displayedType;*/ + + /** + * Gets the content type that corresponds to the give MIME type. See the + * constants above for the list of possible values. If nothing else fits, + * TYPE_NULL will be returned. + */ +/*[ChromeOnly] + unsigned long getContentTypeForMIMEType(DOMString aMimeType);*/ + + /** + * This method will play a plugin that has been stopped by the + * click-to-play plugins or play-preview features. + */ +/*[ChromeOnly, Throws] + void playPlugin();*/ + + /** + * This attribute will return true if the current content type has been + * activated, either explicitly or by passing checks that would have it be + * click-to-play or play-preview. + */ +/*[ChromeOnly] + readonly attribute boolean activated;*/ + + /** + * The URL of the data/src loaded in the object. This may be null (i.e. + * an with no src). + */ +/*[ChromeOnly] + readonly attribute URI? srcURI; + + [ChromeOnly] + readonly attribute unsigned long defaultFallbackType; + + [ChromeOnly] + readonly attribute unsigned long pluginFallbackType;*/ + + /** + * If this object currently owns a running plugin, regardless of whether or + * not one is pending spawn/despawn. + */ +/*[ChromeOnly] + readonly attribute boolean hasRunningPlugin;*/ + + /** + * This method will disable the play-preview plugin state. + */ + /*[ChromeOnly, Throws] + void cancelPlayPreview();*/ +//}; + +/*HTMLObjectElement implements MozImageLoadingContent; +HTMLObjectElement implements MozFrameLoaderOwner; +HTMLObjectElement implements MozObjectLoadingContent;*/ diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs index e351f4f113d..2a3b29ca6da 100644 --- a/src/components/script/dom/bindings/element.rs +++ b/src/components/script/dom/bindings/element.rs @@ -397,6 +397,8 @@ generate_cacheable_wrapper!(HTMLMeterElement, HTMLMeterElementBinding::Wrap) generate_binding_object!(HTMLMeterElement) generate_cacheable_wrapper!(HTMLModElement, HTMLModElementBinding::Wrap) generate_binding_object!(HTMLModElement) +generate_cacheable_wrapper!(HTMLObjectElement, HTMLObjectElementBinding::Wrap) +generate_binding_object!(HTMLObjectElement) generate_cacheable_wrapper!(HTMLOListElement, HTMLOListElementBinding::Wrap) generate_binding_object!(HTMLOListElement) generate_cacheable_wrapper!(HTMLParagraphElement, HTMLParagraphElementBinding::Wrap) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index f68d25187b0..8ec2ea22636 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -104,6 +104,7 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> *JSObject ElementNodeTypeId(HTMLMetaElementTypeId) => generate_element!(HTMLMetaElement), ElementNodeTypeId(HTMLMeterElementTypeId) => generate_element!(HTMLMeterElement), ElementNodeTypeId(HTMLModElementTypeId) => generate_element!(HTMLModElement), + ElementNodeTypeId(HTMLObjectElementTypeId) => generate_element!(HTMLObjectElement), ElementNodeTypeId(HTMLOListElementTypeId) => generate_element!(HTMLOListElement), ElementNodeTypeId(HTMLParagraphElementTypeId) => generate_element!(HTMLParagraphElement), ElementNodeTypeId(HTMLProgressElementTypeId) => generate_element!(HTMLProgressElement), diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 571d50ca248..d5b3619d9e5 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -80,6 +80,7 @@ pub enum ElementTypeId { HTMLMetaElementTypeId, HTMLMeterElementTypeId, HTMLModElementTypeId, + HTMLObjectElementTypeId, HTMLOListElementTypeId, HTMLOptionElementTypeId, HTMLParagraphElementTypeId, diff --git a/src/components/script/dom/htmlobjectelement.rs b/src/components/script/dom/htmlobjectelement.rs new file mode 100644 index 00000000000..9246c631184 --- /dev/null +++ b/src/components/script/dom/htmlobjectelement.rs @@ -0,0 +1,163 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::{DOMString, null_string, ErrorResult}; +use dom::document::AbstractDocument; +use dom::htmlelement::HTMLElement; +use dom::node::{AbstractNode, ScriptView}; +use dom::validitystate::ValidityState; +use dom::windowproxy::WindowProxy; + +pub struct HTMLObjectElement { + parent: HTMLElement +} + +impl HTMLObjectElement { + pub fn Data(&self) -> DOMString { + null_string + } + + pub fn SetData(&mut self, _data: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Type(&self) -> DOMString { + null_string + } + + pub fn SetType(&mut self, _type: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Name(&self) -> DOMString { + null_string + } + + pub fn SetName(&mut self, _name: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn UseMap(&self) -> DOMString { + null_string + } + + pub fn SetUseMap(&mut self, _use_map: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn GetForm(&self) -> Option> { + None + } + + pub fn Width(&self) -> DOMString { + null_string + } + + pub fn SetWidth(&mut self, _width: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Height(&self) -> DOMString { + null_string + } + + pub fn SetHeight(&mut self, _height: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn GetContentDocument(&self) -> Option { + None + } + + pub fn GetContentWindow(&self) -> Option<@mut WindowProxy> { + None + } + + pub fn WillValidate(&self) -> bool { + false + } + + pub fn Validity(&self) -> @mut ValidityState { + @mut ValidityState::valid() + } + + pub fn ValidationMessage(&self) -> DOMString { + null_string + } + + pub fn CheckValidity(&self) -> bool { + false + } + + pub fn SetCustomValidity(&mut self, _error: &DOMString) { + } + + pub fn Align(&self) -> DOMString { + null_string + } + + pub fn SetAlign(&mut self, _align: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Archive(&self) -> DOMString { + null_string + } + + pub fn SetArchive(&mut self, _archive: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Code(&self) -> DOMString { + null_string + } + + pub fn SetCode(&mut self, _code: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Declare(&self) -> bool { + false + } + + pub fn SetDeclare(&mut self, _declare: bool, _rv: &mut ErrorResult) { + } + + pub fn Hspace(&self) -> u32 { + 0 + } + + pub fn SetHspace(&mut self, _hspace: u32, _rv: &mut ErrorResult) { + } + + pub fn Standby(&self) -> DOMString { + null_string + } + + pub fn SetStandby(&mut self, _standby: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Vspace(&self) -> u32 { + 0 + } + + pub fn SetVspace(&mut self, _vspace: u32, _rv: &mut ErrorResult) { + } + + pub fn CodeBase(&self) -> DOMString { + null_string + } + + pub fn SetCodeBase(&mut self, _codebase: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn CodeType(&self) -> DOMString { + null_string + } + + pub fn SetCodeType(&mut self, _codetype: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Border(&self) -> DOMString { + null_string + } + + pub fn SetBorder(&mut self, _border: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn GetSVGDocument(&self) -> Option { + None + } +} \ No newline at end of file diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 157173b2720..c29d1942b01 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -214,6 +214,7 @@ fn build_element_from_tag(cx: *JSContext, tag: &str) -> AbstractNode handle_element!(cx, tag, "meta", HTMLMetaElementTypeId, HTMLMetaElement, []); handle_element!(cx, tag, "meter", HTMLMeterElementTypeId, HTMLMeterElement, []); handle_element!(cx, tag, "mod", HTMLModElementTypeId, HTMLModElement, []); + handle_element!(cx, tag, "object", HTMLObjectElementTypeId, HTMLObjectElement, []); handle_element!(cx, tag, "ol", HTMLOListElementTypeId, HTMLOListElement, []); handle_element!(cx, tag, "option", HTMLOptionElementTypeId, HTMLOptionElement, []); handle_element!(cx, tag, "p", HTMLParagraphElementTypeId, HTMLParagraphElement, []); diff --git a/src/components/script/script.rc b/src/components/script/script.rc index c4e3db1237c..f2a829f6a99 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -89,6 +89,7 @@ pub mod dom { pub mod htmlmetaelement; pub mod htmlmeterelement; pub mod htmlmodelement; + pub mod htmlobjectelement; pub mod htmlolistelement; pub mod htmlparagraphelement; pub mod htmlprogresselement; From 32ed715055cafe739fd464860c028f35e8794de2 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 28 Aug 2013 15:47:11 -0400 Subject: [PATCH 15/29] Make window.close() close the window. --- src/components/main/compositing/mod.rs | 4 ++++ src/components/msg/compositor_msg.rs | 1 + src/components/script/script_task.rs | 1 + 3 files changed, 6 insertions(+) diff --git a/src/components/main/compositing/mod.rs b/src/components/main/compositing/mod.rs index f5c7f48d3d9..f66992c60a3 100644 --- a/src/components/main/compositing/mod.rs +++ b/src/components/main/compositing/mod.rs @@ -67,6 +67,10 @@ impl ScriptListener for CompositorChan { self.chan.send(InvalidateRect(id, rect)); } + fn close(&self) { + self.chan.send(Exit); + } + } /// Implementation of the abstract `RenderListener` interface. diff --git a/src/components/msg/compositor_msg.rs b/src/components/msg/compositor_msg.rs index 58a3b66a1b7..89a01604766 100644 --- a/src/components/msg/compositor_msg.rs +++ b/src/components/msg/compositor_msg.rs @@ -80,6 +80,7 @@ pub trait RenderListener { pub trait ScriptListener : Clone { fn set_ready_state(&self, ReadyState); fn invalidate_rect(&self, PipelineId, Rect); + fn close(&self); } /// The interface used by the quadtree to get info about LayerBuffers diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index 870dec7468d..688176bc4c8 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -564,6 +564,7 @@ impl ScriptTask { } page.layout_chan.send(layout_interface::ExitMsg); } + self.compositor.close(); } /// The entry point to document loading. Defines bindings, sets up the window and document From 4e3b948a3742be89d53985c3739c428eb0d990dd Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 28 Aug 2013 17:25:37 -0400 Subject: [PATCH 16/29] Generate bindings for HTMLOptGroupElement. --- .../script/dom/bindings/codegen/Bindings.conf | 3 ++- .../codegen/HTMLOptGroupElement.webidl | 19 ++++++++++++++ src/components/script/dom/bindings/element.rs | 2 ++ src/components/script/dom/bindings/node.rs | 1 + src/components/script/dom/element.rs | 1 + .../script/dom/htmloptgroupelement.rs | 26 +++++++++++++++++++ .../script/html/hubbub_html_parser.rs | 1 + src/components/script/script.rc | 1 + 8 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/components/script/dom/bindings/codegen/HTMLOptGroupElement.webidl create mode 100644 src/components/script/dom/htmloptgroupelement.rs diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index fc4d48cfb7d..3b40c34476e 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -589,6 +589,7 @@ addHTMLElement('HTMLMeterElement') addHTMLElement('HTMLModElement') addHTMLElement('HTMLObjectElement') addHTMLElement('HTMLOListElement') +addHTMLElement('HTMLOptGroupElement') addHTMLElement('HTMLParagraphElement') addHTMLElement('HTMLProgressElement') addHTMLElement('HTMLQuoteElement') @@ -615,7 +616,7 @@ def addExternalHTMLElement(element): headerFile=nativeElement + '.h') addExternalHTMLElement('HTMLOptionElement') -addExternalHTMLElement('HTMLOptGroupElement') +#addExternalHTMLElement('HTMLOptGroupElement') addExternalHTMLElement('HTMLVideoElement') addExternalIface('CanvasGradient', headerFile='nsIDOMCanvasRenderingContext2D.h') addExternalIface('CanvasPattern', headerFile='nsIDOMCanvasRenderingContext2D.h') diff --git a/src/components/script/dom/bindings/codegen/HTMLOptGroupElement.webidl b/src/components/script/dom/bindings/codegen/HTMLOptGroupElement.webidl new file mode 100644 index 00000000000..a23aee30d1d --- /dev/null +++ b/src/components/script/dom/bindings/codegen/HTMLOptGroupElement.webidl @@ -0,0 +1,19 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.whatwg.org/specs/web-apps/current-work/#the-optgroup-element + * + * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and + * Opera Software ASA. You are granted a license to use, reproduce + * and create derivative works of this document. + */ + +interface HTMLOptGroupElement : HTMLElement { + [SetterThrows] + attribute boolean disabled; + [SetterThrows] + attribute DOMString label; +}; diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs index 2a3b29ca6da..57219659a41 100644 --- a/src/components/script/dom/bindings/element.rs +++ b/src/components/script/dom/bindings/element.rs @@ -401,6 +401,8 @@ generate_cacheable_wrapper!(HTMLObjectElement, HTMLObjectElementBinding::Wrap) generate_binding_object!(HTMLObjectElement) generate_cacheable_wrapper!(HTMLOListElement, HTMLOListElementBinding::Wrap) generate_binding_object!(HTMLOListElement) +generate_cacheable_wrapper!(HTMLOptGroupElement, HTMLOptGroupElementBinding::Wrap) +generate_binding_object!(HTMLOptGroupElement) generate_cacheable_wrapper!(HTMLParagraphElement, HTMLParagraphElementBinding::Wrap) generate_binding_object!(HTMLParagraphElement) generate_cacheable_wrapper!(HTMLProgressElement, HTMLProgressElementBinding::Wrap) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index 8ec2ea22636..1b5b5ad5cd2 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -106,6 +106,7 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> *JSObject ElementNodeTypeId(HTMLModElementTypeId) => generate_element!(HTMLModElement), ElementNodeTypeId(HTMLObjectElementTypeId) => generate_element!(HTMLObjectElement), ElementNodeTypeId(HTMLOListElementTypeId) => generate_element!(HTMLOListElement), + ElementNodeTypeId(HTMLOptGroupElementTypeId) => generate_element!(HTMLOptGroupElement), ElementNodeTypeId(HTMLParagraphElementTypeId) => generate_element!(HTMLParagraphElement), ElementNodeTypeId(HTMLProgressElementTypeId) => generate_element!(HTMLProgressElement), ElementNodeTypeId(HTMLQuoteElementTypeId) => generate_element!(HTMLQuoteElement), diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index d5b3619d9e5..c91f2c4162a 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -83,6 +83,7 @@ pub enum ElementTypeId { HTMLObjectElementTypeId, HTMLOListElementTypeId, HTMLOptionElementTypeId, + HTMLOptGroupElementTypeId, HTMLParagraphElementTypeId, HTMLProgressElementTypeId, HTMLQuoteElementTypeId, diff --git a/src/components/script/dom/htmloptgroupelement.rs b/src/components/script/dom/htmloptgroupelement.rs new file mode 100644 index 00000000000..a5beb9155e0 --- /dev/null +++ b/src/components/script/dom/htmloptgroupelement.rs @@ -0,0 +1,26 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::{DOMString, ErrorResult, null_string}; +use dom::htmlelement::HTMLElement; + +pub struct HTMLOptGroupElement { + parent: HTMLElement +} + +impl HTMLOptGroupElement { + pub fn Disabled(&self) -> bool { + false + } + + pub fn SetDisabled(&mut self, _disabled: bool, _rv: &mut ErrorResult) { + } + + pub fn Label(&self) -> DOMString { + null_string + } + + pub fn SetLabel(&mut self, _label: &DOMString, _rv: &mut ErrorResult) { + } +} diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index c29d1942b01..36dc9e00902 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -217,6 +217,7 @@ fn build_element_from_tag(cx: *JSContext, tag: &str) -> AbstractNode handle_element!(cx, tag, "object", HTMLObjectElementTypeId, HTMLObjectElement, []); handle_element!(cx, tag, "ol", HTMLOListElementTypeId, HTMLOListElement, []); handle_element!(cx, tag, "option", HTMLOptionElementTypeId, HTMLOptionElement, []); + handle_element!(cx, tag, "optgroup",HTMLOptGroupElementTypeId, HTMLOptGroupElement, []); handle_element!(cx, tag, "p", HTMLParagraphElementTypeId, HTMLParagraphElement, []); handle_element!(cx, tag, "progress",HTMLProgressElementTypeId, HTMLProgressElement, []); handle_element!(cx, tag, "q", HTMLQuoteElementTypeId, HTMLQuoteElement, []); diff --git a/src/components/script/script.rc b/src/components/script/script.rc index f2a829f6a99..eae0e3c4cd8 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -91,6 +91,7 @@ pub mod dom { pub mod htmlmodelement; pub mod htmlobjectelement; pub mod htmlolistelement; + pub mod htmloptgroupelement; pub mod htmlparagraphelement; pub mod htmlprogresselement; pub mod htmlquoteelement; From cb0adec792e8da52f25ec8821c20fd9f2a04a54f Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 28 Aug 2013 17:36:37 -0400 Subject: [PATCH 17/29] Generate bindings for HTMLOptionElement. --- .../script/dom/bindings/codegen/Bindings.conf | 3 +- .../bindings/codegen/HTMLOptionElement.webidl | 31 +++++++++ src/components/script/dom/bindings/element.rs | 2 + src/components/script/dom/bindings/node.rs | 1 + src/components/script/dom/element.rs | 1 - .../script/dom/htmloptionelement.rs | 63 +++++++++++++++++++ src/components/script/script.rc | 1 + 7 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 src/components/script/dom/bindings/codegen/HTMLOptionElement.webidl create mode 100644 src/components/script/dom/htmloptionelement.rs diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 3b40c34476e..bd772f12669 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -590,6 +590,7 @@ addHTMLElement('HTMLModElement') addHTMLElement('HTMLObjectElement') addHTMLElement('HTMLOListElement') addHTMLElement('HTMLOptGroupElement') +addHTMLElement('HTMLOptionElement') addHTMLElement('HTMLParagraphElement') addHTMLElement('HTMLProgressElement') addHTMLElement('HTMLQuoteElement') @@ -615,8 +616,6 @@ def addExternalHTMLElement(element): addExternalIface(element, nativeType=nativeElement, headerFile=nativeElement + '.h') -addExternalHTMLElement('HTMLOptionElement') -#addExternalHTMLElement('HTMLOptGroupElement') addExternalHTMLElement('HTMLVideoElement') addExternalIface('CanvasGradient', headerFile='nsIDOMCanvasRenderingContext2D.h') addExternalIface('CanvasPattern', headerFile='nsIDOMCanvasRenderingContext2D.h') diff --git a/src/components/script/dom/bindings/codegen/HTMLOptionElement.webidl b/src/components/script/dom/bindings/codegen/HTMLOptionElement.webidl new file mode 100644 index 00000000000..c80bedeef04 --- /dev/null +++ b/src/components/script/dom/bindings/codegen/HTMLOptionElement.webidl @@ -0,0 +1,31 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.whatwg.org/specs/web-apps/current-work/#the-option-element + * + * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and + * Opera Software ASA. You are granted a license to use, reproduce + * and create derivative works of this document. + */ + +[NamedConstructor=Option(optional DOMString text, optional DOMString value, optional boolean defaultSelected, optional boolean selected)] +interface HTMLOptionElement : HTMLElement { + [SetterThrows] + attribute boolean disabled; + readonly attribute HTMLFormElement? form; + [SetterThrows] + attribute DOMString label; + [SetterThrows] + attribute boolean defaultSelected; + [SetterThrows] + attribute boolean selected; + [SetterThrows] + attribute DOMString value; + + [SetterThrows] + attribute DOMString text; + readonly attribute long index; +}; diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs index 57219659a41..c41940a9ff8 100644 --- a/src/components/script/dom/bindings/element.rs +++ b/src/components/script/dom/bindings/element.rs @@ -403,6 +403,8 @@ generate_cacheable_wrapper!(HTMLOListElement, HTMLOListElementBinding::Wrap) generate_binding_object!(HTMLOListElement) generate_cacheable_wrapper!(HTMLOptGroupElement, HTMLOptGroupElementBinding::Wrap) generate_binding_object!(HTMLOptGroupElement) +generate_cacheable_wrapper!(HTMLOptionElement, HTMLOptionElementBinding::Wrap) +generate_binding_object!(HTMLOptionElement) generate_cacheable_wrapper!(HTMLParagraphElement, HTMLParagraphElementBinding::Wrap) generate_binding_object!(HTMLParagraphElement) generate_cacheable_wrapper!(HTMLProgressElement, HTMLProgressElementBinding::Wrap) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index 1b5b5ad5cd2..73d4734837c 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -107,6 +107,7 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> *JSObject ElementNodeTypeId(HTMLObjectElementTypeId) => generate_element!(HTMLObjectElement), ElementNodeTypeId(HTMLOListElementTypeId) => generate_element!(HTMLOListElement), ElementNodeTypeId(HTMLOptGroupElementTypeId) => generate_element!(HTMLOptGroupElement), + ElementNodeTypeId(HTMLOptionElementTypeId) => generate_element!(HTMLOptionElement), ElementNodeTypeId(HTMLParagraphElementTypeId) => generate_element!(HTMLParagraphElement), ElementNodeTypeId(HTMLProgressElementTypeId) => generate_element!(HTMLProgressElement), ElementNodeTypeId(HTMLQuoteElementTypeId) => generate_element!(HTMLQuoteElement), diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index c91f2c4162a..3bd21a60593 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -110,7 +110,6 @@ pub enum ElementTypeId { // Regular old elements // -pub struct HTMLOptionElement { parent: HTMLElement } pub struct HTMLSelectElement { parent: HTMLElement } pub struct HTMLSmallElement { parent: HTMLElement } pub struct UnknownElement { parent: HTMLElement } diff --git a/src/components/script/dom/htmloptionelement.rs b/src/components/script/dom/htmloptionelement.rs new file mode 100644 index 00000000000..c8453f85747 --- /dev/null +++ b/src/components/script/dom/htmloptionelement.rs @@ -0,0 +1,63 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::{DOMString, ErrorResult, null_string}; +use dom::htmlelement::HTMLElement; +use dom::node::{AbstractNode, ScriptView}; + +pub struct HTMLOptionElement { + parent: HTMLElement +} + +impl HTMLOptionElement { + pub fn Disabled(&self) -> bool { + false + } + + pub fn SetDisabled(&mut self, _disabled: bool, _rv: &mut ErrorResult) { + } + + pub fn GetForm(&self) -> Option> { + None + } + + pub fn Label(&self) -> DOMString { + null_string + } + + pub fn SetLabel(&mut self, _label: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn DefaultSelected(&self) -> bool { + false + } + + pub fn SetDefaultSelected(&mut self, _default_selected: bool, _rv: &mut ErrorResult) { + } + + pub fn Selected(&self) -> bool { + false + } + + pub fn SetSelected(&mut self, _selected: bool, _rv: &mut ErrorResult) { + } + + pub fn Value(&self) -> DOMString { + null_string + } + + pub fn SetValue(&mut self, _value: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Text(&self) -> DOMString { + null_string + } + + pub fn SetText(&mut self, _text: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Index(&self) -> i32 { + 0 + } +} \ No newline at end of file diff --git a/src/components/script/script.rc b/src/components/script/script.rc index eae0e3c4cd8..9f7f9c7131d 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -92,6 +92,7 @@ pub mod dom { pub mod htmlobjectelement; pub mod htmlolistelement; pub mod htmloptgroupelement; + pub mod htmloptionelement; pub mod htmlparagraphelement; pub mod htmlprogresselement; pub mod htmlquoteelement; From 8693459b2885b435a231c1c1686786bba30d8a6a Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 28 Aug 2013 17:47:29 -0400 Subject: [PATCH 18/29] Generate bindings for HTMLOutputElement. --- .../script/dom/bindings/codegen/Bindings.conf | 1 + .../bindings/codegen/HTMLOutputElement.webidl | 37 ++++++++++ src/components/script/dom/bindings/element.rs | 2 + src/components/script/dom/bindings/node.rs | 1 + src/components/script/dom/element.rs | 3 +- .../script/dom/htmloutputelement.rs | 71 +++++++++++++++++++ .../script/html/hubbub_html_parser.rs | 1 + src/components/script/script.rc | 1 + 8 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 src/components/script/dom/bindings/codegen/HTMLOutputElement.webidl create mode 100644 src/components/script/dom/htmloutputelement.rs diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index bd772f12669..94612333bce 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -591,6 +591,7 @@ addHTMLElement('HTMLObjectElement') addHTMLElement('HTMLOListElement') addHTMLElement('HTMLOptGroupElement') addHTMLElement('HTMLOptionElement') +addHTMLElement('HTMLOutputElement') addHTMLElement('HTMLParagraphElement') addHTMLElement('HTMLProgressElement') addHTMLElement('HTMLQuoteElement') diff --git a/src/components/script/dom/bindings/codegen/HTMLOutputElement.webidl b/src/components/script/dom/bindings/codegen/HTMLOutputElement.webidl new file mode 100644 index 00000000000..e706465d974 --- /dev/null +++ b/src/components/script/dom/bindings/codegen/HTMLOutputElement.webidl @@ -0,0 +1,37 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.whatwg.org/specs/web-apps/current-work/#the-output-element + * + * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and + * Opera Software ASA. You are granted a license to use, reproduce + * and create derivative works of this document. + */ + +// http://www.whatwg.org/specs/web-apps/current-work/#the-output-element +interface HTMLOutputElement : HTMLElement { + /*[PutForwards=value, Constant] + readonly attribute DOMSettableTokenList htmlFor;*/ + readonly attribute HTMLFormElement? form; + [SetterThrows, Pure] + attribute DOMString name; + + [Constant] + readonly attribute DOMString type; + [SetterThrows, Pure] + attribute DOMString defaultValue; + [SetterThrows, Pure] + attribute DOMString value; + + readonly attribute boolean willValidate; + readonly attribute ValidityState validity; + readonly attribute DOMString validationMessage; + boolean checkValidity(); + void setCustomValidity(DOMString error); + +// Not yet implemented (bug 556743). +// readonly attribute NodeList labels; +}; diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs index c41940a9ff8..f1e25725566 100644 --- a/src/components/script/dom/bindings/element.rs +++ b/src/components/script/dom/bindings/element.rs @@ -405,6 +405,8 @@ generate_cacheable_wrapper!(HTMLOptGroupElement, HTMLOptGroupElementBinding::Wra generate_binding_object!(HTMLOptGroupElement) generate_cacheable_wrapper!(HTMLOptionElement, HTMLOptionElementBinding::Wrap) generate_binding_object!(HTMLOptionElement) +generate_cacheable_wrapper!(HTMLOutputElement, HTMLOutputElementBinding::Wrap) +generate_binding_object!(HTMLOutputElement) generate_cacheable_wrapper!(HTMLParagraphElement, HTMLParagraphElementBinding::Wrap) generate_binding_object!(HTMLParagraphElement) generate_cacheable_wrapper!(HTMLProgressElement, HTMLProgressElementBinding::Wrap) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index 73d4734837c..0918aaf0e91 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -108,6 +108,7 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> *JSObject ElementNodeTypeId(HTMLOListElementTypeId) => generate_element!(HTMLOListElement), ElementNodeTypeId(HTMLOptGroupElementTypeId) => generate_element!(HTMLOptGroupElement), ElementNodeTypeId(HTMLOptionElementTypeId) => generate_element!(HTMLOptionElement), + ElementNodeTypeId(HTMLOutputElementTypeId) => generate_element!(HTMLOutputElement), ElementNodeTypeId(HTMLParagraphElementTypeId) => generate_element!(HTMLParagraphElement), ElementNodeTypeId(HTMLProgressElementTypeId) => generate_element!(HTMLProgressElement), ElementNodeTypeId(HTMLQuoteElementTypeId) => generate_element!(HTMLQuoteElement), diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 3bd21a60593..be373fae8ae 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -82,8 +82,9 @@ pub enum ElementTypeId { HTMLModElementTypeId, HTMLObjectElementTypeId, HTMLOListElementTypeId, - HTMLOptionElementTypeId, HTMLOptGroupElementTypeId, + HTMLOptionElementTypeId, + HTMLOutputElementTypeId, HTMLParagraphElementTypeId, HTMLProgressElementTypeId, HTMLQuoteElementTypeId, diff --git a/src/components/script/dom/htmloutputelement.rs b/src/components/script/dom/htmloutputelement.rs new file mode 100644 index 00000000000..934cf23883b --- /dev/null +++ b/src/components/script/dom/htmloutputelement.rs @@ -0,0 +1,71 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::{DOMString, ErrorResult, null_string}; +use dom::htmlelement::HTMLElement; +use dom::node::{AbstractNode, ScriptView}; +use dom::validitystate::ValidityState; + +pub struct HTMLOutputElement { + parent: HTMLElement +} + +impl HTMLOutputElement { + pub fn GetForm(&self) -> Option> { + None + } + + pub fn Name(&self) -> DOMString { + null_string + } + + pub fn SetName(&mut self, _name: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Type(&self) -> DOMString { + null_string + } + + pub fn DefaultValue(&self) -> DOMString { + null_string + } + + pub fn SetDefaultValue(&mut self, _value: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Value(&self) -> DOMString { + null_string + } + + pub fn SetValue(&mut self, _value: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn WillValidate(&self) -> bool { + false + } + + pub fn SetWillValidate(&mut self, _will_validate: bool) { + } + + pub fn Validity(&self) -> @mut ValidityState { + @mut ValidityState::valid() + } + + pub fn SetValidity(&mut self, _validity: @mut ValidityState) { + } + + pub fn ValidationMessage(&self) -> DOMString { + null_string + } + + pub fn SetValidationMessage(&mut self, _message: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn CheckValidity(&self) -> bool { + true + } + + pub fn SetCustomValidity(&mut self, _error: &DOMString) { + } +} diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 36dc9e00902..93df39cc3d6 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -218,6 +218,7 @@ fn build_element_from_tag(cx: *JSContext, tag: &str) -> AbstractNode handle_element!(cx, tag, "ol", HTMLOListElementTypeId, HTMLOListElement, []); handle_element!(cx, tag, "option", HTMLOptionElementTypeId, HTMLOptionElement, []); handle_element!(cx, tag, "optgroup",HTMLOptGroupElementTypeId, HTMLOptGroupElement, []); + handle_element!(cx, tag, "output", HTMLOutputElementTypeId, HTMLOutputElement, []); handle_element!(cx, tag, "p", HTMLParagraphElementTypeId, HTMLParagraphElement, []); handle_element!(cx, tag, "progress",HTMLProgressElementTypeId, HTMLProgressElement, []); handle_element!(cx, tag, "q", HTMLQuoteElementTypeId, HTMLQuoteElement, []); diff --git a/src/components/script/script.rc b/src/components/script/script.rc index 9f7f9c7131d..93857862eb1 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -93,6 +93,7 @@ pub mod dom { pub mod htmlolistelement; pub mod htmloptgroupelement; pub mod htmloptionelement; + pub mod htmloutputelement; pub mod htmlparagraphelement; pub mod htmlprogresselement; pub mod htmlquoteelement; From e26a541eb2bc772c68e2a2adae2d7622823831fd Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 28 Aug 2013 17:53:36 -0400 Subject: [PATCH 19/29] Generate bindings for HTMLParamElement. --- .../script/dom/bindings/codegen/Bindings.conf | 1 + .../bindings/codegen/HTMLParamElement.webidl | 29 ++++++++++++++ src/components/script/dom/bindings/element.rs | 2 + src/components/script/dom/bindings/node.rs | 1 + src/components/script/dom/element.rs | 1 + src/components/script/dom/htmlparamelement.rs | 40 +++++++++++++++++++ .../script/html/hubbub_html_parser.rs | 1 + src/components/script/script.rc | 1 + 8 files changed, 76 insertions(+) create mode 100644 src/components/script/dom/bindings/codegen/HTMLParamElement.webidl create mode 100644 src/components/script/dom/htmlparamelement.rs diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 94612333bce..2e0debceb71 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -593,6 +593,7 @@ addHTMLElement('HTMLOptGroupElement') addHTMLElement('HTMLOptionElement') addHTMLElement('HTMLOutputElement') addHTMLElement('HTMLParagraphElement') +addHTMLElement('HTMLParamElement') addHTMLElement('HTMLProgressElement') addHTMLElement('HTMLQuoteElement') addHTMLElement('HTMLScriptElement') diff --git a/src/components/script/dom/bindings/codegen/HTMLParamElement.webidl b/src/components/script/dom/bindings/codegen/HTMLParamElement.webidl new file mode 100644 index 00000000000..e2c7e8d7fab --- /dev/null +++ b/src/components/script/dom/bindings/codegen/HTMLParamElement.webidl @@ -0,0 +1,29 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.whatwg.org/specs/web-apps/current-work/#the-param-element + * http://www.whatwg.org/specs/web-apps/current-work/#other-elements,-attributes-and-apis + * + * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and + * Opera Software ASA. You are granted a license to use, reproduce + * and create derivative works of this document. + */ + +// http://www.whatwg.org/specs/web-apps/current-work/#the-param-element +interface HTMLParamElement : HTMLElement { + [SetterThrows, Pure] + attribute DOMString name; + [SetterThrows, Pure] + attribute DOMString value; +}; + +// http://www.whatwg.org/specs/web-apps/current-work/#other-elements,-attributes-and-apis +partial interface HTMLParamElement { + [SetterThrows, Pure] + attribute DOMString type; + [SetterThrows, Pure] + attribute DOMString valueType; +}; diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs index f1e25725566..9f3e6c209da 100644 --- a/src/components/script/dom/bindings/element.rs +++ b/src/components/script/dom/bindings/element.rs @@ -409,6 +409,8 @@ generate_cacheable_wrapper!(HTMLOutputElement, HTMLOutputElementBinding::Wrap) generate_binding_object!(HTMLOutputElement) generate_cacheable_wrapper!(HTMLParagraphElement, HTMLParagraphElementBinding::Wrap) generate_binding_object!(HTMLParagraphElement) +generate_cacheable_wrapper!(HTMLParamElement, HTMLParamElementBinding::Wrap) +generate_binding_object!(HTMLParamElement) generate_cacheable_wrapper!(HTMLProgressElement, HTMLProgressElementBinding::Wrap) generate_binding_object!(HTMLProgressElement) generate_cacheable_wrapper!(HTMLQuoteElement, HTMLQuoteElementBinding::Wrap) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index 0918aaf0e91..0fdbf00901b 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -110,6 +110,7 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> *JSObject ElementNodeTypeId(HTMLOptionElementTypeId) => generate_element!(HTMLOptionElement), ElementNodeTypeId(HTMLOutputElementTypeId) => generate_element!(HTMLOutputElement), ElementNodeTypeId(HTMLParagraphElementTypeId) => generate_element!(HTMLParagraphElement), + ElementNodeTypeId(HTMLParamElementTypeId) => generate_element!(HTMLParamElement), ElementNodeTypeId(HTMLProgressElementTypeId) => generate_element!(HTMLProgressElement), ElementNodeTypeId(HTMLQuoteElementTypeId) => generate_element!(HTMLQuoteElement), ElementNodeTypeId(HTMLScriptElementTypeId) => generate_element!(HTMLScriptElement), diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index be373fae8ae..22d00310b13 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -86,6 +86,7 @@ pub enum ElementTypeId { HTMLOptionElementTypeId, HTMLOutputElementTypeId, HTMLParagraphElementTypeId, + HTMLParamElementTypeId, HTMLProgressElementTypeId, HTMLQuoteElementTypeId, HTMLScriptElementTypeId, diff --git a/src/components/script/dom/htmlparamelement.rs b/src/components/script/dom/htmlparamelement.rs new file mode 100644 index 00000000000..3ec1e4ee798 --- /dev/null +++ b/src/components/script/dom/htmlparamelement.rs @@ -0,0 +1,40 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::{DOMString, ErrorResult, null_string}; +use dom::htmlelement::HTMLElement; + +pub struct HTMLParamElement { + parent: HTMLElement +} + +impl HTMLParamElement { + pub fn Name(&self) -> DOMString { + null_string + } + + pub fn SetName(&mut self, _name: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Value(&self) -> DOMString { + null_string + } + + pub fn SetValue(&mut self, _value: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Type(&self) -> DOMString { + null_string + } + + pub fn SetType(&mut self, _type: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn ValueType(&self) -> DOMString { + null_string + } + + pub fn SetValueType(&mut self, _value_type: &DOMString, _rv: &mut ErrorResult) { + } +} \ No newline at end of file diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 93df39cc3d6..61c2d7c5748 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -220,6 +220,7 @@ fn build_element_from_tag(cx: *JSContext, tag: &str) -> AbstractNode handle_element!(cx, tag, "optgroup",HTMLOptGroupElementTypeId, HTMLOptGroupElement, []); handle_element!(cx, tag, "output", HTMLOutputElementTypeId, HTMLOutputElement, []); handle_element!(cx, tag, "p", HTMLParagraphElementTypeId, HTMLParagraphElement, []); + handle_element!(cx, tag, "param", HTMLParamElementTypeId, HTMLParamElement, []); handle_element!(cx, tag, "progress",HTMLProgressElementTypeId, HTMLProgressElement, []); handle_element!(cx, tag, "q", HTMLQuoteElementTypeId, HTMLQuoteElement, []); handle_element!(cx, tag, "script", HTMLScriptElementTypeId, HTMLScriptElement, []); diff --git a/src/components/script/script.rc b/src/components/script/script.rc index 93857862eb1..9b89a77a1f5 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -95,6 +95,7 @@ pub mod dom { pub mod htmloptionelement; pub mod htmloutputelement; pub mod htmlparagraphelement; + pub mod htmlparamelement; pub mod htmlprogresselement; pub mod htmlquoteelement; pub mod htmlscriptelement; From ca620992a631397d58aeadb24fed3a4a05da6b8a Mon Sep 17 00:00:00 2001 From: Tim Kuehn Date: Tue, 27 Aug 2013 21:08:41 -0400 Subject: [PATCH 20/29] minor refactor of profiler --- src/components/util/time.rs | 63 ++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/src/components/util/time.rs b/src/components/util/time.rs index 4dda2457ef9..381aa6c1ba7 100644 --- a/src/components/util/time.rs +++ b/src/components/util/time.rs @@ -42,11 +42,22 @@ pub enum ProfilerCategory { RenderingPrepBuffCategory, RenderingCategory, // hackish but helps prevent errors when adding new categories - NUM_BUCKETS, + NumBuckets, } -// FIXME(#5873) this should be initialized by a NUM_BUCKETS cast, -static BUCKETS: uint = 13; -type ProfilerBuckets = [(ProfilerCategory, ~[float]), ..BUCKETS]; +struct ProfilerBucket { + category: ProfilerCategory, + data: ~[float], +} +impl ProfilerBucket { + fn new(category: ProfilerCategory) -> ProfilerBucket { + ProfilerBucket { + category: category, + data: ~[], + } + } +} +// FIXME(rust#5873) this should be initialized by a NumBuckets cast, +type ProfilerBuckets = [ProfilerBucket, ..13]; pub enum ProfilerMsg { // Normal message used for reporting time @@ -65,26 +76,26 @@ pub struct Profiler { impl ProfilerCategory { // convenience function to not have to cast every time pub fn num_buckets() -> uint { - NUM_BUCKETS as uint + NumBuckets as uint } // enumeration of all ProfilerCategory types // TODO(tkuehn): is there a better way to ensure proper order of categories? fn empty_buckets() -> ProfilerBuckets { let buckets = [ - (CompositingCategory, ~[]), - (LayoutQueryCategory, ~[]), - (LayoutPerformCategory, ~[]), - (LayoutAuxInitCategory, ~[]), - (LayoutSelectorMatchCategory, ~[]), - (LayoutTreeBuilderCategory, ~[]), - (LayoutMainCategory, ~[]), - (LayoutShapingCategory, ~[]), - (LayoutDispListBuildCategory, ~[]), - (GfxRegenAvailableFontsCategory, ~[]), - (RenderingDrawingCategory, ~[]), - (RenderingPrepBuffCategory, ~[]), - (RenderingCategory, ~[]), + ProfilerBucket::new(CompositingCategory), + ProfilerBucket::new(LayoutQueryCategory), + ProfilerBucket::new(LayoutPerformCategory), + ProfilerBucket::new(LayoutAuxInitCategory), + ProfilerBucket::new(LayoutSelectorMatchCategory), + ProfilerBucket::new(LayoutTreeBuilderCategory), + ProfilerBucket::new(LayoutMainCategory), + ProfilerBucket::new(LayoutShapingCategory), + ProfilerBucket::new(LayoutDispListBuildCategory), + ProfilerBucket::new(GfxRegenAvailableFontsCategory), + ProfilerBucket::new(RenderingDrawingCategory), + ProfilerBucket::new(RenderingPrepBuffCategory), + ProfilerBucket::new(RenderingCategory), ]; ProfilerCategory::check_order(&buckets); @@ -93,8 +104,8 @@ impl ProfilerCategory { // ensure that the order of the buckets matches the order of the enum categories fn check_order(vec: &ProfilerBuckets) { - for &(category, _) in vec.iter() { - if category != vec[category as uint].first() { + for (i, bucket) in vec.iter().enumerate() { + if bucket.category as uint != i { fail!("Enum category does not match bucket index. This is a bug."); } } @@ -141,14 +152,11 @@ impl Profiler { fn handle_msg(&mut self, msg: ProfilerMsg) { match msg { - TimeMsg(category, t) => match self.buckets[category as uint] { - //TODO(tkuehn): would be nice to have tuple.second_mut() - (_, ref mut data) => data.push(t), - }, + TimeMsg(category, t) => self.buckets[category as uint].data.push(t), PrintMsg => match self.last_msg { // only print if more data has arrived since the last printout Some(TimeMsg(*)) => self.print_buckets(), - _ => {} + _ => () }, }; self.last_msg = Some(msg); @@ -158,10 +166,7 @@ impl Profiler { println(fmt!("%31s %15s %15s %15s %15s %15s", "_category_", "_mean (ms)_", "_median (ms)_", "_min (ms)_", "_max (ms)_", "_bucket size_")); - for bucket in self.buckets.mut_iter() { - let (category, data) = match *bucket { - (category, ref mut data) => (category, data), - }; + for &ProfilerBucket { category: ref category, data: ref mut data } in self.buckets.mut_iter() { tim_sort(*data); let data_len = data.len(); if data_len > 0 { From 4c1648f8f5e34a5ed1d520605440757d74ebfe2c Mon Sep 17 00:00:00 2001 From: Tim Kuehn Date: Tue, 27 Aug 2013 22:22:03 -0400 Subject: [PATCH 21/29] add tests for profiler buckets --- src/components/util/time.rs | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/components/util/time.rs b/src/components/util/time.rs index 381aa6c1ba7..470769bb0af 100644 --- a/src/components/util/time.rs +++ b/src/components/util/time.rs @@ -80,9 +80,8 @@ impl ProfilerCategory { } // enumeration of all ProfilerCategory types - // TODO(tkuehn): is there a better way to ensure proper order of categories? fn empty_buckets() -> ProfilerBuckets { - let buckets = [ + [ ProfilerBucket::new(CompositingCategory), ProfilerBucket::new(LayoutQueryCategory), ProfilerBucket::new(LayoutPerformCategory), @@ -96,19 +95,7 @@ impl ProfilerCategory { ProfilerBucket::new(RenderingDrawingCategory), ProfilerBucket::new(RenderingPrepBuffCategory), ProfilerBucket::new(RenderingCategory), - ]; - - ProfilerCategory::check_order(&buckets); - buckets - } - - // ensure that the order of the buckets matches the order of the enum categories - fn check_order(vec: &ProfilerBuckets) { - for (i, bucket) in vec.iter().enumerate() { - if bucket.category as uint != i { - fail!("Enum category does not match bucket index. This is a bug."); - } - } + ] } // some categories are subcategories of LayoutPerformCategory @@ -207,4 +194,14 @@ pub fn time(msg: &str, callback: &fn() -> T) -> T{ return val; } - +#[cfg(test)] +mod test { + // ensure that the order of the buckets matches the order of the enum categories + #[test] + fn check_order() { + let buckets = ProfilerCategory::empty_buckets(); + for (i, bucket) in buckets.iter().enumerate() { + assert!(bucket.category as uint == i); + } + } +} From 048a39d4a5ff9a0a916a9f9542bad309a60f9c96 Mon Sep 17 00:00:00 2001 From: Tim Kuehn Date: Tue, 27 Aug 2013 22:27:31 -0400 Subject: [PATCH 22/29] add reference to issue regarding CTFE function on enum types for length --- src/components/util/time.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/util/time.rs b/src/components/util/time.rs index 470769bb0af..ac6bc083fce 100644 --- a/src/components/util/time.rs +++ b/src/components/util/time.rs @@ -41,7 +41,7 @@ pub enum ProfilerCategory { RenderingDrawingCategory, RenderingPrepBuffCategory, RenderingCategory, - // hackish but helps prevent errors when adding new categories + // FIXME(rust#8803): workaround for lack of CTFE function on enum types to return length NumBuckets, } struct ProfilerBucket { @@ -56,7 +56,7 @@ impl ProfilerBucket { } } } -// FIXME(rust#5873) this should be initialized by a NumBuckets cast, +// FIXME(rust#5873) this should be initialized by a NumBuckets cast type ProfilerBuckets = [ProfilerBucket, ..13]; pub enum ProfilerMsg { From 47ec798b92f35134d9324d81bd5c8a6fe6ffa094 Mon Sep 17 00:00:00 2001 From: Tim Kuehn Date: Wed, 28 Aug 2013 18:37:34 -0400 Subject: [PATCH 23/29] use HashMap instead of vector for profiler buckets --- src/components/util/time.rs | 71 +++++++++++++++---------------------- 1 file changed, 29 insertions(+), 42 deletions(-) diff --git a/src/components/util/time.rs b/src/components/util/time.rs index ac6bc083fce..a8455a67028 100644 --- a/src/components/util/time.rs +++ b/src/components/util/time.rs @@ -8,6 +8,7 @@ use std::cell::Cell; use std::comm::{Port, SharedChan}; use extra::sort::tim_sort; use std::iterator::AdditiveIterator; +use std::hashmap::HashMap; // front-end representation of the profiler used to communicate with the profiler #[deriving(Clone)] @@ -26,7 +27,14 @@ impl ProfilerChan { } } -#[deriving(Eq, Clone)] +pub enum ProfilerMsg { + // Normal message used for reporting time + TimeMsg(ProfilerCategory, float), + // Message used to force print the profiling metrics + PrintMsg, +} + +#[deriving(Eq, Clone, IterBytes)] pub enum ProfilerCategory { CompositingCategory, LayoutQueryCategory, @@ -44,27 +52,7 @@ pub enum ProfilerCategory { // FIXME(rust#8803): workaround for lack of CTFE function on enum types to return length NumBuckets, } -struct ProfilerBucket { - category: ProfilerCategory, - data: ~[float], -} -impl ProfilerBucket { - fn new(category: ProfilerCategory) -> ProfilerBucket { - ProfilerBucket { - category: category, - data: ~[], - } - } -} -// FIXME(rust#5873) this should be initialized by a NumBuckets cast -type ProfilerBuckets = [ProfilerBucket, ..13]; - -pub enum ProfilerMsg { - // Normal message used for reporting time - TimeMsg(ProfilerCategory, float), - // Message used to force print the profiling metrics - PrintMsg, -} +type ProfilerBuckets = HashMap; // back end of the profiler that handles data aggregation and performance metrics pub struct Profiler { @@ -81,21 +69,22 @@ impl ProfilerCategory { // enumeration of all ProfilerCategory types fn empty_buckets() -> ProfilerBuckets { - [ - ProfilerBucket::new(CompositingCategory), - ProfilerBucket::new(LayoutQueryCategory), - ProfilerBucket::new(LayoutPerformCategory), - ProfilerBucket::new(LayoutAuxInitCategory), - ProfilerBucket::new(LayoutSelectorMatchCategory), - ProfilerBucket::new(LayoutTreeBuilderCategory), - ProfilerBucket::new(LayoutMainCategory), - ProfilerBucket::new(LayoutShapingCategory), - ProfilerBucket::new(LayoutDispListBuildCategory), - ProfilerBucket::new(GfxRegenAvailableFontsCategory), - ProfilerBucket::new(RenderingDrawingCategory), - ProfilerBucket::new(RenderingPrepBuffCategory), - ProfilerBucket::new(RenderingCategory), - ] + let mut buckets = HashMap::with_capacity(NumBuckets as uint); + buckets.insert(CompositingCategory, ~[]); + buckets.insert(LayoutQueryCategory, ~[]); + buckets.insert(LayoutPerformCategory, ~[]); + buckets.insert(LayoutAuxInitCategory, ~[]); + buckets.insert(LayoutSelectorMatchCategory, ~[]); + buckets.insert(LayoutTreeBuilderCategory, ~[]); + buckets.insert(LayoutMainCategory, ~[]); + buckets.insert(LayoutShapingCategory, ~[]); + buckets.insert(LayoutDispListBuildCategory, ~[]); + buckets.insert(GfxRegenAvailableFontsCategory, ~[]); + buckets.insert(RenderingDrawingCategory, ~[]); + buckets.insert(RenderingPrepBuffCategory, ~[]); + buckets.insert(RenderingCategory, ~[]); + + buckets } // some categories are subcategories of LayoutPerformCategory @@ -139,7 +128,7 @@ impl Profiler { fn handle_msg(&mut self, msg: ProfilerMsg) { match msg { - TimeMsg(category, t) => self.buckets[category as uint].data.push(t), + TimeMsg(category, t) => self.buckets.get_mut(&category).push(t), PrintMsg => match self.last_msg { // only print if more data has arrived since the last printout Some(TimeMsg(*)) => self.print_buckets(), @@ -153,7 +142,7 @@ impl Profiler { println(fmt!("%31s %15s %15s %15s %15s %15s", "_category_", "_mean (ms)_", "_median (ms)_", "_min (ms)_", "_max (ms)_", "_bucket size_")); - for &ProfilerBucket { category: ref category, data: ref mut data } in self.buckets.mut_iter() { + for (category, data) in self.buckets.mut_iter() { tim_sort(*data); let data_len = data.len(); if data_len > 0 { @@ -200,8 +189,6 @@ mod test { #[test] fn check_order() { let buckets = ProfilerCategory::empty_buckets(); - for (i, bucket) in buckets.iter().enumerate() { - assert!(bucket.category as uint == i); - } + assert!(buckets.len() == NumBuckets as uint); } } From 65c993e7e6c7e744a08fcedd63a64d0b43505c1d Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 28 Aug 2013 19:41:08 -0400 Subject: [PATCH 24/29] Generate bindings for HTMLSelectElement. --- .../script/dom/bindings/codegen/Bindings.conf | 1 + .../dom/bindings/codegen/CodegenRust.py | 44 +++--- .../bindings/codegen/HTMLSelectElement.webidl | 57 ++++++++ src/components/script/dom/bindings/element.rs | 2 + src/components/script/dom/bindings/node.rs | 1 + .../script/dom/bindings/proxyhandler.rs | 9 +- src/components/script/dom/element.rs | 1 - .../script/dom/htmlselectelement.rs | 134 ++++++++++++++++++ src/components/script/script.rc | 1 + 9 files changed, 228 insertions(+), 22 deletions(-) create mode 100644 src/components/script/dom/bindings/codegen/HTMLSelectElement.webidl create mode 100644 src/components/script/dom/htmlselectelement.rs diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 2e0debceb71..20fbbac8ed9 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -597,6 +597,7 @@ addHTMLElement('HTMLParamElement') addHTMLElement('HTMLProgressElement') addHTMLElement('HTMLQuoteElement') addHTMLElement('HTMLScriptElement') +addHTMLElement('HTMLSelectElement') addHTMLElement('HTMLSourceElement') addHTMLElement('HTMLSpanElement') addHTMLElement('HTMLStyleElement') diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index e524f927e47..6584990d042 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -92,7 +92,7 @@ class CastableObjectUnwrapper(): codeOnFailure is the code to run if unwrapping fails. """ - def __init__(self, descriptor, source, target, codeOnFailure): + def __init__(self, descriptor, source, target, codeOnFailure, isOptional=False): assert descriptor.castable self.substitution = { "type" : descriptor.nativeType, @@ -101,7 +101,8 @@ class CastableObjectUnwrapper(): "protoID" : "PrototypeList::id::" + descriptor.name + " as uint", "source" : source, "target" : target, - "codeOnFailure" : CGIndenter(CGGeneric(codeOnFailure), 4).define() } + "codeOnFailure" : CGIndenter(CGGeneric(codeOnFailure), 4).define(), + "unwrapped_val" : "Some(val)" if isOptional else "val" } if descriptor.hasXPConnectImpls: # We don't use xpc_qsUnwrapThis because it will always throw on # unwrap failure, whereas we want to control whether we throw or @@ -123,7 +124,7 @@ class CastableObjectUnwrapper(): def __str__(self): return string.Template( """match unwrap_object(${source}, ${prototype}, ${depth}) { - Ok(val) => ${target} = val, + Ok(val) => ${target} = ${unwrapped_val}, Err(()) => { ${codeOnFailure} } @@ -141,10 +142,11 @@ class FailureFatalCastableObjectUnwrapper(CastableObjectUnwrapper): """ As CastableObjectUnwrapper, but defaulting to throwing if unwrapping fails """ - def __init__(self, descriptor, source, target): + def __init__(self, descriptor, source, target, isOptional): CastableObjectUnwrapper.__init__(self, descriptor, source, target, "return 0; //XXXjdm return Throw<%s>(cx, rv);" % - toStringBool(not descriptor.workers)) + toStringBool(not descriptor.workers), + isOptional) class CGThing(): """ @@ -229,9 +231,10 @@ class CGMethodCall(CGThing): argCountCases.append( CGCase(str(argCount), None, True)) else: - pass + sigIndex = signatures.index(signature) argCountCases.append( - CGCase(str(argCount), getPerSignatureCall(signature))) + CGCase(str(argCount), getPerSignatureCall(signature, + signatureIndex=sigIndex))) continue distinguishingIndex = method.distinguishingIndexForArgCount(argCount) @@ -302,7 +305,7 @@ class CGMethodCall(CGThing): # above. caseBody.append(CGGeneric("if JSVAL_IS_OBJECT(%s) {" % (distinguishingArg))) - for sig in interfacesSigs: + for idx, sig in enumerate(interfacesSigs): caseBody.append(CGIndenter(CGGeneric("loop {"))); type = sig[1][distinguishingIndex].type @@ -326,7 +329,7 @@ class CGMethodCall(CGThing): # distinguishingIndex + 1, since we already converted # distinguishingIndex. caseBody.append(CGIndenter( - getPerSignatureCall(sig, distinguishingIndex + 1), 4)) + getPerSignatureCall(sig, distinguishingIndex + 1, idx), 4)) caseBody.append(CGIndenter(CGGeneric("}"))) caseBody.append(CGGeneric("}")) @@ -926,12 +929,14 @@ for (uint32_t i = 0; i < length; ++i) { descriptor, "JSVAL_TO_OBJECT(${val})", "${declName}", - failureCode)) + failureCode, + isOptional or argIsPointer or type.nullable())) else: templateBody += str(FailureFatalCastableObjectUnwrapper( descriptor, "JSVAL_TO_OBJECT(${val})", - "${declName}")) + "${declName}", + isOptional or argIsPointer or type.nullable())) elif descriptor.interface.isCallback() and False: #XXXjdm unfinished templateBody += str(CallbackObjectUnwrapper( @@ -3532,8 +3537,8 @@ class CGProxySpecialOperation(CGPerSignatureCall): templateValues = { "declName": argument.identifier.name, "holderName": argument.identifier.name + "_holder", - "val": "desc->value", - "valPtr": "&desc->value" + "val": "(*desc).value", + "valPtr": "&(*desc).value" } self.cgRoot.prepend(instantiateJSToNativeConversionTemplate(template, templateValues)) elif operation.isGetter(): @@ -3636,7 +3641,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): if not 'IndexedCreator' in self.descriptor.operations: # FIXME need to check that this is a 'supported property index' assert False - setOrIndexedGet += (" FillPropertyDescriptor(&mut *desc, proxy, JSVAL_VOID, false);\n" + + setOrIndexedGet += (" FillPropertyDescriptor(&mut *desc, proxy, false);\n" + " return 1;\n" + " }\n") if self.descriptor.operations['NamedSetter']: @@ -3644,7 +3649,7 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(CGAbstractExternMethod): if not 'NamedCreator' in self.descriptor.operations: # FIXME need to check that this is a 'supported property name' assert False - setOrIndexedGet += (" FillPropertyDescriptor(&mut *desc, proxy, JSVAL_VOID, false);\n" + + setOrIndexedGet += (" FillPropertyDescriptor(&mut *desc, proxy, false);\n" + " return 1;\n" + " }\n") setOrIndexedGet += "}" @@ -3710,7 +3715,7 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod): args = [Argument('*JSContext', 'cx'), Argument('*JSObject', 'proxy'), Argument('jsid', 'id'), Argument('*JSPropertyDescriptor', 'desc')] - CGAbstractExternMethod.__init__(self, descriptor, "defineProperty", "bool", args) + CGAbstractExternMethod.__init__(self, descriptor, "defineProperty", "JSBool", args) self.descriptor = descriptor def getBody(self): set = "" @@ -3722,10 +3727,10 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod): set += ("let index = GetArrayIndexFromId(cx, id);\n" + "if index.is_some() {\n" + " let index = index.unwrap();\n" + - " let this: *%s = UnwrapProxy(proxy);\n" + + " let this: *mut %s = UnwrapProxy(proxy) as *mut %s;\n" + CGIndenter(CGProxyIndexedSetter(self.descriptor)).define() + " return 1;\n" + - "}\n") % (self.descriptor.concreteType) + "}\n") % (self.descriptor.concreteType, self.descriptor.concreteType) elif self.descriptor.operations['IndexedGetter']: set += ("if GetArrayIndexFromId(cx, id).is_some() {\n" + " return 0;\n" + @@ -3771,7 +3776,7 @@ class CGDOMJSProxyHandler_defineProperty(CGAbstractExternMethod): " }\n" + " return 1;\n" "}\n") % (self.descriptor.concreteType, self.descriptor.name) - return set + """return proxyhandler::defineProperty(%s);""" % ", ".join(a.name for a in self.args) + return set + """return proxyhandler::defineProperty_(%s);""" % ", ".join(a.name for a in self.args) def definition_body(self): return self.getBody() @@ -4618,6 +4623,7 @@ class CGBindingRoot(CGThing): 'dom::bindings::codegen::*', #XXXjdm 'script_task::{JSPageInfo, page_from_context}', 'dom::bindings::utils::EnumEntry', + 'dom::bindings::proxyhandler', 'dom::bindings::proxyhandler::*', 'dom::document::AbstractDocument', 'dom::node::{AbstractNode, ScriptView}', diff --git a/src/components/script/dom/bindings/codegen/HTMLSelectElement.webidl b/src/components/script/dom/bindings/codegen/HTMLSelectElement.webidl new file mode 100644 index 00000000000..b99bf149280 --- /dev/null +++ b/src/components/script/dom/bindings/codegen/HTMLSelectElement.webidl @@ -0,0 +1,57 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.whatwg.org/html/#the-select-element + */ + +interface HTMLSelectElement : HTMLElement { + [SetterThrows, Pure] + attribute boolean autofocus; + [SetterThrows, Pure] + attribute boolean disabled; + [Pure] + readonly attribute HTMLFormElement? form; + [SetterThrows, Pure] + attribute boolean multiple; + [SetterThrows, Pure] + attribute DOMString name; + [SetterThrows, Pure] + attribute boolean required; + [SetterThrows, Pure] + attribute unsigned long size; + + [Pure] + readonly attribute DOMString type; + + /*[Constant] + readonly attribute HTMLOptionsCollection options;*/ + [SetterThrows, Pure] + attribute unsigned long length; + getter Element? item(unsigned long index); + HTMLOptionElement? namedItem(DOMString name); + /*[Throws] + void add((HTMLOptionElement or HTMLOptGroupElement) element, optional (HTMLElement or long)? before = null);*/ + void remove(long index); + [Throws] + setter creator void (unsigned long index, HTMLOptionElement? option); + +// NYI: readonly attribute HTMLCollection selectedOptions; + [SetterThrows, Pure] + attribute long selectedIndex; + [Pure] + attribute DOMString value; + + readonly attribute boolean willValidate; + readonly attribute ValidityState validity; + readonly attribute DOMString validationMessage; + boolean checkValidity(); + void setCustomValidity(DOMString error); + +// NYI: readonly attribute NodeList labels; + + // https://www.w3.org/Bugs/Public/show_bug.cgi?id=20720 + void remove(); +}; diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs index 9f3e6c209da..2df2ec0a3b9 100644 --- a/src/components/script/dom/bindings/element.rs +++ b/src/components/script/dom/bindings/element.rs @@ -417,6 +417,8 @@ generate_cacheable_wrapper!(HTMLQuoteElement, HTMLQuoteElementBinding::Wrap) generate_binding_object!(HTMLQuoteElement) generate_cacheable_wrapper!(HTMLScriptElement, HTMLScriptElementBinding::Wrap) generate_binding_object!(HTMLScriptElement) +generate_cacheable_wrapper!(HTMLSelectElement, HTMLSelectElementBinding::Wrap) +generate_binding_object!(HTMLSelectElement) generate_cacheable_wrapper!(HTMLSourceElement, HTMLSourceElementBinding::Wrap) generate_binding_object!(HTMLSourceElement) generate_cacheable_wrapper!(HTMLSpanElement, HTMLSpanElementBinding::Wrap) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index 0fdbf00901b..47c32742342 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -114,6 +114,7 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> *JSObject ElementNodeTypeId(HTMLProgressElementTypeId) => generate_element!(HTMLProgressElement), ElementNodeTypeId(HTMLQuoteElementTypeId) => generate_element!(HTMLQuoteElement), ElementNodeTypeId(HTMLScriptElementTypeId) => generate_element!(HTMLScriptElement), + ElementNodeTypeId(HTMLSelectElementTypeId) => generate_element!(HTMLSelectElement), ElementNodeTypeId(HTMLSourceElementTypeId) => generate_element!(HTMLSourceElement), ElementNodeTypeId(HTMLSpanElementTypeId) => generate_element!(HTMLSpanElement), ElementNodeTypeId(HTMLStyleElementTypeId) => generate_element!(HTMLStyleElement), diff --git a/src/components/script/dom/bindings/proxyhandler.rs b/src/components/script/dom/bindings/proxyhandler.rs index 3128c27d727..b31f16da7f0 100644 --- a/src/components/script/dom/bindings/proxyhandler.rs +++ b/src/components/script/dom/bindings/proxyhandler.rs @@ -44,8 +44,8 @@ pub extern fn getPropertyDescriptor(cx: *JSContext, proxy: *JSObject, id: jsid, } } -pub extern fn defineProperty(cx: *JSContext, proxy: *JSObject, id: jsid, - desc: *JSPropertyDescriptor) -> JSBool { +pub fn defineProperty_(cx: *JSContext, proxy: *JSObject, id: jsid, + desc: *JSPropertyDescriptor) -> JSBool { unsafe { if ((*desc).attrs & JSPROP_GETTER) != 0 && (*desc).setter == JS_StrictPropertyStub { /*return JS_ReportErrorFlagsAndNumber(cx, @@ -66,6 +66,11 @@ pub extern fn defineProperty(cx: *JSContext, proxy: *JSObject, id: jsid, } } +pub extern fn defineProperty(cx: *JSContext, proxy: *JSObject, id: jsid, + desc: *JSPropertyDescriptor) -> JSBool { + defineProperty_(cx, proxy, id, desc) +} + pub fn _obj_toString(cx: *JSContext, className: *libc::c_char) -> *JSString { unsafe { let name = str::raw::from_c_str(className); diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 22d00310b13..3799e751f0f 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -112,7 +112,6 @@ pub enum ElementTypeId { // Regular old elements // -pub struct HTMLSelectElement { parent: HTMLElement } pub struct HTMLSmallElement { parent: HTMLElement } pub struct UnknownElement { parent: HTMLElement } diff --git a/src/components/script/dom/htmlselectelement.rs b/src/components/script/dom/htmlselectelement.rs new file mode 100644 index 00000000000..b3ef7871325 --- /dev/null +++ b/src/components/script/dom/htmlselectelement.rs @@ -0,0 +1,134 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::{DOMString, ErrorResult, null_string}; +use dom::htmlelement::HTMLElement; +use dom::node::{AbstractNode, ScriptView}; +use dom::validitystate::ValidityState; + +pub struct HTMLSelectElement { + parent: HTMLElement +} + +impl HTMLSelectElement { + pub fn Autofocus(&self) -> bool { + false + } + + pub fn SetAutofocus(&mut self, _autofocus: bool, _rv: &mut ErrorResult) { + } + + pub fn Disabled(&self) -> bool { + false + } + + pub fn SetDisabled(&mut self, _disabled: bool, _rv: &mut ErrorResult) { + } + + pub fn GetForm(&self) -> Option> { + None + } + + pub fn Multiple(&self) -> bool { + false + } + + pub fn SetMultiple(&mut self, _multiple: bool, _rv: &mut ErrorResult) { + } + + pub fn Name(&self) -> DOMString { + null_string + } + + pub fn SetName(&mut self, _name: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Required(&self) -> bool { + false + } + + pub fn SetRequired(&mut self, _multiple: bool, _rv: &mut ErrorResult) { + } + + pub fn Size(&self) -> u32 { + 0 + } + + pub fn SetSize(&mut self, _size: u32, _rv: &mut ErrorResult) { + } + + pub fn Type(&self) -> DOMString { + null_string + } + + pub fn Length(&self) -> u32 { + 0 + } + + pub fn SetLength(&mut self, _length: u32, _rv: &mut ErrorResult) { + } + + pub fn Item(&self, _index: u32) -> Option> { + None + } + + pub fn NamedItem(&self, _name: &DOMString) -> Option> { + None + } + + pub fn IndexedGetter(&self, _index: u32, _found: &mut bool) -> Option> { + None + } + + pub fn IndexedSetter(&mut self, _index: u32, _option: Option>, _rv: &mut ErrorResult) { + } + + pub fn Remove_(&self) { + } + + pub fn Remove(&self, _index: i32) { + } + + pub fn SelectedIndex(&self) -> i32 { + 0 + } + + pub fn SetSelectedIndex(&mut self, _index: i32, _rv: &mut ErrorResult) { + } + + pub fn Value(&self) -> DOMString { + null_string + } + + pub fn SetValue(&mut self, _value: &DOMString) { + } + + pub fn WillValidate(&self) -> bool { + false + } + + pub fn SetWillValidate(&mut self, _will_validate: bool) { + } + + pub fn Validity(&self) -> @mut ValidityState { + @mut ValidityState::valid() + } + + pub fn SetValidity(&mut self, _validity: @mut ValidityState) { + } + + pub fn ValidationMessage(&self) -> DOMString { + null_string + } + + pub fn SetValidationMessage(&mut self, _message: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn CheckValidity(&self) -> bool { + true + } + + pub fn SetCustomValidity(&mut self, _error: &DOMString) { + } +} \ No newline at end of file diff --git a/src/components/script/script.rc b/src/components/script/script.rc index 9b89a77a1f5..ac3e4d14148 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -99,6 +99,7 @@ pub mod dom { pub mod htmlprogresselement; pub mod htmlquoteelement; pub mod htmlscriptelement; + pub mod htmlselectelement; pub mod htmlspanelement; pub mod htmlsourceelement; pub mod htmlstyleelement; From 1eb5eeb630f46b4474678d3634c70db8c99adf77 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 28 Aug 2013 19:51:07 -0400 Subject: [PATCH 25/29] Generate bindings for HTMLUnknownElement. --- .../script/dom/bindings/codegen/Bindings.conf | 1 + .../bindings/codegen/HTMLUnknownElement.webidl | 16 ++++++++++++++++ src/components/script/dom/bindings/element.rs | 2 ++ src/components/script/dom/bindings/node.rs | 1 + src/components/script/dom/element.rs | 3 +-- src/components/script/dom/htmlunknownelement.rs | 9 +++++++++ src/components/script/html/hubbub_html_parser.rs | 5 ++++- src/components/script/script.rc | 1 + 8 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 src/components/script/dom/bindings/codegen/HTMLUnknownElement.webidl create mode 100644 src/components/script/dom/htmlunknownelement.rs diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 20fbbac8ed9..a0c343ca4a8 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -611,6 +611,7 @@ addHTMLElement('HTMLTextAreaElement') addHTMLElement('HTMLTimeElement') addHTMLElement('HTMLTitleElement') addHTMLElement('HTMLUListElement') +addHTMLElement('HTMLUnknownElement') # If you add one of these, you need to make sure nsDOMQS.h has the relevant # macros added for it diff --git a/src/components/script/dom/bindings/codegen/HTMLUnknownElement.webidl b/src/components/script/dom/bindings/codegen/HTMLUnknownElement.webidl new file mode 100644 index 00000000000..db1307ae714 --- /dev/null +++ b/src/components/script/dom/bindings/codegen/HTMLUnknownElement.webidl @@ -0,0 +1,16 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.whatwg.org/specs/web-apps/current-work/ and + * http://dev.w3.org/csswg/cssom-view/ + * + * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and + * Opera Software ASA. You are granted a license to use, reproduce + * and create derivative works of this document. + */ + +interface HTMLUnknownElement : HTMLElement { +}; diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs index 2df2ec0a3b9..6e7196b4649 100644 --- a/src/components/script/dom/bindings/element.rs +++ b/src/components/script/dom/bindings/element.rs @@ -445,3 +445,5 @@ generate_cacheable_wrapper!(HTMLTimeElement, HTMLTimeElementBinding::Wrap) generate_binding_object!(HTMLTimeElement) generate_cacheable_wrapper!(HTMLUListElement, HTMLUListElementBinding::Wrap) generate_binding_object!(HTMLUListElement) +generate_cacheable_wrapper!(HTMLUnknownElement, HTMLUnknownElementBinding::Wrap) +generate_binding_object!(HTMLUnknownElement) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index 47c32742342..db54fb6537c 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -128,6 +128,7 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> *JSObject ElementNodeTypeId(HTMLTimeElementTypeId) => generate_element!(HTMLTimeElement), ElementNodeTypeId(HTMLTitleElementTypeId) => generate_element!(HTMLTitleElement), ElementNodeTypeId(HTMLUListElementTypeId) => generate_element!(HTMLUListElement), + ElementNodeTypeId(HTMLUnknownElementTypeId) => generate_element!(HTMLUnknownElement), ElementNodeTypeId(_) => element::create(cx, node).ptr, CommentNodeTypeId | DoctypeNodeTypeId => text::create(cx, node).ptr, diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 3799e751f0f..5ebfe1503cb 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -105,7 +105,7 @@ pub enum ElementTypeId { HTMLTimeElementTypeId, HTMLTitleElementTypeId, HTMLUListElementTypeId, - UnknownElementTypeId, + HTMLUnknownElementTypeId, } // @@ -113,7 +113,6 @@ pub enum ElementTypeId { // pub struct HTMLSmallElement { parent: HTMLElement } -pub struct UnknownElement { parent: HTMLElement } // // Element methods diff --git a/src/components/script/dom/htmlunknownelement.rs b/src/components/script/dom/htmlunknownelement.rs new file mode 100644 index 00000000000..a0ef96a08ee --- /dev/null +++ b/src/components/script/dom/htmlunknownelement.rs @@ -0,0 +1,9 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::htmlelement::HTMLElement; + +pub struct HTMLUnknownElement { + parent: HTMLElement +} diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 61c2d7c5748..2d9803d9670 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -258,7 +258,10 @@ fn build_element_from_tag(cx: *JSContext, tag: &str) -> AbstractNode handle_htmlelement!(cx, tag, "section", HTMLElementTypeId, HTMLElement); unsafe { - Node::as_abstract_node(cx, @Element::new(UnknownElementTypeId, tag.to_str())) + let element = @HTMLUnknownElement { + parent: HTMLElement::new(HTMLUnknownElementTypeId, tag.to_str()) + }; + Node::as_abstract_node(cx, element) } } diff --git a/src/components/script/script.rc b/src/components/script/script.rc index ac3e4d14148..af4b60910d6 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -113,6 +113,7 @@ pub mod dom { pub mod htmltimeelement; pub mod htmltitleelement; pub mod htmlulistelement; + pub mod htmlunknownelement; pub mod mouseevent; pub mod node; pub mod uievent; From 8070f02e396ad575e3db3efdeae7c4f54a816404 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Wed, 28 Aug 2013 20:31:30 -0400 Subject: [PATCH 26/29] Generate bindings for Comment and DocumentType. --- .../script/dom/bindings/codegen/Bindings.conf | 15 ++- .../dom/bindings/codegen/Comment.webidl | 15 +++ .../dom/bindings/codegen/DocumentType.webidl | 22 +++++ src/components/script/dom/bindings/element.rs | 10 +- src/components/script/dom/bindings/node.rs | 12 +-- src/components/script/dom/bindings/text.rs | 96 ------------------- src/components/script/dom/comment.rs | 33 +++++++ src/components/script/dom/documenttype.rs | 50 ++++++++++ src/components/script/dom/node.rs | 46 --------- src/components/script/dom/text.rs | 22 +---- .../script/html/hubbub_html_parser.rs | 10 +- src/components/script/script.rc | 3 +- 12 files changed, 147 insertions(+), 187 deletions(-) create mode 100644 src/components/script/dom/bindings/codegen/Comment.webidl create mode 100644 src/components/script/dom/bindings/codegen/DocumentType.webidl delete mode 100644 src/components/script/dom/bindings/text.rs create mode 100644 src/components/script/dom/comment.rs create mode 100644 src/components/script/dom/documenttype.rs diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index a0c343ca4a8..d81bb05db17 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -367,12 +367,6 @@ DOMInterfaces = { 'resultNotAddRefed': [ 'getItem' ] }], -'Text': { - 'nativeType': 'AbstractNode', - 'concreteType': 'Text', - 'pointerType': '' -}, - 'UIEvent': { }, @@ -548,12 +542,17 @@ def addExternalIface(iface, nativeType=None, headerFile=None, pointerType=None): domInterface['pointerType'] = pointerType DOMInterfaces[iface] = domInterface -def addHTMLElement(element): +def addHTMLElement(element, concrete=None): DOMInterfaces[element] = { 'nativeType': 'AbstractNode', - 'pointerType': '' + 'pointerType': '', + 'concreteType': concrete if concrete else element } +addHTMLElement('Comment') +addHTMLElement('DocumentType', concrete='DocumentType') +addHTMLElement('Text') + addHTMLElement('HTMLAnchorElement') addHTMLElement('HTMLAppletElement') addHTMLElement('HTMLAreaElement') diff --git a/src/components/script/dom/bindings/codegen/Comment.webidl b/src/components/script/dom/bindings/codegen/Comment.webidl new file mode 100644 index 00000000000..023335f166a --- /dev/null +++ b/src/components/script/dom/bindings/codegen/Comment.webidl @@ -0,0 +1,15 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://dom.spec.whatwg.org/#comment + * + * Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C + * liability, trademark and document use rules apply. + */ + +[Constructor(optional DOMString data = "")] +interface Comment : CharacterData { +}; diff --git a/src/components/script/dom/bindings/codegen/DocumentType.webidl b/src/components/script/dom/bindings/codegen/DocumentType.webidl new file mode 100644 index 00000000000..9a2e9cc4042 --- /dev/null +++ b/src/components/script/dom/bindings/codegen/DocumentType.webidl @@ -0,0 +1,22 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://dom.spec.whatwg.org/#documenttype + * + * Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C + * liability, trademark and document use rules apply. + */ + +interface DocumentType : Node { + readonly attribute DOMString name; + readonly attribute DOMString publicId; + readonly attribute DOMString systemId; + + // Mozilla extension + //readonly attribute DOMString? internalSubset; +}; + +//DocumentType implements ChildNode; diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs index 6e7196b4649..3ad1b73a444 100644 --- a/src/components/script/dom/bindings/element.rs +++ b/src/components/script/dom/bindings/element.rs @@ -311,7 +311,7 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> jsobj { } pub macro_rules! generate_cacheable_wrapper( - ($name: ident, $wrap: path) => ( + ($name: path, $wrap: path) => ( impl CacheableWrapper for $name { fn get_wrappercache(&mut self) -> &mut WrapperCache { self.parent.get_wrappercache() @@ -326,7 +326,7 @@ pub macro_rules! generate_cacheable_wrapper( ) pub macro_rules! generate_binding_object( - ($name: ident) => ( + ($name: path) => ( impl BindingObject for $name { fn GetParentObject(&self, cx: *JSContext) -> Option<@mut CacheableWrapper> { self.parent.GetParentObject(cx) @@ -335,6 +335,12 @@ pub macro_rules! generate_binding_object( ) ) +generate_cacheable_wrapper!(Comment, CommentBinding::Wrap) +generate_binding_object!(Comment) +generate_cacheable_wrapper!(DocumentType, DocumentTypeBinding::Wrap) +generate_binding_object!(DocumentType) +generate_cacheable_wrapper!(Text, TextBinding::Wrap) +generate_binding_object!(Text) generate_cacheable_wrapper!(HTMLHeadElement, HTMLHeadElementBinding::Wrap) generate_binding_object!(HTMLHeadElement) generate_cacheable_wrapper!(HTMLAnchorElement, HTMLAnchorElementBinding::Wrap) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index db54fb6537c..d798ef2f1f6 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -3,7 +3,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::element; -use dom::bindings::text; use dom::bindings::utils; use dom::bindings::utils::{CacheableWrapper, WrapperCache, DerivedWrapper}; use dom::element::*; @@ -64,7 +63,7 @@ pub fn init(compartment: @mut Compartment) { } macro_rules! generate_element( - ($name: ident) => ({ + ($name: path) => ({ let node: @mut $name = unsafe { cast::transmute(node.raw_object()) }; node.wrap_object_shared(cx, ptr::null()) }) @@ -130,12 +129,9 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> *JSObject ElementNodeTypeId(HTMLUListElementTypeId) => generate_element!(HTMLUListElement), ElementNodeTypeId(HTMLUnknownElementTypeId) => generate_element!(HTMLUnknownElement), ElementNodeTypeId(_) => element::create(cx, node).ptr, - CommentNodeTypeId | - DoctypeNodeTypeId => text::create(cx, node).ptr, - TextNodeTypeId => { - let node: @mut Text = unsafe { cast::transmute(node.raw_object()) }; - node.wrap_object_shared(cx, ptr::null()) - } + CommentNodeTypeId => generate_element!(Comment), + DoctypeNodeTypeId => generate_element!(DocumentType), + TextNodeTypeId => generate_element!(Text) } } diff --git a/src/components/script/dom/bindings/text.rs b/src/components/script/dom/bindings/text.rs deleted file mode 100644 index 9b231d7087d..00000000000 --- a/src/components/script/dom/bindings/text.rs +++ /dev/null @@ -1,96 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use dom::bindings::element; -use dom::bindings::node::unwrap; -use dom::bindings::utils; -use dom::bindings::utils::{DOM_OBJECT_SLOT, CacheableWrapper}; -use dom::node::{AbstractNode, Comment, Doctype, TextNodeTypeId, CommentNodeTypeId}; -use dom::node::{DoctypeNodeTypeId, ScriptView}; -use dom::text::Text; - -use js::jsapi::{JSFreeOp, JSObject, JSContext}; -use js::jsapi::{JS_SetReservedSlot}; -use js::glue::{RUST_PRIVATE_TO_JSVAL}; -use js::rust::{Compartment, jsobj}; - -use std::cast; -use std::libc; - -extern fn finalize_text(_fop: *JSFreeOp, obj: *JSObject) { - debug!("text finalize: %?!", obj as uint); - unsafe { - let node: AbstractNode = unwrap(obj); - let _elem: ~Text = cast::transmute(node.raw_object()); - } -} - -extern fn finalize_comment(_fop: *JSFreeOp, obj: *JSObject) { - debug!("comment finalize: %?!", obj as uint); - unsafe { - let node: AbstractNode = unwrap(obj); - let _elem: ~Comment = cast::transmute(node.raw_object()); - } -} - -extern fn finalize_doctype(_fop: *JSFreeOp, obj: *JSObject) { - debug!("doctype finalize: %?!", obj as uint); - unsafe { - let node: AbstractNode = unwrap(obj); - let _elem: ~Doctype = cast::transmute(node.raw_object()); - } -} - -pub fn init(compartment: @mut Compartment) { - let _ = utils::define_empty_prototype(~"CharacterData", Some(~"Node"), compartment); - - let _ = utils::define_empty_prototype(~"TextPrototype", - Some(~"CharacterData"), - compartment); - let _ = utils::define_empty_prototype(~"CommentPrototype", - Some(~"CharacterData"), - compartment); - let _ = utils::define_empty_prototype(~"DocumentTypePrototype", - Some(~"Node"), - compartment); - - compartment.register_class(utils::instance_jsclass(~"Text", - finalize_text, - element::trace)); - compartment.register_class(utils::instance_jsclass(~"Comment", - finalize_comment, - element::trace)); - compartment.register_class(utils::instance_jsclass(~"DocumentType", - finalize_doctype, - element::trace)); - - -} - -pub fn create(cx: *JSContext, node: &mut AbstractNode) -> jsobj { - let (proto, instance) = match node.type_id() { - TextNodeTypeId => (~"TextPrototype", ~"Text"), - CommentNodeTypeId => (~"CommentPrototype", ~"Comment"), - DoctypeNodeTypeId => (~"DocumentTypePrototype", ~"DocumentType"), - _ => fail!(~"text::create only handles textual nodes") - }; - - //XXXjdm the parent should probably be the node parent instead of the global - //TODO error checking - let compartment = utils::get_compartment(cx); - let obj = compartment.new_object_with_proto(instance, - proto, - compartment.global_obj.ptr).unwrap(); - - let cache = node.get_wrappercache(); - assert!(cache.get_wrapper().is_null()); - cache.set_wrapper(obj.ptr); - - unsafe { - let raw_ptr = node.raw_object() as *libc::c_void; - JS_SetReservedSlot(obj.ptr, DOM_OBJECT_SLOT as u32, RUST_PRIVATE_TO_JSVAL(raw_ptr)); - } - - return obj; -} diff --git a/src/components/script/dom/comment.rs b/src/components/script/dom/comment.rs new file mode 100644 index 00000000000..126178ca5d0 --- /dev/null +++ b/src/components/script/dom/comment.rs @@ -0,0 +1,33 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::{DOMString, str, null_string, ErrorResult}; +use dom::characterdata::CharacterData; +use dom::node::{AbstractNode, ScriptView, CommentNodeTypeId, Node}; +use dom::window::Window; + +/// An HTML comment. +pub struct Comment { + parent: CharacterData, +} + +impl Comment { + /// Creates a new HTML comment. + pub fn new(text: ~str) -> Comment { + Comment { + parent: CharacterData::new(CommentNodeTypeId, text) + } + } + + pub fn Constructor(owner: @mut Window, data: &DOMString, _rv: &mut ErrorResult) -> AbstractNode { + let s = match *data { + str(ref s) => s.clone(), + null_string => ~"" + }; + unsafe { + let compartment = (*owner.page).js_info.get_ref().js_compartment; + Node::as_abstract_node(compartment.cx.ptr, @Comment::new(s)) + } + } +} diff --git a/src/components/script/dom/documenttype.rs b/src/components/script/dom/documenttype.rs new file mode 100644 index 00000000000..3ac1d1f0db0 --- /dev/null +++ b/src/components/script/dom/documenttype.rs @@ -0,0 +1,50 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::utils::{DOMString, str, null_string}; +use dom::node::{ScriptView, Node, DoctypeNodeTypeId}; + +/// The `DOCTYPE` tag. +pub struct DocumentType { + parent: Node, + name: ~str, + public_id: Option<~str>, + system_id: Option<~str>, + force_quirks: bool +} + +impl DocumentType { + /// Creates a new `DOCTYPE` tag. + pub fn new(name: ~str, + public_id: Option<~str>, + system_id: Option<~str>, + force_quirks: bool) + -> DocumentType { + DocumentType { + parent: Node::new(DoctypeNodeTypeId), + name: name, + public_id: public_id, + system_id: system_id, + force_quirks: force_quirks, + } + } + + pub fn Name(&self) -> DOMString { + str(self.name.clone()) + } + + pub fn PublicId(&self) -> DOMString { + match self.public_id { + Some(ref s) => str(s.clone()), + None => null_string + } + } + + pub fn SystemId(&self) -> DOMString { + match self.system_id { + Some(ref s) => str(s.clone()), + None => null_string + } + } +} diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index 23d76712022..f7d01575bf6 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -8,7 +8,6 @@ use dom::bindings::node; use dom::bindings::utils::{WrapperCache, DOMString, null_string, ErrorResult}; use dom::bindings::utils::{BindingObject, CacheableWrapper, rust_box}; use dom::bindings; -use dom::characterdata::CharacterData; use dom::document::AbstractDocument; use dom::element::{Element, ElementTypeId, HTMLImageElementTypeId, HTMLIframeElementTypeId}; use dom::element::{HTMLStyleElementTypeId}; @@ -98,50 +97,6 @@ pub enum NodeTypeId { TextNodeTypeId, } -// -// Basic node types -// - -/// The `DOCTYPE` tag. -pub struct Doctype { - parent: Node, - name: ~str, - public_id: Option<~str>, - system_id: Option<~str>, - force_quirks: bool -} - -impl Doctype { - /// Creates a new `DOCTYPE` tag. - pub fn new(name: ~str, - public_id: Option<~str>, - system_id: Option<~str>, - force_quirks: bool) - -> Doctype { - Doctype { - parent: Node::new(DoctypeNodeTypeId), - name: name, - public_id: public_id, - system_id: system_id, - force_quirks: force_quirks, - } - } -} - -/// An HTML comment. -pub struct Comment { - parent: CharacterData, -} - -impl Comment { - /// Creates a new HTML comment. - pub fn new(text: ~str) -> Comment { - Comment { - parent: CharacterData::new(CommentNodeTypeId, text) - } - } -} - impl Clone for AbstractNode { fn clone(&self) -> AbstractNode { *self @@ -655,7 +610,6 @@ impl VoidPtrLike for AbstractNode { pub fn define_bindings(compartment: @mut Compartment) { bindings::node::init(compartment); bindings::element::init(compartment); - bindings::text::init(compartment); bindings::utils::initialize_global(compartment.global_obj.ptr); bindings::codegen::RegisterBindings::Register(compartment); } diff --git a/src/components/script/dom/text.rs b/src/components/script/dom/text.rs index 95926d12d92..807b1645d57 100644 --- a/src/components/script/dom/text.rs +++ b/src/components/script/dom/text.rs @@ -2,13 +2,10 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use dom::bindings::utils::{DOMString, ErrorResult, null_string, CacheableWrapper}; -use dom::bindings::utils::{BindingObject, WrapperCache}; -use dom::bindings::codegen::TextBinding; +use dom::bindings::utils::{DOMString, ErrorResult, null_string}; use dom::characterdata::CharacterData; use dom::node::{AbstractNode, ScriptView, Node, TextNodeTypeId}; use dom::window::Window; -use js::jsapi::{JSContext, JSObject}; /// An HTML text node. pub struct Text { @@ -36,20 +33,3 @@ impl Text { null_string } } - -impl CacheableWrapper for Text { - fn get_wrappercache(&mut self) -> &mut WrapperCache { - self.parent.get_wrappercache() - } - - fn wrap_object_shared(@mut self, cx: *JSContext, scope: *JSObject) -> *JSObject { - let mut unused = false; - TextBinding::Wrap(cx, scope, self, &mut unused) - } -} - -impl BindingObject for Text { - fn GetParentObject(&self, cx: *JSContext) -> Option<@mut CacheableWrapper> { - self.parent.GetParentObject(cx) - } -} diff --git a/src/components/script/html/hubbub_html_parser.rs b/src/components/script/html/hubbub_html_parser.rs index 2d9803d9670..75882950351 100644 --- a/src/components/script/html/hubbub_html_parser.rs +++ b/src/components/script/html/hubbub_html_parser.rs @@ -8,7 +8,7 @@ use dom::htmlelement::HTMLElement; use dom::htmlheadingelement::{Heading1, Heading2, Heading3, Heading4, Heading5, Heading6}; use dom::htmliframeelement::IFrameSize; use dom::htmlformelement::HTMLFormElement; -use dom::node::{AbstractNode, Comment, Doctype, ElementNodeTypeId, Node, ScriptView}; +use dom::node::{AbstractNode, ElementNodeTypeId, Node, ScriptView}; use dom::types::*; use html::cssparse::{InlineProvenance, StylesheetProvenance, UrlProvenance, spawn_css_parser}; use js::jsapi::JSContext; @@ -326,10 +326,10 @@ pub fn parse_html(cx: *JSContext, public_id: public_id, system_id: system_id, force_quirks: force_quirks } = doctype; - let node = @Doctype::new(name, - public_id, - system_id, - force_quirks); + let node = @DocumentType::new(name, + public_id, + system_id, + force_quirks); unsafe { Node::as_abstract_node(cx, node).to_hubbub_node() } diff --git a/src/components/script/script.rc b/src/components/script/script.rc index af4b60910d6..21a70515c86 100644 --- a/src/components/script/script.rc +++ b/src/components/script/script.rc @@ -26,7 +26,6 @@ pub mod dom { pub mod bindings { pub mod element; pub mod node; - pub mod text; pub mod utils; pub mod conversions; pub mod proxyhandler; @@ -48,7 +47,9 @@ pub mod dom { pub mod characterdata; pub mod clientrect; pub mod clientrectlist; + pub mod comment; pub mod document; + pub mod documenttype; pub mod domparser; pub mod element; pub mod event; From cf4107e262c7dee71382b8400090c376e7bce7fe Mon Sep 17 00:00:00 2001 From: Tim Kuehn Date: Thu, 29 Aug 2013 00:42:20 -0400 Subject: [PATCH 27/29] use TreeMap instead of HashMap for profiler buckets --- src/components/util/time.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/components/util/time.rs b/src/components/util/time.rs index a8455a67028..58cd8210040 100644 --- a/src/components/util/time.rs +++ b/src/components/util/time.rs @@ -8,7 +8,7 @@ use std::cell::Cell; use std::comm::{Port, SharedChan}; use extra::sort::tim_sort; use std::iterator::AdditiveIterator; -use std::hashmap::HashMap; +use extra::treemap::TreeMap; // front-end representation of the profiler used to communicate with the profiler #[deriving(Clone)] @@ -34,7 +34,7 @@ pub enum ProfilerMsg { PrintMsg, } -#[deriving(Eq, Clone, IterBytes)] +#[deriving(Eq, Clone, TotalEq, TotalOrd)] pub enum ProfilerCategory { CompositingCategory, LayoutQueryCategory, @@ -52,7 +52,7 @@ pub enum ProfilerCategory { // FIXME(rust#8803): workaround for lack of CTFE function on enum types to return length NumBuckets, } -type ProfilerBuckets = HashMap; +type ProfilerBuckets = TreeMap; // back end of the profiler that handles data aggregation and performance metrics pub struct Profiler { @@ -69,7 +69,7 @@ impl ProfilerCategory { // enumeration of all ProfilerCategory types fn empty_buckets() -> ProfilerBuckets { - let mut buckets = HashMap::with_capacity(NumBuckets as uint); + let mut buckets = TreeMap::new(); buckets.insert(CompositingCategory, ~[]); buckets.insert(LayoutQueryCategory, ~[]); buckets.insert(LayoutPerformCategory, ~[]); @@ -128,7 +128,7 @@ impl Profiler { fn handle_msg(&mut self, msg: ProfilerMsg) { match msg { - TimeMsg(category, t) => self.buckets.get_mut(&category).push(t), + TimeMsg(category, t) => self.buckets.find_mut(&category).unwrap().push(t), PrintMsg => match self.last_msg { // only print if more data has arrived since the last printout Some(TimeMsg(*)) => self.print_buckets(), @@ -142,8 +142,10 @@ impl Profiler { println(fmt!("%31s %15s %15s %15s %15s %15s", "_category_", "_mean (ms)_", "_median (ms)_", "_min (ms)_", "_max (ms)_", "_bucket size_")); - for (category, data) in self.buckets.mut_iter() { - tim_sort(*data); + for (category, data) in self.buckets.iter() { + // FIXME(XXX): TreeMap currently lacks mut_iter() + let mut data = data.clone(); + tim_sort(data); let data_len = data.len(); if data_len > 0 { let (mean, median, &min, &max) = From 1d2c038954d58e251305bf99a94b5c2c952c4a08 Mon Sep 17 00:00:00 2001 From: Tim Kuehn Date: Thu, 29 Aug 2013 00:45:11 -0400 Subject: [PATCH 28/29] reorder some struct declarations in profiler --- src/components/util/time.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/components/util/time.rs b/src/components/util/time.rs index 58cd8210040..a847bef12c7 100644 --- a/src/components/util/time.rs +++ b/src/components/util/time.rs @@ -52,14 +52,6 @@ pub enum ProfilerCategory { // FIXME(rust#8803): workaround for lack of CTFE function on enum types to return length NumBuckets, } -type ProfilerBuckets = TreeMap; - -// back end of the profiler that handles data aggregation and performance metrics -pub struct Profiler { - port: Port, - buckets: ProfilerBuckets, - last_msg: Option, -} impl ProfilerCategory { // convenience function to not have to cast every time @@ -99,6 +91,15 @@ impl ProfilerCategory { } } +type ProfilerBuckets = TreeMap; + +// back end of the profiler that handles data aggregation and performance metrics +pub struct Profiler { + port: Port, + buckets: ProfilerBuckets, + last_msg: Option, +} + impl Profiler { pub fn create(port: Port) { let port = Cell::new(port); From c9f9d29ff3f0fd8dc66850a85fca5ec5987520e6 Mon Sep 17 00:00:00 2001 From: Youngsoo Son Date: Thu, 29 Aug 2013 20:27:54 +0900 Subject: [PATCH 29/29] Generate bindings for HTMLFormElement. --- .../script/dom/bindings/codegen/Bindings.conf | 2 +- .../bindings/codegen/HTMLButtonElement.webidl | 3 +- .../bindings/codegen/HTMLFormElement.webidl | 48 ++++++++ src/components/script/dom/bindings/element.rs | 2 + src/components/script/dom/bindings/node.rs | 1 + src/components/script/dom/htmlformelement.rs | 106 ++++++++++++++++++ 6 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 src/components/script/dom/bindings/codegen/HTMLFormElement.webidl diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index d81bb05db17..d1bd1e1cff4 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -570,7 +570,7 @@ addHTMLElement('HTMLElement') addHTMLElement('HTMLEmbedElement') addHTMLElement('HTMLFieldSetElement') addHTMLElement('HTMLFontElement') -#addHTMLElement('HTMLFormElement') +addHTMLElement('HTMLFormElement') addHTMLElement('HTMLFrameElement') addHTMLElement('HTMLFrameSetElement') addHTMLElement('HTMLHeadElement') diff --git a/src/components/script/dom/bindings/codegen/HTMLButtonElement.webidl b/src/components/script/dom/bindings/codegen/HTMLButtonElement.webidl index 2160e7595be..0ca51a1e618 100644 --- a/src/components/script/dom/bindings/codegen/HTMLButtonElement.webidl +++ b/src/components/script/dom/bindings/codegen/HTMLButtonElement.webidl @@ -10,7 +10,8 @@ * and create derivative works of this document. */ -interface HTMLFormElement; +// FIXME: servo#707 +//interface HTMLFormElement; // http://www.whatwg.org/specs/web-apps/current-work/#the-button-element interface HTMLButtonElement : HTMLElement { diff --git a/src/components/script/dom/bindings/codegen/HTMLFormElement.webidl b/src/components/script/dom/bindings/codegen/HTMLFormElement.webidl new file mode 100644 index 00000000000..38c8bf4c36e --- /dev/null +++ b/src/components/script/dom/bindings/codegen/HTMLFormElement.webidl @@ -0,0 +1,48 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.whatwg.org/specs/web-apps/current-work/#htmlformelement + * + * ⓒ Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and + * Opera Software ASA. You are granted a license to use, reproduce + * and create derivative works of this document. + */ + +[OverrideBuiltins] +interface HTMLFormElement : HTMLElement { + [Pure, SetterThrows] + attribute DOMString acceptCharset; + [Pure, SetterThrows] + attribute DOMString action; + [Pure, SetterThrows] + attribute DOMString autocomplete; + [Pure, SetterThrows] + attribute DOMString enctype; + [Pure, SetterThrows] + attribute DOMString encoding; + [Pure, SetterThrows] + attribute DOMString method; + [Pure, SetterThrows] + attribute DOMString name; + [Pure, SetterThrows] + attribute boolean noValidate; + [Pure, SetterThrows] + attribute DOMString target; + + [Constant] + readonly attribute HTMLCollection elements; + [Pure] + readonly attribute long length; + + getter Element (unsigned long index); + // TODO this should be: getter (RadioNodeList or HTMLInputElement or HTMLImageElement) (DOMString name); +// getter nsISupports (DOMString name); + + [Throws] + void submit(); + void reset(); + boolean checkValidity(); +}; diff --git a/src/components/script/dom/bindings/element.rs b/src/components/script/dom/bindings/element.rs index 3ad1b73a444..5528bf0075e 100644 --- a/src/components/script/dom/bindings/element.rs +++ b/src/components/script/dom/bindings/element.rs @@ -361,6 +361,8 @@ generate_cacheable_wrapper!(HTMLDataListElement, HTMLDataListElementBinding::Wra generate_binding_object!(HTMLDataListElement) generate_cacheable_wrapper!(HTMLDListElement, HTMLDListElementBinding::Wrap) generate_binding_object!(HTMLDListElement) +generate_cacheable_wrapper!(HTMLFormElement, HTMLFormElementBinding::Wrap) +generate_binding_object!(HTMLFormElement) generate_cacheable_wrapper!(HTMLFrameElement, HTMLFrameElementBinding::Wrap) generate_binding_object!(HTMLFrameElement) generate_cacheable_wrapper!(HTMLFrameSetElement, HTMLFrameSetElementBinding::Wrap) diff --git a/src/components/script/dom/bindings/node.rs b/src/components/script/dom/bindings/node.rs index d798ef2f1f6..6a7fee87288 100644 --- a/src/components/script/dom/bindings/node.rs +++ b/src/components/script/dom/bindings/node.rs @@ -88,6 +88,7 @@ pub fn create(cx: *JSContext, node: &mut AbstractNode) -> *JSObject ElementNodeTypeId(HTMLEmbedElementTypeId) => generate_element!(HTMLEmbedElement), ElementNodeTypeId(HTMLFieldSetElementTypeId) => generate_element!(HTMLFieldSetElement), ElementNodeTypeId(HTMLFontElementTypeId) => generate_element!(HTMLFontElement), + ElementNodeTypeId(HTMLFormElementTypeId) => generate_element!(HTMLFormElement), ElementNodeTypeId(HTMLFrameElementTypeId) => generate_element!(HTMLFrameElement), ElementNodeTypeId(HTMLFrameSetElementTypeId) => generate_element!(HTMLFrameSetElement), ElementNodeTypeId(HTMLHeadElementTypeId) => generate_element!(HTMLHeadElement), diff --git a/src/components/script/dom/htmlformelement.rs b/src/components/script/dom/htmlformelement.rs index 06ab7f52fc9..6f175304ff3 100644 --- a/src/components/script/dom/htmlformelement.rs +++ b/src/components/script/dom/htmlformelement.rs @@ -2,8 +2,114 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +use dom::bindings::utils::{CacheableWrapper, DOMString, ErrorResult, null_string}; +use dom::element::HTMLFormElementTypeId; +use dom::htmlcollection::HTMLCollection; use dom::htmlelement::HTMLElement; +use dom::node::{AbstractNode, ElementNodeTypeId, Node, ScriptView}; + +use js::jsapi::{JSObject, JSContext}; pub struct HTMLFormElement { parent: HTMLElement } + +impl HTMLFormElement { + fn get_scope_and_cx(&self) -> (*JSObject, *JSContext) { + let doc = self.parent.parent.parent.owner_doc.unwrap(); + let win = doc.with_base(|doc| doc.window.unwrap()); + let cx = unsafe {(*win.page).js_info.get_ref().js_compartment.cx.ptr}; + let cache = win.get_wrappercache(); + let scope = cache.get_wrapper(); + (scope, cx) + } + + pub fn AcceptCharset(&self) -> DOMString { + null_string + } + + pub fn SetAcceptCharset(&mut self, _accept_charset: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Action(&self) -> DOMString { + null_string + } + + pub fn SetAction(&mut self, _action: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Autocomplete(&self) -> DOMString { + null_string + } + + pub fn SetAutocomplete(&mut self, _autocomplete: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Enctype(&self) -> DOMString { + null_string + } + + pub fn SetEnctype(&mut self, _enctype: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Encoding(&self) -> DOMString { + null_string + } + + pub fn SetEncoding(&mut self, _encoding: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Method(&self) -> DOMString { + null_string + } + + pub fn SetMethod(&mut self, _method: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Name(&self) -> DOMString { + null_string + } + + pub fn SetName(&mut self, _name: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn NoValidate(&self) -> bool { + false + } + + pub fn SetNoValidate(&mut self, _no_validate: bool, _rv: &mut ErrorResult) { + } + + pub fn Target(&self) -> DOMString { + null_string + } + + pub fn SetTarget(&mut self, _target: &DOMString, _rv: &mut ErrorResult) { + } + + pub fn Elements(&self) -> @mut HTMLCollection { + let (scope, cx) = self.get_scope_and_cx(); + HTMLCollection::new(~[], cx, scope) + } + + pub fn Length(&self) -> i32 { + 0 + } + + pub fn Submit(&self, _rv: &mut ErrorResult) { + } + + pub fn Reset(&self) { + } + + pub fn CheckValidity(&self) -> bool { + false + } + + pub fn IndexedGetter(&self, _index: u32, _found: &mut bool) -> AbstractNode { + let (_scope, cx) = self.get_scope_and_cx(); + // FIXME: This should be replaced with a proper value according to the index + let node = @Node::new(ElementNodeTypeId(HTMLFormElementTypeId)); + unsafe { return Node::as_abstract_node(cx, node) } + } +}