- Revision
- 115529
- Author
- [email protected]
- Date
- 2012-04-27 19:55:49 -0700 (Fri, 27 Apr 2012)
Log Message
[chromium] Allow WebMediaPlayerClientImpl to switch clients
https://bugs.webkit.org/show_bug.cgi?id=85093
Reviewed by James Robinson.
WebVideoFrameProviderClient has a 1:1 relationship with a
WebVideoFrameProvider. The client here is CCVideoLayerImpl and the
provider is WebMediaPlayerClientImpl. If the provider gets a new
client, then the old client needs to be informed to stop using the
provider.
If this doesn't happen, then the old client will have an unsafe
pointer to the provider, will not get informed if the provider gets
deleted, and the client will crash when it dereferences the provider
pointer trying to tell the provider that its client is going away.
Test: WebMediaPlayerClientImplTest.InitialNullVideoClient
WebMediaPlayerClientImplTest.SetAndUnsetVideoClient
WebMediaPlayerClientImplTest.DestroyProvider
WebMediaPlayerClientImplTest.SetMultipleVideoClients
* WebKit.gypi:
* src/WebMediaPlayerClientImpl.cpp:
(WebKit::WebMediaPlayerClientImpl::setVideoFrameProviderClient):
* src/WebMediaPlayerClientImpl.h:
(WebMediaPlayerClientImpl):
* tests/WebMediaPlayerClientImplTest.cpp: Added.
(WebKit):
(FakeWebMediaPlayerClientImpl):
(WebKit::FakeWebMediaPlayerClientImpl::create):
(WebKit::FakeWebMediaPlayerClientImpl::FakeWebMediaPlayerClientImpl):
(FakeVideoFrameProviderClient):
(WebKit::FakeVideoFrameProviderClient::create):
(WebKit::FakeVideoFrameProviderClient::~FakeVideoFrameProviderClient):
(WebKit::FakeVideoFrameProviderClient::didReceiveFrame):
(WebKit::FakeVideoFrameProviderClient::didUpdateMatrix):
(WebKit::FakeVideoFrameProviderClient::stopUsingProvider):
(WebKit::FakeVideoFrameProviderClient::provider):
(WebKit::FakeVideoFrameProviderClient::FakeVideoFrameProviderClient):
(WebKit::TEST):
Modified Paths
Added Paths
Diff
Modified: trunk/Source/WebKit/chromium/ChangeLog (115528 => 115529)
--- trunk/Source/WebKit/chromium/ChangeLog 2012-04-28 02:43:48 UTC (rev 115528)
+++ trunk/Source/WebKit/chromium/ChangeLog 2012-04-28 02:55:49 UTC (rev 115529)
@@ -1,3 +1,46 @@
+2012-04-27 Adrienne Walker <[email protected]>
+
+ [chromium] Allow WebMediaPlayerClientImpl to switch clients
+ https://bugs.webkit.org/show_bug.cgi?id=85093
+
+ Reviewed by James Robinson.
+
+ WebVideoFrameProviderClient has a 1:1 relationship with a
+ WebVideoFrameProvider. The client here is CCVideoLayerImpl and the
+ provider is WebMediaPlayerClientImpl. If the provider gets a new
+ client, then the old client needs to be informed to stop using the
+ provider.
+
+ If this doesn't happen, then the old client will have an unsafe
+ pointer to the provider, will not get informed if the provider gets
+ deleted, and the client will crash when it dereferences the provider
+ pointer trying to tell the provider that its client is going away.
+
+ Test: WebMediaPlayerClientImplTest.InitialNullVideoClient
+ WebMediaPlayerClientImplTest.SetAndUnsetVideoClient
+ WebMediaPlayerClientImplTest.DestroyProvider
+ WebMediaPlayerClientImplTest.SetMultipleVideoClients
+
+ * WebKit.gypi:
+ * src/WebMediaPlayerClientImpl.cpp:
+ (WebKit::WebMediaPlayerClientImpl::setVideoFrameProviderClient):
+ * src/WebMediaPlayerClientImpl.h:
+ (WebMediaPlayerClientImpl):
+ * tests/WebMediaPlayerClientImplTest.cpp: Added.
+ (WebKit):
+ (FakeWebMediaPlayerClientImpl):
+ (WebKit::FakeWebMediaPlayerClientImpl::create):
+ (WebKit::FakeWebMediaPlayerClientImpl::FakeWebMediaPlayerClientImpl):
+ (FakeVideoFrameProviderClient):
+ (WebKit::FakeVideoFrameProviderClient::create):
+ (WebKit::FakeVideoFrameProviderClient::~FakeVideoFrameProviderClient):
+ (WebKit::FakeVideoFrameProviderClient::didReceiveFrame):
+ (WebKit::FakeVideoFrameProviderClient::didUpdateMatrix):
+ (WebKit::FakeVideoFrameProviderClient::stopUsingProvider):
+ (WebKit::FakeVideoFrameProviderClient::provider):
+ (WebKit::FakeVideoFrameProviderClient::FakeVideoFrameProviderClient):
+ (WebKit::TEST):
+
2012-04-27 Tony Chang <[email protected]>
[chromium] Fix compiler warning in CCSchedulerTest.cpp with gcc 4.6.3
Modified: trunk/Source/WebKit/chromium/WebKit.gypi (115528 => 115529)
--- trunk/Source/WebKit/chromium/WebKit.gypi 2012-04-28 02:43:48 UTC (rev 115528)
+++ trunk/Source/WebKit/chromium/WebKit.gypi 2012-04-28 02:55:49 UTC (rev 115529)
@@ -134,6 +134,7 @@
'tests/WebCompositorInputHandlerImplTest.cpp',
'tests/WebFrameTest.cpp',
'tests/WebLayerTest.cpp',
+ 'tests/WebMediaPlayerClientImplTest.cpp',
'tests/WebPageNewSerializerTest.cpp',
'tests/WebPageSerializerTest.cpp',
'tests/WebSocketDeflaterTest.cpp',
Modified: trunk/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp (115528 => 115529)
--- trunk/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp 2012-04-28 02:43:48 UTC (rev 115528)
+++ trunk/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp 2012-04-28 02:55:49 UTC (rev 115529)
@@ -672,6 +672,8 @@
void WebMediaPlayerClientImpl::setVideoFrameProviderClient(WebVideoFrameProvider::Client* client)
{
MutexLocker locker(m_compositingMutex);
+ if (m_videoFrameProviderClient)
+ m_videoFrameProviderClient->stopUsingProvider();
m_videoFrameProviderClient = client;
if (m_webMediaPlayer)
m_webMediaPlayer->setStreamTextureClient(client ? this : 0);
Modified: trunk/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h (115528 => 115529)
--- trunk/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h 2012-04-28 02:43:48 UTC (rev 115528)
+++ trunk/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h 2012-04-28 02:55:49 UTC (rev 115529)
@@ -165,8 +165,9 @@
virtual void didReceiveFrame();
virtual void didUpdateMatrix(const float*);
+protected:
+ WebMediaPlayerClientImpl();
private:
- WebMediaPlayerClientImpl();
void startDelayedLoad();
void loadInternal();
Added: trunk/Source/WebKit/chromium/tests/WebMediaPlayerClientImplTest.cpp (0 => 115529)
--- trunk/Source/WebKit/chromium/tests/WebMediaPlayerClientImplTest.cpp (rev 0)
+++ trunk/Source/WebKit/chromium/tests/WebMediaPlayerClientImplTest.cpp 2012-04-28 02:55:49 UTC (rev 115529)
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2012 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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 "WebMediaPlayerClientImpl.h"
+
+#include <gtest/gtest.h>
+#include <wtf/PassOwnPtr.h>
+
+using namespace WebKit;
+
+namespace {
+
+class FakeWebMediaPlayerClientImpl : public WebMediaPlayerClientImpl {
+public:
+ static PassOwnPtr<FakeWebMediaPlayerClientImpl> create() { return adoptPtr(new FakeWebMediaPlayerClientImpl()); }
+
+private:
+ FakeWebMediaPlayerClientImpl() { }
+};
+
+class FakeVideoFrameProviderClient : public WebVideoFrameProvider::Client {
+public:
+ static PassOwnPtr<FakeVideoFrameProviderClient> create(WebVideoFrameProvider* provider)
+ {
+ return adoptPtr(new FakeVideoFrameProviderClient(provider));
+ }
+
+ ~FakeVideoFrameProviderClient()
+ {
+ if (m_provider)
+ m_provider->setVideoFrameProviderClient(0);
+ }
+
+ // WebKit::WebVideoFrameProvider::Client implementation.
+ virtual void didReceiveFrame() { }
+ virtual void didUpdateMatrix(const float*) { }
+ virtual void stopUsingProvider()
+ {
+ m_provider = 0;
+ }
+
+ WebVideoFrameProvider* provider() const { return m_provider; }
+
+private:
+ FakeVideoFrameProviderClient(WebVideoFrameProvider* provider)
+ : m_provider(provider)
+ {
+ m_provider->setVideoFrameProviderClient(this);
+ }
+
+ WebVideoFrameProvider* m_provider;
+};
+
+TEST(WebMediaPlayerClientImplTest, InitialNullVideoClient)
+{
+ // No explict checks in this test; just make sure it doesn't crash.
+ OwnPtr<WebMediaPlayerClientImpl> provider = FakeWebMediaPlayerClientImpl::create();
+ provider->setVideoFrameProviderClient(0);
+}
+
+TEST(WebMediaPlayerClientImplTest, SetAndUnsetVideoClient)
+{
+ OwnPtr<WebMediaPlayerClientImpl> provider = FakeWebMediaPlayerClientImpl::create();
+ OwnPtr<FakeVideoFrameProviderClient> client = FakeVideoFrameProviderClient::create(provider.get());
+
+ EXPECT_EQ(client->provider(), provider.get());
+
+ provider->setVideoFrameProviderClient(0);
+ ASSERT_FALSE(client->provider());
+}
+
+TEST(WebMediaPlayerClientImplTest, DestroyProvider)
+{
+ OwnPtr<WebMediaPlayerClientImpl> provider = FakeWebMediaPlayerClientImpl::create();
+ OwnPtr<FakeVideoFrameProviderClient> client = FakeVideoFrameProviderClient::create(provider.get());
+
+ EXPECT_EQ(client->provider(), provider);
+ provider.clear();
+ ASSERT_FALSE(client->provider());
+}
+
+TEST(WebMediaPlayerClientImplTest, SetMultipleVideoClients)
+{
+ OwnPtr<WebMediaPlayerClientImpl> provider = FakeWebMediaPlayerClientImpl::create();
+ OwnPtr<FakeVideoFrameProviderClient> firstClient = FakeVideoFrameProviderClient::create(provider.get());
+ EXPECT_EQ(firstClient->provider(), provider);
+
+ OwnPtr<FakeVideoFrameProviderClient> secondClient = FakeVideoFrameProviderClient::create(provider.get());
+ EXPECT_FALSE(firstClient->provider());
+ EXPECT_EQ(secondClient->provider(), provider);
+
+ provider.clear();
+ ASSERT_FALSE(firstClient->provider());
+ ASSERT_FALSE(secondClient->provider());
+}
+
+}