Skip to content

Instantly share code, notes, and snippets.

@aazamansari
Created December 28, 2016 21:13
Show Gist options
  • Save aazamansari/f64b3d8db8f89c51097c83899961a36b to your computer and use it in GitHub Desktop.
Save aazamansari/f64b3d8db8f89c51097c83899961a36b to your computer and use it in GitHub Desktop.
#include <JavaScriptCore/JSContextRef.h>
#include <JavaScriptCore/JSRetainPtr.h>
#include <WebKit2/Shared/API/c/wpe/WebKit.h>
#include <WebKit/WKRetainPtr.h>
#include <WebKit/WKContext.h>
#include <WebKit/WKFramePolicyListener.h>
#include <WebKit/WKPageGroup.h>
#include <WebKit/WKPageConfigurationRef.h>
#include <WebKit/WKPage.h>
#include <WebKit/WKRetainPtr.h>
#include <WebKit/WKString.h>
#include <WebKit/WKURL.h>
#include <WebKit/WKCookie.h>
#include <WebKit/WKCookieManager.h>
#include <WebKit/WKProxy.h>
#include <WebKit/WKSerializedScriptValue.h>
#include <WebKit/WKUserMediaPermissionRequest.h>
#include <WebKit/WKPageConfigurationRef.h>
#include <WebKit/WKPreferencesRefPrivate.h>
// TODO(em): fix generation of forwarding header
#include <WebKit2/UIProcess/API/C/WKContextPrivate.h>
#include <WebKit/WKView.h>
#include <WebKit/WKPreferencesRef.h>
#include <WebKit/WKPreferencesRefPrivate.h>
#include <glib.h>
#include <WebKit/WKArray.h>
#include <string>
class ClientInfo
{
public:
WKRetainPtr<WKViewRef> view;
WKRetainPtr<WKContextRef> context;
WKRetainPtr<WKStringRef> pageGroupIdentifier;
WKRetainPtr<WKPageGroupRef> pageGroup;
WKRetainPtr<WKPageConfigurationRef> pageConfiguration;
WKRetainPtr<WKPreferencesRef>preferences;
};
JSGlobalContextRef gJSContext = JSGlobalContextCreate(nullptr);
static WKViewRef createView(WKPageConfigurationRef);
std::string toStdString(WKStringRef string)
{
size_t size = WKStringGetMaximumUTF8CStringSize(string);
auto buffer = std::make_unique<char[]>(size);
size_t len = WKStringGetUTF8CString(string, buffer.get(), size);
return std::string(buffer.get(), len - 1);
}
static WKPageUIClientV6 createPageUIClient()
{
WKPageUIClientV6 pageUIClient = {
{ 6, nullptr },
nullptr, // createNewPage_deprecatedForUseWithV0
nullptr, // showPage
nullptr, // close
nullptr, // takeFocus
nullptr, // focus
nullptr, // unfocus
nullptr, // runJavaScriptAlert_deprecatedForUseWithV0
nullptr, // runJavaScriptConfirm_deprecatedForUseWithV0
nullptr, // runJavaScriptPrompt_deprecatedForUseWithV0
nullptr, // setStatusText
nullptr, // mouseDidMoveOverElement_deprecatedForUseWithV0
nullptr, // missingPluginButtonClicked_deprecatedForUseWithV0
nullptr, // didNotHandleKeyEvent
nullptr, // didNotHandleWheelEvent
nullptr, // toolbarsAreVisible
nullptr, // setToolbarsAreVisible
nullptr, // menuBarIsVisible
nullptr, // setMenuBarIsVisible
nullptr, // statusBarIsVisible
nullptr, // setStatusBarIsVisible
nullptr, // isResizable
nullptr, // setIsResizable
nullptr, // getWindowFrame
nullptr, // setWindowFrame
nullptr, // runBeforeUnloadConfirmPanel
nullptr, // didDraw
nullptr, // pageDidScroll
nullptr, // exceededDatabaseQuota
nullptr, // runOpenPanel
nullptr, // decidePolicyForGeolocationPermissionRequest
nullptr, // headerHeight
nullptr, // footerHeight
nullptr, // drawHeader
nullptr, // drawFooter
nullptr, // printFrame
nullptr, // runModal
nullptr, // unused1
nullptr, // saveDataToFileInDownloadsFolder
nullptr, // shouldInterruptJavaScript_unavailable
nullptr, // createNewPage_deprecatedForUseWithV1
nullptr, // mouseDidMoveOverElement
nullptr, // decidePolicyForNotificationPermissionRequest
nullptr, // unavailablePluginButtonClicked_deprecatedForUseWithV1
nullptr, // showColorPicker
nullptr, // hideColorPicker
nullptr, // unavailablePluginButtonClicked
nullptr, // pinnedStateDidChange
nullptr, // didBeginTrackingPotentialLongMousePress
nullptr, // didRecognizeLongMousePress
nullptr, // didCancelTrackingPotentialLongMousePress
nullptr, // isPlayingAudioDidChange
//decidePolicyForUserMediaPermissionRequestCallBack, // decidePolicyForUserMediaPermissionRequest
nullptr,
nullptr, // didClickAutoFillButton
nullptr, // runJavaScriptAlert
nullptr, // runJavaScriptConfirm
nullptr, // runJavaScriptPrompt
nullptr, // mediaSessionMetadataDidChange
// createNewPage
[](WKPageRef, WKPageConfigurationRef pageConfiguration, WKNavigationActionRef, WKWindowFeaturesRef, const void*) -> WKPageRef {
auto view = createView(pageConfiguration);
auto page = WKViewGetPage(view);
WKRetain(page);
return page;
},
0, // runJavaScriptAlert
0, // runJavaScriptConfirm
0, // runJavaScriptPrompt
//checkUserMediaPermissionForOrigin,
0,
};
return pageUIClient;
}
static WKPageNavigationClientV0 createPageNavigationClient()
{
WKPageNavigationClientV0 navigationClient = {
{ 0, nullptr },
// decidePolicyForNavigationAction
[](WKPageRef, WKNavigationActionRef, WKFramePolicyListenerRef listener, WKTypeRef, const void*) {
WKFramePolicyListenerUse(listener);
},
// decidePolicyForNavigationResponse
[](WKPageRef, WKNavigationResponseRef, WKFramePolicyListenerRef listener, WKTypeRef, const void*) {
WKFramePolicyListenerUse(listener);
},
nullptr, // decidePolicyForPluginLoad
nullptr, // didStartProvisionalNavigation
nullptr, // didReceiveServerRedirectForProvisionalNavigation
nullptr, // didFailProvisionalNavigation
nullptr, // didCommitNavigation
nullptr, // didFinishNavigation
nullptr, // didFailNavigation
nullptr, // didFailProvisionalLoadInSubframe
nullptr, // didFinishDocumentLoad
nullptr, // didSameDocumentNavigation
nullptr, // renderingProgressDidChange
nullptr, // canAuthenticateAgainstProtectionSpace
nullptr, // didReceiveAuthenticationChallenge
nullptr, // webProcessDidCrash
nullptr, // copyWebCryptoMasterKey
nullptr, // didBeginNavigationGesture
nullptr, // willEndNavigationGesture
nullptr, // didEndNavigationGesture
nullptr, // didRemoveNavigationGestureSnapshot
};
return navigationClient;
}
static WKViewRef createView(WKPageConfigurationRef pageConfiguration)
{
auto view = WKViewCreate(pageConfiguration);
auto page = WKViewGetPage(view);
auto pageUIClient = createPageUIClient();
WKPageSetPageUIClient(page, &pageUIClient.base);
auto pageNavigationClient = createPageNavigationClient();
WKPageSetPageNavigationClient(page, &pageNavigationClient.base);
const char* userAgent = getenv("USER_AGENT");
if (userAgent)
WKPageSetCustomUserAgent(page, WKStringCreateWithUTF8CString(userAgent));
return view;
}
static gboolean
do_pageload (gpointer user_data)
{
(void)user_data;
static ClientInfo *previousInfo = nullptr;
if(previousInfo)
{
printf("*************** Unloading page *********\n");
fflush(stdout);
WKPageClose(WKViewGetPage(previousInfo->view.get()));
WKViewSetViewClient(previousInfo->view.get(), nullptr);
previousInfo->view = nullptr;
WKPageConfigurationSetPageGroup(previousInfo->pageConfiguration.get(), nullptr);
WKPageConfigurationSetContext(previousInfo->pageConfiguration.get(), nullptr);
previousInfo->pageConfiguration = nullptr;
previousInfo->pageGroup = nullptr;
previousInfo->pageGroupIdentifier = nullptr;
previousInfo->context = nullptr;
delete previousInfo;
previousInfo = nullptr;
}
setenv("WAYLAND_DISPLAY","nested2",1);
ClientInfo *info = new ClientInfo();
printf("************ Page is loading ************\n");
fflush(stdout);
info->context = adoptWK(WKContextCreate());
info->pageGroupIdentifier = adoptWK(WKStringCreateWithUTF8CString("WPEPageGroup"));
info->pageGroup = adoptWK(WKPageGroupCreateWithIdentifier(info->pageGroupIdentifier.get()));
info->pageConfiguration = adoptWK(WKPageConfigurationCreate());
WKPageConfigurationSetContext(info->pageConfiguration.get(), info->context.get());
WKPageConfigurationSetPageGroup(info->pageConfiguration.get(), info->pageGroup.get());
info->preferences = adoptWK(WKPreferencesCreate());
WKPageGroupSetPreferences(info->pageGroup.get(), info->preferences.get());
WKPageConfigurationSetPreferences(info->pageConfiguration.get(), info->preferences.get());
WKPreferencesSetAllowRunningOfInsecureContent(info->preferences.get(), true);
WKPreferencesSetAllowDisplayOfInsecureContent(info->preferences.get(), true);
WKPreferencesSetLogsPageMessagesToSystemConsoleEnabled(info->preferences.get(), true);
info->view = adoptWK(createView(info->pageConfiguration.get()));
const char* url = "https://www.google.com";
auto shellURL = adoptWK(WKURLCreateWithUTF8CString(url));
WKPageLoadURL(WKViewGetPage(info->view.get()), shellURL.get());
WKPreferencesSetTabToLinksEnabled(info->preferences.get(), true);
WKPreferencesSetSpatialNavigationEnabled(info->preferences.get(), true);
previousInfo = info;
return 1;
}
int main()
{
GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
g_timeout_add_seconds (20, do_pageload, nullptr);
g_main_loop_run(loop);
g_main_loop_unref(loop);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment