Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(281)

Side by Side Diff: webkit/mocks/mock_webhyphenator.cc

Issue 12335128: Switch from using individual methods for hyphenation to using the WebHyphantor interface (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: updates Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/mocks/mock_webhyphenator.h ('k') | webkit/support/test_webkit_platform_support.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "webkit/mocks/mock_webhyphenator.h"
6
7 #include "base/logging.h"
8 #include "base/memory/scoped_handle.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/string_util.h"
11 #include "third_party/hyphen/hyphen.h"
12
13 namespace webkit_glue {
14
15 MockWebHyphenator::MockWebHyphenator()
16 : hyphen_dictionary_(NULL) {
17 }
18
19 MockWebHyphenator::~MockWebHyphenator() {
20 if (hyphen_dictionary_)
21 hnj_hyphen_free(hyphen_dictionary_);
22 }
23
24 void MockWebHyphenator::LoadDictionary(base::PlatformFile dict_file) {
25 CHECK(!hyphen_dictionary_);
26 // Initialize the hyphen library with a sample dictionary. To avoid test
27 // flakiness, this code synchronously loads the dictionary.
28 if (dict_file == base::kInvalidPlatformFileValue) {
29 NOTREACHED();
30 return;
31 }
32 ScopedStdioHandle dict_handle(base::FdopenPlatformFile(dict_file, "r"));
33 if (!dict_handle.get()) {
34 NOTREACHED();
35 base::ClosePlatformFile(dict_file);
36 return;
37 }
38 hyphen_dictionary_ = hnj_hyphen_load_file(dict_handle.get());
39 DCHECK(hyphen_dictionary_);
40 }
41
42 bool MockWebHyphenator::canHyphenate(const WebKit::WebString& locale) {
43 return locale.isEmpty() || locale.equals("en") || locale.equals("en_US") ||
44 locale.equals("en_GB");
45 }
46
47 size_t MockWebHyphenator::computeLastHyphenLocation(
48 const char16* characters,
49 size_t length,
50 size_t before_index,
51 const WebKit::WebString& locale) {
52 DCHECK(locale.isEmpty() || locale.equals("en") || locale.equals("en_US") ||
53 locale.equals("en_GB"));
54 if (!hyphen_dictionary_)
55 return 0;
56
57 // Retrieve the positions where we can insert hyphens. This function assumes
58 // the input word is an English word so it can use the position returned by
59 // the hyphen library without conversion.
60 string16 word_utf16(characters, length);
61 if (!IsStringASCII(word_utf16))
62 return 0;
63 std::string word = StringToLowerASCII(UTF16ToASCII(word_utf16));
64 scoped_array<char> hyphens(new char[word.length() + 5]);
65 char** rep = NULL;
66 int* pos = NULL;
67 int* cut = NULL;
68 int error = hnj_hyphen_hyphenate2(hyphen_dictionary_,
69 word.data(),
70 static_cast<int>(word.length()),
71 hyphens.get(),
72 NULL,
73 &rep,
74 &pos,
75 &cut);
76 if (error)
77 return 0;
78
79 // Release all resources allocated by the hyphen library now because they are
80 // not used when hyphenating English words.
81 if (rep) {
82 for (size_t i = 0; i < word.length(); ++i) {
83 if (rep[i])
84 free(rep[i]);
85 }
86 free(rep);
87 }
88 if (pos)
89 free(pos);
90 if (cut)
91 free(cut);
92
93 // Retrieve the last position where we can insert a hyphen before the given
94 // index.
95 if (before_index >= 2) {
96 for (size_t index = before_index - 2; index > 0; --index) {
97 if (hyphens[index] & 1)
98 return index + 1;
99 }
100 }
101 return 0;
102 }
103
104 } // namespace webkit_glue
OLDNEW
« no previous file with comments | « webkit/mocks/mock_webhyphenator.h ('k') | webkit/support/test_webkit_platform_support.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698