Add Plumming to get graphics error messages to JS Console
https://bugs.webkit.org/show_bug.cgi?id=77238

Source/WebCore:

Patch by Gregg Tavares <gman@chromium.org> on 2012-01-30
Reviewed by Kenneth Russell.

No new tests. No change in behavior.

* html/canvas/WebGLRenderingContext.cpp:
(WebGLRenderingContextErrorMessageCallback):
(WebCore::WebGLRenderingContextErrorMessageCallback::WebGLRenderingContextErrorMessageCallback):
(WebCore::WebGLRenderingContextErrorMessageCallback::onErrorMessage):
(WebCore::WebGLRenderingContextErrorMessageCallback::~WebGLRenderingContextErrorMessageCallback):
(WebCore):
(WebCore::WebGLRenderingContext::create):
(WebCore::WebGLRenderingContext::initializeNewContext):
(WebCore::WebGLRenderingContext::~WebGLRenderingContext):
* html/canvas/WebGLRenderingContext.h:
(WebGLRenderingContext):
* platform/graphics/GraphicsContext3D.h:
(ErrorMessageCallback):
(WebCore::GraphicsContext3D::ErrorMessageCallback::~ErrorMessageCallback):
(GraphicsContext3D):
* platform/graphics/cairo/GraphicsContext3DCairo.cpp:
(WebCore::GraphicsContext3D::setErrorMessageCallback):
(WebCore):
* platform/graphics/efl/GraphicsContext3DEfl.cpp:
(WebCore::GraphicsContext3D::setErrorMessageCallback):
(WebCore):
* platform/graphics/qt/GraphicsContext3DQt.cpp:
(WebCore::GraphicsContext3D::setErrorMessageCallback):
(WebCore):

Source/WebKit/chromium:

Patch by Gregg Tavares <gman@google.com> on 2012-01-30
Reviewed by Kenneth Russell.

* public/platform/WebGraphicsContext3D.h:
(WebGraphicsErrorMessageCallback):
(WebKit::WebGraphicsContext3D::WebGraphicsErrorMessageCallback::~WebGraphicsErrorMessageCallback):
(WebGraphicsContext3D):
(WebKit::WebGraphicsContext3D::setErrorMessageCallback):
* src/GraphicsContext3DChromium.cpp:
(WebCore::GraphicsContext3D::~GraphicsContext3D):
(WebCore):
(GraphicsErrorMessageCallbackAdapter):
(WebCore::GraphicsErrorMessageCallbackAdapter::~GraphicsErrorMessageCallbackAdapter):
(WebCore::GraphicsErrorMessageCallbackAdapter::GraphicsErrorMessageCallbackAdapter):
(WebCore::GraphicsErrorMessageCallbackAdapter::onErrorMessage):
(WebCore::GraphicsErrorMessageCallbackAdapter::create):
(WebCore::GraphicsContext3DPrivate::setErrorMessageCallback):
* src/GraphicsContext3DPrivate.h:
(WebCore):
():

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@106320 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 2d6fed6..5f8d663 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,37 @@
+2012-01-30  Gregg Tavares  <gman@chromium.org>
+
+        Add Plumming to get graphics error messages to JS Console
+        https://bugs.webkit.org/show_bug.cgi?id=77238
+
+        Reviewed by Kenneth Russell.
+
+        No new tests. No change in behavior.
+
+        * html/canvas/WebGLRenderingContext.cpp:
+        (WebGLRenderingContextErrorMessageCallback):
+        (WebCore::WebGLRenderingContextErrorMessageCallback::WebGLRenderingContextErrorMessageCallback):
+        (WebCore::WebGLRenderingContextErrorMessageCallback::onErrorMessage):
+        (WebCore::WebGLRenderingContextErrorMessageCallback::~WebGLRenderingContextErrorMessageCallback):
+        (WebCore):
+        (WebCore::WebGLRenderingContext::create):
+        (WebCore::WebGLRenderingContext::initializeNewContext):
+        (WebCore::WebGLRenderingContext::~WebGLRenderingContext):
+        * html/canvas/WebGLRenderingContext.h:
+        (WebGLRenderingContext):
+        * platform/graphics/GraphicsContext3D.h:
+        (ErrorMessageCallback):
+        (WebCore::GraphicsContext3D::ErrorMessageCallback::~ErrorMessageCallback):
+        (GraphicsContext3D):
+        * platform/graphics/cairo/GraphicsContext3DCairo.cpp:
+        (WebCore::GraphicsContext3D::setErrorMessageCallback):
+        (WebCore):
+        * platform/graphics/efl/GraphicsContext3DEfl.cpp:
+        (WebCore::GraphicsContext3D::setErrorMessageCallback):
+        (WebCore):
+        * platform/graphics/qt/GraphicsContext3DQt.cpp:
+        (WebCore::GraphicsContext3D::setErrorMessageCallback):
+        (WebCore):
+
 2012-01-30  Anders Carlsson  <andersca@apple.com>
 
         Simplify RenderLayerCompositor::frameViewDidScroll
