Update Chromium DRT to output binary (instead of base64-encoded) data for web audio...
authorcrogers@google.com <crogers@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 25 Jul 2011 22:16:39 +0000 (22:16 +0000)
committercrogers@google.com <crogers@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 25 Jul 2011 22:16:39 +0000 (22:16 +0000)
https://bugs.webkit.org/show_bug.cgi?id=65039

Reviewed by Tony Chang.

Source/WebKit/chromium:

* WebKit.gyp:
* public/WebArrayBufferView.h: Added.
(WebKit::WebArrayBufferView::~WebArrayBufferView):
(WebKit::WebArrayBufferView::WebArrayBufferView):
* public/WebBindings.h:
* src/WebArrayBufferView.cpp: Added.
(WebKit::WebArrayBufferView::assign):
(WebKit::WebArrayBufferView::reset):
(WebKit::WebArrayBufferView::baseAddress):
(WebKit::WebArrayBufferView::byteOffset):
(WebKit::WebArrayBufferView::byteLength):
(WebKit::WebArrayBufferView::WebArrayBufferView):
(WebKit::WebArrayBufferView::operator=):
(WebKit::WebArrayBufferView::operator PassRefPtr<ArrayBufferView>):
* src/WebBindings.cpp:
(WebKit::getArrayBufferViewImpl):
(WebKit::WebBindings::getArrayBufferView):

Tools:

* DumpRenderTree/chromium/LayoutTestController.cpp:
(LayoutTestController::LayoutTestController):
(LayoutTestController::setAudioData):
* DumpRenderTree/chromium/LayoutTestController.h:
(LayoutTestController::audioData):
* DumpRenderTree/chromium/TestEventPrinter.cpp:
(DRTPrinter::handleAudioHeader):
(TestShellPrinter::handleAudioHeader):
* DumpRenderTree/chromium/TestShell.cpp:
(TestShell::dump):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@91708 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/WebKit.gyp
Source/WebKit/chromium/public/WebArrayBufferView.h [new file with mode: 0644]
Source/WebKit/chromium/public/WebBindings.h
Source/WebKit/chromium/src/WebArrayBufferView.cpp [new file with mode: 0644]
Source/WebKit/chromium/src/WebBindings.cpp
Tools/ChangeLog
Tools/DumpRenderTree/chromium/LayoutTestController.cpp
Tools/DumpRenderTree/chromium/LayoutTestController.h
Tools/DumpRenderTree/chromium/TestEventPrinter.cpp
Tools/DumpRenderTree/chromium/TestShell.cpp

index 54d4493..5ac3cbd 100644 (file)
@@ -1,3 +1,28 @@
+2011-07-25  Chris Rogers  <crogers@google.com>
+
+        Update Chromium DRT to output binary (instead of base64-encoded) data for web audio testing
+        https://bugs.webkit.org/show_bug.cgi?id=65039
+
+        Reviewed by Tony Chang.
+
+        * WebKit.gyp:
+        * public/WebArrayBufferView.h: Added.
+        (WebKit::WebArrayBufferView::~WebArrayBufferView):
+        (WebKit::WebArrayBufferView::WebArrayBufferView):
+        * public/WebBindings.h:
+        * src/WebArrayBufferView.cpp: Added.
+        (WebKit::WebArrayBufferView::assign):
+        (WebKit::WebArrayBufferView::reset):
+        (WebKit::WebArrayBufferView::baseAddress):
+        (WebKit::WebArrayBufferView::byteOffset):
+        (WebKit::WebArrayBufferView::byteLength):
+        (WebKit::WebArrayBufferView::WebArrayBufferView):
+        (WebKit::WebArrayBufferView::operator=):
+        (WebKit::WebArrayBufferView::operator PassRefPtr<ArrayBufferView>):
+        * src/WebBindings.cpp:
+        (WebKit::getArrayBufferViewImpl):
+        (WebKit::WebBindings::getArrayBufferView):
+
 2011-07-23  Alok Priyadarshi  <alokp@chromium.org>
 
         Switching off acceleration for small canvas broke gpu tests
index 8b3fe08..fe2c6f8 100644 (file)
                 'public/WebAnimationController.h',
                 'public/WebApplicationCacheHost.h',
                 'public/WebApplicationCacheHostClient.h',
