- Revision
- 99070
- Author
- [email protected]
- Date
- 2011-11-02 09:40:47 -0700 (Wed, 02 Nov 2011)
Log Message
[chromium] Add per-script font preferences support in overridePreference
https://bugs.webkit.org/show_bug.cgi?id=71110
This allows a layout test to do something like:
// Set standard font for Arabic to Ahem.
overridePreference("WebKitStandardFontMap", [ "Arab", "Ahem" ]);
This should make writing a layout test for per-script fonts easier.
This change only affects the Chromium DumpRenderTree, but the other
platforms should probably also have a similar change eventually.
Patch by Matt Falkenhagen <[email protected]> on 2011-11-02
Reviewed by Tony Chang.
* DumpRenderTree/chromium/LayoutTestController.cpp: add per-script
font preferences to overridePreference
(LayoutTestController::cppVariantToWebStringArray):
(setFontMap):
(LayoutTestController::overridePreference):
* DumpRenderTree/chromium/LayoutTestController.h:
* DumpRenderTree/chromium/WebPreferences.cpp:
(setStandardFontFamilyWrapper):
(setFixedFontFamilyWrapper):
(setSerifFontFamilyWrapper):
(setSansSerifFontFamilyWrapper):
(setCursiveFontFamilyWrapper):
(setFantasyFontFamilyWrapper):
(applyFontMap):
(WebPreferences::applyTo):
* DumpRenderTree/chromium/WebPreferences.h: add per-script font
preference members
(WebPreferences::UScriptCodeHashTraits::emptyValue):
(WebPreferences::UScriptCodeHashTraits::constructDeletedValue):
(WebPreferences::UScriptCodeHashTraits::isDeletedValue):
Modified Paths
Diff
Modified: trunk/Tools/ChangeLog (99069 => 99070)
--- trunk/Tools/ChangeLog 2011-11-02 16:40:31 UTC (rev 99069)
+++ trunk/Tools/ChangeLog 2011-11-02 16:40:47 UTC (rev 99070)
@@ -1,3 +1,41 @@
+2011-11-02 Matt Falkenhagen <[email protected]>
+
+ [chromium] Add per-script font preferences support in overridePreference
+ https://bugs.webkit.org/show_bug.cgi?id=71110
+
+ This allows a layout test to do something like:
+
+ // Set standard font for Arabic to Ahem.
+ overridePreference("WebKitStandardFontMap", [ "Arab", "Ahem" ]);
+
+ This should make writing a layout test for per-script fonts easier.
+
+ This change only affects the Chromium DumpRenderTree, but the other
+ platforms should probably also have a similar change eventually.
+
+ Reviewed by Tony Chang.
+
+ * DumpRenderTree/chromium/LayoutTestController.cpp: add per-script
+ font preferences to overridePreference
+ (LayoutTestController::cppVariantToWebStringArray):
+ (setFontMap):
+ (LayoutTestController::overridePreference):
+ * DumpRenderTree/chromium/LayoutTestController.h:
+ * DumpRenderTree/chromium/WebPreferences.cpp:
+ (setStandardFontFamilyWrapper):
+ (setFixedFontFamilyWrapper):
+ (setSerifFontFamilyWrapper):
+ (setSansSerifFontFamilyWrapper):
+ (setCursiveFontFamilyWrapper):
+ (setFantasyFontFamilyWrapper):
+ (applyFontMap):
+ (WebPreferences::applyTo):
+ * DumpRenderTree/chromium/WebPreferences.h: add per-script font
+ preference members
+ (WebPreferences::UScriptCodeHashTraits::emptyValue):
+ (WebPreferences::UScriptCodeHashTraits::constructDeletedValue):
+ (WebPreferences::UScriptCodeHashTraits::isDeletedValue):
+
2011-11-02 Elliot Poger <[email protected]>
until use_skia=1 by default on mac, default port should be chromium-cg-mac
Modified: trunk/Tools/DumpRenderTree/chromium/LayoutTestController.cpp (99069 => 99070)
--- trunk/Tools/DumpRenderTree/chromium/LayoutTestController.cpp 2011-11-02 16:40:31 UTC (rev 99069)
+++ trunk/Tools/DumpRenderTree/chromium/LayoutTestController.cpp 2011-11-02 16:40:47 UTC (rev 99070)
@@ -1386,6 +1386,36 @@
return WebString::fromUTF8(value.toString());
}
+Vector<WebString> LayoutTestController::cppVariantToWebStringArray(const CppVariant& value)
+{
+ if (!value.isObject()) {
+ logErrorToConsole("Invalid value for preference. Expected object value.");
+ return Vector<WebString>();
+ }
+ Vector<WebString> resultVector;
+ Vector<string> stringVector = value.toStringVector();
+ for (size_t i = 0; i < stringVector.size(); ++i)
+ resultVector.append(WebString::fromUTF8(stringVector[i].c_str()));
+ return resultVector;
+}
+
+// Sets map based on scriptFontPairs, a collapsed vector of pairs of ISO 15924
+// four-letter script code and font such as:
+// { "Arab", "My Arabic Font", "Grek", "My Greek Font" }
+static void setFontMap(WebPreferences::ScriptFontFamilyMap& map, const Vector<WebString>& scriptFontPairs)
+{
+ map.clear();
+ size_t i = 0;
+ while (i + 1 < scriptFontPairs.size()) {
+ const WebString& script = scriptFontPairs[i++];
+ const WebString& font = scriptFontPairs[i++];
+
+ int32_t code = u_getPropertyValueEnum(UCHAR_SCRIPT, script.utf8().data());
+ if (code >= 0 && code < USCRIPT_CODE_LIMIT)
+ map.set(static_cast<int>(code), font);
+ }
+}
+
void LayoutTestController::overridePreference(const CppArgumentList& arguments, CppVariant* result)
{
result->setNull();
@@ -1407,6 +1437,18 @@
prefs->cursiveFontFamily = cppVariantToWebString(value);
else if (key == "WebKitFantasyFont")
prefs->fantasyFontFamily = cppVariantToWebString(value);
+ else if (key == "WebKitStandardFontMap")
+ setFontMap(prefs->standardFontMap, cppVariantToWebStringArray(value));
+ else if (key == "WebKitFixedFontMap")
+ setFontMap(prefs->fixedFontMap, cppVariantToWebStringArray(value));
+ else if (key == "WebKitSerifFontMap")
+ setFontMap(prefs->serifFontMap, cppVariantToWebStringArray(value));
+ else if (key == "WebKitSansSerifFontMap")
+ setFontMap(prefs->sansSerifFontMap, cppVariantToWebStringArray(value));
+ else if (key == "WebKitCursiveFontMap")
+ setFontMap(prefs->cursiveFontMap, cppVariantToWebStringArray(value));
+ else if (key == "WebKitFantasyFontMap")
+ setFontMap(prefs->fantasyFontMap, cppVariantToWebStringArray(value));
else if (key == "WebKitDefaultFontSize")
prefs->defaultFontSize = cppVariantToInt32(value);
else if (key == "WebKitDefaultFixedFontSize")
Modified: trunk/Tools/DumpRenderTree/chromium/LayoutTestController.h (99069 => 99070)
--- trunk/Tools/DumpRenderTree/chromium/LayoutTestController.h 2011-11-02 16:40:31 UTC (rev 99069)
+++ trunk/Tools/DumpRenderTree/chromium/LayoutTestController.h 2011-11-02 16:40:47 UTC (rev 99070)
@@ -524,6 +524,7 @@
bool cppVariantToBool(const CppVariant&);
int32_t cppVariantToInt32(const CppVariant&);
WebKit::WebString cppVariantToWebString(const CppVariant&);
+ Vector<WebKit::WebString> cppVariantToWebStringArray(const CppVariant&);
void logErrorToConsole(const std::string&);
void completeNotifyDone(bool isTimeout);
Modified: trunk/Tools/DumpRenderTree/chromium/WebPreferences.cpp (99069 => 99070)
--- trunk/Tools/DumpRenderTree/chromium/WebPreferences.cpp 2011-11-02 16:40:31 UTC (rev 99069)
+++ trunk/Tools/DumpRenderTree/chromium/WebPreferences.cpp 2011-11-02 16:40:47 UTC (rev 99070)
@@ -117,16 +117,64 @@
hixie76WebSocketProtocolEnabled = true;
}
+static void setStandardFontFamilyWrapper(WebSettings* settings, const WebKit::WebString& font, UScriptCode script)
+{
+ settings->setStandardFontFamily(font, script);
+}
+
+static void setFixedFontFamilyWrapper(WebSettings* settings, const WebKit::WebString& font, UScriptCode script)
+{
+ settings->setFixedFontFamily(font, script);
+}
+
+static void setSerifFontFamilyWrapper(WebSettings* settings, const WebKit::WebString& font, UScriptCode script)
+{
+ settings->setSerifFontFamily(font, script);
+}
+
+static void setSansSerifFontFamilyWrapper(WebSettings* settings, const WebKit::WebString& font, UScriptCode script)
+{
+ settings->setSansSerifFontFamily(font, script);
+}
+
+static void setCursiveFontFamilyWrapper(WebSettings* settings, const WebKit::WebString& font, UScriptCode script)
+{
+ settings->setCursiveFontFamily(font, script);
+}
+
+static void setFantasyFontFamilyWrapper(WebSettings* settings, const WebKit::WebString& font, UScriptCode script)
+{
+ settings->setFantasyFontFamily(font, script);
+}
+
+typedef void (*SetFontFamilyWrapper)(WebSettings*, const WebString&, UScriptCode);
+
+static void applyFontMap(WebSettings* settings, const WebPreferences::ScriptFontFamilyMap& map, SetFontFamilyWrapper setter)
+{
+ for (WebPreferences::ScriptFontFamilyMap::const_iterator iter = map.begin(); iter != map.end(); ++iter) {
+ const WebString& font = iter->second;
+ if (!font.isNull() && !font.isEmpty())
+ (*setter)(settings, font, static_cast<UScriptCode>(iter->first));
+ }
+}
+
void WebPreferences::applyTo(WebView* webView)
{
WebSettings* settings = webView->settings();
- settings->setCursiveFontFamily(cursiveFontFamily);
- settings->setFantasyFontFamily(fantasyFontFamily);
- settings->setSerifFontFamily(serifFontFamily);
settings->setStandardFontFamily(standardFontFamily);
settings->setFixedFontFamily(fixedFontFamily);
+ settings->setSerifFontFamily(serifFontFamily);
settings->setSansSerifFontFamily(sansSerifFontFamily);
+ settings->setCursiveFontFamily(cursiveFontFamily);
+ settings->setFantasyFontFamily(fantasyFontFamily);
+ applyFontMap(settings, standardFontMap, setStandardFontFamilyWrapper);
+ applyFontMap(settings, fixedFontMap, setFixedFontFamilyWrapper);
+ applyFontMap(settings, serifFontMap, setSerifFontFamilyWrapper);
+ applyFontMap(settings, sansSerifFontMap, setSansSerifFontFamilyWrapper);
+ applyFontMap(settings, cursiveFontMap, setCursiveFontFamilyWrapper);
+ applyFontMap(settings, fantasyFontMap, setFantasyFontFamilyWrapper);
+
settings->setDefaultFontSize(defaultFontSize);
settings->setDefaultFixedFontSize(defaultFixedFontSize);
settings->setMinimumFontSize(minimumFontSize);
@@ -187,4 +235,3 @@
settings->setFullScreenEnabled(true);
settings->setValidationMessageTimerMagnification(-1);
}
-
Modified: trunk/Tools/DumpRenderTree/chromium/WebPreferences.h (99069 => 99070)
--- trunk/Tools/DumpRenderTree/chromium/WebPreferences.h 2011-11-02 16:40:31 UTC (rev 99069)
+++ trunk/Tools/DumpRenderTree/chromium/WebPreferences.h 2011-11-02 16:40:47 UTC (rev 99070)
@@ -34,19 +34,39 @@
#include "WebSettings.h"
#include "WebString.h"
#include "WebURL.h"
+#include <wtf/HashMap.h>
namespace WebKit {
class WebView;
}
struct WebPreferences {
- WebKit::WebString cursiveFontFamily;
- WebKit::WebString fantasyFontFamily;
- WebKit::WebString serifFontFamily;
WebKit::WebString standardFontFamily;
WebKit::WebString fixedFontFamily;
+ WebKit::WebString serifFontFamily;
WebKit::WebString sansSerifFontFamily;
+ WebKit::WebString cursiveFontFamily;
+ WebKit::WebString fantasyFontFamily;
+ // UScriptCode uses -1 and 0 for UScriptInvalidCode and UScriptCommon.
+ // We need to use -2 and -3 for empty value and deleted value.
+ // (See WebCore::ScriptFontFamilyMap)
+ struct UScriptCodeHashTraits : WTF::GenericHashTraits<int> {
+ static const bool emptyValueIsZero = false;
+ static int emptyValue() { return -2; }
+ static void constructDeletedValue(int& slot) { slot = -3; }
+ static bool isDeletedValue(int value) { return value == -3; }
+ };
+
+ // Map of UScriptCode to font such as USCRIPT_ARABIC to "My Arabic Font".
+ typedef HashMap<int, WebKit::WebString, DefaultHash<int>::Hash, UScriptCodeHashTraits> ScriptFontFamilyMap;
+ ScriptFontFamilyMap standardFontMap;
+ ScriptFontFamilyMap fixedFontMap;
+ ScriptFontFamilyMap serifFontMap;
+ ScriptFontFamilyMap sansSerifFontMap;
+ ScriptFontFamilyMap cursiveFontMap;
+ ScriptFontFamilyMap fantasyFontMap;
+
int defaultFontSize;
int defaultFixedFontSize;
int minimumFontSize;