⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 244557 in webkit


Ignore:
Timestamp:
Apr 23, 2019, 1:18:05 PM (7 years ago)
Author:
commit-queue@webkit.org
Message:

Multiple File Input Icon Set Regardless of File List
https://bugs.webkit.org/show_bug.cgi?id=195537

Source/WebCore:

Patch by Guy Lewin <guy@lewin.co.il> on 2019-04-23
Reviewed by Alexey Proskuryakov.

File input elements display icon with an empty file list after
resetting the file list in 'change' event handler - on iOS

Test: fast/forms/file/file-reset-in-change-using-open-panel-with-icon.html

  • html/FileInputType.cpp:

(WebCore::FileInputType::filesChosen):

Source/WebKit:

Patch by Guy Lewin <guy@lewin.co.il> on 2019-04-23
Reviewed by Alexey Proskuryakov.

Add WKOpenPanelResultListenerChooseMediaFiles() to choose files with
icon and display string on iOS file open panels

  • UIProcess/API/C/WKOpenPanelResultListener.cpp:

(WKOpenPanelResultListenerChooseMediaFiles):

  • UIProcess/API/C/WKOpenPanelResultListener.h:

Tools:

Patch by Guy Lewin <guy@lewin.co.il> on 2019-04-23
Reviewed by Alexey Proskuryakov.

Add setOpenPanelFilesMediaIcon to TestRunner in order to test icon and
display string in iOS file inputs

  • DumpRenderTree/TestRunner.cpp:

(SetOpenPanelFilesMediaIconCallback):
(TestRunner::staticFunctions):
(TestRunner::setOpenPanelFilesMediaIcon):

  • DumpRenderTree/TestRunner.h:

(TestRunner::openPanelFilesMediaIcon const):

  • DumpRenderTree/mac/UIDelegate.mm:

(-[UIDelegate webView:runOpenPanelForFileButtonWithResultListener:allowMultipleFiles:]):

  • WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
  • WebKitTestRunner/InjectedBundle/TestRunner.cpp:

(WTR::TestRunner::setOpenPanelFilesMediaIcon):

  • WebKitTestRunner/InjectedBundle/TestRunner.h:
  • WebKitTestRunner/TestController.cpp:

(WTR::runOpenPanel):
(WTR::TestController::resetStateToConsistentValues):

  • WebKitTestRunner/TestController.h:

(WTR::TestController::openPanelFileURLsMediaIcon const):
(WTR::TestController::setOpenPanelFileURLsMediaIcon):

  • WebKitTestRunner/TestInvocation.cpp:

(WTR::TestInvocation::didReceiveMessageFromInjectedBundle):

LayoutTests:

Add a layout test to verify file input icon resets on change event (iOS)
Change expectations according to
file-reset-in-change-using-open-panel.html

Patch by Guy Lewin <guy@lewin.co.il> on 2019-04-23
Reviewed by Alexey Proskuryakov.

  • fast/forms/file/file-reset-in-change-using-open-panel-with-icon-expected.html: Added.
  • fast/forms/file/file-reset-in-change-using-open-panel-with-icon.html: Added.
  • platform/win/TestExpectations:
  • platform/wincairo/TestExpectations:
