| OLD | NEW | 
 | (Empty) | 
|   1 // Some of the js-test.js boilerplate will add stuff to the top of the document 
    early |  | 
|   2 // enough to screw with frame offsets that are measured by the test.  Delay all 
    that |  | 
|   3 // jazz until the actual test code is finished. |  | 
|   4 if (self.isJsTest) { |  | 
|   5   setPrintTestResultsLazily(); |  | 
|   6   self.jsTestIsAsync = true; |  | 
|   7 } |  | 
|   8  |  | 
|   9 // waitForNotification is a setTimeout wrapped in a setTimeout wrapped in a |  | 
|  10 // requestAnimationFrame.  What in the wide, wide world of sports is going on he
    re? |  | 
|  11 // |  | 
|  12 // Here's the order of events: |  | 
|  13 // |  | 
|  14 // - firstTestFunction |  | 
|  15 //   - Change layout to generate new IntersectionObserver notifications. |  | 
|  16 //   - waitForNotification(secondTestFunction) |  | 
|  17 //     - requestAnimationFrame |  | 
|  18 // - BeginFrame |  | 
|  19 //   - requestAnimationFrame handler runs. |  | 
|  20 //     - queue first setTimeout |  | 
|  21 //   - FrameView::updateAllLifecyclePhases |  | 
|  22 //     - IntersectionObserver generates notification based on the new layout. |  | 
|  23 //       - Post task to deliver notification. |  | 
|  24 //   - first setTimeout runs. |  | 
|  25 //     - queue second setTimeout |  | 
|  26 //   - Posted task runs. |  | 
|  27 //     - IntersectionObserver notifications are delivered. |  | 
|  28 //   - second setTimeout runs secondTestFunction |  | 
|  29 //     - Verify notifications generated by firstTestFunction. |  | 
|  30 //     - Change layout to generate new IntersectionObserver notifications. |  | 
|  31 //     - waitForNotification(thirdTestFunction) |  | 
|  32 function waitForNotification(f) { |  | 
|  33   requestAnimationFrame(() => { |  | 
|  34     setTimeout(() => { |  | 
|  35       setTimeout(f); |  | 
|  36     }); |  | 
|  37   }); |  | 
|  38 } |  | 
|  39  |  | 
|  40 function rectToString(rect) { |  | 
|  41   return "[" + rect.left + ", " + rect.right + ", " + rect.top + ", " + rect.bot
    tom + "]"; |  | 
|  42 } |  | 
|  43  |  | 
|  44 function entryToString(entry) { |  | 
|  45   var ratio = ((entry.intersectionRect.width * entry.intersectionRect.height) / |  | 
|  46                (entry.boundingClientRect.width * entry.boundingClientRect.height
    )); |  | 
|  47   return ( |  | 
|  48       "boundingClientRect=" + rectToString(entry.boundingClientRect) + "\n" + |  | 
|  49       "intersectionRect=" + rectToString(entry.intersectionRect) + "\n" + |  | 
|  50       "visibleRatio=" + ratio + "\n" + |  | 
|  51       "rootBounds=" + rectToString(entry.rootBounds) + "\n" + |  | 
|  52       "target=" + entry.target + "\n" + |  | 
|  53       "time=" + entry.time); |  | 
|  54 } |  | 
|  55  |  | 
|  56 function rectArea(rect) { |  | 
|  57   return (rect.left - rect.right) * (rect.bottom - rect.top); |  | 
|  58 } |  | 
|  59  |  | 
|  60 function intersectionRatio(entry) { |  | 
|  61   var targetArea = rectArea(entry.boundingClientRect); |  | 
|  62   if (!targetArea) |  | 
|  63     return 0; |  | 
|  64   return rectArea(entry.intersectionRect) / targetArea; |  | 
|  65 } |  | 
|  66  |  | 
|  67 function clientRectToJson(rect) { |  | 
|  68   if (!rect) |  | 
|  69     return null; |  | 
|  70   return { |  | 
|  71     top: rect.top, |  | 
|  72     right: rect.right, |  | 
|  73     bottom: rect.bottom, |  | 
|  74     left: rect.left, |  | 
|  75     width: rect.width, |  | 
|  76     height: rect.height |  | 
|  77   }; |  | 
|  78 } |  | 
|  79  |  | 
|  80 function coordinatesToClientRectJson(top, right, bottom, left) { |  | 
|  81   return { |  | 
|  82     top: top, |  | 
|  83     right: right, |  | 
|  84     bottom: bottom, |  | 
|  85     left: left, |  | 
|  86     width: right - left, |  | 
|  87     height: bottom - top |  | 
|  88   }; |  | 
|  89 } |  | 
|  90  |  | 
|  91 function entryToJson(entry) { |  | 
|  92   return { |  | 
|  93     boundingClientRect: clientRectToJson(entry.boundingClientRect), |  | 
|  94     intersectionRect: clientRectToJson(entry.intersectionRect), |  | 
|  95     rootBounds: clientRectToJson(entry.rootBounds), |  | 
|  96     time: entry.time, |  | 
|  97     target: entry.target.id |  | 
|  98   }; |  | 
|  99 } |  | 
| OLD | NEW |