| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) |
| 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) | 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) |
| 5 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
| 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
| 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> |
| 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
| 9 * | 9 * |
| 10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 #include "CSSStyleSheet.h" | 45 #include "CSSStyleSheet.h" |
| 46 #include "CSSTimingFunctionValue.h" | 46 #include "CSSTimingFunctionValue.h" |
| 47 #include "CSSValueList.h" | 47 #include "CSSValueList.h" |
| 48 #include "CSSVariableDependentValue.h" | 48 #include "CSSVariableDependentValue.h" |
| 49 #include "CSSVariablesDeclaration.h" | 49 #include "CSSVariablesDeclaration.h" |
| 50 #include "CSSVariablesRule.h" | 50 #include "CSSVariablesRule.h" |
| 51 #include "CachedImage.h" | 51 #include "CachedImage.h" |
| 52 #include "Counter.h" | 52 #include "Counter.h" |
| 53 #include "CounterContent.h" | 53 #include "CounterContent.h" |
| 54 #include "FocusController.h" | 54 #include "FocusController.h" |
| 55 #include "FontCache.h" | |
| 56 #include "FontFamilyValue.h" | 55 #include "FontFamilyValue.h" |
| 57 #include "FontValue.h" | 56 #include "FontValue.h" |
| 58 #include "Frame.h" | 57 #include "Frame.h" |
| 59 #include "FrameView.h" | 58 #include "FrameView.h" |
| 60 #include "HTMLDocument.h" | 59 #include "HTMLDocument.h" |
| 61 #include "HTMLElement.h" | 60 #include "HTMLElement.h" |
| 62 #include "HTMLInputElement.h" | 61 #include "HTMLInputElement.h" |
| 63 #include "HTMLNames.h" | 62 #include "HTMLNames.h" |
| 64 #include "HTMLTextAreaElement.h" | 63 #include "HTMLTextAreaElement.h" |
| 65 #include "LinkHash.h" | 64 #include "LinkHash.h" |
| (...skipping 2742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2808 if (directives.m_increment) | 2807 if (directives.m_increment) |
| 2809 directives.m_incrementValue += value; | 2808 directives.m_incrementValue += value; |
| 2810 else { | 2809 else { |
| 2811 directives.m_increment = true; | 2810 directives.m_increment = true; |
| 2812 directives.m_incrementValue = value; | 2811 directives.m_incrementValue = value; |
| 2813 } | 2812 } |
| 2814 } | 2813 } |
| 2815 } | 2814 } |
| 2816 } | 2815 } |
| 2817 | 2816 |
| 2818 struct ScriptFamilyState { | |
| 2819 bool isGenericAdded; | |
| 2820 bool isPerScriptGenericChecked; | |
| 2821 ScriptFamilyState() : isGenericAdded(false), isPerScriptGenericChecked(false) | |
| 2822 {} | |
| 2823 }; | |
| 2824 | |
| 2825 inline static void handleScriptFamily(const char* webkitFamily, UScriptCode scri
pt, | |
| 2826 FontDescription::GenericFamilyType generic
, | |
| 2827 AtomicString& face, ScriptFamilyState& sta
te, FontDescription& fontDescription, | |
| 2828 int& familyIndex) | |
| 2829 { | |
| 2830 if (!state.isGenericAdded) { | |
| 2831 face = webkitFamily; | |
| 2832 state.isGenericAdded = true; | |
| 2833 fontDescription.setGenericFamily(generic); | |
| 2834 // go through this once more to add per-script generic family. | |
| 2835 --familyIndex; | |
| 2836 } else if (!state.isPerScriptGenericChecked) { | |
| 2837 face = FontCache::getGenericFontForScript(script, fontDescription); | |
| 2838 state.isPerScriptGenericChecked = true; | |
| 2839 } | |
| 2840 } | |
| 2841 | |
| 2842 void CSSStyleSelector::applyPropertyToStyle(int id, CSSValue *value, RenderStyle
* style) | 2817 void CSSStyleSelector::applyPropertyToStyle(int id, CSSValue *value, RenderStyle
* style) |
| 2843 { | 2818 { |
| 2844 initElementAndPseudoState(0); | 2819 initElementAndPseudoState(0); |
| 2845 initForStyleResolve(0, style); | 2820 initForStyleResolve(0, style); |
| 2846 m_style = style; | 2821 m_style = style; |
| 2847 applyProperty(id, value); | 2822 applyProperty(id, value); |
| 2848 } | 2823 } |
| 2849 | 2824 |
| 2850 void CSSStyleSelector::applyProperty(int id, CSSValue *value) | 2825 void CSSStyleSelector::applyProperty(int id, CSSValue *value) |
| 2851 { | 2826 { |
| (...skipping 1252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4104 FontDescription fontDescription = m_style->fontDescription(); | 4079 FontDescription fontDescription = m_style->fontDescription(); |
| 4105 CSSValueList *list = static_cast<CSSValueList*>(value); | 4080 CSSValueList *list = static_cast<CSSValueList*>(value); |
| 4106 int len = list->length(); | 4081 int len = list->length(); |
| 4107 FontFamily& firstFamily = fontDescription.firstFamily(); | 4082 FontFamily& firstFamily = fontDescription.firstFamily(); |
| 4108 FontFamily *currFamily = 0; | 4083 FontFamily *currFamily = 0; |
| 4109 | 4084 |
| 4110 // Before mapping in a new font-family property, we should reset the gen
eric family. | 4085 // Before mapping in a new font-family property, we should reset the gen
eric family. |
| 4111 bool oldFamilyIsMonospace = fontDescription.genericFamily() == FontDescr
iption::MonospaceFamily; | 4086 bool oldFamilyIsMonospace = fontDescription.genericFamily() == FontDescr
iption::MonospaceFamily; |
| 4112 fontDescription.setGenericFamily(FontDescription::NoFamily); | 4087 fontDescription.setGenericFamily(FontDescription::NoFamily); |
| 4113 | 4088 |
| 4114 // |script| is used to add a font per script and per CSS generic family.
| |
| 4115 // Adding it here is not very efficient because we may never use it | |
| 4116 // if all the characters are covered by fonts specified for this element
. | |
| 4117 // TODO(jungshik): Currently, it's document-wide constant inferred from | |
| 4118 // the document charset, but we should infer it from the value of | |
| 4119 // xml:lang or lang for |m_element|. | |
| 4120 UScriptCode script = m_checker.m_document->dominantScript(); | |
| 4121 // serif, sans-serif, cursive, fantasy, monospace | |
| 4122 ScriptFamilyState scriptFamilyStates[5]; | |
| 4123 Settings* settings = m_checker.m_document->settings(); | |
| 4124 for (int i = 0; i < len; i++) { | 4089 for (int i = 0; i < len; i++) { |
| 4125 CSSValue *item = list->itemWithoutBoundsCheck(i); | 4090 CSSValue *item = list->itemWithoutBoundsCheck(i); |
| 4126 if (!item->isPrimitiveValue()) continue; | 4091 if (!item->isPrimitiveValue()) continue; |
| 4127 CSSPrimitiveValue *val = static_cast<CSSPrimitiveValue*>(item); | 4092 CSSPrimitiveValue *val = static_cast<CSSPrimitiveValue*>(item); |
| 4128 AtomicString face; | 4093 AtomicString face; |
| 4094 Settings* settings = m_checker.m_document->settings(); |
| 4129 if (val->primitiveType() == CSSPrimitiveValue::CSS_STRING) | 4095 if (val->primitiveType() == CSSPrimitiveValue::CSS_STRING) |
| 4130 face = static_cast<FontFamilyValue*>(val)->familyName(); | 4096 face = static_cast<FontFamilyValue*>(val)->familyName(); |
| 4131 else if (val->primitiveType() == CSSPrimitiveValue::CSS_IDENT && set
tings) { | 4097 else if (val->primitiveType() == CSSPrimitiveValue::CSS_IDENT && set
tings) { |
| 4132 switch (val->getIdent()) { | 4098 switch (val->getIdent()) { |
| 4133 case CSSValueWebkitBody: | 4099 case CSSValueWebkitBody: |
| 4134 face = settings->standardFontFamily(); | 4100 face = settings->standardFontFamily(); |
| 4135 break; | 4101 break; |
| 4136 // For each of 5 CSS generic families, | |
| 4137 // we add '-webkit-FOO' and a per-script generic family. | |
| 4138 // When |Settings| becomes expressive enough to support | |
| 4139 // per-script&per-generic family and we have a UI for | |
| 4140 // that, we'd just add the latter. Even without that, | |
| 4141 // I'm tempted to add per-script generic first, but I can't. | |
| 4142 // If I did, our font-selection UI would be all but | |
| 4143 // non-functional. Another issue is that we're adding | |
| 4144 // these fonts without regard for actual need in page | |
| 4145 // rendering. That is, it's not done in a lazy manner. | |
| 4146 // Somewhere in getGlyphDataForCharacter() could be | |
| 4147 // a better place in terms of performance. | |
| 4148 // See https://bugs.webkit.org/show_bug.cgi?id=18085 | |
| 4149 // and http://bugs.webkit.org/show_bug.cgi?id=10874 | |
| 4150 case CSSValueSerif: | 4102 case CSSValueSerif: |
| 4151 handleScriptFamily("-webkit-serif", script, | 4103 face = "-webkit-serif"; |
| 4152 FontDescription::SerifFamily, face, | 4104 fontDescription.setGenericFamily(FontDescription::SerifF
amily); |
| 4153 scriptFamilyStates[0], fontDescription, i); | |
| 4154 break; | 4105 break; |
| 4155 case CSSValueSansSerif: | 4106 case CSSValueSansSerif: |
| 4156 handleScriptFamily("-webkit-sans-serif", script, | 4107 face = "-webkit-sans-serif"; |
| 4157 FontDescription::SansSerifFamily, face, | 4108 fontDescription.setGenericFamily(FontDescription::SansSe
rifFamily); |
| 4158 scriptFamilyStates[1], fontDescription, i); | |
| 4159 break; | 4109 break; |
| 4160 case CSSValueCursive: | 4110 case CSSValueCursive: |
| 4161 handleScriptFamily("-webkit-cursive", script, | 4111 face = "-webkit-cursive"; |
| 4162 FontDescription::CursiveFamily, face, | 4112 fontDescription.setGenericFamily(FontDescription::Cursiv
eFamily); |
| 4163 scriptFamilyStates[2], fontDescription, i); | |
| 4164 break; | 4113 break; |
| 4165 case CSSValueFantasy: | 4114 case CSSValueFantasy: |
| 4166 handleScriptFamily("-webkit-fantasy", script, | 4115 face = "-webkit-fantasy"; |
| 4167 FontDescription::FantasyFamily, face, | 4116 fontDescription.setGenericFamily(FontDescription::Fantas
yFamily); |
| 4168 scriptFamilyStates[3], fontDescription, i); | |
| 4169 break; | 4117 break; |
| 4170 case CSSValueMonospace: | 4118 case CSSValueMonospace: |
| 4171 handleScriptFamily("-webkit-monospace", script, | 4119 face = "-webkit-monospace"; |
| 4172 FontDescription::MonospaceFamily, face, | 4120 fontDescription.setGenericFamily(FontDescription::Monosp
aceFamily); |
| 4173 scriptFamilyStates[4], fontDescription, i); | |
| 4174 break; | 4121 break; |
| 4175 } | 4122 } |
| 4176 } | 4123 } |
| 4177 | 4124 |
| 4178 if (!face.isEmpty()) { | 4125 if (!face.isEmpty()) { |
| 4179 if (!currFamily) { | 4126 if (!currFamily) { |
| 4180 // Filling in the first family. | 4127 // Filling in the first family. |
| 4181 firstFamily.setFamily(face); | 4128 firstFamily.setFamily(face); |
| 4182 currFamily = &firstFamily; | 4129 currFamily = &firstFamily; |
| 4183 } | 4130 } |
| 4184 else { | 4131 else { |
| 4185 RefPtr<SharedFontFamily> newFamily = SharedFontFamily::creat
e(); | 4132 RefPtr<SharedFontFamily> newFamily = SharedFontFamily::creat
e(); |
| 4186 newFamily->setFamily(face); | 4133 newFamily->setFamily(face); |
| 4187 currFamily->appendFamily(newFamily); | 4134 currFamily->appendFamily(newFamily); |
| 4188 currFamily = newFamily.get(); | 4135 currFamily = newFamily.get(); |
| 4189 } | 4136 } |
| 4190 | 4137 |
| 4191 if (fontDescription.keywordSize() && (fontDescription.genericFam
ily() == FontDescription::MonospaceFamily) != oldFamilyIsMonospace) | 4138 if (fontDescription.keywordSize() && (fontDescription.genericFam
ily() == FontDescription::MonospaceFamily) != oldFamilyIsMonospace) |
| 4192 setFontSize(fontDescription, fontSizeForKeyword(CSSValueXxSm
all + fontDescription.keywordSize() - 1, m_style->htmlHacks(), !oldFamilyIsMonos
pace)); | 4139 setFontSize(fontDescription, fontSizeForKeyword(CSSValueXxSm
all + fontDescription.keywordSize() - 1, m_style->htmlHacks(), !oldFamilyIsMonos
pace)); |
| 4193 | 4140 |
| 4194 if (m_style->setFontDescription(fontDescription)) | 4141 if (m_style->setFontDescription(fontDescription)) |
| 4195 m_fontDirty = true; | 4142 m_fontDirty = true; |
| 4196 } | 4143 } |
| 4197 } | 4144 } |
| 4198 | |
| 4199 if (fontDescription.genericFamily() == FontDescription::NoFamily && curr
Family) { | |
| 4200 FontDescription::GenericFamilyType generic; | |
| 4201 // TODO(jungshik) : Perhaps, we'd better add isStandardSerif() | |
| 4202 // method to |Settings| which will be set via WebPreference. | |
| 4203 if (settings) { | |
| 4204 if (settings->serifFontFamily() == settings->standardFontFamily(
)) | |
| 4205 generic = FontDescription::SerifFamily ; | |
| 4206 else | |
| 4207 generic = FontDescription::SansSerifFamily; | |
| 4208 } else | |
| 4209 generic = FontDescription::StandardFamily; | |
| 4210 fontDescription.setGenericFamily(generic); | |
| 4211 AtomicString face = FontCache::getGenericFontForScript(script, fontD
escription); | |
| 4212 if (!face.isEmpty()) { | |
| 4213 RefPtr<SharedFontFamily> newFamily = SharedFontFamily::create(); | |
| 4214 newFamily->setFamily(face); | |
| 4215 currFamily->appendFamily(newFamily); | |
| 4216 currFamily = newFamily.get(); | |
| 4217 if (m_style->setFontDescription(fontDescription)) | |
| 4218 m_fontDirty = true; | |
| 4219 } | |
| 4220 } | |
| 4221 return; | 4145 return; |
| 4222 } | 4146 } |
| 4223 case CSSPropertyTextDecoration: { | 4147 case CSSPropertyTextDecoration: { |
| 4224 // list of ident | 4148 // list of ident |
| 4225 HANDLE_INHERIT_AND_INITIAL(textDecoration, TextDecoration) | 4149 HANDLE_INHERIT_AND_INITIAL(textDecoration, TextDecoration) |
| 4226 int t = RenderStyle::initialTextDecoration(); | 4150 int t = RenderStyle::initialTextDecoration(); |
| 4227 if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) { | 4151 if (primitiveValue && primitiveValue->getIdent() == CSSValueNone) { |
| 4228 // do nothing | 4152 // do nothing |
| 4229 } else { | 4153 } else { |
| 4230 if (!value->isValueList()) return; | 4154 if (!value->isValueList()) return; |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4436 setFontSize(fontDescription, fontSizeForKeyword(CSSValueMedium, m_st
yle->htmlHacks(), false)); | 4360 setFontSize(fontDescription, fontSizeForKeyword(CSSValueMedium, m_st
yle->htmlHacks(), false)); |
| 4437 m_style->setLineHeight(RenderStyle::initialLineHeight()); | 4361 m_style->setLineHeight(RenderStyle::initialLineHeight()); |
| 4438 m_lineHeightValue = 0; | 4362 m_lineHeightValue = 0; |
| 4439 if (m_style->setFontDescription(fontDescription)) | 4363 if (m_style->setFontDescription(fontDescription)) |
| 4440 m_fontDirty = true; | 4364 m_fontDirty = true; |
| 4441 } else if (primitiveValue) { | 4365 } else if (primitiveValue) { |
| 4442 m_style->setLineHeight(RenderStyle::initialLineHeight()); | 4366 m_style->setLineHeight(RenderStyle::initialLineHeight()); |
| 4443 m_lineHeightValue = 0; | 4367 m_lineHeightValue = 0; |
| 4444 | 4368 |
| 4445 FontDescription fontDescription; | 4369 FontDescription fontDescription; |
| 4446 theme()->systemFont(primitiveValue->getIdent(), m_checker.m_document
, fontDescription); | 4370 theme()->systemFont(primitiveValue->getIdent(), fontDescription); |
| 4447 | 4371 |
| 4448 // Double-check and see if the theme did anything. If not, don't bo
ther updating the font. | 4372 // Double-check and see if the theme did anything. If not, don't bo
ther updating the font. |
| 4449 if (fontDescription.isAbsoluteSize()) { | 4373 if (fontDescription.isAbsoluteSize()) { |
| 4450 // Make sure the rendering mode and printer font settings are up
dated. | 4374 // Make sure the rendering mode and printer font settings are up
dated. |
| 4451 Settings* settings = m_checker.m_document->settings(); | 4375 Settings* settings = m_checker.m_document->settings(); |
| 4452 ASSERT(settings); // If we're doing style resolution, this docum
ent should always be in a frame and thus have settings | 4376 ASSERT(settings); // If we're doing style resolution, this docum
ent should always be in a frame and thus have settings |
| 4453 if (!settings) | 4377 if (!settings) |
| 4454 return; | 4378 return; |
| 4455 fontDescription.setRenderingMode(settings->fontRenderingMode()); | 4379 fontDescription.setRenderingMode(settings->fontRenderingMode()); |
| 4456 fontDescription.setUsePrinterFont(m_checker.m_document->printing
()); | 4380 fontDescription.setUsePrinterFont(m_checker.m_document->printing
()); |
| (...skipping 1759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6216 ASSERT_NOT_REACHED(); | 6140 ASSERT_NOT_REACHED(); |
| 6217 break; | 6141 break; |
| 6218 } | 6142 } |
| 6219 } | 6143 } |
| 6220 } | 6144 } |
| 6221 outOperations = operations; | 6145 outOperations = operations; |
| 6222 return true; | 6146 return true; |
| 6223 } | 6147 } |
| 6224 | 6148 |
| 6225 } // namespace WebCore | 6149 } // namespace WebCore |
| OLD | NEW |