Diff
Modified: trunk/Source/WebKit2/ChangeLog (166269 => 166270)
--- trunk/Source/WebKit2/ChangeLog 2014-03-26 00:00:17 UTC (rev 166269)
+++ trunk/Source/WebKit2/ChangeLog 2014-03-26 00:01:09 UTC (rev 166270)
@@ -1,5 +1,20 @@
2014-03-25 Anders Carlsson <ander...@apple.com>
+ Add a UI delegate callback for handling window.open
+ https://bugs.webkit.org/show_bug.cgi?id=130757
+
+ Reviewed by Sam Weinig.
+
+ * UIProcess/API/Cocoa/WKUIDelegate.h:
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ * UIProcess/API/Cocoa/WKWebViewInternal.h:
+ * UIProcess/Cocoa/UIClient.h:
+ * UIProcess/Cocoa/UIClient.mm:
+ (WebKit::UIClient::setDelegate):
+ (WebKit::UIClient::createNewPage):
+
+2014-03-25 Anders Carlsson <ander...@apple.com>
+
Move stopLoading: back for now.
* UIProcess/API/Cocoa/WKWebView.h:
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegate.h (166269 => 166270)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegate.h 2014-03-26 00:00:17 UTC (rev 166269)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUIDelegate.h 2014-03-26 00:01:09 UTC (rev 166270)
@@ -29,11 +29,17 @@
#if WK_API_ENABLED
@class WKFrameInfo;
+@class WKWebViewConfiguration;
+@class WKWindowFeatures;
@protocol WKUIDelegate <NSObject>
@optional
+// FIXME: Maybe we should pass a WKNavigationAction instead of request and frame.
+// The C SPI has the key modifiers and mouse button as well.
+- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration request:(NSURLRequest *)request windowFeatures:(WKWindowFeatures *)windowFeatures initiatedByFrame:(WKFrameInfo *)frame;
+
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)())completionHandler;
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (166269 => 166270)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm 2014-03-26 00:00:17 UTC (rev 166269)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm 2014-03-26 00:01:09 UTC (rev 166270)
@@ -77,7 +77,6 @@
#endif
@implementation WKWebView {
- RetainPtr<WKWebViewConfiguration> _configuration;
std::unique_ptr<WebKit::NavigationState> _navigationState;
RetainPtr<WKRemoteObjectRegistry> _remoteObjectRegistry;
Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h (166269 => 166270)
--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h 2014-03-26 00:00:17 UTC (rev 166269)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewInternal.h 2014-03-26 00:01:09 UTC (rev 166270)
@@ -28,6 +28,7 @@
#if WK_API_ENABLED
#import <wtf/RefPtr.h>
+#import <wtf/RetainPtr.h>
#if PLATFORM(IOS)
#import "WKContentView.h"
@@ -50,6 +51,8 @@
@interface WKWebView () WK_WEB_VIEW_PROTOCOLS {
@package
+ RetainPtr<WKWebViewConfiguration> _configuration;
+
RefPtr<WebKit::WebPageProxy> _page;
}
Modified: trunk/Source/WebKit2/UIProcess/Cocoa/UIClient.h (166269 => 166270)
--- trunk/Source/WebKit2/UIProcess/Cocoa/UIClient.h 2014-03-26 00:00:17 UTC (rev 166269)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/UIClient.h 2014-03-26 00:01:09 UTC (rev 166270)
@@ -52,6 +52,7 @@
private:
// API::UIClient
+ virtual PassRefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, WebKit::WebEvent::Modifiers, WebKit::WebMouseEvent::Button) override;
virtual void runJavaScriptAlert(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, std::function<void ()> completionHandler) override;
virtual void runJavaScriptConfirm(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, std::function<void (bool)> completionHandler) override;
virtual void runJavaScriptPrompt(WebKit::WebPageProxy*, const WTF::String&, const WTF::String&, WebKit::WebFrameProxy*, std::function<void (const WTF::String&)> completionHandler) override;
@@ -60,6 +61,7 @@
WeakObjCPtr<id <WKUIDelegate> > m_delegate;
struct {
+ bool webViewCreateWebViewWithConfigurationRequestWindowFeaturesInitiatedByFrame : 1;
bool webViewRunJavaScriptAlertPanelWithMessageInitiatedByFrameCompletionHandler : 1;
bool webViewRunJavaScriptConfirmPanelWithMessageInitiatedByFrameCompletionHandler : 1;
bool webViewRunJavaScriptTextInputPanelWithPromptDefaultTextInitiatedByFrameCompletionHandler : 1;
Modified: trunk/Source/WebKit2/UIProcess/Cocoa/UIClient.mm (166269 => 166270)
--- trunk/Source/WebKit2/UIProcess/Cocoa/UIClient.mm 2014-03-26 00:00:17 UTC (rev 166269)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/UIClient.mm 2014-03-26 00:01:09 UTC (rev 166270)
@@ -29,6 +29,9 @@
#if WK_API_ENABLED
#import "WKFrameInfoInternal.h"
+#import "WKWebViewConfigurationInternal.h"
+#import "WKWebViewInternal.h"
+#import "WKWindowFeaturesInternal.h"
#import "WKUIDelegatePrivate.h"
namespace WebKit {
@@ -51,6 +54,7 @@
{
m_delegate = delegate;
+ m_delegateMethods.webViewCreateWebViewWithConfigurationRequestWindowFeaturesInitiatedByFrame = [delegate respondsToSelector:@selector(webView:createWebViewWithConfiguration:request:windowFeatures:initiatedByFrame:)];
m_delegateMethods.webViewRunJavaScriptAlertPanelWithMessageInitiatedByFrameCompletionHandler = [delegate respondsToSelector:@selector(webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:)];
m_delegateMethods.webViewRunJavaScriptConfirmPanelWithMessageInitiatedByFrameCompletionHandler = [delegate respondsToSelector:@selector(webView:runJavaScriptConfirmPanelWithMessage:initiatedByFrame:completionHandler:)];
m_delegateMethods.webViewRunJavaScriptTextInputPanelWithPromptDefaultTextInitiatedByFrameCompletionHandler = [delegate respondsToSelector:@selector(webView:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:completionHandler:)];
@@ -74,6 +78,29 @@
return defaultActions;
}
+PassRefPtr<WebKit::WebPageProxy> UIClient::createNewPage(WebKit::WebPageProxy*, WebKit::WebFrameProxy* initiatingFrame, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, WebKit::WebEvent::Modifiers, WebKit::WebMouseEvent::Button)
+{
+ if (!m_delegateMethods.webViewCreateWebViewWithConfigurationRequestWindowFeaturesInitiatedByFrame)
+ return nullptr;
+
+ auto delegate = m_delegate.get();
+ if (!delegate)
+ return nullptr;
+
+ auto configuration = adoptNS([m_webView->_configuration copy]);
+ [configuration _setRelatedWebView:m_webView];
+
+ WKWebView *webView = [delegate webView:m_webView createWebViewWithConfiguration:configuration.get() request:request.nsURLRequest(WebCore::DoNotUpdateHTTPBody) windowFeatures:adoptNS([[WKWindowFeatures alloc] _initWithWindowFeatures:windowFeatures]).get() initiatedByFrame:adoptNS([[WKFrameInfo alloc] initWithWebFrameProxy:*initiatingFrame]).get()];
+
+ if (!webView)
+ return nullptr;
+
+ if ([webView->_configuration _relatedWebView] != m_webView)
+ [NSException raise:NSInternalInconsistencyException format:@"Returned WKWebView was not created with the given configuration."];
+
+ return webView->_page.get();
+}
+
void UIClient::runJavaScriptAlert(WebKit::WebPageProxy*, const WTF::String& message, WebKit::WebFrameProxy* webFrameProxy, std::function<void ()> completionHandler)
{
if (!m_delegateMethods.webViewRunJavaScriptAlertPanelWithMessageInitiatedByFrameCompletionHandler) {