Changeset 166466 in webkit


Ignore:
Timestamp:
Mar 30, 2014 3:33:51 PM (10 years ago)
Author:
aestes@apple.com
Message:

[Cocoa] Add an originatingWebView property to _WKDownload
https://bugs.webkit.org/show_bug.cgi?id=130945

Reviewed by Anders Carlsson.

Source/WebKit2:

  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView initWithFrame:configuration:]): Passed self to WKView's initializer.

  • UIProcess/API/Cocoa/_WKDownload.h: Declared originatingWebView as a weak, readonly property.
  • UIProcess/API/Cocoa/_WKDownload.mm:

(-[_WKDownload originatingWebView]):
(-[_WKDownload setOriginatingWebView:]):

  • UIProcess/API/Cocoa/_WKDownloadInternal.h: Re-declared originatingWebView as readwrite so that

PageClientImpl can call setOriginatingWebView:. Removed some dead code.

  • UIProcess/API/mac/WKView.mm:

(-[WKView initWithFrame:context:configuration:webView:]): Updated to accept a webView parameter.
(-[WKView initWithFrame:contextRef:pageGroupRef:relatedToPage:]): Passed nil for the webView parameter.

  • UIProcess/API/mac/WKViewInternal.h:
  • UIProcess/Cocoa/DownloadClient.mm:

(WebKit::DownloadClient::decideDestinationWithSuggestedFilename): Ensured allowOverwrite is initialized.

  • UIProcess/PageClient.h: Included handleDownloadRequest() on all platforms.
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::receivedPolicyDecision): Ditto.
(WebKit::WebPageProxy::handleDownloadRequest): Ditto.

  • UIProcess/WebPageProxy.h: Ditto.
  • UIProcess/ios/PageClientImplIOS.h:
  • UIProcess/ios/PageClientImplIOS.mm:

(WebKit::PageClientImpl::handleDownloadRequest): Called -[_WKDownload setOriginatingWebView:].

  • UIProcess/mac/PageClientImpl.h: Added a m_webView member variable.
  • UIProcess/mac/PageClientImpl.mm:

(WebKit::PageClientImpl::PageClientImpl): Asserted that m_webView is nil if WK API isn't enabled.
(WebKit::PageClientImpl::handleDownloadRequest): Called -[_WKDownload setOriginatingWebView:].

Tools:

  • TestWebKitAPI/Tests/WebKit2Cocoa/Download.mm:

(-[DownloadDelegate _downloadDidStart:]):
(-[OriginatingWebViewDownloadDelegate initWithWebView:]):
(-[OriginatingWebViewDownloadDelegate _downloadDidStart:]):
(TEST):

