Changeset 52619 in webkit


Ignore:
Timestamp:
Dec 29, 2009 5:52:57 AM (14 years ago)
Author:
mjs@apple.com
Message:

2009-12-27 Maciej Stachowiak <mjs@apple.com>

Reviewed by Alexey Proskuryakov.

plugins/get-url-with-iframe-target.html fails on SnowLeopard (64-bit)
https://bugs.webkit.org/show_bug.cgi?id=32982


This test has been failing on SnowLeopard since it was landed.


The problem is that we never delivered the notification for
NPN_GetURLNotify, in the frame-targeting case, for out-of-process
plugins on Mac.


I implemented support for this based on how in-process Mac plugins
do it.

  • Plugins/Hosted/HostedNetscapePluginStream.h:
  • Plugins/Hosted/HostedNetscapePluginStream.mm: (WebKit::HostedNetscapePluginStream::reasonForError):
  • Plugins/Hosted/NetscapePluginInstanceProxy.h:
  • Plugins/Hosted/NetscapePluginInstanceProxy.mm: (WebKit::NetscapePluginInstanceProxy::PluginRequest::create): (WebKit::NetscapePluginInstanceProxy::PluginRequest::PluginRequest): (WebKit::NetscapePluginInstanceProxy::destroy): (WebKit::NetscapePluginInstanceProxy::performRequest): (WebKit::NetscapePluginInstanceProxy::webFrameDidFinishLoadWithReason): (WebKit::NetscapePluginInstanceProxy::requestTimerFired): (WebKit::NetscapePluginInstanceProxy::loadRequest):
  • Plugins/Hosted/WebHostedNetscapePluginView.h:
  • Plugins/Hosted/WebHostedNetscapePluginView.mm: (-[WebHostedNetscapePluginView webFrame:didFinishLoadWithReason:]): (-[WebHostedNetscapePluginView webFrame:didFinishLoadWithError:]):
