Bug 113083. Concentrate view setup code into a few shared functions in nsContainerFrame. Only change style-dependent view properties after style change, not during reflow, in response to nsChangeHint_SyncFrameView. Change 'clip' to only do SyncFrameView, not reflow. r=dbaron,sr=kin

This commit is contained in:
roc+%cs.cmu.edu 2002-09-30 11:56:37 +00:00
Родитель fd1a1dc6b6
Коммит 3681ee88af
24 изменённых файлов: 1482 добавлений и 1687 удалений

Просмотреть файл

@ -95,203 +95,203 @@
// support them correctly the old constants need to be renamed and // support them correctly the old constants need to be renamed and
// new ones should be entered. // new ones should be entered.
CSS_PROP(-moz-appearance, appearance, MozAppearance, REFLOW) CSS_PROP(-moz-appearance, appearance, MozAppearance, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-border-radius, _moz_border_radius, MozBorderRadius, VISUAL) CSS_PROP(-moz-border-radius, _moz_border_radius, MozBorderRadius, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-radius-topleft, _moz_border_radius_topLeft, MozBorderRadiusTopleft, VISUAL) CSS_PROP(-moz-border-radius-topleft, _moz_border_radius_topLeft, MozBorderRadiusTopleft, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-radius-topright, _moz_border_radius_topRight, MozBorderRadiusTopright, VISUAL) CSS_PROP(-moz-border-radius-topright, _moz_border_radius_topRight, MozBorderRadiusTopright, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-radius-bottomleft, _moz_border_radius_bottomLeft, MozBorderRadiusBottomleft, VISUAL) CSS_PROP(-moz-border-radius-bottomleft, _moz_border_radius_bottomLeft, MozBorderRadiusBottomleft, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-radius-bottomright, _moz_border_radius_bottomRight, MozBorderRadiusBottomright, VISUAL) CSS_PROP(-moz-border-radius-bottomright, _moz_border_radius_bottomRight, MozBorderRadiusBottomright, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-outline-radius, _moz_outline_radius, MozOutlineRadius, VISUAL) CSS_PROP(-moz-outline-radius, _moz_outline_radius, MozOutlineRadius, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-outline-radius-topleft, _moz_outline_radius_topLeft, MozOutlineRadiusTopleft, VISUAL) CSS_PROP(-moz-outline-radius-topleft, _moz_outline_radius_topLeft, MozOutlineRadiusTopleft, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-outline-radius-topright, _moz_outline_radius_topRight, MozOutlineRadiusTopright, VISUAL) CSS_PROP(-moz-outline-radius-topright, _moz_outline_radius_topRight, MozOutlineRadiusTopright, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-outline-radius-bottomleft, _moz_outline_radius_bottomLeft, MozOutlineRadiusBottomleft, VISUAL) CSS_PROP(-moz-outline-radius-bottomleft, _moz_outline_radius_bottomLeft, MozOutlineRadiusBottomleft, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-outline-radius-bottomright, _moz_outline_radius_bottomRight, MozOutlineRadiusBottomright, VISUAL) CSS_PROP(-moz-outline-radius-bottomright, _moz_outline_radius_bottomRight, MozOutlineRadiusBottomright, NS_STYLE_HINT_VISUAL)
CSS_PROP(azimuth, azimuth, Azimuth, AURAL) CSS_PROP(azimuth, azimuth, Azimuth, NS_STYLE_HINT_AURAL)
CSS_PROP(background, background, Background, VISUAL) CSS_PROP(background, background, Background, NS_STYLE_HINT_VISUAL)
CSS_PROP(background-attachment, background_attachment, BackgroundAttachment, FRAMECHANGE) CSS_PROP(background-attachment, background_attachment, BackgroundAttachment, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(background-color, background_color, BackgroundColor, VISUAL) CSS_PROP(background-color, background_color, BackgroundColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(background-image, background_image, BackgroundImage, VISUAL) CSS_PROP(background-image, background_image, BackgroundImage, NS_STYLE_HINT_VISUAL)
CSS_PROP(background-position, background_position, BackgroundPosition, VISUAL) CSS_PROP(background-position, background_position, BackgroundPosition, NS_STYLE_HINT_VISUAL)
CSS_PROP(background-repeat, background_repeat, BackgroundRepeat, VISUAL) CSS_PROP(background-repeat, background_repeat, BackgroundRepeat, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(-x-background-x-position, background_x_position, BackgroundXPosition, VISUAL) // XXX bug 3935 CSS_PROP_INTERNAL(-x-background-x-position, background_x_position, BackgroundXPosition, NS_STYLE_HINT_VISUAL) // XXX bug 3935
CSS_PROP_INTERNAL(-x-background-y-position, background_y_position, BackgroundYPosition, VISUAL) // XXX bug 3935 CSS_PROP_INTERNAL(-x-background-y-position, background_y_position, BackgroundYPosition, NS_STYLE_HINT_VISUAL) // XXX bug 3935
CSS_PROP(-moz-binding, binding, MozBinding, FRAMECHANGE) // XXX bug 3935 CSS_PROP(-moz-binding, binding, MozBinding, NS_STYLE_HINT_FRAMECHANGE) // XXX bug 3935
CSS_PROP(border, border, Border, REFLOW) CSS_PROP(border, border, Border, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-bottom, border_bottom, BorderBottom, REFLOW) CSS_PROP(border-bottom, border_bottom, BorderBottom, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-bottom-color, border_bottom_color, BorderBottomColor, VISUAL) CSS_PROP(border-bottom-color, border_bottom_color, BorderBottomColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-bottom-colors, border_bottom_colors, MozBorderBottomColors, VISUAL) CSS_PROP(-moz-border-bottom-colors, border_bottom_colors, MozBorderBottomColors, NS_STYLE_HINT_VISUAL)
CSS_PROP(border-bottom-style, border_bottom_style, BorderBottomStyle, REFLOW) // on/off will need reflow CSS_PROP(border-bottom-style, border_bottom_style, BorderBottomStyle, NS_STYLE_HINT_REFLOW) // on/off will need reflow
CSS_PROP(border-bottom-width, border_bottom_width, BorderBottomWidth, REFLOW) CSS_PROP(border-bottom-width, border_bottom_width, BorderBottomWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-collapse, border_collapse, BorderCollapse, FRAMECHANGE) CSS_PROP(border-collapse, border_collapse, BorderCollapse, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(border-color, border_color, BorderColor, VISUAL) CSS_PROP(border-color, border_color, BorderColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(border-left, border_left, BorderLeft, REFLOW) CSS_PROP(border-left, border_left, BorderLeft, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-left-color, border_left_color, BorderLeftColor, VISUAL) CSS_PROP(border-left-color, border_left_color, BorderLeftColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-left-colors, border_left_colors, MozBorderLeftColors, VISUAL) CSS_PROP(-moz-border-left-colors, border_left_colors, MozBorderLeftColors, NS_STYLE_HINT_VISUAL)
CSS_PROP(border-left-style, border_left_style, BorderLeftStyle, REFLOW) // on/off will need reflow CSS_PROP(border-left-style, border_left_style, BorderLeftStyle, NS_STYLE_HINT_REFLOW) // on/off will need reflow
CSS_PROP(border-left-width, border_left_width, BorderLeftWidth, REFLOW) CSS_PROP(border-left-width, border_left_width, BorderLeftWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-right, border_right, BorderRight, REFLOW) CSS_PROP(border-right, border_right, BorderRight, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-right-color, border_right_color, BorderRightColor, VISUAL) CSS_PROP(border-right-color, border_right_color, BorderRightColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-right-colors, border_right_colors, MozBorderRightColors, VISUAL) CSS_PROP(-moz-border-right-colors, border_right_colors, MozBorderRightColors, NS_STYLE_HINT_VISUAL)
CSS_PROP(border-right-style, border_right_style, BorderRightStyle, REFLOW) // on/off will need reflow CSS_PROP(border-right-style, border_right_style, BorderRightStyle, NS_STYLE_HINT_REFLOW) // on/off will need reflow
CSS_PROP(border-right-width, border_right_width, BorderRightWidth, REFLOW) CSS_PROP(border-right-width, border_right_width, BorderRightWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-spacing, border_spacing, BorderSpacing, REFLOW) CSS_PROP(border-spacing, border_spacing, BorderSpacing, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-style, border_style, BorderStyle, REFLOW) // on/off will need reflow CSS_PROP(border-style, border_style, BorderStyle, NS_STYLE_HINT_REFLOW) // on/off will need reflow
CSS_PROP(border-top, border_top, BorderTop, REFLOW) CSS_PROP(border-top, border_top, BorderTop, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-top-color, border_top_color, BorderTopColor, VISUAL) CSS_PROP(border-top-color, border_top_color, BorderTopColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-top-colors, border_top_colors, MozBorderTopColors, VISUAL) CSS_PROP(-moz-border-top-colors, border_top_colors, MozBorderTopColors, NS_STYLE_HINT_VISUAL)
CSS_PROP(border-top-style, border_top_style, BorderTopStyle, REFLOW) // on/off will need reflow CSS_PROP(border-top-style, border_top_style, BorderTopStyle, NS_STYLE_HINT_REFLOW) // on/off will need reflow
CSS_PROP(border-top-width, border_top_width, BorderTopWidth, REFLOW) CSS_PROP(border-top-width, border_top_width, BorderTopWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-width, border_width, BorderWidth, REFLOW) CSS_PROP(border-width, border_width, BorderWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-border-x-spacing, border_x_spacing, BorderXSpacing, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-border-x-spacing, border_x_spacing, BorderXSpacing, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP_INTERNAL(-x-border-y-spacing, border_y_spacing, BorderYSpacing, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-border-y-spacing, border_y_spacing, BorderYSpacing, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(bottom, bottom, Bottom, REFLOW) CSS_PROP(bottom, bottom, Bottom, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-box-align, box_align, MozBoxAlign, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-align, box_align, MozBoxAlign, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-direction, box_direction, MozBoxDirection, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-direction, box_direction, MozBoxDirection, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-flex, box_flex, MozBoxFlex, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-flex, box_flex, MozBoxFlex, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-flex-group, box_flex_group, MozBoxFlexGroup, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-flex-group, box_flex_group, MozBoxFlexGroup, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-orient, box_orient, MozBoxOrient, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-orient, box_orient, MozBoxOrient, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-pack, box_pack, MozBoxPack, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-pack, box_pack, MozBoxPack, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-sizing, box_sizing, MozBoxSizing, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-sizing, box_sizing, MozBoxSizing, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-ordinal-group, box_ordinal_group, MozBoxOrdinalGroup, FRAMECHANGE) CSS_PROP(-moz-box-ordinal-group, box_ordinal_group, MozBoxOrdinalGroup, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(caption-side, caption_side, CaptionSide, REFLOW) CSS_PROP(caption-side, caption_side, CaptionSide, NS_STYLE_HINT_REFLOW)
CSS_PROP(clear, clear, Clear, REFLOW) CSS_PROP(clear, clear, Clear, NS_STYLE_HINT_REFLOW)
CSS_PROP(clip, clip, Clip, REFLOW) CSS_PROP(clip, clip, Clip, nsChangeHint_SyncFrameView)
CSS_PROP_INTERNAL(-x-clip-bottom, clip_bottom, ClipBottom, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-clip-bottom, clip_bottom, ClipBottom, nsChangeHint_SyncFrameView) // XXX bug 3935
CSS_PROP_INTERNAL(-x-clip-left, clip_left, ClipLeft, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-clip-left, clip_left, ClipLeft, nsChangeHint_SyncFrameView) // XXX bug 3935
CSS_PROP_INTERNAL(-x-clip-right, clip_right, ClipRight, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-clip-right, clip_right, ClipRight, nsChangeHint_SyncFrameView) // XXX bug 3935
CSS_PROP_INTERNAL(-x-clip-top, clip_top, ClipTop, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-clip-top, clip_top, ClipTop, nsChangeHint_SyncFrameView) // XXX bug 3935
CSS_PROP(color, color, Color, VISUAL) CSS_PROP(color, color, Color, NS_STYLE_HINT_VISUAL)
CSS_PROP(content, content, Content, FRAMECHANGE) CSS_PROP(content, content, Content, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(counter-increment, counter_increment, CounterIncrement, REFLOW) CSS_PROP(counter-increment, counter_increment, CounterIncrement, NS_STYLE_HINT_REFLOW)
CSS_PROP(counter-reset, counter_reset, CounterReset, REFLOW) CSS_PROP(counter-reset, counter_reset, CounterReset, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-counter-increment, _moz_counter_increment, MozCounterIncrement, REFLOW) // XXX bug 137285 CSS_PROP(-moz-counter-increment, _moz_counter_increment, MozCounterIncrement, NS_STYLE_HINT_REFLOW) // XXX bug 137285
CSS_PROP(-moz-counter-reset, _moz_counter_reset, MozCounterReset, REFLOW) // XXX bug 137285 CSS_PROP(-moz-counter-reset, _moz_counter_reset, MozCounterReset, NS_STYLE_HINT_REFLOW) // XXX bug 137285
CSS_PROP(cue, cue, Cue, AURAL) CSS_PROP(cue, cue, Cue, NS_STYLE_HINT_AURAL)
CSS_PROP(cue-after, cue_after, CueAfter, AURAL) CSS_PROP(cue-after, cue_after, CueAfter, NS_STYLE_HINT_AURAL)
CSS_PROP(cue-before, cue_before, CueBefore, AURAL) CSS_PROP(cue-before, cue_before, CueBefore, NS_STYLE_HINT_AURAL)
CSS_PROP(cursor, cursor, Cursor, VISUAL) CSS_PROP(cursor, cursor, Cursor, NS_STYLE_HINT_VISUAL)
CSS_PROP(direction, direction, Direction, REFLOW) CSS_PROP(direction, direction, Direction, NS_STYLE_HINT_REFLOW)
CSS_PROP(display, display, Display, FRAMECHANGE) CSS_PROP(display, display, Display, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(elevation, elevation, Elevation, AURAL) CSS_PROP(elevation, elevation, Elevation, NS_STYLE_HINT_AURAL)
CSS_PROP(empty-cells, empty_cells, EmptyCells, VISUAL) CSS_PROP(empty-cells, empty_cells, EmptyCells, NS_STYLE_HINT_VISUAL)
CSS_PROP(float, float, CssFloat, FRAMECHANGE) CSS_PROP(float, float, CssFloat, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(-moz-float-edge, float_edge, MozFloatEdge, REFLOW) // XXX bug 3935 CSS_PROP(-moz-float-edge, float_edge, MozFloatEdge, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(font, font, Font, REFLOW) CSS_PROP(font, font, Font, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-family, font_family, FontFamily, REFLOW) CSS_PROP(font-family, font_family, FontFamily, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-size, font_size, FontSize, REFLOW) CSS_PROP(font-size, font_size, FontSize, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-size-adjust, font_size_adjust, FontSizeAdjust, REFLOW) CSS_PROP(font-size-adjust, font_size_adjust, FontSizeAdjust, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-stretch, font_stretch, FontStretch, REFLOW) CSS_PROP(font-stretch, font_stretch, FontStretch, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-style, font_style, FontStyle, REFLOW) CSS_PROP(font-style, font_style, FontStyle, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-variant, font_variant, FontVariant, REFLOW) CSS_PROP(font-variant, font_variant, FontVariant, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-weight, font_weight, FontWeight, REFLOW) CSS_PROP(font-weight, font_weight, FontWeight, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-force-broken-image-icon, force_broken_image_icon, MozForceBrokenImageIcon, FRAMECHANGE) // bug 58646 CSS_PROP(-moz-force-broken-image-icon, force_broken_image_icon, MozForceBrokenImageIcon, NS_STYLE_HINT_FRAMECHANGE) // bug 58646
CSS_PROP(height, height, Height, REFLOW) CSS_PROP(height, height, Height, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-image-region, image_region, MozImageRegion, REFLOW) CSS_PROP(-moz-image-region, image_region, MozImageRegion, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-image-region-bottom, image_region_bottom, MozImageRegionBottom, REFLOW) CSS_PROP_INTERNAL(-x-image-region-bottom, image_region_bottom, MozImageRegionBottom, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-image-region-left, image_region_left, MozImageRegionLeft, REFLOW) CSS_PROP_INTERNAL(-x-image-region-left, image_region_left, MozImageRegionLeft, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-image-region-right, image_region_right, MozImageRegionRight, REFLOW) CSS_PROP_INTERNAL(-x-image-region-right, image_region_right, MozImageRegionRight, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-image-region-top, image_region_top, MozImageRegionTop, REFLOW) CSS_PROP_INTERNAL(-x-image-region-top, image_region_top, MozImageRegionTop, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-key-equivalent, key_equivalent, MozKeyEquivalent, CONTENT) // This will need some other notification, but what? // XXX bug 3935 CSS_PROP(-moz-key-equivalent, key_equivalent, MozKeyEquivalent, NS_STYLE_HINT_CONTENT) // This will need some other notification, but what? // XXX bug 3935
CSS_PROP(left, left, Left, REFLOW) CSS_PROP(left, left, Left, NS_STYLE_HINT_REFLOW)
CSS_PROP(letter-spacing, letter_spacing, LetterSpacing, REFLOW) CSS_PROP(letter-spacing, letter_spacing, LetterSpacing, NS_STYLE_HINT_REFLOW)
CSS_PROP(line-height, line_height, LineHeight, REFLOW) CSS_PROP(line-height, line_height, LineHeight, NS_STYLE_HINT_REFLOW)
CSS_PROP(list-style, list_style, ListStyle, REFLOW) CSS_PROP(list-style, list_style, ListStyle, NS_STYLE_HINT_REFLOW)
CSS_PROP(list-style-image, list_style_image, ListStyleImage, REFLOW) CSS_PROP(list-style-image, list_style_image, ListStyleImage, NS_STYLE_HINT_REFLOW)
CSS_PROP(list-style-position, list_style_position, ListStylePosition, REFLOW) CSS_PROP(list-style-position, list_style_position, ListStylePosition, NS_STYLE_HINT_REFLOW)
CSS_PROP(list-style-type, list_style_type, ListStyleType, REFLOW) CSS_PROP(list-style-type, list_style_type, ListStyleType, NS_STYLE_HINT_REFLOW)
CSS_PROP(margin, margin, Margin, REFLOW) CSS_PROP(margin, margin, Margin, NS_STYLE_HINT_REFLOW)
CSS_PROP(margin-bottom, margin_bottom, MarginBottom, REFLOW) CSS_PROP(margin-bottom, margin_bottom, MarginBottom, NS_STYLE_HINT_REFLOW)
CSS_PROP(margin-left, margin_left, MarginLeft, REFLOW) CSS_PROP(margin-left, margin_left, MarginLeft, NS_STYLE_HINT_REFLOW)
CSS_PROP(margin-right, margin_right, MarginRight, REFLOW) CSS_PROP(margin-right, margin_right, MarginRight, NS_STYLE_HINT_REFLOW)
CSS_PROP(margin-top, margin_top, MarginTop, REFLOW) CSS_PROP(margin-top, margin_top, MarginTop, NS_STYLE_HINT_REFLOW)
CSS_PROP(marker-offset, marker_offset, MarkerOffset, REFLOW) CSS_PROP(marker-offset, marker_offset, MarkerOffset, NS_STYLE_HINT_REFLOW)
CSS_PROP(marks, marks, Marks, VISUAL) CSS_PROP(marks, marks, Marks, NS_STYLE_HINT_VISUAL)
CSS_PROP(max-height, max_height, MaxHeight, REFLOW) CSS_PROP(max-height, max_height, MaxHeight, NS_STYLE_HINT_REFLOW)
CSS_PROP(max-width, max_width, MaxWidth, REFLOW) CSS_PROP(max-width, max_width, MaxWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP(min-height, min_height, MinHeight, REFLOW) CSS_PROP(min-height, min_height, MinHeight, NS_STYLE_HINT_REFLOW)
CSS_PROP(min-width, min_width, MinWidth, REFLOW) CSS_PROP(min-width, min_width, MinWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-opacity, opacity, MozOpacity, FRAMECHANGE) // XXX bug 3935 CSS_PROP(-moz-opacity, opacity, MozOpacity, NS_STYLE_HINT_FRAMECHANGE) // XXX bug 3935
CSS_PROP(orphans, orphans, Orphans, REFLOW) CSS_PROP(orphans, orphans, Orphans, NS_STYLE_HINT_REFLOW)
CSS_PROP(outline, outline, Outline, VISUAL) CSS_PROP(outline, outline, Outline, NS_STYLE_HINT_VISUAL)
CSS_PROP(outline, outline_color, OutlineColor, VISUAL) CSS_PROP(outline, outline_color, OutlineColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(outline, outline_style, OutlineStyle, VISUAL) CSS_PROP(outline, outline_style, OutlineStyle, NS_STYLE_HINT_VISUAL)
CSS_PROP(outline, outline_width, OutlineWidth, VISUAL) CSS_PROP(outline, outline_width, OutlineWidth, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-outline, _moz_outline, MozOutline, VISUAL) // XXX This is temporary fix for nsbeta3+ Bug 48973, turning outline into -moz-outline XXX bug 48973 CSS_PROP(-moz-outline, _moz_outline, MozOutline, NS_STYLE_HINT_VISUAL) // XXX This is temporary fix for nsbeta3+ Bug 48973, turning outline into -moz-outline XXX bug 48973
CSS_PROP(-moz-outline-color, _moz_outline_color, MozOutlineColor, VISUAL) // XXX bug 48973 CSS_PROP(-moz-outline-color, _moz_outline_color, MozOutlineColor, NS_STYLE_HINT_VISUAL) // XXX bug 48973
CSS_PROP(-moz-outline-style, _moz_outline_style, MozOutlineStyle, VISUAL) // XXX bug 48973 CSS_PROP(-moz-outline-style, _moz_outline_style, MozOutlineStyle, NS_STYLE_HINT_VISUAL) // XXX bug 48973
CSS_PROP(-moz-outline-width, _moz_outline_width, MozOutlineWidth, VISUAL) // XXX bug 48973 CSS_PROP(-moz-outline-width, _moz_outline_width, MozOutlineWidth, NS_STYLE_HINT_VISUAL) // XXX bug 48973
CSS_PROP(overflow, overflow, Overflow, FRAMECHANGE) CSS_PROP(overflow, overflow, Overflow, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(padding, padding, Padding, REFLOW) CSS_PROP(padding, padding, Padding, NS_STYLE_HINT_REFLOW)
CSS_PROP(padding-bottom, padding_bottom, PaddingBottom, REFLOW) CSS_PROP(padding-bottom, padding_bottom, PaddingBottom, NS_STYLE_HINT_REFLOW)
CSS_PROP(padding-left, padding_left, PaddingLeft, REFLOW) CSS_PROP(padding-left, padding_left, PaddingLeft, NS_STYLE_HINT_REFLOW)
CSS_PROP(padding-right, padding_right, PaddingRight, REFLOW) CSS_PROP(padding-right, padding_right, PaddingRight, NS_STYLE_HINT_REFLOW)
CSS_PROP(padding-top, padding_top, PaddingTop, REFLOW) CSS_PROP(padding-top, padding_top, PaddingTop, NS_STYLE_HINT_REFLOW)
CSS_PROP(page, page, Page, REFLOW) CSS_PROP(page, page, Page, NS_STYLE_HINT_REFLOW)
CSS_PROP(page-break-after, page_break_after, PageBreakAfter, REFLOW) CSS_PROP(page-break-after, page_break_after, PageBreakAfter, NS_STYLE_HINT_REFLOW)
CSS_PROP(page-break-before, page_break_before, PageBreakBefore, REFLOW) CSS_PROP(page-break-before, page_break_before, PageBreakBefore, NS_STYLE_HINT_REFLOW)
CSS_PROP(page-break-inside, page_break_inside, PageBreakInside, REFLOW) CSS_PROP(page-break-inside, page_break_inside, PageBreakInside, NS_STYLE_HINT_REFLOW)
CSS_PROP(pause, pause, Pause, AURAL) CSS_PROP(pause, pause, Pause, NS_STYLE_HINT_AURAL)
CSS_PROP(pause-after, pause_after, PauseAfter, AURAL) CSS_PROP(pause-after, pause_after, PauseAfter, NS_STYLE_HINT_AURAL)
CSS_PROP(pause-before, pause_before, PauseBefore, AURAL) CSS_PROP(pause-before, pause_before, PauseBefore, NS_STYLE_HINT_AURAL)
CSS_PROP(pitch, pitch, Pitch, AURAL) CSS_PROP(pitch, pitch, Pitch, NS_STYLE_HINT_AURAL)
CSS_PROP(pitch-range, pitch_range, PitchRange, AURAL) CSS_PROP(pitch-range, pitch_range, PitchRange, NS_STYLE_HINT_AURAL)
CSS_PROP(play-during, play_during, PlayDuring, AURAL) CSS_PROP(play-during, play_during, PlayDuring, NS_STYLE_HINT_AURAL)
CSS_PROP_INTERNAL(-x-play-during-flags, play_during_flags, PlayDuringFlags, AURAL) // XXX why is this here? CSS_PROP_INTERNAL(-x-play-during-flags, play_during_flags, PlayDuringFlags, NS_STYLE_HINT_AURAL) // XXX why is this here?
CSS_PROP(position, position, Position, FRAMECHANGE) CSS_PROP(position, position, Position, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(quotes, quotes, Quotes, REFLOW) CSS_PROP(quotes, quotes, Quotes, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-quotes-close, quotes_close, QuotesClose, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-quotes-close, quotes_close, QuotesClose, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP_INTERNAL(-x-quotes-open, quotes_open, QuotesOpen, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-quotes-open, quotes_open, QuotesOpen, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-resizer, resizer, MozResizer, FRAMECHANGE) // XXX bug 3935 CSS_PROP(-moz-resizer, resizer, MozResizer, NS_STYLE_HINT_FRAMECHANGE) // XXX bug 3935
CSS_PROP(richness, richness, Richness, AURAL) CSS_PROP(richness, richness, Richness, NS_STYLE_HINT_AURAL)
CSS_PROP(right, right, Right, REFLOW) CSS_PROP(right, right, Right, NS_STYLE_HINT_REFLOW)
CSS_PROP(size, size, Size, REFLOW) CSS_PROP(size, size, Size, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-size-height, size_height, SizeHeight, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-size-height, size_height, SizeHeight, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP_INTERNAL(-x-size-width, size_width, SizeWidth, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-size-width, size_width, SizeWidth, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(speak, speak, Speak, AURAL) CSS_PROP(speak, speak, Speak, NS_STYLE_HINT_AURAL)
CSS_PROP(speak-header, speak_header, SpeakHeader, AURAL) CSS_PROP(speak-header, speak_header, SpeakHeader, NS_STYLE_HINT_AURAL)
CSS_PROP(speak-numeral, speak_numeral, SpeakNumeral, AURAL) CSS_PROP(speak-numeral, speak_numeral, SpeakNumeral, NS_STYLE_HINT_AURAL)
CSS_PROP(speak-punctuation, speak_punctuation, SpeakPunctuation, AURAL) CSS_PROP(speak-punctuation, speak_punctuation, SpeakPunctuation, NS_STYLE_HINT_AURAL)
CSS_PROP(speech-rate, speech_rate, SpeechRate, AURAL) CSS_PROP(speech-rate, speech_rate, SpeechRate, NS_STYLE_HINT_AURAL)
CSS_PROP(stress, stress, Stress, AURAL) CSS_PROP(stress, stress, Stress, NS_STYLE_HINT_AURAL)
CSS_PROP(table-layout, table_layout, TableLayout, REFLOW) CSS_PROP(table-layout, table_layout, TableLayout, NS_STYLE_HINT_REFLOW)
CSS_PROP(text-align, text_align, TextAlign, REFLOW) CSS_PROP(text-align, text_align, TextAlign, NS_STYLE_HINT_REFLOW)
CSS_PROP(text-decoration, text_decoration, TextDecoration, VISUAL) CSS_PROP(text-decoration, text_decoration, TextDecoration, NS_STYLE_HINT_VISUAL)
CSS_PROP(text-indent, text_indent, TextIndent, REFLOW) CSS_PROP(text-indent, text_indent, TextIndent, NS_STYLE_HINT_REFLOW)
CSS_PROP(text-shadow, text_shadow, TextShadow, VISUAL) CSS_PROP(text-shadow, text_shadow, TextShadow, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(-x-text-shadow-color, text_shadow_color, TextShadowColor, VISUAL) // XXX bug 3935 CSS_PROP_INTERNAL(-x-text-shadow-color, text_shadow_color, TextShadowColor, NS_STYLE_HINT_VISUAL) // XXX bug 3935
CSS_PROP_INTERNAL(-x-text-shadow-radius, text_shadow_radius, TextShadowRadius, VISUAL) // XXX bug 3935 CSS_PROP_INTERNAL(-x-text-shadow-radius, text_shadow_radius, TextShadowRadius, NS_STYLE_HINT_VISUAL) // XXX bug 3935
CSS_PROP_INTERNAL(-x-text-shadow-x, text_shadow_x, TextShadowX, VISUAL) // XXX bug 3935 CSS_PROP_INTERNAL(-x-text-shadow-x, text_shadow_x, TextShadowX, NS_STYLE_HINT_VISUAL) // XXX bug 3935
CSS_PROP_INTERNAL(-x-text-shadow-y, text_shadow_y, TextShadowY, VISUAL) // XXX bug 3935 CSS_PROP_INTERNAL(-x-text-shadow-y, text_shadow_y, TextShadowY, NS_STYLE_HINT_VISUAL) // XXX bug 3935
CSS_PROP(text-transform, text_transform, TextTransform, REFLOW) CSS_PROP(text-transform, text_transform, TextTransform, NS_STYLE_HINT_REFLOW)
CSS_PROP(top, top, Top, REFLOW) CSS_PROP(top, top, Top, NS_STYLE_HINT_REFLOW)
CSS_PROP(unicode-bidi, unicode_bidi, UnicodeBidi, REFLOW) CSS_PROP(unicode-bidi, unicode_bidi, UnicodeBidi, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-user-focus, user_focus, MozUserFocus, CONTENT) // XXX bug 3935 CSS_PROP(-moz-user-focus, user_focus, MozUserFocus, NS_STYLE_HINT_CONTENT) // XXX bug 3935
CSS_PROP(-moz-user-input, user_input, MozUserInput, FRAMECHANGE) // XXX ??? // XXX bug 3935 CSS_PROP(-moz-user-input, user_input, MozUserInput, NS_STYLE_HINT_FRAMECHANGE) // XXX ??? // XXX bug 3935
CSS_PROP(-moz-user-modify, user_modify, MozUserModify, FRAMECHANGE) // XXX bug 3935 CSS_PROP(-moz-user-modify, user_modify, MozUserModify, NS_STYLE_HINT_FRAMECHANGE) // XXX bug 3935
CSS_PROP(-moz-user-select, user_select, MozUserSelect, CONTENT) // XXX bug 3935 CSS_PROP(-moz-user-select, user_select, MozUserSelect, NS_STYLE_HINT_CONTENT) // XXX bug 3935
CSS_PROP(vertical-align, vertical_align, VerticalAlign, REFLOW) CSS_PROP(vertical-align, vertical_align, VerticalAlign, NS_STYLE_HINT_REFLOW)
CSS_PROP(visibility, visibility, Visibility, REFLOW) // reflow for collapse CSS_PROP(visibility, visibility, Visibility, NS_STYLE_HINT_REFLOW) // reflow for collapse
CSS_PROP(voice-family, voice_family, VoiceFamily, AURAL) CSS_PROP(voice-family, voice_family, VoiceFamily, NS_STYLE_HINT_AURAL)
CSS_PROP(volume, volume, Volume, AURAL) CSS_PROP(volume, volume, Volume, NS_STYLE_HINT_AURAL)
CSS_PROP(white-space, white_space, WhiteSpace, REFLOW) CSS_PROP(white-space, white_space, WhiteSpace, NS_STYLE_HINT_REFLOW)
CSS_PROP(widows, widows, Widows, REFLOW) CSS_PROP(widows, widows, Widows, NS_STYLE_HINT_REFLOW)
CSS_PROP(width, width, Width, REFLOW) CSS_PROP(width, width, Width, NS_STYLE_HINT_REFLOW)
CSS_PROP(word-spacing, word_spacing, WordSpacing, REFLOW) CSS_PROP(word-spacing, word_spacing, WordSpacing, NS_STYLE_HINT_REFLOW)
CSS_PROP(z-index, z_index, ZIndex, REFLOW) CSS_PROP(z-index, z_index, ZIndex, NS_STYLE_HINT_REFLOW)
#ifdef MOZ_SVG #ifdef MOZ_SVG
// XXX treat SVG's CSS Properties as internal for now. // XXX treat SVG's CSS Properties as internal for now.
// Do we want to create an nsIDOMSVGCSS2Properties interface? // Do we want to create an nsIDOMSVGCSS2Properties interface?
CSS_PROP_INTERNAL(fill, fill, Fill, VISUAL) CSS_PROP_INTERNAL(fill, fill, Fill, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(fill-opacity, fill_opacity, FillOpacity, VISUAL) CSS_PROP_INTERNAL(fill-opacity, fill_opacity, FillOpacity, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(fill-rule, fill_rule, FillRule, VISUAL) CSS_PROP_INTERNAL(fill-rule, fill_rule, FillRule, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke, stroke, Stroke, VISUAL) CSS_PROP_INTERNAL(stroke, stroke, Stroke, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-dasharray, stroke_dasharray, StrokeDasharray, VISUAL) CSS_PROP_INTERNAL(stroke-dasharray, stroke_dasharray, StrokeDasharray, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-dashoffset, stroke_dashoffset, StrokeDashoffset, VISUAL) CSS_PROP_INTERNAL(stroke-dashoffset, stroke_dashoffset, StrokeDashoffset, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-linecap, stroke_linecap, StrokeLinecap, VISUAL) CSS_PROP_INTERNAL(stroke-linecap, stroke_linecap, StrokeLinecap, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-linejoin, stroke_linejoin, StrokeLinejoin, VISUAL) CSS_PROP_INTERNAL(stroke-linejoin, stroke_linejoin, StrokeLinejoin, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-miterlimit, stroke_miterlimit, StrokeMiterlimit, VISUAL) CSS_PROP_INTERNAL(stroke-miterlimit, stroke_miterlimit, StrokeMiterlimit, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-opacity, stroke_opacity, StrokeOpacity, VISUAL) CSS_PROP_INTERNAL(stroke-opacity, stroke_opacity, StrokeOpacity, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-width, stroke_width, StrokeWidth, VISUAL) CSS_PROP_INTERNAL(stroke-width, stroke_width, StrokeWidth, NS_STYLE_HINT_VISUAL)
#endif #endif
// Clean up after ourselves // Clean up after ourselves

Просмотреть файл

@ -79,6 +79,11 @@ inline nsChangeHint NS_CombineHint(nsChangeHint aH1, nsChangeHint aH2) {
return (nsChangeHint)(aH1 | aH2); return (nsChangeHint)(aH1 | aH2);
} }
// Merge two hints, taking the union
inline nsChangeHint NS_SubtractHint(nsChangeHint aH1, nsChangeHint aH2) {
return (nsChangeHint)(aH1 & ~aH2);
}
// Merge the "src" hint into the "dst" hint // Merge the "src" hint into the "dst" hint
// Returns true iff the destination changed // Returns true iff the destination changed
inline PRBool NS_UpdateHint(nsChangeHint& aDest, nsChangeHint aSrc) { inline PRBool NS_UpdateHint(nsChangeHint& aDest, nsChangeHint aSrc) {

Просмотреть файл

@ -1286,7 +1286,7 @@ PRBool nsCSSProps::GetColorName(PRInt32 aPropValue, nsCString &aStr)
} }
// define array of all CSS property hints // define array of all CSS property hints
#define CSS_PROP(_name, _id, _method, _hint) NS_STYLE_HINT_##_hint, #define CSS_PROP(_name, _id, _method, _hint) _hint,
const nsChangeHint nsCSSProps::kHintTable[eCSSProperty_COUNT] = { const nsChangeHint nsCSSProps::kHintTable[eCSSProperty_COUNT] = {
#include "nsCSSPropList.h" #include "nsCSSPropList.h"
}; };

Просмотреть файл

@ -1049,23 +1049,28 @@ nsStyleDisplay::nsStyleDisplay(const nsStyleDisplay& aSource)
nsChangeHint nsStyleDisplay::CalcDifference(const nsStyleDisplay& aOther) const nsChangeHint nsStyleDisplay::CalcDifference(const nsStyleDisplay& aOther) const
{ {
if (mBinding != aOther.mBinding || mPosition != aOther.mPosition) nsChangeHint hint = nsChangeHint_None;
return NS_STYLE_HINT_FRAMECHANGE;
if ((mDisplay == aOther.mDisplay) && if (mBinding != aOther.mBinding
(mFloats == aOther.mFloats) && || mPosition != aOther.mPosition
(mOverflow == aOther.mOverflow)) { || mDisplay != aOther.mDisplay
if ((mBreakType == aOther.mBreakType) && || mFloats != aOther.mFloats
(mBreakBefore == aOther.mBreakBefore) && || mOverflow != aOther.mOverflow)
(mBreakAfter == aOther.mBreakAfter) && NS_UpdateHint(hint, nsChangeHint_ReconstructFrame);
(mClipFlags == aOther.mClipFlags) &&
(mClip == aOther.mClip) && // XXX the following is conservative, for now: changing float breaking shouldn't
(mAppearance == aOther.mAppearance)) { // necessarily require a repaint, reflow should suffice.
return NS_STYLE_HINT_NONE; if (mBreakType != aOther.mBreakType
} || mBreakBefore != aOther.mBreakBefore
return NS_STYLE_HINT_REFLOW; || mBreakAfter != aOther.mBreakAfter
} || mAppearance != aOther.mAppearance)
return NS_STYLE_HINT_FRAMECHANGE; NS_UpdateHint(hint, NS_CombineHint(nsChangeHint_ReflowFrame, nsChangeHint_RepaintFrame));
if (mClipFlags != aOther.mClipFlags
|| mClip != aOther.mClip)
NS_UpdateHint(hint, nsChangeHint_SyncFrameView);
return hint;
} }
// -------------------- // --------------------

Просмотреть файл

@ -9930,111 +9930,13 @@ static PRBool gInApplyRenderingChangeToTree = PR_FALSE;
static void static void
DoApplyRenderingChangeToTree(nsIPresContext* aPresContext, DoApplyRenderingChangeToTree(nsIPresContext* aPresContext,
nsIFrame* aFrame, nsIFrame* aFrame,
nsIViewManager* aViewManager); nsIViewManager* aViewManager,
nsChangeHint aChange);
static void
SyncAndInvalidateView(nsIPresContext* aPresContext,
nsIView* aView,
nsIFrame* aFrame,
nsIViewManager* aViewManager)
{
NS_PRECONDITION(gInApplyRenderingChangeToTree,
"should only be called within ApplyRenderingChangeToTree");
const nsStyleBackground* bg;
const nsStyleDisplay* disp;
const nsStyleVisibility* vis;
PRBool isCanvas;
PRBool hasBG =
nsCSSRendering::FindBackground(aPresContext, aFrame, &bg, &isCanvas);
aFrame->GetStyleData(eStyleStruct_Display, (const nsStyleStruct*&) disp);
aFrame->GetStyleData(eStyleStruct_Visibility, (const nsStyleStruct*&) vis);
aViewManager->SetViewOpacity(aView, vis->mOpacity);
// See if the view should be hidden or visible
PRBool viewIsVisible = PR_TRUE;
PRBool viewHasTransparentContent =
!isCanvas &&
(!hasBG ||
(bg->mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT));
if (NS_STYLE_VISIBILITY_COLLAPSE == vis->mVisible) {
viewIsVisible = PR_FALSE;
}
else if (NS_STYLE_VISIBILITY_HIDDEN == vis->mVisible) {
// If it has a widget, hide the view because the widget can't deal with it
nsIWidget* widget = nsnull;
aView->GetWidget(widget);
if (widget) {
viewIsVisible = PR_FALSE;
NS_RELEASE(widget);
}
else {
// If it's a scroll frame, then hide the view. This means that
// child elements can't override their parent's visibility, but
// it's not practical to leave it visible in all cases because
// the scrollbars will be showing
nsIAtom* frameType;
aFrame->GetFrameType(&frameType);
if (frameType == nsLayoutAtoms::scrollFrame) {
viewIsVisible = PR_FALSE;
} else {
// If it's a container element, then leave the view visible, but
// mark it as having transparent content. The reason we need to
// do this is that child elements can override their parent's
// hidden visibility and be visible anyway
nsIFrame* firstChild;
aFrame->FirstChild(aPresContext, nsnull, &firstChild);
if (firstChild) {
// It's not a left frame, so the view needs to be visible, but
// marked as having transparent content
viewHasTransparentContent = PR_TRUE;
} else {
// It's a leaf frame so go ahead and hide the view
viewIsVisible = PR_FALSE;
}
}
NS_IF_RELEASE(frameType);
}
} else {
// if the view is for a popup, don't show the view if the popup is closed
nsCOMPtr<nsIWidget> widget;
aView->GetWidget(*getter_AddRefs(widget));
if (widget) {
nsWindowType windowType;
widget->GetWindowType(windowType);
if (windowType == eWindowType_popup)
widget->IsVisible(viewIsVisible);
}
}
// If the frame has visible content that overflows the content area, then we
// need the view marked as having transparent content
if (NS_STYLE_OVERFLOW_VISIBLE == disp->mOverflow) {
nsFrameState frameState;
aFrame->GetFrameState(&frameState);
if (frameState & NS_FRAME_OUTSIDE_CHILDREN) {
viewHasTransparentContent = PR_TRUE;
}
}
if (viewIsVisible) {
aViewManager->SetViewContentTransparency(aView, viewHasTransparentContent);
aViewManager->SetViewVisibility(aView, nsViewVisibility_kShow);
aViewManager->UpdateView(aView, NS_VMREFRESH_NO_SYNC);
}
else {
aViewManager->SetViewVisibility(aView, nsViewVisibility_kHide);
}
}
static void static void
UpdateViewsForTree(nsIPresContext* aPresContext, nsIFrame* aFrame, UpdateViewsForTree(nsIPresContext* aPresContext, nsIFrame* aFrame,
nsIViewManager* aViewManager, nsRect& aBoundsRect) nsIViewManager* aViewManager, nsRect& aBoundsRect,
nsChangeHint aChange)
{ {
NS_PRECONDITION(gInApplyRenderingChangeToTree, NS_PRECONDITION(gInApplyRenderingChangeToTree,
"should only be called within ApplyRenderingChangeToTree"); "should only be called within ApplyRenderingChangeToTree");
@ -10043,7 +9945,12 @@ UpdateViewsForTree(nsIPresContext* aPresContext, nsIFrame* aFrame,
aFrame->GetView(aPresContext, &view); aFrame->GetView(aPresContext, &view);
if (view) { if (view) {
SyncAndInvalidateView(aPresContext, view, aFrame, aViewManager); if (aChange & nsChangeHint_RepaintFrame) {
aViewManager->UpdateView(view, NS_VMREFRESH_NO_SYNC);
}
if (aChange & nsChangeHint_SyncFrameView) {
nsContainerFrame::SyncFrameViewProperties(aPresContext, aFrame, nsnull, view);
}
} }
nsRect bounds; nsRect bounds;
@ -10071,11 +9978,11 @@ UpdateViewsForTree(nsIPresContext* aPresContext, nsIFrame* aFrame,
nsIFrame* outOfFlowFrame = ((nsPlaceholderFrame*)child)->GetOutOfFlowFrame(); nsIFrame* outOfFlowFrame = ((nsPlaceholderFrame*)child)->GetOutOfFlowFrame();
NS_ASSERTION(outOfFlowFrame, "no out-of-flow frame"); NS_ASSERTION(outOfFlowFrame, "no out-of-flow frame");
DoApplyRenderingChangeToTree(aPresContext, outOfFlowFrame, aViewManager); DoApplyRenderingChangeToTree(aPresContext, outOfFlowFrame, aViewManager, aChange);
} }
else { // regular frame else { // regular frame
nsRect childBounds; nsRect childBounds;
UpdateViewsForTree(aPresContext, child, aViewManager, childBounds); UpdateViewsForTree(aPresContext, child, aViewManager, childBounds, aChange);
bounds.UnionRect(bounds, childBounds); bounds.UnionRect(bounds, childBounds);
} }
NS_IF_RELEASE(frameType); NS_IF_RELEASE(frameType);
@ -10093,7 +10000,8 @@ UpdateViewsForTree(nsIPresContext* aPresContext, nsIFrame* aFrame,
static void static void
DoApplyRenderingChangeToTree(nsIPresContext* aPresContext, DoApplyRenderingChangeToTree(nsIPresContext* aPresContext,
nsIFrame* aFrame, nsIFrame* aFrame,
nsIViewManager* aViewManager) nsIViewManager* aViewManager,
nsChangeHint aChange)
{ {
NS_PRECONDITION(gInApplyRenderingChangeToTree, NS_PRECONDITION(gInApplyRenderingChangeToTree,
"should only be called within ApplyRenderingChangeToTree"); "should only be called within ApplyRenderingChangeToTree");
@ -10114,9 +10022,9 @@ DoApplyRenderingChangeToTree(nsIPresContext* aPresContext,
aFrame->GetOffsetFromView(aPresContext, viewOffset, &parentView); aFrame->GetOffsetFromView(aPresContext, viewOffset, &parentView);
NS_ASSERTION(nsnull != parentView, "no view"); NS_ASSERTION(nsnull != parentView, "no view");
} }
UpdateViewsForTree(aPresContext, aFrame, aViewManager, invalidRect); UpdateViewsForTree(aPresContext, aFrame, aViewManager, invalidRect, aChange);
if (! view) { // if frame has view, will already be invalidated if (! view && (aChange & nsChangeHint_RepaintFrame)) { // if frame has view, will already be invalidated
// XXX Instead of calling this we should really be calling // XXX Instead of calling this we should really be calling
// Invalidate on on the nsFrame (which does this) // Invalidate on on the nsFrame (which does this)
const nsStyleOutline* outline; const nsStyleOutline* outline;
@ -10138,14 +10046,20 @@ DoApplyRenderingChangeToTree(nsIPresContext* aPresContext,
static void static void
ApplyRenderingChangeToTree(nsIPresContext* aPresContext, ApplyRenderingChangeToTree(nsIPresContext* aPresContext,
nsIFrame* aFrame, nsIFrame* aFrame,
nsIViewManager* aViewManager) nsIViewManager* aViewManager,
nsChangeHint aChange)
{ {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsIPresShell> shell;
aPresContext->GetShell(getter_AddRefs(shell)); aPresContext->GetShell(getter_AddRefs(shell));
PRBool isPaintingSuppressed = PR_FALSE; PRBool isPaintingSuppressed = PR_FALSE;
shell->IsPaintingSuppressed(&isPaintingSuppressed); shell->IsPaintingSuppressed(&isPaintingSuppressed);
if (isPaintingSuppressed) if (isPaintingSuppressed) {
return; // Don't allow synchronous rendering changes when painting is turned off. // Don't allow synchronous rendering changes when painting is turned off.
aChange = NS_SubtractHint(aChange, nsChangeHint_RepaintFrame);
if (!aChange) {
return;
}
}
// If the frame's background is propagated to an ancestor, walk up to // If the frame's background is propagated to an ancestor, walk up to
// that ancestor. // that ancestor.
@ -10179,7 +10093,7 @@ ApplyRenderingChangeToTree(nsIPresContext* aPresContext,
#ifdef DEBUG #ifdef DEBUG
gInApplyRenderingChangeToTree = PR_TRUE; gInApplyRenderingChangeToTree = PR_TRUE;
#endif #endif
DoApplyRenderingChangeToTree(aPresContext, aFrame, viewManager); DoApplyRenderingChangeToTree(aPresContext, aFrame, viewManager, aChange);
#ifdef DEBUG #ifdef DEBUG
gInApplyRenderingChangeToTree = PR_FALSE; gInApplyRenderingChangeToTree = PR_FALSE;
#endif #endif
@ -10250,7 +10164,7 @@ nsCSSFrameConstructor::StyleChangeReflow(nsIPresContext* aPresContext,
// This isn't the most efficient way to do it, but it saves code // This isn't the most efficient way to do it, but it saves code
// size and doesn't add much cost compared to the reflow.. // size and doesn't add much cost compared to the reflow..
if (ancestor != aFrame) if (ancestor != aFrame)
ApplyRenderingChangeToTree(aPresContext, ancestor, nsnull); ApplyRenderingChangeToTree(aPresContext, ancestor, nsnull, nsChangeHint_RepaintFrame);
return NS_OK; return NS_OK;
} }
@ -10349,11 +10263,8 @@ nsCSSFrameConstructor::ProcessRestyledFrames(nsStyleChangeList& aChangeList,
if (hint & nsChangeHint_ReflowFrame) { if (hint & nsChangeHint_ReflowFrame) {
StyleChangeReflow(aPresContext, frame, nsnull); StyleChangeReflow(aPresContext, frame, nsnull);
} }
if (hint & nsChangeHint_RepaintFrame) { if (hint & (nsChangeHint_RepaintFrame | nsChangeHint_SyncFrameView)) {
ApplyRenderingChangeToTree(aPresContext, frame, nsnull); ApplyRenderingChangeToTree(aPresContext, frame, nsnull, hint);
}
if (hint & nsChangeHint_SyncFrameView) {
// TBD: split out view sync from ApplyRenderingChange and friends
} }
} }
} }
@ -10463,7 +10374,7 @@ nsCSSFrameConstructor::ContentStatesChanged(nsIPresContext* aPresContext,
if (theme && theme->ThemeSupportsWidget(aPresContext, primaryFrame1, app1)) if (theme && theme->ThemeSupportsWidget(aPresContext, primaryFrame1, app1))
theme->WidgetStateChanged(primaryFrame1, app1, nsnull, &repaint); theme->WidgetStateChanged(primaryFrame1, app1, nsnull, &repaint);
if (repaint) if (repaint)
ApplyRenderingChangeToTree(aPresContext, primaryFrame1, nsnull); ApplyRenderingChangeToTree(aPresContext, primaryFrame1, nsnull, nsChangeHint_RepaintFrame);
} }
if (!(frameChange1 & nsChangeHint_ReconstructDoc) && (primaryFrame2)) { if (!(frameChange1 & nsChangeHint_ReconstructDoc) && (primaryFrame2)) {
@ -10477,7 +10388,7 @@ nsCSSFrameConstructor::ContentStatesChanged(nsIPresContext* aPresContext,
if (theme && theme->ThemeSupportsWidget(aPresContext, primaryFrame2, app2)) if (theme && theme->ThemeSupportsWidget(aPresContext, primaryFrame2, app2))
theme->WidgetStateChanged(primaryFrame2, app2, nsnull, &repaint); theme->WidgetStateChanged(primaryFrame2, app2, nsnull, &repaint);
if (repaint) if (repaint)
ApplyRenderingChangeToTree(aPresContext, primaryFrame2, nsnull); ApplyRenderingChangeToTree(aPresContext, primaryFrame2, nsnull, nsChangeHint_RepaintFrame);
} }
} }
@ -10523,7 +10434,7 @@ nsCSSFrameConstructor::ContentStatesChanged(nsIPresContext* aPresContext,
if (theme) if (theme)
theme->WidgetStateChanged(primaryFrame2, app2, nsnull, &repaint); theme->WidgetStateChanged(primaryFrame2, app2, nsnull, &repaint);
if (repaint) if (repaint)
ApplyRenderingChangeToTree(aPresContext, primaryFrame2, nsnull); ApplyRenderingChangeToTree(aPresContext, primaryFrame2, nsnull, nsChangeHint_RepaintFrame);
} }
// max change needed for top level frames // max change needed for top level frames
@ -10701,7 +10612,7 @@ nsCSSFrameConstructor::AttributeChanged(nsIPresContext* aPresContext,
PRBool repaint = PR_FALSE; PRBool repaint = PR_FALSE;
theme->WidgetStateChanged(primaryFrame, disp->mAppearance, aAttribute, &repaint); theme->WidgetStateChanged(primaryFrame, disp->mAppearance, aAttribute, &repaint);
if (repaint) if (repaint)
ApplyRenderingChangeToTree(aPresContext, primaryFrame, nsnull); ApplyRenderingChangeToTree(aPresContext, primaryFrame, nsnull, nsChangeHint_RepaintFrame);
} }
} }
} }
@ -10791,11 +10702,6 @@ nsCSSFrameConstructor::StyleRuleChanged(nsIPresContext* aPresContext,
PRBool reframe = (aHint & (nsChangeHint_ReconstructDoc | nsChangeHint_ReconstructFrame PRBool reframe = (aHint & (nsChangeHint_ReconstructDoc | nsChangeHint_ReconstructFrame
| nsChangeHint_Unknown)) != 0; | nsChangeHint_Unknown)) != 0;
PRBool reflow = (aHint & (nsChangeHint_ReconstructDoc | nsChangeHint_ReconstructFrame
| nsChangeHint_ReflowFrame | nsChangeHint_Unknown)) != 0;
PRBool render = (aHint & (nsChangeHint_ReconstructDoc | nsChangeHint_ReconstructFrame
| nsChangeHint_ReflowFrame | nsChangeHint_RepaintFrame
| nsChangeHint_Unknown)) != 0;
PRBool restyle = (aHint & ~(nsChangeHint_AttrChange)) != 0; PRBool restyle = (aHint & ~(nsChangeHint_AttrChange)) != 0;
// TBD: add "review" to update view? // TBD: add "review" to update view?
@ -10809,14 +10715,20 @@ nsCSSFrameConstructor::StyleRuleChanged(nsIPresContext* aPresContext,
result = ReconstructDocElementHierarchy(aPresContext); result = ReconstructDocElementHierarchy(aPresContext);
} }
else { else {
PRBool reflow = (aHint & (nsChangeHint_ReconstructDoc | nsChangeHint_ReconstructFrame
| nsChangeHint_ReflowFrame | nsChangeHint_Unknown)) != 0;
PRBool renderOrSync = (aHint & (nsChangeHint_ReconstructDoc | nsChangeHint_ReconstructFrame
| nsChangeHint_ReflowFrame | nsChangeHint_RepaintFrame
| nsChangeHint_Unknown | nsChangeHint_SyncFrameView)) != 0;
// XXX hack, skip the root and scrolling frames // XXX hack, skip the root and scrolling frames
frame->FirstChild(aPresContext, nsnull, &frame); frame->FirstChild(aPresContext, nsnull, &frame);
frame->FirstChild(aPresContext, nsnull, &frame); frame->FirstChild(aPresContext, nsnull, &frame);
if (reflow) { if (reflow) {
StyleChangeReflow(aPresContext, frame, nsnull); StyleChangeReflow(aPresContext, frame, nsnull);
} }
else if (render) { if (renderOrSync) {
ApplyRenderingChangeToTree(aPresContext, frame, nsnull); ApplyRenderingChangeToTree(aPresContext, frame, nsnull, aHint);
} }
} }

Просмотреть файл

@ -79,6 +79,11 @@ inline nsChangeHint NS_CombineHint(nsChangeHint aH1, nsChangeHint aH2) {
return (nsChangeHint)(aH1 | aH2); return (nsChangeHint)(aH1 | aH2);
} }
// Merge two hints, taking the union
inline nsChangeHint NS_SubtractHint(nsChangeHint aH1, nsChangeHint aH2) {
return (nsChangeHint)(aH1 & ~aH2);
}
// Merge the "src" hint into the "dst" hint // Merge the "src" hint into the "dst" hint
// Returns true iff the destination changed // Returns true iff the destination changed
inline PRBool NS_UpdateHint(nsChangeHint& aDest, nsChangeHint aSrc) { inline PRBool NS_UpdateHint(nsChangeHint& aDest, nsChangeHint aSrc) {

Просмотреть файл

@ -91,15 +91,14 @@ nsCSSPropList.h</a>
 Insert the property in the list alphabetically, using the existing  Insert the property in the list alphabetically, using the existing
property names as a template. The format of the entry you will create is: property names as a template. The format of the entry you will create is:
</p> </p>
<pre>CSS_PROP(-moz-force-broken-image-iconst, force_broken_image_icons, FRAMECHANGE) // bug 58646</pre> <pre>CSS_PROP(-moz-force-broken-image-iconst, force_broken_image_icons, NS_STYLE_HINT_FRAMECHANGE) // bug 58646</pre>
<p>The first value is the formal property name, in other words the property <p>The first value is the formal property name, in other words the property
name as it is seen by the CSS parser.<br> name as it is seen by the CSS parser.<br>
The second value is the name of the property as it will appear internally.<br> The second value is the name of the property as it will appear internally.<br>
The last value indicates what must change when the value of the property The last value indicates what must change when the value of the property
changes. It should be one of (<a href="http://lxr.mozilla.org/seamonkey/source/layout/base/public/nsStyleConsts.h#46"> changes. It should be an
VISUAL, AURAL, REFLOW, CONTENT, FRAMECHANGE</a> <a href="http://lxr.mozilla.org/seamonkey/source/content/shared/public/nsChangeHint.h">nsChangeHint</a>.</p>
).</p>
<p>If you need to introduce new constants for the values of the property, they <p>If you need to introduce new constants for the values of the property, they
must be added to <a href="http://lxr.mozilla.org/seamonkey/source/layout/base/public/nsStyleConsts.h"> must be added to <a href="http://lxr.mozilla.org/seamonkey/source/layout/base/public/nsStyleConsts.h">

Просмотреть файл

@ -60,6 +60,7 @@
#include "nsGUIEvent.h" #include "nsGUIEvent.h"
#include "nsLayoutAtoms.h" #include "nsLayoutAtoms.h"
#include "nsIServiceManager.h" #include "nsIServiceManager.h"
#include "nsContainerFrame.h"
#ifdef ACCESSIBILITY #ifdef ACCESSIBILITY
#include "nsIAccessibilityService.h" #include "nsIAccessibilityService.h"
#endif #endif
@ -283,14 +284,15 @@ nsImageControlFrame::Init(nsIPresContext* aPresContext,
// the view's size is not know yet, but its size will be kept in synch with our frame. // the view's size is not know yet, but its size will be kept in synch with our frame.
nsRect boundBox(0, 0, 0, 0); nsRect boundBox(0, 0, 0, 0);
result = view->Init(viewMan, boundBox, parView); result = view->Init(viewMan, boundBox, parView);
viewMan->SetViewContentTransparency(view, PR_TRUE);
nsContainerFrame::SyncFrameViewProperties(aPresContext, this, aContext, view);
// this gets reset during reflow anyway
// viewMan->SetViewContentTransparency(view, PR_TRUE);
// XXX put the view last in document order until we know how to do better // XXX put the view last in document order until we know how to do better
viewMan->InsertChild(parView, view, nsnull, PR_TRUE); viewMan->InsertChild(parView, view, nsnull, PR_TRUE);
SetView(aPresContext, view); SetView(aPresContext, view);
const nsStyleVisibility* vis = (const nsStyleVisibility*) mStyleContext->GetStyleData(eStyleStruct_Visibility);
// set the opacity
viewMan->SetViewOpacity(view, vis->mOpacity);
} }
return rv; return rv;

Просмотреть файл

@ -504,77 +504,266 @@ nsContainerFrame::SyncFrameViewAfterReflow(nsIPresContext* aPresContext,
const nsRect* aCombinedArea, const nsRect* aCombinedArea,
PRUint32 aFlags) PRUint32 aFlags)
{ {
if (aView) { if (!aView) {
return;
}
// Make sure the view is sized and positioned correctly
if (0 == (aFlags & NS_FRAME_NO_MOVE_VIEW)) {
PositionFrameView(aPresContext, aFrame);
}
if (0 == (aFlags & NS_FRAME_NO_SIZE_VIEW)) {
nsCOMPtr<nsIViewManager> vm; nsCOMPtr<nsIViewManager> vm;
nsFrameState kidState;
nsSize frameSize;
aView->GetViewManager(*getter_AddRefs(vm)); aView->GetViewManager(*getter_AddRefs(vm));
nsRect oldBounds;
aView->GetBounds(oldBounds);
nsFrameState kidState;
aFrame->GetFrameState(&kidState); aFrame->GetFrameState(&kidState);
aFrame->GetSize(frameSize);
// If the frame has child frames that stick outside the content
// Make sure the view is sized and positioned correctly // area, then size the view large enough to include those child
if (0 == (aFlags & NS_FRAME_NO_MOVE_VIEW)) { // frames
PositionFrameView(aPresContext, aFrame); if ((kidState & NS_FRAME_OUTSIDE_CHILDREN) && aCombinedArea) {
vm->ResizeView(aView, *aCombinedArea);
} else {
// If the width is unchanged and the height is not decreased then repaint only the
// newly exposed or contracted area, otherwise repaint the union of the old and new areas
// XXX: We currently invalidate the newly exposed areas only when the
// container frame's width is unchanged and the height is either unchanged or increased
// This is because some frames do not invalidate themselves properly. see bug 73825.
// Once bug 73825 is fixed, we should always pass PR_TRUE instead of
// frameSize.width == width && frameSize.height >= height.
nsSize frameSize;
aFrame->GetSize(frameSize);
nsRect newSize(0, 0, frameSize.width, frameSize.height);
vm->ResizeView(aView, newSize,
(frameSize.width == oldBounds.width && frameSize.height >= oldBounds.height));
} }
nsRect newSize(0, 0, frameSize.width, frameSize.height); nsRect newBounds;
if (0 == (aFlags & NS_FRAME_NO_SIZE_VIEW)) { aView->GetBounds(newBounds);
// If the frame has child frames that stick outside the content
// area, then size the view large enough to include those child
// frames
if ((kidState & NS_FRAME_OUTSIDE_CHILDREN) && aCombinedArea) {
vm->ResizeView(aView, *aCombinedArea);
newSize = *aCombinedArea;
} else {
nsRect bounds;
aView->GetBounds(bounds);
// If the width is unchanged and the height is not decreased then repaint only the
// newly exposed or contracted area, otherwise repaint the union of the old and new areas
// XXX: We currently invalidate the newly exposed areas only when the // if the bounds have changed and clipping is enabled, we need to update the clip area
// container frame's width is unchanged and the height is either unchanged or increased // and also possibly the transparency (in case the view grew bigger than the clip area
// This is because some frames do not invalidate themselves properly. see bug 73825. // so clipping is now cutting out part of the view)
// Once bug 73825 is fixed, we should always pass PR_TRUE instead of if (oldBounds != newBounds) {
// frameSize.width == width && frameSize.height >= height. SyncFrameViewAfterSizeChange(aPresContext, aFrame, nsnull, aView, aFlags);
vm->ResizeView(aView, newSize, }
(frameSize.width == bounds.width && frameSize.height >= bounds.height)); }
}
static void
SyncFrameViewGeometryDependentProperties(nsIPresContext* aPresContext,
nsIFrame* aFrame,
nsIStyleContext* aStyleContext,
nsIView* aView,
PRUint32 aFlags)
{
nsCOMPtr<nsIViewManager> vm;
aView->GetViewManager(*getter_AddRefs(vm));
PRBool isCanvas;
const nsStyleBackground* bg;
PRBool hasBG =
nsCSSRendering::FindBackground(aPresContext, aFrame, &bg, &isCanvas);
// background-attachment: fixed is not really geometry dependent, but
// we set it here because it's cheap to do so
PRBool fixedBackground = hasBG &&
NS_STYLE_BG_ATTACHMENT_FIXED == bg->mBackgroundAttachment;
// If the frame has a fixed background attachment, then indicate that the
// view's contents should be repainted and not bitblt'd
vm->SetViewBitBltEnabled(aView, !fixedBackground);
PRBool viewHasTransparentContent =
!hasBG ||
(bg->mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT) ||
!aFrame->CanPaintBackground();
if (isCanvas && viewHasTransparentContent) {
nsIView* rootView;
vm->GetRootView(rootView);
nsIView* rootParent;
rootView->GetParent(rootParent);
if (nsnull == rootParent) {
viewHasTransparentContent = PR_FALSE;
}
}
const nsStyleDisplay* display;
::GetStyleData(aStyleContext, &display);
nsFrameState kidState;
aFrame->GetFrameState(&kidState);
if (!viewHasTransparentContent) {
// If we're showing the view but the frame is hidden, then the view is transparent
nsViewVisibility visibility;
aView->GetVisibility(visibility);
const nsStyleVisibility* vis;
::GetStyleData(aStyleContext, &vis);
if ((nsViewVisibility_kShow == visibility
&& NS_STYLE_VISIBILITY_HIDDEN == vis->mVisible)
|| (NS_STYLE_OVERFLOW_VISIBLE == display->mOverflow
&& (kidState & NS_FRAME_OUTSIDE_CHILDREN) != 0)) {
viewHasTransparentContent = PR_TRUE;
}
}
// If the frame has visible content that overflows the content area, then we
// need the view marked as having transparent content
// There are two types of clipping:
// - 'clip' which only applies to absolutely positioned elements, and is
// relative to the element's border edge. 'clip' applies to the entire
// element
// - 'overflow-clip' which only applies to block-level elements and replaced
// elements that have 'overflow' set to 'hidden'. 'overflow-clip' is relative
// to the content area and applies to content only (not border or background).
// Note that out-of-flow frames like floated or absolutely positioned frames
// are block-level, but we can't rely on the 'display' value being set correctly
// in the style context...
PRBool isBlockLevel = display->IsBlockLevel() || (kidState & NS_FRAME_OUT_OF_FLOW);
PRBool hasClip = display->IsAbsolutelyPositioned() && (display->mClipFlags & NS_STYLE_CLIP_RECT);
PRBool hasOverflowClip = isBlockLevel && (display->mOverflow == NS_STYLE_OVERFLOW_HIDDEN);
if (hasClip || hasOverflowClip) {
nsSize frameSize;
aFrame->GetSize(frameSize);
nsRect clipRect;
if (hasClip) {
// Start with the 'auto' values and then factor in user specified values
clipRect.SetRect(0, 0, frameSize.width, frameSize.height);
if (display->mClipFlags & NS_STYLE_CLIP_RECT) {
if (0 == (NS_STYLE_CLIP_TOP_AUTO & display->mClipFlags)) {
clipRect.y = display->mClip.y;
}
if (0 == (NS_STYLE_CLIP_LEFT_AUTO & display->mClipFlags)) {
clipRect.x = display->mClip.x;
}
if (0 == (NS_STYLE_CLIP_RIGHT_AUTO & display->mClipFlags)) {
clipRect.width = display->mClip.width;
}
if (0 == (NS_STYLE_CLIP_BOTTOM_AUTO & display->mClipFlags)) {
clipRect.height = display->mClip.height;
}
}
}
if (hasOverflowClip) {
const nsStyleBorder* borderStyle;
::GetStyleData(aStyleContext, &borderStyle);
const nsStylePadding* paddingStyle;
::GetStyleData(aStyleContext, &paddingStyle);
nsMargin border, padding;
// XXX We don't support the 'overflow-clip' property yet so just use the
// content area (which is the default value) as the clip shape
nsRect overflowClipRect(0, 0, frameSize.width, frameSize.height);
borderStyle->GetBorder(border);
overflowClipRect.Deflate(border);
// XXX We need to handle percentage padding
if (paddingStyle->GetPadding(padding)) {
overflowClipRect.Deflate(padding);
}
if (hasClip) {
// If both 'clip' and 'overflow-clip' apply then use the intersection
// of the two
clipRect.IntersectRect(clipRect, overflowClipRect);
} else {
clipRect = overflowClipRect;
} }
} else {
aView->GetBounds(newSize);
nscoord x, y;
aView->GetPosition(&x, &y);
newSize.x -= x;
newSize.y -= y;
} }
const nsStyleBackground* bg; nsRect newSize;
const nsStyleVisibility* vis; aView->GetBounds(newSize);
const nsStyleDisplay* display; nscoord x, y;
PRBool isCanvas; aView->GetPosition(&x, &y);
PRBool hasBG = newSize.x -= x;
nsCSSRendering::FindBackground(aPresContext, aFrame, &bg, &isCanvas); newSize.y -= y;
aFrame->GetStyleData(eStyleStruct_Visibility, (const nsStyleStruct*&)vis);
aFrame->GetStyleData(eStyleStruct_Display, (const nsStyleStruct*&)display);
// Set the view's opacity // If part of the view is being clipped out, then mark it transparent
vm->SetViewOpacity(aView, vis->mOpacity); if (clipRect.y > newSize.y
|| clipRect.x > newSize.x
|| clipRect.XMost() < newSize.XMost()
|| clipRect.YMost() < newSize.YMost()) {
viewHasTransparentContent = PR_TRUE;
}
// Set clipping of child views.
nsRegion region;
region.Copy(nsRectFast(clipRect));
vm->SetViewChildClipRegion(aView, &region);
} else {
// Remove clipping of child views.
vm->SetViewChildClipRegion(aView, nsnull);
}
vm->SetViewContentTransparency(aView, viewHasTransparentContent);
}
void
nsContainerFrame::SyncFrameViewAfterSizeChange(nsIPresContext* aPresContext,
nsIFrame* aFrame,
nsIStyleContext* aStyleContext,
nsIView* aView,
PRUint32 aFlags)
{
if (!aView) {
return;
}
nsCOMPtr<nsIStyleContext> savedStyleContext;
if (nsnull == aStyleContext) {
aFrame->GetStyleContext(getter_AddRefs(savedStyleContext));
aStyleContext = savedStyleContext;
}
const nsStyleDisplay* display;
::GetStyleData(aStyleContext, &display);
nsFrameState kidState;
aFrame->GetFrameState(&kidState);
PRBool isBlockLevel = display->IsBlockLevel() || (kidState & NS_FRAME_OUT_OF_FLOW);
PRBool hasClip = display->IsAbsolutelyPositioned() && (display->mClipFlags & NS_STYLE_CLIP_RECT);
PRBool hasOverflowClip = isBlockLevel && (display->mOverflow == NS_STYLE_OVERFLOW_HIDDEN);
if (hasClip || hasOverflowClip) {
SyncFrameViewGeometryDependentProperties(aPresContext, aFrame, aStyleContext, aView, aFlags);
}
}
void
nsContainerFrame::SyncFrameViewProperties(nsIPresContext* aPresContext,
nsIFrame* aFrame,
nsIStyleContext* aStyleContext,
nsIView* aView,
PRUint32 aFlags)
{
if (!aView) {
return;
}
nsCOMPtr<nsIViewManager> vm;
aView->GetViewManager(*getter_AddRefs(vm));
nsCOMPtr<nsIStyleContext> savedStyleContext;
if (nsnull == aStyleContext) {
aFrame->GetStyleContext(getter_AddRefs(savedStyleContext));
aStyleContext = savedStyleContext;
}
const nsStyleVisibility* vis;
::GetStyleData(aStyleContext, &vis);
// Set the view's opacity
vm->SetViewOpacity(aView, vis->mOpacity);
// Make sure visibility is correct
if (0 == (aFlags & NS_FRAME_NO_VISIBILITY)) {
// See if the view should be hidden or visible // See if the view should be hidden or visible
PRBool viewIsVisible = PR_TRUE; PRBool viewIsVisible = PR_TRUE;
PRBool viewHasTransparentContent =
(!hasBG ||
(bg->mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT) ||
!aFrame->CanPaintBackground());
if (isCanvas && viewHasTransparentContent) {
nsIView* rootView;
vm->GetRootView(rootView);
nsIView* rootParent;
rootView->GetParent(rootParent);
if (nsnull == rootParent) {
viewHasTransparentContent = PR_FALSE;
}
}
if (NS_STYLE_VISIBILITY_COLLAPSE == vis->mVisible) { if (NS_STYLE_VISIBILITY_COLLAPSE == vis->mVisible) {
viewIsVisible = PR_FALSE; viewIsVisible = PR_FALSE;
@ -597,147 +786,106 @@ nsContainerFrame::SyncFrameViewAfterReflow(nsIPresContext* aPresContext,
if (frameType == nsLayoutAtoms::scrollFrame || frameType == nsLayoutAtoms::listControlFrame) { if (frameType == nsLayoutAtoms::scrollFrame || frameType == nsLayoutAtoms::listControlFrame) {
viewIsVisible = PR_FALSE; viewIsVisible = PR_FALSE;
} else {
// If we're a container element, then leave the view visible, but
// mark it as having transparent content. The reason we need to
// do this is that child elements can override their parent's
// hidden visibility and be visible anyway
nsIFrame* firstChild;
aFrame->FirstChild(aPresContext, nsnull, &firstChild);
if (firstChild) {
// Not a left frame, so the view needs to be visible, but marked
// as having transparent content
viewHasTransparentContent = PR_TRUE;
} else {
// Leaf frame so go ahead and hide the view
viewIsVisible = PR_FALSE;
}
} }
} }
}
// If the frame has visible content that overflows the content area, then we
// need the view marked as having transparent content
if (NS_STYLE_OVERFLOW_VISIBLE == display->mOverflow) {
if (kidState & NS_FRAME_OUTSIDE_CHILDREN) {
viewHasTransparentContent = PR_TRUE;
}
}
// Make sure visibility is correct
if (0 == (aFlags & NS_FRAME_NO_VISIBILITY)) {
vm->SetViewVisibility(aView, viewIsVisible ? nsViewVisibility_kShow :
nsViewVisibility_kHide);
}
// Make sure z-index is correct
PRInt32 zIndex = 0;
PRInt32 oldZIndex;
PRBool oldAutoZIndex;
PRBool oldTopMost;
PRBool autoZIndex = PR_FALSE;
const nsStylePosition* position;
aView->GetZIndex(oldZIndex, oldAutoZIndex, oldTopMost);
aFrame->GetStyleData(eStyleStruct_Position, (const nsStyleStruct*&)position);
if (position->mZIndex.GetUnit() == eStyleUnit_Integer) {
zIndex = position->mZIndex.GetIntValue();
} else if (position->mZIndex.GetUnit() == eStyleUnit_Auto) {
autoZIndex = PR_TRUE;
}
vm->SetViewZIndex(aView, autoZIndex, zIndex, oldTopMost);
// There are two types of clipping:
// - 'clip' which only applies to absolutely positioned elements, and is
// relative to the element's border edge. 'clip' applies to the entire
// element
// - 'overflow-clip' which only applies to block-level elements and replaced
// elements that have 'overflow' set to 'hidden'. 'overflow-clip' is relative
// to the content area and applies to content only (not border or background).
// Note that out-of-flow frames like floated or absolutely positioned frames
// are block-level, but we can't rely on the 'display' value being set correctly
// in the style context...
PRBool hasClip, hasOverflowClip;
PRBool isBlockLevel = display->IsBlockLevel() || (0 != (kidState & NS_FRAME_OUT_OF_FLOW));
hasClip = display->IsAbsolutelyPositioned() && (display->mClipFlags & NS_STYLE_CLIP_RECT);
hasOverflowClip = isBlockLevel && (display->mOverflow == NS_STYLE_OVERFLOW_HIDDEN);
if (hasClip || hasOverflowClip) {
nsRect clipRect;
if (hasClip) {
// Start with the 'auto' values and then factor in user specified values
clipRect.SetRect(0, 0, frameSize.width, frameSize.height);
if (display->mClipFlags & NS_STYLE_CLIP_RECT) {
if (0 == (NS_STYLE_CLIP_TOP_AUTO & display->mClipFlags)) {
clipRect.y = display->mClip.y;
}
if (0 == (NS_STYLE_CLIP_LEFT_AUTO & display->mClipFlags)) {
clipRect.x = display->mClip.x;
}
if (0 == (NS_STYLE_CLIP_RIGHT_AUTO & display->mClipFlags)) {
clipRect.width = display->mClip.width;
}
if (0 == (NS_STYLE_CLIP_BOTTOM_AUTO & display->mClipFlags)) {
clipRect.height = display->mClip.height;
}
}
}
if (hasOverflowClip) {
const nsStyleBorder* borderStyle;
const nsStylePadding* paddingStyle;
nsMargin border, padding;
aFrame->GetStyleData(eStyleStruct_Border, (const nsStyleStruct*&)borderStyle);
aFrame->GetStyleData(eStyleStruct_Padding, (const nsStyleStruct*&)paddingStyle);
// XXX We don't support the 'overflow-clip' property yet so just use the
// content area (which is the default value) as the clip shape
nsRect overflowClipRect(0, 0, frameSize.width, frameSize.height);
borderStyle->GetBorder(border);
overflowClipRect.Deflate(border);
// XXX We need to handle percentage padding
if (paddingStyle->GetPadding(padding)) {
overflowClipRect.Deflate(padding);
}
if (hasClip) {
// If both 'clip' and 'overflow-clip' apply then use the intersection
// of the two
clipRect.IntersectRect(clipRect, overflowClipRect);
} else {
clipRect = overflowClipRect;
}
}
// If part of the view is being clipped out, then mark it transparent
if (clipRect.y > newSize.y
|| clipRect.x > newSize.x
|| clipRect.XMost() < newSize.XMost()
|| clipRect.YMost() < newSize.YMost()) {
viewHasTransparentContent = PR_TRUE;
}
// Set clipping of child views.
nsRegion region;
region.Copy(clipRect);
vm->SetViewChildClipRegion(aView, &region);
} else { } else {
// Remove clipping of child views. // if the view is for a popup, don't show the view if the popup is closed
vm->SetViewChildClipRegion(aView, nsnull); nsCOMPtr<nsIWidget> widget;
aView->GetWidget(*getter_AddRefs(widget));
if (widget) {
nsWindowType windowType;
widget->GetWindowType(windowType);
if (windowType == eWindowType_popup) {
widget->IsVisible(viewIsVisible);
}
}
} }
// Make sure content transparency is correct vm->SetViewVisibility(aView, viewIsVisible ? nsViewVisibility_kShow :
if (viewIsVisible) { nsViewVisibility_kHide);
vm->SetViewContentTransparency(aView, viewHasTransparentContent); }
const nsStyleDisplay* display;
::GetStyleData(aStyleContext, &display);
// See if the frame is being relatively positioned or absolutely
// positioned
PRBool isTopMostView = display->IsPositioned();
// Make sure z-index is correct
const nsStylePosition* position;
::GetStyleData(aStyleContext, &position);
PRInt32 zIndex = 0;
PRBool autoZIndex = PR_FALSE;
if (position->mZIndex.GetUnit() == eStyleUnit_Integer) {
zIndex = position->mZIndex.GetIntValue();
} else if (position->mZIndex.GetUnit() == eStyleUnit_Auto) {
autoZIndex = PR_TRUE;
}
vm->SetViewZIndex(aView, autoZIndex, zIndex, isTopMostView);
SyncFrameViewGeometryDependentProperties(aPresContext, aFrame, aStyleContext, aView, aFlags);
}
PRBool
nsContainerFrame::FrameNeedsView(nsIPresContext* aPresContext,
nsIFrame* aFrame,
nsIStyleContext* aStyleContext)
{
const nsStyleVisibility* vis;
::GetStyleData(aStyleContext, &vis);
if (vis->mOpacity != 1.0f) {
return PR_TRUE;
}
// See if the frame has a fixed background attachment
const nsStyleBackground *color;
PRBool isCanvas;
PRBool hasBackground =
nsCSSRendering::FindBackground(aPresContext, aFrame, &color, &isCanvas);
if (hasBackground &&
NS_STYLE_BG_ATTACHMENT_FIXED == color->mBackgroundAttachment) {
return PR_TRUE;
}
const nsStyleDisplay* display;
::GetStyleData(aStyleContext, &display);
if (NS_STYLE_POSITION_RELATIVE == display->mPosition) {
return PR_TRUE;
} else if (display->IsAbsolutelyPositioned()) {
return PR_TRUE;
}
nsCOMPtr<nsIAtom> pseudoTag;
aStyleContext->GetPseudoType(*getter_AddRefs(pseudoTag));
if (pseudoTag == nsLayoutAtoms::scrolledContentPseudo) {
return PR_TRUE;
}
// See if the frame is block-level and has 'overflow' set to 'hidden'. If
// so, then we need to give it a view so clipping
// of any child views works correctly. Note that if it's floated it is also
// block-level, but we can't trust that the style context 'display' value is
// set correctly
if ((display->IsBlockLevel() || display->IsFloating()) &&
(display->mOverflow == NS_STYLE_OVERFLOW_HIDDEN)) {
// XXX Check for the frame being a block frame and only force a view
// in that case, because adding a view for box frames seems to cause
// problems for XUL...
nsCOMPtr<nsIAtom> frameType;
aFrame->GetFrameType(getter_AddRefs(frameType));
if ((frameType == nsLayoutAtoms::blockFrame) ||
(frameType == nsLayoutAtoms::areaFrame)) {
return PR_TRUE;
} }
} }
return PR_FALSE;
} }
/** /**

Просмотреть файл

@ -100,14 +100,7 @@ public:
static void PositionFrameView(nsIPresContext* aPresContext, static void PositionFrameView(nsIPresContext* aPresContext,
nsIFrame* aKidFrame); nsIFrame* aKidFrame);
// Sets several view attributes: // Set the view's size and position after its frame has been reflowed.
// - if requested sizes the frame's view based on the current size and origin.
// Takes into account the combined area and (if overflow is visible) whether
// the frame has children that extend outside
// - opacity
// - visibility
// - content transparency
// - clip
// //
// Flags: // Flags:
// NS_FRAME_NO_MOVE_VIEW - don't position the frame's view. Set this if you // NS_FRAME_NO_MOVE_VIEW - don't position the frame's view. Set this if you
@ -119,6 +112,34 @@ public:
const nsRect* aCombinedArea, const nsRect* aCombinedArea,
PRUint32 aFlags = 0); PRUint32 aFlags = 0);
// Sets view attributes from the frame style that depend on the view's size
// (clip, transparency). This needs to be called if you change the size of
// a view and the view's frame could have clipping set on it.
// @param aStyleContext can be null, in which case the frame's style context is used
static void SyncFrameViewAfterSizeChange(nsIPresContext* aPresContext,
nsIFrame* aFrame,
nsIStyleContext* aStyleContext,
nsIView* aView,
PRUint32 aFlags = 0);
// Sets the view's attributes from the frame style.
// - opacity
// - visibility
// - content transparency
// - clip
// Call this when one of these styles changes or when the view has just
// been created.
// @param aStyleContext can be null, in which case the frame's style context is used
static void SyncFrameViewProperties(nsIPresContext* aPresContext,
nsIFrame* aFrame,
nsIStyleContext* aStyleContext,
nsIView* aView,
PRUint32 aFlags = 0);
// Returns PR_TRUE if the frame requires a view
static PRBool FrameNeedsView(nsIPresContext* aPresContext,
nsIFrame* aFrame, nsIStyleContext* aStyleContext);
/** /**
* Invokes the WillReflow() function, positions the frame and its view (if * Invokes the WillReflow() function, positions the frame and its view (if
* requested), and then calls Reflow(). If the reflow succeeds and the child * requested), and then calls Reflow(). If the reflow succeeds and the child

Просмотреть файл

@ -427,21 +427,6 @@ nsHTMLContainerFrame::ReparentFrameViewList(nsIPresContext* aPresContext,
return NS_OK; return NS_OK;
} }
static PRBool
IsContainerContent(nsIFrame* aFrame)
{
nsIContent* content;
PRBool result = PR_FALSE;
aFrame->GetContent(&content);
if (content) {
content->CanContainChildren(result);
NS_RELEASE(content);
}
return result;
}
nsresult nsresult
nsHTMLContainerFrame::CreateViewForFrame(nsIPresContext* aPresContext, nsHTMLContainerFrame::CreateViewForFrame(nsIPresContext* aPresContext,
nsIFrame* aFrame, nsIFrame* aFrame,
@ -449,244 +434,92 @@ nsHTMLContainerFrame::CreateViewForFrame(nsIPresContext* aPresContext,
nsIFrame* aContentParentFrame, nsIFrame* aContentParentFrame,
PRBool aForce) PRBool aForce)
{ {
PRBool isTopMostView = PR_FALSE;
nsIView* view; nsIView* view;
aFrame->GetView(aPresContext, &view); aFrame->GetView(aPresContext, &view);
if (nsnull != view) {
return NS_OK;
}
// If we don't yet have a view, see if we need a view // If we don't yet have a view, see if we need a view
if (nsnull == view) { if (!(aForce || FrameNeedsView(aPresContext, aFrame, aStyleContext))) {
PRBool fixedBackgroundAttachment = PR_FALSE; // don't need a view
return NS_OK;
}
// Get nsStyleColor and nsStyleDisplay // Create a view
const nsStyleDisplay* display = (const nsStyleDisplay*) nsIFrame* parent = nsnull;
aStyleContext->GetStyleData(eStyleStruct_Display); aFrame->GetParentWithView(aPresContext, &parent);
const nsStylePosition* position = (const nsStylePosition*) NS_ASSERTION(parent, "GetParentWithView failed");
aStyleContext->GetStyleData(eStyleStruct_Position);
const nsStyleVisibility* vis = (const nsStyleVisibility*) nsIView* parentView = nsnull;
aStyleContext->GetStyleData(eStyleStruct_Visibility); parent->GetView(aPresContext, &parentView);
NS_ASSERTION(parentView, "no parent with view");
// Create a view
static NS_DEFINE_CID(kViewCID, NS_VIEW_CID);
nsresult result = CallCreateInstance(kViewCID, &view);
if (NS_FAILED(result)) {
return result;
}
if (vis->mOpacity != 1.0f) { nsCOMPtr<nsIViewManager> viewManager;
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, parentView->GetViewManager(*getter_AddRefs(viewManager));
("nsHTMLContainerFrame::CreateViewForFrame: frame=%p opacity=%g", NS_ASSERTION(nsnull != viewManager, "null view manager");
aFrame, vis->mOpacity));
aForce = PR_TRUE;
}
// See if the frame has a fixed background attachment
const nsStyleBackground *color;
PRBool isCanvas;
PRBool hasBackground =
nsCSSRendering::FindBackground(aPresContext, aFrame, &color, &isCanvas);
if (hasBackground &&
NS_STYLE_BG_ATTACHMENT_FIXED == color->mBackgroundAttachment) {
aForce = PR_TRUE;
fixedBackgroundAttachment = PR_TRUE;
}
// See if the frame is being relatively positioned or absolutely // Initialize the view
// positioned nsRect bounds;
if (!aForce) { aFrame->GetRect(bounds);
if (NS_STYLE_POSITION_RELATIVE == display->mPosition) { view->Init(viewManager, bounds, parentView);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS,
("nsHTMLContainerFrame::CreateViewForFrame: frame=%p relatively positioned",
aFrame));
aForce = PR_TRUE;
isTopMostView = PR_TRUE;
} else if (display->IsAbsolutelyPositioned()) {
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS,
("nsHTMLContainerFrame::CreateViewForFrame: frame=%p absolutely positioned",
aFrame));
aForce = PR_TRUE;
isTopMostView = PR_TRUE;
}
}
if (NS_STYLE_POSITION_FIXED == display->mPosition) { SyncFrameViewProperties(aPresContext, aFrame, aStyleContext, view);
isTopMostView = PR_TRUE;
}
// See if the frame is a scrolled frame // Insert the view into the view hierarchy. If the parent view is a
if (!aForce) { // scrolling view we need to do this differently
nsIAtom* pseudoTag; nsIScrollableView* scrollingView;
aStyleContext->GetPseudoType(pseudoTag); if (NS_SUCCEEDED(CallQueryInterface(parentView, &scrollingView))) {
if (pseudoTag == nsLayoutAtoms::scrolledContentPseudo) { scrollingView->SetScrolledView(view);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, } else {
("nsHTMLContainerFrame::CreateViewForFrame: scrolled frame=%p", aFrame)); // XXX Drop it at the end of the document order until we can do better
aForce = PR_TRUE; viewManager->InsertChild(parentView, view, nsnull, PR_TRUE);
}
NS_IF_RELEASE(pseudoTag);
}
// See if the frame is block-level and has 'overflow' set to 'hidden'. If if (nsnull != aContentParentFrame) {
// so and it can have child frames, then we need to give it a view so clipping // If, for some reason, GetView below fails to initialize zParentView,
// of any child views works correctly. Note that if it's floated it is also // then ensure that we completely bypass InsertZPlaceholder below.
// block-level, but we can't trust that the style context 'display' value is // The effect will be as if we never knew about aContentParentFrame
// set correctly // in the first place, so at least this code won't be doing any damage.
if (!aForce) { nsIView* zParentView = parentView;
if ((display->IsBlockLevel() || display->IsFloating()) &&
(display->mOverflow == NS_STYLE_OVERFLOW_HIDDEN)) { aContentParentFrame->GetView(aPresContext, &zParentView);
// The reason for the check of whether it can contain children is just if (nsnull == zParentView) {
// to avoid giving it a view unnecessarily nsIFrame* zParentFrame = nsnull;
if (::IsContainerContent(aFrame)) {
// XXX Check for the frame being a block frame and only force a view
// in that case, because adding a view for box frames seems to cause
// problems for XUL...
nsIAtom* frameType;
aFrame->GetFrameType(&frameType);
if ((frameType == nsLayoutAtoms::blockFrame) ||
(frameType == nsLayoutAtoms::areaFrame)) {
aForce = PR_TRUE;
}
NS_IF_RELEASE(frameType);
}
}
}
if (aForce) {
// Create a view
nsIFrame* parent = nsnull;
nsIView* parentView = nsnull;
aFrame->GetParentWithView(aPresContext, &parent);
NS_ASSERTION(parent, "GetParentWithView failed");
parent->GetView(aPresContext, &parentView);
NS_ASSERTION(parentView, "no parent with view");
// Create a view
static NS_DEFINE_CID(kViewCID, NS_VIEW_CID);
nsresult result = nsComponentManager::CreateInstance(kViewCID,
nsnull,
NS_GET_IID(nsIView),
(void **)&view);
if (NS_OK == result) {
nsIViewManager* viewManager;
parentView->GetViewManager(viewManager);
NS_ASSERTION(nsnull != viewManager, "null view manager");
// Initialize the view
nsRect bounds;
aFrame->GetRect(bounds);
view->Init(viewManager, bounds, parentView);
// If the frame has a fixed background attachment, then indicate that the
// view's contents should be repainted and not bitblt'd
if (fixedBackgroundAttachment) {
viewManager->SetViewBitBltEnabled(view, PR_FALSE);
}
// Insert the view into the view hierarchy. If the parent view is a aContentParentFrame->GetParentWithView(aPresContext, &zParentFrame);
// scrolling view we need to do this differently NS_ASSERTION(zParentFrame, "GetParentWithView failed");
nsIScrollableView* scrollingView; zParentFrame->GetView(aPresContext, &zParentView);
if (NS_SUCCEEDED(parentView->QueryInterface(NS_GET_IID(nsIScrollableView), (void**)&scrollingView))) { NS_ASSERTION(zParentView, "no parent with view");
scrollingView->SetScrolledView(view); }
} else {
PRInt32 zIndex = 0; if (zParentView != parentView) {
PRBool autoZIndex = PR_FALSE; viewManager->InsertZPlaceholder(zParentView, view, nsnull, PR_TRUE);
// Get the z-index to use
if (position->mZIndex.GetUnit() == eStyleUnit_Integer) {
zIndex = position->mZIndex.GetIntValue();
} else if (position->mZIndex.GetUnit() == eStyleUnit_Auto) {
autoZIndex = PR_TRUE;
}
viewManager->SetViewZIndex(view, autoZIndex, zIndex, isTopMostView);
// XXX Drop it at the end of the document order until we can do better
viewManager->InsertChild(parentView, view, nsnull, PR_TRUE);
if (nsnull != aContentParentFrame) {
// If, for some reason, GetView below fails to initialize zParentView,
// then ensure that we completely bypass InsertZPlaceholder below.
// The effect will be as if we never knew about aContentParentFrame
// in the first place, so at least this code won't be doing any damage.
nsIView* zParentView = parentView;
aContentParentFrame->GetView(aPresContext, &zParentView);
if (nsnull == zParentView) {
nsIFrame* zParentFrame = nsnull;
aContentParentFrame->GetParentWithView(aPresContext, &zParentFrame);
NS_ASSERTION(zParentFrame, "GetParentWithView failed");
zParentFrame->GetView(aPresContext, &zParentView);
NS_ASSERTION(zParentView, "no parent with view");
}
if (zParentView != parentView) {
viewManager->InsertZPlaceholder(zParentView, view, nsnull, PR_TRUE);
}
}
}
// See if the view should be hidden
PRBool viewIsVisible = PR_TRUE;
PRBool viewHasTransparentContent =
!isCanvas &&
(!hasBackground ||
(color->mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT));
if (NS_STYLE_VISIBILITY_COLLAPSE == vis->mVisible) {
viewIsVisible = PR_FALSE;
}
else if (NS_STYLE_VISIBILITY_HIDDEN == vis->mVisible) {
// If it has a widget, hide the view because the widget can't deal with it
nsIWidget* widget = nsnull;
view->GetWidget(widget);
if (widget) {
viewIsVisible = PR_FALSE;
NS_RELEASE(widget);
}
else {
// If it's a container element, then leave the view visible, but
// mark it as having transparent content. The reason we need to
// do this is that child elements can override their parent's
// hidden visibility and be visible anyway.
//
// Because this function is called before processing the content
// object's child elements, we can't tell if it's a leaf by looking
// at whether the frame has any child frames
if (::IsContainerContent(aFrame)) {
// The view needs to be visible, but marked as having transparent
// content
viewHasTransparentContent = PR_TRUE;
} else {
// Go ahead and hide the view
viewIsVisible = PR_FALSE;
}
}
}
if (viewIsVisible) {
if (viewHasTransparentContent) {
viewManager->SetViewContentTransparency(view, PR_TRUE);
}
} else {
viewManager->SetViewVisibility(view, nsViewVisibility_kHide);
}
// XXX If it's fixed positioned, then create a widget so it floats
// above the scrolling area
if (NS_STYLE_POSITION_FIXED == display->mPosition) {
view->CreateWidget(kCChildCID);
}
viewManager->SetViewOpacity(view, vis->mOpacity);
NS_RELEASE(viewManager);
} }
// Remember our view
aFrame->SetView(aPresContext, view);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS,
("nsHTMLContainerFrame::CreateViewForFrame: frame=%p view=%p",
aFrame));
return result;
} }
} }
// XXX If it's fixed positioned, then create a widget so it floats
// above the scrolling area
const nsStyleDisplay* display;
::GetStyleData(aStyleContext, &display);
if (NS_STYLE_POSITION_FIXED == display->mPosition) {
view->CreateWidget(kCChildCID);
}
// Remember our view
aFrame->SetView(aPresContext, view);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS,
("nsHTMLContainerFrame::CreateViewForFrame: frame=%p view=%p",
aFrame));
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -504,77 +504,266 @@ nsContainerFrame::SyncFrameViewAfterReflow(nsIPresContext* aPresContext,
const nsRect* aCombinedArea, const nsRect* aCombinedArea,
PRUint32 aFlags) PRUint32 aFlags)
{ {
if (aView) { if (!aView) {
return;
}
// Make sure the view is sized and positioned correctly
if (0 == (aFlags & NS_FRAME_NO_MOVE_VIEW)) {
PositionFrameView(aPresContext, aFrame);
}
if (0 == (aFlags & NS_FRAME_NO_SIZE_VIEW)) {
nsCOMPtr<nsIViewManager> vm; nsCOMPtr<nsIViewManager> vm;
nsFrameState kidState;
nsSize frameSize;
aView->GetViewManager(*getter_AddRefs(vm)); aView->GetViewManager(*getter_AddRefs(vm));
nsRect oldBounds;
aView->GetBounds(oldBounds);
nsFrameState kidState;
aFrame->GetFrameState(&kidState); aFrame->GetFrameState(&kidState);
aFrame->GetSize(frameSize);
// If the frame has child frames that stick outside the content
// Make sure the view is sized and positioned correctly // area, then size the view large enough to include those child
if (0 == (aFlags & NS_FRAME_NO_MOVE_VIEW)) { // frames
PositionFrameView(aPresContext, aFrame); if ((kidState & NS_FRAME_OUTSIDE_CHILDREN) && aCombinedArea) {
vm->ResizeView(aView, *aCombinedArea);
} else {
// If the width is unchanged and the height is not decreased then repaint only the
// newly exposed or contracted area, otherwise repaint the union of the old and new areas
// XXX: We currently invalidate the newly exposed areas only when the
// container frame's width is unchanged and the height is either unchanged or increased
// This is because some frames do not invalidate themselves properly. see bug 73825.
// Once bug 73825 is fixed, we should always pass PR_TRUE instead of
// frameSize.width == width && frameSize.height >= height.
nsSize frameSize;
aFrame->GetSize(frameSize);
nsRect newSize(0, 0, frameSize.width, frameSize.height);
vm->ResizeView(aView, newSize,
(frameSize.width == oldBounds.width && frameSize.height >= oldBounds.height));
} }
nsRect newSize(0, 0, frameSize.width, frameSize.height); nsRect newBounds;
if (0 == (aFlags & NS_FRAME_NO_SIZE_VIEW)) { aView->GetBounds(newBounds);
// If the frame has child frames that stick outside the content
// area, then size the view large enough to include those child
// frames
if ((kidState & NS_FRAME_OUTSIDE_CHILDREN) && aCombinedArea) {
vm->ResizeView(aView, *aCombinedArea);
newSize = *aCombinedArea;
} else {
nsRect bounds;
aView->GetBounds(bounds);
// If the width is unchanged and the height is not decreased then repaint only the
// newly exposed or contracted area, otherwise repaint the union of the old and new areas
// XXX: We currently invalidate the newly exposed areas only when the // if the bounds have changed and clipping is enabled, we need to update the clip area
// container frame's width is unchanged and the height is either unchanged or increased // and also possibly the transparency (in case the view grew bigger than the clip area
// This is because some frames do not invalidate themselves properly. see bug 73825. // so clipping is now cutting out part of the view)
// Once bug 73825 is fixed, we should always pass PR_TRUE instead of if (oldBounds != newBounds) {
// frameSize.width == width && frameSize.height >= height. SyncFrameViewAfterSizeChange(aPresContext, aFrame, nsnull, aView, aFlags);
vm->ResizeView(aView, newSize, }
(frameSize.width == bounds.width && frameSize.height >= bounds.height)); }
}
static void
SyncFrameViewGeometryDependentProperties(nsIPresContext* aPresContext,
nsIFrame* aFrame,
nsIStyleContext* aStyleContext,
nsIView* aView,
PRUint32 aFlags)
{
nsCOMPtr<nsIViewManager> vm;
aView->GetViewManager(*getter_AddRefs(vm));
PRBool isCanvas;
const nsStyleBackground* bg;
PRBool hasBG =
nsCSSRendering::FindBackground(aPresContext, aFrame, &bg, &isCanvas);
// background-attachment: fixed is not really geometry dependent, but
// we set it here because it's cheap to do so
PRBool fixedBackground = hasBG &&
NS_STYLE_BG_ATTACHMENT_FIXED == bg->mBackgroundAttachment;
// If the frame has a fixed background attachment, then indicate that the
// view's contents should be repainted and not bitblt'd
vm->SetViewBitBltEnabled(aView, !fixedBackground);
PRBool viewHasTransparentContent =
!hasBG ||
(bg->mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT) ||
!aFrame->CanPaintBackground();
if (isCanvas && viewHasTransparentContent) {
nsIView* rootView;
vm->GetRootView(rootView);
nsIView* rootParent;
rootView->GetParent(rootParent);
if (nsnull == rootParent) {
viewHasTransparentContent = PR_FALSE;
}
}
const nsStyleDisplay* display;
::GetStyleData(aStyleContext, &display);
nsFrameState kidState;
aFrame->GetFrameState(&kidState);
if (!viewHasTransparentContent) {
// If we're showing the view but the frame is hidden, then the view is transparent
nsViewVisibility visibility;
aView->GetVisibility(visibility);
const nsStyleVisibility* vis;
::GetStyleData(aStyleContext, &vis);
if ((nsViewVisibility_kShow == visibility
&& NS_STYLE_VISIBILITY_HIDDEN == vis->mVisible)
|| (NS_STYLE_OVERFLOW_VISIBLE == display->mOverflow
&& (kidState & NS_FRAME_OUTSIDE_CHILDREN) != 0)) {
viewHasTransparentContent = PR_TRUE;
}
}
// If the frame has visible content that overflows the content area, then we
// need the view marked as having transparent content
// There are two types of clipping:
// - 'clip' which only applies to absolutely positioned elements, and is
// relative to the element's border edge. 'clip' applies to the entire
// element
// - 'overflow-clip' which only applies to block-level elements and replaced
// elements that have 'overflow' set to 'hidden'. 'overflow-clip' is relative
// to the content area and applies to content only (not border or background).
// Note that out-of-flow frames like floated or absolutely positioned frames
// are block-level, but we can't rely on the 'display' value being set correctly
// in the style context...
PRBool isBlockLevel = display->IsBlockLevel() || (kidState & NS_FRAME_OUT_OF_FLOW);
PRBool hasClip = display->IsAbsolutelyPositioned() && (display->mClipFlags & NS_STYLE_CLIP_RECT);
PRBool hasOverflowClip = isBlockLevel && (display->mOverflow == NS_STYLE_OVERFLOW_HIDDEN);
if (hasClip || hasOverflowClip) {
nsSize frameSize;
aFrame->GetSize(frameSize);
nsRect clipRect;
if (hasClip) {
// Start with the 'auto' values and then factor in user specified values
clipRect.SetRect(0, 0, frameSize.width, frameSize.height);
if (display->mClipFlags & NS_STYLE_CLIP_RECT) {
if (0 == (NS_STYLE_CLIP_TOP_AUTO & display->mClipFlags)) {
clipRect.y = display->mClip.y;
}
if (0 == (NS_STYLE_CLIP_LEFT_AUTO & display->mClipFlags)) {
clipRect.x = display->mClip.x;
}
if (0 == (NS_STYLE_CLIP_RIGHT_AUTO & display->mClipFlags)) {
clipRect.width = display->mClip.width;
}
if (0 == (NS_STYLE_CLIP_BOTTOM_AUTO & display->mClipFlags)) {
clipRect.height = display->mClip.height;
}
}
}
if (hasOverflowClip) {
const nsStyleBorder* borderStyle;
::GetStyleData(aStyleContext, &borderStyle);
const nsStylePadding* paddingStyle;
::GetStyleData(aStyleContext, &paddingStyle);
nsMargin border, padding;
// XXX We don't support the 'overflow-clip' property yet so just use the
// content area (which is the default value) as the clip shape
nsRect overflowClipRect(0, 0, frameSize.width, frameSize.height);
borderStyle->GetBorder(border);
overflowClipRect.Deflate(border);
// XXX We need to handle percentage padding
if (paddingStyle->GetPadding(padding)) {
overflowClipRect.Deflate(padding);
}
if (hasClip) {
// If both 'clip' and 'overflow-clip' apply then use the intersection
// of the two
clipRect.IntersectRect(clipRect, overflowClipRect);
} else {
clipRect = overflowClipRect;
} }
} else {
aView->GetBounds(newSize);
nscoord x, y;
aView->GetPosition(&x, &y);
newSize.x -= x;
newSize.y -= y;
} }
const nsStyleBackground* bg; nsRect newSize;
const nsStyleVisibility* vis; aView->GetBounds(newSize);
const nsStyleDisplay* display; nscoord x, y;
PRBool isCanvas; aView->GetPosition(&x, &y);
PRBool hasBG = newSize.x -= x;
nsCSSRendering::FindBackground(aPresContext, aFrame, &bg, &isCanvas); newSize.y -= y;
aFrame->GetStyleData(eStyleStruct_Visibility, (const nsStyleStruct*&)vis);
aFrame->GetStyleData(eStyleStruct_Display, (const nsStyleStruct*&)display);
// Set the view's opacity // If part of the view is being clipped out, then mark it transparent
vm->SetViewOpacity(aView, vis->mOpacity); if (clipRect.y > newSize.y
|| clipRect.x > newSize.x
|| clipRect.XMost() < newSize.XMost()
|| clipRect.YMost() < newSize.YMost()) {
viewHasTransparentContent = PR_TRUE;
}
// Set clipping of child views.
nsRegion region;
region.Copy(nsRectFast(clipRect));
vm->SetViewChildClipRegion(aView, &region);
} else {
// Remove clipping of child views.
vm->SetViewChildClipRegion(aView, nsnull);
}
vm->SetViewContentTransparency(aView, viewHasTransparentContent);
}
void
nsContainerFrame::SyncFrameViewAfterSizeChange(nsIPresContext* aPresContext,
nsIFrame* aFrame,
nsIStyleContext* aStyleContext,
nsIView* aView,
PRUint32 aFlags)
{
if (!aView) {
return;
}
nsCOMPtr<nsIStyleContext> savedStyleContext;
if (nsnull == aStyleContext) {
aFrame->GetStyleContext(getter_AddRefs(savedStyleContext));
aStyleContext = savedStyleContext;
}
const nsStyleDisplay* display;
::GetStyleData(aStyleContext, &display);
nsFrameState kidState;
aFrame->GetFrameState(&kidState);
PRBool isBlockLevel = display->IsBlockLevel() || (kidState & NS_FRAME_OUT_OF_FLOW);
PRBool hasClip = display->IsAbsolutelyPositioned() && (display->mClipFlags & NS_STYLE_CLIP_RECT);
PRBool hasOverflowClip = isBlockLevel && (display->mOverflow == NS_STYLE_OVERFLOW_HIDDEN);
if (hasClip || hasOverflowClip) {
SyncFrameViewGeometryDependentProperties(aPresContext, aFrame, aStyleContext, aView, aFlags);
}
}
void
nsContainerFrame::SyncFrameViewProperties(nsIPresContext* aPresContext,
nsIFrame* aFrame,
nsIStyleContext* aStyleContext,
nsIView* aView,
PRUint32 aFlags)
{
if (!aView) {
return;
}
nsCOMPtr<nsIViewManager> vm;
aView->GetViewManager(*getter_AddRefs(vm));
nsCOMPtr<nsIStyleContext> savedStyleContext;
if (nsnull == aStyleContext) {
aFrame->GetStyleContext(getter_AddRefs(savedStyleContext));
aStyleContext = savedStyleContext;
}
const nsStyleVisibility* vis;
::GetStyleData(aStyleContext, &vis);
// Set the view's opacity
vm->SetViewOpacity(aView, vis->mOpacity);
// Make sure visibility is correct
if (0 == (aFlags & NS_FRAME_NO_VISIBILITY)) {
// See if the view should be hidden or visible // See if the view should be hidden or visible
PRBool viewIsVisible = PR_TRUE; PRBool viewIsVisible = PR_TRUE;
PRBool viewHasTransparentContent =
(!hasBG ||
(bg->mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT) ||
!aFrame->CanPaintBackground());
if (isCanvas && viewHasTransparentContent) {
nsIView* rootView;
vm->GetRootView(rootView);
nsIView* rootParent;
rootView->GetParent(rootParent);
if (nsnull == rootParent) {
viewHasTransparentContent = PR_FALSE;
}
}
if (NS_STYLE_VISIBILITY_COLLAPSE == vis->mVisible) { if (NS_STYLE_VISIBILITY_COLLAPSE == vis->mVisible) {
viewIsVisible = PR_FALSE; viewIsVisible = PR_FALSE;
@ -597,147 +786,106 @@ nsContainerFrame::SyncFrameViewAfterReflow(nsIPresContext* aPresContext,
if (frameType == nsLayoutAtoms::scrollFrame || frameType == nsLayoutAtoms::listControlFrame) { if (frameType == nsLayoutAtoms::scrollFrame || frameType == nsLayoutAtoms::listControlFrame) {
viewIsVisible = PR_FALSE; viewIsVisible = PR_FALSE;
} else {
// If we're a container element, then leave the view visible, but
// mark it as having transparent content. The reason we need to
// do this is that child elements can override their parent's
// hidden visibility and be visible anyway
nsIFrame* firstChild;
aFrame->FirstChild(aPresContext, nsnull, &firstChild);
if (firstChild) {
// Not a left frame, so the view needs to be visible, but marked
// as having transparent content
viewHasTransparentContent = PR_TRUE;
} else {
// Leaf frame so go ahead and hide the view
viewIsVisible = PR_FALSE;
}
} }
} }
}
// If the frame has visible content that overflows the content area, then we
// need the view marked as having transparent content
if (NS_STYLE_OVERFLOW_VISIBLE == display->mOverflow) {
if (kidState & NS_FRAME_OUTSIDE_CHILDREN) {
viewHasTransparentContent = PR_TRUE;
}
}
// Make sure visibility is correct
if (0 == (aFlags & NS_FRAME_NO_VISIBILITY)) {
vm->SetViewVisibility(aView, viewIsVisible ? nsViewVisibility_kShow :
nsViewVisibility_kHide);
}
// Make sure z-index is correct
PRInt32 zIndex = 0;
PRInt32 oldZIndex;
PRBool oldAutoZIndex;
PRBool oldTopMost;
PRBool autoZIndex = PR_FALSE;
const nsStylePosition* position;
aView->GetZIndex(oldZIndex, oldAutoZIndex, oldTopMost);
aFrame->GetStyleData(eStyleStruct_Position, (const nsStyleStruct*&)position);
if (position->mZIndex.GetUnit() == eStyleUnit_Integer) {
zIndex = position->mZIndex.GetIntValue();
} else if (position->mZIndex.GetUnit() == eStyleUnit_Auto) {
autoZIndex = PR_TRUE;
}
vm->SetViewZIndex(aView, autoZIndex, zIndex, oldTopMost);
// There are two types of clipping:
// - 'clip' which only applies to absolutely positioned elements, and is
// relative to the element's border edge. 'clip' applies to the entire
// element
// - 'overflow-clip' which only applies to block-level elements and replaced
// elements that have 'overflow' set to 'hidden'. 'overflow-clip' is relative
// to the content area and applies to content only (not border or background).
// Note that out-of-flow frames like floated or absolutely positioned frames
// are block-level, but we can't rely on the 'display' value being set correctly
// in the style context...
PRBool hasClip, hasOverflowClip;
PRBool isBlockLevel = display->IsBlockLevel() || (0 != (kidState & NS_FRAME_OUT_OF_FLOW));
hasClip = display->IsAbsolutelyPositioned() && (display->mClipFlags & NS_STYLE_CLIP_RECT);
hasOverflowClip = isBlockLevel && (display->mOverflow == NS_STYLE_OVERFLOW_HIDDEN);
if (hasClip || hasOverflowClip) {
nsRect clipRect;
if (hasClip) {
// Start with the 'auto' values and then factor in user specified values
clipRect.SetRect(0, 0, frameSize.width, frameSize.height);
if (display->mClipFlags & NS_STYLE_CLIP_RECT) {
if (0 == (NS_STYLE_CLIP_TOP_AUTO & display->mClipFlags)) {
clipRect.y = display->mClip.y;
}
if (0 == (NS_STYLE_CLIP_LEFT_AUTO & display->mClipFlags)) {
clipRect.x = display->mClip.x;
}
if (0 == (NS_STYLE_CLIP_RIGHT_AUTO & display->mClipFlags)) {
clipRect.width = display->mClip.width;
}
if (0 == (NS_STYLE_CLIP_BOTTOM_AUTO & display->mClipFlags)) {
clipRect.height = display->mClip.height;
}
}
}
if (hasOverflowClip) {
const nsStyleBorder* borderStyle;
const nsStylePadding* paddingStyle;
nsMargin border, padding;
aFrame->GetStyleData(eStyleStruct_Border, (const nsStyleStruct*&)borderStyle);
aFrame->GetStyleData(eStyleStruct_Padding, (const nsStyleStruct*&)paddingStyle);
// XXX We don't support the 'overflow-clip' property yet so just use the
// content area (which is the default value) as the clip shape
nsRect overflowClipRect(0, 0, frameSize.width, frameSize.height);
borderStyle->GetBorder(border);
overflowClipRect.Deflate(border);
// XXX We need to handle percentage padding
if (paddingStyle->GetPadding(padding)) {
overflowClipRect.Deflate(padding);
}
if (hasClip) {
// If both 'clip' and 'overflow-clip' apply then use the intersection
// of the two
clipRect.IntersectRect(clipRect, overflowClipRect);
} else {
clipRect = overflowClipRect;
}
}
// If part of the view is being clipped out, then mark it transparent
if (clipRect.y > newSize.y
|| clipRect.x > newSize.x
|| clipRect.XMost() < newSize.XMost()
|| clipRect.YMost() < newSize.YMost()) {
viewHasTransparentContent = PR_TRUE;
}
// Set clipping of child views.
nsRegion region;
region.Copy(clipRect);
vm->SetViewChildClipRegion(aView, &region);
} else { } else {
// Remove clipping of child views. // if the view is for a popup, don't show the view if the popup is closed
vm->SetViewChildClipRegion(aView, nsnull); nsCOMPtr<nsIWidget> widget;
aView->GetWidget(*getter_AddRefs(widget));
if (widget) {
nsWindowType windowType;
widget->GetWindowType(windowType);
if (windowType == eWindowType_popup) {
widget->IsVisible(viewIsVisible);
}
}
} }
// Make sure content transparency is correct vm->SetViewVisibility(aView, viewIsVisible ? nsViewVisibility_kShow :
if (viewIsVisible) { nsViewVisibility_kHide);
vm->SetViewContentTransparency(aView, viewHasTransparentContent); }
const nsStyleDisplay* display;
::GetStyleData(aStyleContext, &display);
// See if the frame is being relatively positioned or absolutely
// positioned
PRBool isTopMostView = display->IsPositioned();
// Make sure z-index is correct
const nsStylePosition* position;
::GetStyleData(aStyleContext, &position);
PRInt32 zIndex = 0;
PRBool autoZIndex = PR_FALSE;
if (position->mZIndex.GetUnit() == eStyleUnit_Integer) {
zIndex = position->mZIndex.GetIntValue();
} else if (position->mZIndex.GetUnit() == eStyleUnit_Auto) {
autoZIndex = PR_TRUE;
}
vm->SetViewZIndex(aView, autoZIndex, zIndex, isTopMostView);
SyncFrameViewGeometryDependentProperties(aPresContext, aFrame, aStyleContext, aView, aFlags);
}
PRBool
nsContainerFrame::FrameNeedsView(nsIPresContext* aPresContext,
nsIFrame* aFrame,
nsIStyleContext* aStyleContext)
{
const nsStyleVisibility* vis;
::GetStyleData(aStyleContext, &vis);
if (vis->mOpacity != 1.0f) {
return PR_TRUE;
}
// See if the frame has a fixed background attachment
const nsStyleBackground *color;
PRBool isCanvas;
PRBool hasBackground =
nsCSSRendering::FindBackground(aPresContext, aFrame, &color, &isCanvas);
if (hasBackground &&
NS_STYLE_BG_ATTACHMENT_FIXED == color->mBackgroundAttachment) {
return PR_TRUE;
}
const nsStyleDisplay* display;
::GetStyleData(aStyleContext, &display);
if (NS_STYLE_POSITION_RELATIVE == display->mPosition) {
return PR_TRUE;
} else if (display->IsAbsolutelyPositioned()) {
return PR_TRUE;
}
nsCOMPtr<nsIAtom> pseudoTag;
aStyleContext->GetPseudoType(*getter_AddRefs(pseudoTag));
if (pseudoTag == nsLayoutAtoms::scrolledContentPseudo) {
return PR_TRUE;
}
// See if the frame is block-level and has 'overflow' set to 'hidden'. If
// so, then we need to give it a view so clipping
// of any child views works correctly. Note that if it's floated it is also
// block-level, but we can't trust that the style context 'display' value is
// set correctly
if ((display->IsBlockLevel() || display->IsFloating()) &&
(display->mOverflow == NS_STYLE_OVERFLOW_HIDDEN)) {
// XXX Check for the frame being a block frame and only force a view
// in that case, because adding a view for box frames seems to cause
// problems for XUL...
nsCOMPtr<nsIAtom> frameType;
aFrame->GetFrameType(getter_AddRefs(frameType));
if ((frameType == nsLayoutAtoms::blockFrame) ||
(frameType == nsLayoutAtoms::areaFrame)) {
return PR_TRUE;
} }
} }
return PR_FALSE;
} }
/** /**

Просмотреть файл

@ -100,14 +100,7 @@ public:
static void PositionFrameView(nsIPresContext* aPresContext, static void PositionFrameView(nsIPresContext* aPresContext,
nsIFrame* aKidFrame); nsIFrame* aKidFrame);
// Sets several view attributes: // Set the view's size and position after its frame has been reflowed.
// - if requested sizes the frame's view based on the current size and origin.
// Takes into account the combined area and (if overflow is visible) whether
// the frame has children that extend outside
// - opacity
// - visibility
// - content transparency
// - clip
// //
// Flags: // Flags:
// NS_FRAME_NO_MOVE_VIEW - don't position the frame's view. Set this if you // NS_FRAME_NO_MOVE_VIEW - don't position the frame's view. Set this if you
@ -119,6 +112,34 @@ public:
const nsRect* aCombinedArea, const nsRect* aCombinedArea,
PRUint32 aFlags = 0); PRUint32 aFlags = 0);
// Sets view attributes from the frame style that depend on the view's size
// (clip, transparency). This needs to be called if you change the size of
// a view and the view's frame could have clipping set on it.
// @param aStyleContext can be null, in which case the frame's style context is used
static void SyncFrameViewAfterSizeChange(nsIPresContext* aPresContext,
nsIFrame* aFrame,
nsIStyleContext* aStyleContext,
nsIView* aView,
PRUint32 aFlags = 0);
// Sets the view's attributes from the frame style.
// - opacity
// - visibility
// - content transparency
// - clip
// Call this when one of these styles changes or when the view has just
// been created.
// @param aStyleContext can be null, in which case the frame's style context is used
static void SyncFrameViewProperties(nsIPresContext* aPresContext,
nsIFrame* aFrame,
nsIStyleContext* aStyleContext,
nsIView* aView,
PRUint32 aFlags = 0);
// Returns PR_TRUE if the frame requires a view
static PRBool FrameNeedsView(nsIPresContext* aPresContext,
nsIFrame* aFrame, nsIStyleContext* aStyleContext);
/** /**
* Invokes the WillReflow() function, positions the frame and its view (if * Invokes the WillReflow() function, positions the frame and its view (if
* requested), and then calls Reflow(). If the reflow succeeds and the child * requested), and then calls Reflow(). If the reflow succeeds and the child

Просмотреть файл

@ -427,21 +427,6 @@ nsHTMLContainerFrame::ReparentFrameViewList(nsIPresContext* aPresContext,
return NS_OK; return NS_OK;
} }
static PRBool
IsContainerContent(nsIFrame* aFrame)
{
nsIContent* content;
PRBool result = PR_FALSE;
aFrame->GetContent(&content);
if (content) {
content->CanContainChildren(result);
NS_RELEASE(content);
}
return result;
}
nsresult nsresult
nsHTMLContainerFrame::CreateViewForFrame(nsIPresContext* aPresContext, nsHTMLContainerFrame::CreateViewForFrame(nsIPresContext* aPresContext,
nsIFrame* aFrame, nsIFrame* aFrame,
@ -449,244 +434,92 @@ nsHTMLContainerFrame::CreateViewForFrame(nsIPresContext* aPresContext,
nsIFrame* aContentParentFrame, nsIFrame* aContentParentFrame,
PRBool aForce) PRBool aForce)
{ {
PRBool isTopMostView = PR_FALSE;
nsIView* view; nsIView* view;
aFrame->GetView(aPresContext, &view); aFrame->GetView(aPresContext, &view);
if (nsnull != view) {
return NS_OK;
}
// If we don't yet have a view, see if we need a view // If we don't yet have a view, see if we need a view
if (nsnull == view) { if (!(aForce || FrameNeedsView(aPresContext, aFrame, aStyleContext))) {
PRBool fixedBackgroundAttachment = PR_FALSE; // don't need a view
return NS_OK;
}
// Get nsStyleColor and nsStyleDisplay // Create a view
const nsStyleDisplay* display = (const nsStyleDisplay*) nsIFrame* parent = nsnull;
aStyleContext->GetStyleData(eStyleStruct_Display); aFrame->GetParentWithView(aPresContext, &parent);
const nsStylePosition* position = (const nsStylePosition*) NS_ASSERTION(parent, "GetParentWithView failed");
aStyleContext->GetStyleData(eStyleStruct_Position);
const nsStyleVisibility* vis = (const nsStyleVisibility*) nsIView* parentView = nsnull;
aStyleContext->GetStyleData(eStyleStruct_Visibility); parent->GetView(aPresContext, &parentView);
NS_ASSERTION(parentView, "no parent with view");
// Create a view
static NS_DEFINE_CID(kViewCID, NS_VIEW_CID);
nsresult result = CallCreateInstance(kViewCID, &view);
if (NS_FAILED(result)) {
return result;
}
if (vis->mOpacity != 1.0f) { nsCOMPtr<nsIViewManager> viewManager;
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, parentView->GetViewManager(*getter_AddRefs(viewManager));
("nsHTMLContainerFrame::CreateViewForFrame: frame=%p opacity=%g", NS_ASSERTION(nsnull != viewManager, "null view manager");
aFrame, vis->mOpacity));
aForce = PR_TRUE;
}
// See if the frame has a fixed background attachment
const nsStyleBackground *color;
PRBool isCanvas;
PRBool hasBackground =
nsCSSRendering::FindBackground(aPresContext, aFrame, &color, &isCanvas);
if (hasBackground &&
NS_STYLE_BG_ATTACHMENT_FIXED == color->mBackgroundAttachment) {
aForce = PR_TRUE;
fixedBackgroundAttachment = PR_TRUE;
}
// See if the frame is being relatively positioned or absolutely // Initialize the view
// positioned nsRect bounds;
if (!aForce) { aFrame->GetRect(bounds);
if (NS_STYLE_POSITION_RELATIVE == display->mPosition) { view->Init(viewManager, bounds, parentView);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS,
("nsHTMLContainerFrame::CreateViewForFrame: frame=%p relatively positioned",
aFrame));
aForce = PR_TRUE;
isTopMostView = PR_TRUE;
} else if (display->IsAbsolutelyPositioned()) {
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS,
("nsHTMLContainerFrame::CreateViewForFrame: frame=%p absolutely positioned",
aFrame));
aForce = PR_TRUE;
isTopMostView = PR_TRUE;
}
}
if (NS_STYLE_POSITION_FIXED == display->mPosition) { SyncFrameViewProperties(aPresContext, aFrame, aStyleContext, view);
isTopMostView = PR_TRUE;
}
// See if the frame is a scrolled frame // Insert the view into the view hierarchy. If the parent view is a
if (!aForce) { // scrolling view we need to do this differently
nsIAtom* pseudoTag; nsIScrollableView* scrollingView;
aStyleContext->GetPseudoType(pseudoTag); if (NS_SUCCEEDED(CallQueryInterface(parentView, &scrollingView))) {
if (pseudoTag == nsLayoutAtoms::scrolledContentPseudo) { scrollingView->SetScrolledView(view);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, } else {
("nsHTMLContainerFrame::CreateViewForFrame: scrolled frame=%p", aFrame)); // XXX Drop it at the end of the document order until we can do better
aForce = PR_TRUE; viewManager->InsertChild(parentView, view, nsnull, PR_TRUE);
}
NS_IF_RELEASE(pseudoTag);
}
// See if the frame is block-level and has 'overflow' set to 'hidden'. If if (nsnull != aContentParentFrame) {
// so and it can have child frames, then we need to give it a view so clipping // If, for some reason, GetView below fails to initialize zParentView,
// of any child views works correctly. Note that if it's floated it is also // then ensure that we completely bypass InsertZPlaceholder below.
// block-level, but we can't trust that the style context 'display' value is // The effect will be as if we never knew about aContentParentFrame
// set correctly // in the first place, so at least this code won't be doing any damage.
if (!aForce) { nsIView* zParentView = parentView;
if ((display->IsBlockLevel() || display->IsFloating()) &&
(display->mOverflow == NS_STYLE_OVERFLOW_HIDDEN)) { aContentParentFrame->GetView(aPresContext, &zParentView);
// The reason for the check of whether it can contain children is just if (nsnull == zParentView) {
// to avoid giving it a view unnecessarily nsIFrame* zParentFrame = nsnull;
if (::IsContainerContent(aFrame)) {
// XXX Check for the frame being a block frame and only force a view
// in that case, because adding a view for box frames seems to cause
// problems for XUL...
nsIAtom* frameType;
aFrame->GetFrameType(&frameType);
if ((frameType == nsLayoutAtoms::blockFrame) ||
(frameType == nsLayoutAtoms::areaFrame)) {
aForce = PR_TRUE;
}
NS_IF_RELEASE(frameType);
}
}
}
if (aForce) {
// Create a view
nsIFrame* parent = nsnull;
nsIView* parentView = nsnull;
aFrame->GetParentWithView(aPresContext, &parent);
NS_ASSERTION(parent, "GetParentWithView failed");
parent->GetView(aPresContext, &parentView);
NS_ASSERTION(parentView, "no parent with view");
// Create a view
static NS_DEFINE_CID(kViewCID, NS_VIEW_CID);
nsresult result = nsComponentManager::CreateInstance(kViewCID,
nsnull,
NS_GET_IID(nsIView),
(void **)&view);
if (NS_OK == result) {
nsIViewManager* viewManager;
parentView->GetViewManager(viewManager);
NS_ASSERTION(nsnull != viewManager, "null view manager");
// Initialize the view
nsRect bounds;
aFrame->GetRect(bounds);
view->Init(viewManager, bounds, parentView);
// If the frame has a fixed background attachment, then indicate that the
// view's contents should be repainted and not bitblt'd
if (fixedBackgroundAttachment) {
viewManager->SetViewBitBltEnabled(view, PR_FALSE);
}
// Insert the view into the view hierarchy. If the parent view is a aContentParentFrame->GetParentWithView(aPresContext, &zParentFrame);
// scrolling view we need to do this differently NS_ASSERTION(zParentFrame, "GetParentWithView failed");
nsIScrollableView* scrollingView; zParentFrame->GetView(aPresContext, &zParentView);
if (NS_SUCCEEDED(parentView->QueryInterface(NS_GET_IID(nsIScrollableView), (void**)&scrollingView))) { NS_ASSERTION(zParentView, "no parent with view");
scrollingView->SetScrolledView(view); }
} else {
PRInt32 zIndex = 0; if (zParentView != parentView) {
PRBool autoZIndex = PR_FALSE; viewManager->InsertZPlaceholder(zParentView, view, nsnull, PR_TRUE);
// Get the z-index to use
if (position->mZIndex.GetUnit() == eStyleUnit_Integer) {
zIndex = position->mZIndex.GetIntValue();
} else if (position->mZIndex.GetUnit() == eStyleUnit_Auto) {
autoZIndex = PR_TRUE;
}
viewManager->SetViewZIndex(view, autoZIndex, zIndex, isTopMostView);
// XXX Drop it at the end of the document order until we can do better
viewManager->InsertChild(parentView, view, nsnull, PR_TRUE);
if (nsnull != aContentParentFrame) {
// If, for some reason, GetView below fails to initialize zParentView,
// then ensure that we completely bypass InsertZPlaceholder below.
// The effect will be as if we never knew about aContentParentFrame
// in the first place, so at least this code won't be doing any damage.
nsIView* zParentView = parentView;
aContentParentFrame->GetView(aPresContext, &zParentView);
if (nsnull == zParentView) {
nsIFrame* zParentFrame = nsnull;
aContentParentFrame->GetParentWithView(aPresContext, &zParentFrame);
NS_ASSERTION(zParentFrame, "GetParentWithView failed");
zParentFrame->GetView(aPresContext, &zParentView);
NS_ASSERTION(zParentView, "no parent with view");
}
if (zParentView != parentView) {
viewManager->InsertZPlaceholder(zParentView, view, nsnull, PR_TRUE);
}
}
}
// See if the view should be hidden
PRBool viewIsVisible = PR_TRUE;
PRBool viewHasTransparentContent =
!isCanvas &&
(!hasBackground ||
(color->mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT));
if (NS_STYLE_VISIBILITY_COLLAPSE == vis->mVisible) {
viewIsVisible = PR_FALSE;
}
else if (NS_STYLE_VISIBILITY_HIDDEN == vis->mVisible) {
// If it has a widget, hide the view because the widget can't deal with it
nsIWidget* widget = nsnull;
view->GetWidget(widget);
if (widget) {
viewIsVisible = PR_FALSE;
NS_RELEASE(widget);
}
else {
// If it's a container element, then leave the view visible, but
// mark it as having transparent content. The reason we need to
// do this is that child elements can override their parent's
// hidden visibility and be visible anyway.
//
// Because this function is called before processing the content
// object's child elements, we can't tell if it's a leaf by looking
// at whether the frame has any child frames
if (::IsContainerContent(aFrame)) {
// The view needs to be visible, but marked as having transparent
// content
viewHasTransparentContent = PR_TRUE;
} else {
// Go ahead and hide the view
viewIsVisible = PR_FALSE;
}
}
}
if (viewIsVisible) {
if (viewHasTransparentContent) {
viewManager->SetViewContentTransparency(view, PR_TRUE);
}
} else {
viewManager->SetViewVisibility(view, nsViewVisibility_kHide);
}
// XXX If it's fixed positioned, then create a widget so it floats
// above the scrolling area
if (NS_STYLE_POSITION_FIXED == display->mPosition) {
view->CreateWidget(kCChildCID);
}
viewManager->SetViewOpacity(view, vis->mOpacity);
NS_RELEASE(viewManager);
} }
// Remember our view
aFrame->SetView(aPresContext, view);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS,
("nsHTMLContainerFrame::CreateViewForFrame: frame=%p view=%p",
aFrame));
return result;
} }
} }
// XXX If it's fixed positioned, then create a widget so it floats
// above the scrolling area
const nsStyleDisplay* display;
::GetStyleData(aStyleContext, &display);
if (NS_STYLE_POSITION_FIXED == display->mPosition) {
view->CreateWidget(kCChildCID);
}
// Remember our view
aFrame->SetView(aPresContext, view);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS,
("nsHTMLContainerFrame::CreateViewForFrame: frame=%p view=%p",
aFrame));
return NS_OK; return NS_OK;
} }

Просмотреть файл

@ -419,45 +419,17 @@ nsScrollFrame::CreateScrollingView(nsIPresContext* aPresContext)
nsresult rv = CallCreateInstance(kScrollingViewCID, &view); nsresult rv = CallCreateInstance(kScrollingViewCID, &view);
if (NS_OK == rv) { if (NS_OK == rv) {
const nsStylePosition* position = (const nsStylePosition*)
mStyleContext->GetStyleData(eStyleStruct_Position);
const nsStyleBorder* borderStyle = (const nsStyleBorder*)
mStyleContext->GetStyleData(eStyleStruct_Border);
const nsStyleDisplay* display = (const nsStyleDisplay*)
mStyleContext->GetStyleData(eStyleStruct_Display);
const nsStyleVisibility* vis =
(const nsStyleVisibility*)mStyleContext->GetStyleData(eStyleStruct_Visibility);
// Get the z-index
PRInt32 zIndex = 0;
PRBool autoZIndex = PR_FALSE;
if (eStyleUnit_Integer == position->mZIndex.GetUnit()) {
zIndex = position->mZIndex.GetIntValue();
} else if (position->mZIndex.GetUnit() == eStyleUnit_Auto) {
autoZIndex = PR_TRUE;
}
// Initialize the scrolling view // Initialize the scrolling view
view->Init(viewManager, mRect, parentView, view->Init(viewManager, mRect, parentView);
vis->IsVisible() ?
nsViewVisibility_kShow :
nsViewVisibility_kHide);
// Initialize the view's z-index SyncFrameViewProperties(aPresContext, this, mStyleContext, view);
viewManager->SetViewZIndex(view, autoZIndex, zIndex);
// Insert the view into the view hierarchy // Insert the view into the view hierarchy
// XXX Put it last in document order, until we can do better // XXX Put it last in document order, until we can do better
viewManager->InsertChild(parentView, view, nsnull, PR_TRUE); viewManager->InsertChild(parentView, view, nsnull, PR_TRUE);
// Set the view's opacity const nsStyleDisplay* display;
viewManager->SetViewOpacity(view, vis->mOpacity); ::GetStyleData(mStyleContext, &display);
// Because we only paint the border and we don't paint a background,
// inform the view manager that we have transparent content
viewManager->SetViewContentTransparency(view, PR_TRUE);
// If it's fixed positioned, then create a widget too // If it's fixed positioned, then create a widget too
CreateScrollingViewWidget(view, display); CreateScrollingViewWidget(view, display);
@ -520,6 +492,8 @@ nsScrollFrame::CreateScrollingView(nsIPresContext* aPresContext)
} }
scrollingView->SetScrollPreference(scrollPref); scrollingView->SetScrollPreference(scrollPref);
const nsStyleBorder* borderStyle;
::GetStyleData(mStyleContext, &borderStyle);
// Set the scrolling view's insets to whatever our border is // Set the scrolling view's insets to whatever our border is
nsMargin border; nsMargin border;
if (!borderStyle->GetBorder(border)) { if (!borderStyle->GetBorder(border)) {

Просмотреть файл

@ -103,6 +103,8 @@ public:
nsFramePaintLayer aWhichLayer, nsFramePaintLayer aWhichLayer,
PRUint32 aFlags = 0); PRUint32 aFlags = 0);
virtual PRBool CanPaintBackground() { return PR_FALSE; }
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext, NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
const nsPoint& aPoint, const nsPoint& aPoint,
nsFramePaintLayer aWhichLayer, nsFramePaintLayer aWhichLayer,

Просмотреть файл

@ -60,6 +60,7 @@
#include "nsGUIEvent.h" #include "nsGUIEvent.h"
#include "nsLayoutAtoms.h" #include "nsLayoutAtoms.h"
#include "nsIServiceManager.h" #include "nsIServiceManager.h"
#include "nsContainerFrame.h"
#ifdef ACCESSIBILITY #ifdef ACCESSIBILITY
#include "nsIAccessibilityService.h" #include "nsIAccessibilityService.h"
#endif #endif
@ -283,14 +284,15 @@ nsImageControlFrame::Init(nsIPresContext* aPresContext,
// the view's size is not know yet, but its size will be kept in synch with our frame. // the view's size is not know yet, but its size will be kept in synch with our frame.
nsRect boundBox(0, 0, 0, 0); nsRect boundBox(0, 0, 0, 0);
result = view->Init(viewMan, boundBox, parView); result = view->Init(viewMan, boundBox, parView);
viewMan->SetViewContentTransparency(view, PR_TRUE);
nsContainerFrame::SyncFrameViewProperties(aPresContext, this, aContext, view);
// this gets reset during reflow anyway
// viewMan->SetViewContentTransparency(view, PR_TRUE);
// XXX put the view last in document order until we know how to do better // XXX put the view last in document order until we know how to do better
viewMan->InsertChild(parView, view, nsnull, PR_TRUE); viewMan->InsertChild(parView, view, nsnull, PR_TRUE);
SetView(aPresContext, view); SetView(aPresContext, view);
const nsStyleVisibility* vis = (const nsStyleVisibility*) mStyleContext->GetStyleData(eStyleStruct_Visibility);
// set the opacity
viewMan->SetViewOpacity(view, vis->mOpacity);
} }
return rv; return rv;

Просмотреть файл

@ -9930,111 +9930,13 @@ static PRBool gInApplyRenderingChangeToTree = PR_FALSE;
static void static void
DoApplyRenderingChangeToTree(nsIPresContext* aPresContext, DoApplyRenderingChangeToTree(nsIPresContext* aPresContext,
nsIFrame* aFrame, nsIFrame* aFrame,
nsIViewManager* aViewManager); nsIViewManager* aViewManager,
nsChangeHint aChange);
static void
SyncAndInvalidateView(nsIPresContext* aPresContext,
nsIView* aView,
nsIFrame* aFrame,
nsIViewManager* aViewManager)
{
NS_PRECONDITION(gInApplyRenderingChangeToTree,
"should only be called within ApplyRenderingChangeToTree");
const nsStyleBackground* bg;
const nsStyleDisplay* disp;
const nsStyleVisibility* vis;
PRBool isCanvas;
PRBool hasBG =
nsCSSRendering::FindBackground(aPresContext, aFrame, &bg, &isCanvas);
aFrame->GetStyleData(eStyleStruct_Display, (const nsStyleStruct*&) disp);
aFrame->GetStyleData(eStyleStruct_Visibility, (const nsStyleStruct*&) vis);
aViewManager->SetViewOpacity(aView, vis->mOpacity);
// See if the view should be hidden or visible
PRBool viewIsVisible = PR_TRUE;
PRBool viewHasTransparentContent =
!isCanvas &&
(!hasBG ||
(bg->mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT));
if (NS_STYLE_VISIBILITY_COLLAPSE == vis->mVisible) {
viewIsVisible = PR_FALSE;
}
else if (NS_STYLE_VISIBILITY_HIDDEN == vis->mVisible) {
// If it has a widget, hide the view because the widget can't deal with it
nsIWidget* widget = nsnull;
aView->GetWidget(widget);
if (widget) {
viewIsVisible = PR_FALSE;
NS_RELEASE(widget);
}
else {
// If it's a scroll frame, then hide the view. This means that
// child elements can't override their parent's visibility, but
// it's not practical to leave it visible in all cases because
// the scrollbars will be showing
nsIAtom* frameType;
aFrame->GetFrameType(&frameType);
if (frameType == nsLayoutAtoms::scrollFrame) {
viewIsVisible = PR_FALSE;
} else {
// If it's a container element, then leave the view visible, but
// mark it as having transparent content. The reason we need to
// do this is that child elements can override their parent's
// hidden visibility and be visible anyway
nsIFrame* firstChild;
aFrame->FirstChild(aPresContext, nsnull, &firstChild);
if (firstChild) {
// It's not a left frame, so the view needs to be visible, but
// marked as having transparent content
viewHasTransparentContent = PR_TRUE;
} else {
// It's a leaf frame so go ahead and hide the view
viewIsVisible = PR_FALSE;
}
}
NS_IF_RELEASE(frameType);
}
} else {
// if the view is for a popup, don't show the view if the popup is closed
nsCOMPtr<nsIWidget> widget;
aView->GetWidget(*getter_AddRefs(widget));
if (widget) {
nsWindowType windowType;
widget->GetWindowType(windowType);
if (windowType == eWindowType_popup)
widget->IsVisible(viewIsVisible);
}
}
// If the frame has visible content that overflows the content area, then we
// need the view marked as having transparent content
if (NS_STYLE_OVERFLOW_VISIBLE == disp->mOverflow) {
nsFrameState frameState;
aFrame->GetFrameState(&frameState);
if (frameState & NS_FRAME_OUTSIDE_CHILDREN) {
viewHasTransparentContent = PR_TRUE;
}
}
if (viewIsVisible) {
aViewManager->SetViewContentTransparency(aView, viewHasTransparentContent);
aViewManager->SetViewVisibility(aView, nsViewVisibility_kShow);
aViewManager->UpdateView(aView, NS_VMREFRESH_NO_SYNC);
}
else {
aViewManager->SetViewVisibility(aView, nsViewVisibility_kHide);
}
}
static void static void
UpdateViewsForTree(nsIPresContext* aPresContext, nsIFrame* aFrame, UpdateViewsForTree(nsIPresContext* aPresContext, nsIFrame* aFrame,
nsIViewManager* aViewManager, nsRect& aBoundsRect) nsIViewManager* aViewManager, nsRect& aBoundsRect,
nsChangeHint aChange)
{ {
NS_PRECONDITION(gInApplyRenderingChangeToTree, NS_PRECONDITION(gInApplyRenderingChangeToTree,
"should only be called within ApplyRenderingChangeToTree"); "should only be called within ApplyRenderingChangeToTree");
@ -10043,7 +9945,12 @@ UpdateViewsForTree(nsIPresContext* aPresContext, nsIFrame* aFrame,
aFrame->GetView(aPresContext, &view); aFrame->GetView(aPresContext, &view);
if (view) { if (view) {
SyncAndInvalidateView(aPresContext, view, aFrame, aViewManager); if (aChange & nsChangeHint_RepaintFrame) {
aViewManager->UpdateView(view, NS_VMREFRESH_NO_SYNC);
}
if (aChange & nsChangeHint_SyncFrameView) {
nsContainerFrame::SyncFrameViewProperties(aPresContext, aFrame, nsnull, view);
}
} }
nsRect bounds; nsRect bounds;
@ -10071,11 +9978,11 @@ UpdateViewsForTree(nsIPresContext* aPresContext, nsIFrame* aFrame,
nsIFrame* outOfFlowFrame = ((nsPlaceholderFrame*)child)->GetOutOfFlowFrame(); nsIFrame* outOfFlowFrame = ((nsPlaceholderFrame*)child)->GetOutOfFlowFrame();
NS_ASSERTION(outOfFlowFrame, "no out-of-flow frame"); NS_ASSERTION(outOfFlowFrame, "no out-of-flow frame");
DoApplyRenderingChangeToTree(aPresContext, outOfFlowFrame, aViewManager); DoApplyRenderingChangeToTree(aPresContext, outOfFlowFrame, aViewManager, aChange);
} }
else { // regular frame else { // regular frame
nsRect childBounds; nsRect childBounds;
UpdateViewsForTree(aPresContext, child, aViewManager, childBounds); UpdateViewsForTree(aPresContext, child, aViewManager, childBounds, aChange);
bounds.UnionRect(bounds, childBounds); bounds.UnionRect(bounds, childBounds);
} }
NS_IF_RELEASE(frameType); NS_IF_RELEASE(frameType);
@ -10093,7 +10000,8 @@ UpdateViewsForTree(nsIPresContext* aPresContext, nsIFrame* aFrame,
static void static void
DoApplyRenderingChangeToTree(nsIPresContext* aPresContext, DoApplyRenderingChangeToTree(nsIPresContext* aPresContext,
nsIFrame* aFrame, nsIFrame* aFrame,
nsIViewManager* aViewManager) nsIViewManager* aViewManager,
nsChangeHint aChange)
{ {
NS_PRECONDITION(gInApplyRenderingChangeToTree, NS_PRECONDITION(gInApplyRenderingChangeToTree,
"should only be called within ApplyRenderingChangeToTree"); "should only be called within ApplyRenderingChangeToTree");
@ -10114,9 +10022,9 @@ DoApplyRenderingChangeToTree(nsIPresContext* aPresContext,
aFrame->GetOffsetFromView(aPresContext, viewOffset, &parentView); aFrame->GetOffsetFromView(aPresContext, viewOffset, &parentView);
NS_ASSERTION(nsnull != parentView, "no view"); NS_ASSERTION(nsnull != parentView, "no view");
} }
UpdateViewsForTree(aPresContext, aFrame, aViewManager, invalidRect); UpdateViewsForTree(aPresContext, aFrame, aViewManager, invalidRect, aChange);
if (! view) { // if frame has view, will already be invalidated if (! view && (aChange & nsChangeHint_RepaintFrame)) { // if frame has view, will already be invalidated
// XXX Instead of calling this we should really be calling // XXX Instead of calling this we should really be calling
// Invalidate on on the nsFrame (which does this) // Invalidate on on the nsFrame (which does this)
const nsStyleOutline* outline; const nsStyleOutline* outline;
@ -10138,14 +10046,20 @@ DoApplyRenderingChangeToTree(nsIPresContext* aPresContext,
static void static void
ApplyRenderingChangeToTree(nsIPresContext* aPresContext, ApplyRenderingChangeToTree(nsIPresContext* aPresContext,
nsIFrame* aFrame, nsIFrame* aFrame,
nsIViewManager* aViewManager) nsIViewManager* aViewManager,
nsChangeHint aChange)
{ {
nsCOMPtr<nsIPresShell> shell; nsCOMPtr<nsIPresShell> shell;
aPresContext->GetShell(getter_AddRefs(shell)); aPresContext->GetShell(getter_AddRefs(shell));
PRBool isPaintingSuppressed = PR_FALSE; PRBool isPaintingSuppressed = PR_FALSE;
shell->IsPaintingSuppressed(&isPaintingSuppressed); shell->IsPaintingSuppressed(&isPaintingSuppressed);
if (isPaintingSuppressed) if (isPaintingSuppressed) {
return; // Don't allow synchronous rendering changes when painting is turned off. // Don't allow synchronous rendering changes when painting is turned off.
aChange = NS_SubtractHint(aChange, nsChangeHint_RepaintFrame);
if (!aChange) {
return;
}
}
// If the frame's background is propagated to an ancestor, walk up to // If the frame's background is propagated to an ancestor, walk up to
// that ancestor. // that ancestor.
@ -10179,7 +10093,7 @@ ApplyRenderingChangeToTree(nsIPresContext* aPresContext,
#ifdef DEBUG #ifdef DEBUG
gInApplyRenderingChangeToTree = PR_TRUE; gInApplyRenderingChangeToTree = PR_TRUE;
#endif #endif
DoApplyRenderingChangeToTree(aPresContext, aFrame, viewManager); DoApplyRenderingChangeToTree(aPresContext, aFrame, viewManager, aChange);
#ifdef DEBUG #ifdef DEBUG
gInApplyRenderingChangeToTree = PR_FALSE; gInApplyRenderingChangeToTree = PR_FALSE;
#endif #endif
@ -10250,7 +10164,7 @@ nsCSSFrameConstructor::StyleChangeReflow(nsIPresContext* aPresContext,
// This isn't the most efficient way to do it, but it saves code // This isn't the most efficient way to do it, but it saves code
// size and doesn't add much cost compared to the reflow.. // size and doesn't add much cost compared to the reflow..
if (ancestor != aFrame) if (ancestor != aFrame)
ApplyRenderingChangeToTree(aPresContext, ancestor, nsnull); ApplyRenderingChangeToTree(aPresContext, ancestor, nsnull, nsChangeHint_RepaintFrame);
return NS_OK; return NS_OK;
} }
@ -10349,11 +10263,8 @@ nsCSSFrameConstructor::ProcessRestyledFrames(nsStyleChangeList& aChangeList,
if (hint & nsChangeHint_ReflowFrame) { if (hint & nsChangeHint_ReflowFrame) {
StyleChangeReflow(aPresContext, frame, nsnull); StyleChangeReflow(aPresContext, frame, nsnull);
} }
if (hint & nsChangeHint_RepaintFrame) { if (hint & (nsChangeHint_RepaintFrame | nsChangeHint_SyncFrameView)) {
ApplyRenderingChangeToTree(aPresContext, frame, nsnull); ApplyRenderingChangeToTree(aPresContext, frame, nsnull, hint);
}
if (hint & nsChangeHint_SyncFrameView) {
// TBD: split out view sync from ApplyRenderingChange and friends
} }
} }
} }
@ -10463,7 +10374,7 @@ nsCSSFrameConstructor::ContentStatesChanged(nsIPresContext* aPresContext,
if (theme && theme->ThemeSupportsWidget(aPresContext, primaryFrame1, app1)) if (theme && theme->ThemeSupportsWidget(aPresContext, primaryFrame1, app1))
theme->WidgetStateChanged(primaryFrame1, app1, nsnull, &repaint); theme->WidgetStateChanged(primaryFrame1, app1, nsnull, &repaint);
if (repaint) if (repaint)
ApplyRenderingChangeToTree(aPresContext, primaryFrame1, nsnull); ApplyRenderingChangeToTree(aPresContext, primaryFrame1, nsnull, nsChangeHint_RepaintFrame);
} }
if (!(frameChange1 & nsChangeHint_ReconstructDoc) && (primaryFrame2)) { if (!(frameChange1 & nsChangeHint_ReconstructDoc) && (primaryFrame2)) {
@ -10477,7 +10388,7 @@ nsCSSFrameConstructor::ContentStatesChanged(nsIPresContext* aPresContext,
if (theme && theme->ThemeSupportsWidget(aPresContext, primaryFrame2, app2)) if (theme && theme->ThemeSupportsWidget(aPresContext, primaryFrame2, app2))
theme->WidgetStateChanged(primaryFrame2, app2, nsnull, &repaint); theme->WidgetStateChanged(primaryFrame2, app2, nsnull, &repaint);
if (repaint) if (repaint)
ApplyRenderingChangeToTree(aPresContext, primaryFrame2, nsnull); ApplyRenderingChangeToTree(aPresContext, primaryFrame2, nsnull, nsChangeHint_RepaintFrame);
} }
} }
@ -10523,7 +10434,7 @@ nsCSSFrameConstructor::ContentStatesChanged(nsIPresContext* aPresContext,
if (theme) if (theme)
theme->WidgetStateChanged(primaryFrame2, app2, nsnull, &repaint); theme->WidgetStateChanged(primaryFrame2, app2, nsnull, &repaint);
if (repaint) if (repaint)
ApplyRenderingChangeToTree(aPresContext, primaryFrame2, nsnull); ApplyRenderingChangeToTree(aPresContext, primaryFrame2, nsnull, nsChangeHint_RepaintFrame);
} }
// max change needed for top level frames // max change needed for top level frames
@ -10701,7 +10612,7 @@ nsCSSFrameConstructor::AttributeChanged(nsIPresContext* aPresContext,
PRBool repaint = PR_FALSE; PRBool repaint = PR_FALSE;
theme->WidgetStateChanged(primaryFrame, disp->mAppearance, aAttribute, &repaint); theme->WidgetStateChanged(primaryFrame, disp->mAppearance, aAttribute, &repaint);
if (repaint) if (repaint)
ApplyRenderingChangeToTree(aPresContext, primaryFrame, nsnull); ApplyRenderingChangeToTree(aPresContext, primaryFrame, nsnull, nsChangeHint_RepaintFrame);
} }
} }
} }
@ -10791,11 +10702,6 @@ nsCSSFrameConstructor::StyleRuleChanged(nsIPresContext* aPresContext,
PRBool reframe = (aHint & (nsChangeHint_ReconstructDoc | nsChangeHint_ReconstructFrame PRBool reframe = (aHint & (nsChangeHint_ReconstructDoc | nsChangeHint_ReconstructFrame
| nsChangeHint_Unknown)) != 0; | nsChangeHint_Unknown)) != 0;
PRBool reflow = (aHint & (nsChangeHint_ReconstructDoc | nsChangeHint_ReconstructFrame
| nsChangeHint_ReflowFrame | nsChangeHint_Unknown)) != 0;
PRBool render = (aHint & (nsChangeHint_ReconstructDoc | nsChangeHint_ReconstructFrame
| nsChangeHint_ReflowFrame | nsChangeHint_RepaintFrame
| nsChangeHint_Unknown)) != 0;
PRBool restyle = (aHint & ~(nsChangeHint_AttrChange)) != 0; PRBool restyle = (aHint & ~(nsChangeHint_AttrChange)) != 0;
// TBD: add "review" to update view? // TBD: add "review" to update view?
@ -10809,14 +10715,20 @@ nsCSSFrameConstructor::StyleRuleChanged(nsIPresContext* aPresContext,
result = ReconstructDocElementHierarchy(aPresContext); result = ReconstructDocElementHierarchy(aPresContext);
} }
else { else {
PRBool reflow = (aHint & (nsChangeHint_ReconstructDoc | nsChangeHint_ReconstructFrame
| nsChangeHint_ReflowFrame | nsChangeHint_Unknown)) != 0;
PRBool renderOrSync = (aHint & (nsChangeHint_ReconstructDoc | nsChangeHint_ReconstructFrame
| nsChangeHint_ReflowFrame | nsChangeHint_RepaintFrame
| nsChangeHint_Unknown | nsChangeHint_SyncFrameView)) != 0;
// XXX hack, skip the root and scrolling frames // XXX hack, skip the root and scrolling frames
frame->FirstChild(aPresContext, nsnull, &frame); frame->FirstChild(aPresContext, nsnull, &frame);
frame->FirstChild(aPresContext, nsnull, &frame); frame->FirstChild(aPresContext, nsnull, &frame);
if (reflow) { if (reflow) {
StyleChangeReflow(aPresContext, frame, nsnull); StyleChangeReflow(aPresContext, frame, nsnull);
} }
else if (render) { if (renderOrSync) {
ApplyRenderingChangeToTree(aPresContext, frame, nsnull); ApplyRenderingChangeToTree(aPresContext, frame, nsnull, aHint);
} }
} }

Просмотреть файл

@ -95,203 +95,203 @@
// support them correctly the old constants need to be renamed and // support them correctly the old constants need to be renamed and
// new ones should be entered. // new ones should be entered.
CSS_PROP(-moz-appearance, appearance, MozAppearance, REFLOW) CSS_PROP(-moz-appearance, appearance, MozAppearance, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-border-radius, _moz_border_radius, MozBorderRadius, VISUAL) CSS_PROP(-moz-border-radius, _moz_border_radius, MozBorderRadius, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-radius-topleft, _moz_border_radius_topLeft, MozBorderRadiusTopleft, VISUAL) CSS_PROP(-moz-border-radius-topleft, _moz_border_radius_topLeft, MozBorderRadiusTopleft, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-radius-topright, _moz_border_radius_topRight, MozBorderRadiusTopright, VISUAL) CSS_PROP(-moz-border-radius-topright, _moz_border_radius_topRight, MozBorderRadiusTopright, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-radius-bottomleft, _moz_border_radius_bottomLeft, MozBorderRadiusBottomleft, VISUAL) CSS_PROP(-moz-border-radius-bottomleft, _moz_border_radius_bottomLeft, MozBorderRadiusBottomleft, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-radius-bottomright, _moz_border_radius_bottomRight, MozBorderRadiusBottomright, VISUAL) CSS_PROP(-moz-border-radius-bottomright, _moz_border_radius_bottomRight, MozBorderRadiusBottomright, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-outline-radius, _moz_outline_radius, MozOutlineRadius, VISUAL) CSS_PROP(-moz-outline-radius, _moz_outline_radius, MozOutlineRadius, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-outline-radius-topleft, _moz_outline_radius_topLeft, MozOutlineRadiusTopleft, VISUAL) CSS_PROP(-moz-outline-radius-topleft, _moz_outline_radius_topLeft, MozOutlineRadiusTopleft, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-outline-radius-topright, _moz_outline_radius_topRight, MozOutlineRadiusTopright, VISUAL) CSS_PROP(-moz-outline-radius-topright, _moz_outline_radius_topRight, MozOutlineRadiusTopright, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-outline-radius-bottomleft, _moz_outline_radius_bottomLeft, MozOutlineRadiusBottomleft, VISUAL) CSS_PROP(-moz-outline-radius-bottomleft, _moz_outline_radius_bottomLeft, MozOutlineRadiusBottomleft, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-outline-radius-bottomright, _moz_outline_radius_bottomRight, MozOutlineRadiusBottomright, VISUAL) CSS_PROP(-moz-outline-radius-bottomright, _moz_outline_radius_bottomRight, MozOutlineRadiusBottomright, NS_STYLE_HINT_VISUAL)
CSS_PROP(azimuth, azimuth, Azimuth, AURAL) CSS_PROP(azimuth, azimuth, Azimuth, NS_STYLE_HINT_AURAL)
CSS_PROP(background, background, Background, VISUAL) CSS_PROP(background, background, Background, NS_STYLE_HINT_VISUAL)
CSS_PROP(background-attachment, background_attachment, BackgroundAttachment, FRAMECHANGE) CSS_PROP(background-attachment, background_attachment, BackgroundAttachment, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(background-color, background_color, BackgroundColor, VISUAL) CSS_PROP(background-color, background_color, BackgroundColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(background-image, background_image, BackgroundImage, VISUAL) CSS_PROP(background-image, background_image, BackgroundImage, NS_STYLE_HINT_VISUAL)
CSS_PROP(background-position, background_position, BackgroundPosition, VISUAL) CSS_PROP(background-position, background_position, BackgroundPosition, NS_STYLE_HINT_VISUAL)
CSS_PROP(background-repeat, background_repeat, BackgroundRepeat, VISUAL) CSS_PROP(background-repeat, background_repeat, BackgroundRepeat, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(-x-background-x-position, background_x_position, BackgroundXPosition, VISUAL) // XXX bug 3935 CSS_PROP_INTERNAL(-x-background-x-position, background_x_position, BackgroundXPosition, NS_STYLE_HINT_VISUAL) // XXX bug 3935
CSS_PROP_INTERNAL(-x-background-y-position, background_y_position, BackgroundYPosition, VISUAL) // XXX bug 3935 CSS_PROP_INTERNAL(-x-background-y-position, background_y_position, BackgroundYPosition, NS_STYLE_HINT_VISUAL) // XXX bug 3935
CSS_PROP(-moz-binding, binding, MozBinding, FRAMECHANGE) // XXX bug 3935 CSS_PROP(-moz-binding, binding, MozBinding, NS_STYLE_HINT_FRAMECHANGE) // XXX bug 3935
CSS_PROP(border, border, Border, REFLOW) CSS_PROP(border, border, Border, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-bottom, border_bottom, BorderBottom, REFLOW) CSS_PROP(border-bottom, border_bottom, BorderBottom, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-bottom-color, border_bottom_color, BorderBottomColor, VISUAL) CSS_PROP(border-bottom-color, border_bottom_color, BorderBottomColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-bottom-colors, border_bottom_colors, MozBorderBottomColors, VISUAL) CSS_PROP(-moz-border-bottom-colors, border_bottom_colors, MozBorderBottomColors, NS_STYLE_HINT_VISUAL)
CSS_PROP(border-bottom-style, border_bottom_style, BorderBottomStyle, REFLOW) // on/off will need reflow CSS_PROP(border-bottom-style, border_bottom_style, BorderBottomStyle, NS_STYLE_HINT_REFLOW) // on/off will need reflow
CSS_PROP(border-bottom-width, border_bottom_width, BorderBottomWidth, REFLOW) CSS_PROP(border-bottom-width, border_bottom_width, BorderBottomWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-collapse, border_collapse, BorderCollapse, FRAMECHANGE) CSS_PROP(border-collapse, border_collapse, BorderCollapse, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(border-color, border_color, BorderColor, VISUAL) CSS_PROP(border-color, border_color, BorderColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(border-left, border_left, BorderLeft, REFLOW) CSS_PROP(border-left, border_left, BorderLeft, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-left-color, border_left_color, BorderLeftColor, VISUAL) CSS_PROP(border-left-color, border_left_color, BorderLeftColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-left-colors, border_left_colors, MozBorderLeftColors, VISUAL) CSS_PROP(-moz-border-left-colors, border_left_colors, MozBorderLeftColors, NS_STYLE_HINT_VISUAL)
CSS_PROP(border-left-style, border_left_style, BorderLeftStyle, REFLOW) // on/off will need reflow CSS_PROP(border-left-style, border_left_style, BorderLeftStyle, NS_STYLE_HINT_REFLOW) // on/off will need reflow
CSS_PROP(border-left-width, border_left_width, BorderLeftWidth, REFLOW) CSS_PROP(border-left-width, border_left_width, BorderLeftWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-right, border_right, BorderRight, REFLOW) CSS_PROP(border-right, border_right, BorderRight, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-right-color, border_right_color, BorderRightColor, VISUAL) CSS_PROP(border-right-color, border_right_color, BorderRightColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-right-colors, border_right_colors, MozBorderRightColors, VISUAL) CSS_PROP(-moz-border-right-colors, border_right_colors, MozBorderRightColors, NS_STYLE_HINT_VISUAL)
CSS_PROP(border-right-style, border_right_style, BorderRightStyle, REFLOW) // on/off will need reflow CSS_PROP(border-right-style, border_right_style, BorderRightStyle, NS_STYLE_HINT_REFLOW) // on/off will need reflow
CSS_PROP(border-right-width, border_right_width, BorderRightWidth, REFLOW) CSS_PROP(border-right-width, border_right_width, BorderRightWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-spacing, border_spacing, BorderSpacing, REFLOW) CSS_PROP(border-spacing, border_spacing, BorderSpacing, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-style, border_style, BorderStyle, REFLOW) // on/off will need reflow CSS_PROP(border-style, border_style, BorderStyle, NS_STYLE_HINT_REFLOW) // on/off will need reflow
CSS_PROP(border-top, border_top, BorderTop, REFLOW) CSS_PROP(border-top, border_top, BorderTop, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-top-color, border_top_color, BorderTopColor, VISUAL) CSS_PROP(border-top-color, border_top_color, BorderTopColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-border-top-colors, border_top_colors, MozBorderTopColors, VISUAL) CSS_PROP(-moz-border-top-colors, border_top_colors, MozBorderTopColors, NS_STYLE_HINT_VISUAL)
CSS_PROP(border-top-style, border_top_style, BorderTopStyle, REFLOW) // on/off will need reflow CSS_PROP(border-top-style, border_top_style, BorderTopStyle, NS_STYLE_HINT_REFLOW) // on/off will need reflow
CSS_PROP(border-top-width, border_top_width, BorderTopWidth, REFLOW) CSS_PROP(border-top-width, border_top_width, BorderTopWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP(border-width, border_width, BorderWidth, REFLOW) CSS_PROP(border-width, border_width, BorderWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-border-x-spacing, border_x_spacing, BorderXSpacing, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-border-x-spacing, border_x_spacing, BorderXSpacing, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP_INTERNAL(-x-border-y-spacing, border_y_spacing, BorderYSpacing, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-border-y-spacing, border_y_spacing, BorderYSpacing, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(bottom, bottom, Bottom, REFLOW) CSS_PROP(bottom, bottom, Bottom, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-box-align, box_align, MozBoxAlign, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-align, box_align, MozBoxAlign, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-direction, box_direction, MozBoxDirection, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-direction, box_direction, MozBoxDirection, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-flex, box_flex, MozBoxFlex, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-flex, box_flex, MozBoxFlex, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-flex-group, box_flex_group, MozBoxFlexGroup, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-flex-group, box_flex_group, MozBoxFlexGroup, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-orient, box_orient, MozBoxOrient, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-orient, box_orient, MozBoxOrient, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-pack, box_pack, MozBoxPack, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-pack, box_pack, MozBoxPack, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-sizing, box_sizing, MozBoxSizing, REFLOW) // XXX bug 3935 CSS_PROP(-moz-box-sizing, box_sizing, MozBoxSizing, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-box-ordinal-group, box_ordinal_group, MozBoxOrdinalGroup, FRAMECHANGE) CSS_PROP(-moz-box-ordinal-group, box_ordinal_group, MozBoxOrdinalGroup, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(caption-side, caption_side, CaptionSide, REFLOW) CSS_PROP(caption-side, caption_side, CaptionSide, NS_STYLE_HINT_REFLOW)
CSS_PROP(clear, clear, Clear, REFLOW) CSS_PROP(clear, clear, Clear, NS_STYLE_HINT_REFLOW)
CSS_PROP(clip, clip, Clip, REFLOW) CSS_PROP(clip, clip, Clip, nsChangeHint_SyncFrameView)
CSS_PROP_INTERNAL(-x-clip-bottom, clip_bottom, ClipBottom, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-clip-bottom, clip_bottom, ClipBottom, nsChangeHint_SyncFrameView) // XXX bug 3935
CSS_PROP_INTERNAL(-x-clip-left, clip_left, ClipLeft, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-clip-left, clip_left, ClipLeft, nsChangeHint_SyncFrameView) // XXX bug 3935
CSS_PROP_INTERNAL(-x-clip-right, clip_right, ClipRight, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-clip-right, clip_right, ClipRight, nsChangeHint_SyncFrameView) // XXX bug 3935
CSS_PROP_INTERNAL(-x-clip-top, clip_top, ClipTop, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-clip-top, clip_top, ClipTop, nsChangeHint_SyncFrameView) // XXX bug 3935
CSS_PROP(color, color, Color, VISUAL) CSS_PROP(color, color, Color, NS_STYLE_HINT_VISUAL)
CSS_PROP(content, content, Content, FRAMECHANGE) CSS_PROP(content, content, Content, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(counter-increment, counter_increment, CounterIncrement, REFLOW) CSS_PROP(counter-increment, counter_increment, CounterIncrement, NS_STYLE_HINT_REFLOW)
CSS_PROP(counter-reset, counter_reset, CounterReset, REFLOW) CSS_PROP(counter-reset, counter_reset, CounterReset, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-counter-increment, _moz_counter_increment, MozCounterIncrement, REFLOW) // XXX bug 137285 CSS_PROP(-moz-counter-increment, _moz_counter_increment, MozCounterIncrement, NS_STYLE_HINT_REFLOW) // XXX bug 137285
CSS_PROP(-moz-counter-reset, _moz_counter_reset, MozCounterReset, REFLOW) // XXX bug 137285 CSS_PROP(-moz-counter-reset, _moz_counter_reset, MozCounterReset, NS_STYLE_HINT_REFLOW) // XXX bug 137285
CSS_PROP(cue, cue, Cue, AURAL) CSS_PROP(cue, cue, Cue, NS_STYLE_HINT_AURAL)
CSS_PROP(cue-after, cue_after, CueAfter, AURAL) CSS_PROP(cue-after, cue_after, CueAfter, NS_STYLE_HINT_AURAL)
CSS_PROP(cue-before, cue_before, CueBefore, AURAL) CSS_PROP(cue-before, cue_before, CueBefore, NS_STYLE_HINT_AURAL)
CSS_PROP(cursor, cursor, Cursor, VISUAL) CSS_PROP(cursor, cursor, Cursor, NS_STYLE_HINT_VISUAL)
CSS_PROP(direction, direction, Direction, REFLOW) CSS_PROP(direction, direction, Direction, NS_STYLE_HINT_REFLOW)
CSS_PROP(display, display, Display, FRAMECHANGE) CSS_PROP(display, display, Display, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(elevation, elevation, Elevation, AURAL) CSS_PROP(elevation, elevation, Elevation, NS_STYLE_HINT_AURAL)
CSS_PROP(empty-cells, empty_cells, EmptyCells, VISUAL) CSS_PROP(empty-cells, empty_cells, EmptyCells, NS_STYLE_HINT_VISUAL)
CSS_PROP(float, float, CssFloat, FRAMECHANGE) CSS_PROP(float, float, CssFloat, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(-moz-float-edge, float_edge, MozFloatEdge, REFLOW) // XXX bug 3935 CSS_PROP(-moz-float-edge, float_edge, MozFloatEdge, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(font, font, Font, REFLOW) CSS_PROP(font, font, Font, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-family, font_family, FontFamily, REFLOW) CSS_PROP(font-family, font_family, FontFamily, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-size, font_size, FontSize, REFLOW) CSS_PROP(font-size, font_size, FontSize, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-size-adjust, font_size_adjust, FontSizeAdjust, REFLOW) CSS_PROP(font-size-adjust, font_size_adjust, FontSizeAdjust, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-stretch, font_stretch, FontStretch, REFLOW) CSS_PROP(font-stretch, font_stretch, FontStretch, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-style, font_style, FontStyle, REFLOW) CSS_PROP(font-style, font_style, FontStyle, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-variant, font_variant, FontVariant, REFLOW) CSS_PROP(font-variant, font_variant, FontVariant, NS_STYLE_HINT_REFLOW)
CSS_PROP(font-weight, font_weight, FontWeight, REFLOW) CSS_PROP(font-weight, font_weight, FontWeight, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-force-broken-image-icon, force_broken_image_icon, MozForceBrokenImageIcon, FRAMECHANGE) // bug 58646 CSS_PROP(-moz-force-broken-image-icon, force_broken_image_icon, MozForceBrokenImageIcon, NS_STYLE_HINT_FRAMECHANGE) // bug 58646
CSS_PROP(height, height, Height, REFLOW) CSS_PROP(height, height, Height, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-image-region, image_region, MozImageRegion, REFLOW) CSS_PROP(-moz-image-region, image_region, MozImageRegion, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-image-region-bottom, image_region_bottom, MozImageRegionBottom, REFLOW) CSS_PROP_INTERNAL(-x-image-region-bottom, image_region_bottom, MozImageRegionBottom, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-image-region-left, image_region_left, MozImageRegionLeft, REFLOW) CSS_PROP_INTERNAL(-x-image-region-left, image_region_left, MozImageRegionLeft, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-image-region-right, image_region_right, MozImageRegionRight, REFLOW) CSS_PROP_INTERNAL(-x-image-region-right, image_region_right, MozImageRegionRight, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-image-region-top, image_region_top, MozImageRegionTop, REFLOW) CSS_PROP_INTERNAL(-x-image-region-top, image_region_top, MozImageRegionTop, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-key-equivalent, key_equivalent, MozKeyEquivalent, CONTENT) // This will need some other notification, but what? // XXX bug 3935 CSS_PROP(-moz-key-equivalent, key_equivalent, MozKeyEquivalent, NS_STYLE_HINT_CONTENT) // This will need some other notification, but what? // XXX bug 3935
CSS_PROP(left, left, Left, REFLOW) CSS_PROP(left, left, Left, NS_STYLE_HINT_REFLOW)
CSS_PROP(letter-spacing, letter_spacing, LetterSpacing, REFLOW) CSS_PROP(letter-spacing, letter_spacing, LetterSpacing, NS_STYLE_HINT_REFLOW)
CSS_PROP(line-height, line_height, LineHeight, REFLOW) CSS_PROP(line-height, line_height, LineHeight, NS_STYLE_HINT_REFLOW)
CSS_PROP(list-style, list_style, ListStyle, REFLOW) CSS_PROP(list-style, list_style, ListStyle, NS_STYLE_HINT_REFLOW)
CSS_PROP(list-style-image, list_style_image, ListStyleImage, REFLOW) CSS_PROP(list-style-image, list_style_image, ListStyleImage, NS_STYLE_HINT_REFLOW)
CSS_PROP(list-style-position, list_style_position, ListStylePosition, REFLOW) CSS_PROP(list-style-position, list_style_position, ListStylePosition, NS_STYLE_HINT_REFLOW)
CSS_PROP(list-style-type, list_style_type, ListStyleType, REFLOW) CSS_PROP(list-style-type, list_style_type, ListStyleType, NS_STYLE_HINT_REFLOW)
CSS_PROP(margin, margin, Margin, REFLOW) CSS_PROP(margin, margin, Margin, NS_STYLE_HINT_REFLOW)
CSS_PROP(margin-bottom, margin_bottom, MarginBottom, REFLOW) CSS_PROP(margin-bottom, margin_bottom, MarginBottom, NS_STYLE_HINT_REFLOW)
CSS_PROP(margin-left, margin_left, MarginLeft, REFLOW) CSS_PROP(margin-left, margin_left, MarginLeft, NS_STYLE_HINT_REFLOW)
CSS_PROP(margin-right, margin_right, MarginRight, REFLOW) CSS_PROP(margin-right, margin_right, MarginRight, NS_STYLE_HINT_REFLOW)
CSS_PROP(margin-top, margin_top, MarginTop, REFLOW) CSS_PROP(margin-top, margin_top, MarginTop, NS_STYLE_HINT_REFLOW)
CSS_PROP(marker-offset, marker_offset, MarkerOffset, REFLOW) CSS_PROP(marker-offset, marker_offset, MarkerOffset, NS_STYLE_HINT_REFLOW)
CSS_PROP(marks, marks, Marks, VISUAL) CSS_PROP(marks, marks, Marks, NS_STYLE_HINT_VISUAL)
CSS_PROP(max-height, max_height, MaxHeight, REFLOW) CSS_PROP(max-height, max_height, MaxHeight, NS_STYLE_HINT_REFLOW)
CSS_PROP(max-width, max_width, MaxWidth, REFLOW) CSS_PROP(max-width, max_width, MaxWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP(min-height, min_height, MinHeight, REFLOW) CSS_PROP(min-height, min_height, MinHeight, NS_STYLE_HINT_REFLOW)
CSS_PROP(min-width, min_width, MinWidth, REFLOW) CSS_PROP(min-width, min_width, MinWidth, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-opacity, opacity, MozOpacity, FRAMECHANGE) // XXX bug 3935 CSS_PROP(-moz-opacity, opacity, MozOpacity, NS_STYLE_HINT_FRAMECHANGE) // XXX bug 3935
CSS_PROP(orphans, orphans, Orphans, REFLOW) CSS_PROP(orphans, orphans, Orphans, NS_STYLE_HINT_REFLOW)
CSS_PROP(outline, outline, Outline, VISUAL) CSS_PROP(outline, outline, Outline, NS_STYLE_HINT_VISUAL)
CSS_PROP(outline, outline_color, OutlineColor, VISUAL) CSS_PROP(outline, outline_color, OutlineColor, NS_STYLE_HINT_VISUAL)
CSS_PROP(outline, outline_style, OutlineStyle, VISUAL) CSS_PROP(outline, outline_style, OutlineStyle, NS_STYLE_HINT_VISUAL)
CSS_PROP(outline, outline_width, OutlineWidth, VISUAL) CSS_PROP(outline, outline_width, OutlineWidth, NS_STYLE_HINT_VISUAL)
CSS_PROP(-moz-outline, _moz_outline, MozOutline, VISUAL) // XXX This is temporary fix for nsbeta3+ Bug 48973, turning outline into -moz-outline XXX bug 48973 CSS_PROP(-moz-outline, _moz_outline, MozOutline, NS_STYLE_HINT_VISUAL) // XXX This is temporary fix for nsbeta3+ Bug 48973, turning outline into -moz-outline XXX bug 48973
CSS_PROP(-moz-outline-color, _moz_outline_color, MozOutlineColor, VISUAL) // XXX bug 48973 CSS_PROP(-moz-outline-color, _moz_outline_color, MozOutlineColor, NS_STYLE_HINT_VISUAL) // XXX bug 48973
CSS_PROP(-moz-outline-style, _moz_outline_style, MozOutlineStyle, VISUAL) // XXX bug 48973 CSS_PROP(-moz-outline-style, _moz_outline_style, MozOutlineStyle, NS_STYLE_HINT_VISUAL) // XXX bug 48973
CSS_PROP(-moz-outline-width, _moz_outline_width, MozOutlineWidth, VISUAL) // XXX bug 48973 CSS_PROP(-moz-outline-width, _moz_outline_width, MozOutlineWidth, NS_STYLE_HINT_VISUAL) // XXX bug 48973
CSS_PROP(overflow, overflow, Overflow, FRAMECHANGE) CSS_PROP(overflow, overflow, Overflow, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(padding, padding, Padding, REFLOW) CSS_PROP(padding, padding, Padding, NS_STYLE_HINT_REFLOW)
CSS_PROP(padding-bottom, padding_bottom, PaddingBottom, REFLOW) CSS_PROP(padding-bottom, padding_bottom, PaddingBottom, NS_STYLE_HINT_REFLOW)
CSS_PROP(padding-left, padding_left, PaddingLeft, REFLOW) CSS_PROP(padding-left, padding_left, PaddingLeft, NS_STYLE_HINT_REFLOW)
CSS_PROP(padding-right, padding_right, PaddingRight, REFLOW) CSS_PROP(padding-right, padding_right, PaddingRight, NS_STYLE_HINT_REFLOW)
CSS_PROP(padding-top, padding_top, PaddingTop, REFLOW) CSS_PROP(padding-top, padding_top, PaddingTop, NS_STYLE_HINT_REFLOW)
CSS_PROP(page, page, Page, REFLOW) CSS_PROP(page, page, Page, NS_STYLE_HINT_REFLOW)
CSS_PROP(page-break-after, page_break_after, PageBreakAfter, REFLOW) CSS_PROP(page-break-after, page_break_after, PageBreakAfter, NS_STYLE_HINT_REFLOW)
CSS_PROP(page-break-before, page_break_before, PageBreakBefore, REFLOW) CSS_PROP(page-break-before, page_break_before, PageBreakBefore, NS_STYLE_HINT_REFLOW)
CSS_PROP(page-break-inside, page_break_inside, PageBreakInside, REFLOW) CSS_PROP(page-break-inside, page_break_inside, PageBreakInside, NS_STYLE_HINT_REFLOW)
CSS_PROP(pause, pause, Pause, AURAL) CSS_PROP(pause, pause, Pause, NS_STYLE_HINT_AURAL)
CSS_PROP(pause-after, pause_after, PauseAfter, AURAL) CSS_PROP(pause-after, pause_after, PauseAfter, NS_STYLE_HINT_AURAL)
CSS_PROP(pause-before, pause_before, PauseBefore, AURAL) CSS_PROP(pause-before, pause_before, PauseBefore, NS_STYLE_HINT_AURAL)
CSS_PROP(pitch, pitch, Pitch, AURAL) CSS_PROP(pitch, pitch, Pitch, NS_STYLE_HINT_AURAL)
CSS_PROP(pitch-range, pitch_range, PitchRange, AURAL) CSS_PROP(pitch-range, pitch_range, PitchRange, NS_STYLE_HINT_AURAL)
CSS_PROP(play-during, play_during, PlayDuring, AURAL) CSS_PROP(play-during, play_during, PlayDuring, NS_STYLE_HINT_AURAL)
CSS_PROP_INTERNAL(-x-play-during-flags, play_during_flags, PlayDuringFlags, AURAL) // XXX why is this here? CSS_PROP_INTERNAL(-x-play-during-flags, play_during_flags, PlayDuringFlags, NS_STYLE_HINT_AURAL) // XXX why is this here?
CSS_PROP(position, position, Position, FRAMECHANGE) CSS_PROP(position, position, Position, NS_STYLE_HINT_FRAMECHANGE)
CSS_PROP(quotes, quotes, Quotes, REFLOW) CSS_PROP(quotes, quotes, Quotes, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-quotes-close, quotes_close, QuotesClose, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-quotes-close, quotes_close, QuotesClose, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP_INTERNAL(-x-quotes-open, quotes_open, QuotesOpen, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-quotes-open, quotes_open, QuotesOpen, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(-moz-resizer, resizer, MozResizer, FRAMECHANGE) // XXX bug 3935 CSS_PROP(-moz-resizer, resizer, MozResizer, NS_STYLE_HINT_FRAMECHANGE) // XXX bug 3935
CSS_PROP(richness, richness, Richness, AURAL) CSS_PROP(richness, richness, Richness, NS_STYLE_HINT_AURAL)
CSS_PROP(right, right, Right, REFLOW) CSS_PROP(right, right, Right, NS_STYLE_HINT_REFLOW)
CSS_PROP(size, size, Size, REFLOW) CSS_PROP(size, size, Size, NS_STYLE_HINT_REFLOW)
CSS_PROP_INTERNAL(-x-size-height, size_height, SizeHeight, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-size-height, size_height, SizeHeight, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP_INTERNAL(-x-size-width, size_width, SizeWidth, REFLOW) // XXX bug 3935 CSS_PROP_INTERNAL(-x-size-width, size_width, SizeWidth, NS_STYLE_HINT_REFLOW) // XXX bug 3935
CSS_PROP(speak, speak, Speak, AURAL) CSS_PROP(speak, speak, Speak, NS_STYLE_HINT_AURAL)
CSS_PROP(speak-header, speak_header, SpeakHeader, AURAL) CSS_PROP(speak-header, speak_header, SpeakHeader, NS_STYLE_HINT_AURAL)
CSS_PROP(speak-numeral, speak_numeral, SpeakNumeral, AURAL) CSS_PROP(speak-numeral, speak_numeral, SpeakNumeral, NS_STYLE_HINT_AURAL)
CSS_PROP(speak-punctuation, speak_punctuation, SpeakPunctuation, AURAL) CSS_PROP(speak-punctuation, speak_punctuation, SpeakPunctuation, NS_STYLE_HINT_AURAL)
CSS_PROP(speech-rate, speech_rate, SpeechRate, AURAL) CSS_PROP(speech-rate, speech_rate, SpeechRate, NS_STYLE_HINT_AURAL)
CSS_PROP(stress, stress, Stress, AURAL) CSS_PROP(stress, stress, Stress, NS_STYLE_HINT_AURAL)
CSS_PROP(table-layout, table_layout, TableLayout, REFLOW) CSS_PROP(table-layout, table_layout, TableLayout, NS_STYLE_HINT_REFLOW)
CSS_PROP(text-align, text_align, TextAlign, REFLOW) CSS_PROP(text-align, text_align, TextAlign, NS_STYLE_HINT_REFLOW)
CSS_PROP(text-decoration, text_decoration, TextDecoration, VISUAL) CSS_PROP(text-decoration, text_decoration, TextDecoration, NS_STYLE_HINT_VISUAL)
CSS_PROP(text-indent, text_indent, TextIndent, REFLOW) CSS_PROP(text-indent, text_indent, TextIndent, NS_STYLE_HINT_REFLOW)
CSS_PROP(text-shadow, text_shadow, TextShadow, VISUAL) CSS_PROP(text-shadow, text_shadow, TextShadow, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(-x-text-shadow-color, text_shadow_color, TextShadowColor, VISUAL) // XXX bug 3935 CSS_PROP_INTERNAL(-x-text-shadow-color, text_shadow_color, TextShadowColor, NS_STYLE_HINT_VISUAL) // XXX bug 3935
CSS_PROP_INTERNAL(-x-text-shadow-radius, text_shadow_radius, TextShadowRadius, VISUAL) // XXX bug 3935 CSS_PROP_INTERNAL(-x-text-shadow-radius, text_shadow_radius, TextShadowRadius, NS_STYLE_HINT_VISUAL) // XXX bug 3935
CSS_PROP_INTERNAL(-x-text-shadow-x, text_shadow_x, TextShadowX, VISUAL) // XXX bug 3935 CSS_PROP_INTERNAL(-x-text-shadow-x, text_shadow_x, TextShadowX, NS_STYLE_HINT_VISUAL) // XXX bug 3935
CSS_PROP_INTERNAL(-x-text-shadow-y, text_shadow_y, TextShadowY, VISUAL) // XXX bug 3935 CSS_PROP_INTERNAL(-x-text-shadow-y, text_shadow_y, TextShadowY, NS_STYLE_HINT_VISUAL) // XXX bug 3935
CSS_PROP(text-transform, text_transform, TextTransform, REFLOW) CSS_PROP(text-transform, text_transform, TextTransform, NS_STYLE_HINT_REFLOW)
CSS_PROP(top, top, Top, REFLOW) CSS_PROP(top, top, Top, NS_STYLE_HINT_REFLOW)
CSS_PROP(unicode-bidi, unicode_bidi, UnicodeBidi, REFLOW) CSS_PROP(unicode-bidi, unicode_bidi, UnicodeBidi, NS_STYLE_HINT_REFLOW)
CSS_PROP(-moz-user-focus, user_focus, MozUserFocus, CONTENT) // XXX bug 3935 CSS_PROP(-moz-user-focus, user_focus, MozUserFocus, NS_STYLE_HINT_CONTENT) // XXX bug 3935
CSS_PROP(-moz-user-input, user_input, MozUserInput, FRAMECHANGE) // XXX ??? // XXX bug 3935 CSS_PROP(-moz-user-input, user_input, MozUserInput, NS_STYLE_HINT_FRAMECHANGE) // XXX ??? // XXX bug 3935
CSS_PROP(-moz-user-modify, user_modify, MozUserModify, FRAMECHANGE) // XXX bug 3935 CSS_PROP(-moz-user-modify, user_modify, MozUserModify, NS_STYLE_HINT_FRAMECHANGE) // XXX bug 3935
CSS_PROP(-moz-user-select, user_select, MozUserSelect, CONTENT) // XXX bug 3935 CSS_PROP(-moz-user-select, user_select, MozUserSelect, NS_STYLE_HINT_CONTENT) // XXX bug 3935
CSS_PROP(vertical-align, vertical_align, VerticalAlign, REFLOW) CSS_PROP(vertical-align, vertical_align, VerticalAlign, NS_STYLE_HINT_REFLOW)
CSS_PROP(visibility, visibility, Visibility, REFLOW) // reflow for collapse CSS_PROP(visibility, visibility, Visibility, NS_STYLE_HINT_REFLOW) // reflow for collapse
CSS_PROP(voice-family, voice_family, VoiceFamily, AURAL) CSS_PROP(voice-family, voice_family, VoiceFamily, NS_STYLE_HINT_AURAL)
CSS_PROP(volume, volume, Volume, AURAL) CSS_PROP(volume, volume, Volume, NS_STYLE_HINT_AURAL)
CSS_PROP(white-space, white_space, WhiteSpace, REFLOW) CSS_PROP(white-space, white_space, WhiteSpace, NS_STYLE_HINT_REFLOW)
CSS_PROP(widows, widows, Widows, REFLOW) CSS_PROP(widows, widows, Widows, NS_STYLE_HINT_REFLOW)
CSS_PROP(width, width, Width, REFLOW) CSS_PROP(width, width, Width, NS_STYLE_HINT_REFLOW)
CSS_PROP(word-spacing, word_spacing, WordSpacing, REFLOW) CSS_PROP(word-spacing, word_spacing, WordSpacing, NS_STYLE_HINT_REFLOW)
CSS_PROP(z-index, z_index, ZIndex, REFLOW) CSS_PROP(z-index, z_index, ZIndex, NS_STYLE_HINT_REFLOW)
#ifdef MOZ_SVG #ifdef MOZ_SVG
// XXX treat SVG's CSS Properties as internal for now. // XXX treat SVG's CSS Properties as internal for now.
// Do we want to create an nsIDOMSVGCSS2Properties interface? // Do we want to create an nsIDOMSVGCSS2Properties interface?
CSS_PROP_INTERNAL(fill, fill, Fill, VISUAL) CSS_PROP_INTERNAL(fill, fill, Fill, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(fill-opacity, fill_opacity, FillOpacity, VISUAL) CSS_PROP_INTERNAL(fill-opacity, fill_opacity, FillOpacity, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(fill-rule, fill_rule, FillRule, VISUAL) CSS_PROP_INTERNAL(fill-rule, fill_rule, FillRule, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke, stroke, Stroke, VISUAL) CSS_PROP_INTERNAL(stroke, stroke, Stroke, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-dasharray, stroke_dasharray, StrokeDasharray, VISUAL) CSS_PROP_INTERNAL(stroke-dasharray, stroke_dasharray, StrokeDasharray, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-dashoffset, stroke_dashoffset, StrokeDashoffset, VISUAL) CSS_PROP_INTERNAL(stroke-dashoffset, stroke_dashoffset, StrokeDashoffset, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-linecap, stroke_linecap, StrokeLinecap, VISUAL) CSS_PROP_INTERNAL(stroke-linecap, stroke_linecap, StrokeLinecap, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-linejoin, stroke_linejoin, StrokeLinejoin, VISUAL) CSS_PROP_INTERNAL(stroke-linejoin, stroke_linejoin, StrokeLinejoin, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-miterlimit, stroke_miterlimit, StrokeMiterlimit, VISUAL) CSS_PROP_INTERNAL(stroke-miterlimit, stroke_miterlimit, StrokeMiterlimit, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-opacity, stroke_opacity, StrokeOpacity, VISUAL) CSS_PROP_INTERNAL(stroke-opacity, stroke_opacity, StrokeOpacity, NS_STYLE_HINT_VISUAL)
CSS_PROP_INTERNAL(stroke-width, stroke_width, StrokeWidth, VISUAL) CSS_PROP_INTERNAL(stroke-width, stroke_width, StrokeWidth, NS_STYLE_HINT_VISUAL)
#endif #endif
// Clean up after ourselves // Clean up after ourselves

Просмотреть файл

@ -1286,7 +1286,7 @@ PRBool nsCSSProps::GetColorName(PRInt32 aPropValue, nsCString &aStr)
} }
// define array of all CSS property hints // define array of all CSS property hints
#define CSS_PROP(_name, _id, _method, _hint) NS_STYLE_HINT_##_hint, #define CSS_PROP(_name, _id, _method, _hint) _hint,
const nsChangeHint nsCSSProps::kHintTable[eCSSProperty_COUNT] = { const nsChangeHint nsCSSProps::kHintTable[eCSSProperty_COUNT] = {
#include "nsCSSPropList.h" #include "nsCSSPropList.h"
}; };

Просмотреть файл

@ -1049,23 +1049,28 @@ nsStyleDisplay::nsStyleDisplay(const nsStyleDisplay& aSource)
nsChangeHint nsStyleDisplay::CalcDifference(const nsStyleDisplay& aOther) const nsChangeHint nsStyleDisplay::CalcDifference(const nsStyleDisplay& aOther) const
{ {
if (mBinding != aOther.mBinding || mPosition != aOther.mPosition) nsChangeHint hint = nsChangeHint_None;
return NS_STYLE_HINT_FRAMECHANGE;
if ((mDisplay == aOther.mDisplay) && if (mBinding != aOther.mBinding
(mFloats == aOther.mFloats) && || mPosition != aOther.mPosition
(mOverflow == aOther.mOverflow)) { || mDisplay != aOther.mDisplay
if ((mBreakType == aOther.mBreakType) && || mFloats != aOther.mFloats
(mBreakBefore == aOther.mBreakBefore) && || mOverflow != aOther.mOverflow)
(mBreakAfter == aOther.mBreakAfter) && NS_UpdateHint(hint, nsChangeHint_ReconstructFrame);
(mClipFlags == aOther.mClipFlags) &&
(mClip == aOther.mClip) && // XXX the following is conservative, for now: changing float breaking shouldn't
(mAppearance == aOther.mAppearance)) { // necessarily require a repaint, reflow should suffice.
return NS_STYLE_HINT_NONE; if (mBreakType != aOther.mBreakType
} || mBreakBefore != aOther.mBreakBefore
return NS_STYLE_HINT_REFLOW; || mBreakAfter != aOther.mBreakAfter
} || mAppearance != aOther.mAppearance)
return NS_STYLE_HINT_FRAMECHANGE; NS_UpdateHint(hint, NS_CombineHint(nsChangeHint_ReflowFrame, nsChangeHint_RepaintFrame));
if (mClipFlags != aOther.mClipFlags
|| mClip != aOther.mClip)
NS_UpdateHint(hint, nsChangeHint_SyncFrameView);
return hint;
} }
// -------------------- // --------------------

Просмотреть файл

@ -2736,12 +2736,8 @@ nsBoxFrame::CreateViewForFrame(nsIPresContext* aPresContext,
// Create a view // Create a view
static NS_DEFINE_IID(kViewCID, NS_VIEW_CID); static NS_DEFINE_IID(kViewCID, NS_VIEW_CID);
nsresult result = CallCreateInstance(kViewCID, &view);
nsresult result = nsComponentManager::CreateInstance(kViewCID, if (NS_SUCCEEDED(result)) {
nsnull,
NS_GET_IID(nsIView),
(void **)&view);
if (NS_OK == result) {
nsIViewManager* viewManager; nsIViewManager* viewManager;
parentView->GetViewManager(viewManager); parentView->GetViewManager(viewManager);
NS_ASSERTION(nsnull != viewManager, "null view manager"); NS_ASSERTION(nsnull != viewManager, "null view manager");
@ -2760,7 +2756,7 @@ nsBoxFrame::CreateViewForFrame(nsIPresContext* aPresContext,
// Insert the view into the view hierarchy. If the parent view is a // Insert the view into the view hierarchy. If the parent view is a
// scrolling view we need to do this differently // scrolling view we need to do this differently
nsIScrollableView* scrollingView; nsIScrollableView* scrollingView;
if (NS_SUCCEEDED(parentView->QueryInterface(NS_GET_IID(nsIScrollableView), (void**)&scrollingView))) { if (NS_SUCCEEDED(CallQueryInterface(parentView, &scrollingView))) {
scrollingView->SetScrolledView(view); scrollingView->SetScrolledView(view);
} else { } else {
viewManager->SetViewZIndex(view, autoZIndex, zIndex); viewManager->SetViewZIndex(view, autoZIndex, zIndex);

Просмотреть файл

@ -243,57 +243,23 @@ nsScrollBoxFrame::CreateScrollingView(nsIPresContext* aPresContext)
GetScrollingParentView(aPresContext, parent, &parentView); GetScrollingParentView(aPresContext, parent, &parentView);
// Get the view manager // Get the view manager
nsIViewManager* viewManager; nsCOMPtr<nsIViewManager> viewManager;
parentView->GetViewManager(viewManager); parentView->GetViewManager(*getter_AddRefs(viewManager));
// Create the scrolling view // Create the scrolling view
nsresult rv = nsComponentManager::CreateInstance(kScrollBoxViewCID, nsresult rv = CallCreateInstance(kScrollBoxViewCID, &view);
nsnull, if (NS_SUCCEEDED(rv)) {
NS_GET_IID(nsIView),
(void **)&view);
if (NS_OK == rv) {
const nsStyleDisplay* display = (const nsStyleDisplay*)
mStyleContext->GetStyleData(eStyleStruct_Display);
const nsStylePosition* position = (const nsStylePosition*)
mStyleContext->GetStyleData(eStyleStruct_Position);
const nsStyleBorder* borderStyle = (const nsStyleBorder*)
mStyleContext->GetStyleData(eStyleStruct_Border);
const nsStyleVisibility* vis =
(const nsStyleVisibility*)mStyleContext->GetStyleData(eStyleStruct_Visibility);
// Get the z-index
PRInt32 zIndex = 0;
PRBool autoZIndex = PR_FALSE;
if (eStyleUnit_Integer == position->mZIndex.GetUnit()) {
zIndex = position->mZIndex.GetIntValue();
} else if (eStyleUnit_Auto == position->mZIndex.GetUnit()) {
autoZIndex = PR_TRUE;
}
// Initialize the scrolling view // Initialize the scrolling view
view->Init(viewManager, mRect, parentView, vis->IsVisibleOrCollapsed() ? view->Init(viewManager, mRect, parentView);
nsViewVisibility_kShow : nsViewVisibility_kHide);
viewManager->SetViewZIndex(view, autoZIndex, zIndex); SyncFrameViewProperties(aPresContext, this, mStyleContext, view);
// Insert the view into the view hierarchy // Insert the view into the view hierarchy
// XXX Put view last in document order until we know how to do better // XXX Put view last in document order until we know how to do better
viewManager->InsertChild(parentView, view, nsnull, PR_TRUE); viewManager->InsertChild(parentView, view, nsnull, PR_TRUE);
// Set the view's opacity const nsStyleDisplay* display;
viewManager->SetViewOpacity(view, vis->mOpacity); ::GetStyleData(mStyleContext, &display);
// Because we only paint the border and we don't paint a background,
// inform the view manager that we have transparent content
viewManager->SetViewContentTransparency(view, PR_TRUE);
// If it's fixed positioned, then create a widget too // If it's fixed positioned, then create a widget too
CreateScrollingViewWidget(view, display); CreateScrollingViewWidget(view, display);
@ -308,6 +274,8 @@ nsScrollBoxFrame::CreateScrollingView(nsIPresContext* aPresContext)
scrollingView->CreateScrollControls(); scrollingView->CreateScrollControls();
} }
const nsStyleBorder* borderStyle;
::GetStyleData(mStyleContext, &borderStyle);
// Set the scrolling view's insets to whatever our border is // Set the scrolling view's insets to whatever our border is
nsMargin border; nsMargin border;
if (!borderStyle->GetBorder(border)) { if (!borderStyle->GetBorder(border)) {
@ -319,8 +287,6 @@ nsScrollBoxFrame::CreateScrollingView(nsIPresContext* aPresContext)
// Remember our view // Remember our view
SetView(aPresContext, view); SetView(aPresContext, view);
} }
NS_RELEASE(viewManager);
return rv; return rv;
} }

Просмотреть файл

@ -2553,15 +2553,17 @@ NS_IMETHODIMP nsViewManager::SetViewChildClipRegion(nsIView *aView, const nsRegi
view->SetClipChildren(newClipFlag); view->SetClipChildren(newClipFlag);
view->SetChildClip(newClipRect); view->SetChildClip(newClipRect);
// Invalidate changed areas if (IsViewInserted(view)) {
// Paint (new - old) in the current view // Invalidate changed areas
InvalidateRectDifference(view, newClipRect, oldClipRect, NS_VMREFRESH_NO_SYNC); // Paint (new - old) in the current view
// Paint (old - new) in the parent view, since it'll be clipped out of the current view InvalidateRectDifference(view, newClipRect, oldClipRect, NS_VMREFRESH_NO_SYNC);
nsView* parent = view->GetParent(); // Paint (old - new) in the parent view, since it'll be clipped out of the current view
if (parent != nsnull) { nsView* parent = view->GetParent();
view->ConvertToParentCoords(&oldClipRect.x, &oldClipRect.y); if (parent != nsnull) {
view->ConvertToParentCoords(&newClipRect.x, &newClipRect.y); view->ConvertToParentCoords(&oldClipRect.x, &oldClipRect.y);
InvalidateRectDifference(parent, oldClipRect, newClipRect, NS_VMREFRESH_NO_SYNC); view->ConvertToParentCoords(&newClipRect.x, &newClipRect.y);
InvalidateRectDifference(parent, oldClipRect, newClipRect, NS_VMREFRESH_NO_SYNC | NS_VMREFRESH_FORCHILD);
}
} }
return NS_OK; return NS_OK;
@ -2850,9 +2852,9 @@ NS_IMETHODIMP nsViewManager::SetViewZIndex(nsIView *aView, PRBool aAutoZIndex, P
PRInt32 oldidx = view->GetZIndex(); PRInt32 oldidx = view->GetZIndex();
view->SetZIndex(aAutoZIndex, aZIndex, aTopMost); view->SetZIndex(aAutoZIndex, aZIndex, aTopMost);
if (IsViewInserted(view)) { if (CompareZIndex(oldidx, oldTopMost, oldIsAuto,
if (CompareZIndex(oldidx, oldTopMost, oldIsAuto, aZIndex, aTopMost, aAutoZIndex) != 0) {
aZIndex, aTopMost, aAutoZIndex) != 0) { if (IsViewInserted(view)) {
nsView *parent = view->GetParent(); nsView *parent = view->GetParent();
if (nsnull != parent) { if (nsnull != parent) {
//we don't just call the view manager's RemoveChild() //we don't just call the view manager's RemoveChild()
@ -2862,20 +2864,19 @@ NS_IMETHODIMP nsViewManager::SetViewZIndex(nsIView *aView, PRBool aAutoZIndex, P
UpdateTransCnt(view, nsnull); UpdateTransCnt(view, nsnull);
rv = InsertChild(parent, view, aZIndex); rv = InsertChild(parent, view, aZIndex);
} }
// XXX The following else block is a workaround and should be cleaned up (bug 43410) // XXX The following else block is a workaround and should be cleaned up (bug 43410)
} else {
nsCOMPtr<nsIWidget> widget;
view->GetWidget(*getter_AddRefs(widget));
if (widget) {
widget->SetZIndex(aZIndex);
}
} }
} else {
nsCOMPtr<nsIWidget> widget;
view->GetWidget(*getter_AddRefs(widget));
if (widget) {
widget->SetZIndex(aZIndex);
}
}
nsZPlaceholderView* zParentView = view->GetZParent(); nsZPlaceholderView* zParentView = view->GetZParent();
if (nsnull != zParentView) { if (nsnull != zParentView) {
SetViewZIndex(zParentView, aAutoZIndex, aZIndex, aTopMost); SetViewZIndex(zParentView, aAutoZIndex, aZIndex, aTopMost);
}
} }
return rv; return rv;
@ -2888,13 +2889,15 @@ NS_IMETHODIMP nsViewManager::SetViewContentTransparency(nsIView *aView, PRBool a
view->HasTransparency(trans); view->HasTransparency(trans);
if (trans != aTransparent && IsViewInserted(view)) if (trans != aTransparent) {
{ UpdateTransCnt(view, nsnull);
UpdateTransCnt(view, nsnull); view->SetContentTransparency(aTransparent);
view->SetContentTransparency(aTransparent); UpdateTransCnt(nsnull, view);
UpdateTransCnt(nsnull, view);
if (IsViewInserted(view)) {
UpdateView(view, NS_VMREFRESH_NO_SYNC); UpdateView(view, NS_VMREFRESH_NO_SYNC);
} }
}
return NS_OK; return NS_OK;
} }
@ -2906,12 +2909,15 @@ NS_IMETHODIMP nsViewManager::SetViewOpacity(nsIView *aView, float aOpacity)
view->GetOpacity(opacity); view->GetOpacity(opacity);
if (opacity != aOpacity && IsViewInserted(view)) if (opacity != aOpacity)
{ {
UpdateTransCnt(view, nsnull); UpdateTransCnt(view, nsnull);
view->SetOpacity(aOpacity); view->SetOpacity(aOpacity);
UpdateTransCnt(nsnull, view); UpdateTransCnt(nsnull, view);
UpdateView(view, NS_VMREFRESH_NO_SYNC);
if (IsViewInserted(view)) {
UpdateView(view, NS_VMREFRESH_NO_SYNC);
}
} }
return NS_OK; return NS_OK;