mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
d0e246a6fc
- Bug 1198588 - Remove unused MSG-specific code from AudioStream. r=padenot (79bd29d60c) - Bug 1187195 - Remove all agents with null window. r=baku (c3733647bb) - Bug 1137151: Marked destructors of ref-counted audio-manager classes as protected, r=dhylands (d0b84530f6) - Bug 1179181 - Store separate volume setting into setting database. r=baku (a6cb4bab03) - Bug 1175447 - mono audio support. r=padenot, r=sotaro (ce011f6556) - Bug 1140763 - Build dom/media/gtest in unified mode; r=cpearce (b3061b094b) - Bug 1194442 - Code clean up of AudioManager r=alwu (d25f51cda2) - Bug 1137659 - Re-enable LogShake xpcshell tests on B2G Emulator debug. r=me (f8b037756a) - Bug 1136777 - Enable LogShake by default and listen for new content events. r=fabrice, r=gerard-majax (1cf207dbe8) - Bug 1101994 - Add a low-pass filter to LogShake's shake detection and refactor unit tests to be less redundant. r=mhenretty, r=gerard-majax (7f59e328ec) - Bug 1144499 - Consolidate two long-running tests in test_logshake_gonk into one test of equivalent strength. r=gerard-majax (765d0bc243) - Bug 1079763 - Compress logs produced by LogShake. r=gerard-majax (26e5ca1dec) - Bug 1181561 - Expose a Kill Switch enabling/disabling. r=dhylands, sr=sicking (03d2754eea) - Bug 1174682 - Rename logshake-screenshot to screenshot.png. r=gerard-majax (b6faaa3fc2) - Bug 1188999 - LogShake does not fetch about:memory reports. r=gerard-majax (03a75e6408) - let-var (1114e25a65) - Bug 1188487 - Add API to BrowserElement to mute and set volume. r=fabrice (3d49951639) - Bug 1195801 - Add GetStructuredData() method to Browser API. r=kanru, r=bholley (b4cc0cba61) - Bug 1167465 - Exposing Allowed Audio Channels in System App's Window, r=alwu, r=fabrice (e8d59eb0e1) - fix build (8a58b834fe) - Bug 1183301 - GetAllowedAudioChannels should not throw an exception if nsIFrameElement is not ready. r=baku (1adbb9b140) - Bug 1184821 - Use CheckAllPermissions in BrowserElement.webidl r=bz (65a22b5bc1) - Bug 1206212 - Remove AUDIO_STREAM_FM after KK r=alwu (4d83c541dc) - Bug 1131927 - [Automounter] Add reporter to get current information. r=dhylands (d5d2e94b8c) - Bug 1197689 - Avoid unnecessary sync IPC in AudioChannelManager ctor. r=baku (128abefeb6) - Bug 1208155 - Make hal functions explicit in AudioManager r=alwu (d320b83fa7) - Bug 1179691 - [Automounter] Fix the problem of get format and share request in the same time. r=dhylands (768ad35244) - Bug 1137151: Marked destructors of ref-counted auto-mounter classes as protected, r=dhylands (c8cf90bdff) - Bug 1158047 - [AutoMounter] Resolve the problem of stucking in UMS_CONFIGURING state. r=dhylands (793f023fd2) - Bug 1012403 - Reenable SettingsService chrome tests, on B2G only; a=TEST-ONLY (aa8c416f75) - Bug 1196358 - update volume setting to database when the volume changing. r=sotaro. (5227fca7f7) - let-var (ca6890c85b) - Bug 1178081 - Make ro.product.manufacturer and ro.product.device available through settings. r=fabrice (fe962dfe41) - Bug 1206741 - [OTA] Make URL pref changes overwrite B2G's setting. r=fabrice f=gerard-majax (df8bf913ae) - Bug 1196884 - Disable device discovery (again) r=gerard-majax (9f11b3fa9d) - Bug 1178512 - [Metrics] Make the developer HUD send Advanced Telemetry events. r=janx (ddc3643e4e) - Bug 1177143 - Throttle HUD memory collection to 2 seconds. r=jryans (94fea375a8) - Bug 1190622 - [Telemetry] Report USS memory at time of performance marks r=jryans (fd7713fda0) - missing of Bug 1183101 - Collect Histogram Data from Gecko and send to Telemetry Server. r=janx (176b076539) - Bug 1176992 - Allow hud.js to support custom metrics with exponential and counter histograms. r=janx (c536b35be1) - Bug 1198517 - [Metrics] Histogram support for user-timing-based metrics. r=janx (549741a1e4) - Bug 1180793 - [Metrics] Hud should report specific app for those Apps housed under 'Communications'. r=janx (93407f1873) - Bug 1189871 - Add event to add/remove permissions for Graphene. r=fabrice (004144b5ba) - let-var (8c98d39873) - Bug 1160923 - [B2G] Waiting for explicit mozContentEvent before sending out mozChromeEvents, r=vingtetun, f=ochaumeau (63fc3b5ea8) - missing bits of 1177143 and cleanup (339e589ba1) - Bug 1188762 - Use mozSystemWindowChromeEvent to instead of mozChromeEvent to send system-audiochannel-state-changed event. r=alwu (d107f0caab) - Bug 1192122 - Safe mode startup, Part 1: check the power key state at startup r=mwu (90af9b56c0) - Bug 1192122 - Safe mode startup, Part 2: shell.js hook r=ferjm (02676818ff) - Bug 1156715 - Create shell-remote for launching system-remote, r=fabrice (43b18841c9) - let-var (e0ed7d020c)
515 lines
14 KiB
C++
515 lines
14 KiB
C++
/* 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 "BrowserElementAudioChannel.h"
|
|
|
|
#include "mozilla/Services.h"
|
|
#include "mozilla/dom/BrowserElementAudioChannelBinding.h"
|
|
#include "mozilla/dom/DOMRequest.h"
|
|
#include "mozilla/dom/ToJSValue.h"
|
|
#include "AudioChannelService.h"
|
|
#include "nsIBrowserElementAPI.h"
|
|
#include "nsIDocShell.h"
|
|
#include "nsIDOMDOMRequest.h"
|
|
#include "nsIObserverService.h"
|
|
#include "nsISupportsPrimitives.h"
|
|
#include "nsITabParent.h"
|
|
#include "nsPIDOMWindow.h"
|
|
|
|
namespace {
|
|
|
|
void
|
|
AssertIsInMainProcess()
|
|
{
|
|
MOZ_ASSERT(XRE_GetProcessType() == GeckoProcessType_Default);
|
|
}
|
|
|
|
} // anonymous namespace
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
NS_IMPL_ADDREF_INHERITED(BrowserElementAudioChannel, DOMEventTargetHelper)
|
|
NS_IMPL_RELEASE_INHERITED(BrowserElementAudioChannel, DOMEventTargetHelper)
|
|
|
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(BrowserElementAudioChannel)
|
|
NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
|
|
NS_INTERFACE_MAP_ENTRY(nsIObserver)
|
|
NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_INHERITED(BrowserElementAudioChannel,
|
|
DOMEventTargetHelper,
|
|
mFrameLoader,
|
|
mFrameWindow,
|
|
mTabParent,
|
|
mBrowserElementAPI)
|
|
|
|
/* static */ already_AddRefed<BrowserElementAudioChannel>
|
|
BrowserElementAudioChannel::Create(nsPIDOMWindow* aWindow,
|
|
nsIFrameLoader* aFrameLoader,
|
|
nsIBrowserElementAPI* aAPI,
|
|
AudioChannel aAudioChannel,
|
|
ErrorResult& aRv)
|
|
{
|
|
nsRefPtr<BrowserElementAudioChannel> ac =
|
|
new BrowserElementAudioChannel(aWindow, aFrameLoader, aAPI, aAudioChannel);
|
|
|
|
aRv = ac->Initialize();
|
|
if (NS_WARN_IF(aRv.Failed())) {
|
|
return nullptr;
|
|
}
|
|
|
|
return ac.forget();
|
|
}
|
|
|
|
BrowserElementAudioChannel::BrowserElementAudioChannel(
|
|
nsPIDOMWindow* aWindow,
|
|
nsIFrameLoader* aFrameLoader,
|
|
nsIBrowserElementAPI* aAPI,
|
|
AudioChannel aAudioChannel)
|
|
: DOMEventTargetHelper(aWindow)
|
|
, mFrameLoader(aFrameLoader)
|
|
, mBrowserElementAPI(aAPI)
|
|
, mAudioChannel(aAudioChannel)
|
|
, mState(eStateUnknown)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
AssertIsInMainProcess();
|
|
|
|
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
|
|
if (obs) {
|
|
nsAutoString name;
|
|
AudioChannelService::GetAudioChannelString(aAudioChannel, name);
|
|
|
|
nsAutoCString topic;
|
|
topic.Assign("audiochannel-activity-");
|
|
topic.Append(NS_ConvertUTF16toUTF8(name));
|
|
|
|
obs->AddObserver(this, topic.get(), true);
|
|
}
|
|
}
|
|
|
|
BrowserElementAudioChannel::~BrowserElementAudioChannel()
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
AssertIsInMainProcess();
|
|
|
|
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
|
|
if (obs) {
|
|
nsAutoString name;
|
|
AudioChannelService::GetAudioChannelString(mAudioChannel, name);
|
|
|
|
nsAutoCString topic;
|
|
topic.Assign("audiochannel-activity-");
|
|
topic.Append(NS_ConvertUTF16toUTF8(name));
|
|
|
|
obs->RemoveObserver(this, topic.get());
|
|
}
|
|
}
|
|
|
|
nsresult
|
|
BrowserElementAudioChannel::Initialize()
|
|
{
|
|
if (!mFrameLoader) {
|
|
nsCOMPtr<nsPIDOMWindow> window = GetOwner();
|
|
if (!window) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
mFrameWindow = window->GetScriptableTop();
|
|
mFrameWindow = mFrameWindow->GetOuterWindow();
|
|
return NS_OK;
|
|
}
|
|
|
|
nsCOMPtr<nsIDocShell> docShell;
|
|
nsresult rv = mFrameLoader->GetDocShell(getter_AddRefs(docShell));
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
return rv;
|
|
}
|
|
|
|
if (docShell) {
|
|
nsCOMPtr<nsPIDOMWindow> window = docShell->GetWindow();
|
|
if (!window) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
mFrameWindow = window->GetScriptableTop();
|
|
mFrameWindow = mFrameWindow->GetOuterWindow();
|
|
return NS_OK;
|
|
}
|
|
|
|
rv = mFrameLoader->GetTabParent(getter_AddRefs(mTabParent));
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
return rv;
|
|
}
|
|
|
|
MOZ_ASSERT(mTabParent);
|
|
return NS_OK;
|
|
}
|
|
|
|
JSObject*
|
|
BrowserElementAudioChannel::WrapObject(JSContext *aCx,
|
|
JS::Handle<JSObject*> aGivenProto)
|
|
{
|
|
return BrowserElementAudioChannelBinding::Wrap(aCx, this, aGivenProto);
|
|
}
|
|
|
|
AudioChannel
|
|
BrowserElementAudioChannel::Name() const
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
AssertIsInMainProcess();
|
|
|
|
return mAudioChannel;
|
|
}
|
|
|
|
namespace {
|
|
|
|
class BaseRunnable : public nsRunnable
|
|
{
|
|
protected:
|
|
nsCOMPtr<nsPIDOMWindow> mParentWindow;
|
|
nsCOMPtr<nsPIDOMWindow> mFrameWindow;
|
|
nsRefPtr<DOMRequest> mRequest;
|
|
AudioChannel mAudioChannel;
|
|
|
|
virtual void DoWork(AudioChannelService* aService,
|
|
JSContext* aCx) = 0;
|
|
|
|
public:
|
|
BaseRunnable(nsPIDOMWindow* aParentWindow, nsPIDOMWindow* aFrameWindow,
|
|
DOMRequest* aRequest, AudioChannel aAudioChannel)
|
|
: mParentWindow(aParentWindow)
|
|
, mFrameWindow(aFrameWindow)
|
|
, mRequest(aRequest)
|
|
, mAudioChannel(aAudioChannel)
|
|
{}
|
|
|
|
NS_IMETHODIMP Run() override
|
|
{
|
|
nsRefPtr<AudioChannelService> service = AudioChannelService::GetOrCreate();
|
|
MOZ_ASSERT(service);
|
|
|
|
AutoJSAPI jsapi;
|
|
if (!jsapi.Init(mParentWindow)) {
|
|
mRequest->FireError(NS_ERROR_FAILURE);
|
|
return NS_OK;
|
|
}
|
|
|
|
DoWork(service, jsapi.cx());
|
|
return NS_OK;
|
|
}
|
|
};
|
|
|
|
class GetVolumeRunnable final : public BaseRunnable
|
|
{
|
|
public:
|
|
GetVolumeRunnable(nsPIDOMWindow* aParentWindow, nsPIDOMWindow* aFrameWindow,
|
|
DOMRequest* aRequest, AudioChannel aAudioChannel)
|
|
: BaseRunnable(aParentWindow, aFrameWindow, aRequest, aAudioChannel)
|
|
{}
|
|
|
|
protected:
|
|
virtual void DoWork(AudioChannelService* aService, JSContext* aCx) override
|
|
{
|
|
float volume = aService->GetAudioChannelVolume(mFrameWindow, mAudioChannel);
|
|
|
|
JS::Rooted<JS::Value> value(aCx);
|
|
if (!ToJSValue(aCx, volume, &value)) {
|
|
mRequest->FireError(NS_ERROR_FAILURE);
|
|
return;
|
|
}
|
|
|
|
mRequest->FireSuccess(value);
|
|
}
|
|
};
|
|
|
|
class GetMutedRunnable final : public BaseRunnable
|
|
{
|
|
public:
|
|
GetMutedRunnable(nsPIDOMWindow* aParentWindow, nsPIDOMWindow* aFrameWindow,
|
|
DOMRequest* aRequest, AudioChannel aAudioChannel)
|
|
: BaseRunnable(aParentWindow, aFrameWindow, aRequest, aAudioChannel)
|
|
{}
|
|
|
|
protected:
|
|
virtual void DoWork(AudioChannelService* aService, JSContext* aCx) override
|
|
{
|
|
bool muted = aService->GetAudioChannelMuted(mFrameWindow, mAudioChannel);
|
|
|
|
JS::Rooted<JS::Value> value(aCx);
|
|
if (!ToJSValue(aCx, muted, &value)) {
|
|
mRequest->FireError(NS_ERROR_FAILURE);
|
|
return;
|
|
}
|
|
|
|
mRequest->FireSuccess(value);
|
|
}
|
|
};
|
|
|
|
class IsActiveRunnable final : public BaseRunnable
|
|
{
|
|
bool mActive;
|
|
bool mValueKnown;
|
|
|
|
public:
|
|
IsActiveRunnable(nsPIDOMWindow* aParentWindow, nsPIDOMWindow* aFrameWindow,
|
|
DOMRequest* aRequest, AudioChannel aAudioChannel,
|
|
bool aActive)
|
|
: BaseRunnable(aParentWindow, aFrameWindow, aRequest, aAudioChannel)
|
|
, mActive(aActive)
|
|
, mValueKnown(true)
|
|
{}
|
|
|
|
IsActiveRunnable(nsPIDOMWindow* aParentWindow, nsPIDOMWindow* aFrameWindow,
|
|
DOMRequest* aRequest, AudioChannel aAudioChannel)
|
|
: BaseRunnable(aParentWindow, aFrameWindow, aRequest, aAudioChannel)
|
|
, mActive(true)
|
|
, mValueKnown(false)
|
|
{}
|
|
|
|
protected:
|
|
virtual void DoWork(AudioChannelService* aService, JSContext* aCx) override
|
|
{
|
|
if (!mValueKnown) {
|
|
mActive = aService->IsAudioChannelActive(mFrameWindow, mAudioChannel);
|
|
}
|
|
|
|
JS::Rooted<JS::Value> value(aCx);
|
|
if (!ToJSValue(aCx, mActive, &value)) {
|
|
mRequest->FireError(NS_ERROR_FAILURE);
|
|
return;
|
|
}
|
|
|
|
mRequest->FireSuccess(value);
|
|
}
|
|
};
|
|
|
|
class FireSuccessRunnable final : public BaseRunnable
|
|
{
|
|
public:
|
|
FireSuccessRunnable(nsPIDOMWindow* aParentWindow, nsPIDOMWindow* aFrameWindow,
|
|
DOMRequest* aRequest, AudioChannel aAudioChannel)
|
|
: BaseRunnable(aParentWindow, aFrameWindow, aRequest, aAudioChannel)
|
|
{}
|
|
|
|
protected:
|
|
virtual void DoWork(AudioChannelService* aService, JSContext* aCx) override
|
|
{
|
|
JS::Rooted<JS::Value> value(aCx);
|
|
mRequest->FireSuccess(value);
|
|
}
|
|
};
|
|
|
|
} // anonymous namespace
|
|
|
|
already_AddRefed<dom::DOMRequest>
|
|
BrowserElementAudioChannel::GetVolume(ErrorResult& aRv)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
AssertIsInMainProcess();
|
|
|
|
if (!mFrameWindow) {
|
|
nsCOMPtr<nsIDOMDOMRequest> request;
|
|
aRv = mBrowserElementAPI->GetAudioChannelVolume((uint32_t)mAudioChannel,
|
|
getter_AddRefs(request));
|
|
if (NS_WARN_IF(aRv.Failed())) {
|
|
return nullptr;
|
|
}
|
|
|
|
return request.forget().downcast<DOMRequest>();
|
|
}
|
|
|
|
nsRefPtr<DOMRequest> domRequest = new DOMRequest(GetOwner());
|
|
|
|
nsCOMPtr<nsIRunnable> runnable =
|
|
new GetVolumeRunnable(GetOwner(), mFrameWindow, domRequest, mAudioChannel);
|
|
NS_DispatchToMainThread(runnable);
|
|
|
|
return domRequest.forget();
|
|
}
|
|
|
|
already_AddRefed<dom::DOMRequest>
|
|
BrowserElementAudioChannel::SetVolume(float aVolume, ErrorResult& aRv)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
AssertIsInMainProcess();
|
|
|
|
if (!mFrameWindow) {
|
|
nsCOMPtr<nsIDOMDOMRequest> request;
|
|
aRv = mBrowserElementAPI->SetAudioChannelVolume((uint32_t)mAudioChannel,
|
|
aVolume,
|
|
getter_AddRefs(request));
|
|
if (NS_WARN_IF(aRv.Failed())) {
|
|
return nullptr;
|
|
}
|
|
|
|
return request.forget().downcast<DOMRequest>();
|
|
}
|
|
|
|
nsRefPtr<AudioChannelService> service = AudioChannelService::GetOrCreate();
|
|
MOZ_ASSERT(service);
|
|
|
|
service->SetAudioChannelVolume(mFrameWindow, mAudioChannel, aVolume);
|
|
|
|
nsRefPtr<DOMRequest> domRequest = new DOMRequest(GetOwner());
|
|
nsCOMPtr<nsIRunnable> runnable = new FireSuccessRunnable(GetOwner(),
|
|
mFrameWindow,
|
|
domRequest,
|
|
mAudioChannel);
|
|
NS_DispatchToMainThread(runnable);
|
|
|
|
return domRequest.forget();
|
|
}
|
|
|
|
already_AddRefed<dom::DOMRequest>
|
|
BrowserElementAudioChannel::GetMuted(ErrorResult& aRv)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
AssertIsInMainProcess();
|
|
|
|
if (!mFrameWindow) {
|
|
nsCOMPtr<nsIDOMDOMRequest> request;
|
|
aRv = mBrowserElementAPI->GetAudioChannelMuted((uint32_t)mAudioChannel,
|
|
getter_AddRefs(request));
|
|
if (NS_WARN_IF(aRv.Failed())) {
|
|
return nullptr;
|
|
}
|
|
|
|
return request.forget().downcast<DOMRequest>();
|
|
}
|
|
|
|
nsRefPtr<DOMRequest> domRequest = new DOMRequest(GetOwner());
|
|
|
|
nsCOMPtr<nsIRunnable> runnable =
|
|
new GetMutedRunnable(GetOwner(), mFrameWindow, domRequest, mAudioChannel);
|
|
NS_DispatchToMainThread(runnable);
|
|
|
|
return domRequest.forget();
|
|
}
|
|
|
|
already_AddRefed<dom::DOMRequest>
|
|
BrowserElementAudioChannel::SetMuted(bool aMuted, ErrorResult& aRv)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
AssertIsInMainProcess();
|
|
|
|
if (!mFrameWindow) {
|
|
nsCOMPtr<nsIDOMDOMRequest> request;
|
|
aRv = mBrowserElementAPI->SetAudioChannelMuted((uint32_t)mAudioChannel,
|
|
aMuted,
|
|
getter_AddRefs(request));
|
|
if (NS_WARN_IF(aRv.Failed())) {
|
|
return nullptr;
|
|
}
|
|
|
|
return request.forget().downcast<DOMRequest>();
|
|
}
|
|
|
|
nsRefPtr<AudioChannelService> service = AudioChannelService::GetOrCreate();
|
|
MOZ_ASSERT(service);
|
|
|
|
service->SetAudioChannelMuted(mFrameWindow, mAudioChannel, aMuted);
|
|
|
|
nsRefPtr<DOMRequest> domRequest = new DOMRequest(GetOwner());
|
|
nsCOMPtr<nsIRunnable> runnable = new FireSuccessRunnable(GetOwner(),
|
|
mFrameWindow,
|
|
domRequest,
|
|
mAudioChannel);
|
|
NS_DispatchToMainThread(runnable);
|
|
|
|
return domRequest.forget();
|
|
}
|
|
|
|
already_AddRefed<dom::DOMRequest>
|
|
BrowserElementAudioChannel::IsActive(ErrorResult& aRv)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
AssertIsInMainProcess();
|
|
|
|
if (mState != eStateUnknown) {
|
|
nsRefPtr<DOMRequest> domRequest = new DOMRequest(GetOwner());
|
|
|
|
nsCOMPtr<nsIRunnable> runnable =
|
|
new IsActiveRunnable(GetOwner(), mFrameWindow, domRequest, mAudioChannel,
|
|
mState == eStateActive);
|
|
NS_DispatchToMainThread(runnable);
|
|
|
|
return domRequest.forget();
|
|
}
|
|
|
|
if (!mFrameWindow) {
|
|
nsCOMPtr<nsIDOMDOMRequest> request;
|
|
aRv = mBrowserElementAPI->IsAudioChannelActive((uint32_t)mAudioChannel,
|
|
getter_AddRefs(request));
|
|
if (NS_WARN_IF(aRv.Failed())) {
|
|
return nullptr;
|
|
}
|
|
|
|
return request.forget().downcast<DOMRequest>();
|
|
}
|
|
|
|
nsRefPtr<DOMRequest> domRequest = new DOMRequest(GetOwner());
|
|
|
|
nsCOMPtr<nsIRunnable> runnable =
|
|
new IsActiveRunnable(GetOwner(), mFrameWindow, domRequest, mAudioChannel);
|
|
NS_DispatchToMainThread(runnable);
|
|
|
|
return domRequest.forget();
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
BrowserElementAudioChannel::Observe(nsISupports* aSubject, const char* aTopic,
|
|
const char16_t* aData)
|
|
{
|
|
nsAutoString name;
|
|
AudioChannelService::GetAudioChannelString(mAudioChannel, name);
|
|
|
|
nsAutoCString topic;
|
|
topic.Assign("audiochannel-activity-");
|
|
topic.Append(NS_ConvertUTF16toUTF8(name));
|
|
|
|
if (strcmp(topic.get(), aTopic)) {
|
|
return NS_OK;
|
|
}
|
|
|
|
// Message received from the child.
|
|
if (!mFrameWindow) {
|
|
if (mTabParent == aSubject) {
|
|
ProcessStateChanged(aData);
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
nsCOMPtr<nsISupportsPRUint64> wrapper = do_QueryInterface(aSubject);
|
|
if (NS_WARN_IF(!wrapper)) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
uint64_t windowID;
|
|
nsresult rv = wrapper->GetData(&windowID);
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
return rv;
|
|
}
|
|
|
|
if (windowID != mFrameWindow->WindowID()) {
|
|
return NS_OK;
|
|
}
|
|
|
|
ProcessStateChanged(aData);
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
BrowserElementAudioChannel::ProcessStateChanged(const char16_t* aData)
|
|
{
|
|
nsAutoString value(aData);
|
|
mState = value.EqualsASCII("active") ? eStateActive : eStateInactive;
|
|
DispatchTrustedEvent(NS_LITERAL_STRING("activestatechanged"));
|
|
}
|
|
|
|
} // dom namespace
|
|
} // mozilla namespace
|