Location:
trunk/WebKit/mac
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebKit/mac/ChangeLog

    r52507 r52619  
     12009-12-27  Maciej Stachowiak  <mjs@apple.com>
     2
     3        Reviewed by Alexey Proskuryakov.
     4
     5        plugins/get-url-with-iframe-target.html fails on SnowLeopard (64-bit)
     6        https://bugs.webkit.org/show_bug.cgi?id=32982
     7       
     8        This test has been failing on SnowLeopard since it was landed.
     9       
     10        The problem is that we never delivered the notification for
     11        NPN_GetURLNotify, in the frame-targeting case, for out-of-process
     12        plugins on Mac.
     13       
     14        I implemented support for this based on how in-process Mac plugins
     15        do it.
     16
     17        * Plugins/Hosted/HostedNetscapePluginStream.h:
     18        * Plugins/Hosted/HostedNetscapePluginStream.mm:
     19        (WebKit::HostedNetscapePluginStream::reasonForError):
     20        * Plugins/Hosted/NetscapePluginInstanceProxy.h:
     21        * Plugins/Hosted/NetscapePluginInstanceProxy.mm:
     22        (WebKit::NetscapePluginInstanceProxy::PluginRequest::create):
     23        (WebKit::NetscapePluginInstanceProxy::PluginRequest::PluginRequest):
     24        (WebKit::NetscapePluginInstanceProxy::destroy):
     25        (WebKit::NetscapePluginInstanceProxy::performRequest):
     26        (WebKit::NetscapePluginInstanceProxy::webFrameDidFinishLoadWithReason):
     27        (WebKit::NetscapePluginInstanceProxy::requestTimerFired):
     28        (WebKit::NetscapePluginInstanceProxy::loadRequest):
     29        * Plugins/Hosted/WebHostedNetscapePluginView.h:
     30        * Plugins/Hosted/WebHostedNetscapePluginView.mm:
     31        (-[WebHostedNetscapePluginView webFrame:didFinishLoadWithReason:]):
     32        (-[WebHostedNetscapePluginView webFrame:didFinishLoadWithError:]):
     33
    1342009-12-22  Darin Adler  <darin@apple.com>
    235
  • trunk/WebKit/mac/Plugins/Hosted/HostedNetscapePluginStream.h

    r47551 r52619  
    7171    void cancelLoad(NPReason reason);
    7272
     73    static NPReason reasonForError(NSError* error);
     74
    7375private:
    7476    NSError *errorForReason(NPReason) const;
  • trunk/WebKit/mac/Plugins/Hosted/HostedNetscapePluginStream.mm

    r49212 r52619  
    184184}
    185185
    186 static NPReason reasonForError(NSError *error)
     186NPReason HostedNetscapePluginStream::reasonForError(NSError *error)
    187187{
    188188    if (!error)
  • trunk/WebKit/mac/Plugins/Hosted/NetscapePluginInstanceProxy.h

    r49512 r52619  
    5050}
    5151@class WebHostedNetscapePluginView;
     52@class WebFrame;
    5253
    5354namespace WebKit {
     
    5556class HostedNetscapePluginStream;
    5657class NetscapePluginHostProxy;
     58class PluginRequest;
    5759class ProxyInstance;
    5860   
     
    258260    }
    259261   
     262    void webFrameDidFinishLoadWithReason(WebFrame*, NPReason);
     263
    260264private:
    261     NetscapePluginInstanceProxy(NetscapePluginHostProxy*, WebHostedNetscapePluginView *, bool fullFramePlugin);
    262 
    263     NPError loadRequest(NSURLRequest *, const char* cTarget, bool currentEventIsUserGesture, uint32_t& streamID);
     265    NetscapePluginInstanceProxy(NetscapePluginHostProxy*, WebHostedNetscapePluginView*, bool fullFramePlugin);
     266
     267    NPError loadRequest(NSURLRequest*, const char* cTarget, bool currentEventIsUserGesture, uint32_t& streamID);
    264268   
    265269    class PluginRequest;
     
    275279    void requestTimerFired(WebCore::Timer<NetscapePluginInstanceProxy>*);
    276280    WebCore::Timer<NetscapePluginInstanceProxy> m_requestTimer;
    277     Deque<PluginRequest*> m_pluginRequests;
     281    Deque<RefPtr<PluginRequest> > m_pluginRequests;
    278282   
    279283    HashMap<uint32_t, RefPtr<HostedNetscapePluginStream> > m_streams;
     
    314318   
    315319    RefPtr<HostedNetscapePluginStream> m_manualStream;
     320
     321    typedef HashMap<WebFrame*, RefPtr<PluginRequest> > FrameLoadMap;
     322    FrameLoadMap m_pendingFrameLoads;
    316323};
    317324   
  • trunk/WebKit/mac/Plugins/Hosted/NetscapePluginInstanceProxy.mm

    r49965 r52619  
    7373namespace WebKit {
    7474
    75 class NetscapePluginInstanceProxy::PluginRequest {
     75class NetscapePluginInstanceProxy::PluginRequest : public RefCounted<NetscapePluginInstanceProxy::PluginRequest> {
    7676public:
    77     PluginRequest(uint32_t requestID, NSURLRequest *request, NSString *frameName, bool allowPopups)
     77    static PassRefPtr<PluginRequest> create(uint32_t requestID, NSURLRequest* request, NSString* frameName, bool allowPopups)
     78    {
     79        return adoptRef(new PluginRequest(requestID, request, frameName, allowPopups));
     80    }
     81
     82    uint32_t requestID() const { return m_requestID; }
     83    NSURLRequest* request() const { return m_request.get(); }
     84    NSString* frameName() const { return m_frameName.get(); }
     85    bool allowPopups() const { return m_allowPopups; }
     86   
     87private:
     88    PluginRequest(uint32_t requestID, NSURLRequest* request, NSString* frameName, bool allowPopups)
    7889        : m_requestID(requestID)
    7990        , m_request(request)
     
    8394    }
    8495   
    85     uint32_t requestID() const { return m_requestID; }
    86     NSURLRequest *request() const { return m_request.get(); }
    87     NSString *frameName() const { return m_frameName.get(); }
    88     bool allowPopups() const { return m_allowPopups; }
    89    
    90 private:
    9196    uint32_t m_requestID;
    92     RetainPtr<NSURLRequest *> m_request;
    93     RetainPtr<NSString *> m_frameName;
     97    RetainPtr<NSURLRequest*> m_request;
     98    RetainPtr<NSString*> m_frameName;
    9499    bool m_allowPopups;
    95100};
     
    213218    m_inDestroy = true;
    214219   
     220    FrameLoadMap::iterator end = m_pendingFrameLoads.end();
     221    for (FrameLoadMap::iterator it = m_pendingFrameLoads.begin(); it != end; ++it)
     222        [(it->first) _setInternalLoadDelegate:nil];
     223
    215224    _WKPHDestroyPluginInstance(m_pluginHostProxy->port(), m_pluginID, requestID);
    216225 
     
    518527        ASSERT(!frame || [m_pluginView webFrame] == frame);
    519528        evaluateJavaScript(pluginRequest);
    520     } else
     529    } else {
    521530        [frame loadRequest:request];
     531
     532        // Check if another plug-in view or even this view is waiting for the frame to load.
     533        // If it is, tell it that the load was cancelled because it will be anyway.
     534        WebHostedNetscapePluginView *view = [frame _internalLoadDelegate];
     535        if (view != nil) {
     536            ASSERT([view isKindOfClass:[WebHostedNetscapePluginView class]]);
     537            [view webFrame:frame didFinishLoadWithReason:NPRES_USER_BREAK];
     538        }
     539        m_pendingFrameLoads.set(frame, pluginRequest);
     540        [frame _setInternalLoadDelegate:m_pluginView];
     541    }
     542
     543}
     544
     545void NetscapePluginInstanceProxy::webFrameDidFinishLoadWithReason(WebFrame* webFrame, NPReason reason)
     546{
     547    FrameLoadMap::iterator it = m_pendingFrameLoads.find(webFrame);
     548    ASSERT(it != m_pendingFrameLoads.end());
     549       
     550    PluginRequest* pluginRequest = it->second.get();
     551    _WKPHLoadURLNotify(m_pluginHostProxy->port(), m_pluginID, pluginRequest->requestID(), reason);
     552 
     553    m_pendingFrameLoads.remove(it);
     554
     555    [webFrame _setInternalLoadDelegate:nil];
    522556}
    523557
     
    558592    ASSERT(m_pluginView);
    559593   
    560     PluginRequest* request = m_pluginRequests.first();
     594    RefPtr<PluginRequest> request = m_pluginRequests.first();
    561595    m_pluginRequests.removeFirst();
    562596   
     
    564598        m_requestTimer.startOneShot(0);
    565599   
    566     performRequest(request);
    567     delete request;
     600    performRequest(request.get());
    568601}
    569602   
     
    617650        }
    618651
    619         PluginRequest* pluginRequest = new PluginRequest(requestID, request, target, allowPopups);
    620         m_pluginRequests.append(pluginRequest);
     652        RefPtr<PluginRequest> pluginRequest = PluginRequest::create(requestID, request, target, allowPopups);
     653        m_pluginRequests.append(pluginRequest.release());
    621654        m_requestTimer.startOneShot(0);
    622655    } else {
  • trunk/WebKit/mac/Plugins/Hosted/WebHostedNetscapePluginView.h

    r45678 r52619  
    6060
    6161- (void)pluginHostDied;
     62
     63- (void)webFrame:(WebFrame *)webFrame didFinishLoadWithReason:(NPReason)reason;
     64
    6265@end
    6366
  • trunk/WebKit/mac/Plugins/Hosted/WebHostedNetscapePluginView.mm

    r49806 r52619  
    442442}
    443443
     444- (void)webFrame:(WebFrame *)webFrame didFinishLoadWithReason:(NPReason)reason
     445{
     446    if (_isStarted && _proxy)
     447        _proxy->webFrameDidFinishLoadWithReason(webFrame, reason);
     448}
     449
     450- (void)webFrame:(WebFrame *)webFrame didFinishLoadWithError:(NSError *)error
     451{
     452    NPReason reason = NPRES_DONE;
     453    if (error)
     454        reason = HostedNetscapePluginStream::reasonForError(error);
     455    [self webFrame:webFrame didFinishLoadWithReason:reason];
     456}
     457
    444458@end
    445459
Note: See TracChangeset for help on using the changeset viewer.