TEST(WebKitNix, WebViewTranslatedScaled) { // This test opens a webpage that contains a white background, no viewport // metatag and a red rectangle (20x20)px at (0,0) position. The viewport is // then translated to (10,10) position. After that it's applied a scale=2.0 // At this point we will have a red rectangle of (40x40)px at (10,10). const WKSize size = WKSizeMake(100, 100); ToolsNix::GLOffscreenBuffer offscreenBuffer(size.width, size.height); ASSERT_TRUE(offscreenBuffer.makeCurrent()); WKRetainPtr<WKContextRef> context = adoptWK(WKContextCreate()); WKRetainPtr<WKViewRef> view(AdoptWK, WKViewCreate(context.get(), 0)); Util::ForceRepaintClient forceRepaintClient(view.get()); forceRepaintClient.setClearColor(0, 0, 1, 1); const int delta = 10; WKViewSetUserViewportTranslation(view.get(), delta, delta); WKViewInitialize(view.get()); WKPageSetUseFixedLayout(WKViewGetPage(view.get()), true); WKViewSetSize(view.get(), size); glViewport(0, 0, size.width, size.height); forceRepaintClient.clear(); Util::PageLoader loader(view.get()); loader.waitForLoadURLAndRepaint("../nix/red-square"); for (double scale = 1.0; scale < 3.0; scale++) { WKViewSetContentScaleFactor(view.get(), scale); loader.forceRepaint(); ToolsNix::RGBAPixel outsideTheContent = offscreenBuffer.readPixelAtPoint(delta - 1, delta - 1); EXPECT_EQ(ToolsNix::RGBAPixel::blue(), outsideTheContent); ToolsNix::RGBAPixel squareTopLeft = offscreenBuffer.readPixelAtPoint(delta, delta); EXPECT_EQ(ToolsNix::RGBAPixel::red(), squareTopLeft); const int scaledSize = scale * 20; ToolsNix::RGBAPixel squareBottomRight = offscreenBuffer.readPixelAtPoint(delta + scaledSize - 1, delta + scaledSize - 1); EXPECT_EQ(ToolsNix::RGBAPixel::red(), squareBottomRight); ToolsNix::RGBAPixel outsideSquare = offscreenBuffer.readPixelAtPoint(delta + scaledSize, delta + scaledSize); EXPECT_EQ(ToolsNix::RGBAPixel::white(), outsideSquare); } }
void Tab::setSize(WKSize size) { WKViewSetSize(m_view, size); }
TEST(WebKitNix, WebViewUpdateTextInputState) { memset(&stateReceived, 0, sizeof(stateReceived)); WKRetainPtr<WKContextRef> context = adoptWK(WKContextCreate()); WKRetainPtr<WKViewRef> view(AdoptWK, WKViewCreate(context.get(), 0)); NIXViewClient nixViewClient; memset(&nixViewClient, 0, sizeof(NIXViewClient)); nixViewClient.version = kNIXViewClientCurrentVersion; nixViewClient.updateTextInputState = updateTextInputState; NIXViewSetNixViewClient(view.get(), &nixViewClient); WKViewInitialize(view.get()); WKPageLoaderClient pageLoaderClient; memset(&pageLoaderClient, 0, sizeof(WKPageLoaderClient)); pageLoaderClient.version = kWKPageLoaderClientCurrentVersion; pageLoaderClient.didFinishLoadForFrame = didFinishLoadForFrame; WKPageSetPageLoaderClient(WKViewGetPage(view.get()), &pageLoaderClient); const WKSize size = WKSizeMake(100, 100); WKViewSetSize(view.get(), size); NIXMouseEvent nixEvent; memset(&nixEvent, 0, sizeof(NIXMouseEvent)); nixEvent.type = kNIXInputEventTypeMouseDown; nixEvent.button = kWKEventMouseButtonLeftButton; nixEvent.x = 55; nixEvent.y = 55; nixEvent.globalX = 55; nixEvent.globalY = 55; nixEvent.clickCount = 1; nixEvent.modifiers = static_cast<NIXInputEventModifiers>(0);; nixEvent.timestamp = 0; // Simple test on content editable. WKRetainPtr<WKURLRef> editableContentUrl = adoptWK(Util::createURLForResource("../nix/single-tap-on-editable-content", "html")); WKPageLoadURL(WKViewGetPage(view.get()), editableContentUrl.get()); Util::run(&didFinishLoad); NIXViewSendMouseEvent(view.get(), &nixEvent); nixEvent.type = kNIXInputEventTypeMouseUp; NIXViewSendMouseEvent(view.get(), &nixEvent); Util::run(&didUpdateTextInputState); ASSERT_TRUE(didFinishLoad); ASSERT_TRUE(didUpdateTextInputState); ASSERT_TRUE(stateReceived.isContentEditable); ASSERT_TRUE(WKStringIsEqualToUTF8CString(stateReceived.surroundingText, "foobar")); WKRelease(stateReceived.surroundingText); ASSERT_TRUE(WKStringIsEmpty(stateReceived.submitLabel)); WKRelease(stateReceived.submitLabel); ASSERT_FALSE(stateReceived.inputMethodHints & NIXImhSensitiveData); ASSERT_TRUE(!WKRectIsEqual(stateReceived.cursorRect, invalidRectState)); ASSERT_TRUE(!WKRectIsEqual(stateReceived.editorRect, invalidRectState)); ASSERT_TRUE(!WKRectIsEqual(stateReceived.cursorRect, stateReceived.editorRect)); // Test on a form field. didFinishLoad = false; memset(&stateReceived, 0, sizeof(stateReceived)); editableContentUrl = adoptWK(Util::createURLForResource("../nix/single-tap-on-form-field", "html")); WKPageLoadURL(WKViewGetPage(view.get()), editableContentUrl.get()); Util::run(&didFinishLoad); nixEvent.type = kNIXInputEventTypeMouseDown; NIXViewSendMouseEvent(view.get(), &nixEvent); nixEvent.type = kNIXInputEventTypeMouseUp; NIXViewSendMouseEvent(view.get(), &nixEvent); didUpdateTextInputState = false; Util::run(&didUpdateTextInputState); WKRelease(stateReceived.surroundingText); ASSERT_TRUE(didFinishLoad); ASSERT_TRUE(didUpdateTextInputState); ASSERT_TRUE(WKStringIsEqualToUTF8CString(stateReceived.submitLabel, "submitLabelValue")); WKRelease(stateReceived.submitLabel); ASSERT_TRUE(stateReceived.inputMethodHints & NIXImhSensitiveData); }
TEST(WebKitNix, SuspendResumeAPI) { // This test uses a page that changes its title - showing current time. // As the suspend method is called the page's changes are paused. The // animation continues as we call the resume method. During this process // there are checkpoints to ensure that changes are pausing/resuming. const WKSize size = WKSizeMake(150, 100); ToolsNix::GLOffscreenBuffer offscreenBuffer(size.width, size.height); ASSERT_TRUE(offscreenBuffer.makeCurrent()); WKRetainPtr<WKContextRef> context = adoptWK(WKContextCreate()); WKRetainPtr<WKViewRef> view(AdoptWK, WKViewCreate(context.get(), 0)); Util::ForceRepaintClient forceRepaintClient(view.get()); forceRepaintClient.setClearColor(0, 0, 1, 1); WKViewInitialize(view.get()); WKViewSetSize(view.get(), size); glViewport(0, 0, size.width, size.height); forceRepaintClient.clear(); Util::PageLoader loader(view.get()); loader.waitForLoadURLAndRepaint("../nix/SuspendResume"); size_t bufferSize = WKStringGetMaximumUTF8CStringSize(WKPageCopyTitle(WKViewGetPage(view.get()))); char firstSampleBeforeSuspend[bufferSize]; char secondSampleBeforeSuspend[bufferSize]; char firstSampleAfterSuspend[bufferSize]; char secondSampleAfterSuspend[bufferSize]; char firstSampleAfterResume[bufferSize]; WKStringGetUTF8CString(WKPageCopyTitle(WKViewGetPage(view.get())), firstSampleBeforeSuspend, bufferSize); // After collecting the first sample a repaint is needed to get viewport updated accordingly. // This proccess is repeated for each collected sample. Util::sleep(0.1); loader.forceRepaint(); WKStringGetUTF8CString(WKPageCopyTitle(WKViewGetPage(view.get())), secondSampleBeforeSuspend, bufferSize); // The timer is ticking - two different samples. EXPECT_STRNE(firstSampleBeforeSuspend, secondSampleBeforeSuspend); // Force an update before suspending otherwise we can get same sample value after suspending // and the test becomes flacky. Util::sleep(0.1); loader.forceRepaint(); WKViewSuspendActiveDOMObjectsAndAnimations(view.get()); Util::sleep(0.1); loader.forceRepaint(); WKStringGetUTF8CString(WKPageCopyTitle(WKViewGetPage(view.get())), firstSampleAfterSuspend, bufferSize); // The timer is paused - still two different samples. EXPECT_STRNE(secondSampleBeforeSuspend, firstSampleAfterSuspend); Util::sleep(0.1); loader.forceRepaint(); WKStringGetUTF8CString(WKPageCopyTitle(WKViewGetPage(view.get())), secondSampleAfterSuspend, bufferSize); // The timer is paused - two samples collected while paused so they are equal. EXPECT_STREQ(firstSampleAfterSuspend, secondSampleAfterSuspend); WKViewResumeActiveDOMObjectsAndAnimations(view.get()); Util::sleep(0.1); loader.forceRepaint(); WKStringGetUTF8CString(WKPageCopyTitle(WKViewGetPage(view.get())), firstSampleAfterResume, bufferSize); // The timer is ticking again - two different samples. EXPECT_STRNE(secondSampleAfterSuspend, firstSampleAfterResume); }