| Index: Source/web/tests/WebViewTest.cpp
|
| diff --git a/Source/web/tests/WebViewTest.cpp b/Source/web/tests/WebViewTest.cpp
|
| index bb56f5ef6cfd457eed2d79bbcaa07f2312a8f80d..1789b3c0747325ebf0b8149a42de545b9bf6b938 100644
|
| --- a/Source/web/tests/WebViewTest.cpp
|
| +++ b/Source/web/tests/WebViewTest.cpp
|
| @@ -211,6 +211,11 @@ public:
|
| }
|
|
|
| protected:
|
| + void registerMockedHttpURLLoad(const std::string& fileName)
|
| + {
|
| + URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8(fileName.c_str()));
|
| + }
|
| +
|
| void testAutoResize(const WebSize& minAutoResize, const WebSize& maxAutoResize,
|
| const std::string& pageWidth, const std::string& pageHeight,
|
| int expectedWidth, int expectedHeight,
|
| @@ -218,6 +223,7 @@ protected:
|
|
|
| void testTextInputType(WebTextInputType expectedType, const std::string& htmlFile);
|
| void testInputMode(const WebString& expectedInputMode, const std::string& htmlFile);
|
| + void testSelectionRootBounds(const char* htmlFile, float pageScaleFactor);
|
|
|
| std::string m_baseURL;
|
| FrameTestHelpers::WebViewHelper m_webViewHelper;
|
| @@ -1653,4 +1659,92 @@ TEST_F(WebViewTest, HasTouchEventHandlers)
|
| EXPECT_EQ(0, client.getAndResetHasTouchEventHandlerCallCount(true));
|
| }
|
|
|
| +static WebRect ExpectedRootBounds(WebCore::Document* document, float scaleFactor)
|
| +{
|
| + WebCore::Element* element = document->getElementById("root");
|
| + if (!element)
|
| + element = document->getElementById("target");
|
| + if (element->hasTagName(WebCore::HTMLNames::iframeTag))
|
| + return ExpectedRootBounds(toHTMLIFrameElement(element)->contentDocument(), scaleFactor);
|
| +
|
| + WebCore::IntRect boundingBox = element->pixelSnappedBoundingBox();
|
| + boundingBox = document->frame()->view()->contentsToWindow(boundingBox);
|
| + boundingBox.scale(scaleFactor);
|
| + return boundingBox;
|
| +}
|
| +
|
| +void WebViewTest::testSelectionRootBounds(const char* htmlFile, float pageScaleFactor)
|
| +{
|
| + std::string url = m_baseURL + htmlFile;
|
| +
|
| + WebView* webView = m_webViewHelper.initializeAndLoad(url, true);
|
| + webView->resize(WebSize(640, 480));
|
| + webView->setPageScaleFactor(pageScaleFactor, WebPoint(0, 0));
|
| + webView->layout();
|
| + runPendingTasks();
|
| +
|
| + WebFrameImpl* frame = toWebFrameImpl(webView->mainFrame());
|
| + EXPECT_TRUE(frame->frame()->document()->isHTMLDocument());
|
| + WebCore::HTMLDocument* document = WebCore::toHTMLDocument(frame->frame()->document());
|
| +
|
| + WebRect expectedRootBounds = ExpectedRootBounds(document, webView->pageScaleFactor());
|
| + WebRect actualRootBounds;
|
| + webView->getSelectionRootBounds(actualRootBounds);
|
| + ASSERT_EQ(expectedRootBounds, actualRootBounds);
|
| +
|
| + WebRect anchor, focus;
|
| + webView->selectionBounds(anchor, focus);
|
| + WebCore::IntRect expectedIntRect = expectedRootBounds;
|
| + ASSERT_TRUE(expectedIntRect.contains(anchor));
|
| + // The "overflow" tests have the focus boundary outside of the element box.
|
| + ASSERT_EQ(url.find("overflow") == std::string::npos, expectedIntRect.contains(focus));
|
| +}
|
| +
|
| +TEST_F(WebViewTest, GetSelectionRootBounds)
|
| +{
|
| + // Register all the pages we will be using.
|
| + registerMockedHttpURLLoad("select_range_basic.html");
|
| + registerMockedHttpURLLoad("select_range_div_editable.html");
|
| + registerMockedHttpURLLoad("select_range_scroll.html");
|
| + registerMockedHttpURLLoad("select_range_span_editable.html");
|
| + registerMockedHttpURLLoad("select_range_input.html");
|
| + registerMockedHttpURLLoad("select_range_input_overflow.html");
|
| + registerMockedHttpURLLoad("select_range_textarea.html");
|
| + registerMockedHttpURLLoad("select_range_textarea_overflow.html");
|
| + registerMockedHttpURLLoad("select_range_iframe.html");
|
| + registerMockedHttpURLLoad("select_range_iframe_div_editable.html");
|
| + registerMockedHttpURLLoad("select_range_iframe_scroll.html");
|
| + registerMockedHttpURLLoad("select_range_iframe_span_editable.html");
|
| + registerMockedHttpURLLoad("select_range_iframe_input.html");
|
| + registerMockedHttpURLLoad("select_range_iframe_input_overflow.html");
|
| + registerMockedHttpURLLoad("select_range_iframe_textarea.html");
|
| + registerMockedHttpURLLoad("select_range_iframe_textarea_overflow.html");
|
| +
|
| + // Test with simple pages.
|
| + testSelectionRootBounds("select_range_basic.html", 1.0f);
|
| + testSelectionRootBounds("select_range_div_editable.html", 1.0f);
|
| + testSelectionRootBounds("select_range_scroll.html", 1.0f);
|
| + testSelectionRootBounds("select_range_span_editable.html", 1.0f);
|
| + testSelectionRootBounds("select_range_input.html", 1.0f);
|
| + testSelectionRootBounds("select_range_input_overflow.html", 1.0f);
|
| + testSelectionRootBounds("select_range_textarea.html", 1.0f);
|
| + testSelectionRootBounds("select_range_textarea_overflow.html", 1.0f);
|
| +
|
| + // Test with the same pages as above in iframes.
|
| + testSelectionRootBounds("select_range_iframe.html", 1.0f);
|
| + testSelectionRootBounds("select_range_iframe_div_editable.html", 1.0f);
|
| + testSelectionRootBounds("select_range_iframe_scroll.html", 1.0f);
|
| + testSelectionRootBounds("select_range_iframe_span_editable.html", 1.0f);
|
| + testSelectionRootBounds("select_range_iframe_input.html", 1.0f);
|
| + testSelectionRootBounds("select_range_iframe_input_overflow.html", 1.0f);
|
| + testSelectionRootBounds("select_range_iframe_textarea.html", 1.0f);
|
| + testSelectionRootBounds("select_range_iframe_textarea_overflow.html", 1.0f);
|
| +
|
| + // Basic page with scale factor.
|
| + testSelectionRootBounds("select_range_basic.html", 0.0f);
|
| + testSelectionRootBounds("select_range_basic.html", 0.1f);
|
| + testSelectionRootBounds("select_range_basic.html", 1.5f);
|
| + testSelectionRootBounds("select_range_basic.html", 2.0f);
|
| +}
|
| +
|
| } // namespace
|
|
|