/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "ImageContainer.h" #include "MockMediaDecoderOwner.h" #include "TimeUnits.h" #include "VideoFrameContainer.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include "nsContentUtils.h" using namespace mozilla; using namespace mozilla::layers; using testing::InSequence; using testing::MockFunction; using testing::StrEq; TEST(TestVideoFrameContainer, UpdatePrincipalHandleForFrameID) { auto owner = std::make_unique(); PrincipalHandle principal = MakePrincipalHandle(nsContentUtils::GetSystemPrincipal()); RefPtr container = new VideoFrameContainer( owner.get(), MakeAndAddRef(ImageUsageType::VideoFrameContainer, ImageContainer::ASYNCHRONOUS)); MockFunction checkpoint; { InSequence s; EXPECT_CALL(checkpoint, Call(StrEq("id2 is first"))).Times(1); EXPECT_CALL(*owner, PrincipalHandleChangedForVideoFrameContainer( container.get(), principal)) .Times(1); } auto image = container->GetImageContainer()->CreatePlanarYCbCrImage(); AutoTArray images; images.AppendElements(2); TimeStamp timeStamp = TimeStamp::Now(); for (auto& imageRef : images) { imageRef.mFrameID = container->NewFrameID(); imageRef.mImage = image; imageRef.mTimeStamp = timeStamp; timeStamp += TimeDuration::FromSeconds(0.1); } gfx::IntSize intrinsicSize; container->SetCurrentFrames(intrinsicSize, images); ImageContainer::FrameID id2 = container->NewFrameID(); container->UpdatePrincipalHandleForFrameID(principal, id2); images.RemoveElementAt(0); auto image2 = images.AppendElement(); image2->mFrameID = id2; image2->mImage = image; image2->mTimeStamp = timeStamp; container->SetCurrentFrames(intrinsicSize, images); // Check no pending NotifyDecoderPrincipalChanged() event. NS_ProcessPendingEvents(nullptr); images.RemoveElementAt(0); container->SetCurrentFrames(intrinsicSize, images); checkpoint.Call("id2 is first"); // Process NotifyDecoderPrincipalChanged() event. NS_ProcessPendingEvents(nullptr); }