diff --git a/Source/WebCore/html/canvas/WebGLRenderingContext.cpp b/Source/WebCore/html/canvas/WebGLRenderingContext.cpp
index 045667bc..9176a2d 100644
--- a/Source/WebCore/html/canvas/WebGLRenderingContext.cpp
+++ b/Source/WebCore/html/canvas/WebGLRenderingContext.cpp
@@ -374,6 +374,15 @@
     WebGLRenderingContext* m_context;
 };
 
+class WebGLRenderingContextErrorMessageCallback : public GraphicsContext3D::ErrorMessageCallback {
+public:
+    explicit WebGLRenderingContextErrorMessageCallback(WebGLRenderingContext* cb) : m_context(cb) { }
+    virtual void onErrorMessage(const String& message, GC3Dint) { m_context->printWarningToConsole(message); }
+    virtual ~WebGLRenderingContextErrorMessageCallback() { }
+private:
+    WebGLRenderingContext* m_context;
+};
+
 PassOwnPtr<WebGLRenderingContext> WebGLRenderingContext::create(HTMLCanvasElement* canvas, WebGLContextAttributes* attrs)
 {
     HostWindow* hostWindow = canvas->document()->view()->root()->hostWindow();
@@ -500,6 +509,7 @@
     m_context->viewport(0, 0, canvas()->width(), canvas()->height());
 
     m_context->setContextLostCallback(adoptPtr(new WebGLRenderingContextLostCallback(this)));
+    m_context->setErrorMessageCallback(adoptPtr(new WebGLRenderingContextErrorMessageCallback(this)));
 }
 
 void WebGLRenderingContext::setupFlags()
@@ -548,6 +558,7 @@
 
     detachAndRemoveAllObjects();
     m_context->setContextLostCallback(nullptr);
+    m_context->setErrorMessageCallback(nullptr);
     m_contextGroup->removeContext(this);
 }
 
diff --git a/Source/WebCore/html/canvas/WebGLRenderingContext.h b/Source/WebCore/html/canvas/WebGLRenderingContext.h
index 5550360..18291fd 100644
--- a/Source/WebCore/html/canvas/WebGLRenderingContext.h
+++ b/Source/WebCore/html/canvas/WebGLRenderingContext.h
@@ -322,6 +322,7 @@
     friend class OESVertexArrayObject;
     friend class WebGLDebugShaders;
     friend class WebGLCompressedTextures;
+    friend class WebGLRenderingContextErrorMessageCallback;
 
     WebGLRenderingContext(HTMLCanvasElement*, PassRefPtr<GraphicsContext3D>, GraphicsContext3D::Attributes);
     void initializeNewContext();
