Changeset 207648 in webkit


Ignore:
Timestamp:
Oct 20, 2016 6:15:54 PM (8 years ago)
Author:
Chris Dumez
Message:

"Download Linked File" context menu action should use 'download' attribute as suggested filename
https://bugs.webkit.org/show_bug.cgi?id=163742
<rdar://problem/28840734>

Reviewed by Darin Adler.

Source/WebCore:

Add convenience method to HitTestResult to return the URL element's
download attribute.

  • rendering/HitTestResult.cpp:

(WebCore::HitTestResult::URLElementDownloadAttribute):

  • rendering/HitTestResult.h:

Source/WebKit2:

Update "Download Linked File" context menu action to use the anchor
element's 'download' attribute as suggested filename for the download.

  • NetworkProcess/NetworkProcess.cpp:

(WebKit::NetworkProcess::downloadRequest):

  • NetworkProcess/NetworkProcess.h:
  • NetworkProcess/NetworkProcess.messages.in:
  • Shared/WebHitTestResultData.cpp:

(WebKit::WebHitTestResultData::WebHitTestResultData):
(WebKit::WebHitTestResultData::encode):
(WebKit::WebHitTestResultData::decode):

  • Shared/WebHitTestResultData.h:
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::contextMenuItemSelected):

  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::download):

  • UIProcess/WebProcessPool.h:
  • WebProcess/InjectedBundle/InjectedBundleHitTestResult.cpp:

(WebKit::InjectedBundleHitTestResult::linkSuggestedFilename):

Tools:

Add API test coverage.

  • TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
  • TestWebKitAPI/Tests/WebKit2/link-with-download-attribute.html: Added.
  • TestWebKitAPI/Tests/WebKit2/mac/ContextMenuDownload.mm: Added.

(TestWebKitAPI::didFinishLoadForFrame):
(TestWebKitAPI::getContextMenuFromProposedMenu):
(TestWebKitAPI::decideDestinationWithSuggestedFilename):
(TestWebKitAPI::TEST):

