void MiniBrowser::updateTextInputState(NIXView, bool isContentEditable, WKRect cursorRect, WKRect editorRect, const void* clientInfo) { MiniBrowser* mb = static_cast<MiniBrowser*>(const_cast<void*>(clientInfo)); if (mb->m_postponeTextInputUpdates) return; if (isContentEditable) { // If we're only moving cursor inside the current editor, then we should not focus it again. if (WKRectIsEqual(editorRect, mb->m_editorRect)) return; mb->m_shouldFocusEditableArea = true; mb->m_cursorRect = cursorRect; mb->m_editorRect = editorRect; } else { if (mb->m_shouldRestoreViewportWhenLosingFocus) { mb->m_shouldRestoreViewportWhenLosingFocus = false; NIXViewSetScale(mb->m_view, mb->m_scaleBeforeFocus); NIXViewSetScrollPosition(mb->m_view, mb->m_scrollPositionBeforeFocus); } mb->m_cursorRect = WKRectMake(0, 0, 0, 0); mb->m_editorRect = WKRectMake(0, 0, 0, 0); } }
WKRect PlatformWebView::windowFrame() { int x, y, width, height; ecore_evas_request_geometry_get(m_window, &x, &y, &width, &height); return WKRectMake(x, y, width, height); }
BrowserControl::BrowserControl(BrowserControlClient * client, int width, int height, std::string url) : m_client(client) , m_display(0) , m_context(0) , m_eventSource(0) , m_im(0) , m_ic(0) , m_lastClickTime(0.) , m_lastClickX(-1) , m_lastClickY(-1) , m_lastClickButton(kWKEventMouseButtonNoButton) , m_clickCount(0) { init(); m_eventSource = new XlibEventSource(m_display, this); // create the main window m_browserWindow = new BrowserWindow(m_display, DefaultRootWindow(m_display), m_context, this, WKRectMake(0, 0, width, height)); // separate the main window m_toolBar = new ToolBar(m_display, m_browserWindow->window(), m_context, this, WKRectMake(0, 0, width, toolBarHeight)); m_webView = new WebView(m_display, m_browserWindow->window(), m_context, this, WKRectMake(0, toolBarHeight, width, height - toolBarHeight)); // create navigation buttons m_backButton = new Button(m_display, m_toolBar->window(), m_context, this, WKRectMake(backButtonX, toolBarElementY, buttonWidth, buttonHeight), Button::Back); m_forwardButton = new Button(m_display, m_toolBar->window(), m_context, this, WKRectMake(forwardButtonX, toolBarElementY, buttonWidth, buttonHeight), Button::Forward); m_refreshButton = new Button(m_display, m_toolBar->window(), m_context, this, WKRectMake(refreshButtonX, toolBarElementY, buttonWidth, buttonHeight), Button::Refresh); // create a simple urlbar m_urlBar = new UrlBar(m_display, m_toolBar->window(), m_context, this, WKRectMake(urlBarX, toolBarElementY, width - urlBarRightOffset, urlBarHeight), url); createInputMethodAndInputContext(); }
bool TestController::resetStateToConsistentValues() { m_state = Resetting; m_beforeUnloadReturnValue = true; WKRetainPtr<WKStringRef> messageName = adoptWK(WKStringCreateWithUTF8CString("Reset")); WKRetainPtr<WKMutableDictionaryRef> resetMessageBody = adoptWK(WKMutableDictionaryCreate()); WKRetainPtr<WKStringRef> shouldGCKey = adoptWK(WKStringCreateWithUTF8CString("ShouldGC")); WKRetainPtr<WKBooleanRef> shouldGCValue = adoptWK(WKBooleanCreate(m_gcBetweenTests)); WKDictionaryAddItem(resetMessageBody.get(), shouldGCKey.get(), shouldGCValue.get()); WKContextPostMessageToInjectedBundle(TestController::shared().context(), messageName.get(), resetMessageBody.get()); WKContextSetShouldUseFontSmoothing(TestController::shared().context(), false); WKContextSetCacheModel(TestController::shared().context(), kWKCacheModelDocumentBrowser); // FIXME: This function should also ensure that there is only one page open. // Reset the EventSender for each test. #if PLATFORM(MAC) || PLATFORM(QT) || PLATFORM(GTK) || PLATFORM(EFL) m_eventSenderProxy = adoptPtr(new EventSenderProxy(this)); #endif // Reset preferences WKPreferencesRef preferences = WKPageGroupGetPreferences(m_pageGroup.get()); WKPreferencesResetTestRunnerOverrides(preferences); WKPreferencesSetOfflineWebApplicationCacheEnabled(preferences, true); WKPreferencesSetFontSmoothingLevel(preferences, kWKFontSmoothingLevelNoSubpixelAntiAliasing); WKPreferencesSetXSSAuditorEnabled(preferences, false); WKPreferencesSetWebAudioEnabled(preferences, true); WKPreferencesSetDeveloperExtrasEnabled(preferences, true); WKPreferencesSetJavaScriptExperimentsEnabled(preferences, true); WKPreferencesSetJavaScriptCanOpenWindowsAutomatically(preferences, true); WKPreferencesSetJavaScriptCanAccessClipboard(preferences, true); WKPreferencesSetDOMPasteAllowed(preferences, true); WKPreferencesSetUniversalAccessFromFileURLsAllowed(preferences, true); WKPreferencesSetFileAccessFromFileURLsAllowed(preferences, true); #if ENABLE(FULLSCREEN_API) WKPreferencesSetFullScreenEnabled(preferences, true); #endif WKPreferencesSetPageCacheEnabled(preferences, false); WKPreferencesSetAsynchronousPluginInitializationEnabled(preferences, false); WKPreferencesSetAsynchronousPluginInitializationEnabledForAllPlugins(preferences, false); WKPreferencesSetArtificialPluginInitializationDelayEnabled(preferences, false); WKPreferencesSetTabToLinksEnabled(preferences, false); WKPreferencesSetInteractiveFormValidationEnabled(preferences, true); WKPreferencesSetMockScrollbarsEnabled(preferences, true); #if !PLATFORM(QT) static WKStringRef standardFontFamily = WKStringCreateWithUTF8CString("Times"); static WKStringRef cursiveFontFamily = WKStringCreateWithUTF8CString("Apple Chancery"); static WKStringRef fantasyFontFamily = WKStringCreateWithUTF8CString("Papyrus"); static WKStringRef fixedFontFamily = WKStringCreateWithUTF8CString("Courier"); static WKStringRef pictographFontFamily = WKStringCreateWithUTF8CString("Apple Color Emoji"); static WKStringRef sansSerifFontFamily = WKStringCreateWithUTF8CString("Helvetica"); static WKStringRef serifFontFamily = WKStringCreateWithUTF8CString("Times"); WKPreferencesSetStandardFontFamily(preferences, standardFontFamily); WKPreferencesSetCursiveFontFamily(preferences, cursiveFontFamily); WKPreferencesSetFantasyFontFamily(preferences, fantasyFontFamily); WKPreferencesSetFixedFontFamily(preferences, fixedFontFamily); WKPreferencesSetPictographFontFamily(preferences, pictographFontFamily); WKPreferencesSetSansSerifFontFamily(preferences, sansSerifFontFamily); WKPreferencesSetSerifFontFamily(preferences, serifFontFamily); #endif WKPreferencesSetScreenFontSubstitutionEnabled(preferences, true); WKPreferencesSetInspectorUsesWebKitUserInterface(preferences, true); WKPreferencesSetAsynchronousSpellCheckingEnabled(preferences, false); #if !PLATFORM(MAC) WKTextCheckerContinuousSpellCheckingEnabledStateChanged(true); #endif // in the case that a test using the chrome input field failed, be sure to clean up for the next test m_mainWebView->removeChromeInputField(); m_mainWebView->focus(); // Re-set to the default backing scale factor by setting the custom scale factor to 0. WKPageSetCustomBackingScaleFactor(m_mainWebView->page(), 0); #if PLATFORM(EFL) // EFL use a real window while other ports such as Qt don't. // In EFL, we need to resize the window to the original size after calls to window.resizeTo. WKRect rect = m_mainWebView->windowFrame(); m_mainWebView->setWindowFrame(WKRectMake(rect.origin.x, rect.origin.y, TestController::viewWidth, TestController::viewHeight)); #endif // Reset notification permissions m_webNotificationProvider.reset(); // Reset Geolocation permissions. m_geolocationPermissionRequests.clear(); m_isGeolocationPermissionSet = false; m_isGeolocationPermissionAllowed = false; // Reset Custom Policy Delegate. setCustomPolicyDelegate(false, false); m_workQueueManager.clearWorkQueue(); m_handlesAuthenticationChallenges = false; m_authenticationUsername = String(); m_authenticationPassword = String(); // Reset main page back to about:blank m_doneResetting = false; WKPageLoadURL(m_mainWebView->page(), blankURL()); runUntil(m_doneResetting, ShortTimeout); return m_doneResetting; }
namespace TestWebKitAPI { static bool didFinishLoad = false; static bool didUpdateTextInputState = false; static NIXTextInputState stateReceived; static const WKRect invalidRectState = WKRectMake(0, 0, 0, 0); static bool WKRectIsEqual(const WKRect& a, const WKRect& b) { return a.origin.x == b.origin.x && a.origin.y == b.origin.y && a.size.width == b.size.width && a.size.height == b.size.height; } static void didFinishLoadForFrame(WKPageRef page, WKFrameRef, WKTypeRef, const void*) { didFinishLoad = true; } static void updateTextInputState(WKViewRef, const NIXTextInputState* state, const void*) { didUpdateTextInputState = true; memcpy(&stateReceived, state, sizeof(NIXTextInputState)); WKRetain(stateReceived.surroundingText); WKRetain(stateReceived.submitLabel); } 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); } } // TestWebKitAPI
MiniBrowser::MiniBrowser(GMainLoop* mainLoop, Mode mode, int width, int height, int viewportHorizontalDisplacement, int viewportVerticalDisplacement) : m_context(AdoptWK, WKContextCreate()) , m_pageGroup(AdoptWK, (WKPageGroupCreateWithIdentifier(WKStringCreateWithUTF8CString("MiniBrowser")))) , m_window(new LinuxWindow(this, width, height)) , m_view(0) , m_mainLoop(mainLoop) , m_lastClickTime(0) , m_lastClickX(0) , m_lastClickY(0) , m_lastClickButton(kWKEventMouseButtonNoButton) , m_clickCount(0) , m_touchMocker(0) , m_mode(mode) , m_displayUpdateScheduled(false) , m_gestureRecognizer(GestureRecognizer(this)) , m_postponeTextInputUpdates(true) , m_shouldFocusEditableArea(false) , m_shouldRestoreViewportWhenLosingFocus(false) , m_pageHandlesTouchEvents(false) , m_viewportMinScale(0.25) , m_viewportMaxScale(5) , m_viewportUserScalable(true) , m_viewportInitScale(1) { g_main_loop_ref(m_mainLoop); WKPreferencesRef preferences = WKPageGroupGetPreferences(m_pageGroup.get()); WKPreferencesSetAcceleratedCompositingEnabled(preferences, true); WKPreferencesSetFrameFlatteningEnabled(preferences, true); WKPreferencesSetDeveloperExtrasEnabled(preferences, true); m_view = NIXViewCreate(m_context.get(), m_pageGroup.get()); NIXViewClient viewClient; memset(&viewClient, 0, sizeof(NIXViewClient)); viewClient.version = kNIXViewClientCurrentVersion; viewClient.clientInfo = this; viewClient.viewNeedsDisplay = MiniBrowser::viewNeedsDisplay; viewClient.webProcessCrashed = MiniBrowser::webProcessCrashed; viewClient.webProcessRelaunched = MiniBrowser::webProcessRelaunched; viewClient.doneWithTouchEvent = MiniBrowser::doneWithTouchEvent; viewClient.doneWithGestureEvent = MiniBrowser::doneWithGestureEvent; viewClient.pageDidRequestScroll = MiniBrowser::pageDidRequestScroll; viewClient.didChangeContentsSize = MiniBrowser::didChangeContentsSize; viewClient.didChangeViewportAttributes = MiniBrowser::didChangeViewportAttributes; viewClient.didFindZoomableArea = MiniBrowser::didFindZoomableArea; viewClient.updateTextInputState = MiniBrowser::updateTextInputState; NIXViewSetViewClient(m_view, &viewClient); NIXViewInitialize(m_view); WKPageLoaderClient loaderClient; memset(&loaderClient, 0, sizeof(loaderClient)); loaderClient.version = kWKPageLoaderClientCurrentVersion; loaderClient.clientInfo = this; loaderClient.didStartProgress = MiniBrowser::didStartProgress; WKPageSetPageLoaderClient(pageRef(), &loaderClient); if (m_mode == MobileMode) WKPageSetUseFixedLayout(pageRef(), true); WKSize size = m_window->size(); m_viewRect = WKRectMake(viewportHorizontalDisplacement, viewportVerticalDisplacement, size.width - viewportHorizontalDisplacement, size.height - viewportVerticalDisplacement); NIXViewSetSize(m_view, m_viewRect.size); if (viewportHorizontalDisplacement || viewportVerticalDisplacement) { NIXMatrix transform = NIXMatrixMakeTranslation(viewportHorizontalDisplacement, viewportVerticalDisplacement); NIXViewSetUserViewportTransformation(m_view, &transform); } NIXViewSetFocused(m_view, true); NIXViewSetVisible(m_view, true); NIXViewSetActive(m_view, true); }