diff options
author | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-29 04:27:38 +0000 |
---|---|---|
committer | scherkus@chromium.org <scherkus@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-29 04:27:38 +0000 |
commit | 69fb3d53a0799a578d3564fd3735eb6e8c34d5b8 (patch) | |
tree | adc2667d80b02b0f0183f20adace0163bc101658 | |
parent | 8035e22f828c698aad23f8d44c9656f8a8aa97ee (diff) | |
download | chromium_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.cc | 2 | ||||
-rw-r--r-- | cc/layers/video_frame_provider_client_impl.h | 1 | ||||
-rw-r--r-- | cc/layers/video_layer_impl_unittest.cc | 18 | ||||
-rw-r--r-- | cc/test/fake_video_frame_provider.h | 2 |
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; } |