Roll src/third_party/WebKit d9c6159:8139f33 (svn 201974:201975)
[chromium-blink-merge.git] / chrome / test / chromedriver / js / get_element_region.js
blob126a753e6bc7203c8693e283049cde5a413b3a73
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.
5 function getElementRegion(element) {
6   // Check that node type is element.
7   if (element.nodeType != 1)
8     throw new Error(element + ' is not an element');
10   // We try 2 methods to determine element region. Try the first client rect,
11   // and then the bounding client rect.
12   // SVG is one case that doesn't have a first client rect.
13   var clientRects = element.getClientRects();
15   // Element area of a map has same first ClientRect and BoundingClientRect
16   // after blink roll at chromium commit position 290738 which includes blink
17   // revision 180610. Thus handle area as a special case.
18   if (clientRects.length == 0 || element.tagName.toLowerCase() == 'area') {
19     var box = element.getBoundingClientRect();
20     if (element.tagName.toLowerCase() == 'area') {
21       var coords = element.coords.split(',');
22       if (element.shape.toLowerCase() == 'rect') {
23         if (coords.length != 4)
24           throw new Error('failed to detect the region of the area');
25         var leftX = Number(coords[0]);
26         var topY = Number(coords[1]);
27         var rightX = Number(coords[2]);
28         var bottomY = Number(coords[3]);
29         return {
30             'left': leftX,
31             'top': topY,
32             'width': rightX - leftX,
33             'height': bottomY - topY
34         };
35       } else if (element.shape.toLowerCase() == 'circle') {
36         if (coords.length != 3)
37           throw new Error('failed to detect the region of the area');
38         var centerX = Number(coords[0]);
39         var centerY = Number(coords[1]);
40         var radius = Number(coords[2]);
41         return {
42             'left': Math.max(0, centerX - radius),
43             'top': Math.max(0, centerY - radius),
44             'width': radius * 2,
45             'height': radius * 2
46         };
47       } else if (element.shape.toLowerCase() == 'poly') {
48         if (coords.length < 2)
49           throw new Error('failed to detect the region of the area');
50         var minX = Number(coords[0]);
51         var minY = Number(coords[1]);
52         var maxX = minX;
53         var maxY = minY;
54         for (i = 2; i < coords.length; i += 2) {
55           var x = Number(coords[i]);
56           var y = Number(coords[i + 1]);
57           minX = Math.min(minX, x);
58           minY = Math.min(minY, y);
59           maxX = Math.max(maxX, x);
60           maxY = Math.max(maxY, y);
61         }
62         return {
63             'left': minX,
64             'top': minY,
65             'width': maxX - minX,
66             'height': maxY - minY
67         };
68       } else {
69         throw new Error('shape=' + element.shape + ' is not supported');
70       }
71     }
72     return {
73         'left': 0,
74         'top': 0,
75         'width': box.width,
76         'height': box.height
77     };
78   } else {
79     var box = element.getBoundingClientRect();
80     var clientRect = clientRects[0];
81     for (var i = 0; i < clientRects.length; i++) {
82       if (clientRects[i].height != 0 && clientRects[i].width != 0) {
83         clientRect = clientRects[i];
84         break;
85       }
86     }
87     return {
88         'left': clientRect.left - box.left,
89         'top': clientRect.top - box.top,
90         'width': clientRect.right - clientRect.left,
91         'height': clientRect.bottom - clientRect.top
92     };
93   }