diff --git a/Source/WebCore/platform/graphics/GraphicsContext3D.h b/Source/WebCore/platform/graphics/GraphicsContext3D.h
index dfebbba..34c549a 100644
--- a/Source/WebCore/platform/graphics/GraphicsContext3D.h
+++ b/Source/WebCore/platform/graphics/GraphicsContext3D.h
@@ -454,7 +454,14 @@
         virtual ~ContextLostCallback() {}
     };
 
+    class ErrorMessageCallback {
+    public:
+        virtual void onErrorMessage(const String& message, GC3Dint id) = 0;
+        virtual ~ErrorMessageCallback() { }
+    };
+
     void setContextLostCallback(PassOwnPtr<ContextLostCallback>);
+    void setErrorMessageCallback(PassOwnPtr<ErrorMessageCallback>);
 
     static PassRefPtr<GraphicsContext3D> create(Attributes, HostWindow*, RenderStyle = RenderOffscreen);
     ~GraphicsContext3D();
diff --git a/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp b/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp
index b5e1231..c85aab4 100644
--- a/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp
+++ b/Source/WebCore/platform/graphics/cairo/GraphicsContext3DCairo.cpp
@@ -115,6 +115,10 @@
 {
 }
 
+void GraphicsContext3D::setErrorMessageCallback(PassOwnPtr<ErrorMessageCallback>)
+{
+}
+
 #if USE(ACCELERATED_COMPOSITING)
 PlatformLayer* GraphicsContext3D::platformLayer() const
 {
diff --git a/Source/WebCore/platform/graphics/efl/GraphicsContext3DEfl.cpp b/Source/WebCore/platform/graphics/efl/GraphicsContext3DEfl.cpp
index d45235e..e3e82f9 100644
--- a/Source/WebCore/platform/graphics/efl/GraphicsContext3DEfl.cpp
+++ b/Source/WebCore/platform/graphics/efl/GraphicsContext3DEfl.cpp
@@ -836,6 +836,11 @@
     notImplemented();
 }
 
+void GraphicsContext3D::setErrorMessageCallback(PassOwnPtr<ErrorMessageCallback>)
+{
+    notImplemented();
+}
+
 bool GraphicsContext3D::getImageData(Image* image, GC3Denum format, GC3Denum type, bool premultiplyAlpha,
                                      bool ignoreGammaAndColorProfile, Vector<uint8_t>& outputVector)
 {
diff --git a/Source/WebCore/platform/graphics/mac/GraphicsContext3DMac.mm b/Source/WebCore/platform/graphics/mac/GraphicsContext3DMac.mm
index e3c371a..a83e0de 100644
--- a/Source/WebCore/platform/graphics/mac/GraphicsContext3DMac.mm
+++ b/Source/WebCore/platform/graphics/mac/GraphicsContext3DMac.mm
@@ -278,6 +278,10 @@
 {
 }
 
+void GraphicsContext3D::setErrorMessageCallback(PassOwnPtr<ErrorMessageCallback>)
+{
+}
+
 }
 
 #endif // ENABLE(WEBGL)
diff --git a/Source/WebCore/platform/graphics/qt/GraphicsContext3DQt.cpp b/Source/WebCore/platform/graphics/qt/GraphicsContext3DQt.cpp
index 9173a5d..495bcad 100644
--- a/Source/WebCore/platform/graphics/qt/GraphicsContext3DQt.cpp
+++ b/Source/WebCore/platform/graphics/qt/GraphicsContext3DQt.cpp
@@ -1639,6 +1639,10 @@
 {
 }
 
+void GraphicsContext3D::setErrorMessageCallback(PassOwnPtr<ErrorMessageCallback>)
+{
+}
+
 }
 
 #endif // ENABLE(WEBGL)
