Title: [99070] trunk/Tools
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;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to