Location:
trunk
Files:
2 added
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r207647 r207648  
     12016-10-20  Chris Dumez  <cdumez@apple.com>
     2
     3        "Download Linked File" context menu action should use 'download' attribute as suggested filename
     4        https://bugs.webkit.org/show_bug.cgi?id=163742
     5        <rdar://problem/28840734>
     6
     7        Reviewed by Darin Adler.
     8
     9        Add convenience method to HitTestResult to return the URL element's
     10        download attribute.
     11
     12        * rendering/HitTestResult.cpp:
     13        (WebCore::HitTestResult::URLElementDownloadAttribute):
     14        * rendering/HitTestResult.h:
     15
    1162016-10-20  Nan Wang  <n_wang@apple.com>
    217
  • trunk/Source/WebCore/rendering/HitTestResult.cpp

    r204543 r207648  
    787787}
    788788
     789const AtomicString& HitTestResult::URLElementDownloadAttribute() const
     790{
     791    auto* urlElement = URLElement();
     792    if (!is<HTMLAnchorElement>(urlElement))
     793        return nullAtom;
     794    return urlElement->attributeWithoutSynchronization(HTMLNames::downloadAttr);
     795}
     796
    789797bool HitTestResult::mediaSupportsEnhancedFullscreen() const
    790798{
  • trunk/Source/WebCore/rendering/HitTestResult.h

    r204717 r207648  
    6666    Scrollbar* scrollbar() const { return m_scrollbar.get(); }
    6767    bool isOverWidget() const { return m_isOverWidget; }
     68
     69    WEBCORE_EXPORT const AtomicString& URLElementDownloadAttribute() const;
    6870
    6971    // Forwarded from HitTestLocation
  • trunk/Source/WebKit2/ChangeLog

    r207642 r207648  
     12016-10-20  Chris Dumez  <cdumez@apple.com>
     2
     3        "Download Linked File" context menu action should use 'download' attribute as suggested filename
     4        https://bugs.webkit.org/show_bug.cgi?id=163742
     5        <rdar://problem/28840734>
     6
     7        Reviewed by Darin Adler.
     8
     9        Update "Download Linked File" context menu action to use the anchor
     10        element's 'download' attribute as suggested filename for the download.
     11
     12        * NetworkProcess/NetworkProcess.cpp:
     13        (WebKit::NetworkProcess::downloadRequest):
     14        * NetworkProcess/NetworkProcess.h:
     15        * NetworkProcess/NetworkProcess.messages.in:
     16        * Shared/WebHitTestResultData.cpp:
     17        (WebKit::WebHitTestResultData::WebHitTestResultData):
     18        (WebKit::WebHitTestResultData::encode):
     19        (WebKit::WebHitTestResultData::decode):
     20        * Shared/WebHitTestResultData.h:
     21        * UIProcess/WebPageProxy.cpp:
     22        (WebKit::WebPageProxy::contextMenuItemSelected):
     23        * UIProcess/WebProcessPool.cpp:
     24        (WebKit::WebProcessPool::download):
     25        * UIProcess/WebProcessPool.h:
     26        * WebProcess/InjectedBundle/InjectedBundleHitTestResult.cpp:
     27        (WebKit::InjectedBundleHitTestResult::linkSuggestedFilename):
     28
    1292016-10-19  Myles C. Maxfield  <mmaxfield@apple.com>
    230
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp

    r207586 r207648  
    460460}
    461461
    462 void NetworkProcess::downloadRequest(SessionID sessionID, DownloadID downloadID, const ResourceRequest& request)
    463 {
    464     downloadManager().startDownload(sessionID, downloadID, request);
     462void NetworkProcess::downloadRequest(SessionID sessionID, DownloadID downloadID, const ResourceRequest& request, const String& suggestedFilename)
     463{
     464    downloadManager().startDownload(sessionID, downloadID, request, suggestedFilename);
    465465}
    466466
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h

    r207530 r207648  
    171171    void clearDiskCache(std::chrono::system_clock::time_point modifiedSince, std::function<void ()> completionHandler);
    172172
    173     void downloadRequest(WebCore::SessionID, DownloadID, const WebCore::ResourceRequest&);
     173    void downloadRequest(WebCore::SessionID, DownloadID, const WebCore::ResourceRequest&, const String& suggestedFilename);
    174174    void resumeDownload(WebCore::SessionID, DownloadID, const IPC::DataReference& resumeData, const String& path, const SandboxExtension::Handle&);
    175175    void cancelDownload(DownloadID);
  • trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in

    r206583 r207648  
    4242    DeleteWebsiteDataForOrigins(WebCore::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, Vector<WebCore::SecurityOriginData> origins, Vector<String> cookieHostNames, uint64_t callbackID)
    4343
    44     DownloadRequest(WebCore::SessionID sessionID, WebKit::DownloadID downloadID, WebCore::ResourceRequest request)
     44    DownloadRequest(WebCore::SessionID sessionID, WebKit::DownloadID downloadID, WebCore::ResourceRequest request, String suggestedFilename)
    4545    ResumeDownload(WebCore::SessionID sessionID, WebKit::DownloadID downloadID, IPC::DataReference resumeData, String path, WebKit::SandboxExtension::Handle sandboxExtensionHandle)
    4646    CancelDownload(WebKit::DownloadID downloadID)
  • trunk/Source/WebKit2/Shared/WebHitTestResultData.cpp

    r204668 r207648  
    4747    , linkLabel(hitTestResult.textContent())
    4848    , linkTitle(hitTestResult.titleDisplayString())
     49    , linkSuggestedFilename(hitTestResult.URLElementDownloadAttribute())
    4950    , isContentEditable(hitTestResult.isContentEditable())
    5051    , elementBoundingBox(elementBoundingBoxInWindowCoordinates(hitTestResult))
     
    6667    , linkLabel(hitTestResult.textContent())
    6768    , linkTitle(hitTestResult.titleDisplayString())
     69    , linkSuggestedFilename(hitTestResult.URLElementDownloadAttribute())
    6870    , isContentEditable(hitTestResult.isContentEditable())
    6971    , elementBoundingBox(elementBoundingBoxInWindowCoordinates(hitTestResult))
     
    101103    encoder << linkLabel;
    102104    encoder << linkTitle;
     105    encoder << linkSuggestedFilename;
    103106    encoder << isContentEditable;
    104107    encoder << elementBoundingBox;
     
    134137        || !decoder.decode(hitTestResultData.linkLabel)
    135138        || !decoder.decode(hitTestResultData.linkTitle)
     139        || !decoder.decode(hitTestResultData.linkSuggestedFilename)
    136140        || !decoder.decode(hitTestResultData.isContentEditable)
    137141        || !decoder.decode(hitTestResultData.elementBoundingBox)
  • trunk/Source/WebKit2/Shared/WebHitTestResultData.h

    r204668 r207648  
    5151    String linkLabel;
    5252    String linkTitle;
     53    String linkSuggestedFilename;
    5354    bool isContentEditable;
    5455    WebCore::IntRect elementBoundingBox;
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r207463 r207648  
    45884588    }
    45894589    if (item.action() == ContextMenuItemTagDownloadLinkToDisk) {
    4590         m_process->processPool().download(this, URL(URL(), m_activeContextMenuContextData.webHitTestResultData().absoluteLinkURL));
     4590        auto& hitTestResult = m_activeContextMenuContextData.webHitTestResultData();
     4591        m_process->processPool().download(this, URL(URL(), hitTestResult.absoluteLinkURL), hitTestResult.linkSuggestedFilename);
    45914592        return;
    45924593    }
  • trunk/Source/WebKit2/UIProcess/WebProcessPool.cpp

    r207346 r207648  
    815815}
    816816
    817 DownloadProxy* WebProcessPool::download(WebPageProxy* initiatingPage, const ResourceRequest& request)
     817DownloadProxy* WebProcessPool::download(WebPageProxy* initiatingPage, const ResourceRequest& request, const String& suggestedFilename)
    818818{
    819819    DownloadProxy* downloadProxy = createDownloadProxy(request);
     
    828828        else
    829829            updatedRequest.setFirstPartyForCookies(URL());
    830         networkProcess()->send(Messages::NetworkProcess::DownloadRequest(sessionID, downloadProxy->downloadID(), updatedRequest), 0);
     830        networkProcess()->send(Messages::NetworkProcess::DownloadRequest(sessionID, downloadProxy->downloadID(), updatedRequest, suggestedFilename), 0);
    831831        return downloadProxy;
    832832    }
  • trunk/Source/WebKit2/UIProcess/WebProcessPool.h

    r207346 r207648  
    167167    const String& injectedBundlePath() const { return m_configuration->injectedBundlePath(); }
    168168
    169     DownloadProxy* download(WebPageProxy* initiatingPage, const WebCore::ResourceRequest&);
     169    DownloadProxy* download(WebPageProxy* initiatingPage, const WebCore::ResourceRequest&, const String& suggestedFilename = { });
    170170    DownloadProxy* resumeDownload(const API::Data* resumeData, const String& path);
    171171
  • trunk/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundleHitTestResult.cpp

    r207579 r207648  
    3535#include <WebCore/FrameLoader.h>
    3636#include <WebCore/FrameView.h>
    37 #include <WebCore/HTMLAnchorElement.h>
    38 #include <WebCore/HTMLNames.h>
    3937#include <WebCore/URL.h>
    4038#include <wtf/text/WTFString.h>
     
    144142String InjectedBundleHitTestResult::linkSuggestedFilename() const
    145143{
    146     auto* urlElement = m_hitTestResult.URLElement();
    147     if (!is<HTMLAnchorElement>(urlElement))
    148         return String();
    149     return urlElement->attributeWithoutSynchronization(HTMLNames::downloadAttr);
     144    return m_hitTestResult.URLElementDownloadAttribute();
    150145}
    151146
  • trunk/Tools/ChangeLog

    r207643 r207648  
     12016-10-20  Chris Dumez  <cdumez@apple.com>
     2
     3        "Download Linked File" context menu action should use 'download' attribute as suggested filename
     4        https://bugs.webkit.org/show_bug.cgi?id=163742
     5        <rdar://problem/28840734>
     6
     7        Reviewed by Darin Adler.
     8
     9        Add API test coverage.
     10
     11        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     12        * TestWebKitAPI/Tests/WebKit2/link-with-download-attribute.html: Added.
     13        * TestWebKitAPI/Tests/WebKit2/mac/ContextMenuDownload.mm: Added.
     14        (TestWebKitAPI::didFinishLoadForFrame):
     15        (TestWebKitAPI::getContextMenuFromProposedMenu):
     16        (TestWebKitAPI::decideDestinationWithSuggestedFilename):
     17        (TestWebKitAPI::TEST):
     18
    1192016-10-20  Commit Queue  <commit-queue@webkit.org>
    220
  • trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r207563 r207648  
    404404                7CEFA9661AC0B9E200B910FD /* _WKUserContentExtensionStore.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CEFA9641AC0B9E200B910FD /* _WKUserContentExtensionStore.mm */; };
    405405                7CFBCAE51743238F00B2BFCF /* WillLoad_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CFBCAE31743238E00B2BFCF /* WillLoad_Bundle.cpp */; };
     406                8349D3C21DB96DDE004A9F65 /* ContextMenuDownload.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8349D3C11DB96DDA004A9F65 /* ContextMenuDownload.mm */; };
     407                8349D3C41DB9728E004A9F65 /* link-with-download-attribute.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 8349D3C31DB9724F004A9F65 /* link-with-download-attribute.html */; };
    406408                835CF9671D25FCD6001A65D4 /* RestoreSessionStateWithoutNavigation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 835CF9661D25FCD6001A65D4 /* RestoreSessionStateWithoutNavigation.cpp */; };
    407409                837A35F11D9A1E7D00663C57 /* DownloadRequestBlobURL.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 837A35F01D9A1E6400663C57 /* DownloadRequestBlobURL.html */; };
     
    563565                        dstSubfolderSpec = 7;
    564566                        files = (
     567                                8349D3C41DB9728E004A9F65 /* link-with-download-attribute.html in Copy Resources */,
    565568                                AD57AC221DA7466E00FF1BDE /* many-iframes.html in Copy Resources */,
    566569                                F415086D1DA040C50044BE9B /* play-audio-on-click.html in Copy Resources */,
     
    10061009                7CFBCAE31743238E00B2BFCF /* WillLoad_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WillLoad_Bundle.cpp; sourceTree = "<group>"; };
    10071010                81B50192140F232300D9EB58 /* StringBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringBuilder.cpp; sourceTree = "<group>"; };
     1011                8349D3C11DB96DDA004A9F65 /* ContextMenuDownload.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ContextMenuDownload.mm; sourceTree = "<group>"; };
     1012                8349D3C31DB9724F004A9F65 /* link-with-download-attribute.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "link-with-download-attribute.html"; sourceTree = "<group>"; };
    10081013                835CF9661D25FCD6001A65D4 /* RestoreSessionStateWithoutNavigation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RestoreSessionStateWithoutNavigation.cpp; sourceTree = "<group>"; };
    10091014                837A35F01D9A1E6400663C57 /* DownloadRequestBlobURL.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = DownloadRequestBlobURL.html; sourceTree = "<group>"; };
     
    18431848                                BCBD372E125ABBE600D2C29F /* icon.png */,
    18441849                                CE3524F51B142BBB0028A7C5 /* input-focus-blur.html */,
     1850                                8349D3C31DB9724F004A9F65 /* link-with-download-attribute.html */,
    18451851                                378E647816326FDF00B6C676 /* link-with-title.html */,
    18461852                                9361002814DC957B0061379D /* lots-of-iframes.html */,
     
    20322038                        isa = PBXGroup;
    20332039                        children = (
     2040                                8349D3C11DB96DDA004A9F65 /* ContextMenuDownload.mm */,
    20342041                                BCAA485714A044D40088FAC4 /* EditorCommands.mm */,
    20352042                                C0C5D3BC14598B6F00A802A6 /* GetBackingScaleFactor.mm */,
     
    24162423                                7C83E0BF1D0A652200FEBCF3 /* IndexedDBPersistence.mm in Sources */,
    24172424                                7CCE7EFB1A411AE600447C4C /* InjectedBundleBasic.cpp in Sources */,
     2425                                8349D3C21DB96DDE004A9F65 /* ContextMenuDownload.mm in Sources */,
    24182426                                7CCE7EFC1A411AE600447C4C /* InjectedBundleFrameHitTest.cpp in Sources */,
    24192427                                7CCE7EFD1A411AE600447C4C /* InjectedBundleInitializationUserDataCallbackWins.cpp in Sources */,
Note: See TracChangeset for help on using the changeset viewer.