Title: [166270] trunk/Source/WebKit2
Revision
166270
Author
ander...@apple.com
Date
2014-03-25 17:01:09 -0700 (Tue, 25 Mar 2014)

Log Message

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):

Modified Paths

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) {
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to