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); } }
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); }