[GTK] Add support for automatic hyphenation
authormrobinson@webkit.org <mrobinson@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 29 Apr 2015 22:46:15 +0000 (22:46 +0000)
committermrobinson@webkit.org <mrobinson@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 29 Apr 2015 22:46:15 +0000 (22:46 +0000)
https://bugs.webkit.org/show_bug.cgi?id=44478

Reviewed by Carlos Garcia Campos.

.:

* Source/cmake/FindHyphen.cmake: Added. A CMake module for finding libhyphen.
* Source/cmake/OptionsGTK.cmake: Look for libhyphen and enable hyphenation if found.
* Source/cmakeconfig.h.cmake: Pass through the whether libhyphen is enabled.

Source/WebCore:

No new tests. This patch unskips and updates results for existing hyphenation tests.

* PlatformGTK.cmake: Add the libhypen implementation to the source list.
* platform/gtk/GtkUtilities.cpp:
(WebCore::topLevelPath): Add this helper function taken from the test harness.
(WebCore::getWebKitBuildDirectory): Ditto.
* platform/gtk/GtkUtilities.h: Add function declarations for the helper functions.
* platform/text/Hyphenation.cpp: Surround this implementation with !USE(LIBHYPHEN),
  so that it can still be shared.
* platform/text/gtk/HyphenationLibHyphen.cpp: Added.
(WebCore::extractLocaleFromDictionaryFilePath): Take in a dictionary filename and
determine the locale that it covers.
(WebCore::scanDirectoryForDicionaries): Look for all installed dictionaries as well
as ones in the JHBuild root for testing.
(WebCore::scanTestDictionariesDirectoryIfNecessary): Try to scan the dictionaries installed
in the JHBuild root.
(WebCore::availableLocales): Getter for global hash of installed dictionaries.
(WebCore::canHyphenate): Added libhyphen implementation.
(WebCore::HyphenationDictionary): Helper class that properly manages the memory of
an open libhyphen dictionary. This is useful so that they can be stored in an MRU
cache. This is a similar approach to the CoreFoundation implementation.
(WebCore::AtomicStringKeyedMRUCache<RefPtr<HyphenationDictionary>>::createValueForNullKey): MRU cache
helper.
(WebCore::AtomicStringKeyedMRUCache<RefPtr<HyphenationDictionary>>::createValueForKey): Ditto.
(WebCore::hyphenDictionaryCache): A cache for opened hyphenation dictionaries.
(WebCore::countLeadingSpaces): Count leading spaces, since WebCore often passes words with them.
(WebCore::lastHyphenLocation): Added libhyphen implementation.

Tools:

* gtk/jhbuild.modules: Add a module for testing dictionaries, so that
all systems will use the same dictionaries for testing purposes.

LayoutTests:

* platform/gtk/TestExpectations: Unskip most hyphenation tests.
* platform/gtk/fast/text/hyphenate-character-expected.png: Added.
* platform/gtk/fast/text/hyphenate-character-expected.txt:
* platform/gtk/fast/text/hyphenate-first-word-expected.png: Added.
* platform/gtk/fast/text/hyphenate-first-word-expected.txt:
* platform/gtk/fast/text/hyphenate-limit-before-after-expected.png:
* platform/gtk/fast/text/hyphenate-limit-before-after-expected.txt:
* platform/gtk/fast/text/hyphenate-limit-lines-expected.png:
* platform/gtk/fast/text/hyphenate-limit-lines-expected.txt:
* platform/gtk/fast/text/hyphenate-locale-expected.png: Added.
* platform/gtk/fast/text/hyphenate-locale-expected.txt:
* platform/gtk/fast/text/hyphens-expected.png: Added.
* platform/gtk/fast/text/hyphens-expected.txt:
* platform/gtk/fast/text/word-break-soft-hyphen-expected.png:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@183584 268f45cc-cd09-0410-ab3c-d52691b4dbfc

26 files changed:
ChangeLog
LayoutTests/ChangeLog
LayoutTests/platform/gtk/TestExpectations
LayoutTests/platform/gtk/fast/text/hyphenate-character-expected.png [new file with mode: 0644]
LayoutTests/platform/gtk/fast/text/hyphenate-character-expected.txt
LayoutTests/platform/gtk/fast/text/hyphenate-first-word-expected.png [new file with mode: 0644]
LayoutTests/platform/gtk/fast/text/hyphenate-first-word-expected.txt
LayoutTests/platform/gtk/fast/text/hyphenate-limit-before-after-expected.png
LayoutTests/platform/gtk/fast/text/hyphenate-limit-before-after-expected.txt
LayoutTests/platform/gtk/fast/text/hyphenate-limit-lines-expected.png
LayoutTests/platform/gtk/fast/text/hyphenate-limit-lines-expected.txt
LayoutTests/platform/gtk/fast/text/hyphenate-locale-expected.png [new file with mode: 0644]
LayoutTests/platform/gtk/fast/text/hyphenate-locale-expected.txt
LayoutTests/platform/gtk/fast/text/hyphens-expected.png [new file with mode: 0644]
LayoutTests/platform/gtk/fast/text/hyphens-expected.txt
LayoutTests/platform/gtk/fast/text/word-break-soft-hyphen-expected.png
Source/WebCore/ChangeLog
Source/WebCore/PlatformGTK.cmake
Source/WebCore/platform/gtk/GtkUtilities.cpp
Source/WebCore/platform/gtk/GtkUtilities.h
Source/WebCore/platform/text/Hyphenation.cpp
Source/WebCore/platform/text/gtk/HyphenationLibHyphen.cpp [new file with mode: 0644]
Source/cmake/FindHyphen.cmake [new file with mode: 0644]
Source/cmake/OptionsGTK.cmake
Tools/ChangeLog
Tools/gtk/jhbuild.modules

index cf952a1..21af4ac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2015-04-29  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Add support for automatic hyphenation
+        https://bugs.webkit.org/show_bug.cgi?id=44478
+
+        Reviewed by Carlos Garcia Campos.
+
+        * Source/cmake/FindHyphen.cmake: Added. A CMake module for finding libhyphen.
+        * Source/cmake/OptionsGTK.cmake: Look for libhyphen and enable hyphenation if found.
+        * Source/cmakeconfig.h.cmake: Pass through the whether libhyphen is enabled.
+
 2015-04-29  Jake Nielsen  <jacob_nielsen@apple.com>
 
         Failure when building WebKit for appletvsimulator.
index b7eba5e..db49e2a 100644 (file)
@@ -1,3 +1,25 @@
+2015-04-29  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Add support for automatic hyphenation
+        https://bugs.webkit.org/show_bug.cgi?id=44478
+
+        Reviewed by Carlos Garcia Campos.
+
+        * platform/gtk/TestExpectations: Unskip most hyphenation tests.
+        * platform/gtk/fast/text/hyphenate-character-expected.png: Added.
+        * platform/gtk/fast/text/hyphenate-character-expected.txt:
+        * platform/gtk/fast/text/hyphenate-first-word-expected.png: Added.
+        * platform/gtk/fast/text/hyphenate-first-word-expected.txt:
+        * platform/gtk/fast/text/hyphenate-limit-before-after-expected.png:
+        * platform/gtk/fast/text/hyphenate-limit-before-after-expected.txt:
+        * platform/gtk/fast/text/hyphenate-limit-lines-expected.png:
+        * platform/gtk/fast/text/hyphenate-limit-lines-expected.txt:
+        * platform/gtk/fast/text/hyphenate-locale-expected.png: Added.
+        * platform/gtk/fast/text/hyphenate-locale-expected.txt:
+        * platform/gtk/fast/text/hyphens-expected.png: Added.
+        * platform/gtk/fast/text/hyphens-expected.txt:
+        * platform/gtk/fast/text/word-break-soft-hyphen-expected.png:
+
 2015-04-29  Zalan Bujtas  <zalan@apple.com>
 
         Simple line layout: Web process spins endlessly below layoutSimpleLines.
index d35591f..f8082b8 100644 (file)
@@ -1676,13 +1676,6 @@ webkit.org/b/53959 fast/dom/Window/window-resize.html [ Failure Timeout Pass ]
 # keygen element rendering is broken
 webkit.org/b/54136 http/tests/misc/submit-post-keygen.html [ Failure ]
 
-# [GTK] GTK+ does not support hyphenation
-webkit.org/b/44478 fast/text/hyphenate-character.html [ Skip ]
-webkit.org/b/44478 fast/text/hyphens.html [ Skip ]
-webkit.org/b/44478 fast/text/hyphenate-first-word.html [ Skip ]
-webkit.org/b/44478 fast/text/hyphenate-locale.html [ Skip ]
-webkit.org/b/44478 fast/text/hyphen-min-preferred-width.html [ Skip ]
-
 webkit.org/b/122021 media/video-controls-captions-trackmenu.html [ Failure ]
 webkit.org/b/123097 media/track/track-user-preferences.html [ Skip ]
 webkit.org/b/121995 media/video-controls-captions-trackmenu-includes-enabled-track.html [ Failure ]
@@ -2418,6 +2411,8 @@ webkit.org/b/85594 fast/dom/navigator-detached-no-crash.html [ Failure ]
 webkit.org/b/143471 canvas/philip/tests/2d.drawImage.animated.poster.html [ Failure ]
 webkit.org/b/143871 svg/W3C-SVG-1.1-SE/linking-uri-01-b.svg [ Failure ]
 