+                'public/WebArrayBufferView.h',
                 'public/WebAttribute.h',
                 'public/WebAudioBus.h',
                 'public/WebAudioDevice.h',
                 'src/WebAccessibilityObject.cpp',
                 'src/WebAnimationControllerImpl.cpp',
                 'src/WebAnimationControllerImpl.h',
+                'src/WebArrayBufferView.cpp',
                 'src/WebAttribute.cpp',
                 'src/WebAudioBus.cpp',
                 'src/WebBindings.cpp',
diff --git a/Source/WebKit/chromium/public/WebArrayBufferView.h b/Source/WebKit/chromium/public/WebArrayBufferView.h
new file mode 100644 (file)
index 0000000..95f6fe5
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebArrayBufferView_h
+#define WebArrayBufferView_h
+
+#include "WebCommon.h"
+#include "WebPrivatePtr.h"
+
+namespace WebCore { class ArrayBufferView; }
+
+namespace WebKit {
+
+// Provides access to an ArrayBufferView.
+class WebArrayBufferView {
+public:
+    ~WebArrayBufferView() { reset(); }
+    WebArrayBufferView() { }
+    WebArrayBufferView(const WebArrayBufferView& v) { assign(v); }
+
+    WEBKIT_API void* baseAddress() const;
+    WEBKIT_API unsigned byteOffset() const;
+    WEBKIT_API unsigned byteLength() const;
+
+    WEBKIT_API void assign(const WebArrayBufferView&);
+    WEBKIT_API void reset();
+
+#if WEBKIT_IMPLEMENTATION
+    WebArrayBufferView(const WTF::PassRefPtr<WebCore::ArrayBufferView>&);
+    WebArrayBufferView& operator=(const WTF::PassRefPtr<WebCore::ArrayBufferView>&);
+    operator WTF::PassRefPtr<WebCore::ArrayBufferView>() const;
+#endif
+
+private:
+    WebPrivatePtr<WebCore::ArrayBufferView> m_private;
+};
+
+} // namespace WebKit
+
+#endif
index 5aa4c8d..b259bb5 100644 (file)
@@ -38,6 +38,7 @@
 
 namespace WebKit {
 
+class WebArrayBufferView;
 class WebDragData;
 class WebElement;
 class WebNode;
@@ -134,6 +135,10 @@ public:
     // If so, return that range as a WebRange object.
     WEBKIT_API static bool getRange(NPObject* range, WebRange*);
 
+    // Return true (success) if the given npobj is an ArrayBufferView object.
+    // If so, return it as a WebArrayBufferView object.
+    WEBKIT_API static bool getArrayBufferView(NPObject* arrayBufferView, WebArrayBufferView*);
+
     // Return true (success) if the given npobj is an element.
     // If so, return that element as a WebElement object.
     WEBKIT_API static bool getElement(NPObject* element, WebElement*);
diff --git a/Source/WebKit/chromium/src/WebArrayBufferView.cpp b/Source/WebKit/chromium/src/WebArrayBufferView.cpp
new file mode 100644 (file)
index 0000000..42ea0ff
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WebArrayBufferView.h"
+
+#include "ArrayBufferView.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void WebArrayBufferView::assign(const WebArrayBufferView& other)
+{
+    m_private = other.m_private;
+}
+
+void WebArrayBufferView::reset()
+{
+    m_private.reset();
+}
+
+void* WebArrayBufferView::baseAddress() const
+{
+    return m_private->baseAddress();
+}
+
+unsigned WebArrayBufferView::byteOffset() const
+{
+    return m_private->byteOffset();
+}
+
+unsigned WebArrayBufferView::byteLength() const
+{
+    return m_private->byteLength();
+}
+
+WebArrayBufferView::WebArrayBufferView(const PassRefPtr<ArrayBufferView>& value)
+    : m_private(value)
+{
+}
+
+WebArrayBufferView& WebArrayBufferView::operator=(const PassRefPtr<ArrayBufferView>& value)
+{
+    m_private = value;
+    return *this;
+}
+
+WebArrayBufferView::operator PassRefPtr<ArrayBufferView>() const
+{
+    return m_private.get();
+}
+
+} // namespace WebKit
index e47e523..4340315 100644 (file)
 #include "npruntime_priv.h"
 
 #if USE(V8)
+#include "ArrayBufferView.h"
 #include "NPV8Object.h"  // for PrivateIdentifier
 #include "Range.h"
