WebKit2: Flesh out more of the InjectedBundle client API
Reviewed by Anders Carlsson.
WebKit2:
* WebProcess/InjectedBundle/API/c/WKBundle.h:
* WebProcess/InjectedBundle/API/c/WKBundlePage.h:
* WebProcess/InjectedBundle/InjectedBundle.cpp:
(WebKit::InjectedBundle::willDestroyPage):
* WebProcess/InjectedBundle/InjectedBundle.h:
* WebProcess/InjectedBundle/InjectedBundlePageClient.cpp:
(WebKit::InjectedBundlePageClient::didStartProvisionalLoadForFrame):
(WebKit::InjectedBundlePageClient::didReceiveServerRedirectForProvisionalLoadForFrame):
(WebKit::InjectedBundlePageClient::didFailProvisionalLoadWithErrorForFrame):
(WebKit::InjectedBundlePageClient::didCommitLoadForFrame):
(WebKit::InjectedBundlePageClient::didFinishLoadForFrame):
(WebKit::InjectedBundlePageClient::didFailLoadWithErrorForFrame):
(WebKit::InjectedBundlePageClient::didReceiveTitleForFrame):
* WebProcess/InjectedBundle/InjectedBundlePageClient.h:
* WebProcess/InjectedBundle/mac/InjectedBundleMac.cpp:
(WebKit::InjectedBundle::load): Add some error logging on failure to load the bundle.
* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad):
(WebKit::WebFrameLoaderClient::dispatchDidStartProvisionalLoad):
(WebKit::WebFrameLoaderClient::dispatchDidReceiveTitle):
(WebKit::WebFrameLoaderClient::dispatchDidCommitLoad):
(WebKit::WebFrameLoaderClient::dispatchDidFailProvisionalLoad):
(WebKit::WebFrameLoaderClient::dispatchDidFailLoad):
(WebKit::WebFrameLoaderClient::dispatchDidFinishLoad):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::close):
* mac/WebKit2.exp:
WebKitTools:
* MiniBrowser/mac/WebBundle/WebBundleMain.m:
(_didStartProvisionalLoadForFrame):
(_didReceiveServerRedirectForProvisionalLoadForFrame):
(_didFailProvisionalLoadWithErrorForFrame):
(_didCommitLoadForFrame):
(_didFinishLoadForFrame):
(_didFailLoadWithErrorForFrame):
(_didReceiveTitleForFrame):
(_didClearWindowForFrame):
(_didCreatePage):
(_willDestroyPage):
(WKBundleInitialize):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@61689
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2010-06-23 Sam Weinig <sam@webkit.org>
+
+ Reviewed by Anders Carlsson.
+
+ Fix for https://bugs.webkit.org/show_bug.cgi?id=41073
+ WebKit2: Flesh out more of the InjectedBundle client API
+
+ * WebProcess/InjectedBundle/API/c/WKBundle.h:
+ * WebProcess/InjectedBundle/API/c/WKBundlePage.h:
+ * WebProcess/InjectedBundle/InjectedBundle.cpp:
+ (WebKit::InjectedBundle::willDestroyPage):
+ * WebProcess/InjectedBundle/InjectedBundle.h:
+ * WebProcess/InjectedBundle/InjectedBundlePageClient.cpp:
+ (WebKit::InjectedBundlePageClient::didStartProvisionalLoadForFrame):
+ (WebKit::InjectedBundlePageClient::didReceiveServerRedirectForProvisionalLoadForFrame):
+ (WebKit::InjectedBundlePageClient::didFailProvisionalLoadWithErrorForFrame):
+ (WebKit::InjectedBundlePageClient::didCommitLoadForFrame):
+ (WebKit::InjectedBundlePageClient::didFinishLoadForFrame):
+ (WebKit::InjectedBundlePageClient::didFailLoadWithErrorForFrame):
+ (WebKit::InjectedBundlePageClient::didReceiveTitleForFrame):
+ * WebProcess/InjectedBundle/InjectedBundlePageClient.h:
+ * WebProcess/InjectedBundle/mac/InjectedBundleMac.cpp:
+ (WebKit::InjectedBundle::load): Add some error logging on failure to load the bundle.
+ * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+ (WebKit::WebFrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad):
+ (WebKit::WebFrameLoaderClient::dispatchDidStartProvisionalLoad):
+ (WebKit::WebFrameLoaderClient::dispatchDidReceiveTitle):
+ (WebKit::WebFrameLoaderClient::dispatchDidCommitLoad):
+ (WebKit::WebFrameLoaderClient::dispatchDidFailProvisionalLoad):
+ (WebKit::WebFrameLoaderClient::dispatchDidFailLoad):
+ (WebKit::WebFrameLoaderClient::dispatchDidFinishLoad):
+ * WebProcess/WebPage/WebPage.cpp:
+ (WebKit::WebPage::close):
+ * mac/WebKit2.exp:
+
2010-06-22 Anders Carlsson <andersca@apple.com>
Reviewed by Sam Weinig.
// Client
typedef void (*WKBundleDidCreatePageCallback)(WKBundleRef bundle, WKBundlePageRef page, const void *clientInfo);
+typedef void (*WKBundleWillDestroyPageCallback)(WKBundleRef bundle, WKBundlePageRef page, const void *clientInfo);
typedef void (*WKBundleDidRecieveMessageCallback)(WKBundleRef bundle, WKStringRef message, const void *clientInfo);
struct WKBundleClient {
int version;
const void * clientInfo;
WKBundleDidCreatePageCallback didCreatePage;
+ WKBundleWillDestroyPageCallback willDestroyPage;
WKBundleDidRecieveMessageCallback didRecieveMessage;
};
typedef struct WKBundleClient WKBundleClient;
#endif
// Client
-typedef void (*WKBundleDidClearWindowObjectForFrameCallback)(WKBundlePageRef page, WKBundleFrameRef frame, JSContextRef ctx, JSObjectRef window, const void *clientInfo);
+typedef void (*WKBundlePageDidStartProvisionalLoadForFrameCallback)(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo);
+typedef void (*WKBundlePageDidReceiveServerRedirectForProvisionalLoadForFrameCallback)(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo);
+typedef void (*WKBundlePageDidFailProvisionalLoadWithErrorForFrameCallback)(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo); // FIXME: Add WKErrorRef.
+typedef void (*WKBundlePageDidCommitLoadForFrameCallback)(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo);
+typedef void (*WKBundlePageDidFinishLoadForFrameCallback)(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo);
+typedef void (*WKBundlePageDidFailLoadWithErrorForFrameCallback)(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo); // FIXME: Add WKErrorRef.
+typedef void (*WKBundlePageDidReceiveTitleForFrameCallback)(WKBundlePageRef page, WKStringRef title, WKBundleFrameRef frame, const void *clientInfo);
+typedef void (*WKBundlePageDidClearWindowObjectForFrameCallback)(WKBundlePageRef page, WKBundleFrameRef frame, JSContextRef ctx, JSObjectRef window, const void *clientInfo);
struct WKBundlePageClient {
int version;
const void * clientInfo;
- WKBundleDidClearWindowObjectForFrameCallback didClearWindowObjectForFrame;
+ WKBundlePageDidStartProvisionalLoadForFrameCallback didStartProvisionalLoadForFrame;
+ WKBundlePageDidReceiveServerRedirectForProvisionalLoadForFrameCallback didReceiveServerRedirectForProvisionalLoadForFrame;
+ WKBundlePageDidFailProvisionalLoadWithErrorForFrameCallback didFailProvisionalLoadWithErrorForFrame;
+ WKBundlePageDidCommitLoadForFrameCallback didCommitLoadForFrame;
+ WKBundlePageDidFinishLoadForFrameCallback didFinishLoadForFrame;
+ WKBundlePageDidFailLoadWithErrorForFrameCallback didFailLoadWithErrorForFrame;
+ WKBundlePageDidReceiveTitleForFrameCallback didReceiveTitleForFrame;
+ WKBundlePageDidClearWindowObjectForFrameCallback didClearWindowObjectForFrame;
};
typedef struct WKBundlePageClient WKBundlePageClient;
m_client.didCreatePage(toRef(this), toRef(page), m_client.clientInfo);
}
+void InjectedBundle::willDestroyPage(WebPage* page)
+{
+ if (m_client.willDestroyPage)
+ m_client.willDestroyPage(toRef(this), toRef(page), m_client.clientInfo);
+}
+
void InjectedBundle::didRecieveMessage(const WebCore::String& message)
{
if (m_client.didRecieveMessage)
// Callback hooks
void didCreatePage(WebPage*);
+ void willDestroyPage(WebPage*);
void didRecieveMessage(const WebCore::String&);
private:
#include "InjectedBundlePageClient.h"
+#include "WKAPICast.h"
#include "WKBundleAPICast.h"
+#include <WebCore/PlatformString.h>
+
+using namespace WebCore;
namespace WebKit {
memset(&m_client, 0, sizeof(m_client));
}
+void InjectedBundlePageClient::didStartProvisionalLoadForFrame(WebPage* page, WebFrame* frame)
+{
+ if (m_client.didStartProvisionalLoadForFrame)
+ m_client.didStartProvisionalLoadForFrame(toRef(page), toRef(frame), m_client.clientInfo);
+}
+
+void InjectedBundlePageClient::didReceiveServerRedirectForProvisionalLoadForFrame(WebPage* page, WebFrame* frame)
+{
+ if (m_client.didReceiveServerRedirectForProvisionalLoadForFrame)
+ m_client.didReceiveServerRedirectForProvisionalLoadForFrame(toRef(page), toRef(frame), m_client.clientInfo);
+}
+
+void InjectedBundlePageClient::didFailProvisionalLoadWithErrorForFrame(WebPage* page, WebFrame* frame)
+{
+ if (m_client.didFailProvisionalLoadWithErrorForFrame)
+ m_client.didFailProvisionalLoadWithErrorForFrame(toRef(page), toRef(frame), m_client.clientInfo);
+}
+
+void InjectedBundlePageClient::didCommitLoadForFrame(WebPage* page, WebFrame* frame)
+{
+ if (m_client.didCommitLoadForFrame)
+ m_client.didCommitLoadForFrame(toRef(page), toRef(frame), m_client.clientInfo);
+}
+
+void InjectedBundlePageClient::didFinishLoadForFrame(WebPage* page, WebFrame* frame)
+{
+ if (m_client.didFinishLoadForFrame)
+ m_client.didFinishLoadForFrame(toRef(page), toRef(frame), m_client.clientInfo);
+}
+
+void InjectedBundlePageClient::didFailLoadWithErrorForFrame(WebPage* page, WebFrame* frame)
+{
+ if (m_client.didFailLoadWithErrorForFrame)
+ m_client.didFailLoadWithErrorForFrame(toRef(page), toRef(frame), m_client.clientInfo);
+}
+
+void InjectedBundlePageClient::didReceiveTitleForFrame(WebPage* page, const String& title, WebFrame* frame)
+{
+ if (m_client.didReceiveTitleForFrame)
+ m_client.didReceiveTitleForFrame(toRef(page), toRef(title.impl()), toRef(frame), m_client.clientInfo);
+}
+
void InjectedBundlePageClient::didClearWindowObjectForFrame(WebPage* page, WebFrame* frame, JSContextRef ctx, JSObjectRef window)
{
if (m_client.didClearWindowObjectForFrame)
#include "WKBundlePage.h"
#include <JavaScriptCore/JSBase.h>
+namespace WebCore {
+ class String;
+}
+
namespace WebKit {
class WebPage;
InjectedBundlePageClient();
void initialize(WKBundlePageClient*);
+ void didStartProvisionalLoadForFrame(WebPage*, WebFrame*);
+ void didReceiveServerRedirectForProvisionalLoadForFrame(WebPage*, WebFrame*);
+ void didFailProvisionalLoadWithErrorForFrame(WebPage*, WebFrame*);
+ void didCommitLoadForFrame(WebPage*, WebFrame*);
+ void didFinishLoadForFrame(WebPage*, WebFrame*);
+ void didFailLoadWithErrorForFrame(WebPage*, WebFrame*);
+ void didReceiveTitleForFrame(WebPage*, const WebCore::String&, WebFrame*);
void didClearWindowObjectForFrame(WebPage*, WebFrame*, JSContextRef, JSObjectRef);
private:
bool InjectedBundle::load()
{
RetainPtr<CFStringRef> injectedBundlePathStr(AdoptCF, CFStringCreateWithCharacters(0, reinterpret_cast<const UniChar*>(m_path.characters()), m_path.length()));
- if (!injectedBundlePathStr)
+ if (!injectedBundlePathStr) {
+ fprintf(stderr, "InjectedBundle::load failed - Could not create the path string.\n");
return false;
+ }
RetainPtr<CFURLRef> bundleURL(AdoptCF, CFURLCreateWithFileSystemPath(0, injectedBundlePathStr.get(), kCFURLPOSIXPathStyle, false));
- if (!bundleURL)
+ if (!bundleURL) {
+ fprintf(stderr, "InjectedBundle::load failed - Could not create the url from the path string.\n");
return false;
+ }
m_platformBundle = CFBundleCreate(0, bundleURL.get());
- if (!m_platformBundle)
+ if (!m_platformBundle) {
+ fprintf(stderr, "InjectedBundle::load failed - Could not create the bundle.\n");
return false;
+ }
- if (!CFBundleLoadExecutable(m_platformBundle))
+ if (!CFBundleLoadExecutable(m_platformBundle)) {
+ fprintf(stderr, "InjectedBundle::load failed - Could not load the executable from the bundle.\n");
return false;
+ }
WKBundleInitializeFunctionPtr initializeFunction = reinterpret_cast<WKBundleInitializeFunctionPtr>(CFBundleGetFunctionPointerForName(m_platformBundle, CFSTR("WKBundleInitialize")));
- if (!initializeFunction)
+ if (!initializeFunction) {
+ fprintf(stderr, "InjectedBundle::load failed - Could not find the initialize function in the bundle executable.\n");
return false;
+ }
initializeFunction(toRef(this));
return true;
if (!webPage)
return;
+ // Notify the bundle client.
+ webPage->injectedBundleClient().didReceiveServerRedirectForProvisionalLoadForFrame(webPage, m_frame);
+
+ // Notify the UIProcess.
WebProcess::shared().connection()->send(WebPageProxyMessage::DidReceiveServerRedirectForProvisionalLoadForFrame, webPage->pageID(), CoreIPC::In(m_frame->frameID()));
}
DocumentLoader* provisionalLoader = m_frame->coreFrame()->loader()->provisionalDocumentLoader();
const String& url = provisionalLoader->url().string();
+ // Notify the bundle client.
+ webPage->injectedBundleClient().didStartProvisionalLoadForFrame(webPage, m_frame);
+
+ // Notify the UIProcess.
WebProcess::shared().connection()->send(WebPageProxyMessage::DidStartProvisionalLoadForFrame, webPage->pageID(), CoreIPC::In(m_frame->frameID(), url));
}
if (!webPage)
return;
+ // Notify the bundle client.
+ webPage->injectedBundleClient().didReceiveTitleForFrame(webPage, title, m_frame);
+
+ // Notify the UIProcess.
WebProcess::shared().connection()->send(WebPageProxyMessage::DidReceiveTitleForFrame, webPage->pageID(), CoreIPC::In(m_frame->frameID(), title));
}
if (!webPage)
return;
+ // Notify the bundle client.
+ webPage->injectedBundleClient().didCommitLoadForFrame(webPage, m_frame);
+
+ // Notify the UIProcess.
WebProcess::shared().connection()->send(WebPageProxyMessage::DidCommitLoadForFrame, webPage->pageID(), CoreIPC::In(m_frame->frameID()));
}
if (!webPage)
return;
+ // Notify the bundle client.
+ webPage->injectedBundleClient().didFailProvisionalLoadWithErrorForFrame(webPage, m_frame);
+
+ // Notify the UIProcess.
WebProcess::shared().connection()->send(WebPageProxyMessage::DidFailProvisionalLoadForFrame, webPage->pageID(), CoreIPC::In(m_frame->frameID()));
}
if (!webPage)
return;
+ // Notify the bundle client.
+ webPage->injectedBundleClient().didFailLoadWithErrorForFrame(webPage, m_frame);
+
+ // Notify the UIProcess.
WebProcess::shared().connection()->send(WebPageProxyMessage::DidFailLoadForFrame, webPage->pageID(), CoreIPC::In(m_frame->frameID()));
}
if (!webPage)
return;
+ // Notify the bundle client.
+ webPage->injectedBundleClient().didFinishLoadForFrame(webPage, m_frame);
+
+ // Notify the UIProcess.
WebProcess::shared().connection()->send(WebPageProxyMessage::DidFinishLoadForFrame, webPage->pageID(), CoreIPC::In(m_frame->frameID()));
}
void WebPage::close()
{
+ if (WebProcess::shared().injectedBundle())
+ WebProcess::shared().injectedBundle()->willDestroyPage(this);
+
m_mainFrame->coreFrame()->loader()->detachFromParent();
delete m_page;
_WKPageNamespaceRetain
_WKPageRelease
_WKPageReload
+_WKPageRenderTreeExternalRepresentation
_WKPageRetain
_WKPageSetPageHistoryClient
_WKPageSetPageLoaderClient
+2010-06-23 Sam Weinig <sam@webkit.org>
+
+ Reviewed by Anders Carlsson.
+
+ Fix for https://bugs.webkit.org/show_bug.cgi?id=41073
+ WebKit2: Flesh out more of the InjectedBundle client API
+
+ * MiniBrowser/mac/WebBundle/WebBundleMain.m:
+ (_didStartProvisionalLoadForFrame):
+ (_didReceiveServerRedirectForProvisionalLoadForFrame):
+ (_didFailProvisionalLoadWithErrorForFrame):
+ (_didCommitLoadForFrame):
+ (_didFinishLoadForFrame):
+ (_didFailLoadWithErrorForFrame):
+ (_didReceiveTitleForFrame):
+ (_didClearWindowForFrame):
+ (_didCreatePage):
+ (_willDestroyPage):
+ (WKBundleInitialize):
+
2010-06-23 Yuzo Fujishima <yuzo@google.com>
Reviewed by Shinichiro Hamaji.
static WKBundleRef globalBundle;
-void _didClearWindow(WKBundlePageRef page, WKBundleFrameRef frame, JSContextRef ctx, JSObjectRef window, const void *clientInfo)
+// WKBundlePageClient
+
+void _didStartProvisionalLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo)
+{
+}
+
+void _didReceiveServerRedirectForProvisionalLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo)
+{
+}
+
+void _didFailProvisionalLoadWithErrorForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo)
+{
+}
+
+void _didCommitLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo)
+{
+}
+
+void _didFinishLoadForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo)
+{
+}
+
+void _didFailLoadWithErrorForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void *clientInfo)
+{
+}
+
+void _didReceiveTitleForFrame(WKBundlePageRef page, WKStringRef title, WKBundleFrameRef frame, const void *clientInfo)
+{
+}
+
+void _didClearWindowForFrame(WKBundlePageRef page, WKBundleFrameRef frame, JSContextRef ctx, JSObjectRef window, const void *clientInfo)
{
CFURLRef cfURL = WKURLCopyCFURL(0, WKBundlePageGetMainFrameURL(page));
NSLog(@"WKBundlePageClient - _didClearWindowForFrame %@", [(NSURL *)cfURL absoluteString]);
WKStringRelease(message);
}
-void _didCreatePage(WKBundlePageRef bundle, WKBundlePageRef page, const void* clientInfo)
+
+// WKBundleClient
+
+void _didCreatePage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo)
{
NSLog(@"WKBundleClient - didCreatePage\n");
WKBundlePageClient client = {
0,
0,
- _didClearWindow
+ _didStartProvisionalLoadForFrame,
+ _didReceiveServerRedirectForProvisionalLoadForFrame,
+ _didFailProvisionalLoadWithErrorForFrame,
+ _didCommitLoadForFrame,
+ _didFinishLoadForFrame,
+ _didFailLoadWithErrorForFrame,
+ _didReceiveTitleForFrame,
+ _didClearWindowForFrame
};
WKBundlePageSetClient(page, &client);
}
+void _willDestroyPage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo)
+{
+ NSLog(@"WKBundleClient - willDestroyPage\n");
+}
+
void _didRecieveMessage(WKBundleRef bundle, WKStringRef message, const void *clientInfo)
{
CFStringRef cfMessage = WKStringCopyCFString(0, message);
0,
0,
_didCreatePage,
+ _willDestroyPage,
_didRecieveMessage
};
WKBundleSetClient(bundle, &client);