static void startUpdatingCallback(WKGeolocationManagerRef manager, const void* clientInfo) { GeolocationStateTracker* stateTracker = static_cast<GeolocationStateTracker*>(const_cast<void*>(clientInfo)); stateTracker->events.push_back(GeolocationEvent::StartUpdating); stateTracker->eventsChanged(); WKRetainPtr<WKGeolocationPositionRef> position = adoptWK(WKGeolocationPositionCreate(0, 50.644358, 3.345453, 2.53)); WKGeolocationManagerProviderDidChangePosition(manager, position.get()); }
void LayoutTestController::addUserScript(JSStringRef source, bool runAtStart, bool allFrames) { WKRetainPtr<WKStringRef> sourceWK = toWK(source); WKRetainPtr<WKBundleScriptWorldRef> scriptWorld(AdoptWK, WKBundleScriptWorldCreateWorld()); WKBundleAddUserScript(InjectedBundle::shared().bundle(), scriptWorld.get(), sourceWK.get(), 0, 0, 0, (runAtStart ? kWKInjectAtDocumentStart : kWKInjectAtDocumentEnd), (allFrames ? kWKInjectInAllFrames : kWKInjectInTopFrameOnly)); }
void TestRunner::setUserStyleSheetEnabled(bool enabled) { m_userStyleSheetEnabled = enabled; WKRetainPtr<WKStringRef> emptyUrl = adoptWK(WKStringCreateWithUTF8CString("")); WKStringRef location = enabled ? m_userStyleSheetLocation.get() : emptyUrl.get(); auto& injectedBundle = InjectedBundle::singleton(); WKBundleSetUserStyleSheetLocation(injectedBundle.bundle(), injectedBundle.pageGroup(), location); }
static WKURLRequestRef willSendRequestForFrame(WKBundlePageRef, WKBundleFrameRef frame, uint64_t resourceIdentifier, WKURLRequestRef request, WKURLResponseRef redirectResponse, const void *clientInfo) { // Allow the loading of the main resource, but don't allow the loading of an iframe, return null from willSendRequest. if (WKBundleFrameIsMainFrame(frame)) { WKRetainPtr<WKURLRequestRef> newRequest = request; return newRequest.leakRef(); } return 0; }
Eina_Bool ewk_view_text_matches_count(Evas_Object* ewkView, const char* text, Ewk_Find_Options options, unsigned maxMatchCount) { EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl, false); EINA_SAFETY_ON_NULL_RETURN_VAL(text, false); WKRetainPtr<WKStringRef> wkText = adoptWK(WKStringCreateWithUTF8CString(text)); WKPageCountStringMatches(impl->wkPage(), wkText.get(), static_cast<WebKit::FindOptions>(options), maxMatchCount); return true; }
TEST_F(WebKit2UserMessageRoundTripTest, WKString) { WKRetainPtr<WKStringRef> string = adoptWK(WKStringCreateWithUTF8CString("An important string")); roundTrip(string.get()); WKTypeRef roundTrippedTypeRef = recievedBody.get(); WKRetainPtr<WKStringRef> roundTrippedString = static_cast<WKStringRef>(roundTrippedTypeRef); EXPECT_TRUE(WKStringIsEqual(roundTrippedString.get(), string.get())); }
static void didAssociateFormControls(WKBundlePageRef page, WKArrayRef elementHandles, const void*) { WKRetainPtr<WKMutableDictionaryRef> messageBody = adoptWK(WKMutableDictionaryCreate()); WKDictionarySetItem(messageBody.get(), Util::toWK("Page").get(), page); WKRetainPtr<WKUInt64Ref> numberOfElements = adoptWK(WKUInt64Create(WKArrayGetSize(elementHandles))); WKDictionarySetItem(messageBody.get(), Util::toWK("NumberOfControls").get(), numberOfElements.get()); WKBundlePostMessage(InjectedBundleController::singleton().bundle(), Util::toWK("DidReceiveDidAssociateFormControls").get(), messageBody.get()); }
TEST_F(WebKit2UserMessageRoundTripTest, WKURL) { WKRetainPtr<WKURLRef> url = adoptWK(WKURLCreateWithUTF8CString("http://webkit.org/")); roundTrip(url.get()); WKTypeRef roundTrippedTypeRef = recievedBody.get(); WKRetainPtr<WKURLRef> roundTrippedURL = static_cast<WKURLRef>(roundTrippedTypeRef); EXPECT_TRUE(WKURLIsEqual(roundTrippedURL.get(), url.get())); }
const char* EwkView::customTextEncodingName() const { WKRetainPtr<WKStringRef> customEncoding = adoptWK(WKPageCopyCustomTextEncodingName(wkPage())); if (WKStringIsEmpty(customEncoding.get())) return 0; m_customEncoding = WKEinaSharedString(customEncoding.get()); return m_customEncoding; }
Ref<EwkContext> EwkContext::create(const String& extensionsPath) { String bundlePath = bundlePathForExtension(); if (bundlePath.isEmpty()) return adoptRef(*new EwkContext(adoptWK(WKContextCreate()).get())); WKRetainPtr<WKStringRef> path = adoptWK(toCopiedAPI(bundlePath)); return adoptRef(*new EwkContext(adoptWK(WKContextCreateWithInjectedBundlePath(path.get())).get(), extensionsPath)); }
static void didFinishLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, WKTypeRef* userData, const void *clientInfo) { if (!WKBundleFrameIsMainFrame(frame)) { childFrame = frame; return; } bool isParentFrameCheckSuccessful = childFrame ? WKBundleFrameGetParentFrame(childFrame.get()) == frame : false; WKBundlePostMessage(testBundle.get(), Util::toWK("DidCheckParentFrame").get(), adoptWK(WKBooleanCreate(isParentFrameCheckSuccessful)).get()); }
/** * @internal * The url of view was changed by the frame loader. * * Emits signal: "url,changed" with pointer to new url string. */ void EwkView::informURLChange() { WKRetainPtr<WKURLRef> wkActiveURL = adoptWK(WKPageCopyActiveURL(wkPage())); WKRetainPtr<WKStringRef> wkURLString = wkActiveURL ? adoptWK(WKURLCopyString(wkActiveURL.get())) : adoptWK(WKStringCreateWithUTF8CString("")); if (WKStringIsEqualToUTF8CString(wkURLString.get(), m_url)) return; m_url = WKEinaSharedString(wkURLString.get()); smartCallback<URLChanged>().call(m_url); }
Eina_Bool ewk_view_url_set(Evas_Object* ewkView, const char* url) { EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl, false); EINA_SAFETY_ON_NULL_RETURN_VAL(url, false); WKRetainPtr<WKURLRef> wkUrl = adoptWK(WKURLCreateWithUTF8CString(url)); WKPageLoadURL(impl->wkPage(), wkUrl.get()); impl->informURLChange(); return true; }
PlatformWebView::PlatformWebView(WKContextRef contextRef, WKPageGroupRef pageGroupRef) { m_window = initEcoreEvas(); m_view = EWKViewCreate(contextRef, pageGroupRef, ecore_evas_get(m_window), /* smart */ 0); WKRetainPtr<WKStringRef> wkTheme = adoptWK(WKStringCreateWithUTF8CString(TEST_THEME_DIR "/default.edj")); WKViewSetThemePath(EWKViewGetWKView(m_view), wkTheme.get()); evas_object_smart_callback_add(m_view, "webprocess,crashed", onWebProcessCrashed, 0); resizeTo(600, 800); }
// Used to test sending a WKType round trip to the WebProcess and back. // Result is stored into the recievedBody member variable. void roundTrip(WKTypeRef object) { WKTypeID storedTypeID = WKGetTypeID(object); recievedBody.clear(); didReceiveMessage = false; WKContextPostMessageToInjectedBundle(context.get(), Util::toWK("RoundTrip").get(), object); Util::run(&didReceiveMessage); EXPECT_NOT_NULL(recievedBody); EXPECT_EQ(storedTypeID, WKGetTypeID(recievedBody.get())); }
void EwkView::setUserAgent(const char* userAgent) { if (m_userAgent == userAgent) return; WKRetainPtr<WKStringRef> wkUserAgent = adoptWK(WKStringCreateWithUTF8CString(userAgent)); WKPageSetCustomUserAgent(wkPage(), wkUserAgent.get()); // When 'userAgent' is 0, user agent is set as a standard user agent by WKPageSetCustomUserAgent() // so m_userAgent needs to be updated using WKPageCopyUserAgent(). m_userAgent = WKEinaSharedString(AdoptWK, WKPageCopyUserAgent(wkPage())); }
static bool filterFirstItemCallback(WKPageRef page, WKStringRef valueType, WKTypeRef value, void* context) { if (!WKStringIsEqual(valueType, WKPageGetSessionBackForwardListItemValueType())) return true; ASSERT(WKGetTypeID(value) == WKBackForwardListItemGetTypeID()); WKBackForwardListItemRef backForwardListItem = static_cast<WKBackForwardListItemRef>(value); WKRetainPtr<WKURLRef> url = adoptWK(WKBackForwardListItemCopyURL(backForwardListItem)); WKRetainPtr<WKStringRef> path = adoptWK(WKURLCopyLastPathComponent(url.get())); return !WKStringIsEqualToUTF8CString(path.get(), "simple.html"); }
EwkContextMenuItem::EwkContextMenuItem(WKContextMenuItemRef item, EwkContextMenu* parentMenu) : m_type(static_cast<Ewk_Context_Menu_Item_Type>(WKContextMenuItemGetType(item))) , m_action(getEwkActionFromWKTag((WKContextMenuItemGetTag(item)))) , m_title(WKEinaSharedString(AdoptWK, WKContextMenuItemCopyTitle(item))) , m_isChecked(WKContextMenuItemGetChecked(item)) , m_isEnabled(WKContextMenuItemGetEnabled(item)) , m_parentMenu(parentMenu) { if (WKContextMenuItemGetType(item) == kWKContextMenuItemTypeSubmenu) { WKRetainPtr<WKArrayRef> menuItems = adoptWK(WKContextMenuCopySubmenuItems(item)); m_subMenu = EwkContextMenu::create(m_parentMenu->ewkView(), menuItems.get()); } }
QtWebError::Type QtWebError::type() const { WKRetainPtr<WKStringRef> errorDomainPtr = adoptWK(WKErrorCopyDomain(error.get())); WTF::String errorDomain = toWTFString(errorDomainPtr.get()); if (errorDomain == "QtNetwork") return QtWebError::NetworkError; if (errorDomain == "HTTP") return QtWebError::HttpError; if (errorDomain == "Download") return QtWebError::DownloadError; return QtWebError::InternalError; }
Evas_Object* EWKViewCreate(WKContextRef context, WKPageGroupRef pageGroup, Evas* canvas, Evas_Smart* smart) { if (!EwkMain::singleton().isInitialized()) { EINA_LOG_CRIT("EWebKit has not been initialized. You must call ewk_init() before creating view."); return nullptr; } WKRetainPtr<WKViewRef> wkView = adoptWK(WKViewCreate(context, pageGroup)); if (EwkView* ewkView = EwkView::create(wkView.get(), canvas, smart)) return ewkView->evasObject(); return nullptr; }
void EwkView::setApplicationNameForUserAgent(const char* applicationNameForUserAgent) { if (m_applicationNameForUserAgent == applicationNameForUserAgent) return; m_applicationNameForUserAgent = applicationNameForUserAgent; WKRetainPtr<WKStringRef> wkApplicationName = adoptWK(WKStringCreateWithUTF8CString(applicationNameForUserAgent)); WKPageSetApplicationNameForUserAgent(wkPage(), wkApplicationName.get()); // WKPageSetApplicationNameForUserAgent also changes user agent. m_userAgent = WKEinaSharedString(AdoptWK, WKPageCopyUserAgent(wkPage())); }
void QtWebPageUIClient::runOpenPanel(WKPageRef, WKFrameRef, WKOpenPanelParametersRef parameters, WKOpenPanelResultListenerRef listener, const void* clientInfo) { WKRetainPtr<WKArrayRef> wkSelectedFileNames = adoptWK(WKOpenPanelParametersCopySelectedFileNames(parameters)); QStringList selectedFileNames; size_t selectedFilesSize = WKArrayGetSize(wkSelectedFileNames.get()); selectedFileNames.reserve(selectedFilesSize); for (size_t i = 0; i < selectedFilesSize; ++i) selectedFileNames += WKStringCopyQString(static_cast<WKStringRef>(WKArrayGetItemAtIndex(wkSelectedFileNames.get(), i))); FileChooserType allowMultipleFiles = WKOpenPanelParametersGetAllowsMultipleFiles(parameters) ? MultipleFilesSelection : SingleFileSelection; toQtWebPageUIClient(clientInfo)->runOpenPanel(listener, selectedFileNames, allowMultipleFiles); }
void EventSendingController::mouseDown(int button, JSValueRef modifierArray) { WKBundlePageRef page = InjectedBundle::shared().page()->page(); WKBundleFrameRef frame = WKBundlePageGetMainFrame(page); JSContextRef context = WKBundleFrameGetJavaScriptContext(frame); WKEventModifiers modifiers = parseModifierArray(context, modifierArray); #ifdef USE_WEBPROCESS_EVENT_SIMULATION updateClickCount(button); WKBundlePageSimulateMouseDown(page, button, m_position, m_clickCount, modifiers, m_time); #else WKRetainPtr<WKStringRef> EventSenderMessageName(AdoptWK, WKStringCreateWithUTF8CString("EventSender")); WKRetainPtr<WKMutableDictionaryRef> EventSenderMessageBody(AdoptWK, WKMutableDictionaryCreate()); WKRetainPtr<WKStringRef> subMessageKey(AdoptWK, WKStringCreateWithUTF8CString("SubMessage")); WKRetainPtr<WKStringRef> subMessageName(AdoptWK, WKStringCreateWithUTF8CString("MouseDown")); WKDictionaryAddItem(EventSenderMessageBody.get(), subMessageKey.get(), subMessageName.get()); WKRetainPtr<WKStringRef> buttonKey = adoptWK(WKStringCreateWithUTF8CString("Button")); WKRetainPtr<WKUInt64Ref> buttonRef = adoptWK(WKUInt64Create(button)); WKDictionaryAddItem(EventSenderMessageBody.get(), buttonKey.get(), buttonRef.get()); WKRetainPtr<WKStringRef> modifiersKey = adoptWK(WKStringCreateWithUTF8CString("Modifiers")); WKRetainPtr<WKUInt64Ref> modifiersRef = adoptWK(WKUInt64Create(modifiers)); WKDictionaryAddItem(EventSenderMessageBody.get(), modifiersKey.get(), modifiersRef.get()); WKBundlePostSynchronousMessage(InjectedBundle::shared().bundle(), EventSenderMessageName.get(), EventSenderMessageBody.get(), 0); #endif }
WebPageProxy* WebInspectorProxy::platformCreateInspectorPage() { ASSERT(m_inspectedPage); #ifdef HAVE_ECORE_X const char* engine = "opengl_x11"; m_inspectorWindow = ecore_evas_new(engine, 0, 0, initialWindowWidth, initialWindowHeight, 0); // Gracefully fall back to software if evas_gl engine is not available. if (!m_inspectorWindow) #endif m_inspectorWindow = ecore_evas_new(0, 0, 0, initialWindowWidth, initialWindowHeight, 0); if (!m_inspectorWindow) return 0; WKContextRef wkContext = toAPI(&inspectorProcessPool()); WKRetainPtr<WKStringRef> wkGroupIdentifier = adoptWK(WKStringCreateWithUTF8CString(inspectorPageGroupIdentifier().utf8().data())); WKPageGroupRef wkPageGroup = WKPageGroupCreateWithIdentifier(wkGroupIdentifier.get()); WKRetainPtr<WKPageConfigurationRef> wkPageConfiguration = adoptWK(WKPageConfigurationCreate()); WKPageConfigurationSetContext(wkPageConfiguration.get(), wkContext); WKPageConfigurationSetPageGroup(wkPageConfiguration.get(), wkPageGroup); m_inspectorView = EWKViewCreate(wkContext, wkPageConfiguration.get(), ecore_evas_get(m_inspectorWindow), /* smart */ 0); WKViewRef wkView = EWKViewGetWKView(m_inspectorView); WKRetainPtr<WKStringRef> wkTheme = adoptWK(WKStringCreateWithUTF8CString(DEFAULT_THEME_DIR "/default.edj")); WKViewSetThemePath(wkView, wkTheme.get()); WKPreferencesRef wkPreferences = WKPageGroupGetPreferences(wkPageGroup); WKPreferencesSetFileAccessFromFileURLsAllowed(wkPreferences, true); WKPreferencesSetJavaScriptRuntimeFlags(wkPreferences, 0); return toImpl(WKViewGetPage(wkView)); }
static void willLoadDataRequest(WKBundlePageRef page, WKURLRequestRef request, WKDataRef data, WKStringRef MIMEType, WKStringRef encodingName, WKURLRef unreachableURL, WKTypeRef userData, const void *clientInfo) { WKRetainPtr<WKMutableDictionaryRef> messageBody = adoptWK(WKMutableDictionaryCreate()); WKDictionarySetItem(messageBody.get(), Util::toWK("URLRequestReturn").get(), request); WKDictionarySetItem(messageBody.get(), Util::toWK("DataReturn").get(), data); WKDictionarySetItem(messageBody.get(), Util::toWK("MIMETypeReturn").get(), MIMEType); WKDictionarySetItem(messageBody.get(), Util::toWK("EncodingNameReturn").get(), encodingName); WKDictionarySetItem(messageBody.get(), Util::toWK("UnreachableURLReturn").get(), unreachableURL); WKDictionarySetItem(messageBody.get(), Util::toWK("UserDataReturn").get(), userData); WKBundlePostMessage(InjectedBundleController::singleton().bundle(), Util::toWK("WillLoadDataRequestReturn").get(), messageBody.get()); }
TEST(WebKit2, AboutBlankLoad) { WKRetainPtr<WKContextRef> context = adoptWK(WKContextCreate()); PlatformWebView webView(context.get()); WKPageLoaderClient loaderClient; memset(&loaderClient, 0 , sizeof(loaderClient)); loaderClient.didFinishLoadForFrame = didFinishLoadForFrame; WKPageSetPageLoaderClient(webView.page(), &loaderClient); WKPageLoadURL(webView.page(), adoptWK(WKURLCreateWithUTF8CString("about:blank")).get()); Util::run(&done); }
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(WebKit2, AboutBlankLoad) { WKRetainPtr<WKContextRef> context = adoptWK(WKContextCreate()); PlatformWebView webView(context.get()); WKPagePolicyClient policyClient; memset(&policyClient, 0, sizeof(policyClient)); policyClient.decidePolicyForResponse = decidePolicyForResponse; WKPageSetPagePolicyClient(webView.page(), &policyClient); WKPageLoadURL(webView.page(), adoptWK(WKURLCreateWithUTF8CString("about:blank")).get()); Util::run(&done); }
void DOMWindowExtensionBasic::sendExtensionStateMessage() { char body[16384]; sprintf(body, "Extension states:\n%s - %s\n%s - %s\n%s - %s\n%s - %s\n%s - %s\n%s - %s", m_extensionRecords[0].name, stateNames[m_extensionRecords[0].state], m_extensionRecords[1].name, stateNames[m_extensionRecords[1].state], m_extensionRecords[2].name, stateNames[m_extensionRecords[2].state], m_extensionRecords[3].name, stateNames[m_extensionRecords[3].state], m_extensionRecords[4].name, stateNames[m_extensionRecords[4].state], m_extensionRecords[5].name, stateNames[m_extensionRecords[5].state]); WKRetainPtr<WKStringRef> messageName = adoptWK(WKStringCreateWithUTF8CString("ExtensionStates")); WKRetainPtr<WKStringRef> messageBody = adoptWK(WKStringCreateWithUTF8CString(body)); WKBundlePostMessage(m_bundle, messageName.get(), messageBody.get()); }
TEST(WebKit2, DownloadDecideDestinationCrash) { WKRetainPtr<WKContextRef> context = adoptWK(WKContextCreate()); setContextDownloadClient(context.get()); PlatformWebView webView(context.get()); setPagePolicyClient(webView.page()); // The length of this filename was specially chosen to trigger the crash conditions in // <http://webkit.org/b/61142>. Specifically, it causes ArgumentDecoder::m_bufferPos and m_bufferEnd // to be equal after the DecideDestinationWithSuggestedFilename message has been handled. WKPageLoadURL(webView.page(), adoptWK(Util::createURLForResource("18-characters", "html")).get()); Util::run(&didDecideDestination); }