Changeset 166733 in webkit


Ignore:
Timestamp:
Apr 3, 2014 11:34:18 AM (10 years ago)
Author:
andersca@apple.com
Message:

WKWebView should always have a UIDelegate, even when closed
https://bugs.webkit.org/show_bug.cgi?id=131174
<rdar://problem/16389248>

Reviewed by Sam Weinig.

  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView initWithFrame:configuration:]):
(-[WKWebView UIDelegate]):
(-[WKWebView setUIDelegate:]):

  • UIProcess/Cocoa/UIDelegate.h:
  • UIProcess/Cocoa/UIDelegate.mm:

(WebKit::UIDelegate::UIDelegate):
(WebKit::UIDelegate::~UIDelegate):
(WebKit::UIDelegate::createUIClient):
(WebKit::UIDelegate::delegate):
(WebKit::UIDelegate::setDelegate):
(WebKit::UIDelegate::UIClient::UIClient):
(WebKit::UIDelegate::UIClient::~UIClient):
(WebKit::UIDelegate::UIClient::createNewPage):
(WebKit::UIDelegate::UIClient::runJavaScriptAlert):
(WebKit::UIDelegate::UIClient::runJavaScriptConfirm):
(WebKit::UIDelegate::UIClient::runJavaScriptPrompt):
(WebKit::UIDelegate::UIClient::actionsForElement):
(WebKit::UIClient::UIClient): Deleted.
(WebKit::UIClient::~UIClient): Deleted.
(WebKit::UIClient::delegate): Deleted.
(WebKit::UIClient::setDelegate): Deleted.
(WebKit::UIClient::createNewPage): Deleted.
(WebKit::UIClient::runJavaScriptAlert): Deleted.
(WebKit::UIClient::runJavaScriptConfirm): Deleted.
(WebKit::UIClient::runJavaScriptPrompt): Deleted.
(WebKit::UIClient::actionsForElement): Deleted.

  • UIProcess/ios/WKActionSheetAssistant.mm:
Location:
trunk/Source/WebKit2
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r166731 r166733  
     12014-04-03  Anders Carlsson  <andersca@apple.com>
     2
     3        WKWebView should always have a UIDelegate, even when closed
     4        https://bugs.webkit.org/show_bug.cgi?id=131174
     5        <rdar://problem/16389248>
     6
     7        Reviewed by Sam Weinig.
     8
     9        * UIProcess/API/Cocoa/WKWebView.mm:
     10        (-[WKWebView initWithFrame:configuration:]):
     11        (-[WKWebView UIDelegate]):
     12        (-[WKWebView setUIDelegate:]):
     13        * UIProcess/Cocoa/UIDelegate.h:
     14        * UIProcess/Cocoa/UIDelegate.mm:
     15        (WebKit::UIDelegate::UIDelegate):
     16        (WebKit::UIDelegate::~UIDelegate):
     17        (WebKit::UIDelegate::createUIClient):
     18        (WebKit::UIDelegate::delegate):
     19        (WebKit::UIDelegate::setDelegate):
     20        (WebKit::UIDelegate::UIClient::UIClient):
     21        (WebKit::UIDelegate::UIClient::~UIClient):
     22        (WebKit::UIDelegate::UIClient::createNewPage):
     23        (WebKit::UIDelegate::UIClient::runJavaScriptAlert):
     24        (WebKit::UIDelegate::UIClient::runJavaScriptConfirm):
     25        (WebKit::UIDelegate::UIClient::runJavaScriptPrompt):
     26        (WebKit::UIDelegate::UIClient::actionsForElement):
     27        (WebKit::UIClient::UIClient): Deleted.
     28        (WebKit::UIClient::~UIClient): Deleted.
     29        (WebKit::UIClient::delegate): Deleted.
     30        (WebKit::UIClient::setDelegate): Deleted.
     31        (WebKit::UIClient::createNewPage): Deleted.
     32        (WebKit::UIClient::runJavaScriptAlert): Deleted.
     33        (WebKit::UIClient::runJavaScriptConfirm): Deleted.
     34        (WebKit::UIClient::runJavaScriptPrompt): Deleted.
     35        (WebKit::UIClient::actionsForElement): Deleted.
     36        * UIProcess/ios/WKActionSheetAssistant.mm:
     37
    1382014-04-02  Anders Carlsson  <andersca@apple.com>
    239
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm

    r166720 r166733  
    8383@implementation WKWebView {
    8484    std::unique_ptr<WebKit::NavigationState> _navigationState;
     85    std::unique_ptr<WebKit::UIDelegate> _uiDelegate;
    8586
    8687    RetainPtr<_WKRemoteObjectRegistry> _remoteObjectRegistry;
     
    200201    _page->setPolicyClient(_navigationState->createPolicyClient());
    201202    _page->setLoaderClient(_navigationState->createLoaderClient());
    202     _page->setUIClient(std::make_unique<WebKit::UIClient>(self));
     203
     204    _uiDelegate = std::make_unique<WebKit::UIDelegate>(self);
     205    _page->setUIClient(_uiDelegate->createUIClient());
     206
    203207    _page->setFindClient(std::make_unique<WebKit::FindClient>(self));
     208
    204209    return self;
    205210}
     
    238243- (id <WKUIDelegate>)UIDelegate
    239244{
    240     // FIXME: A closed page should still have a UI delegate - it should just never be called.
    241     if (_page->isClosed())
    242         return nil;
    243 
    244     return [static_cast<WebKit::UIClient&>(_page->uiClient()).delegate().leakRef() autorelease];
     245    return [_uiDelegate->delegate().leakRef() autorelease];
    245246}
    246247
    247248- (void)setUIDelegate:(id<WKUIDelegate>)UIDelegate
    248249{
    249     // FIXME: A closed page should still have a UI delegate - it should just never be called.
    250     if (_page->isClosed())
    251         return;
    252 
    253     static_cast<WebKit::UIClient&>(_page->uiClient()).setDelegate(UIDelegate);
     250    _uiDelegate->setDelegate(UIDelegate);
    254251}
    255252
  • trunk/Source/WebKit2/UIProcess/Cocoa/UIDelegate.h

    r166730 r166733  
    4141namespace WebKit {
    4242
    43 class UIClient : public API::UIClient {
     43class UIDelegate {
    4444public:
    45     explicit UIClient(WKWebView *);
    46     ~UIClient();
     45    explicit UIDelegate(WKWebView *);
     46    ~UIDelegate();
     47
     48    std::unique_ptr<API::UIClient> createUIClient();
    4749
    4850    RetainPtr<id <WKUIDelegate> > delegate();
     
    5052
    5153private:
    52     // API::UIClient
    53     virtual PassRefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, WebKit::WebEvent::Modifiers, WebKit::WebMouseEvent::Button) override;
    54     virtual void runJavaScriptAlert(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, std::function<void ()> completionHandler) override;
    55     virtual void runJavaScriptConfirm(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, std::function<void (bool)> completionHandler) override;
    56     virtual void runJavaScriptPrompt(WebKit::WebPageProxy*, const WTF::String&, const WTF::String&, WebKit::WebFrameProxy*, std::function<void (const WTF::String&)> completionHandler) override;
    57 #if PLATFORM(IOS)
    58     virtual RetainPtr<NSArray> actionsForElement(_WKActivatedElementInfo *, RetainPtr<NSArray> defaultActions) override;
    59 #endif
     54    class UIClient : public API::UIClient {
     55    public:
     56        explicit UIClient(UIDelegate&);
     57        ~UIClient();
     58
     59    private:
     60        // API::UIClient
     61        virtual PassRefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, WebKit::WebEvent::Modifiers, WebKit::WebMouseEvent::Button) override;
     62        virtual void runJavaScriptAlert(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, std::function<void ()> completionHandler) override;
     63        virtual void runJavaScriptConfirm(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, std::function<void (bool)> completionHandler) override;
     64        virtual void runJavaScriptPrompt(WebKit::WebPageProxy*, const WTF::String&, const WTF::String&, WebKit::WebFrameProxy*, std::function<void (const WTF::String&)> completionHandler) override;
     65    #if PLATFORM(IOS)
     66        virtual RetainPtr<NSArray> actionsForElement(_WKActivatedElementInfo *, RetainPtr<NSArray> defaultActions) override;
     67    #endif
     68
     69        UIDelegate& m_uiDelegate;
     70    };
    6071
    6172    WKWebView *m_webView;
  • trunk/Source/WebKit2/UIProcess/Cocoa/UIDelegate.mm

    r166730 r166733  
    3838namespace WebKit {
    3939
    40 UIClient::UIClient(WKWebView *webView)
     40UIDelegate::UIDelegate(WKWebView *webView)
    4141    : m_webView(webView)
    4242{
    4343}
    4444
    45 UIClient::~UIClient()
     45UIDelegate::~UIDelegate()
    4646{
    4747}
    4848
    49 RetainPtr<id <WKUIDelegate> > UIClient::delegate()
     49std::unique_ptr<API::UIClient> UIDelegate::createUIClient()
     50{
     51    return std::make_unique<UIClient>(*this);
     52}
     53
     54RetainPtr<id <WKUIDelegate> > UIDelegate::delegate()
    5055{
    5156    return m_delegate.get();
    5257}
    5358
    54 void UIClient::setDelegate(id <WKUIDelegate> delegate)
     59void UIDelegate::setDelegate(id <WKUIDelegate> delegate)
    5560{
    5661    m_delegate = delegate;
     
    6570}
    6671
    67 PassRefPtr<WebKit::WebPageProxy> UIClient::createNewPage(WebKit::WebPageProxy*, WebKit::WebFrameProxy* initiatingFrame, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, WebKit::WebEvent::Modifiers, WebKit::WebMouseEvent::Button)
     72UIDelegate::UIClient::UIClient(UIDelegate& uiDelegate)
     73    : m_uiDelegate(uiDelegate)
    6874{
    69     if (!m_delegateMethods.webViewCreateWebViewWithConfigurationForNavigationActionWindowFeatures)
     75}
     76
     77UIDelegate::UIClient::~UIClient()
     78{
     79}
     80
     81PassRefPtr<WebKit::WebPageProxy> UIDelegate::UIClient::createNewPage(WebKit::WebPageProxy*, WebKit::WebFrameProxy* initiatingFrame, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, WebKit::WebEvent::Modifiers, WebKit::WebMouseEvent::Button)
     82{
     83    if (!m_uiDelegate.m_delegateMethods.webViewCreateWebViewWithConfigurationForNavigationActionWindowFeatures)
    7084        return nullptr;
    7185
    72     auto delegate = m_delegate.get();
     86    auto delegate = m_uiDelegate.m_delegate.get();
    7387    if (!delegate)
    7488        return nullptr;
    7589
    76     auto configuration = adoptNS([m_webView->_configuration copy]);
    77     [configuration _setRelatedWebView:m_webView];
     90    auto configuration = adoptNS([m_uiDelegate.m_webView->_configuration copy]);
     91    [configuration _setRelatedWebView:m_uiDelegate.m_webView];
    7892
    7993    auto navigationAction = adoptNS([[WKNavigationAction alloc] init]);
     
    8498    [navigationAction setRequest:request.nsURLRequest(WebCore::DoNotUpdateHTTPBody)];
    8599
    86     RetainPtr<WKWebView> webView = [delegate.get() webView:m_webView createWebViewWithConfiguration:configuration.get() forNavigationAction:navigationAction.get() windowFeatures:adoptNS([[WKWindowFeatures alloc] _initWithWindowFeatures:windowFeatures]).get()];
     100    RetainPtr<WKWebView> webView = [delegate.get() webView:m_uiDelegate.m_webView createWebViewWithConfiguration:configuration.get() forNavigationAction:navigationAction.get() windowFeatures:adoptNS([[WKWindowFeatures alloc] _initWithWindowFeatures:windowFeatures]).get()];
    87101
    88102    if (!webView)
    89103        return nullptr;
    90104
    91     if ([webView->_configuration _relatedWebView] != m_webView)
     105    if ([webView->_configuration _relatedWebView] != m_uiDelegate.m_webView)
    92106        [NSException raise:NSInternalInconsistencyException format:@"Returned WKWebView was not created with the given configuration."];
    93107
     
    95109}
    96110
    97 void UIClient::runJavaScriptAlert(WebKit::WebPageProxy*, const WTF::String& message, WebKit::WebFrameProxy* webFrameProxy, std::function<void ()> completionHandler)
     111void UIDelegate::UIClient::runJavaScriptAlert(WebKit::WebPageProxy*, const WTF::String& message, WebKit::WebFrameProxy* webFrameProxy, std::function<void ()> completionHandler)
    98112{
    99     if (!m_delegateMethods.webViewRunJavaScriptAlertPanelWithMessageInitiatedByFrameCompletionHandler) {
     113    if (!m_uiDelegate.m_delegateMethods.webViewRunJavaScriptAlertPanelWithMessageInitiatedByFrameCompletionHandler) {
    100114        completionHandler();
    101115        return;
    102116    }
    103117
    104     auto delegate = m_delegate.get();
     118    auto delegate = m_uiDelegate.m_delegate.get();
    105119    if (!delegate) {
    106120        completionHandler();
     
    108122    }
    109123
    110     [delegate webView:m_webView runJavaScriptAlertPanelWithMessage:message initiatedByFrame:adoptNS([[WKFrameInfo alloc] initWithWebFrameProxy:*webFrameProxy]).get() completionHandler:[completionHandler] {
     124    [delegate webView:m_uiDelegate.m_webView runJavaScriptAlertPanelWithMessage:message initiatedByFrame:adoptNS([[WKFrameInfo alloc] initWithWebFrameProxy:*webFrameProxy]).get() completionHandler:[completionHandler] {
    111125        completionHandler();
    112126    }];
    113127}
    114128
    115 void UIClient::runJavaScriptConfirm(WebKit::WebPageProxy*, const WTF::String& message, WebKit::WebFrameProxy* webFrameProxy, std::function<void (bool)> completionHandler)
     129void UIDelegate::UIClient::runJavaScriptConfirm(WebKit::WebPageProxy*, const WTF::String& message, WebKit::WebFrameProxy* webFrameProxy, std::function<void (bool)> completionHandler)
    116130{
    117     if (!m_delegateMethods.webViewRunJavaScriptConfirmPanelWithMessageInitiatedByFrameCompletionHandler) {
     131    if (!m_uiDelegate.m_delegateMethods.webViewRunJavaScriptConfirmPanelWithMessageInitiatedByFrameCompletionHandler) {
    118132        completionHandler(false);
    119133        return;
    120134    }
    121135
    122     auto delegate = m_delegate.get();
     136    auto delegate = m_uiDelegate.m_delegate.get();
    123137    if (!delegate) {
    124138        completionHandler(false);
     
    126140    }
    127141
    128     [delegate webView:m_webView runJavaScriptConfirmPanelWithMessage:message initiatedByFrame:adoptNS([[WKFrameInfo alloc] initWithWebFrameProxy:*webFrameProxy]).get() completionHandler:[completionHandler](BOOL result) {
     142    [delegate webView:m_uiDelegate.m_webView runJavaScriptConfirmPanelWithMessage:message initiatedByFrame:adoptNS([[WKFrameInfo alloc] initWithWebFrameProxy:*webFrameProxy]).get() completionHandler:[completionHandler](BOOL result) {
    129143        completionHandler(result);
    130144    }];
    131145}
    132146
    133 void UIClient::runJavaScriptPrompt(WebKit::WebPageProxy*, const WTF::String& message, const WTF::String& defaultValue, WebKit::WebFrameProxy* webFrameProxy, std::function<void (const WTF::String&)> completionHandler)
     147void UIDelegate::UIClient::runJavaScriptPrompt(WebKit::WebPageProxy*, const WTF::String& message, const WTF::String& defaultValue, WebKit::WebFrameProxy* webFrameProxy, std::function<void (const WTF::String&)> completionHandler)
    134148{
    135     if (!m_delegateMethods.webViewRunJavaScriptTextInputPanelWithPromptDefaultTextInitiatedByFrameCompletionHandler) {
     149    if (!m_uiDelegate.m_delegateMethods.webViewRunJavaScriptTextInputPanelWithPromptDefaultTextInitiatedByFrameCompletionHandler) {
    136150        completionHandler(String());
    137151        return;
    138152    }
    139153
    140     auto delegate = m_delegate.get();
     154    auto delegate = m_uiDelegate.m_delegate.get();
    141155    if (!delegate) {
    142156        completionHandler(String());
     
    144158    }
    145159
    146     [delegate webView:m_webView runJavaScriptTextInputPanelWithPrompt:message defaultText:defaultValue initiatedByFrame:adoptNS([[WKFrameInfo alloc] initWithWebFrameProxy:*webFrameProxy]).get() completionHandler:[completionHandler](NSString *result) {
     160    [delegate webView:m_uiDelegate.m_webView runJavaScriptTextInputPanelWithPrompt:message defaultText:defaultValue initiatedByFrame:adoptNS([[WKFrameInfo alloc] initWithWebFrameProxy:*webFrameProxy]).get() completionHandler:[completionHandler](NSString *result) {
    147161        completionHandler(result);
    148162    }];
     
    150164
    151165#if PLATFORM(IOS)
    152 RetainPtr<NSArray> UIClient::actionsForElement(_WKActivatedElementInfo *elementInfo, RetainPtr<NSArray> defaultActions)
     166RetainPtr<NSArray> UIDelegate::UIClient::actionsForElement(_WKActivatedElementInfo *elementInfo, RetainPtr<NSArray> defaultActions)
    153167{
    154     if (!m_delegateMethods.webViewActionsForElementDefaultActions)
     168    if (!m_uiDelegate.m_delegateMethods.webViewActionsForElementDefaultActions)
    155169        return std::move(defaultActions);
    156170
    157     auto delegate = m_delegate.get();
     171    auto delegate = m_uiDelegate.m_delegate.get();
    158172    if (!delegate)
    159173        return defaultActions;
    160174
    161     return [(id <WKUIDelegatePrivate>)delegate _webView:m_webView actionsForElement:elementInfo defaultActions:defaultActions.get()];
     175    return [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView actionsForElement:elementInfo defaultActions:defaultActions.get()];
    162176}
    163177#endif
  • trunk/Source/WebKit2/UIProcess/ios/WKActionSheetAssistant.mm

    r166730 r166733  
    2929#if PLATFORM(IOS)
    3030
    31 #import "_WKActivatedElementInfoInternal.h"
    32 #import "_WKElementActionInternal.h"
    33 #import "UIDelegate.h"
     31#import "APIUIClient.h"
    3432#import "WKActionSheet.h"
    3533#import "WKContentViewInteraction.h"
    3634#import "WebPageProxy.h"
    37 #import <TCC/TCC.h>
     35#import "_WKActivatedElementInfoInternal.h"
     36#import "_WKElementActionInternal.h"
    3837#import <DataDetectorsUI/DDDetectionController.h>
    3938#import <SafariServices/SSReadingList.h>
     39#import <TCC/TCC.h>
    4040#import <UIKit/UIActionSheet_Private.h>
    4141#import <UIKit/UIView.h>
Note: See TracChangeset for help on using the changeset viewer.