Changeset 85783 in webkit


Ignore:
Timestamp:
May 4, 2011 1:33:52 PM (13 years ago)
Author:
andersca@apple.com
Message:

2011-05-04 Anders Carlsson <andersca@apple.com>

Reviewed by Dan Bernstein.

Can't save a link from "Save Linked File to Download" popup menu
https://bugs.webkit.org/show_bug.cgi?id=60190
<rdar://problem/9367927>

Make sure that suggestedFilenameForResourceWithURL and resourceDataForFrame both look
in the cache if the resource can't be found in the current web page. This matches WebKit1.

  • WebProcess/WebPage/WebFrame.cpp: (WebKit::WebFrame::suggestedFilenameForResourceWithURL): Call WebPage::cachedSuggestedFilenameForURL if we can't find a resource in the page.
  • WebProcess/WebPage/WebPage.cpp: (WebKit::resourceDataForFrame): Move code out from getResourceDataFromFrame.

(WebKit::WebPage::getResourceDataFromFrame):
Call resourceDataForFrame first and then cachedResponseDataForURL.

  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/gtk/WebPageGtk.cpp: (WebKit::WebPage::platformHasLocalDataForURL): (WebKit::WebPage::cachedResponseMIMETypeForURL): (WebKit::WebPage::platformCanHandleRequest): (WebKit::WebPage::cachedSuggestedFilenameForURL): (WebKit::WebPage::cachedResponseDataForURL): Add stubs.
  • WebProcess/WebPage/mac/WebPageMac.mm: (WebKit::cachedResponseForURL): Add helper function.

(WebKit::WebPage::cachedSuggestedFilenameForURL):
(WebKit::WebPage::cachedResponseMIMETypeForURL):
(WebKit::WebPage::cachedResponseDataForURL):
Call helper function.

  • WebProcess/WebPage/qt/WebPageQt.cpp: (WebKit::WebPage::platformHasLocalDataForURL): (WebKit::WebPage::cachedResponseMIMETypeForURL): (WebKit::WebPage::platformCanHandleRequest): (WebKit::WebPage::cachedSuggestedFilenameForURL): (WebKit::WebPage::cachedResponseDataForURL): Add stubs.


  • WebProcess/WebPage/win/WebPageWin.cpp: (WebKit::cachedResponseForURL): Add helper function.

(WebKit::WebPage::platformHasLocalDataForURL):
(WebKit::WebPage::cachedResponseMIMETypeForURL):
(WebKit::WebPage::cachedSuggestedFilenameForURL):
(WebKit::WebPage::cachedResponseDataForURL):
Call helper function.