diff --git a/Source/WebKit/chromium/ChangeLog b/Source/WebKit/chromium/ChangeLog
index cf4102e..8d82bfb 100644
--- a/Source/WebKit/chromium/ChangeLog
+++ b/Source/WebKit/chromium/ChangeLog
@@ -1,3 +1,28 @@
+2012-01-30  Gregg Tavares  <gman@google.com>
+
+        Add Plumming to get graphics error messages to JS Console
+        https://bugs.webkit.org/show_bug.cgi?id=77238
+
+        Reviewed by Kenneth Russell.
+
+        * public/platform/WebGraphicsContext3D.h:
+        (WebGraphicsErrorMessageCallback):
+        (WebKit::WebGraphicsContext3D::WebGraphicsErrorMessageCallback::~WebGraphicsErrorMessageCallback):
+        (WebGraphicsContext3D):
+        (WebKit::WebGraphicsContext3D::setErrorMessageCallback):
+        * src/GraphicsContext3DChromium.cpp:
+        (WebCore::GraphicsContext3D::~GraphicsContext3D):
+        (WebCore):
+        (GraphicsErrorMessageCallbackAdapter):
+        (WebCore::GraphicsErrorMessageCallbackAdapter::~GraphicsErrorMessageCallbackAdapter):
+        (WebCore::GraphicsErrorMessageCallbackAdapter::GraphicsErrorMessageCallbackAdapter):
+        (WebCore::GraphicsErrorMessageCallbackAdapter::onErrorMessage):
+        (WebCore::GraphicsErrorMessageCallbackAdapter::create):
+        (WebCore::GraphicsContext3DPrivate::setErrorMessageCallback):
+        * src/GraphicsContext3DPrivate.h:
+        (WebCore):
+        ():
+
 2012-01-30  Sheriff Bot  <webkit.review.bot@gmail.com>
 
         Unreviewed, rolling out r106259.
diff --git a/Source/WebKit/chromium/public/platform/WebGraphicsContext3D.h b/Source/WebKit/chromium/public/platform/WebGraphicsContext3D.h
index 3811436..03789d0 100644
--- a/Source/WebKit/chromium/public/platform/WebGraphicsContext3D.h
+++ b/Source/WebKit/chromium/public/platform/WebGraphicsContext3D.h
@@ -118,6 +118,12 @@
         virtual ~WebGraphicsContextLostCallback() { }
     };
 
