Files
palemoon27/dom/tv/TVTuner.cpp
T
roytam1 fa9ed1e11b import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1166942 - Add logging of color layer bounds. r=nical (442de4b6c)
- Bug 1152109 - Don't clear plugin data cache in ShadowLayers code, we need to resend this during repaints that do not involve reflow. r=roc (8670e73f9)
- Bug 1158122 - Remove all occurences of nsIntRect in gfx/layers/composite. r=nical (dcfa2050a)
- Bug 1158122 - Remove all occurences of nsIntRect in gfx/ipc/. r=nical (1ca3800b5)
- Bug 1158122 - Remove all occurences of nsIntRect in gfx/gl/. r=nical (187d70360)
- Bug 1158122 - Remove all occurences of nsIntRect in gfx/thebes/. r=nical (487ab747c)
- Bug 1155621 - Remove no-op gfx2DGlue conversion helpers. r=Bas (f2ea364d4)
- Bug 1158122 - Remove some occurences of nsIntRect in gfx/layers/. r=nical (b1bb2e736)
- Bug 1158122 - Remove all occurences of nsIntRect in gfx/layers/client. r=nical (f0e71c984)
- Bug 1158122 - Remove the remaining occurences of nsIntRect in gfx/layers. r=nical (571ff6de0)
- Bug 1148350 - Add a test. r=botond (226b59773)
- Bug 1158122 - Remove most occurences of nsIntRect in gfx/tests. r=nical (cb3b2541c)
- Bug 1032848 - Part 1: Implement WebIDL for HTMLCanvasElement::CaptureStream. r=smaug, r=mt (210e34454)
- Bug 1032848 - Part 2: Implement HTMLCanvasElement::CaptureStream. r=mt, r=jesup, r=jgilbert, r=gwright (bec93b4d3)
- Bug 1032848 followup: Add 'override' annotation to Notify() method in CanvasCaptureMediaStream.cpp. rs=ehsan (9866fd266)
- Bug 1032848 - Part 3: Add tests for HTMLCanvasElement::CaptureStream. r=mt, r=jgilbert, r=jesup (bde68ba7c)
- Bug 987498 - Part 1 - Layers support OverlayImage. r=roc (8b22b789f)
- Bug 987498 - Part 2 - HTMLMediaElement supports playback OverlayImage. r=roc (247dc15a2)
- Bug 987498 - Part 3 - Implement DOMHwMediaStream. r=roc (f0d9de519)
- Bug 987498 - Part 4 -Implement SetImageSize on DOMHwMediaStream. r=roc (850cf6ad0)
- Bug 1147194 - Do scroll info layer hoisting when building the display list. r=tn (64ae65e97)
- Bug 1161389 - Skip AccessibleCaret frame if nsDisplayListBuilder doesn't build caret. r=roc (0e8328488)
- Bug 1068881 (Part 2) - Add reftests for rounding image dest rects to zero size. r=roc (00202564b)
- Bug 1164227 - Don't allow invalid region simplification to invalidate unchanged scrolled contents. r=roc (3cde9cd56)
- Bug 1148022 - When frame metrics are attached to the container layer of the root scroll frame, make sure that its scroll frame is active. r=tn (5369f9175)
- Bug 1154478 - Really force-enable the event-regions code when APZ is enabled. r=tn (e7ba54c3d)
- Move AsyncPanZoomAnimation into its own header. (bug 1139220 part 1, r=kats) (e06fd8854)
- Bug 1139180 - Add BUG_COMPONENT metadata to moz.build for files in layout/. r=roc (468dedf02)
- Factor the guts of AsyncScroll into a base helper class. (bug 1139220 part 2, r=kgilbert) (1719bcba6)
- Use the main-thread key spline animation logic for Desktop APZ. (bug 1139220 part 3, r=kats,kgilbert) (84a1d8948)
- Bug 1147038. Use the correct clip for root scroll frames in root content documents. r=mstange (cae882bdf)
- Use Maybe to communicate the APZ scrollframe clip. (bug 1148582 part 1, r=mstange) (d22c5cfeb)
2020-12-03 09:53:51 +08:00

