From 7e2a39a4222b0bebb594a990834b926876248a27 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Mon, 2 Dec 2013 14:05:19 -0500 Subject: [PATCH] Backed out changesets 720a36d92d37 and c24da899172a (bug 926746) for frequent timeouts/hangs in test_dataChannel_basicAudio.html. --- .../media/webrtc/MediaEngineWebRTCAudio.cpp | 5 +- dom/base/nsContentPermissionHelper.cpp | 13 -- dom/media/MediaManager.cpp | 66 +++++---- dom/media/MediaManager.h | 69 +--------- widget/gonk/GonkPermission.cpp | 126 ------------------ widget/gonk/GonkPermission.h | 84 ------------ widget/gonk/moz.build | 2 - widget/gonk/nsAppShell.cpp | 2 - 8 files changed, 48 insertions(+), 319 deletions(-) delete mode 100644 widget/gonk/GonkPermission.cpp delete mode 100644 widget/gonk/GonkPermission.h diff --git a/content/media/webrtc/MediaEngineWebRTCAudio.cpp b/content/media/webrtc/MediaEngineWebRTCAudio.cpp index 25a2fa4957f..15125c1803e 100644 --- a/content/media/webrtc/MediaEngineWebRTCAudio.cpp +++ b/content/media/webrtc/MediaEngineWebRTCAudio.cpp @@ -284,16 +284,13 @@ MediaEngineWebRTCAudioSource::Init() return; } -#ifndef MOZ_B2G - // Because of the permission mechanism of B2G, we need to skip the status - // check here. bool avail = false; ptrVoEHw->GetRecordingDeviceStatus(avail); ptrVoEHw->Release(); if (!avail) { return; } -#endif // MOZ_B2G + // Set "codec" to PCM, 32kHz on 1 channel webrtc::VoECodec* ptrVoECodec; webrtc::CodecInst codec; diff --git a/dom/base/nsContentPermissionHelper.cpp b/dom/base/nsContentPermissionHelper.cpp index 4ddfbe51aeb..b4b3c87dca5 100644 --- a/dom/base/nsContentPermissionHelper.cpp +++ b/dom/base/nsContentPermissionHelper.cpp @@ -2,10 +2,6 @@ * 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/. */ -#ifdef MOZ_WIDGET_GONK -#include "GonkPermission.h" -#include "mozilla/dom/ContentParent.h" -#endif // MOZ_WIDGET_GONK #include "nsContentPermissionHelper.h" #include "nsIContentPermissionPrompt.h" #include "nsCOMPtr.h" @@ -18,7 +14,6 @@ using mozilla::unused; // using namespace mozilla::dom; -using namespace mozilla; nsContentPermissionRequestProxy::nsContentPermissionRequestProxy() { @@ -135,14 +130,6 @@ nsContentPermissionRequestProxy::Allow() return NS_ERROR_FAILURE; } -#ifdef MOZ_WIDGET_GONK - if (mType.Equals("audio-capture")) { - GonkPermissionService::GetInstance()->addGrantInfo( - "android.permission.RECORD_AUDIO", - static_cast(mParent->Manager())->Manager()->Pid()); - } -#endif - unused << ContentPermissionRequestParent::Send__delete__(mParent, true); mParent = nullptr; return NS_OK; diff --git a/dom/media/MediaManager.cpp b/dom/media/MediaManager.cpp index 027f9d9fa94..294dc56d9e9 100644 --- a/dom/media/MediaManager.cpp +++ b/dom/media/MediaManager.cpp @@ -182,34 +182,49 @@ CreateRecordingDeviceEventsSubject(nsPIDOMWindow* aWindow, return props.forget(); } -ErrorCallbackRunnable::ErrorCallbackRunnable( - already_AddRefed aSuccess, - already_AddRefed aError, - const nsAString& aErrorMsg, uint64_t aWindowID) - : mSuccess(aSuccess) - , mError(aError) - , mErrorMsg(aErrorMsg) - , mWindowID(aWindowID) - , mManager(MediaManager::GetInstance()) { - } - -NS_IMETHODIMP -ErrorCallbackRunnable::Run() +/** + * Send an error back to content. The error is the form a string. + * Do this only on the main thread. The success callback is also passed here + * so it can be released correctly. + */ +class ErrorCallbackRunnable : public nsRunnable { - // Only run if the window is still active. - NS_ASSERTION(NS_IsMainThread(), "Only call on main thread"); +public: + ErrorCallbackRunnable( + already_AddRefed aSuccess, + already_AddRefed aError, + const nsAString& aErrorMsg, uint64_t aWindowID) + : mSuccess(aSuccess) + , mError(aError) + , mErrorMsg(aErrorMsg) + , mWindowID(aWindowID) + , mManager(MediaManager::GetInstance()) {} - nsCOMPtr success(mSuccess); - nsCOMPtr error(mError); + NS_IMETHOD + Run() + { + // Only run if the window is still active. + NS_ASSERTION(NS_IsMainThread(), "Only call on main thread"); - if (!(mManager->IsWindowStillActive(mWindowID))) { + nsCOMPtr success(mSuccess); + nsCOMPtr error(mError); + + if (!(mManager->IsWindowStillActive(mWindowID))) { + return NS_OK; + } + // This is safe since we're on main-thread, and the windowlist can only + // be invalidated from the main-thread (see OnNavigation) + error->OnError(mErrorMsg); return NS_OK; } - // This is safe since we're on main-thread, and the windowlist can only - // be invalidated from the main-thread (see OnNavigation) - error->OnError(mErrorMsg); - return NS_OK; -} + +private: + already_AddRefed mSuccess; + already_AddRefed mError; + const nsString mErrorMsg; + uint64_t mWindowID; + nsRefPtr mManager; // get ref to this when creating the runnable +}; /** * Invoke the "onSuccess" callback in content. The callback will take a @@ -619,8 +634,7 @@ public: nsRefPtr runnable( new MediaOperationRunnable(MEDIA_START, mListener, trackunion, tracksAvailableCallback, - mAudioSource, mVideoSource, false, mWindowID, - mError.forget())); + mAudioSource, mVideoSource, false, mWindowID)); mediaThread->Dispatch(runnable, NS_DISPATCH_NORMAL); #ifdef MOZ_WEBRTC @@ -1768,7 +1782,7 @@ GetUserMediaCallbackMediaStreamListener::Invalidate() runnable = new MediaOperationRunnable(MEDIA_STOP, this, nullptr, nullptr, mAudioSource, mVideoSource, - mFinished, mWindowID, nullptr); + mFinished, mWindowID); mMediaThread->Dispatch(runnable, NS_DISPATCH_NORMAL); } diff --git a/dom/media/MediaManager.h b/dom/media/MediaManager.h index f8c71fee185..6e00da0079c 100644 --- a/dom/media/MediaManager.h +++ b/dom/media/MediaManager.h @@ -212,11 +212,9 @@ class GetUserMediaNotificationEvent: public nsRunnable GetUserMediaNotificationEvent(GetUserMediaStatus aStatus, already_AddRefed aStream, DOMMediaStream::OnTracksAvailableCallback* aOnTracksAvailableCallback, - bool aIsAudio, bool aIsVideo, uint64_t aWindowID, - already_AddRefed aError) + bool aIsAudio, bool aIsVideo, uint64_t aWindowID) : mStream(aStream), mOnTracksAvailableCallback(aOnTracksAvailableCallback), - mStatus(aStatus), mIsAudio(aIsAudio), mIsVideo(aIsVideo), mWindowID(aWindowID), - mError(aError) {} + mStatus(aStatus), mIsAudio(aIsAudio), mIsVideo(aIsVideo), mWindowID(aWindowID) {} virtual ~GetUserMediaNotificationEvent() { @@ -232,7 +230,6 @@ class GetUserMediaNotificationEvent: public nsRunnable bool mIsAudio; bool mIsVideo; uint64_t mWindowID; - nsRefPtr mError; }; typedef enum { @@ -240,42 +237,6 @@ typedef enum { MEDIA_STOP } MediaOperation; -class MediaManager; - -/** - * Send an error back to content. The error is the form a string. - * Do this only on the main thread. The success callback is also passed here - * so it can be released correctly. - */ -class ErrorCallbackRunnable : public nsRunnable -{ -public: - ErrorCallbackRunnable( - already_AddRefed aSuccess, - already_AddRefed aError, - const nsAString& aErrorMsg, uint64_t aWindowID); - NS_IMETHOD Run(); -private: - already_AddRefed mSuccess; - already_AddRefed mError; - const nsString mErrorMsg; - uint64_t mWindowID; - nsRefPtr mManager; // get ref to this when creating the runnable -}; - -class ReleaseMediaOperationResource : public nsRunnable -{ -public: - ReleaseMediaOperationResource(already_AddRefed aStream, - DOMMediaStream::OnTracksAvailableCallback* aOnTracksAvailableCallback): - mStream(aStream), - mOnTracksAvailableCallback(aOnTracksAvailableCallback) {} - NS_IMETHOD Run() MOZ_OVERRIDE {return NS_OK;} -private: - nsRefPtr mStream; - nsAutoPtr mOnTracksAvailableCallback; -}; - // Generic class for running long media operations like Start off the main // thread, and then (because nsDOMMediaStreams aren't threadsafe), // ProxyReleases mStream since it's cycle collected. @@ -290,8 +251,7 @@ public: MediaEngineSource* aAudioSource, MediaEngineSource* aVideoSource, bool aNeedsFinish, - uint64_t aWindowID, - already_AddRefed aError) + uint64_t aWindowID) : mType(aType) , mStream(aStream) , mOnTracksAvailableCallback(aOnTracksAvailableCallback) @@ -300,27 +260,13 @@ public: , mListener(aListener) , mFinish(aNeedsFinish) , mWindowID(aWindowID) - , mError(aError) - {} + {} ~MediaOperationRunnable() { // MediaStreams can be released on any thread. } - nsresult returnAndCallbackError(nsresult rv, const char* errorLog) - { - MM_LOG(("%s , rv=%d", errorLog, rv)); - NS_DispatchToMainThread(new ReleaseMediaOperationResource(mStream.forget(), - mOnTracksAvailableCallback.forget())); - nsString log; - - log.AssignASCII(errorLog, strlen(errorLog)); - NS_DispatchToMainThread(new ErrorCallbackRunnable(nullptr, mError.forget(), - log, mWindowID)); - return NS_OK; - } - NS_IMETHOD Run() MOZ_OVERRIDE { @@ -344,7 +290,7 @@ public: if (NS_SUCCEEDED(rv)) { expectedTracks |= DOMMediaStream::HINT_CONTENTS_AUDIO; } else { - return returnAndCallbackError(rv, "Starting audio failed"); + MM_LOG(("Starting audio failed, rv=%d",rv)); } } if (mVideoSource) { @@ -352,7 +298,7 @@ public: if (NS_SUCCEEDED(rv)) { expectedTracks |= DOMMediaStream::HINT_CONTENTS_VIDEO; } else { - return returnAndCallbackError(rv, "Starting video failed"); + MM_LOG(("Starting video failed, rv=%d",rv)); } } @@ -368,7 +314,7 @@ public: mOnTracksAvailableCallback.forget(), mAudioSource != nullptr, mVideoSource != nullptr, - mWindowID, mError.forget()); + mWindowID); NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL); } break; @@ -415,7 +361,6 @@ private: nsRefPtr mListener; // threadsafe bool mFinish; uint64_t mWindowID; - nsRefPtr mError; }; typedef nsTArray > StreamListeners; diff --git a/widget/gonk/GonkPermission.cpp b/widget/gonk/GonkPermission.cpp deleted file mode 100644 index faa0f15b1a6..00000000000 --- a/widget/gonk/GonkPermission.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2012 Mozilla Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include -#include -#include "GonkPermission.h" - -#undef LOG -#include -#define ALOGE(args...) __android_log_print(ANDROID_LOG_ERROR, "gonkperm" , ## args) - -using namespace android; -using namespace mozilla; - -bool -GonkPermissionService::checkPermission(const String16& permission, int32_t pid, - int32_t uid) -{ - if (0 == uid) - return true; - - // Camera/audio record permissions are only for apps with the - // "camera" permission. These apps are also the only apps granted - // the AID_SDCARD_RW supplemental group (bug 785592) - - if (uid < AID_APP) { - ALOGE("%s for pid=%d,uid=%d denied: not an app", - String8(permission).string(), pid, uid); - return false; - } - - String8 perm8(permission); - - if (perm8 != "android.permission.CAMERA" && - perm8 != "android.permission.RECORD_AUDIO") { - ALOGE("%s for pid=%d,uid=%d denied: unsupported permission", - String8(permission).string(), pid, uid); - return false; - } - - // Users granted the permission through a prompt dialog. - // Before permission managment of gUM is done, app cannot remember the - // permission. - PermissionGrant permGrant(perm8.string(), pid); - if (nsTArray::NoIndex != mGrantArray.IndexOf(permGrant)) { - mGrantArray.RemoveElement(permGrant); - return true; - } - - char filename[32]; - snprintf(filename, sizeof(filename), "/proc/%d/status", pid); - FILE *f = fopen(filename, "r"); - if (!f) { - ALOGE("%s for pid=%d,uid=%d denied: unable to open %s", - String8(permission).string(), pid, uid, filename); - return false; - } - - char line[80]; - while (fgets(line, sizeof(line), f)) { - char *save; - char *name = strtok_r(line, "\t", &save); - if (!name) - continue; - - if (strcmp(name, "Groups:")) - continue; - char *group; - while ((group = strtok_r(NULL, " \n", &save))) { - #define _STR(x) #x - #define STR(x) _STR(x) - if (!strcmp(group, STR(AID_SDCARD_RW))) { - fclose(f); - return true; - } - } - break; - } - fclose(f); - - ALOGE("%s for pid=%d,uid=%d denied: missing group", - String8(permission).string(), pid, uid); - return false; -} - -static GonkPermissionService* gGonkPermissionService = NULL; - -/* static */ -void -GonkPermissionService::instantiate() -{ - defaultServiceManager()->addService(String16(getServiceName()), - GetInstance()); -} - -/* static */ -GonkPermissionService* -GonkPermissionService::GetInstance() -{ - if (!gGonkPermissionService) { - gGonkPermissionService = new GonkPermissionService(); - } - return gGonkPermissionService; -} - -void -GonkPermissionService::addGrantInfo(const char* permission, int32_t pid) -{ - mGrantArray.AppendElement(PermissionGrant(permission, pid)); -} diff --git a/widget/gonk/GonkPermission.h b/widget/gonk/GonkPermission.h deleted file mode 100644 index 5e40b2a2779..00000000000 --- a/widget/gonk/GonkPermission.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2012 Mozilla Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef GONKPERMISSION_H -#define GONKPERMISSION_H - -#include -#include "nsString.h" -#include "nsTArray.h" - -namespace mozilla { -class PermissionGrant -{ -public: - PermissionGrant(const char* perm, int32_t p) : mPid(p) - { - mPermission.Assign(perm); - } - - PermissionGrant(const nsACString& permission, int32_t pid) : mPid(pid), - mPermission(permission) - { - } - - bool operator==(const PermissionGrant& other) const - { - return (mPid == other.pid() && mPermission.Equals(other.permission())); - } - - int32_t pid() const - { - return mPid; - } - - const nsACString& permission() const - { - return mPermission; - } - -private: - int32_t mPid; - nsCString mPermission; -}; - -class PermissionGrant; - -class GonkPermissionService : - public android::BinderService, - public android::BnPermissionController -{ -public: - virtual ~GonkPermissionService() {} - static GonkPermissionService* GetInstance(); - static const char *getServiceName() { - return "permission"; - } - - static void instantiate(); - - virtual android::status_t dump(int fd, const android::Vector& args) { - return android::NO_ERROR; - } - virtual bool checkPermission(const android::String16& permission, int32_t pid, - int32_t uid); - - void addGrantInfo(const char* permission, int32_t pid); -private: - GonkPermissionService(): android::BnPermissionController() {} - nsTArray mGrantArray; -}; -} // namespace mozilla -#endif // GONKPERMISSION_H diff --git a/widget/gonk/moz.build b/widget/gonk/moz.build index 22948131ea2..17bfac5c551 100644 --- a/widget/gonk/moz.build +++ b/widget/gonk/moz.build @@ -15,7 +15,6 @@ # limitations under the License. EXPORTS += [ - 'GonkPermission.h', 'OrientationObserver.h', ] @@ -47,7 +46,6 @@ SOURCES += [ 'Framebuffer.cpp', 'GfxInfo.cpp', 'GonkMemoryPressureMonitoring.cpp', - 'GonkPermission.cpp', 'HwcComposer2D.cpp', 'HwcUtils.cpp', 'nsAppShell.cpp', diff --git a/widget/gonk/nsAppShell.cpp b/widget/gonk/nsAppShell.cpp index 1466d2e9619..d4fe27f44ee 100644 --- a/widget/gonk/nsAppShell.cpp +++ b/widget/gonk/nsAppShell.cpp @@ -29,7 +29,6 @@ #include #include "base/basictypes.h" -#include "GonkPermission.h" #include "nscore.h" #ifdef MOZ_OMX_DECODER #include "MediaResourceManagerService.h" @@ -759,7 +758,6 @@ nsAppShell::Init() #if ANDROID_VERSION >= 18 android::FakeSurfaceComposer::instantiate(); #endif - GonkPermissionService::instantiate(); } nsCOMPtr obsServ = GetObserverService();