[CSS Regions] Add performance tests for selection with mixed content
[WebKit-https.git] / PerformanceTests / Layout / resources / regions.js
1 (function() {
2     var templateParagraph = null;
3     var templateRegion = null;
4     var templateNode = null;
5     var DEFAULT_PARAGRAPH_COUNT = 100;
6     var DEFAULT_REGION_COUNT = 100;
7
8     function createParagraphNode(breakChance) {
9         if (!templateParagraph) {
10             templateParagraph = document.createElement("p");
11             templateParagraph.innerHTML = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam at turpis placerat sapien congue viverra nec sed felis.\
12                 Aenean aliquam, justo eu condimentum pharetra, arcu eros blandit metus, nec lacinia nisi orci vitae nunc.\
13                 Proin orci libero, accumsan non dignissim at, sodales in sapien. Curabitur dui nibh, venenatis vel tempus vel, accumsan nec velit.\
14                 Nam sit amet tempor lacus. Sed mollis dolor nibh, non tempus leo. Donec magna odio, commodo id porta in, aliquam mollis eros.\
15                 Pellentesque vulputate gravida ligula in elementum. Fusce lacinia massa justo, at porttitor orci.\
16                 Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec odio quam, pulvinar ut porttitor ac, tempor vitae ligula.\
17                 Cras aliquet sapien id sapien mollis nec pulvinar mauris adipiscing. Praesent porttitor consequat augue, sit amet mollis justo condimentum eu.\
18                 Etiam ut erat pellentesque orci congue interdum. Nulla eu eros mi.\
19                 Curabitur rutrum, lorem ac malesuada pellentesque, sapien risus consequat massa, eget pellentesque nunc nulla vel sem.";
20             templateParagraph.className = "contentParagraph";
21         }
22
23         var paragraph = templateParagraph.cloneNode(true);
24         var randomNumber = PerfTestRunner.random();
25         if (randomNumber < breakChance)
26             paragraph.className = paragraph.className + " breakAfter";
27         return paragraph;
28     }
29
30     function createRegionNode(regionWidth, regionHeight, regionMaxHeight) {
31         if (!templateRegion) {
32             templateRegion = document.createElement("div");
33             templateRegion.className = "region";
34         }
35
36         var region = templateRegion.cloneNode(false);
37         region.style.width = regionWidth;
38         region.style.height = regionHeight;
39         region.style.maxHeight = regionMaxHeight;
40         return region;
41     }
42
43     function createRegularNode(nodeWidth, nodeHeight, nodeMaxHeight) {
44         if (!templateNode) {
45             templateNode = document.createElement("div");
46             templateNode.appendChild(createParagraphNode(0));
47             templateNode.className = "regular";
48         }
49
50         var node = templateNode.cloneNode(true);
51         node.style.width = nodeWidth;
52         node.style.height = nodeHeight;
53         node.style.maxHeight = nodeMaxHeight;
54         return node;
55     }
56
57     function createArticle(paragraphCount, breakChance) {
58         var article = document.createElement("div");
59         for (var i = 0 ; i < paragraphCount; ++i) {
60             article.appendChild(createParagraphNode(breakChance));
61         }
62         article.className = "articleNone";
63         return article;
64     }
65
66     function createRegions(regionWidth, regionHeight, regionCount, regionMaxHeight) {
67         var regionContainer = document.createElement("div");
68         for (var i = 0; i < regionCount; ++i) {
69             regionContainer.appendChild(createRegionNode(regionWidth, regionHeight, regionMaxHeight));
70         }
71         regionContainer.className = "regionContainer";
72         return regionContainer;
73     }
74
75     function createRegionsTest(regionWidth, regionHeight, regionCount, paragraphCount, regionMaxHeight, breakChance) {
76         paragraphCount = paragraphCount || DEFAULT_PARAGRAPH_COUNT;
77         regionCount = regionCount || DEFAULT_REGION_COUNT;
78         regionMaxHeight = regionMaxHeight || "auto";
79         breakChance = breakChance || 0;
80
81         var article = createArticle(paragraphCount, breakChance);
82         var regions = createRegions(regionWidth, regionHeight, regionCount, regionMaxHeight);
83         document.body.appendChild(article);
84         document.body.appendChild(regions);
85         return {
86             description: "Testing regions with " + regionCount + " regions @{width: " + regionWidth + ", height: " + regionHeight + 
87             ", maxHeight: " + regionMaxHeight + "} and " + paragraphCount + " paragraphs",
88             run: function() {
89                 article.className = "articleInFlow";
90                 document.body.offsetTop;
91             },
92             setup: function() {
93                 PerfTestRunner.resetRandomSeed();
94                 article.className = "articleNone";
95                 document.body.offsetTop;
96             },
97             done: function() {
98                 document.body.removeChild(article);
99                 document.body.removeChild(regions);
100                 templateParagraph = null;
101                 templateRegion = null;
102             }
103         };
104     }
105
106     function performSelection(paragraphCount) {
107         var paragraphs = document.getElementsByClassName("contentParagraph");
108         var selection = getSelection();
109
110         selection.collapse(paragraphs[0], 0);
111
112         for (var i = 1; i < paragraphCount; i++)
113             selection.extend(paragraphs[i], 0);
114     }
115
116     function createRegionsSelectionTest(regionCount) {
117         var article = createArticle(regionCount, 1);
118         article.className = "articleInFlow";
119         var regions = createRegions("600px", "auto", regionCount, "auto");
120         document.body.appendChild(article);
121         document.body.appendChild(regions);
122         return {
123             description: "Testing selection with " + regionCount + " regions. Select text from first region to last one passing through all the regions.",
124             run: function() {
125                 performSelection(regionCount);
126             },
127             setup: function() {
128                 window.getSelection().removeAllRanges();
129             },
130             done: function() {
131                 document.body.removeChild(article);
132                 document.body.removeChild(regions);
133                 templateParagraph = null;
134                 templateRegion = null;
135             }
136         };
137     }
138
139     function createMixedContent(regionCount) {
140         var container = document.createElement("div");
141         for (var i = 0; i < regionCount; ++i) {
142             container.appendChild(createRegularNode("600px", "auto", "auto"));
143             container.appendChild(createRegionNode("600px", "auto", "auto"));
144         }
145         return container;
146     }
147
148     window.createRegionsTest = createRegionsTest;
149     window.createRegionsSelectionTest = createRegionsSelectionTest;
150     window.createArticle = createArticle;
151     window.createMixedContent = createMixedContent;
152
153 })();