+#include "V8ArrayBufferView.h"
 #include "V8BindingState.h"
 #include "V8DOMWrapper.h"
 #include "V8Element.h"
@@ -46,6 +48,7 @@
 #elif USE(JSC)
 #include "bridge/c/c_utility.h"
 #endif
+#include "WebArrayBufferView.h"
 #include "WebElement.h"
 #include "WebRange.h"
 
@@ -234,6 +237,21 @@ static bool getElementImpl(NPObject* object, WebElement* webElement)
     return true;
 }
 
+static bool getArrayBufferViewImpl(NPObject* object, WebArrayBufferView* arrayBufferView)
+{
+    if (!object || (object->_class != npScriptObjectClass))
+        return false;
+
+    V8NPObject* v8NPObject = reinterpret_cast<V8NPObject*>(object);
+    v8::Handle<v8::Object> v8Object(v8NPObject->v8Object);
+    ArrayBufferView* native = V8ArrayBufferView::HasInstance(v8Object) ? V8ArrayBufferView::toNative(v8Object) : 0;
+    if (!native)
+        return false;
+
+    *arrayBufferView = WebArrayBufferView(native);
+    return true;
+}
+
 static NPObject* makeIntArrayImpl(const WebVector<int>& data)
 {
     v8::HandleScope handleScope;
@@ -268,6 +286,16 @@ bool WebBindings::getRange(NPObject* range, WebRange* webRange)
 #endif
 }
 
+bool WebBindings::getArrayBufferView(NPObject* arrayBufferView, WebArrayBufferView* webArrayBufferView)
+{
+#if USE(V8)
+    return getArrayBufferViewImpl(arrayBufferView, webArrayBufferView);
+#else
+    // Not supported on other ports (JSC, etc).
+    return false;
+#endif
+}
+
 bool WebBindings::getElement(NPObject* element, WebElement* webElement)
 {
 #if USE(V8)
index 369940d..443e55f 100644 (file)
@@ -1,3 +1,21 @@
+2011-07-25  Chris Rogers  <crogers@google.com>
+
+        Update Chromium DRT to output binary (instead of base64-encoded) data for web audio testing
+        https://bugs.webkit.org/show_bug.cgi?id=65039
+
+        Reviewed by Tony Chang.
+
+        * DumpRenderTree/chromium/LayoutTestController.cpp:
+        (LayoutTestController::LayoutTestController):
+        (LayoutTestController::setAudioData):
+        * DumpRenderTree/chromium/LayoutTestController.h:
+        (LayoutTestController::audioData):
+        * DumpRenderTree/chromium/TestEventPrinter.cpp:
+        (DRTPrinter::handleAudioHeader):
+        (TestShellPrinter::handleAudioHeader):
+        * DumpRenderTree/chromium/TestShell.cpp:
+        (TestShell::dump):
+
 2011-06-07  Martin Robinson  <mrobinson@igalia.com>
 
         Reviewed by Gustavo Noronha Silva.
index 8576d53..f66aefc 100644 (file)
@@ -155,7 +155,7 @@ LayoutTestController::LayoutTestController(TestShell* shell)
     bindMethod("setDeferMainResourceDataLoad", &LayoutTestController::setDeferMainResourceDataLoad);
     bindMethod("setDomainRelaxationForbiddenForURLScheme", &LayoutTestController::setDomainRelaxationForbiddenForURLScheme);
     bindMethod("setEditingBehavior", &LayoutTestController::setEditingBehavior);
-    bindMethod("setEncodedAudioData", &LayoutTestController::setEncodedAudioData);
+    bindMethod("setAudioData", &LayoutTestController::setAudioData);
     bindMethod("setGeolocationPermission", &LayoutTestController::setGeolocationPermission);
     bindMethod("setIconDatabaseEnabled", &LayoutTestController::setIconDatabaseEnabled);
     bindMethod("setJavaScriptCanAccessClipboard", &LayoutTestController::setJavaScriptCanAccessClipboard);
@@ -1846,12 +1846,19 @@ void LayoutTestController::setTextDirection(const CppArgumentList& arguments, Cp
     m_shell->webView()->setTextDirection(direction);
 }
 
-void LayoutTestController::setEncodedAudioData(const CppArgumentList& arguments, CppVariant* result)
+void LayoutTestController::setAudioData(const CppArgumentList& arguments, CppVariant* result)
 {
     result->setNull();
-    if (arguments.size() < 1 || !arguments[0].isString())
+
+    if (arguments.size() < 1 || !arguments[0].isObject())
+        return;
+
+    // Check that passed-in object is, in fact, an ArrayBufferView.
+    NPObject* npobject = NPVARIANT_TO_OBJECT(arguments[0]);
+    if (!npobject)
+        return;
+    if (!WebBindings::getArrayBufferView(npobject, &m_audioData))
         return;
 
-    m_encodedAudioData = arguments[0].toString();
     setShouldDumpAsAudio(true);
 }
index 3a7b1f2..1b204ee 100644 (file)
@@ -43,6 +43,7 @@
 
 #include "CppBoundClass.h"
 #include "Task.h"
+#include "WebArrayBufferView.h"
 #include "WebString.h"
 #include "WebTextDirection.h"
 #include "WebURL.h"
@@ -249,9 +250,9 @@ public:
     void setDeferMainResourceDataLoad(const CppArgumentList&, CppVariant*);
     void setEditingBehavior(const CppArgumentList&, CppVariant*);
 
-    // Deals with Web Audio base64 encoded WAVE file data.
-    void setEncodedAudioData(const CppArgumentList&, CppVariant*);
-    const std::string& encodedAudioData() const { return m_encodedAudioData; } 
+    // Deals with Web Audio WAV file data.
+    void setAudioData(const CppArgumentList&, CppVariant*);
+    const WebKit::WebArrayBufferView& audioData() const { return m_audioData; } 
 
     // The following are only stubs.
     // FIXME: Implement any of these that are needed to pass the layout tests.
@@ -619,8 +620,8 @@ private:
 
     OwnPtr<WebKit::WebSpeechInputControllerMock> m_speechInputControllerMock;
 
-    // base64 encoded WAV audio data is stored here.
-    std::string m_encodedAudioData;
+    // WAV audio data is stored here.
+    WebKit::WebArrayBufferView m_audioData;
 };
 
 #endif // LayoutTestController_h
