summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-29 04:27:38 +0000
committerscherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-29 04:27:38 +0000
commit69fb3d53a0799a578d3564fd3735eb6e8c34d5b8 (patch)
treeadc2667d80b02b0f0183f20adace0163bc101658
parent8035e22f828c698aad23f8d44c9656f8a8aa97ee (diff)
downloadchromium_src-69fb3d53a0799a578d3564fd3735eb6e8c34d5b8.zip
chromium_src-69fb3d53a0799a578d3564fd3735eb6e8c34d5b8.tar.gz
chromium_src-69fb3d53a0799a578d3564fd3735eb6e8c34d5b8.tar.bz2
Initialize cc::VideoFrameProviderClientImpl::active_video_layer_.
As of r259048, WebMediaPlayerImpl now notifies the compositor of new frames directly on the compositing thread. If VideoFrameProviderClientImpl::DidRecieveFrame() is called before VideoLayerImpl::DidBecomeActive() is called, VideoFrameProviderClientImpl may attempt to call VideoLayerImpl::SetNeedsRedraw() using an uninitialized pointer. BUG=357145 R=enne@chromium.org Review URL: https://codereview.chromium.org/214543011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@260360 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--cc/layers/video_frame_provider_client_impl.cc2
-rw-r--r--cc/layers/video_frame_provider_client_impl.h1
-rw-r--r--cc/layers/video_layer_impl_unittest.cc18
-rw-r--r--cc/test/fake_video_frame_provider.h2
4 files changed, 22 insertions, 1 deletions
diff --git a/cc/layers/video_frame_provider_client_impl.cc b/cc/layers/video_frame_provider_client_impl.cc
index 732bbbb..9071fdc 100644
--- a/cc/layers/video_frame_provider_client_impl.cc
+++ b/cc/layers/video_frame_provider_client_impl.cc
@@ -22,7 +22,7 @@ VideoFrameProviderClientImpl::~VideoFrameProviderClientImpl() {}
VideoFrameProviderClientImpl::VideoFrameProviderClientImpl(
VideoFrameProvider* provider)
- : provider_(provider) {
+ : active_video_layer_(NULL), provider_(provider) {
// This only happens during a commit on the compositor thread while the main
// thread is blocked. That makes this a thread-safe call to set the video
// frame provider client that does not require a lock. The same is true of
diff --git a/cc/layers/video_frame_provider_client_impl.h b/cc/layers/video_frame_provider_client_impl.h
index 2bcb446..e676d0b 100644
--- a/cc/layers/video_frame_provider_client_impl.h
+++ b/cc/layers/video_frame_provider_client_impl.h
@@ -22,6 +22,7 @@ class VideoFrameProviderClientImpl
static scoped_refptr<VideoFrameProviderClientImpl> Create(
VideoFrameProvider* provider);
+ VideoLayerImpl* active_video_layer() { return active_video_layer_; }
void set_active_video_layer(VideoLayerImpl* video_layer) {
active_video_layer_ = video_layer;
}
diff --git a/cc/layers/video_layer_impl_unittest.cc b/cc/layers/video_layer_impl_unittest.cc
index dc9c6fb..68a2b2e 100644
--- a/cc/layers/video_layer_impl_unittest.cc
+++ b/cc/layers/video_layer_impl_unittest.cc
@@ -4,6 +4,7 @@
#include "cc/layers/video_layer_impl.h"
+#include "cc/layers/video_frame_provider_client_impl.h"
#include "cc/output/context_provider.h"
#include "cc/output/output_surface.h"
#include "cc/test/fake_video_frame_provider.h"
@@ -76,5 +77,22 @@ TEST(VideoLayerImplTest, Occlusion) {
}
}
+TEST(VideoLayerImplTest, DidBecomeActiveShouldSetActiveVideoLayer) {
+ LayerTestCommon::LayerImplTest impl;
+ DebugScopedSetImplThreadAndMainThreadBlocked thread(impl.proxy());
+
+ FakeVideoFrameProvider provider;
+ VideoLayerImpl* video_layer_impl =
+ impl.AddChildToRoot<VideoLayerImpl>(&provider);
+
+ VideoFrameProviderClientImpl* client =
+ static_cast<VideoFrameProviderClientImpl*>(provider.client());
+ ASSERT_TRUE(client);
+ EXPECT_FALSE(client->active_video_layer());
+
+ video_layer_impl->DidBecomeActive();
+ EXPECT_EQ(video_layer_impl, client->active_video_layer());
+}
+
} // namespace
} // namespace cc
diff --git a/cc/test/fake_video_frame_provider.h b/cc/test/fake_video_frame_provider.h
index 972d8f8..fc462e4 100644
--- a/cc/test/fake_video_frame_provider.h
+++ b/cc/test/fake_video_frame_provider.h
@@ -21,6 +21,8 @@ class FakeVideoFrameProvider : public VideoFrameProvider {
virtual void PutCurrentFrame(const scoped_refptr<media::VideoFrame>&)
OVERRIDE {}
+ Client* client() { return client_; }
+
void set_frame(const scoped_refptr<media::VideoFrame>& frame) {
frame_ = frame;
}