+webkit.org/b/143924 fast/text/hyphen-min-preferred-width.html [ Skip ]
+
 #////////////////////////////////////////////////////////////////////////////////////////
 # End of Tests failing
 #////////////////////////////////////////////////////////////////////////////////////////
diff --git a/LayoutTests/platform/gtk/fast/text/hyphenate-character-expected.png b/LayoutTests/platform/gtk/fast/text/hyphenate-character-expected.png
new file mode 100644 (file)
index 0000000..0732561
Binary files /dev/null and b/LayoutTests/platform/gtk/fast/text/hyphenate-character-expected.png differ
index 08b1d36..d36fe7e 100644 (file)
@@ -3,103 +3,107 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
-      RenderBlock (floating) {DIV} at (4,0) size 344x274
+      RenderBlock (floating) {DIV} at (4,0) size 344x264
         RenderBlock {P} at (0,16) size 344x18
-          RenderText {#text} at (0,0) size 208x17
-            text run at (0,0) width 208: "The initial value (should be like "
-          RenderInline {TT} at (0,0) size 33x15
-            RenderText {#text} at (207,3) size 33x15
-              text run at (207,3) width 33: "auto"
-          RenderText {#text} at (239,0) size 6x17
-            text run at (239,0) width 6: ")"
-        RenderBlock {DIV} at (0,50) size 344x224 [border: (3px solid #000000)]
+          RenderText {#text} at (0,0) size 203x17
+            text run at (0,0) width 203: "The initial value (should be like "
+          RenderInline {TT} at (0,0) size 32x15
+            RenderText {#text} at (203,3) size 32x15
+              text run at (203,3) width 32: "auto"
+          RenderText {#text} at (235,0) size 5x17
+            text run at (235,0) width 5: ")"
+        RenderBlock {DIV} at (0,50) size 344x214 [border: (3px solid #000000)]
           RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF]
-          RenderText {#text} at (7,7) size 330x209
+          RenderText {#text} at (7,7) size 330x200
             text run at (7,7) width 245: "The chief difficulty Alice found"
-            text run at (7,28) width 245: "at first was in managing her"
-            text run at (7,49) width 245: "flamingo: she succeeded in"
-            text run at (7,70) width 245: "getting its body tucked away,"
-            text run at (7,91) width 245: "comfortably enough, under her"
-            text run at (7,112) width 307: "arm, with its legs hanging down, "
-            text run at (313,112) width 24: "but"
-            text run at (7,133) width 330: "generally, just as she had got its neck nicely"
-            text run at (7,154) width 96: "straightened "
-            text run at (102,154) width 235: "out, and was going to give the"
-            text run at (7,175) width 245: "hedgehog a blow with its head, it "
-            text run at (251,175) width 86: "would twist"
-            text run at (7,196) width 271: "itself round and look up in her face\x{2026}"
-      RenderBlock (floating) {DIV} at (356,0) size 344x274
+            text run at (7,27) width 245: "at first was in managing her"
+            text run at (7,47) width 245: "flamingo: she succeeded in ge" + hyphen string "\x{2010}"
+            text run at (7,67) width 222: "tting its body tucked away, "
+            text run at (229,67) width 23: "co" + hyphen string "\x{2010}"
+            text run at (7,87) width 245: "mfortably enough, under her"
+            text run at (7,107) width 248: "arm, with its legs hanging down, "
+            text run at (254,107) width 83: "but genera" + hyphen string "\x{2010}"
+            text run at (7,127) width 330: "lly, just as she had got its neck nicely"
+            text run at (7,147) width 96: "straightened "
+            text run at (102,147) width 235: "out, and was going to give the"
+            text run at (7,167) width 285: "hedgehog a blow with its head, it "
+            text run at (292,167) width 45: "would"
+            text run at (7,187) width 314: "twist itself round and look up in her face\x{2026}"
+      RenderBlock (floating) {DIV} at (356,0) size 344x264
         RenderBlock {P} at (0,16) size 344x18
-          RenderText {#text} at (0,0) size 83x17
-            text run at (0,0) width 83: "The default ("
-          RenderInline {TT} at (0,0) size 196x15
-            RenderText {#text} at (82,3) size 196x15
-              text run at (82,3) width 196: "hyphenate-character: auto"
-          RenderText {#text} at (277,0) size 6x17
-            text run at (277,0) width 6: ")"
-        RenderBlock {DIV} at (0,50) size 344x224 [border: (3px solid #000000)]
+          RenderText {#text} at (0,0) size 81x17
+            text run at (0,0) width 81: "The default ("
+          RenderInline {TT} at (0,0) size 200x15
+            RenderText {#text} at (81,3) size 200x15
+              text run at (81,3) width 200: "hyphenate-character: auto"
+          RenderText {#text} at (281,0) size 5x17
+            text run at (281,0) width 5: ")"
+        RenderBlock {DIV} at (0,50) size 344x214 [border: (3px solid #000000)]
           RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF]
-          RenderText {#text} at (7,7) size 330x209
+          RenderText {#text} at (7,7) size 330x200
             text run at (7,7) width 245: "The chief difficulty Alice found"
-            text run at (7,28) width 245: "at first was in managing her"
-            text run at (7,49) width 245: "flamingo: she succeeded in"
-            text run at (7,70) width 245: "getting its body tucked away,"
-            text run at (7,91) width 245: "comfortably enough, under her"
-            text run at (7,112) width 307: "arm, with its legs hanging down, "
-            text run at (313,112) width 24: "but"
-            text run at (7,133) width 330: "generally, just as she had got its neck nicely"
-            text run at (7,154) width 96: "straightened "
-            text run at (102,154) width 235: "out, and was going to give the"
-            text run at (7,175) width 245: "hedgehog a blow with its head, it "
-            text run at (251,175) width 86: "would twist"
-            text run at (7,196) width 271: "itself round and look up in her face\x{2026}"
-      RenderBlock (floating) {DIV} at (4,274) size 344x274
+            text run at (7,27) width 245: "at first was in managing her"
+            text run at (7,47) width 245: "flamingo: she succeeded in ge" + hyphen string "\x{2010}"
+            text run at (7,67) width 222: "tting its body tucked away, "
+            text run at (229,67) width 23: "co" + hyphen string "\x{2010}"
+            text run at (7,87) width 245: "mfortably enough, under her"
+            text run at (7,107) width 248: "arm, with its legs hanging down, "
+            text run at (254,107) width 83: "but genera" + hyphen string "\x{2010}"
+            text run at (7,127) width 330: "lly, just as she had got its neck nicely"
+            text run at (7,147) width 96: "straightened "
+            text run at (102,147) width 235: "out, and was going to give the"
+            text run at (7,167) width 285: "hedgehog a blow with its head, it "
+            text run at (292,167) width 45: "would"
+            text run at (7,187) width 314: "twist itself round and look up in her face\x{2026}"
+      RenderBlock (floating) {DIV} at (4,264) size 344x264
         RenderBlock {P} at (0,16) size 344x18
-          RenderText {#text} at (0,0) size 49x17
-            text run at (0,0) width 49: "Bullet ("
-          RenderInline {TT} at (0,0) size 219x15
-            RenderText {#text} at (48,3) size 219x15
-              text run at (48,3) width 219: "hyphenate-character: \"\\2022\""
-          RenderText {#text} at (266,0) size 7x17
-            text run at (266,0) width 7: ")"
-        RenderBlock {DIV} at (0,50) size 344x224 [border: (3px solid #000000)]
+          RenderText {#text} at (0,0) size 47x17
+            text run at (0,0) width 47: "Bullet ("
+          RenderInline {TT} at (0,0) size 224x15
+            RenderText {#text} at (47,3) size 224x15
+              text run at (47,3) width 224: "hyphenate-character: \"\\2022\""
+          RenderText {#text} at (271,0) size 5x17
+            text run at (271,0) width 5: ")"
+        RenderBlock {DIV} at (0,50) size 344x214 [border: (3px solid #000000)]
           RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF]
-          RenderText {#text} at (7,7) size 330x209
+          RenderText {#text} at (7,7) size 330x200
             text run at (7,7) width 245: "The chief difficulty Alice found"
-            text run at (7,28) width 245: "at first was in managing her"
-            text run at (7,49) width 245: "flamingo: she succeeded in"
-            text run at (7,70) width 245: "getting its body tucked away,"
-            text run at (7,91) width 245: "comfortably enough, under her"
-            text run at (7,112) width 307: "arm, with its legs hanging down, "
-            text run at (313,112) width 24: "but"
-            text run at (7,133) width 330: "generally, just as she had got its neck nicely"
-            text run at (7,154) width 96: "straightened "
-            text run at (102,154) width 235: "out, and was going to give the"
-            text run at (7,175) width 245: "hedgehog a blow with its head, it "
-            text run at (251,175) width 86: "would twist"
-            text run at (7,196) width 271: "itself round and look up in her face\x{2026}"
-      RenderBlock (floating) {DIV} at (356,274) size 356x274
-        RenderBlock {P} at (0,16) size 356x18
-          RenderText {#text} at (0,0) size 140x17
-            text run at (0,0) width 140: "Middle dot and tilde ("
-          RenderInline {TT} at (0,0) size 212x15
-            RenderText {#text} at (139,3) size 212x15
-              text run at (139,3) width 212: "hyphenate-character: \"\\B7~\""
-          RenderText {#text} at (350,0) size 6x17
-            text run at (350,0) width 6: ")"
-        RenderBlock {DIV} at (0,50) size 344x224 [border: (3px solid #000000)]
+            text run at (7,27) width 245: "at first was in managing her"
+            text run at (7,47) width 245: "flamingo: she succeeded in ge" + hyphen string "\x{2022}"
+            text run at (7,67) width 222: "tting its body tucked away, "
+            text run at (229,67) width 23: "co" + hyphen string "\x{2022}"
+            text run at (7,87) width 245: "mfortably enough, under her"
+            text run at (7,107) width 248: "arm, with its legs hanging down, "
+            text run at (254,107) width 83: "but genera" + hyphen string "\x{2022}"
+            text run at (7,127) width 330: "lly, just as she had got its neck nicely"
+            text run at (7,147) width 96: "straightened "
+            text run at (102,147) width 235: "out, and was going to give the"
+            text run at (7,167) width 285: "hedgehog a blow with its head, it "
+            text run at (292,167) width 45: "would"
+            text run at (7,187) width 314: "twist itself round and look up in her face\x{2026}"
+      RenderBlock (floating) {DIV} at (356,264) size 357x264
+        RenderBlock {P} at (0,16) size 357x18
+          RenderText {#text} at (0,0) size 136x17
+            text run at (0,0) width 136: "Middle dot and tilde ("
+          RenderInline {TT} at (0,0) size 216x15
+            RenderText {#text} at (136,3) size 216x15
+              text run at (136,3) width 216: "hyphenate-character: \"\\B7~\""
+          RenderText {#text} at (352,0) size 5x17
+            text run at (352,0) width 5: ")"
+        RenderBlock {DIV} at (0,50) size 344x214 [border: (3px solid #000000)]
           RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF]
-          RenderText {#text} at (7,7) size 330x209
+          RenderText {#text} at (7,7) size 330x200
             text run at (7,7) width 245: "The chief difficulty Alice found"
-            text run at (7,28) width 245: "at first was in managing her"
-            text run at (7,49) width 245: "flamingo: she succeeded in"
-            text run at (7,70) width 245: "getting its body tucked away,"
-            text run at (7,91) width 245: "comfortably enough, under her"
-            text run at (7,112) width 307: "arm, with its legs hanging down, "
-            text run at (313,112) width 24: "but"
-            text run at (7,133) width 330: "generally, just as she had got its neck nicely"
-            text run at (7,154) width 96: "straightened "
-            text run at (102,154) width 235: "out, and was going to give the"
-            text run at (7,175) width 245: "hedgehog a blow with its head, it "
-            text run at (251,175) width 86: "would twist"
-            text run at (7,196) width 271: "itself round and look up in her face\x{2026}"
+            text run at (7,27) width 245: "at first was in managing her"
+            text run at (7,47) width 245: "flamingo: she succeeded in ge" + hyphen string "\x{B7}~"
+            text run at (7,67) width 213: "tting its body tucked away, "
+            text run at (220,67) width 32: "co" + hyphen string "\x{B7}~"
+            text run at (7,87) width 245: "mfortably enough, under her"
+            text run at (7,107) width 252: "arm, with its legs hanging down, "
+            text run at (258,107) width 79: "but gene" + hyphen string "\x{B7}~"
+            text run at (7,127) width 330: "rally, just as she had got its neck nicely"
+            text run at (7,147) width 96: "straightened "
+            text run at (102,147) width 235: "out, and was going to give the"
+            text run at (7,167) width 285: "hedgehog a blow with its head, it "
+            text run at (292,167) width 45: "would"
+            text run at (7,187) width 314: "twist itself round and look up in her face\x{2026}"
diff --git a/LayoutTests/platform/gtk/fast/text/hyphenate-first-word-expected.png b/LayoutTests/platform/gtk/fast/text/hyphenate-first-word-expected.png
new file mode 100644 (file)
index 0000000..f65e32e
Binary files /dev/null and b/LayoutTests/platform/gtk/fast/text/hyphenate-first-word-expected.png differ
index d9e56c5..445f386 100644 (file)
@@ -3,6 +3,8 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
-      RenderBlock {DIV} at (0,0) size 226x117 [border: (3px solid #000000)]
-        RenderText {#text} at (3,5) size 427x107
-          text run at (3,5) width 427: "declination"
+      RenderBlock {DIV} at (0,0) size 226x327 [border: (3px solid #000000)]
+        RenderText {#text} at (3,3) size 193x321
+          text run at (3,3) width 193: "decl" + hyphen string "\x{2010}"
+          text run at (3,110) width 107: "in" + hyphen string "\x{2010}"
+          text run at (3,217) width 193: "ation"
index c02ce78..4e6d45d 100644 (file)
Binary files a/LayoutTests/platform/gtk/fast/text/hyphenate-limit-before-after-expected.png and b/LayoutTests/platform/gtk/fast/text/hyphenate-limit-before-after-expected.png differ
index 11b3cbf..38b0992 100644 (file)
@@ -3,25 +3,22 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
-      RenderBlock {DIV} at (8,8) size 126x57 [border: (3px solid #000000)]
-        RenderText {#text} at (3,3) size 70x51
-          text run at (3,3) width 51: "There is"
-          text run at (3,20) width 70: "remarkable"
-          text run at (3,37) width 60: "evidence."
+      RenderBlock {DIV} at (8,25) size 126x40 [border: (3px solid #000000)]
+        RenderText {#text} at (3,3) size 98x34
+          text run at (3,3) width 96: "There is remar" + hyphen string "\x{2010}"
+          text run at (3,20) width 98: "kable evidence."
       RenderText {#text} at (142,45) size 4x17
         text run at (142,45) width 4: " "
-      RenderBlock {DIV} at (154,8) size 126x57 [border: (3px solid #000000)]
-        RenderText {#text} at (3,3) size 70x51
-          text run at (3,3) width 51: "There is"
-          text run at (3,20) width 70: "remarkable"
-          text run at (3,37) width 60: "evidence."
+      RenderBlock {DIV} at (154,25) size 126x40 [border: (3px solid #000000)]
+        RenderText {#text} at (3,3) size 98x34
+          text run at (3,3) width 96: "There is remar" + hyphen string "\x{2010}"
+          text run at (3,20) width 98: "kable evidence."
       RenderText {#text} at (288,45) size 4x17
         text run at (288,45) width 4: " "
-      RenderBlock {DIV} at (300,8) size 126x57 [border: (3px solid #000000)]
-        RenderText {#text} at (3,3) size 70x51
-          text run at (3,3) width 51: "There is"
-          text run at (3,20) width 70: "remarkable"
-          text run at (3,37) width 60: "evidence."
+      RenderBlock {DIV} at (300,25) size 126x40 [border: (3px solid #000000)]
+        RenderText {#text} at (3,3) size 98x34
+          text run at (3,3) width 96: "There is remar" + hyphen string "\x{2010}"
+          text run at (3,20) width 98: "kable evidence."
       RenderText {#text} at (434,45) size 4x17
         text run at (434,45) width 4: " "
       RenderBlock {DIV} at (446,8) size 126x57 [border: (3px solid #000000)]
@@ -38,37 +35,32 @@ layer at (0,0) size 800x600
           text run at (3,37) width 60: "evidence."
       RenderText {#text} at (726,45) size 4x17
         text run at (726,45) width 4: " "
-      RenderBlock {DIV} at (8,81) size 126x57 [border: (3px solid #000000)]
-        RenderText {#text} at (3,3) size 70x51
-          text run at (3,3) width 51: "There is"
-          text run at (3,20) width 70: "remarkable"
-          text run at (3,37) width 60: "evidence."
-      RenderText {#text} at (142,118) size 4x17
-        text run at (142,118) width 4: " "
-      RenderBlock {DIV} at (154,81) size 126x57 [border: (3px solid #000000)]
-        RenderText {#text} at (3,3) size 70x51
-          text run at (3,3) width 51: "There is"
-          text run at (3,20) width 70: "remarkable"
-          text run at (3,37) width 60: "evidence."
-      RenderText {#text} at (288,118) size 4x17
-        text run at (288,118) width 4: " "
-      RenderBlock {DIV} at (300,81) size 126x57 [border: (3px solid #000000)]
-        RenderText {#text} at (3,3) size 70x51
-          text run at (3,3) width 51: "There is"
-          text run at (3,20) width 70: "remarkable"
-          text run at (3,37) width 60: "evidence."
-      RenderText {#text} at (434,118) size 4x17
-        text run at (434,118) width 4: " "
-      RenderBlock {DIV} at (446,81) size 126x57 [border: (3px solid #000000)]
-        RenderText {#text} at (3,3) size 70x51
-          text run at (3,3) width 51: "There is"
-          text run at (3,20) width 70: "remarkable"
-          text run at (3,37) width 60: "evidence."
-      RenderText {#text} at (580,118) size 4x17
-        text run at (580,118) width 4: " "
-      RenderBlock {DIV} at (592,81) size 126x57 [border: (3px solid #000000)]
-        RenderText {#text} at (3,3) size 70x51
-          text run at (3,3) width 51: "There is"
-          text run at (3,20) width 70: "remarkable"
-          text run at (3,37) width 60: "evidence."
+      RenderBlock {DIV} at (8,81) size 126x40 [border: (3px solid #000000)]
+        RenderText {#text} at (3,3) size 98x34
+          text run at (3,3) width 96: "There is remar" + hyphen string "\x{2010}"
+          text run at (3,20) width 98: "kable evidence."
+      RenderText {#text} at (142,101) size 4x17
+        text run at (142,101) width 4: " "
+      RenderBlock {DIV} at (154,81) size 126x40 [border: (3px solid #000000)]
+        RenderText {#text} at (3,3) size 98x34
+          text run at (3,3) width 96: "There is remar" + hyphen string "\x{2010}"
+          text run at (3,20) width 98: "kable evidence."
+      RenderText {#text} at (288,101) size 4x17
+        text run at (288,101) width 4: " "
+      RenderBlock {DIV} at (300,81) size 126x40 [border: (3px solid #000000)]
+        RenderText {#text} at (3,3) size 98x34
+          text run at (3,3) width 96: "There is remar" + hyphen string "\x{2010}"
+          text run at (3,20) width 98: "kable evidence."
+      RenderText {#text} at (434,101) size 4x17
+        text run at (434,101) width 4: " "
+      RenderBlock {DIV} at (446,81) size 126x40 [border: (3px solid #000000)]
+        RenderText {#text} at (3,3) size 98x34
+          text run at (3,3) width 96: "There is remar" + hyphen string "\x{2010}"
+          text run at (3,20) width 98: "kable evidence."
+      RenderText {#text} at (580,101) size 4x17
+        text run at (580,101) width 4: " "
+      RenderBlock {DIV} at (592,81) size 126x40 [border: (3px solid #000000)]
+        RenderText {#text} at (3,3) size 98x34
+          text run at (3,3) width 96: "There is remar" + hyphen string "\x{2010}"
+          text run at (3,20) width 98: "kable evidence."
       RenderText {#text} at (0,0) size 0x0
index a5f4d92..be65ff4 100644 (file)
Binary files a/LayoutTests/platform/gtk/fast/text/hyphenate-limit-lines-expected.png and b/LayoutTests/platform/gtk/fast/text/hyphenate-limit-lines-expected.png differ
index 425fff2..a1e4f50 100644 (file)
@@ -1,74 +1,80 @@
-layer at (0,0) size 785x998
+layer at (0,0) size 785x969
   RenderView at (0,0) size 785x600
-layer at (0,0) size 785x998
-  RenderBlock {HTML} at (0,0) size 785x998
+layer at (0,0) size 785x969
+  RenderBlock {HTML} at (0,0) size 785x969
     RenderBody {BODY} at (8,8) size 769x584
-      RenderBlock (floating) {DIV} at (4,0) size 202x495 [border: (1px solid #ADD8E6)]
-        RenderText {#text} at (1,1) size 200x493
+      RenderBlock (floating) {DIV} at (4,0) size 202x466 [border: (1px solid #ADD8E6)]
+        RenderText {#text} at (1,1) size 200x464
           text run at (1,1) width 200: "also the division of"
           text run at (1,30) width 200: "the mind into the"
-          text run at (1,59) width 87: "rational,"
-          text run at (1,88) width 200: "concupiscent, and"
-          text run at (1,117) width 200: "irascible elements,"
-          text run at (1,146) width 200: "or of pleasures"
-          text run at (1,175) width 200: "and desires into"
-          text run at (1,204) width 200: "necessary and"
-          text run at (1,233) width 155: "unnecessary\x{2014}"
-          text run at (1,262) width 200: "these and other"
-          text run at (1,291) width 200: "great forms of"
-          text run at (1,320) width 200: "thought are all of"
-          text run at (1,349) width 66: "them "
-          text run at (67,349) width 134: "to be found"
-          text run at (1,378) width 200: "in the Republic,"
-          text run at (1,407) width 200: "and were probably"
-          text run at (1,436) width 200: "first invented by"
-          text run at (1,465) width 60: "Plato."
-      RenderBlock (floating) {DIV} at (214,0) size 202x495 [border: (1px solid #ADD8E6)]
-        RenderText {#text} at (1,1) size 200x493
+          text run at (1,59) width 200: "rational, concupi" + hyphen string "\x{2010}"
+          text run at (1,88) width 141: "scent, and "
+          text run at (142,88) width 59: "irasc" + hyphen string "\x{2010}"
+          text run at (1,117) width 200: "ible elements, or"
+          text run at (1,146) width 200: "of pleasures and"
+          text run at (1,175) width 200: "desires into nece" + hyphen string "\x{2010}"
+          text run at (1,204) width 116: "ssary and "
+          text run at (117,204) width 84: "unnece" + hyphen string "\x{2010}"
+          text run at (1,233) width 200: "ssary\x{2014}these and"
+          text run at (1,262) width 200: "other great forms"
+          text run at (1,291) width 200: "of thought are all"
+          text run at (1,320) width 128: "of them "
+          text run at (129,320) width 72: "to be"
+          text run at (1,349) width 200: "found in the Repu" + hyphen string "\x{2010}"
+          text run at (1,378) width 200: "blic, and were"
+          text run at (1,407) width 200: "probably first"
+          text run at (1,436) width 130: "invented by "
+          text run at (131,436) width 60: "Plato."
+      RenderBlock (floating) {DIV} at (214,0) size 202x466 [border: (1px solid #ADD8E6)]
+        RenderText {#text} at (1,1) size 200x464
           text run at (1,1) width 200: "also the division of"
           text run at (1,30) width 200: "the mind into the"
-          text run at (1,59) width 87: "rational,"
-          text run at (1,88) width 200: "concupiscent, and"
-          text run at (1,117) width 200: "irascible elements,"
-          text run at (1,146) width 200: "or of pleasures"
-          text run at (1,175) width 200: "and desires into"
-          text run at (1,204) width 200: "necessary and"
-          text run at (1,233) width 155: "unnecessary\x{2014}"
-          text run at (1,262) width 200: "these and other"
-          text run at (1,291) width 200: "great forms of"
-          text run at (1,320) width 200: "thought are all of"
-          text run at (1,349) width 66: "them "
-          text run at (67,349) width 134: "to be found"
-          text run at (1,378) width 200: "in the Republic,"
-          text run at (1,407) width 200: "and were probably"
-          text run at (1,436) width 200: "first invented by"
-          text run at (1,465) width 60: "Plato."
-      RenderBlock (floating) {DIV} at (424,0) size 202x495 [border: (1px solid #ADD8E6)]
-        RenderText {#text} at (1,1) size 200x493
+          text run at (1,59) width 200: "rational, concupi" + hyphen string "\x{2010}"
+          text run at (1,88) width 141: "scent, and "
+          text run at (142,88) width 59: "irasc" + hyphen string "\x{2010}"
+          text run at (1,117) width 200: "ible elements, or"
+          text run at (1,146) width 200: "of pleasures and"
+          text run at (1,175) width 200: "desires into nece" + hyphen string "\x{2010}"
+          text run at (1,204) width 116: "ssary and "
+          text run at (117,204) width 84: "unnece" + hyphen string "\x{2010}"
+          text run at (1,233) width 200: "ssary\x{2014}these and"
+          text run at (1,262) width 200: "other great forms"
+          text run at (1,291) width 200: "of thought are all"
+          text run at (1,320) width 128: "of them "
+          text run at (129,320) width 72: "to be"
+          text run at (1,349) width 200: "found in the Repu" + hyphen string "\x{2010}"
+          text run at (1,378) width 200: "blic, and were"
+          text run at (1,407) width 200: "probably first"
+          text run at (1,436) width 130: "invented by "
+          text run at (131,436) width 60: "Plato."
+      RenderBlock (floating) {DIV} at (424,0) size 202x466 [border: (1px solid #ADD8E6)]
+        RenderText {#text} at (1,1) size 200x464
           text run at (1,1) width 200: "also the division of"
           text run at (1,30) width 200: "the mind into the"
-          text run at (1,59) width 87: "rational,"
-          text run at (1,88) width 200: "concupiscent, and"
-          text run at (1,117) width 200: "irascible elements,"
-          text run at (1,146) width 200: "or of pleasures"
-          text run at (1,175) width 200: "and desires into"
-          text run at (1,204) width 200: "necessary and"
-          text run at (1,233) width 155: "unnecessary\x{2014}"
-          text run at (1,262) width 200: "these and other"
-          text run at (1,291) width 200: "great forms of"
-          text run at (1,320) width 200: "thought are all of"
-          text run at (1,349) width 66: "them "
-          text run at (67,349) width 134: "to be found"
-          text run at (1,378) width 200: "in the Republic,"
-          text run at (1,407) width 200: "and were probably"
-          text run at (1,436) width 200: "first invented by"
-          text run at (1,465) width 60: "Plato."
-      RenderBlock (floating) {DIV} at (4,495) size 202x495 [border: (1px solid #ADD8E6)]
+          text run at (1,59) width 200: "rational, concupi" + hyphen string "\x{2010}"
+          text run at (1,88) width 141: "scent, and "
+          text run at (142,88) width 59: "irasc" + hyphen string "\x{2010}"
+          text run at (1,117) width 200: "ible elements, or"
+          text run at (1,146) width 200: "of pleasures and"
+          text run at (1,175) width 200: "desires into nece" + hyphen string "\x{2010}"
+          text run at (1,204) width 116: "ssary and "
+          text run at (117,204) width 84: "unnece" + hyphen string "\x{2010}"
+          text run at (1,233) width 200: "ssary\x{2014}these and"
+          text run at (1,262) width 200: "other great forms"
+          text run at (1,291) width 200: "of thought are all"
+          text run at (1,320) width 128: "of them "
+          text run at (129,320) width 72: "to be"
+          text run at (1,349) width 200: "found in the Repu" + hyphen string "\x{2010}"
+          text run at (1,378) width 200: "blic, and were"
+          text run at (1,407) width 200: "probably first"
+          text run at (1,436) width 130: "invented by "
+          text run at (131,436) width 60: "Plato."
+      RenderBlock (floating) {DIV} at (4,466) size 202x495 [border: (1px solid #ADD8E6)]
         RenderText {#text} at (1,1) size 200x493
           text run at (1,1) width 200: "also the division of"
           text run at (1,30) width 200: "the mind into the"
-          text run at (1,59) width 87: "rational,"
-          text run at (1,88) width 200: "concupiscent, and"
+          text run at (1,59) width 200: "rational, concupi" + hyphen string "\x{2010}"
+          text run at (1,88) width 200: "scent, and"
           text run at (1,117) width 200: "irascible elements,"
           text run at (1,146) width 200: "or of pleasures"
           text run at (1,175) width 200: "and desires into"
@@ -83,7 +89,7 @@ layer at (0,0) size 785x998
           text run at (1,407) width 200: "and were probably"
           text run at (1,436) width 200: "first invented by"
           text run at (1,465) width 60: "Plato."
-      RenderBlock (floating) {DIV} at (214,495) size 202x495 [border: (1px solid #ADD8E6)]
+      RenderBlock (floating) {DIV} at (214,466) size 202x495 [border: (1px solid #ADD8E6)]
         RenderText {#text} at (1,1) size 200x493
           text run at (1,1) width 200: "also the division of"
           text run at (1,30) width 200: "the mind into the"
diff --git a/LayoutTests/platform/gtk/fast/text/hyphenate-locale-expected.png b/LayoutTests/platform/gtk/fast/text/hyphenate-locale-expected.png
new file mode 100644 (file)
index 0000000..3cb7097
Binary files /dev/null and b/LayoutTests/platform/gtk/fast/text/hyphenate-locale-expected.png differ
index 7678a4e..582f3f0 100644 (file)
@@ -3,35 +3,38 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
-      RenderBlock {DIV} at (0,0) size 130x210
-        RenderBlock {DIV} at (0,0) size 130x42
-          RenderText {#text} at (0,1) size 158x40
-            text run at (0,1) width 158: "throughout"
-        RenderBlock {DIV} at (0,42) size 130x42
-          RenderText {#text} at (0,1) size 158x40
-            text run at (0,1) width 158: "throughout"
-        RenderBlock {DIV} at (0,84) size 130x42
-          RenderText {#text} at (0,1) size 158x40
-            text run at (0,1) width 158: "throughout"
-        RenderBlock {DIV} at (0,126) size 130x42
-          RenderText {#text} at (0,1) size 158x40
-            text run at (0,1) width 158: "throughout"
-        RenderBlock {DIV} at (0,168) size 130x42
-          RenderText {#text} at (0,1) size 158x40
-            text run at (0,1) width 158: "throughout"
-      RenderBlock {DIV} at (0,210) size 135x210
-        RenderBlock {DIV} at (0,0) size 135x42
-          RenderText {#text} at (0,1) size 156x40
-            text run at (0,1) width 156: "reciprocity"
-        RenderBlock {DIV} at (0,42) size 135x42
-          RenderText {#text} at (0,1) size 156x40
-            text run at (0,1) width 156: "reciprocity"
-        RenderBlock {DIV} at (0,84) size 135x42
-          RenderText {#text} at (0,1) size 156x40
-            text run at (0,1) width 156: "reciprocity"
-        RenderBlock {DIV} at (0,126) size 135x42
-          RenderText {#text} at (0,1) size 156x40
-            text run at (0,1) width 156: "reciprocity"
-        RenderBlock {DIV} at (0,168) size 135x42
-          RenderText {#text} at (0,1) size 156x40
-            text run at (0,1) width 156: "reciprocity"
+      RenderBlock {DIV} at (0,0) size 130x240
+        RenderBlock {DIV} at (0,0) size 130x40
+          RenderText {#text} at (0,0) size 158x40
+            text run at (0,0) width 158: "throughout"
+        RenderBlock {DIV} at (0,40) size 130x40
+          RenderText {#text} at (0,0) size 158x40
+            text run at (0,0) width 158: "throughout"
+        RenderBlock {DIV} at (0,80) size 130x80
+          RenderText {#text} at (0,0) size 106x80
+            text run at (0,0) width 106: "throug" + hyphen string "\x{2010}"
+            text run at (0,40) width 64: "hout"
+        RenderBlock {DIV} at (0,160) size 130x40
+          RenderText {#text} at (0,0) size 158x40
+            text run at (0,0) width 158: "throughout"
+        RenderBlock {DIV} at (0,200) size 130x40
+          RenderText {#text} at (0,0) size 158x40
+            text run at (0,0) width 158: "throughout"
+      RenderBlock {DIV} at (0,240) size 135x280
+        RenderBlock {DIV} at (0,0) size 135x40
+          RenderText {#text} at (0,0) size 156x40
+            text run at (0,0) width 156: "reciprocity"
+        RenderBlock {DIV} at (0,40) size 135x40
+          RenderText {#text} at (0,0) size 156x40
+            text run at (0,0) width 156: "reciprocity"
+        RenderBlock {DIV} at (0,80) size 135x80
+          RenderText {#text} at (0,0) size 114x80
+            text run at (0,0) width 114: "recipro" + hyphen string "\x{2010}"
+            text run at (0,40) width 54: "city"
+        RenderBlock {DIV} at (0,160) size 135x80
+          RenderText {#text} at (0,0) size 96x80
+            text run at (0,0) width 96: "recipr" + hyphen string "\x{2010}"
+            text run at (0,40) width 72: "ocity"
+        RenderBlock {DIV} at (0,240) size 135x40
+          RenderText {#text} at (0,0) size 156x40
+            text run at (0,0) width 156: "reciprocity"
diff --git a/LayoutTests/platform/gtk/fast/text/hyphens-expected.png b/LayoutTests/platform/gtk/fast/text/hyphens-expected.png
new file mode 100644 (file)
index 0000000..295f121
Binary files /dev/null and b/LayoutTests/platform/gtk/fast/text/hyphens-expected.png differ
index d322cfe..3c5464c 100644 (file)
@@ -3,96 +3,97 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderBlock {HTML} at (0,0) size 800x600
     RenderBody {BODY} at (8,8) size 784x584
-      RenderBlock (floating) {DIV} at (4,0) size 344x274
+      RenderBlock (floating) {DIV} at (4,0) size 344x264
         RenderBlock {P} at (0,16) size 344x18
-          RenderInline {TT} at (0,0) size 118x15
-            RenderText {#text} at (0,3) size 118x15
-              text run at (0,3) width 118: "hyphens: manual"
-          RenderText {#text} at (117,0) size 139x17
-            text run at (117,0) width 139: " without soft hyphens"
-        RenderBlock {DIV} at (0,50) size 344x224 [border: (3px solid #000000)]
+          RenderInline {TT} at (0,0) size 120x15
+            RenderText {#text} at (0,3) size 120x15
+              text run at (0,3) width 120: "hyphens: manual"
+          RenderText {#text} at (120,0) size 136x17
+            text run at (120,0) width 136: " without soft hyphens"
+        RenderBlock {DIV} at (0,50) size 344x214 [border: (3px solid #000000)]
           RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF]
-          RenderText {#text} at (7,7) size 330x209
+          RenderText {#text} at (7,7) size 330x200
             text run at (7,7) width 245: "The chief difficulty Alice found"
-            text run at (7,28) width 245: "at first was in managing her"
-            text run at (7,49) width 245: "flamingo: she succeeded in"
-            text run at (7,70) width 245: "getting its body tucked away,"
-            text run at (7,91) width 245: "comfortably enough, under her"
-            text run at (7,112) width 307: "arm, with its legs hanging down, "
-            text run at (313,112) width 24: "but"
-            text run at (7,133) width 330: "generally, just as she had got its neck nicely"
-            text run at (7,154) width 96: "straightened "
-            text run at (102,154) width 235: "out, and was going to give the"
-            text run at (7,175) width 245: "hedgehog a blow with its head, it "
-            text run at (251,175) width 86: "would twist"
-            text run at (7,196) width 271: "itself round and look up in her face\x{2026}"
-      RenderBlock (floating) {DIV} at (356,0) size 344x274
+            text run at (7,27) width 245: "at first was in managing her"
+            text run at (7,47) width 245: "flamingo: she succeeded in"
+            text run at (7,67) width 245: "getting its body tucked away,"
+            text run at (7,87) width 245: "comfortably enough, under her"
+            text run at (7,107) width 307: "arm, with its legs hanging down, "
+            text run at (314,107) width 23: "but"
+            text run at (7,127) width 330: "generally, just as she had got its neck nicely"
+            text run at (7,147) width 96: "straightened "
+            text run at (102,147) width 235: "out, and was going to give the"
+            text run at (7,167) width 285: "hedgehog a blow with its head, it "
+            text run at (292,167) width 45: "would"
+            text run at (7,187) width 314: "twist itself round and look up in her face\x{2026}"
+      RenderBlock (floating) {DIV} at (356,0) size 344x264
         RenderBlock {P} at (0,16) size 344x18
-          RenderInline {TT} at (0,0) size 102x15
-            RenderText {#text} at (0,3) size 102x15
-              text run at (0,3) width 102: "hyphens: none"
-          RenderText {#text} at (101,0) size 119x17
-            text run at (101,0) width 119: " with soft hyphens"
-        RenderBlock {DIV} at (0,50) size 344x224 [border: (3px solid #000000)]
+          RenderInline {TT} at (0,0) size 104x15
+            RenderText {#text} at (0,3) size 104x15
+              text run at (0,3) width 104: "hyphens: none"
+          RenderText {#text} at (104,0) size 116x17
+            text run at (104,0) width 116: " with soft hyphens"
+        RenderBlock {DIV} at (0,50) size 344x214 [border: (3px solid #000000)]
           RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF]
-          RenderText {#text} at (7,7) size 330x209
+          RenderText {#text} at (7,7) size 330x200
             text run at (7,7) width 245: "The chief difficulty Alice found"
-            text run at (7,28) width 245: "at first was in managing her"
-            text run at (7,49) width 245: "flamingo: she succeeded in"
-            text run at (7,70) width 245: "get\x{AD}ting its body tucked away,"
-            text run at (7,91) width 245: "com\x{AD}fortably enough, under her"
-            text run at (7,112) width 307: "arm, with its legs hanging down, "
-            text run at (313,112) width 24: "but"
-            text run at (7,133) width 330: "generally, just as she had got its neck nicely"
-            text run at (7,154) width 96: "straight\x{AD}ened "
-            text run at (102,154) width 235: "out, and was going to give the"
-            text run at (7,175) width 245: "hedge\x{AD}hog a blow with its head, it "
-            text run at (251,175) width 86: "would twist"
-            text run at (7,196) width 271: "itself round and look up in her face\x{2026}"
-      RenderBlock (floating) {DIV} at (4,274) size 344x274
+            text run at (7,27) width 245: "at first was in managing her"
+            text run at (7,47) width 245: "flamingo: she succeeded in"
+            text run at (7,67) width 245: "get\x{AD}ting its body tucked away,"
+            text run at (7,87) width 245: "com\x{AD}fortably enough, under her"
+            text run at (7,107) width 307: "arm, with its legs hanging down, "
+            text run at (314,107) width 23: "but"
+            text run at (7,127) width 330: "generally, just as she had got its neck nicely"
+            text run at (7,147) width 96: "straight\x{AD}ened "
+            text run at (102,147) width 235: "out, and was going to give the"
+            text run at (7,167) width 285: "hedge\x{AD}hog a blow with its head, it "
+            text run at (292,167) width 45: "would"
+            text run at (7,187) width 314: "twist itself round and look up in her face\x{2026}"
+      RenderBlock (floating) {DIV} at (4,264) size 344x264
         RenderBlock {P} at (0,16) size 344x18
-          RenderInline {TT} at (0,0) size 118x15
-            RenderText {#text} at (0,3) size 118x15
-              text run at (0,3) width 118: "hyphens: manual"
-          RenderText {#text} at (117,0) size 118x17
-            text run at (117,0) width 118: " with soft hyphens"
-        RenderBlock {DIV} at (0,50) size 344x224 [border: (3px solid #000000)]
+          RenderInline {TT} at (0,0) size 120x15
+            RenderText {#text} at (0,3) size 120x15
+              text run at (0,3) width 120: "hyphens: manual"
+          RenderText {#text} at (120,0) size 116x17
+            text run at (120,0) width 116: " with soft hyphens"
+        RenderBlock {DIV} at (0,50) size 344x214 [border: (3px solid #000000)]
           RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF]
-          RenderText {#text} at (7,7) size 330x209
+          RenderText {#text} at (7,7) size 330x200
             text run at (7,7) width 245: "The chief difficulty Alice found"
-            text run at (7,28) width 245: "at first was in managing her"
-            text run at (7,49) width 245: "flamingo: she succeeded in get\x{AD}" + hyphen string "\x{2010}"
-            text run at (7,70) width 209: "ting its body tucked away, "
-            text run at (215,70) width 37: "com\x{AD}" + hyphen string "\x{2010}"
-            text run at (7,91) width 245: "fortably enough, under her arm,"
-            text run at (7,112) width 226: "with its legs hanging down, "
-            text run at (232,112) width 105: "but generally,"
-            text run at (7,133) width 330: "just as she had got its neck nicely straight\x{AD}" + hyphen string "\x{2010}"
-            text run at (7,154) width 39: "ened "
-            text run at (45,154) width 292: "out, and was going to give the hedge\x{AD}hog"
-            text run at (7,175) width 196: "a blow with its head, it "
-            text run at (202,175) width 135: "would twist itself"
-            text run at (7,196) width 230: "round and look up in her face\x{2026}"
-      RenderBlock (floating) {DIV} at (356,274) size 344x274
+            text run at (7,27) width 245: "at first was in managing her"
+            text run at (7,47) width 245: "flamingo: she succeeded in get\x{AD}" + hyphen string "\x{2010}"
+            text run at (7,67) width 208: "ting its body tucked away, "
+            text run at (215,67) width 37: "com\x{AD}" + hyphen string "\x{2010}"
+            text run at (7,87) width 245: "fortably enough, under her arm,"
+            text run at (7,107) width 226: "with its legs hanging down, "
+            text run at (233,107) width 104: "but generally,"
+            text run at (7,127) width 330: "just as she had got its neck nicely straight\x{AD}" + hyphen string "\x{2010}"
+            text run at (7,147) width 42: "ened "
+            text run at (48,147) width 289: "out, and was going to give the hedge\x{AD}" + hyphen string "\x{2010}"
+            text run at (7,167) width 204: "hog a blow with its head, it "
+            text run at (211,167) width 126: "would twist itself"
+            text run at (7,187) width 233: "round and look up in her face\x{2026}"
+      RenderBlock (floating) {DIV} at (356,264) size 344x264
         RenderBlock {P} at (0,16) size 344x18
-          RenderInline {TT} at (0,0) size 102x15
-            RenderText {#text} at (0,3) size 102x15
-              text run at (0,3) width 102: "hyphens: auto"
-          RenderText {#text} at (101,0) size 139x17
-            text run at (101,0) width 139: " without soft hyphens"
-        RenderBlock {DIV} at (0,50) size 344x224 [border: (3px solid #000000)]
+          RenderInline {TT} at (0,0) size 104x15
+            RenderText {#text} at (0,3) size 104x15
+              text run at (0,3) width 104: "hyphens: auto"
+          RenderText {#text} at (104,0) size 136x17
+            text run at (104,0) width 136: " without soft hyphens"
+        RenderBlock {DIV} at (0,50) size 344x214 [border: (3px solid #000000)]
           RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF]
-          RenderText {#text} at (7,7) size 330x209
+          RenderText {#text} at (7,7) size 330x200
             text run at (7,7) width 245: "The chief difficulty Alice found"
-            text run at (7,28) width 245: "at first was in managing her"
-            text run at (7,49) width 245: "flamingo: she succeeded in"
-            text run at (7,70) width 245: "getting its body tucked away,"
-            text run at (7,91) width 245: "comfortably enough, under her"
-            text run at (7,112) width 307: "arm, with its legs hanging down, "
-            text run at (313,112) width 24: "but"
-            text run at (7,133) width 330: "generally, just as she had got its neck nicely"
-            text run at (7,154) width 96: "straightened "
-            text run at (102,154) width 235: "out, and was going to give the"
-            text run at (7,175) width 245: "hedgehog a blow with its head, it "
-            text run at (251,175) width 86: "would twist"
-            text run at (7,196) width 271: "itself round and look up in her face\x{2026}"
+            text run at (7,27) width 245: "at first was in managing her"
+            text run at (7,47) width 245: "flamingo: she succeeded in ge" + hyphen string "\x{2010}"
+            text run at (7,67) width 222: "tting its body tucked away, "
+            text run at (229,67) width 23: "co" + hyphen string "\x{2010}"
+            text run at (7,87) width 245: "mfortably enough, under her"
+            text run at (7,107) width 248: "arm, with its legs hanging down, "
+            text run at (254,107) width 83: "but genera" + hyphen string "\x{2010}"
+            text run at (7,127) width 330: "lly, just as she had got its neck nicely"
+            text run at (7,147) width 96: "straightened "
+            text run at (102,147) width 235: "out, and was going to give the"
+            text run at (7,167) width 285: "hedgehog a blow with its head, it "
+            text run at (292,167) width 45: "would"
+            text run at (7,187) width 314: "twist itself round and look up in her face\x{2026}"
index 77d0c29..5ad882f 100644 (file)
Binary files a/LayoutTests/platform/gtk/fast/text/word-break-soft-hyphen-expected.png and b/LayoutTests/platform/gtk/fast/text/word-break-soft-hyphen-expected.png differ
index a53c62b..440ab1f 100644 (file)
@@ -1,3 +1,38 @@
+2015-04-29  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Add support for automatic hyphenation
+        https://bugs.webkit.org/show_bug.cgi?id=44478
+
+        Reviewed by Carlos Garcia Campos.
+
+        No new tests. This patch unskips and updates results for existing hyphenation tests.
+
+        * PlatformGTK.cmake: Add the libhypen implementation to the source list.
+        * platform/gtk/GtkUtilities.cpp:
+        (WebCore::topLevelPath): Add this helper function taken from the test harness.
+        (WebCore::getWebKitBuildDirectory): Ditto.
+        * platform/gtk/GtkUtilities.h: Add function declarations for the helper functions.
+        * platform/text/Hyphenation.cpp: Surround this implementation with !USE(LIBHYPHEN),
+          so that it can still be shared.
+        * platform/text/gtk/HyphenationLibHyphen.cpp: Added.
+        (WebCore::extractLocaleFromDictionaryFilePath): Take in a dictionary filename and
+        determine the locale that it covers.
+        (WebCore::scanDirectoryForDicionaries): Look for all installed dictionaries as well
+        as ones in the JHBuild root for testing.
+        (WebCore::scanTestDictionariesDirectoryIfNecessary): Try to scan the dictionaries installed
+        in the JHBuild root.
+        (WebCore::availableLocales): Getter for global hash of installed dictionaries.
+        (WebCore::canHyphenate): Added libhyphen implementation.
+        (WebCore::HyphenationDictionary): Helper class that properly manages the memory of
+        an open libhyphen dictionary. This is useful so that they can be stored in an MRU
+        cache. This is a similar approach to the CoreFoundation implementation.
+        (WebCore::AtomicStringKeyedMRUCache<RefPtr<HyphenationDictionary>>::createValueForNullKey): MRU cache
+        helper.
+        (WebCore::AtomicStringKeyedMRUCache<RefPtr<HyphenationDictionary>>::createValueForKey): Ditto.
+        (WebCore::hyphenDictionaryCache): A cache for opened hyphenation dictionaries.
+        (WebCore::countLeadingSpaces): Count leading spaces, since WebCore often passes words with them.
+        (WebCore::lastHyphenLocation): Added libhyphen implementation.
+
 2015-04-29  Myles C. Maxfield  <mmaxfield@apple.com>
 
         Unreviewed build fix.
index f77b3c5..c025f84 100644 (file)
@@ -179,6 +179,7 @@ list(APPEND WebCore_SOURCES
 
     platform/text/enchant/TextCheckerEnchant.cpp
 
+    platform/text/gtk/HyphenationLibHyphen.cpp
     platform/text/gtk/TextBreakIteratorInternalICUGtk.cpp
 
     platform/network/gtk/CredentialBackingStore.cpp
@@ -269,6 +270,7 @@ list(APPEND WebCore_LIBRARIES
     ${LIBSOUP_LIBRARIES}
     ${LIBXML2_LIBRARIES}
     ${LIBXSLT_LIBRARIES}
+    ${HYPHEN_LIBRARIES}
     ${PNG_LIBRARIES}
     ${SQLITE_LIBRARIES}
     ${WEBP_LIBRARIES}
index f83a585..fbe0a3f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011, Igalia S.L.
+ * Copyright (C) 2011, 2013 Igalia S.L.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -21,6 +21,8 @@
 
 #include "IntPoint.h"
 #include <gtk/gtk.h>
+#include <wtf/gobject/GUniquePtr.h>
+#include <wtf/gobject/GlibUtilities.h>
 
 #if PLATFORM(X11)
 #include <gdk/gdkx.h>
@@ -81,4 +83,30 @@ DisplaySystemType getDisplaySystemType()
 #endif
 }
 
+#if defined(DEVELOPMENT_BUILD)
+static CString topLevelPath()
+{
+    if (const char* topLevelDirectory = g_getenv("WEBKIT_TOP_LEVEL"))
+        return topLevelDirectory;
+
+    // If the environment variable wasn't provided then assume we were built into
+    // WebKitBuild/Debug or WebKitBuild/Release. Obviously this will fail if the build
+    // directory is non-standard, but we can't do much more about this.
+    GUniquePtr<char> parentPath(g_path_get_dirname(getCurrentExecutablePath().data()));
+    GUniquePtr<char> layoutTestsPath(g_build_filename(parentPath.get(), "..", "..", "..", nullptr));
+    GUniquePtr<char> absoluteTopLevelPath(realpath(layoutTestsPath.get(), 0));
+    return absoluteTopLevelPath.get();
+}
+
+CString webkitBuildDirectory()
+{
+    const char* webkitOutputDir = g_getenv("WEBKIT_OUTPUTDIR");
+    if (webkitOutputDir)
+        return webkitOutputDir;
+
+    GUniquePtr<char> outputDir(g_build_filename(topLevelPath().data(), "WebKitBuild", nullptr));
+    return outputDir.get();
+}
+#endif
+
 } // namespace WebCore
index ad6439c..595c0d6 100644 (file)
@@ -19,6 +19,8 @@
 #ifndef GtkUtilities_h 
 #define GtkUtilities_h 
 
+#include <wtf/text/CString.h>
+
 namespace WebCore {
 
 class IntPoint;
@@ -33,6 +35,10 @@ enum class DisplaySystemType {
 
 DisplaySystemType getDisplaySystemType();
 
+#if defined(DEVELOPMENT_BUILD)
+CString webkitBuildDirectory();
+#endif
+
 } // namespace WebCore
 
 #endif // GtkUtilities_h
index 13dd37a..ec07637 100644 (file)
@@ -26,6 +26,8 @@
 #include "config.h"
 #include "Hyphenation.h"
 
+#if !USE(LIBHYPHEN)
+
 #include "NotImplemented.h"
 #include <wtf/text/StringView.h>
 
@@ -43,3 +45,5 @@ size_t lastHyphenLocation(StringView, size_t /* beforeIndex */, const AtomicStri
 }
 
 } // namespace WebCore
+
+#endif // !USE(LIBHYPHEN)
diff --git a/Source/WebCore/platform/text/gtk/HyphenationLibHyphen.cpp b/Source/WebCore/platform/text/gtk/HyphenationLibHyphen.cpp
new file mode 100644 (file)
index 0000000..6f06f61
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ * Copyright (C) 2010 Apple Inc. All rights reserved.
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "Hyphenation.h"
+
+#if USE(LIBHYPHEN)
+
+#include "AtomicStringKeyedMRUCache.h"
+#include "FileSystem.h"
+#include "GtkUtilities.h"
+#include <hyphen.h>
+#include <wtf/HashMap.h>
+#include <wtf/NeverDestroyed.h>
+#include <wtf/gobject/GUniquePtr.h>
+#include <wtf/text/AtomicStringHash.h>
+#include <wtf/text/CString.h>
+#include <wtf/text/StringView.h>
+
+namespace WebCore {
+
+static const char* const gDictionaryDirectories[] = {
+    "/usr/share/hyphen",
+    "/usr/local/share/hyphen",
+};
+
+static String extractLocaleFromDictionaryFilePath(const String& filePath)
+{
+    // Dictionary files always have the form "hyph_<locale name>.dic"
+    // so we strip everything except the locale.
+    String fileName = pathGetFileName(filePath);
+    static const int prefixLength = 5;
+    static const int suffixLength = 4;
+    return fileName.substring(prefixLength, fileName.length() - prefixLength - suffixLength);
+}
+
+static void scanDirectoryForDicionaries(const char* directoryPath, HashMap<AtomicString, String>& availableLocales)
+{
+    for (const auto& filePath : listDirectory(directoryPath, "hyph_*.dic"))
+        availableLocales.set(AtomicString(extractLocaleFromDictionaryFilePath(filePath)), filePath);
+}
+
+#if defined(DEVELOPMENT_BUILD)
+static void scanTestDictionariesDirectoryIfNecessary(HashMap<AtomicString, String>& availableLocales)
+{
+    // It's unfortunate that we need to look for the dictionaries this way, but
+    // libhyphen doesn't have the concept of installed dictionaries. Instead,
+    // we have this special case for WebKit tests.
+    CString buildDirectory = webkitBuildDirectory();
+    GUniquePtr<char> dictionariesPath(g_build_filename(buildDirectory.data(), "DependenciesGTK", "Root", "webkitgtk-test-dicts", nullptr));
+    if (g_file_test(dictionariesPath.get(), static_cast<GFileTest>(G_FILE_TEST_IS_DIR))) {
+        scanDirectoryForDicionaries(dictionariesPath.get(), availableLocales);
+        return;
+    }
+
+    // Try alternative dictionaries path for people not using JHBuild.
+    dictionariesPath.reset(g_build_filename(buildDirectory.data(), "webkitgtk-test-dicts", nullptr));
+    scanDirectoryForDicionaries(dictionariesPath.get(), availableLocales);
+}
+#endif
+
+static HashMap<AtomicString, String>& availableLocales()
+{
+    static bool scannedLocales = false;
+    static HashMap<AtomicString, String> availableLocales;
+
+    if (!scannedLocales) {
+        for (size_t i = 0; i < WTF_ARRAY_LENGTH(gDictionaryDirectories); i++)
+            scanDirectoryForDicionaries(gDictionaryDirectories[i], availableLocales);
+
+#if defined(DEVELOPMENT_BUILD)
+        scanTestDictionariesDirectoryIfNecessary(availableLocales);
+#endif
+
+        scannedLocales = true;
+    }
+
+    return availableLocales;
+}
+
+bool canHyphenate(const AtomicString& localeIdentifier)
+{
+    if (localeIdentifier.isNull())
+        return false;
+    return availableLocales().contains(localeIdentifier);
+}
+
+class HyphenationDictionary : public RefCounted<HyphenationDictionary> {
+    WTF_MAKE_NONCOPYABLE(HyphenationDictionary);
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    typedef std::unique_ptr<HyphenDict, void(*)(HyphenDict*)> HyphenDictUniquePtr;
+
+    virtual ~HyphenationDictionary() { }
+    static RefPtr<HyphenationDictionary> createNull()
+    {
+        return adoptRef(new HyphenationDictionary());
+    }
+
+    static RefPtr<HyphenationDictionary> create(const CString& dictPath)
+    {
+        return adoptRef(new HyphenationDictionary(dictPath));
+    }
+
+    HyphenDict* libhyphenDictionary() const
+    {
+        return m_libhyphenDictionary.get();
+    }
+
+private:
+    HyphenationDictionary(const CString& dictPath)
+        : m_libhyphenDictionary(HyphenDictUniquePtr(hnj_hyphen_load(dictPath.data()), hnj_hyphen_free))
+    {
+    }
+
+    HyphenationDictionary()
+        : m_libhyphenDictionary(HyphenDictUniquePtr(nullptr, hnj_hyphen_free))
+    {
+    }
+
+    HyphenDictUniquePtr m_libhyphenDictionary;
+};
+
+template<>
+RefPtr<HyphenationDictionary> AtomicStringKeyedMRUCache<RefPtr<HyphenationDictionary>>::createValueForNullKey()
+{
+    return HyphenationDictionary::createNull();
+}
+
+template<>
+RefPtr<HyphenationDictionary> AtomicStringKeyedMRUCache<RefPtr<HyphenationDictionary>>::createValueForKey(const AtomicString& localeIdentifier)
+{
+    ASSERT(availableLocales().get(localeIdentifier));
+    return HyphenationDictionary::create(fileSystemRepresentation(availableLocales().get(localeIdentifier)));
+}
+
+static AtomicStringKeyedMRUCache<RefPtr<HyphenationDictionary>>& hyphenDictionaryCache()
+{
+    static NeverDestroyed<AtomicStringKeyedMRUCache<RefPtr<HyphenationDictionary>>> cache;
+    return cache;
+}
+
+static void countLeadingSpaces(const CString& utf8String, int32_t& pointerOffset, int32_t& characterOffset)
+{
+    pointerOffset = 0;
+    characterOffset = 0;
+    const char* stringData = utf8String.data();
+    UChar32 character = 0;
+    while (static_cast<unsigned>(pointerOffset) < utf8String.length()) {
+        int32_t nextPointerOffset = pointerOffset;
+        U8_NEXT(stringData, nextPointerOffset, static_cast<int32_t>(utf8String.length()), character);
+
+        if (character < 0 || !u_isUWhiteSpace(character))
+            return;
+
+        pointerOffset = nextPointerOffset;
+        characterOffset++;
+    }
+}
+
+size_t lastHyphenLocation(StringView string, size_t beforeIndex, const AtomicString& localeIdentifier)
+{
+    ASSERT(availableLocales().contains(localeIdentifier));
+    RefPtr<HyphenationDictionary> dictionary = hyphenDictionaryCache().get(localeIdentifier);
+
+    // libhyphen accepts strings in UTF-8 format, but WebCore can only provide StringView
+    // which stores either UTF-16 or Latin1 data. This is unfortunate for performance
+    // reasons and we should consider switching to a more flexible hyphenation library
+    // if it is available.
+    CString utf8StringCopy = string.toStringWithoutCopying().utf8();
+
+    // WebCore often passes strings like " wordtohyphenate" to the platform layer. Since
+    // libhyphen isn't advanced enough to deal with leading spaces (presumably CoreFoundation
+    // can), we should find the appropriate indexes into the string to skip them.
+    int32_t leadingSpaceBytes;
+    int32_t leadingSpaceCharacters;
+    countLeadingSpaces(utf8StringCopy, leadingSpaceBytes, leadingSpaceCharacters);
+
+    // The libhyphen documentation specifies that this array should be 5 bytes longer than
+    // the byte length of the input string.
+    Vector<char> hyphenArray(utf8StringCopy.length() - leadingSpaceBytes + 5);
+    char* hyphenArrayData = hyphenArray.data();
+
+    char** replacements = nullptr;
+    int* positions = nullptr;
+    int* removedCharacterCounts = nullptr;
+    hnj_hyphen_hyphenate2(dictionary->libhyphenDictionary(),
+        utf8StringCopy.data() + leadingSpaceBytes,
+        utf8StringCopy.length() - leadingSpaceBytes,
+        hyphenArrayData,
+        nullptr, /* output parameter for hyphenated word */
+        &replacements,
+        &positions,
+        &removedCharacterCounts);
+
+    if (replacements) {
+        for (unsigned i = 0; i < utf8StringCopy.length() - leadingSpaceBytes - 1; i++)
+            free(replacements[i]);
+        free(replacements);
+    }
+
+    free(positions);
+    free(removedCharacterCounts);
+
+    for (int i = beforeIndex - leadingSpaceCharacters - 1; i >= 0; i--) {
+        // libhyphen will put an odd number in hyphenArrayData at all
+        // hyphenation points. A number & 1 will be true for odd numbers.
+        if (hyphenArrayData[i] & 1)
+            return i + leadingSpaceCharacters;
+    }
+
+    return 0;
+}
+
+} // namespace WebCore
+
+#endif // USE(LIBHYPHEN)
diff --git a/Source/cmake/FindHyphen.cmake b/Source/cmake/FindHyphen.cmake
new file mode 100644 (file)
index 0000000..47dfdb4
--- /dev/null
@@ -0,0 +1,45 @@
+# - Try to find libhyphen
+# Once done, this will define
+#
+#  HYPHEN_FOUND - system has libhyphen installed.
+#  HYPHEN_INCLUDE_DIR - directories which contain the libhyphen headers.
+#  HYPHEN_LIBRARY - libraries required to link against libhyphen.
+#
+# Copyright (C) 2012 Intel Corporation. All rights reserved.
+# Copyright (C) 2015 Igalia S.L.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
+# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+find_path(HYPHEN_INCLUDE_DIR NAMES hyphen.h)
+find_library(HYPHEN_LIBRARIES NAMES hyphen hnj)
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(HYPHEN DEFAULT_MSG HYPHEN_INCLUDE_DIR HYPHEN_LIBRARIES)
+
+if (HYPHEN_INCLUDE_DIR AND HYPHEN_LIBRARIES)
+    set(HYPHEN_FOUND 1)
+else ()
+    set(HYPHEN_FOUND 0)
+endif ()
+
+mark_as_advanced(HYPHEN_INCLUDE_DIR HYPHEN_LIBRARIES HYPHEN_FOUND)
index 6bf82a2..c93e696 100644 (file)
@@ -53,6 +53,7 @@ WEBKIT_OPTION_DEFINE(ENABLE_PLUGIN_PROCESS_GTK2 "Whether to build WebKitPluginPr
 WEBKIT_OPTION_DEFINE(ENABLE_X11_TARGET "Whether to enable support for the X11 windowing target." PUBLIC ON)
 WEBKIT_OPTION_DEFINE(ENABLE_WAYLAND_TARGET "Whether to enable support for the Wayland windowing target." PUBLIC OFF)
 WEBKIT_OPTION_DEFINE(USE_LIBNOTIFY "Whether to enable the default web notification implementation." PUBLIC ON)
+WEBKIT_OPTION_DEFINE(USE_LIBHYPHEN "Whether to enable the default automatic hyphenation implementation." PUBLIC ON)
 
 WEBKIT_OPTION_DEFINE(USE_GSTREAMER_GL "Whether to enable support for GStreamer GL" PRIVATE OFF)
 WEBKIT_OPTION_DEFINE(USE_GSTREAMER_MPEGTS "Whether to enable support for MPEG-TS" PRIVATE OFF)
@@ -378,6 +379,14 @@ if (USE_LIBNOTIFY)
     SET_AND_EXPOSE_TO_BUILD(WTF_USE_LIBNOTIFY TRUE)
 endif ()
 
+if (HYPHEN_FOUND)
+    find_package(Hyphen)
+    if (NOT LIBHYPHEN_FOUND)
+       message(FATAL_ERROR "libhyphen is needed for USE_LIBHYPHEN.")
+    endif ()
+    SET_AND_EXPOSE_TO_BUILD(WTF_USE_LIBHYPHEN 1)
+endif ()
+
 set(DERIVED_SOURCES_GOBJECT_DOM_BINDINGS_DIR ${DERIVED_SOURCES_DIR}/webkitdom)
 set(DERIVED_SOURCES_WEBKITGTK_DIR ${DERIVED_SOURCES_DIR}/webkitgtk)
 set(DERIVED_SOURCES_WEBKITGTK_API_DIR ${DERIVED_SOURCES_WEBKITGTK_DIR}/webkit)
index a5f9034..f654d5b 100644 (file)
@@ -1,3 +1,13 @@
+2015-04-29  Martin Robinson  <mrobinson@igalia.com>
+
+        [GTK] Add support for automatic hyphenation
+        https://bugs.webkit.org/show_bug.cgi?id=44478
+
+        Reviewed by Carlos Garcia Campos.
+
+        * gtk/jhbuild.modules: Add a module for testing dictionaries, so that
+        all systems will use the same dictionaries for testing purposes.
+
 2015-04-29  Jake Nielsen  <jacob_nielsen@apple.com>
 
         Failure when building WebKit for appletvsimulator.
index 75573dd..353f75b 100644 (file)
     <branch repo="github.com" module="mrobinson/webkitgtk-test-fonts.git" checkoutdir="webkitgtk-test-fonts" tag="0.0.5"/>
   </autotools>
 
+  <autotools id="dicts"
+             skip-autogen="true">
+    <branch repo="github.com" module="mrobinson/webkitgtk-test-dicts.git" checkoutdir="webkitgtk-test-dicts" tag="0.0.1"/>
+  </autotools>
+
   <autotools id="freetype6" autogen-sh="configure">
     <branch module="freetype/freetype-2.4.11.tar.bz2" version="2.4.11"
             repo="savannah.gnu.org"