[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

jianli at chromium.org jianli at chromium.org
Wed Dec 22 14:56:38 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit eb87d5e6c35308d013aa0265b9e39db8fb7c5825
Author: jianli at chromium.org <jianli at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Oct 25 20:11:11 2010 +0000

    Calling FileReader.abort during reading could cause crash
    https://bugs.webkit.org/show_bug.cgi?id=48163
    
    Reviewed by David Levin.
    
    WebCore:
    
    Test: fast/files/file-reader-abort.html
    
    * fileapi/FileReader.cpp:
    (WebCore::delayedAbort):
    (WebCore::FileReader::abort): Schedule to do the abort later to work
    around the case that abort() could be called from event handler.
    (WebCore::FileReader::doAbort):
    (WebCore::FileReader::didFail): Do not go with normal error handling
    when we are in the process of aborting.
    (WebCore::FileReader::failed):
    (WebCore::FileReader::readyState):
    * fileapi/FileReader.h:
    
    LayoutTests:
    
    * fast/files/file-reader-abort-expected.txt: Added.
    * fast/files/file-reader-abort.html: Added.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@70484 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 39b54a6..082d58a 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,13 @@
+2010-10-25  Jian Li  <jianli at chromium.org>
+
+        Reviewed by David Levin.
+
+        Calling FileReader.abort during reading could cause crash
+        https://bugs.webkit.org/show_bug.cgi?id=48163
+
+        * fast/files/file-reader-abort-expected.txt: Added.
+        * fast/files/file-reader-abort.html: Added.
+
 2010-10-25  David Hyatt  <hyatt at apple.com>
 
         Reviewed by Dan Bernstein.
diff --git a/LayoutTests/fast/files/file-reader-abort-expected.txt b/LayoutTests/fast/files/file-reader-abort-expected.txt
new file mode 100644
index 0000000..2651ca8
--- /dev/null
+++ b/LayoutTests/fast/files/file-reader-abort-expected.txt
@@ -0,0 +1,8 @@
+
+Test that FileReader.abort works.
+Received loadstart event
+Received error event: 3
+Received abort event
+Received loadend event
+DONE
+
diff --git a/LayoutTests/fast/files/file-reader-abort.html b/LayoutTests/fast/files/file-reader-abort.html
new file mode 100644
index 0000000..50a6533
--- /dev/null
+++ b/LayoutTests/fast/files/file-reader-abort.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+<body>
+<input type="file" name="file" id="file" onchange="onInputFileChange()">
+<pre id='console'></pre>
+
+<script>
+function log(message)
+{
+    document.getElementById('console').appendChild(document.createTextNode(message + "\n"));
+}
+
+function onInputFileChange()
+{
+    log("Test that FileReader.abort works.");
+
+    var file = document.getElementById("file").files[0];
+    var reader = new FileReader();
+    reader.readAsText(file);
+    reader.onloadstart = function() {
+        log("Received loadstart event");
+        reader.abort();
+    };
+    reader.onload = function() {
+        log("Received load event");
+    };
+    reader.onloadend = function() {
+        log("Received loadend event");
+        log("DONE");
+        if (layoutTestController.notifyDone)
+            layoutTestController.notifyDone();
+    };
+    reader.onabort = function() {
+        log("Received abort event");
+    };
+    reader.onerror = function(event) {
+        log("Received error event: " + event.target.error.code);
+    };
+}
+
+function runTests()
+{
+    eventSender.beginDragWithFiles(['resources/UTF8.txt']);
+    eventSender.mouseMoveTo(10, 10);
+    eventSender.mouseUp();
+}
+
+if (window.eventSender) {
+    layoutTestController.dumpAsText();
+    layoutTestController.waitUntilDone();
+    window.onload = runTests;
+}
+</script>
+</body>
+</html>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index f907c0a..83b99dd 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,23 @@
+2010-10-25  Jian Li  <jianli at chromium.org>
+
+        Reviewed by David Levin.
+
+        Calling FileReader.abort during reading could cause crash
+        https://bugs.webkit.org/show_bug.cgi?id=48163
+
+        Test: fast/files/file-reader-abort.html
+
+        * fileapi/FileReader.cpp:
+        (WebCore::delayedAbort):
+        (WebCore::FileReader::abort): Schedule to do the abort later to work
+        around the case that abort() could be called from event handler.
+        (WebCore::FileReader::doAbort):
+        (WebCore::FileReader::didFail): Do not go with normal error handling
+        when we are in the process of aborting.
+        (WebCore::FileReader::failed):
+        (WebCore::FileReader::readyState):
+        * fileapi/FileReader.h:
+
 2010-10-25  Patrick Gansterer  <paroga at webkit.org>
 
         Reviewed by Adam Roben.
diff --git a/WebCore/fileapi/FileReader.cpp b/WebCore/fileapi/FileReader.cpp
index 666259a..0691b28 100644
--- a/WebCore/fileapi/FileReader.cpp
+++ b/WebCore/fileapi/FileReader.cpp
@@ -138,10 +138,25 @@ void FileReader::readInternal(Blob* blob, ReadType type)
     m_state = Starting;
 }
 
+static void delayedAbort(ScriptExecutionContext*, FileReader* reader)
+{
+    reader->doAbort();
+}
+
 void FileReader::abort()
 {
     LOG(FileAPI, "FileReader: aborting\n");
 
+    if (m_state == Aborting)
+        return;
+    m_state = Aborting;
+
+    // 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.
+    scriptExecutionContext()->postTask(createCallbackTask(&delayedAbort, this));
+}
+
+void FileReader::doAbort()
+{
     terminate();
 
     m_builder.clear();
@@ -247,6 +262,10 @@ void FileReader::didFinishLoading(unsigned long)
 
 void FileReader::didFail(const ResourceError&)
 {
+    // If we're aborting, do not proceed with normal error handling since it is covered in aborting code.
+    if (m_state == Aborting)
+        return;
+
     // Treat as internal error.
     failed(500);
 }
@@ -255,7 +274,7 @@ void FileReader::failed(int httpStatusCode)
 {
     m_state = Completed;
 
-     m_error = FileError::create(httpStatusCodeToErrorCode(httpStatusCode));
+    m_error = FileError::create(httpStatusCodeToErrorCode(httpStatusCode));
     fireEvent(eventNames().errorEvent);
     fireEvent(eventNames().loadendEvent);
 
@@ -288,6 +307,7 @@ FileReader::ReadyState FileReader::readyState() const
         return EMPTY;
     case Opening:
     case Reading:
+    case Aborting:
         return LOADING;
     case Completed:
         return DONE;
diff --git a/WebCore/fileapi/FileReader.h b/WebCore/fileapi/FileReader.h
index 5a135a2..3f76ad6 100644
--- a/WebCore/fileapi/FileReader.h
+++ b/WebCore/fileapi/FileReader.h
@@ -74,6 +74,7 @@ public:
     void abort();
 
     void start();
+    void doAbort();
 
     ReadyState readyState() const;
     PassRefPtr<FileError> error() { return m_error; }
@@ -119,6 +120,7 @@ private:
         Starting,
         Opening,
         Reading,
+        Aborting,
         Completed
     };
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list