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