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

Unified Diff: Source/platform/fonts/GlyphPageTreeNodeTest.cpp

Issue 243453003: Proper unicode-range font loading behavior (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: Source/platform/fonts/GlyphPageTreeNodeTest.cpp
diff --git a/Source/platform/fonts/GlyphPageTreeNodeTest.cpp b/Source/platform/fonts/GlyphPageTreeNodeTest.cpp
index eadfa4a359361e1e569d91139e4a73e33b2eed08..51cc356c44e9e2bdad81bd58ef7c77fb17b09e5d 100644
--- a/Source/platform/fonts/GlyphPageTreeNodeTest.cpp
+++ b/Source/platform/fonts/GlyphPageTreeNodeTest.cpp
@@ -11,16 +11,29 @@
namespace WebCore {
+class TestCustomFontData : public CustomFontData {
+public:
+ static PassRefPtr<TestCustomFontData> create() { return adoptRef(new TestCustomFontData()); }
+private:
+ TestCustomFontData() { }
+ virtual bool isLoadingFallback() const OVERRIDE { return true; }
+};
+
class TestSimpleFontData : public SimpleFontData {
public:
static PassRefPtr<TestSimpleFontData> create(UChar32 from, UChar32 to)
{
- return adoptRef(new TestSimpleFontData(from, to));
+ return adoptRef(new TestSimpleFontData(nullptr, from, to));
+ }
+
+ static PassRefPtr<TestSimpleFontData> createUnloaded(UChar32 from, UChar32 to)
+ {
+ return adoptRef(new TestSimpleFontData(TestCustomFontData::create(), from, to));
}
private:
- TestSimpleFontData(UChar32 from, UChar32 to)
- : SimpleFontData(nullptr, 10, false, false)
+ TestSimpleFontData(PassRefPtr<CustomFontData> customData, UChar32 from, UChar32 to)
+ : SimpleFontData(customData, 10, false, false)
, m_from(from)
, m_to(to)
{
@@ -51,17 +64,16 @@ TEST(GlyphPageTreeNode, rootChild)
{
const unsigned kPageNumber = 0;
size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
-
- RefPtr<TestSimpleFontData> data = TestSimpleFontData::create('a', 'z');
- GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(data.get(), kPageNumber);
- EXPECT_EQ(pageCountBeforeTest + 1, GlyphPageTreeNode::treeGlyphPageCount());
- EXPECT_TRUE(node->page()->glyphAt('a'));
- EXPECT_FALSE(node->page()->glyphAt('A'));
- EXPECT_FALSE(node->isSystemFallback());
- EXPECT_EQ(1u, node->level());
- EXPECT_EQ(node, node->page()->owner());
-
- GlyphPageTreeNode::pruneTreeFontData(data.get());
+ {
+ RefPtr<TestSimpleFontData> data = TestSimpleFontData::create('a', 'z');
+ GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(data.get(), kPageNumber);
+ EXPECT_EQ(pageCountBeforeTest + 1, GlyphPageTreeNode::treeGlyphPageCount());
+ EXPECT_TRUE(node->page()->glyphAt('a'));
+ EXPECT_FALSE(node->page()->glyphAt('A'));
+ EXPECT_FALSE(node->isSystemFallback());
+ EXPECT_EQ(1u, node->level());
+ EXPECT_EQ(node, node->page()->owner());
+ }
EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
}
@@ -69,20 +81,18 @@ TEST(GlyphPageTreeNode, level2)
{
const unsigned kPageNumber = 0;
size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
-
- RefPtr<TestSimpleFontData> dataAtoC = TestSimpleFontData::create('A', 'C');
- RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::create('C', 'E');
- GlyphPageTreeNode* node1 = GlyphPageTreeNode::getRootChild(dataAtoC.get(), kPageNumber);
- GlyphPageTreeNode* node2 = node1->getChild(dataCtoE.get(), kPageNumber);
- EXPECT_EQ(pageCountBeforeTest + 3, GlyphPageTreeNode::treeGlyphPageCount());
-
- EXPECT_EQ(2u, node2->level());
- EXPECT_EQ(dataAtoC, node2->page()->fontDataForCharacter('A'));
- EXPECT_EQ(dataAtoC, node2->page()->fontDataForCharacter('C'));
- EXPECT_EQ(dataCtoE, node2->page()->fontDataForCharacter('E'));
-
- GlyphPageTreeNode::pruneTreeFontData(dataAtoC.get());
- GlyphPageTreeNode::pruneTreeFontData(dataCtoE.get());
+ {
+ RefPtr<TestSimpleFontData> dataAtoC = TestSimpleFontData::create('A', 'C');
+ RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::create('C', 'E');
+ GlyphPageTreeNode* node1 = GlyphPageTreeNode::getRootChild(dataAtoC.get(), kPageNumber);
+ GlyphPageTreeNode* node2 = node1->getChild(dataCtoE.get(), kPageNumber);
+ EXPECT_EQ(pageCountBeforeTest + 3, GlyphPageTreeNode::treeGlyphPageCount());
+
+ EXPECT_EQ(2u, node2->level());
+ EXPECT_EQ(dataAtoC, node2->page()->glyphDataForCharacter('A').fontData);
+ EXPECT_EQ(dataAtoC, node2->page()->glyphDataForCharacter('C').fontData);
+ EXPECT_EQ(dataCtoE, node2->page()->glyphDataForCharacter('E').fontData);
+ }
EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
}
@@ -90,21 +100,20 @@ TEST(GlyphPageTreeNode, segmentedData)
{
const unsigned kPageNumber = 0;
size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
-
- RefPtr<TestSimpleFontData> dataBtoC = TestSimpleFontData::create('B', 'C');
- RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::create('C', 'E');
- RefPtr<SegmentedFontData> segmentedData = SegmentedFontData::create();
- segmentedData->appendRange(FontDataRange('A', 'C', dataBtoC));
- segmentedData->appendRange(FontDataRange('C', 'D', dataCtoE));
- GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(segmentedData.get(), kPageNumber);
-
- EXPECT_EQ(0, node->page()->fontDataForCharacter('A'));
- EXPECT_EQ(dataBtoC, node->page()->fontDataForCharacter('B'));
- EXPECT_EQ(dataBtoC, node->page()->fontDataForCharacter('C'));
- EXPECT_EQ(dataCtoE, node->page()->fontDataForCharacter('D'));
- EXPECT_EQ(0, node->page()->fontDataForCharacter('E'));
-
- GlyphPageTreeNode::pruneTreeCustomFontData(segmentedData.get());
+ {
+ RefPtr<TestSimpleFontData> dataBtoC = TestSimpleFontData::create('B', 'C');
+ RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::create('C', 'E');
+ RefPtr<SegmentedFontData> segmentedData = SegmentedFontData::create();
+ segmentedData->appendRange(FontDataRange('A', 'C', dataBtoC));
+ segmentedData->appendRange(FontDataRange('C', 'D', dataCtoE));
+ GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(segmentedData.get(), kPageNumber);
+
+ EXPECT_EQ(0, node->page()->glyphDataForCharacter('A').fontData);
+ EXPECT_EQ(dataBtoC, node->page()->glyphDataForCharacter('B').fontData);
+ EXPECT_EQ(dataBtoC, node->page()->glyphDataForCharacter('C').fontData);
+ EXPECT_EQ(dataCtoE, node->page()->glyphDataForCharacter('D').fontData);
+ EXPECT_EQ(0, node->page()->glyphDataForCharacter('E').fontData);
+ }
EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
}
@@ -112,16 +121,105 @@ TEST(GlyphPageTreeNode, outsideBMP)
{
const unsigned kPageNumber = 0x1f300 / GlyphPage::size;
size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
+ {
+ RefPtr<TestSimpleFontData> data = TestSimpleFontData::create(0x1f310, 0x1f320);
+ GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(data.get(), kPageNumber);
+ EXPECT_EQ(pageCountBeforeTest + 1, GlyphPageTreeNode::treeGlyphPageCount());
+ EXPECT_FALSE(node->page()->glyphForCharacter(0x1f30f));
+ EXPECT_TRUE(node->page()->glyphForCharacter(0x1f310));
+ EXPECT_TRUE(node->page()->glyphForCharacter(0x1f320));
+ EXPECT_FALSE(node->page()->glyphForCharacter(0x1f321));
+ }
+ EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
+}
- RefPtr<TestSimpleFontData> data = TestSimpleFontData::create(0x1f310, 0x1f320);
- GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(data.get(), kPageNumber);
- EXPECT_EQ(pageCountBeforeTest + 1, GlyphPageTreeNode::treeGlyphPageCount());
- EXPECT_FALSE(node->page()->glyphForCharacter(0x1f30f));
- EXPECT_TRUE(node->page()->glyphForCharacter(0x1f310));
- EXPECT_TRUE(node->page()->glyphForCharacter(0x1f320));
- EXPECT_FALSE(node->page()->glyphForCharacter(0x1f321));
+TEST(GlyphPageTreeNode, customData)
+{
+ const unsigned kPageNumber = 0;
+ size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
+ {
+ RefPtr<TestSimpleFontData> dataAtoC = TestSimpleFontData::createUnloaded('A', 'C');
+ RefPtr<TestSimpleFontData> dataBtoD = TestSimpleFontData::create('B', 'D');
+ RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::createUnloaded('C', 'E');
+ RefPtr<SegmentedFontData> segmentedData = SegmentedFontData::create();
+ segmentedData->appendRange(FontDataRange('A', 'C', dataAtoC));
+ segmentedData->appendRange(FontDataRange('B', 'D', dataBtoD));
+ segmentedData->appendRange(FontDataRange('C', 'E', dataCtoE));
+ GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(segmentedData.get(), kPageNumber);
+
+ EXPECT_EQ(0, node->page()->glyphDataForCharacter('A').fontData);
+ EXPECT_EQ(dataBtoD, node->page()->glyphDataForCharacter('B').fontData);
+ EXPECT_EQ(dataBtoD, node->page()->glyphDataForCharacter('C').fontData);
+ EXPECT_EQ(dataBtoD, node->page()->glyphDataForCharacter('D').fontData);
+ EXPECT_EQ(0, node->page()->glyphDataForCharacter('E').fontData);
+
+ EXPECT_EQ(dataAtoC->customFontData(), node->page()->customFontToLoadAt('A'));
+ EXPECT_EQ(dataAtoC->customFontData(), node->page()->customFontToLoadAt('B'));
+ EXPECT_EQ(dataAtoC->customFontData(), node->page()->customFontToLoadAt('C'));
+ EXPECT_EQ(0, node->page()->customFontToLoadAt('D'));
+ EXPECT_EQ(dataCtoE->customFontData(), node->page()->customFontToLoadAt('E'));
+ }
+ EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
+}
+
+TEST(GlyphPageTreeNode, customDataWithMultiplePages)
+{
+ const unsigned kPageNumber = 0;
+ size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
+ {
+ RefPtr<TestSimpleFontData> dataAtoC = TestSimpleFontData::createUnloaded('A', 'C');
+ RefPtr<TestSimpleFontData> dataBtoD = TestSimpleFontData::create('B', 'D');
+ RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::createUnloaded('C', 'E');
+ RefPtr<SegmentedFontData> segmentedData1 = SegmentedFontData::create();
+ RefPtr<SegmentedFontData> segmentedData2 = SegmentedFontData::create();
+ RefPtr<SegmentedFontData> segmentedData3 = SegmentedFontData::create();
+ segmentedData1->appendRange(FontDataRange('A', 'C', dataAtoC));
+ segmentedData2->appendRange(FontDataRange('B', 'D', dataBtoD));
+ segmentedData3->appendRange(FontDataRange('C', 'E', dataCtoE));
+ GlyphPageTreeNode* node1 = GlyphPageTreeNode::getRootChild(segmentedData1.get(), kPageNumber);
+ GlyphPageTreeNode* node2 = node1->getChild(segmentedData2.get(), kPageNumber);
+ GlyphPageTreeNode* node3 = node2->getChild(segmentedData3.get(), kPageNumber);
+
+ EXPECT_EQ(0, node3->page()->glyphDataForCharacter('A').fontData);
+ EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('B').fontData);
+ EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('C').fontData);
+ EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('D').fontData);
+ EXPECT_EQ(0, node3->page()->glyphDataForCharacter('E').fontData);
+
+ EXPECT_EQ(dataAtoC->customFontData(), node3->page()->customFontToLoadAt('A'));
+ EXPECT_EQ(dataAtoC->customFontData(), node3->page()->customFontToLoadAt('B'));
+ EXPECT_EQ(dataAtoC->customFontData(), node3->page()->customFontToLoadAt('C'));
+ EXPECT_EQ(0, node3->page()->customFontToLoadAt('D'));
+ EXPECT_EQ(dataCtoE->customFontData(), node3->page()->customFontToLoadAt('E'));
+ }
+ EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
+}
- GlyphPageTreeNode::pruneTreeFontData(data.get());
+TEST(GlyphPageTreeNode, systemFallback)
+{
+ const unsigned kPageNumber = 0;
+ size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
+ {
+ RefPtr<TestSimpleFontData> dataAtoC = TestSimpleFontData::createUnloaded('A', 'C');
+ RefPtr<TestSimpleFontData> dataBtoD = TestSimpleFontData::create('B', 'D');
+ RefPtr<SegmentedFontData> segmentedData = SegmentedFontData::create();
+ segmentedData->appendRange(FontDataRange('A', 'C', dataAtoC));
+ GlyphPageTreeNode* node1 = GlyphPageTreeNode::getRootChild(segmentedData.get(), kPageNumber);
+ GlyphPageTreeNode* node2 = node1->getChild(dataBtoD.get(), kPageNumber);
+ GlyphPageTreeNode* node3 = node2->getChild(0, kPageNumber);
+
+ EXPECT_TRUE(node3->isSystemFallback());
+
+ EXPECT_EQ(0, node3->page()->glyphDataForCharacter('A').fontData);
+ EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('B').fontData);
+ EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('C').fontData);
+ EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('D').fontData);
+
+ EXPECT_EQ(dataAtoC->customFontData(), node3->page()->customFontToLoadAt('A'));
+ EXPECT_EQ(dataAtoC->customFontData(), node3->page()->customFontToLoadAt('B'));
+ EXPECT_EQ(dataAtoC->customFontData(), node3->page()->customFontToLoadAt('C'));
+ EXPECT_EQ(0, node3->page()->customFontToLoadAt('D'));
+ }
EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
}
« Source/platform/fonts/GlyphPageTreeNode.cpp ('K') | « Source/platform/fonts/GlyphPageTreeNode.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698