Location:
trunk
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r166459 r166466  
     12014-03-30  Andy Estes  <aestes@apple.com>
     2
     3        [Cocoa] Add an originatingWebView property to _WKDownload
     4        https://bugs.webkit.org/show_bug.cgi?id=130945
     5
     6        Reviewed by Anders Carlsson.
     7
     8        * UIProcess/API/Cocoa/WKWebView.mm:
     9        (-[WKWebView initWithFrame:configuration:]): Passed self to WKView's initializer.
     10        * UIProcess/API/Cocoa/_WKDownload.h: Declared originatingWebView as a weak, readonly property.
     11        * UIProcess/API/Cocoa/_WKDownload.mm:
     12        (-[_WKDownload originatingWebView]):
     13        (-[_WKDownload setOriginatingWebView:]):
     14        * UIProcess/API/Cocoa/_WKDownloadInternal.h: Re-declared originatingWebView as readwrite so that
     15        PageClientImpl can call setOriginatingWebView:. Removed some dead code.
     16        * UIProcess/API/mac/WKView.mm:
     17        (-[WKView initWithFrame:context:configuration:webView:]): Updated to accept a webView parameter.
     18        (-[WKView initWithFrame:contextRef:pageGroupRef:relatedToPage:]): Passed nil for the webView parameter.
     19        * UIProcess/API/mac/WKViewInternal.h:
     20        * UIProcess/Cocoa/DownloadClient.mm:
     21        (WebKit::DownloadClient::decideDestinationWithSuggestedFilename): Ensured allowOverwrite is initialized.
     22        * UIProcess/PageClient.h: Included handleDownloadRequest() on all platforms.
     23        * UIProcess/WebPageProxy.cpp:
     24        (WebKit::WebPageProxy::receivedPolicyDecision): Ditto.
     25        (WebKit::WebPageProxy::handleDownloadRequest): Ditto.
     26        * UIProcess/WebPageProxy.h: Ditto.
     27        * UIProcess/ios/PageClientImplIOS.h:
     28        * UIProcess/ios/PageClientImplIOS.mm:
     29        (WebKit::PageClientImpl::handleDownloadRequest): Called -[_WKDownload setOriginatingWebView:].
     30        * UIProcess/mac/PageClientImpl.h: Added a m_webView member variable.
     31        * UIProcess/mac/PageClientImpl.mm:
     32        (WebKit::PageClientImpl::PageClientImpl): Asserted that m_webView is nil if WK API isn't enabled.
     33        (WebKit::PageClientImpl::handleDownloadRequest): Called -[_WKDownload setOriginatingWebView:].
     34
    1352014-03-29  Commit Queue  <commit-queue@webkit.org>
    236
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm

    r166382 r166466  
    185185
    186186#if PLATFORM(MAC)
    187     _wkView = [[WKView alloc] initWithFrame:bounds context:context configuration:std::move(webPageConfiguration)];
     187    _wkView = [[WKView alloc] initWithFrame:bounds context:context configuration:std::move(webPageConfiguration) webView:self];
    188188    [self addSubview:_wkView.get()];
    189189    _page = WebKit::toImpl([_wkView pageRef]);
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKDownload.h

    r166318 r166466  
    3030#import <Foundation/Foundation.h>
    3131
     32@class WKWebView;
     33
    3234WK_API_CLASS
    3335@interface _WKDownload : NSObject
     
    3638
    3739@property (nonatomic, readonly) NSURLRequest *request;
     40@property (nonatomic, readonly, weak) WKWebView *originatingWebView;
    3841
    3942@end
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKDownload.mm

    r166318 r166466  
    3030
    3131#import "DownloadProxy.h"
     32#import "WeakObjCPtr.h"
    3233
    3334@implementation _WKDownload {
    3435    API::ObjectStorage<WebKit::DownloadProxy> _download;
     36    WebKit::WeakObjCPtr<WKWebView> _originatingWebView;
    3537}
    3638
     
    5254}
    5355
     56- (WKWebView *)originatingWebView
     57{
     58    return _originatingWebView.getAutoreleased();
     59}
     60
     61- (void)setOriginatingWebView:(WKWebView *)originatingWebView
     62{
     63    _originatingWebView = originatingWebView;
     64}
     65
    5466#pragma mark WKObject protocol implementation
    5567
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/_WKDownloadInternal.h

    r166186 r166466  
    3030#import "WKObject.h"
    3131
    32 @protocol _WKDownloadDelegate;
    33 
    34 namespace API {
    35 class DownloadClient;
    36 }
    37 
    38 namespace WebKit {
    39 std::unique_ptr<API::DownloadClient> createAPIDownloadClient(id <_WKDownloadDelegate>);
    40 }
    41 
    4232@interface _WKDownload () <WKObject>
     33@property (nonatomic, weak) WKWebView *originatingWebView;
    4334@end
    4435
  • trunk/Source/WebKit2/UIProcess/API/mac/WKView.mm

    r166432 r166466  
    33883388}
    33893389
    3390 - (instancetype)initWithFrame:(NSRect)frame context:(WebContext&)context configuration:(WebPageConfiguration)webPageConfiguration
     3390- (instancetype)initWithFrame:(NSRect)frame context:(WebContext&)context configuration:(WebPageConfiguration)webPageConfiguration webView:(WKWebView *)webView
    33913391{
    33923392    self = [super initWithFrame:frame];
     
    34133413
    34143414    _data = [[WKViewData alloc] init];
    3415     _data->_pageClient = std::make_unique<PageClientImpl>(self);
     3415    _data->_pageClient = std::make_unique<PageClientImpl>(self, webView);
    34163416    _data->_page = context.createWebPage(*_data->_pageClient, std::move(webPageConfiguration));
    34173417    _data->_page->setIntrinsicDeviceScaleFactor([self _intrinsicDeviceScaleFactor]);
     
    35063506    webPageConfiguration.relatedPage = toImpl(relatedPage);
    35073507
    3508     return [self initWithFrame:frame context:*toImpl(contextRef) configuration:webPageConfiguration];
     3508    return [self initWithFrame:frame context:*toImpl(contextRef) configuration:webPageConfiguration webView:nil];
    35093509}
    35103510
  • trunk/Source/WebKit2/UIProcess/API/mac/WKViewInternal.h

    r165972 r166466  
    5555
    5656@class WKFullScreenWindowController;
     57@class WKWebView;
    5758#if WK_API_ENABLED
    5859@class _WKThumbnailView;
     
    6162@interface WKView ()
    6263#if WK_API_ENABLED
    63 - (instancetype)initWithFrame:(CGRect)frame context:(WebKit::WebContext&)context configuration:(WebKit::WebPageConfiguration)webPageConfiguration;
     64- (instancetype)initWithFrame:(CGRect)frame context:(WebKit::WebContext&)context configuration:(WebKit::WebPageConfiguration)webPageConfiguration webView:(WKWebView *)webView;
    6465#endif
    6566
  • trunk/Source/WebKit2/UIProcess/Cocoa/DownloadClient.mm

    r166328 r166466  
    7878        return String();
    7979   
    80     BOOL allowOverwrite;
     80    BOOL allowOverwrite = NO;
    8181    NSString *destination = [m_delegate.get() _download:wrapper(*downloadProxy) decideDestinationWithSuggestedFilename:filename allowOverwrite:&allowOverwrite];
    8282    allowOverwriteParam = allowOverwrite;
  • trunk/Source/WebKit2/UIProcess/PageClient.h

    r166384 r166466  
    147147#endif // PLATFORM(EFL) || PLATOFRM(GTK)
    148148
    149 #if PLATFORM(EFL) || PLATFORM(GTK)
    150149    virtual void handleDownloadRequest(DownloadProxy*) = 0;
    151 #endif // PLATFORM(EFL) || PLATFORM(GTK)
    152150
    153151#if PLATFORM(EFL)
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r166421 r166466  
    15311531        DownloadProxy* download = m_process->context().createDownloadProxy();
    15321532        downloadID = download->downloadID();
    1533 #if PLATFORM(EFL) || PLATFORM(GTK)
    1534         // Our design does not suppport downloads without a WebPage.
    15351533        handleDownloadRequest(download);
    1536 #endif
    15371534    }
    15381535
     
    29892986}
    29902987
    2991 #if PLATFORM(EFL) || PLATFORM(GTK)
    29922988void WebPageProxy::handleDownloadRequest(DownloadProxy* download)
    29932989{
    29942990    m_pageClient.handleDownloadRequest(download);
    29952991}
    2996 #endif // PLATFORM(EFL) || PLATFORM(GTK)
    29972992
    29982993#if PLATFORM(EFL)
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r166431 r166466  
    921921#endif
    922922
    923 #if PLATFORM(EFL) || PLATFORM(GTK)
    924923    void handleDownloadRequest(DownloadProxy*);
    925 #endif
    926924
    927925    void advanceToNextMisspelling(bool startBeforeSelection);
  • trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.h

    r166384 r166466  
    4444    {
    4545public:
    46     explicit PageClientImpl(WKContentView *, WKWebView *);
     46    PageClientImpl(WKContentView *, WKWebView *);
    4747    virtual ~PageClientImpl();
    4848   
     
    6666    virtual bool decidePolicyForGeolocationPermissionRequest(WebFrameProxy&, WebSecurityOrigin&, GeolocationPermissionRequestProxy&) override;
    6767    virtual void didCommitLoadForMainFrame(const String& mimeType, bool useCustomContentProvider) override;
     68    virtual void handleDownloadRequest(DownloadProxy*) override;
    6869    virtual void setCursor(const WebCore::Cursor&) override;
    6970    virtual void setCursorHiddenUntilMouseMoves(bool) override;
  • trunk/Source/WebKit2/UIProcess/ios/PageClientImplIOS.mm

    r166384 r166466  
    2929#if PLATFORM(IOS)
    3030
     31#import "_WKDownloadInternal.h"
    3132#import "DataReference.h"
     33#import "DownloadProxy.h"
    3234#import "NativeWebKeyboardEvent.h"
    3335#import "InteractionInformationAtPosition.h"
     
    155157}
    156158
     159void PageClientImpl::handleDownloadRequest(DownloadProxy* download)
     160{
     161    ASSERT_ARG(download, download);
     162    ASSERT([download->wrapper() isKindOfClass:[_WKDownload class]]);
     163    [static_cast<_WKDownload *>(download->wrapper()) setOriginatingWebView:m_webView];
     164}
     165
    157166void PageClientImpl::setCursor(const Cursor&)
    158167{
  • trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.h

    r165356 r166466  
    3636@class WKEditorUndoTargetObjC;
    3737@class WKView;
     38@class WKWebView;
    3839
    3940namespace WebCore {
     
    5051    {
    5152public:
    52     explicit PageClientImpl(WKView *);
     53    PageClientImpl(WKView *, WKWebView *);
    5354    virtual ~PageClientImpl();
    5455   
     
    8283    virtual void didCommitLoadForMainFrame(const String& mimeType, bool useCustomContentProvider) override;
    8384    virtual void didFinishLoadingDataForCustomContentProvider(const String& suggestedFilename, const IPC::DataReference&) override;
     85    virtual void handleDownloadRequest(DownloadProxy*) override;
    8486    virtual void setCursor(const WebCore::Cursor&);
    8587    virtual void setCursorHiddenUntilMouseMoves(bool);
     
    167169
    168170    WKView *m_wkView;
     171    WKWebView *m_webView;
    169172    RetainPtr<WKEditorUndoTargetObjC> m_undoTarget;
    170173#if USE(AUTOCORRECTION_PANEL)
  • trunk/Source/WebKit2/UIProcess/mac/PageClientImpl.mm

    r165758 r166466  
    2929#if PLATFORM(MAC)
    3030
     31#import "_WKDownloadInternal.h"
    3132#import "AttributedString.h"
    3233#import "ColorSpaceData.h"
    3334#import "DataReference.h"
    3435#import "DictionaryPopupInfo.h"
     36#import "DownloadProxy.h"
    3537#import "FindIndicator.h"
    3638#import "NativeWebKeyboardEvent.h"
     
    127129namespace WebKit {
    128130
    129 PageClientImpl::PageClientImpl(WKView* wkView)
     131PageClientImpl::PageClientImpl(WKView* wkView, WKWebView *webView)
    130132    : m_wkView(wkView)
     133    , m_webView(webView)
    131134    , m_undoTarget(adoptNS([[WKEditorUndoTargetObjC alloc] init]))
    132135#if USE(DICTATION_ALTERNATIVES)
     
    134137#endif
    135138{
     139#if !WK_API_ENABLED
     140    ASSERT_UNUSED(m_webView, !m_webView);
     141#endif
    136142}
    137143
     
    292298void PageClientImpl::didFinishLoadingDataForCustomContentProvider(const String& suggestedFilename, const IPC::DataReference& dataReference)
    293299{
     300}
     301
     302void PageClientImpl::handleDownloadRequest(DownloadProxy* download)
     303{
     304    ASSERT_ARG(download, download);
     305#if WK_API_ENABLED
     306    ASSERT([download->wrapper() isKindOfClass:[_WKDownload class]]);
     307    [static_cast<_WKDownload *>(download->wrapper()) setOriginatingWebView:m_webView];
     308#endif
    294309}
    295310
  • trunk/Tools/ChangeLog

    r166463 r166466  
     12014-03-30  Andy Estes  <aestes@apple.com>
     2
     3        [Cocoa] Add an originatingWebView property to _WKDownload
     4        https://bugs.webkit.org/show_bug.cgi?id=130945
     5
     6        Reviewed by Anders Carlsson.
     7
     8        * TestWebKitAPI/Tests/WebKit2Cocoa/Download.mm:
     9        (-[DownloadDelegate _downloadDidStart:]):
     10        (-[OriginatingWebViewDownloadDelegate initWithWebView:]):
     11        (-[OriginatingWebViewDownloadDelegate _downloadDidStart:]):
     12        (TEST):
     13
    1142014-03-28  Filip Pizlo  <fpizlo@apple.com>
    215
  • trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/Download.mm

    r166328 r166466  
    3232#import "Test.h"
    3333#import <WebCore/FileSystem.h>
     34#import <WebKit2/_WKDownload.h>
    3435#import <WebKit2/_WKDownloadDelegate.h>
    3536#import <WebKit2/WKNavigationDelegate.h>
     
    5758    EXPECT_NULL(_download);
    5859    EXPECT_NOT_NULL(download);
     60    EXPECT_TRUE([[[download request] URL] isEqual:sourceURL]);
    5961    _download = download;
    6062}
     
    221223}
    222224
     225@interface OriginatingWebViewDownloadDelegate : NSObject <_WKDownloadDelegate>
     226- (instancetype)initWithWebView:(WKWebView *)webView;
     227@end
     228
     229@implementation OriginatingWebViewDownloadDelegate {
     230    RetainPtr<WKWebView> _webView;
     231}
     232
     233- (instancetype)initWithWebView:(WKWebView *)webView
     234{
     235    if (!(self = [super init]))
     236        return nil;
     237
     238    _webView = webView;
     239    return self;
     240}
     241
     242- (void)_downloadDidStart:(_WKDownload *)download
     243{
     244    @autoreleasepool {
     245        EXPECT_EQ([download originatingWebView], _webView);
     246    }
     247
     248    _webView = nullptr;
     249    EXPECT_NULL([download originatingWebView]);
     250    isDone = true;
     251}
     252
     253@end
     254
     255TEST(_WKDownload, OriginatingWebView)
     256{
     257    RetainPtr<DownloadNavigationDelegate> navigationDelegate = adoptNS([[DownloadNavigationDelegate alloc] init]);                 
     258    RetainPtr<OriginatingWebViewDownloadDelegate> downloadDelegate;
     259    {
     260        RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
     261        [webView setNavigationDelegate:navigationDelegate.get()];
     262        downloadDelegate = adoptNS([[OriginatingWebViewDownloadDelegate alloc] initWithWebView:webView.get()]);
     263        [[[webView configuration] processPool] _setDownloadDelegate:downloadDelegate.get()];
     264        [webView loadRequest:[NSURLRequest requestWithURL:sourceURL]];
     265    }
     266
     267    isDone = false;
     268    TestWebKitAPI::Util::run(&isDone);
     269}
     270
    223271#endif
Note: See TracChangeset for help on using the changeset viewer.