index bb78259..8246c09 100644 (file)
@@ -100,7 +100,6 @@ void DRTPrinter::handleTextFooter() const
 void DRTPrinter::handleAudioHeader() const
 {
     printf("Content-Type: audio/wav\n");
-    printf("Content-Transfer-Encoding: base64\n");            
 }
 
 void DRTPrinter::handleImage(const char* actualHash, const char* expectedHash, const unsigned char* imageData, size_t imageSize, const char*) const
@@ -152,7 +151,6 @@ void TestShellPrinter::handleTextFooter() const
 void TestShellPrinter::handleAudioHeader() const
 {
     printf("Content-Type: audio/wav\n");
-    printf("Content-Transfer-Encoding: base64\n");
 }
 
 void TestShellPrinter::handleImage(const char* actualHash, const char*, const unsigned char* imageData, size_t imageSize, const char* fileName) const
index a576d8b..9013dc1 100644 (file)
@@ -34,6 +34,7 @@
 #include "DRTDevToolsAgent.h"
 #include "DRTDevToolsClient.h"
 #include "LayoutTestController.h"
+#include "WebArrayBufferView.h"
 #include "WebDataSource.h"
 #include "WebDocument.h"
 #include "WebElement.h"
@@ -477,13 +478,17 @@ void TestShell::dump()
 
     if (shouldDumpAsAudio) {
         m_printer->handleAudioHeader();
-
-        const string& encodedAudioData = m_layoutTestController->encodedAudioData();
-        if (fwrite(encodedAudioData.c_str(), 1, encodedAudioData.size(), stdout) != encodedAudioData.size())
+        
+        const WebKit::WebArrayBufferView& webArrayBufferView = m_layoutTestController->audioData();
+        printf("Content-Length: %d\n", webArrayBufferView.byteLength());
+        
+        if (fwrite(webArrayBufferView.baseAddress(), 1, webArrayBufferView.byteLength(), stdout) != webArrayBufferView.byteLength())
             FATAL("Short write to stdout, disk full?\n");
         printf("\n");
-
+        printf("#EOF\n");
+        
         m_printer->handleTestFooter(true);
+
         fflush(stdout);
         fflush(stderr);
         return;