Changeset 251953 in webkit


Ignore:
Timestamp:
Nov 1, 2019 4:46:25 PM (4 years ago)
Author:
Chris Dumez
Message:

Port FileReader to the HTML5 event loop
https://bugs.webkit.org/show_bug.cgi?id=203749

Reviewed by Ryosuke Niwa.

  • dom/AbstractEventLoop.h:
  • fileapi/FileReader.cpp:

(WebCore::FileReader::FileReader):
(WebCore::FileReader::stop):
(WebCore::FileReader::hasPendingActivity const):
(WebCore::FileReader::abort):
(WebCore::FileReader::didStartLoading):
(WebCore::FileReader::didReceiveData):
(WebCore::FileReader::didFinishLoading):
(WebCore::FileReader::didFail):
(WebCore::FileReader::enqueueTask):

  • fileapi/FileReader.h:
Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r251950 r251953  
     12019-11-01  Chris Dumez  <cdumez@apple.com>
     2
     3        Port FileReader to the HTML5 event loop
     4        https://bugs.webkit.org/show_bug.cgi?id=203749
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        * dom/AbstractEventLoop.h:
     9        * fileapi/FileReader.cpp:
     10        (WebCore::FileReader::FileReader):
     11        (WebCore::FileReader::stop):
     12        (WebCore::FileReader::hasPendingActivity const):
     13        (WebCore::FileReader::abort):
     14        (WebCore::FileReader::didStartLoading):
     15        (WebCore::FileReader::didReceiveData):
     16        (WebCore::FileReader::didFinishLoading):
     17        (WebCore::FileReader::didFail):
     18        (WebCore::FileReader::enqueueTask):
     19        * fileapi/FileReader.h:
     20
    1212019-11-01  Eric Carlson  <eric.carlson@apple.com>
    222
  • trunk/Source/WebCore/dom/AbstractEventLoop.h

    r251934 r251953  
    3535enum class TaskSource : uint8_t {
    3636    DOMManipulation,
     37    FileReading,
    3738    IdleTask,
    3839    Networking,
  • trunk/Source/WebCore/fileapi/FileReader.cpp

    r251327 r251953  
    3232#include "FileReader.h"
    3333
     34#include "AbstractEventLoop.h"
    3435#include "EventNames.h"
    3536#include "File.h"
     
    3738#include "ProgressEvent.h"
    3839#include "ScriptExecutionContext.h"
    39 #include "SuspendableTaskQueue.h"
    4040#include <JavaScriptCore/ArrayBuffer.h>
    4141#include <wtf/IsoMallocInlines.h>
     
    5858FileReader::FileReader(ScriptExecutionContext& context)
    5959    : ActiveDOMObject(&context)
    60     , m_taskQueue(SuspendableTaskQueue::create(&context))
    6160{
    6261}
     
    7574void FileReader::stop()
    7675{
     76    m_pendingTasks.clear();
    7777    if (m_loader) {
    7878        m_loader->cancel();
     
    8484bool FileReader::hasPendingActivity() const
    8585{
    86     return m_taskQueue->hasPendingTasks() || m_state == LOADING || ActiveDOMObject::hasPendingActivity();
     86    return m_state == LOADING || ActiveDOMObject::hasPendingActivity();
    8787}
    8888
     
    156156
    157157    // Schedule to have the abort done later since abort() might be called from the event handler and we do not want the resource loading code to be in the stack.
    158     m_taskQueue->cancelAllTasks();
    159     m_taskQueue->enqueueTask([this] {
     158    m_pendingTasks.clear();
     159    enqueueTask([this] {
    160160        ASSERT(m_state != DONE);
    161161
     
    173173void FileReader::didStartLoading()
    174174{
    175     m_taskQueue->enqueueTask([this] {
     175    enqueueTask([this] {
    176176        fireEvent(eventNames().loadstartEvent);
    177177    });
     
    180180void FileReader::didReceiveData()
    181181{
    182     m_taskQueue->enqueueTask([this] {
     182    enqueueTask([this] {
    183183        auto now = MonotonicTime::now();
    184184        if (std::isnan(m_lastProgressNotificationTime)) {
     
    198198        return;
    199199
    200     m_taskQueue->enqueueTask([this] {
     200    enqueueTask([this] {
    201201        ASSERT(m_state != DONE);
    202202        m_state = DONE;
     
    214214        return;
    215215
    216     m_taskQueue->enqueueTask([this, errorCode] {
     216    enqueueTask([this, errorCode] {
    217217        ASSERT(m_state != DONE);
    218218        m_state = DONE;
     
    246246}
    247247
     248void FileReader::enqueueTask(Function<void()>&& task)
     249{
     250    auto* context = scriptExecutionContext();
     251    if (!context)
     252        return;
     253
     254    static uint64_t taskIdentifierSeed = 0;
     255    uint64_t taskIdentifier = ++taskIdentifierSeed;
     256    m_pendingTasks.add(taskIdentifier, WTFMove(task));
     257    context->eventLoop().queueTask(TaskSource::FileReading, *context, [this, protectedThis = makeRef(*this), pendingActivity = makePendingActivity(*this), taskIdentifier] {
     258        auto task = m_pendingTasks.take(taskIdentifier);
     259        if (task)
     260            task();
     261    });
     262}
     263
    248264} // namespace WebCore
  • trunk/Source/WebCore/fileapi/FileReader.h

    r251327 r251953  
    3737#include "FileReaderLoader.h"
    3838#include "FileReaderLoaderClient.h"
     39#include <wtf/HashMap.h>
    3940#include <wtf/UniqueRef.h>
    4041
     
    4647
    4748class Blob;
    48 class SuspendableTaskQueue;
    4949
    5050class FileReader final : public RefCounted<FileReader>, public ActiveDOMObject, public EventTargetWithInlineData, private FileReaderLoaderClient {
     
    9292    void derefEventTarget() final { deref(); }
    9393
     94    void enqueueTask(Function<void()>&&);
     95
    9496    void didStartLoading() final;
    9597    void didReceiveData() final;
     
    109111    RefPtr<FileError> m_error;
    110112    MonotonicTime m_lastProgressNotificationTime { MonotonicTime::nan() };
    111     UniqueRef<SuspendableTaskQueue> m_taskQueue;
     113    HashMap<uint64_t, Function<void()>> m_pendingTasks;
    112114};
    113115
Note: See TracChangeset for help on using the changeset viewer.