Mozilla Home
Privacy
Cookies
Legal
Bugzilla
Browse
Advanced Search
New Bug
Reports
Documentation
Log In
Log In with GitHub
or
Remember me
Browse
Advanced Search
New Bug
Reports
Documentation
Attachment 525114 Details for
Bug 613149
[patch]
Style system support for unicode-bidi: -moz-isolate and -moz-plaintext
613149.css.diff (text/plain), 15.64 KB, created by
Simon Montagu :smontagu
(
hide
)
Description:
Style system support for unicode-bidi: -moz-isolate and -moz-plaintext
Filename:
MIME Type:
Creator:
Simon Montagu :smontagu
Size:
15.64 KB
patch
obsolete
>diff --git a/layout/base/nsBidiPresUtils.cpp b/layout/base/nsBidiPresUtils.cpp >--- a/layout/base/nsBidiPresUtils.cpp >+++ b/layout/base/nsBidiPresUtils.cpp >@@ -475,17 +475,17 @@ nsBidiPresUtils::Resolve(nsBlockFrame* a > { > BidiParagraphData bpd; > bpd.Init(aBlockFrame); > > // handle bidi-override being set on the block itself before calling > // TraverseFrames. > const nsStyleTextReset* text = aBlockFrame->GetStyleTextReset(); > PRUnichar ch = 0; >- if (text->mUnicodeBidi == NS_STYLE_UNICODE_BIDI_OVERRIDE) { >+ if (text->mUnicodeBidi & NS_STYLE_UNICODE_BIDI_OVERRIDE) { > const nsStyleVisibility* vis = aBlockFrame->GetStyleVisibility(); > if (NS_STYLE_DIRECTION_RTL == vis->mDirection) { > ch = kRLO; > } > else if (NS_STYLE_DIRECTION_LTR == vis->mDirection) { > ch = kLRO; > } > if (ch != 0) { >@@ -798,35 +798,30 @@ nsBidiPresUtils::TraverseFrames(nsBlockF > frame = realFrame; > } > } > > PRUnichar ch = 0; > if (frame->IsFrameOfType(nsIFrame::eBidiInlineContainer)) { > const nsStyleVisibility* vis = frame->GetStyleVisibility(); > const nsStyleTextReset* text = frame->GetStyleTextReset(); >- switch (text->mUnicodeBidi) { >- case NS_STYLE_UNICODE_BIDI_NORMAL: >- break; >- case NS_STYLE_UNICODE_BIDI_EMBED: >- if (NS_STYLE_DIRECTION_RTL == vis->mDirection) { >- ch = kRLE; >- } >- else if (NS_STYLE_DIRECTION_LTR == vis->mDirection) { >- ch = kLRE; >- } >- break; >- case NS_STYLE_UNICODE_BIDI_OVERRIDE: >- if (NS_STYLE_DIRECTION_RTL == vis->mDirection) { >- ch = kRLO; >- } >- else if (NS_STYLE_DIRECTION_LTR == vis->mDirection) { >- ch = kLRO; >- } >- break; >+ if (text->mUnicodeBidi & NS_STYLE_UNICODE_BIDI_OVERRIDE) { >+ if (NS_STYLE_DIRECTION_RTL == vis->mDirection) { >+ ch = kRLO; >+ } >+ else if (NS_STYLE_DIRECTION_LTR == vis->mDirection) { >+ ch = kLRO; >+ } >+ } else if (text->mUnicodeBidi & NS_STYLE_UNICODE_BIDI_EMBED) { >+ if (NS_STYLE_DIRECTION_RTL == vis->mDirection) { >+ ch = kRLE; >+ } >+ else if (NS_STYLE_DIRECTION_LTR == vis->mDirection) { >+ ch = kLRE; >+ } > } > > // Add a dummy frame pointer representing a bidi control code before the > // first frame of an element specifying embedding or override > if (ch != 0 && !frame->GetPrevContinuation()) { > aBpd->PushBidiControl(ch); > } > } >diff --git a/layout/base/nsStyleConsts.h b/layout/base/nsStyleConsts.h >--- a/layout/base/nsStyleConsts.h >+++ b/layout/base/nsStyleConsts.h >@@ -680,19 +680,23 @@ static inline mozilla::css::Side operato > // See nsStyleText > #define NS_STYLE_WORDWRAP_NORMAL 0 > #define NS_STYLE_WORDWRAP_BREAK_WORD 1 > > // See nsStyleText > #define NS_STYLE_LINE_HEIGHT_BLOCK_HEIGHT 0 > > // See nsStyleText >-#define NS_STYLE_UNICODE_BIDI_NORMAL 0 >-#define NS_STYLE_UNICODE_BIDI_EMBED 1 >-#define NS_STYLE_UNICODE_BIDI_OVERRIDE 2 >+#define NS_STYLE_UNICODE_BIDI_NORMAL 0x0 >+#define NS_STYLE_UNICODE_BIDI_EMBED 0x1 >+#define NS_STYLE_UNICODE_BIDI_MOZ_ISOLATE 0x2 >+#define NS_STYLE_UNICODE_BIDI_EMBEDDING_MASK 0x3 >+#define NS_STYLE_UNICODE_BIDI_OVERRIDE 0x4 >+#define NS_STYLE_UNICODE_BIDI_MOZ_PLAINTEXT 0x8 >+#define NS_STYLE_UNICODE_BIDI_DIRECTION_MASK 0xC > > // See nsStyleTable (here for HTML 4.0 for now, should probably change to side flags) > #define NS_STYLE_TABLE_FRAME_NONE 0 > #define NS_STYLE_TABLE_FRAME_ABOVE 1 > #define NS_STYLE_TABLE_FRAME_BELOW 2 > #define NS_STYLE_TABLE_FRAME_HSIDES 3 > #define NS_STYLE_TABLE_FRAME_VSIDES 4 > #define NS_STYLE_TABLE_FRAME_LEFT 5 >diff --git a/layout/style/nsCSSKeywordList.h b/layout/style/nsCSSKeywordList.h >--- a/layout/style/nsCSSKeywordList.h >+++ b/layout/style/nsCSSKeywordList.h >@@ -121,16 +121,17 @@ CSS_KEY(-moz-hyperlinktext, _moz_hyperli > CSS_KEY(-moz-html-cellhighlight, _moz_html_cellhighlight) > CSS_KEY(-moz-html-cellhighlighttext, _moz_html_cellhighlighttext) > CSS_KEY(-moz-image-rect, _moz_image_rect) > CSS_KEY(-moz-info, _moz_info) > CSS_KEY(-moz-initial, _moz_initial) > CSS_KEY(-moz-inline-box, _moz_inline_box) > CSS_KEY(-moz-inline-grid, _moz_inline_grid) > CSS_KEY(-moz-inline-stack, _moz_inline_stack) >+CSS_KEY(-moz-isolate, _moz_isolate) > CSS_KEY(-moz-japanese-formal, _moz_japanese_formal) > CSS_KEY(-moz-japanese-informal, _moz_japanese_informal) > CSS_KEY(-moz-kannada, _moz_kannada) > CSS_KEY(-moz-khmer, _moz_khmer) > CSS_KEY(-moz-lao, _moz_lao) > CSS_KEY(-moz-left, _moz_left) > CSS_KEY(-moz-list, _moz_list) > CSS_KEY(-moz-mac-alternateprimaryhighlight, _moz_mac_alternateprimaryhighlight) >@@ -152,16 +153,17 @@ CSS_KEY(-moz-menubarhovertext, _moz_menu > CSS_KEY(-moz-middle-with-baseline, _moz_middle_with_baseline) > CSS_KEY(-moz-min-content, _moz_min_content) > CSS_KEY(-moz-myanmar, _moz_myanmar) > CSS_KEY(-moz-nativehyperlinktext, _moz_nativehyperlinktext) > CSS_KEY(-moz-none, _moz_none) > CSS_KEY(-moz-oddtreerow, _moz_oddtreerow) > CSS_KEY(-moz-oriya, _moz_oriya) > CSS_KEY(-moz-persian, _moz_persian) >+CSS_KEY(-moz-plaintext, _moz_plaintext) > CSS_KEY(-moz-popup, _moz_popup) > CSS_KEY(-moz-pull-down-menu, _moz_pull_down_menu) > CSS_KEY(-moz-right, _moz_right) > CSS_KEY(-moz-scrollbars-horizontal, _moz_scrollbars_horizontal) > CSS_KEY(-moz-scrollbars-none, _moz_scrollbars_none) > CSS_KEY(-moz-scrollbars-vertical, _moz_scrollbars_vertical) > CSS_KEY(-moz-show-background, _moz_show_background) > CSS_KEY(-moz-simp-chinese-formal, _moz_simp_chinese_formal) >diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp >--- a/layout/style/nsCSSParser.cpp >+++ b/layout/style/nsCSSParser.cpp >@@ -503,16 +503,17 @@ protected: > PRBool ParseMozTransform(); > PRBool ParseOutline(); > PRBool ParseOverflow(); > PRBool ParsePadding(); > PRBool ParsePause(); > PRBool ParseQuotes(); > PRBool ParseSize(); > PRBool ParseTextDecoration(nsCSSValue& aValue); >+ PRBool ParseUnicodeBidi(nsCSSValue& aValue); > > PRBool ParseShadowItem(nsCSSValue& aValue, PRBool aIsBoxShadow); > PRBool ParseShadowList(nsCSSProperty aProperty); > PRBool ParseTransitionProperty(); > PRBool ParseTransition(); > PRBool ParseTransitionTimingFunctionValues(nsCSSValue& aValue); > PRBool ParseTransitionTimingFunctionValueComponent(float& aComponent, > char aStop, >@@ -5424,16 +5425,18 @@ CSSParserImpl::ParseSingleValueProperty( > case eCSSProperty_voice_family: > return ParseFamily(aValue); > case eCSSProperty_font_weight: > return ParseFontWeight(aValue); > case eCSSProperty_marks: > return ParseMarks(aValue); > case eCSSProperty_text_decoration: > return ParseTextDecoration(aValue); >+ case eCSSProperty_unicode_bidi: >+ return ParseUnicodeBidi(aValue); > default: > NS_ABORT_IF_FALSE(PR_FALSE, "should not reach here"); > return PR_FALSE; > } > } > > PRUint32 variant = nsCSSProps::ParserVariant(aPropID); > if (variant == 0) { >@@ -7853,17 +7856,53 @@ CSSParserImpl::ParseTextDecoration(nsCSS > } > aValue.SetIntValue(intValue, eCSSUnit_Enumerated); > } > } > return PR_TRUE; > } > return PR_FALSE; > } >- >+ >+PRBool >+CSSParserImpl::ParseUnicodeBidi(nsCSSValue& aValue) >+{ >+ if (ParseVariant(aValue, VARIANT_HK, nsCSSProps::kUnicodeBidiKTable)) { >+ if (eCSSUnit_Enumerated == aValue.GetUnit()) { >+ PRInt32 intValue = aValue.GetIntValue(); >+ if (intValue != NS_STYLE_UNICODE_BIDI_NORMAL) { >+ // look for more keywords >+ nsCSSValue keyword; >+ if (ParseEnum(keyword, nsCSSProps::kUnicodeBidiKTable)) { >+ PRInt32 newValue = keyword.GetIntValue(); >+ if (newValue == NS_STYLE_UNICODE_BIDI_NORMAL || >+ newValue & intValue) { >+ // 'none' keyword in conjuction with others is not allowed, and >+ // duplicate keyword is not allowed. >+ return PR_FALSE; >+ } >+ if ((newValue & NS_STYLE_UNICODE_BIDI_EMBEDDING_MASK) && >+ (intValue & NS_STYLE_UNICODE_BIDI_EMBEDDING_MASK)) { >+ // only one of 'embed' and 'isolate' is allowed >+ return PR_FALSE; >+ } >+ if ((newValue & NS_STYLE_UNICODE_BIDI_DIRECTION_MASK) && >+ (intValue & NS_STYLE_UNICODE_BIDI_DIRECTION_MASK)) { >+ // only one of 'bidi-override' and 'plaintext' is allowed >+ return PR_FALSE; >+ } >+ intValue |= newValue; >+ } >+ aValue.SetIntValue(intValue, eCSSUnit_Enumerated); >+ } >+ } >+ return PR_TRUE; >+ } >+ return PR_FALSE; >+} > > PRBool > CSSParserImpl::ParseTransitionProperty() > { > nsCSSValue value; > if (ParseVariant(value, VARIANT_INHERIT | VARIANT_NONE | VARIANT_ALL, > nsnull)) { > // 'inherit', 'initial', 'none', and 'all' must be alone >diff --git a/layout/style/nsCSSPropList.h b/layout/style/nsCSSPropList.h >--- a/layout/style/nsCSSPropList.h >+++ b/layout/style/nsCSSPropList.h >@@ -2291,18 +2291,19 @@ CSS_PROP_DISPLAY( > VARIANT_TIMING_FUNCTION, // used by list parsing > kTransitionTimingFunctionKTable, > CSS_PROP_NO_OFFSET, > eStyleAnimType_None) > CSS_PROP_TEXTRESET( > unicode-bidi, > unicode_bidi, > UnicodeBidi, >- CSS_PROPERTY_PARSE_VALUE, >- VARIANT_HK, >+ CSS_PROPERTY_PARSE_VALUE | >+ CSS_PROPERTY_VALUE_PARSER_FUNCTION, >+ 0, > kUnicodeBidiKTable, > CSS_PROP_NO_OFFSET, > eStyleAnimType_None) > CSS_PROP_USERINTERFACE( > -moz-user-focus, > user_focus, > CSS_PROP_DOMPROP_PREFIXED(UserFocus), > CSS_PROPERTY_PARSE_VALUE, >diff --git a/layout/style/nsCSSProps.cpp b/layout/style/nsCSSProps.cpp >--- a/layout/style/nsCSSProps.cpp >+++ b/layout/style/nsCSSProps.cpp >@@ -1264,16 +1264,18 @@ const PRInt32 nsCSSProps::kTransitionTim > eCSSKeyword_ease_in_out, NS_STYLE_TRANSITION_TIMING_FUNCTION_EASE_IN_OUT, > eCSSKeyword_UNKNOWN,-1 > }; > > const PRInt32 nsCSSProps::kUnicodeBidiKTable[] = { > eCSSKeyword_normal, NS_STYLE_UNICODE_BIDI_NORMAL, > eCSSKeyword_embed, NS_STYLE_UNICODE_BIDI_EMBED, > eCSSKeyword_bidi_override, NS_STYLE_UNICODE_BIDI_OVERRIDE, >+ eCSSKeyword__moz_isolate, NS_STYLE_UNICODE_BIDI_MOZ_ISOLATE, >+ eCSSKeyword__moz_plaintext, NS_STYLE_UNICODE_BIDI_MOZ_PLAINTEXT, > eCSSKeyword_UNKNOWN,-1 > }; > > const PRInt32 nsCSSProps::kUserFocusKTable[] = { > eCSSKeyword_none, NS_STYLE_USER_FOCUS_NONE, > eCSSKeyword_normal, NS_STYLE_USER_FOCUS_NORMAL, > eCSSKeyword_ignore, NS_STYLE_USER_FOCUS_IGNORE, > eCSSKeyword_select_all, NS_STYLE_USER_FOCUS_SELECT_ALL, >diff --git a/layout/style/nsCSSValue.cpp b/layout/style/nsCSSValue.cpp >--- a/layout/style/nsCSSValue.cpp >+++ b/layout/style/nsCSSValue.cpp >@@ -805,16 +805,29 @@ nsCSSValue::AppendToString(nsCSSProperty > aResult); > } else { > nsStyleUtil::AppendBitmaskCSSValue(aProperty, intValue, > NS_STYLE_PAGE_MARKS_CROP, > NS_STYLE_PAGE_MARKS_REGISTER, > aResult); > } > } >+ else if (eCSSProperty_unicode_bidi == aProperty) { >+ PRInt32 intValue = GetIntValue(); >+ if (NS_STYLE_UNICODE_BIDI_NORMAL == intValue) { >+ AppendASCIItoUTF16(nsCSSProps::LookupPropertyValue(aProperty, intValue), >+ aResult); >+ } else { >+ nsStyleUtil::AppendBitmaskCSSValue( >+ aProperty, intValue, >+ NS_STYLE_UNICODE_BIDI_EMBED, >+ NS_STYLE_UNICODE_BIDI_MOZ_PLAINTEXT, >+ aResult); >+ } >+ } > else { > const nsAFlatCString& name = nsCSSProps::LookupPropertyValue(aProperty, GetIntValue()); > AppendASCIItoUTF16(name, aResult); > } > } > else if (eCSSUnit_EnumColor == unit) { > // we can lookup the property in the ColorTable and then > // get a string mapping the name >diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp >--- a/layout/style/nsComputedDOMStyle.cpp >+++ b/layout/style/nsComputedDOMStyle.cpp >@@ -2423,19 +2423,29 @@ nsComputedDOMStyle::DoGetDirection() > nsCSSProps::kDirectionKTable)); > return val; > } > > nsIDOMCSSValue* > nsComputedDOMStyle::DoGetUnicodeBidi() > { > nsROCSSPrimitiveValue *val = GetROCSSPrimitiveValue(); >- val->SetIdent( >- nsCSSProps::ValueToKeywordEnum(GetStyleTextReset()->mUnicodeBidi, >- nsCSSProps::kUnicodeBidiKTable)); >+ PRInt32 intValue = GetStyleTextReset()->mUnicodeBidi; >+ >+ if (NS_STYLE_UNICODE_BIDI_NORMAL == intValue) { >+ val->SetIdent(eCSSKeyword_normal); >+ } else { >+ nsAutoString unicodeBidiString; >+ nsStyleUtil::AppendBitmaskCSSValue(eCSSProperty_unicode_bidi, intValue, >+ NS_STYLE_UNICODE_BIDI_EMBED, >+ NS_STYLE_UNICODE_BIDI_MOZ_PLAINTEXT, >+ unicodeBidiString); >+ val->SetString(unicodeBidiString); >+ } >+ > return val; > } > > nsIDOMCSSValue* > nsComputedDOMStyle::DoGetCursor() > { > nsDOMCSSValueList *valueList = GetROCSSValueList(PR_TRUE); > >diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js >--- a/layout/style/test/property_database.js >+++ b/layout/style/test/property_database.js >@@ -2644,18 +2644,18 @@ var gCSSProperties = { > other_values: [ "linear", "ease-in", "ease-out", "ease-in-out", "linear, ease-in, cubic-bezier(0.1, 0.2, 0.8, 0.9)", "cubic-bezier(0.5, 0.5, 0.5, 0.5)", "cubic-bezier(0.25, 1.5, 0.75, -0.5)" ], > invalid_values: [ "none", "auto", "cubic-bezier(0.25, 0.1, 0.25)", "cubic-bezier(0.25, 0.1, 0.25, 0.25, 1.0)", "cubic-bezier(-0.5, 0.5, 0.5, 0.5)", "cubic-bezier(1.5, 0.5, 0.5, 0.5)", "cubic-bezier(0.5, 0.5, -0.5, 0.5)", "cubic-bezier(0.5, 0.5, 1.5, 0.5)" ] > }, > "unicode-bidi": { > domProp: "unicodeBidi", > inherited: false, > type: CSS_TYPE_LONGHAND, > initial_values: [ "normal" ], >- other_values: [ "embed", "bidi-override" ], >- invalid_values: [ "auto", "none" ] >+ other_values: [ "embed", "bidi-override", "-moz-isolate", "-moz-plaintext", "-moz-isolate bidi-override", "-moz-plaintext embed" ], >+ invalid_values: [ "auto", "none", "normal embed", "normal bidi-override", "embed -moz-isolate", "bidi-override -moz-plaintext", "-moz-isolate embed", "embed normal" ] > }, > "vertical-align": { > domProp: "verticalAlign", > inherited: false, > type: CSS_TYPE_LONGHAND, > initial_values: [ "baseline" ], > other_values: [ "sub", "super", "top", "text-top", "middle", "bottom", "text-bottom", "15%", "3px", "0.2em", "-5px", "-3%", > "-moz-calc(2px)", >diff --git a/layout/svg/base/src/nsSVGGlyphFrame.cpp b/layout/svg/base/src/nsSVGGlyphFrame.cpp >--- a/layout/svg/base/src/nsSVGGlyphFrame.cpp >+++ b/layout/svg/base/src/nsSVGGlyphFrame.cpp >@@ -1555,17 +1555,17 @@ nsSVGGlyphFrame::EnsureTextRun(float *aD > * new text chunk, so we always set the base direction according to the > * direction property > * > * See also XXXsmontagu comments in nsSVGTextFrame::UpdateGlyphPositioning > */ > > // Get the unicodeBidi property from the parent, because it doesn't > // inherit >- PRBool bidiOverride = (mParent->GetStyleTextReset()->mUnicodeBidi == >+ PRBool bidiOverride = (mParent->GetStyleTextReset()->mUnicodeBidi & > NS_STYLE_UNICODE_BIDI_OVERRIDE); > nsBidiLevel baseDirection = > GetStyleVisibility()->mDirection == NS_STYLE_DIRECTION_RTL ? > NSBIDI_RTL : NSBIDI_LTR; > nsBidiPresUtils::CopyLogicalToVisual(text, visualText, > baseDirection, bidiOverride); > if (!visualText.IsEmpty()) { > text = visualText;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
Flags:
dbaron
: review-
Actions:
View
|
Diff
|
Review
Attachments on
bug 613149
:
525110
|
525114
|
525116
|
536698
|
537430
|
555742
|
555776
|
555958
|
555962