+    class WebGraphicsErrorMessageCallback {
+    public:
+        virtual void onErrorMessage(const WebString&, WGC3Dint) = 0;
+        virtual ~WebGraphicsErrorMessageCallback() { }
+    };
+
     class WebGraphicsSwapBuffersCompleteCallbackCHROMIUM {
     public:
         virtual void onSwapBuffersComplete() = 0;
@@ -369,6 +375,7 @@
     virtual void deleteTexture(WebGLId) = 0;
 
     virtual void setContextLostCallback(WebGraphicsContextLostCallback* callback) {}
+    virtual void setErrorMessageCallback(WebGraphicsErrorMessageCallback* callback) { }
     // GL_ARB_robustness
     //
     // This entry point must provide slightly different semantics than
diff --git a/Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp b/Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp
index 56a89e7..5315d85 100644
--- a/Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp
+++ b/Source/WebKit/chromium/src/GraphicsContext3DChromium.cpp
@@ -1032,6 +1032,7 @@
 GraphicsContext3D::~GraphicsContext3D()
 {
     m_private->setContextLostCallback(nullptr);
+    m_private->setErrorMessageCallback(nullptr);
     m_private->setSwapBuffersCompleteCallbackCHROMIUM(nullptr);
 }
 
@@ -1268,6 +1269,7 @@
 DELEGATE_TO_INTERNAL_R(getExtensions, Extensions3D*)
 
 DELEGATE_TO_INTERNAL_1(setContextLostCallback, PassOwnPtr<GraphicsContext3D::ContextLostCallback>)
+DELEGATE_TO_INTERNAL_1(setErrorMessageCallback, PassOwnPtr<GraphicsContext3D::ErrorMessageCallback>)
 
 class GraphicsContextLostCallbackAdapter : public WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback {
 public:
@@ -1296,6 +1298,33 @@
     m_impl->setContextLostCallback(m_contextLostCallbackAdapter.get());
 }
 
+class GraphicsErrorMessageCallbackAdapter : public WebKit::WebGraphicsContext3D::WebGraphicsErrorMessageCallback {
+public:
+    virtual void onErrorMessage(const WebKit::WebString&, WebKit::WGC3Dint);
+    static PassOwnPtr<GraphicsErrorMessageCallbackAdapter> create(PassOwnPtr<GraphicsContext3D::ErrorMessageCallback>);
+    virtual ~GraphicsErrorMessageCallbackAdapter() { }
+private:
+    GraphicsErrorMessageCallbackAdapter(PassOwnPtr<GraphicsContext3D::ErrorMessageCallback> cb) : m_errorMessageCallback(cb) { }
+    OwnPtr<GraphicsContext3D::ErrorMessageCallback> m_errorMessageCallback;
+};
+
+void GraphicsErrorMessageCallbackAdapter::onErrorMessage(const WebKit::WebString& message, WebKit::WGC3Dint id)
+{
+    if (m_errorMessageCallback)
+        m_errorMessageCallback->onErrorMessage(message, id);
+}
+
+PassOwnPtr<GraphicsErrorMessageCallbackAdapter> GraphicsErrorMessageCallbackAdapter::create(PassOwnPtr<GraphicsContext3D::ErrorMessageCallback> cb)
+{
+    return adoptPtr(cb.get() ? new GraphicsErrorMessageCallbackAdapter(cb) : 0);
+}
+
+void GraphicsContext3DPrivate::setErrorMessageCallback(PassOwnPtr<GraphicsContext3D::ErrorMessageCallback> cb)
+{
+    m_errorMessageCallbackAdapter = GraphicsErrorMessageCallbackAdapter::create(cb);
+    m_impl->setErrorMessageCallback(m_errorMessageCallbackAdapter.get());
+}
+
 bool GraphicsContext3D::isGLES2Compliant() const
 {
     return m_private->isGLES2Compliant();
diff --git a/Source/WebKit/chromium/src/GraphicsContext3DPrivate.h b/Source/WebKit/chromium/src/GraphicsContext3DPrivate.h
index 28079c3..f2d49a1 100644
--- a/Source/WebKit/chromium/src/GraphicsContext3DPrivate.h
+++ b/Source/WebKit/chromium/src/GraphicsContext3DPrivate.h
@@ -50,6 +50,7 @@
 class Extensions3DChromium;
 class GraphicsContextLostCallbackAdapter;
 class GraphicsContext3DSwapBuffersCompleteCallbackAdapter;
+class GraphicsErrorMessageCallbackAdapter;
 
 class GraphicsContext3DPrivate {
 public:
@@ -273,6 +274,7 @@
     void synthesizeGLError(GC3Denum error);
 
     void setContextLostCallback(PassOwnPtr<GraphicsContext3D::ContextLostCallback>);
+    void setErrorMessageCallback(PassOwnPtr<GraphicsContext3D::ErrorMessageCallback>);
 
     // Extensions3D support.
     Extensions3D* getExtensions();
@@ -321,6 +323,7 @@
     OwnPtr<WebKit::WebGraphicsContext3D> m_impl;
     OwnPtr<Extensions3DChromium> m_extensions;
     OwnPtr<GraphicsContextLostCallbackAdapter> m_contextLostCallbackAdapter;
+    OwnPtr<GraphicsErrorMessageCallbackAdapter> m_errorMessageCallbackAdapter;
     OwnPtr<GraphicsContext3DSwapBuffersCompleteCallbackAdapter> m_swapBuffersCompleteCallbackAdapter;
     WebKit::WebViewImpl* m_webViewImpl;
     bool m_initializedAvailableExtensions;