237 lines
6.1 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 "DOMMediaStream.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/TVCurrentSourceChangedEvent.h"
#include "mozilla/dom/TVServiceCallbacks.h"
#include "mozilla/dom/TVServiceFactory.h"
#include "mozilla/dom/TVSource.h"
#include "mozilla/dom/TVUtils.h"
#include "nsISupportsPrimitives.h"
#include "nsITVService.h"
#include "nsServiceManagerUtils.h"
#include "TVTuner.h"
namespace mozilla {
namespace dom {
NS_IMPL_CYCLE_COLLECTION_INHERITED(TVTuner, DOMEventTargetHelper,
mTVService, mStream, mCurrentSource, mSources)
NS_IMPL_ADDREF_INHERITED(TVTuner, DOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(TVTuner, DOMEventTargetHelper)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TVTuner)
NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
TVTuner::TVTuner(nsPIDOMWindow* aWindow)
: DOMEventTargetHelper(aWindow)
{
}
TVTuner::~TVTuner()
{
}
/* static */ already_AddRefed<TVTuner>
TVTuner::Create(nsPIDOMWindow* aWindow,
nsITVTunerData* aData)
{
nsRefPtr<TVTuner> tuner = new TVTuner(aWindow);
return (tuner->Init(aData)) ? tuner.forget() : nullptr;
}
bool
TVTuner::Init(nsITVTunerData* aData)
{
NS_ENSURE_TRUE(aData, false);
nsresult rv = aData->GetId(mId);
NS_ENSURE_SUCCESS(rv, false);
if (NS_WARN_IF(mId.IsEmpty())) {
return false;
}
uint32_t count;
char** supportedSourceTypes;
rv = aData->GetSupportedSourceTypes(&count, &supportedSourceTypes);
NS_ENSURE_SUCCESS(rv, false);
for (uint32_t i = 0; i < count; i++) {
TVSourceType sourceType = ToTVSourceType(supportedSourceTypes[i]);
if (NS_WARN_IF(sourceType == TVSourceType::EndGuard_)) {
continue;
}
// Generate the source instance based on the supported source type.
nsRefPtr<TVSource> source = TVSource::Create(GetOwner(), sourceType, this);
if (NS_WARN_IF(!source)) {
continue;
}
mSupportedSourceTypes.AppendElement(sourceType);
mSources.AppendElement(source);
}
NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(count, supportedSourceTypes);
mTVService = TVServiceFactory::AutoCreateTVService();
NS_ENSURE_TRUE(mTVService, false);
return true;
}
/* virtual */ JSObject*
TVTuner::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
{
return TVTunerBinding::Wrap(aCx, this, aGivenProto);
}
nsresult
TVTuner::SetCurrentSource(TVSourceType aSourceType)
{
ErrorResult error;
if (mCurrentSource) {
if (aSourceType == mCurrentSource->Type()) {
// No actual change.
return NS_OK;
}
// No need to stay tuned for non-current sources.
nsresult rv = mCurrentSource->UnsetCurrentChannel();
if (NS_FAILED(rv)) {
return rv;
}
}
for (uint32_t i = 0; i < mSources.Length(); i++) {
if (aSourceType == mSources[i]->Type()) {
mCurrentSource = mSources[i];
break;
}
}
nsresult rv = InitMediaStream();
if (NS_FAILED(rv)) {
return rv;
}
return DispatchCurrentSourceChangedEvent(mCurrentSource);
}
nsresult
TVTuner::DispatchTVEvent(nsIDOMEvent* aEvent)
{
return DispatchTrustedEvent(aEvent);
}
void
TVTuner::GetSupportedSourceTypes(nsTArray<TVSourceType>& aSourceTypes,
ErrorResult& aRv) const
{
aSourceTypes = mSupportedSourceTypes;
}
already_AddRefed<Promise>
TVTuner::GetSources(ErrorResult& aRv)
{
nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetOwner());
MOZ_ASSERT(global);
nsRefPtr<Promise> promise = Promise::Create(global, aRv);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
promise->MaybeResolve(mSources);
return promise.forget();
}
already_AddRefed<Promise>
TVTuner::SetCurrentSource(const TVSourceType aSourceType, ErrorResult& aRv)
{
nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(GetOwner());
MOZ_ASSERT(global);
nsRefPtr<Promise> promise = Promise::Create(global, aRv);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
// |SetCurrentSource(const TVSourceType)| will be called once |notifySuccess|
// of the callback is invoked.
nsCOMPtr<nsITVServiceCallback> callback =
new TVServiceSourceSetterCallback(this, promise, aSourceType);
nsresult rv = mTVService->SetSource(mId, ToTVSourceTypeStr(aSourceType), callback);
if (NS_WARN_IF(NS_FAILED(rv))) {
promise->MaybeReject(NS_ERROR_DOM_ABORT_ERR);
}
return promise.forget();
}
void
TVTuner::GetId(nsAString& aId) const
{
aId = mId;
}
already_AddRefed<TVSource>
TVTuner::GetCurrentSource() const
{
nsRefPtr<TVSource> currentSource = mCurrentSource;
return currentSource.forget();
}
already_AddRefed<DOMMediaStream>
TVTuner::GetStream() const
{
nsRefPtr<DOMMediaStream> stream = mStream;
return stream.forget();
}
nsresult
TVTuner::InitMediaStream()
{
nsCOMPtr<nsIDOMWindow> window = do_QueryInterface(GetOwner());
nsRefPtr<DOMHwMediaStream> stream = DOMHwMediaStream::CreateHwStream(window);
mStream = stream.forget();
return NS_OK;
}
nsresult
TVTuner::DispatchCurrentSourceChangedEvent(TVSource* aSource)
{
TVCurrentSourceChangedEventInit init;
init.mSource = aSource;
nsCOMPtr<nsIDOMEvent> event =
TVCurrentSourceChangedEvent::Constructor(this,
NS_LITERAL_STRING("currentsourcechanged"),
init);
nsCOMPtr<nsIRunnable> runnable =
NS_NewRunnableMethodWithArg<nsCOMPtr<nsIDOMEvent>>(this,
&TVTuner::DispatchTVEvent,
event);
return NS_DispatchToCurrentThread(runnable);
}
nsresult
TVTuner::NotifyImageSizeChanged(uint32_t aWidth, uint32_t aHeight)
{
DOMHwMediaStream* hwMediaStream = mStream->AsDOMHwMediaStream();
if (hwMediaStream) {
hwMediaStream->SetImageSize(aWidth, aHeight);
}
return NS_OK;
}
} // namespace dom
} // namespace mozilla