Location:
trunk/Source/WebKit2
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r85780 r85783  
     12011-05-04  Anders Carlsson  <andersca@apple.com>
     2
     3        Reviewed by Dan Bernstein.
     4
     5        Can't save a link from "Save Linked File to Download" popup menu
     6        https://bugs.webkit.org/show_bug.cgi?id=60190
     7        <rdar://problem/9367927>
     8
     9        Make sure that suggestedFilenameForResourceWithURL and resourceDataForFrame both look
     10        in the cache if the resource can't be found in the current web page. This matches WebKit1.
     11
     12        * WebProcess/WebPage/WebFrame.cpp:
     13        (WebKit::WebFrame::suggestedFilenameForResourceWithURL):
     14        Call WebPage::cachedSuggestedFilenameForURL if we can't find a resource in the page.
     15
     16        * WebProcess/WebPage/WebPage.cpp:
     17        (WebKit::resourceDataForFrame):
     18        Move code out from getResourceDataFromFrame.
     19
     20        (WebKit::WebPage::getResourceDataFromFrame):
     21        Call resourceDataForFrame first and then cachedResponseDataForURL.
     22
     23        * WebProcess/WebPage/WebPage.h:
     24        * WebProcess/WebPage/gtk/WebPageGtk.cpp:
     25        (WebKit::WebPage::platformHasLocalDataForURL):
     26        (WebKit::WebPage::cachedResponseMIMETypeForURL):
     27        (WebKit::WebPage::platformCanHandleRequest):
     28        (WebKit::WebPage::cachedSuggestedFilenameForURL):
     29        (WebKit::WebPage::cachedResponseDataForURL):
     30        Add stubs.
     31
     32        * WebProcess/WebPage/mac/WebPageMac.mm:
     33        (WebKit::cachedResponseForURL):
     34        Add helper function.
     35
     36        (WebKit::WebPage::cachedSuggestedFilenameForURL):
     37        (WebKit::WebPage::cachedResponseMIMETypeForURL):
     38        (WebKit::WebPage::cachedResponseDataForURL):
     39        Call helper function.
     40
     41        * WebProcess/WebPage/qt/WebPageQt.cpp:
     42        (WebKit::WebPage::platformHasLocalDataForURL):
     43        (WebKit::WebPage::cachedResponseMIMETypeForURL):
     44        (WebKit::WebPage::platformCanHandleRequest):
     45        (WebKit::WebPage::cachedSuggestedFilenameForURL):
     46        (WebKit::WebPage::cachedResponseDataForURL):
     47        Add stubs.
     48       
     49        * WebProcess/WebPage/win/WebPageWin.cpp:
     50        (WebKit::cachedResponseForURL):
     51        Add helper function.
     52
     53        (WebKit::WebPage::platformHasLocalDataForURL):
     54        (WebKit::WebPage::cachedResponseMIMETypeForURL):
     55        (WebKit::WebPage::cachedSuggestedFilenameForURL):
     56        (WebKit::WebPage::cachedResponseDataForURL):
     57        Call helper function.
     58
    1592011-05-04  Simon Fraser  <simon.fraser@apple.com>
    260
  • trunk/Source/WebKit2/WebProcess/WebPage/WebFrame.cpp

    r85484 r85783  
    641641    // Next, try subresources.
    642642    RefPtr<ArchiveResource> resource = loader->subresource(url);
    643     if (!resource)
    644         return String();
    645    
    646     return resource->response().suggestedFilename();
     643    if (resource)
     644        return resource->response().suggestedFilename();
     645
     646    return page()->cachedSuggestedFilenameForURL(url);
    647647}
    648648
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp

    r85689 r85783  
    13871387}
    13881388
    1389 void WebPage::getResourceDataFromFrame(uint64_t frameID, const String& resourceURL, uint64_t callbackID)
     1389static PassRefPtr<SharedBuffer> resourceDataForFrame(Frame* frame, const KURL& resourceURL)
     1390{
     1391    DocumentLoader* loader = frame->loader()->documentLoader();
     1392    if (!loader)
     1393        return 0;
     1394
     1395    RefPtr<ArchiveResource> subresource = loader->subresource(resourceURL);
     1396    if (!subresource)
     1397        return 0;
     1398
     1399    return subresource->data();
     1400}
     1401
     1402void WebPage::getResourceDataFromFrame(uint64_t frameID, const String& resourceURLString, uint64_t callbackID)
    13901403{
    13911404    CoreIPC::DataReference dataReference;
     1405    KURL resourceURL(KURL(), resourceURLString);
    13921406
    13931407    RefPtr<SharedBuffer> buffer;
    13941408    if (WebFrame* frame = WebProcess::shared().webFrame(frameID)) {
    1395         if (DocumentLoader* loader = frame->coreFrame()->loader()->documentLoader()) {
    1396             if (RefPtr<ArchiveResource> subresource = loader->subresource(KURL(KURL(), resourceURL))) {
    1397                 if ((buffer = subresource->data()))
    1398                     dataReference = CoreIPC::DataReference(reinterpret_cast<const uint8_t*>(buffer->data()), buffer->size());
    1399             }
     1409        buffer = resourceDataForFrame(frame->coreFrame(), resourceURL);
     1410        if (!buffer) {
     1411            // Try to get the resource data from the cache.
     1412            buffer = cachedResponseDataForURL(resourceURL);
    14001413        }
     1414
     1415        if (buffer)
     1416            dataReference = CoreIPC::DataReference(reinterpret_cast<const uint8_t*>(buffer->data()), buffer->size());
    14011417    }
    14021418
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h

    r85356 r85783  
    292292    bool hasLocalDataForURL(const WebCore::KURL&);
    293293    String cachedResponseMIMETypeForURL(const WebCore::KURL&);
    294    
     294    String cachedSuggestedFilenameForURL(const WebCore::KURL&);
     295    PassRefPtr<WebCore::SharedBuffer> cachedResponseDataForURL(const WebCore::KURL&);
     296
    295297    static bool canHandleRequest(const WebCore::ResourceRequest&);
    296298
  • trunk/Source/WebKit2/WebProcess/WebPage/gtk/WebPageGtk.cpp

    r82929 r85783  
    104104}
    105105
    106 bool WebPage::platformHasLocalDataForURL(const WebCore::KURL&)
     106bool WebPage::platformHasLocalDataForURL(const KURL&)
    107107{
    108     // FIXME: Implement
    109108    notImplemented();
    110109    return false;
    111110}
    112111
    113 String WebPage::cachedResponseMIMETypeForURL(const WebCore::KURL&)
     112String WebPage::cachedResponseMIMETypeForURL(const KURL&)
    114113{
    115     // FIXME: Implement
     114    notImplemented();
    116115    return String();
    117116}
    118117
    119 bool WebPage::platformCanHandleRequest(const WebCore::ResourceRequest&)
     118bool WebPage::platformCanHandleRequest(const ResourceRequest&)
    120119{
    121     // FIXME: Implement
     120    notImplemented();
    122121    return true;
    123122}
    124123
     124String WebPage::cachedSuggestedFilenameForURL(const KURL&)
     125{
     126    notImplemented();
     127    return String();
     128}
     129
     130PassRefPtr<SharedBuffer> WebPage::cachedResponseDataForURL(const KURL&)
     131{
     132    notImplemented();
     133    return 0;
     134}
     135
    125136} // namespace WebKit
  • trunk/Source/WebKit2/WebProcess/WebPage/mac/WebPageMac.mm

    r85366 r85783  
    634634}
    635635
    636 String WebPage::cachedResponseMIMETypeForURL(const WebCore::KURL& url)
    637 {
    638     NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url];
    639     [request setValue:(NSString*)userAgent() forHTTPHeaderField:@"User-Agent"];
    640     NSCachedURLResponse *cachedResponse;
     636static NSCachedURLResponse *cachedResponseForURL(WebPage* webPage, const KURL& url)
     637{
     638    RetainPtr<NSMutableURLRequest> request(AdoptNS, [[NSMutableURLRequest alloc] initWithURL:url]);
     639    [request.get() setValue:(NSString *)webPage->userAgent() forHTTPHeaderField:@"User-Agent"];
     640
    641641#if USE(CFURLSTORAGESESSIONS)
    642642    if (CFURLStorageSessionRef storageSession = ResourceHandle::privateBrowsingStorageSession())
    643         cachedResponse = WKCachedResponseForRequest(storageSession, request);
    644     else
     643        return WKCachedResponseForRequest(storageSession, request.get());
    645644#endif
    646         cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
    647     [request release];
    648    
    649     return [[cachedResponse response] MIMEType];
     645
     646    return [[NSURLCache sharedURLCache] cachedResponseForRequest:request.get()];
     647}
     648
     649String WebPage::cachedSuggestedFilenameForURL(const KURL& url)
     650{
     651    return [[cachedResponseForURL(this, url) response] suggestedFilename];
     652}
     653
     654String WebPage::cachedResponseMIMETypeForURL(const KURL& url)
     655{
     656    return [[cachedResponseForURL(this, url) response] MIMEType];
     657}
     658
     659PassRefPtr<SharedBuffer> WebPage::cachedResponseDataForURL(const KURL& url)
     660{
     661    return SharedBuffer::wrapNSData([cachedResponseForURL(this, url) data]);
    650662}
    651663
  • trunk/Source/WebKit2/WebProcess/WebPage/qt/WebPageQt.cpp

    r81105 r85783  
    2828#include "WebPage.h"
    2929
     30#include "NotImplemented.h"
    3031#include "WebEvent.h"
    3132#include <WebCore/FocusController.h>
     
    266267}
    267268
    268 bool WebPage::platformHasLocalDataForURL(const WebCore::KURL&)
    269 {
    270     // FIXME: Implement
     269bool WebPage::platformHasLocalDataForURL(const KURL&)
     270{
     271    notImplemented();
    271272    return false;
    272273}
    273274
    274 String WebPage::cachedResponseMIMETypeForURL(const WebCore::KURL&)
    275 {
    276     // FIXME: Implement
     275String WebPage::cachedResponseMIMETypeForURL(const KURL&)
     276{
     277    notImplemented();
    277278    return String();
    278279}
    279280
    280 bool WebPage::platformCanHandleRequest(const WebCore::ResourceRequest&)
    281 {
    282     // FIXME: Implement
     281bool WebPage::platformCanHandleRequest(const ResourceRequest&)
     282{
     283    notImplemented();
    283284    return true;
    284285}
    285286
     287String WebPage::cachedSuggestedFilenameForURL(const KURL&)
     288{
     289    notImplemented();
     290    return String();
     291}
     292
     293PassRefPtr<SharedBuffer> WebPage::cachedResponseDataForURL(const KURL&)
     294{
     295    notImplemented();
     296    return 0;
     297}
     298
    286299} // namespace WebKit
  • trunk/Source/WebKit2/WebProcess/WebPage/win/WebPageWin.cpp

    r84101 r85783  
    261261}
    262262
    263 bool WebPage::platformHasLocalDataForURL(const WebCore::KURL& url)
    264 {
    265 #if USE(CFNETWORK)
     263#if USE(CFNETWORK)
     264static RetainPtr<CFCachedURLResponseRef> cachedResponseForURL(WebPage* webPage, const KURL& url)
     265{
    266266    RetainPtr<CFURLRef> cfURL(AdoptCF, url.createCFURL());
    267267    RetainPtr<CFMutableURLRequestRef> request(AdoptCF, CFURLRequestCreateMutable(0, cfURL.get(), kCFURLRequestCachePolicyReloadIgnoringCache, 60, 0));
    268    
    269     RetainPtr<CFStringRef> userAgent(AdoptCF, userAgent().createCFString());
     268
     269    RetainPtr<CFStringRef> userAgent(AdoptCF, webPage->userAgent().createCFString());
    270270    CFURLRequestSetHTTPHeaderFieldValue(request.get(), CFSTR("User-Agent"), userAgent.get());
    271271
     
    278278        cache.adoptCF(CFURLCacheCopySharedURLCache());
    279279
    280     RetainPtr<CFCachedURLResponseRef> response(AdoptCF, CFURLCacheCopyResponseForRequest(cache.get(), request.get()));   
    281     return response;
     280    RetainPtr<CFCachedURLResponseRef> response(AdoptCF, CFURLCacheCopyResponseForRequest(cache.get(), request.get()));
     281    return response;       
     282}
     283#endif
     284
     285bool WebPage::platformHasLocalDataForURL(const KURL& url)
     286{
     287#if USE(CFNETWORK)
     288    return cachedResponseForURL(this, url);
    282289#else
    283290    return false;
     
    285292}
    286293
    287 String WebPage::cachedResponseMIMETypeForURL(const WebCore::KURL& url)
    288 {
    289 #if USE(CFNETWORK)
    290     RetainPtr<CFURLRef> cfURL(AdoptCF, url.createCFURL());
    291     RetainPtr<CFMutableURLRequestRef> request(AdoptCF, CFURLRequestCreateMutable(0, cfURL.get(), kCFURLRequestCachePolicyReloadIgnoringCache, 60, 0));
    292    
    293     RetainPtr<CFStringRef> userAgent(AdoptCF, userAgent().createCFString());
    294     CFURLRequestSetHTTPHeaderFieldValue(request.get(), CFSTR("User-Agent"), userAgent.get());
    295 
    296     RetainPtr<CFURLCacheRef> cache;
    297 #if USE(CFURLSTORAGESESSIONS)
    298     if (CFURLStorageSessionRef storageSession = ResourceHandle::privateBrowsingStorageSession())
    299         cache.adoptCF(wkCopyURLCache(storageSession));
    300     else
    301 #endif
    302         cache.adoptCF(CFURLCacheCopySharedURLCache());
    303 
    304     RetainPtr<CFCachedURLResponseRef> cachedResponse(AdoptCF, CFURLCacheCopyResponseForRequest(cache.get(), request.get()));
    305    
     294String WebPage::cachedResponseMIMETypeForURL(const KURL& url)
     295{
     296#if USE(CFNETWORK)
     297    RetainPtr<CFCachedURLResponseRef> cachedResponse = cachedResponseForURL(this, url);
    306298    CFURLResponseRef response = CFCachedURLResponseGetWrappedResponse(cachedResponse.get());
    307    
    308299    return response ? CFURLResponseGetMIMEType(response) : String();
    309300#else
    310301    return String();
    311302#endif
     303}
     304
     305String WebPage::cachedSuggestedFilenameForURL(const KURL& url)
     306{
     307#if USE(CFNETWORK)
     308    RetainPtr<CFCachedURLResponseRef> cachedResponse = cachedResponseForURL(this, url);
     309    CFURLResponseRef response = CFCachedURLResponseGetWrappedResponse(cachedResponse.get());
     310    if (!response)
     311        return String();
     312    RetainPtr<CFStringRef> suggestedFilename(AdoptCF, CFURLResponseCopySuggestedFilename(response));
     313
     314    return suggestedFilename.get();
     315#else
     316    return String();
     317#endif
     318}
     319
     320PassRefPtr<SharedBuffer> WebPage::cachedResponseDataForURL(const KURL& url)
     321{
     322    RetainPtr<CFCachedURLResponseRef> cachedResponse = cachedResponseForURL(this, url);
     323    CFDataRef data = CFCachedURLResponseGetReceiverData(cachedResponse.get());
     324    if (!data)
     325        return 0;
     326
     327    return SharedBuffer::wrapCFData(data);
    312328}
    313329
Note: See TracChangeset for help on using the changeset viewer.