Location:
trunk
Files:
2 added
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r244552 r244557  
     12019-04-23  Guy Lewin  <guy@lewin.co.il>
     2
     3        Multiple File Input Icon Set Regardless of File List
     4        https://bugs.webkit.org/show_bug.cgi?id=195537
     5
     6        Add a layout test to verify file input icon resets on change event (iOS)
     7        Change expectations according to
     8        file-reset-in-change-using-open-panel.html
     9
     10        Reviewed by Alexey Proskuryakov.
     11
     12        * fast/forms/file/file-reset-in-change-using-open-panel-with-icon-expected.html: Added.
     13        * fast/forms/file/file-reset-in-change-using-open-panel-with-icon.html: Added.
     14        * platform/win/TestExpectations:
     15        * platform/wincairo/TestExpectations:
     16
    1172019-04-23  Devin Rousso  <drousso@apple.com>
    218
  • trunk/LayoutTests/platform/win/TestExpectations

    r244428 r244557  
    36343634fast/forms/file/file-input-reset-using-open-panel.html [ Skip ]
    36353635fast/forms/file/file-reset-in-change-using-open-panel.html [ Skip ]
     3636fast/forms/file/file-reset-in-change-using-open-panel-with-icon.html [ Skip ]
    36363637fast/forms/file/get-file-upload-using-open-panel.html [ Skip ]
    36373638fast/forms/file/input-file-value-using-open-panel.html [ Skip ]
  • trunk/LayoutTests/platform/wincairo/TestExpectations

    r244420 r244557  
    775775fast/forms/file/entries-api/webkitdirectory-open-panel.html [ Timeout ]
    776776fast/forms/file/file-reset-in-change-using-open-panel.html [ Timeout ]
     777fast/forms/file/file-reset-in-change-using-open-panel-with-icon.html [ Timeout ]
    777778fast/forms/file/get-file-upload-using-open-panel.html [ Timeout ]
    778779fast/forms/file/input-file-value-using-open-panel.html [ Timeout ]
  • trunk/Source/WebCore/ChangeLog

    r244556 r244557  
     12019-04-23  Guy Lewin  <guy@lewin.co.il>
     2
     3        Multiple File Input Icon Set Regardless of File List
     4        https://bugs.webkit.org/show_bug.cgi?id=195537
     5
     6        Reviewed by Alexey Proskuryakov.
     7
     8        File input elements display icon with an empty file list after
     9        resetting the file list in 'change' event handler - on iOS
     10
     11        Test: fast/forms/file/file-reset-in-change-using-open-panel-with-icon.html
     12
     13        * html/FileInputType.cpp:
     14        (WebCore::FileInputType::filesChosen):
     15
    1162019-04-23  Eric Carlson  <eric.carlson@apple.com>
    217
  • trunk/Source/WebCore/html/FileInputType.cpp

    r240437 r244557  
    420420    });
    421421
    422     if (icon)
     422    if (icon && !m_fileList->isEmpty())
    423423        iconLoaded(icon);
    424424}
  • trunk/Source/WebKit/ChangeLog

    r244556 r244557  
     12019-04-23  Guy Lewin  <guy@lewin.co.il>
     2
     3        Multiple File Input Icon Set Regardless of File List
     4        https://bugs.webkit.org/show_bug.cgi?id=195537
     5
     6        Reviewed by Alexey Proskuryakov.
     7
     8        Add WKOpenPanelResultListenerChooseMediaFiles() to choose files with
     9        icon and display string on iOS file open panels
     10
     11        * UIProcess/API/C/WKOpenPanelResultListener.cpp:
     12        (WKOpenPanelResultListenerChooseMediaFiles):
     13        * UIProcess/API/C/WKOpenPanelResultListener.h:
     14
    1152019-04-23  Eric Carlson  <eric.carlson@apple.com>
    216
  • trunk/Source/WebKit/UIProcess/API/C/WKOpenPanelResultListener.cpp

    r238771 r244557  
    2828
    2929#include "APIArray.h"
     30#include "APIData.h"
     31#include "APIString.h"
    3032#include "WKAPICast.h"
    3133#include "WebOpenPanelResultListenerProxy.h"
     
    5557}
    5658
     59#if PLATFORM(IOS_FAMILY)
     60void WKOpenPanelResultListenerChooseMediaFiles(WKOpenPanelResultListenerRef listenerRef, WKArrayRef fileURLsRef, WKStringRef displayString, WKDataRef iconImageDataRef)
     61{
     62    toImpl(listenerRef)->chooseFiles(filePathsFromFileURLs(*toImpl(fileURLsRef)), toImpl(displayString)->string(), toImpl(iconImageDataRef));
     63}
     64#endif
     65
    5766void WKOpenPanelResultListenerChooseFiles(WKOpenPanelResultListenerRef listenerRef, WKArrayRef fileURLsRef)
    5867{
  • trunk/Source/WebKit/UIProcess/API/C/WKOpenPanelResultListener.h

    r168541 r244557  
    3535WK_EXPORT WKTypeID WKOpenPanelResultListenerGetTypeID();
    3636
     37WK_EXPORT void WKOpenPanelResultListenerChooseMediaFiles(WKOpenPanelResultListenerRef listenerRef, WKArrayRef fileURLsRef, WKStringRef displayString, WKDataRef iconImageDataRef);
    3738WK_EXPORT void WKOpenPanelResultListenerChooseFiles(WKOpenPanelResultListenerRef listener, WKArrayRef fileURLs);
    3839WK_EXPORT void WKOpenPanelResultListenerCancel(WKOpenPanelResultListenerRef listener);
  • trunk/Tools/ChangeLog

    r244556 r244557  
     12019-04-23  Guy Lewin  <guy@lewin.co.il>
     2
     3        Multiple File Input Icon Set Regardless of File List
     4        https://bugs.webkit.org/show_bug.cgi?id=195537
     5
     6        Reviewed by Alexey Proskuryakov.
     7
     8        Add setOpenPanelFilesMediaIcon to TestRunner in order to test icon and
     9        display string in iOS file inputs
     10
     11        * DumpRenderTree/TestRunner.cpp:
     12        (SetOpenPanelFilesMediaIconCallback):
     13        (TestRunner::staticFunctions):
     14        (TestRunner::setOpenPanelFilesMediaIcon):
     15        * DumpRenderTree/TestRunner.h:
     16        (TestRunner::openPanelFilesMediaIcon const):
     17        * DumpRenderTree/mac/UIDelegate.mm:
     18        (-[UIDelegate webView:runOpenPanelForFileButtonWithResultListener:allowMultipleFiles:]):
     19        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
     20        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
     21        (WTR::TestRunner::setOpenPanelFilesMediaIcon):
     22        * WebKitTestRunner/InjectedBundle/TestRunner.h:
     23        * WebKitTestRunner/TestController.cpp:
     24        (WTR::runOpenPanel):
     25        (WTR::TestController::resetStateToConsistentValues):
     26        * WebKitTestRunner/TestController.h:
     27        (WTR::TestController::openPanelFileURLsMediaIcon const):
     28        (WTR::TestController::setOpenPanelFileURLsMediaIcon):
     29        * WebKitTestRunner/TestInvocation.cpp:
     30        (WTR::TestInvocation::didReceiveMessageFromInjectedBundle):
     31
    1322019-04-23  Eric Carlson  <eric.carlson@apple.com>
    233
  • trunk/Tools/DumpRenderTree/TestRunner.cpp

    r239832 r244557  
    18291829    return JSValueMakeUndefined(context);
    18301830}
     1831
     1832#if PLATFORM(IOS_FAMILY)
     1833static JSValueRef SetOpenPanelFilesMediaIconCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
     1834{
     1835    if (argumentCount == 1)
     1836        static_cast<TestRunner*>(JSObjectGetPrivate(thisObject))->setOpenPanelFilesMediaIcon(context, arguments[0]);
     1837    return JSValueMakeUndefined(context);
     1838}
     1839#endif
    18311840
    18321841// Static Values
     
    22942303        { "setSpellCheckerResults", setSpellCheckerResultsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    22952304        { "setOpenPanelFiles", setOpenPanelFilesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
     2305#if PLATFORM(IOS_FAMILY)
     2306        { "setOpenPanelFilesMediaIcon", SetOpenPanelFilesMediaIconCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
     2307#endif
    22962308        { "forceImmediateCompletion", forceImmediateCompletionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    22972309        { 0, 0, 0 }
     
    25272539}
    25282540
     2541#if PLATFORM(IOS_FAMILY)
     2542void TestRunner::setOpenPanelFilesMediaIcon(JSContextRef context, JSValueRef mediaIcon)
     2543{
     2544    // FIXME (123058): Use a JSC API to get buffer contents once such is exposed.
     2545    JSC::VM& vm = toJS(context)->vm();
     2546    JSC::JSLockHolder lock(vm);
     2547   
     2548    JSC::JSArrayBufferView* jsBufferView = JSC::jsDynamicCast<JSC::JSArrayBufferView*>(vm, toJS(toJS(context), mediaIcon));
     2549    ASSERT(jsBufferView);
     2550    RefPtr<JSC::ArrayBufferView> bufferView = jsBufferView->unsharedImpl();
     2551    const char* buffer = static_cast<const char*>(bufferView->baseAddress());
     2552    std::vector<char> mediaIconData(buffer, buffer + bufferView->byteLength());
     2553   
     2554    m_openPanelFilesMediaIcon = mediaIconData;
     2555}
     2556#endif
     2557
    25292558void TestRunner::cleanup()
    25302559{
  • trunk/Tools/DumpRenderTree/TestRunner.h

    r239832 r244557  
    384384    void setOpenPanelFiles(JSContextRef, JSValueRef);
    385385
     386#if PLATFORM(IOS_FAMILY)
     387    const std::vector<char>& openPanelFilesMediaIcon() const { return m_openPanelFilesMediaIcon; }
     388    void setOpenPanelFilesMediaIcon(JSContextRef, JSValueRef);
     389#endif
     390
    386391    bool didCancelClientRedirect() const { return m_didCancelClientRedirect; }
    387392    void setDidCancelClientRedirect(bool value) { m_didCancelClientRedirect = value; }
     
    479484
    480485    std::vector<std::string> m_openPanelFiles;
     486#if PLATFORM(IOS_FAMILY)
     487    std::vector<char> m_openPanelFilesMediaIcon;
     488#endif
    481489
    482490    static JSClassRef getJSClass();
  • trunk/Tools/DumpRenderTree/mac/UIDelegate.mm

    r237266 r244557  
    386386    }
    387387
     388#if PLATFORM(IOS_FAMILY)
     389    NSURL *firstURL = [NSURL fileURLWithPath:[NSString stringWithUTF8String:openPanelFiles[0].c_str()] relativeToURL:baseURL];
     390    NSString *displayString = firstURL.lastPathComponent;
     391    const std::vector<char>& iconData = gTestRunner->openPanelFilesMediaIcon();
     392    CGImageRef imageRef;
     393    if (!iconData.empty()) {
     394        RetainPtr<CFDataRef> dataRef = adoptCF(CFDataCreate(nullptr, (unsigned char *)iconData.data(), iconData.size()));
     395        RetainPtr<CGDataProviderRef> imageProviderRef = adoptCF(CGDataProviderCreateWithCFData(dataRef.get()));
     396        imageRef = CGImageCreateWithJPEGDataProvider(imageProviderRef.get(), nullptr, true, kCGRenderingIntentDefault);
     397    }
     398#endif
     399
    388400    if (allowMultipleFiles) {
     401#if PLATFORM(IOS_FAMILY)
     402        [resultListener chooseFilenames:filePaths.get() displayString:displayString iconImage:imageRef];
     403#else
    389404        [resultListener chooseFilenames:filePaths.get()];
     405#endif
    390406        return;
    391407    }
    392408
     409#if PLATFORM(IOS_FAMILY)
     410    [resultListener chooseFilename:[filePaths firstObject] displayString:displayString iconImage:imageRef];
     411#else
    393412    [resultListener chooseFilename:[filePaths firstObject]];
     413#endif
    394414}
    395415
  • trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl

    r244370 r244557  
    341341    // Open panel
    342342    void setOpenPanelFiles(object filesArray);
     343    void setOpenPanelFilesMediaIcon(object mediaIcon);
    343344
    344345    // Modal alerts
  • trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp

    r244390 r244557  
    24462446}
    24472447
     2448#if PLATFORM(IOS_FAMILY)
     2449void TestRunner::setOpenPanelFilesMediaIcon(JSValueRef data)
     2450{
     2451    WKBundlePageRef page = InjectedBundle::singleton().page()->page();
     2452    JSContextRef context = WKBundleFrameGetJavaScriptContext(WKBundlePageGetMainFrame(page));
     2453
     2454    auto& injectedBundle = InjectedBundle::singleton();
     2455    // FIXME (123058): Use a JSC API to get buffer contents once such is exposed.
     2456    WKRetainPtr<WKDataRef> iconData(AdoptWK, WKBundleCreateWKDataFromUInt8Array(injectedBundle.bundle(), context, data));
     2457
     2458    static auto messageName = adoptWK(WKStringCreateWithUTF8CString("SetOpenPanelFileURLsMediaIcon"));
     2459    WKBundlePagePostMessage(page, messageName.get(), iconData.get());
     2460}
     2461#else
     2462void TestRunner::setOpenPanelFilesMediaIcon(JSValueRef)
     2463{
     2464}
     2465#endif // PLATFORM(IOS_FAMILY)
     2466
    24482467void TestRunner::removeAllSessionCredentials(JSValueRef callback)
    24492468{
  • trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h

    r244370 r244557  
    456456    // Open panel
    457457    void setOpenPanelFiles(JSValueRef);
     458    void setOpenPanelFilesMediaIcon(JSValueRef);
    458459
    459460    // Modal alerts
  • trunk/Tools/WebKitTestRunner/TestController.cpp

    r244390 r244557  
    6262#include <WebKit/WKSecurityOriginRef.h>
    6363#include <WebKit/WKTextChecker.h>
     64#include <WebKit/WKURL.h>
    6465#include <WebKit/WKUserContentControllerRef.h>
    6566#include <WebKit/WKUserContentExtensionStoreRef.h>
     
    200201        return;
    201202    }
     203   
     204    WKTypeRef firstItem = WKArrayGetItemAtIndex(fileURLs, 0);
     205   
     206#if PLATFORM(IOS_FAMILY)
     207    WKStringRef displayString = WKURLCopyLastPathComponent(static_cast<WKURLRef>(firstItem));
     208    WKDataRef mediaIcon = TestController::singleton().openPanelFileURLsMediaIcon();
     209   
     210    if (mediaIcon) {
     211        if (WKOpenPanelParametersGetAllowsMultipleFiles(parameters)) {
     212            WKOpenPanelResultListenerChooseMediaFiles(resultListenerRef, fileURLs, displayString, mediaIcon);
     213            return;
     214        }
     215       
     216        WKOpenPanelResultListenerChooseMediaFiles(resultListenerRef, adoptWK(WKArrayCreate(&firstItem, 1)).get(), displayString, mediaIcon);
     217        return;
     218    }
     219#endif
    202220
    203221    if (WKOpenPanelParametersGetAllowsMultipleFiles(parameters)) {
     
    206224    }
    207225
    208     WKTypeRef firstItem = WKArrayGetItemAtIndex(fileURLs, 0);
    209226    WKOpenPanelResultListenerChooseFiles(resultListenerRef, adoptWK(WKArrayCreate(&firstItem, 1)).get());
    210227}
     
    10061023
    10071024    m_openPanelFileURLs = nullptr;
     1025#if PLATFORM(IOS_FAMILY)
     1026    m_openPanelFileURLsMediaIcon = nullptr;
     1027#endif
    10081028   
    10091029    statisticsResetToConsistentState();
  • trunk/Tools/WebKitTestRunner/TestController.h

    r244370 r244557  
    252252    void setOpenPanelFileURLs(WKArrayRef fileURLs) { m_openPanelFileURLs = fileURLs; }
    253253
     254#if PLATFORM(IOS_FAMILY)
     255    WKDataRef openPanelFileURLsMediaIcon() const { return m_openPanelFileURLsMediaIcon.get(); }
     256    void setOpenPanelFileURLsMediaIcon(WKDataRef mediaIcon) { m_openPanelFileURLsMediaIcon = mediaIcon; }
     257#endif
     258
    254259    void terminateNetworkProcess();
    255260    void terminateServiceWorkerProcess();
     
    561566
    562567    WKRetainPtr<WKArrayRef> m_openPanelFileURLs;
     568#if PLATFORM(IOS_FAMILY)
     569    WKRetainPtr<WKDataRef> m_openPanelFileURLsMediaIcon;
     570#endif
    563571
    564572    std::unique_ptr<EventSenderProxy> m_eventSenderProxy;
  • trunk/Tools/WebKitTestRunner/TestInvocation.cpp

    r244390 r244557  
    795795    }
    796796
     797#if PLATFORM(IOS_FAMILY)
     798    if (WKStringIsEqualToUTF8CString(messageName, "SetOpenPanelFileURLsMediaIcon")) {
     799        TestController::singleton().setOpenPanelFileURLsMediaIcon(static_cast<WKDataRef>(messageBody));
     800        return;
     801    }
     802#endif
     803
    797804    ASSERT_NOT_REACHED();
    798805}
Note: See TracChangeset for help on using the changeset viewer.