Bug 1311048 - Pick out Firefox windows as scary by pid (only OSX atm). r=jesup

MozReview-Commit-ID: DwUodsRWswm

--HG--
extra : rebase_source : 0ab4002dfbbb4a0cf0265764d22c598256198d82
This commit is contained in:
Jan-Ivar Bruaroey 2016-09-30 13:23:42 -04:00
Родитель fdf5c5ad8c
Коммит 409780816c
21 изменённых файлов: 90 добавлений и 41 удалений

Просмотреть файл

@ -386,7 +386,8 @@ CamerasChild::GetCaptureDevice(CaptureEngine aCapEngine,
unsigned int list_number, char* device_nameUTF8,
const unsigned int device_nameUTF8Length,
char* unique_idUTF8,
const unsigned int unique_idUTF8Length)
const unsigned int unique_idUTF8Length,
bool* scary)
{
LOG((__PRETTY_FUNCTION__));
nsCOMPtr<nsIRunnable> runnable =
@ -400,6 +401,9 @@ CamerasChild::GetCaptureDevice(CaptureEngine aCapEngine,
if (dispatcher.Success()) {
base::strlcpy(device_nameUTF8, mReplyDeviceName.get(), device_nameUTF8Length);
base::strlcpy(unique_idUTF8, mReplyDeviceID.get(), unique_idUTF8Length);
if (scary) {
*scary = mReplyScary;
}
LOG(("Got %s name %s id", device_nameUTF8, unique_idUTF8));
}
return dispatcher.ReturnValue();
@ -407,7 +411,8 @@ CamerasChild::GetCaptureDevice(CaptureEngine aCapEngine,
bool
CamerasChild::RecvReplyGetCaptureDevice(const nsCString& device_name,
const nsCString& device_id)
const nsCString& device_id,
const bool& scary)
{
LOG((__PRETTY_FUNCTION__));
MonitorAutoLock monitor(mReplyMonitor);
@ -415,6 +420,7 @@ CamerasChild::RecvReplyGetCaptureDevice(const nsCString& device_name,
mReplySuccess = true;
mReplyDeviceName = device_name;
mReplyDeviceID = device_id;
mReplyScary = scary;
monitor.Notify();
return true;
}

Просмотреть файл

@ -165,7 +165,8 @@ public:
virtual bool RecvReplyAllocateCaptureDevice(const int&) override;
virtual bool RecvReplyGetCaptureCapability(const CaptureCapability& capability) override;
virtual bool RecvReplyGetCaptureDevice(const nsCString& device_name,
const nsCString& device_id) override;
const nsCString& device_id,
const bool& scary) override;
virtual bool RecvReplyFailure(void) override;
virtual bool RecvReplySuccess(void) override;
virtual void ActorDestroy(ActorDestroyReason aWhy) override;
@ -195,7 +196,8 @@ public:
unsigned int list_number, char* device_nameUTF8,
const unsigned int device_nameUTF8Length,
char* unique_idUTF8,
const unsigned int unique_idUTF8Length);
const unsigned int unique_idUTF8Length,
bool* scary = nullptr);
void ShutdownAll();
int EnsureInitialized(CaptureEngine aCapEngine);
@ -239,6 +241,7 @@ private:
webrtc::CaptureCapability mReplyCapability;
nsCString mReplyDeviceName;
nsCString mReplyDeviceID;
bool mReplyScary;
};
} // namespace camera

Просмотреть файл

@ -680,20 +680,22 @@ CamerasParent::RecvGetCaptureDevice(const CaptureEngine& aCapEngine,
char deviceUniqueId[MediaEngineSource::kMaxUniqueIdLength];
nsCString name;
nsCString uniqueId;
int devicePid = 0;
int error = -1;
if (self->EnsureInitialized(aCapEngine)) {
error = self->mEngines[aCapEngine].mPtrViECapture->GetCaptureDevice(aListNumber,
deviceName,
sizeof(deviceName),
deviceUniqueId,
sizeof(deviceUniqueId));
sizeof(deviceUniqueId),
&devicePid);
}
if (!error) {
name.Assign(deviceName);
uniqueId.Assign(deviceUniqueId);
}
RefPtr<nsIRunnable> ipc_runnable =
media::NewRunnableFrom([self, error, name, uniqueId]() -> nsresult {
media::NewRunnableFrom([self, error, name, uniqueId, devicePid]() {
if (self->IsShuttingDown()) {
return NS_ERROR_FAILURE;
}
@ -702,9 +704,11 @@ CamerasParent::RecvGetCaptureDevice(const CaptureEngine& aCapEngine,
Unused << self->SendReplyFailure();
return NS_ERROR_FAILURE;
}
bool scary = (devicePid == getpid());
LOG(("Returning %s name %s id", name.get(), uniqueId.get()));
Unused << self->SendReplyGetCaptureDevice(name, uniqueId);
LOG(("Returning %s name %s id (pid = %d)%s", name.get(),
uniqueId.get(), devicePid, (scary? " (scary)" : "")));
Unused << self->SendReplyGetCaptureDevice(name, uniqueId, scary);
return NS_OK;
});
self->mPBackgroundThread->Dispatch(ipc_runnable, NS_DISPATCH_NORMAL);

Просмотреть файл

@ -36,7 +36,7 @@ child:
async ReplyNumberOfCapabilities(int numdev);
async ReplyAllocateCaptureDevice(int numdev);
async ReplyGetCaptureCapability(CaptureCapability cap);
async ReplyGetCaptureDevice(nsCString device_name, nsCString device_id);
async ReplyGetCaptureDevice(nsCString device_name, nsCString device_id, bool scary);
async ReplyFailure();
async ReplySuccess();
async __delete__();

Просмотреть файл

@ -52,7 +52,7 @@ MediaEngineRemoteVideoSource::Init()
&mozilla::camera::CamerasChild::GetCaptureDevice,
mCapEngine, mCaptureIndex,
deviceName, kMaxDeviceNameLength,
uniqueId, kMaxUniqueIdLength)) {
uniqueId, kMaxUniqueIdLength, nullptr)) {
LOG(("Error initializing RemoteVideoSource (GetCaptureDevice)"));
return;
}
@ -496,7 +496,7 @@ void MediaEngineRemoteVideoSource::Refresh(int aIndex) {
&mozilla::camera::CamerasChild::GetCaptureDevice,
mCapEngine, aIndex,
deviceName, sizeof(deviceName),
uniqueId, sizeof(uniqueId))) {
uniqueId, sizeof(uniqueId), nullptr)) {
return;
}

Просмотреть файл

@ -199,7 +199,7 @@ MediaEngineWebRTC::EnumerateVideoDevices(dom::MediaSourceEnum aMediaSource,
for (int i = 0; i < num; i++) {
char deviceName[MediaEngineSource::kMaxDeviceNameLength];
char uniqueId[MediaEngineSource::kMaxUniqueIdLength];
bool scaryWindow = false;
bool scarySource = false;
// paranoia
deviceName[0] = '\0';
@ -211,7 +211,8 @@ MediaEngineWebRTC::EnumerateVideoDevices(dom::MediaSourceEnum aMediaSource,
capEngine,
i, deviceName,
sizeof(deviceName), uniqueId,
sizeof(uniqueId));
sizeof(uniqueId),
&scarySource);
if (error) {
LOG(("camera:GetCaptureDevice: Failed %d", error ));
continue;
@ -219,16 +220,6 @@ MediaEngineWebRTC::EnumerateVideoDevices(dom::MediaSourceEnum aMediaSource,
#ifdef DEBUG
LOG((" Capture Device Index %d, Name %s", i, deviceName));
if (aMediaSource == dom::MediaSourceEnum::Window) {
// TODO: Detect firefox windows
//scaryWindow = true;
}
if (aMediaSource == dom::MediaSourceEnum::Application) {
// TODO: Detect firefox application windows
//scaryWindow = true;
}
webrtc::CaptureCapability cap;
int numCaps = mozilla::camera::GetChildAndCall(
&mozilla::camera::CamerasChild::NumberOfCapabilities,
@ -262,7 +253,7 @@ MediaEngineWebRTC::EnumerateVideoDevices(dom::MediaSourceEnum aMediaSource,
aVSources->AppendElement(vSource.get());
} else {
vSource = new MediaEngineRemoteVideoSource(i, capEngine, aMediaSource,
scaryKind || scaryWindow);
scaryKind || scarySource);
mVideoSources.Put(uuid, vSource); // Hashtable takes ownership.
aVSources->AppendElement(vSource);
}

Просмотреть файл

@ -34,6 +34,7 @@ DesktopDisplayDevice::DesktopDisplayDevice() {
screenId_ = kInvalidScreenId;
deviceUniqueIdUTF8_ = NULL;
deviceNameUTF8_ = NULL;
pid_ = 0;
}
DesktopDisplayDevice::~DesktopDisplayDevice() {
@ -63,6 +64,10 @@ void DesktopDisplayDevice::setUniqueIdName(const char *deviceUniqueIdUTF8) {
SetStringMember(&deviceUniqueIdUTF8_, deviceUniqueIdUTF8);
}
void DesktopDisplayDevice::setPid(const int pid) {
pid_ = pid;
}
ScreenId DesktopDisplayDevice::getScreenId() {
return screenId_;
}
@ -75,6 +80,10 @@ const char *DesktopDisplayDevice::getUniqueIdName() {
return deviceUniqueIdUTF8_;
}
pid_t DesktopDisplayDevice::getPid() {
return pid_;
}
DesktopDisplayDevice& DesktopDisplayDevice::operator= (DesktopDisplayDevice& other) {
if (&other == this) {
return *this;
@ -82,6 +91,7 @@ DesktopDisplayDevice& DesktopDisplayDevice::operator= (DesktopDisplayDevice& oth
screenId_ = other.getScreenId();
setUniqueIdName(other.getUniqueIdName());
setDeviceName(other.getDeviceName());
pid_ = other.getPid();
return *this;
}
@ -271,6 +281,7 @@ void DesktopDeviceInfoImpl::InitializeWindowList() {
pWinDevice->setScreenId(itr->id);
pWinDevice->setDeviceName(itr->title.c_str());
pWinDevice->setPid(itr->pid);
char idStr[BUFSIZ];
#if WEBRTC_WIN

Просмотреть файл

@ -18,10 +18,12 @@ public:
void setScreenId(const ScreenId screenId);
void setDeviceName(const char *deviceNameUTF8);
void setUniqueIdName(const char *deviceUniqueIdUTF8);
void setPid(pid_t pid);
ScreenId getScreenId();
const char *getDeviceName();
const char *getUniqueIdName();
pid_t getPid();
DesktopDisplayDevice& operator= (DesktopDisplayDevice& other);
@ -29,6 +31,7 @@ protected:
ScreenId screenId_;
char* deviceNameUTF8_;
char* deviceUniqueIdUTF8_;
pid_t pid_;
};
typedef std::map<intptr_t,DesktopDisplayDevice*> DesktopDisplayDeviceList;

Просмотреть файл

@ -29,6 +29,7 @@ class WindowCapturer : public DesktopCapturer {
struct Window {
WindowId id;
pid_t pid;
// Title of the window in UTF-8 encoding.
std::string title;

Просмотреть файл

@ -100,6 +100,8 @@ bool WindowCapturerMac::GetWindowList(WindowList* windows) {
CFDictionaryGetValue(window, kCGWindowName));
CFNumberRef window_id = reinterpret_cast<CFNumberRef>(
CFDictionaryGetValue(window, kCGWindowNumber));
CFNumberRef window_pid = reinterpret_cast<CFNumberRef>(
CFDictionaryGetValue(window, kCGWindowOwnerPID));
CFNumberRef window_layer = reinterpret_cast<CFNumberRef>(
CFDictionaryGetValue(window, kCGWindowLayer));
if (window_title && window_id && window_layer) {
@ -123,8 +125,11 @@ bool WindowCapturerMac::GetWindowList(WindowList* windows) {
int id;
CFNumberGetValue(window_id, kCFNumberIntType, &id);
pid_t pid = 0;
CFNumberGetValue(window_pid, kCFNumberIntType, &pid);
WindowCapturer::Window window;
window.id = id;
window.pid = pid;
if (!rtc::ToUtf8(window_title, &(window.title)) ||
window.title.empty()) {
continue;

Просмотреть файл

@ -58,6 +58,7 @@ class VideoCaptureModule: public RefCountedModule {
// Otherwise same as deviceNameUTF8.
// productUniqueIdUTF8 - Unique product id if it exist.
// Null terminated otherwise.
// pid - Owning process id (pid).
virtual int32_t GetDeviceName(
uint32_t deviceNumber,
char* deviceNameUTF8,
@ -65,7 +66,8 @@ class VideoCaptureModule: public RefCountedModule {
char* deviceUniqueIdUTF8,
uint32_t deviceUniqueIdUTF8Length,
char* productUniqueIdUTF8 = 0,
uint32_t productUniqueIdUTF8Length = 0) = 0;
uint32_t productUniqueIdUTF8Length = 0,
int32_t* pid = 0) = 0;
// Returns the number of capabilities this device.

Просмотреть файл

@ -48,7 +48,8 @@ public:
uint32_t deviceNameLength, char* deviceUniqueIdUTF8,
uint32_t deviceUniqueIdUTF8Length,
char* productUniqueIdUTF8 = 0,
uint32_t productUniqueIdUTF8Length = 0);
uint32_t productUniqueIdUTF8Length = 0,
pid_t* pid = 0);
/*
* Returns the number of capabilities for this device

Просмотреть файл

@ -54,7 +54,8 @@ int32_t VideoCaptureMacAVFoundationInfo::GetDeviceName(
uint32_t deviceNumber, char* deviceNameUTF8,
uint32_t deviceNameLength, char* deviceUniqueIdUTF8,
uint32_t deviceUniqueIdUTF8Length, char* productUniqueIdUTF8,
uint32_t productUniqueIdUTF8Length)
uint32_t productUniqueIdUTF8Length,
pid_t* pid)
{
nsAutoreleasePool localPool;
int errNum = [[_captureInfo getDeviceNamesFromIndex:deviceNumber

Просмотреть файл

@ -19,7 +19,8 @@ namespace webrtc {
char* deviceUniqueIdUTF8,
uint32_t deviceUniqueIdUTF8Length,
char* productUniqueIdUTF8 = NULL,
uint32_t productUniqueIdUTF8Length = 0) {
uint32_t productUniqueIdUTF8Length = 0,
pid_t* pid = 0) {
deviceNameUTF8 = const_cast<char*>(kDeviceName);
deviceUniqueIdUTF8 = const_cast<char*>(kUniqueDeviceName);
productUniqueIdUTF8 = const_cast<char*>(kProductUniqueId);

Просмотреть файл

@ -58,7 +58,8 @@ int32_t ScreenDeviceInfoImpl::GetDeviceName(uint32_t deviceNumber,
char* deviceUniqueIdUTF8,
uint32_t deviceUniqueIdUTF8Length,
char* productUniqueIdUTF8,
uint32_t productUniqueIdUTF8Length) {
uint32_t productUniqueIdUTF8Length,
pid_t* pid) {
DesktopDisplayDevice desktopDisplayDevice;
@ -154,7 +155,8 @@ int32_t AppDeviceInfoImpl::GetDeviceName(uint32_t deviceNumber,
char* deviceUniqueIdUTF8,
uint32_t deviceUniqueIdUTF8Length,
char* productUniqueIdUTF8,
uint32_t productUniqueIdUTF8Length) {
uint32_t productUniqueIdUTF8Length,
pid_t* pid) {
DesktopApplication desktopApplication;
@ -254,7 +256,8 @@ int32_t WindowDeviceInfoImpl::GetDeviceName(uint32_t deviceNumber,
char* deviceUniqueIdUTF8,
uint32_t deviceUniqueIdUTF8Length,
char* productUniqueIdUTF8,
uint32_t productUniqueIdUTF8Length) {
uint32_t productUniqueIdUTF8Length,
pid_t* pid) {
DesktopDisplayDevice desktopDisplayDevice;
@ -289,6 +292,9 @@ int32_t WindowDeviceInfoImpl::GetDeviceName(uint32_t deviceNumber,
deviceUniqueId,
len);
}
if (pid) {
*pid = desktopDisplayDevice.getPid();
}
}
return 0;

Просмотреть файл

@ -55,7 +55,8 @@ public:
char* deviceUniqueIdUTF8,
uint32_t deviceUniqueIdUTF8Length,
char* productUniqueIdUTF8,
uint32_t productUniqueIdUTF8Length);
uint32_t productUniqueIdUTF8Length,
pid_t* pid);
virtual int32_t DisplayCaptureSettingsDialogBox(const char* deviceUniqueIdUTF8,
const char* dialogTitleUTF8,
@ -93,7 +94,8 @@ public:
char* deviceUniqueIdUTF8,
uint32_t deviceUniqueIdUTF8Length,
char* productUniqueIdUTF8,
uint32_t productUniqueIdUTF8Length);
uint32_t productUniqueIdUTF8Length,
pid_t* pid);
virtual int32_t DisplayCaptureSettingsDialogBox(const char* deviceUniqueIdUTF8,
const char* dialogTitleUTF8,
@ -130,7 +132,8 @@ public:
char* deviceUniqueIdUTF8,
uint32_t deviceUniqueIdUTF8Length,
char* productUniqueIdUTF8,
uint32_t productUniqueIdUTF8Length);
uint32_t productUniqueIdUTF8Length,
pid_t* pid);
virtual int32_t DisplayCaptureSettingsDialogBox(const char* deviceUniqueIdUTF8,
const char* dialogTitleUTF8,

Просмотреть файл

@ -22,6 +22,10 @@
#include "webrtc/common_video/interface/i420_video_frame.h"
#include "webrtc/common_video/rotation.h"
#ifdef XP_WIN
typedef int pid_t;
#endif
namespace webrtc {
class VideoEngine;
@ -146,7 +150,8 @@ class WEBRTC_DLLEXPORT ViECapture {
char* device_nameUTF8,
const unsigned int device_nameUTF8Length,
char* unique_idUTF8,
const unsigned int unique_idUTF8Length) = 0;
const unsigned int unique_idUTF8Length,
pid_t* pid = nullptr) = 0;
// Allocates a capture device to be used in VideoEngine.
virtual int AllocateCaptureDevice(const char* unique_idUTF8,

Просмотреть файл

@ -69,11 +69,12 @@ int ViECaptureImpl::GetCaptureDevice(unsigned int list_number,
char* device_nameUTF8,
unsigned int device_nameUTF8Length,
char* unique_idUTF8,
unsigned int unique_idUTF8Length) {
unsigned int unique_idUTF8Length,
pid_t* pid) {
return shared_data_->input_manager()->GetDeviceName(
list_number,
device_nameUTF8, device_nameUTF8Length,
unique_idUTF8, unique_idUTF8Length);
unique_idUTF8, unique_idUTF8Length, pid);
}
int ViECaptureImpl::AllocateCaptureDevice(

Просмотреть файл

@ -30,7 +30,9 @@ class ViECaptureImpl
virtual int GetCaptureDevice(unsigned int list_number, char* device_nameUTF8,
const unsigned int device_nameUTF8Length,
char* unique_idUTF8,
const unsigned int unique_idUTF8Length);
const unsigned int unique_idUTF8Length,
pid_t* pid = nullptr);
virtual int AllocateCaptureDevice(const char* unique_idUTF8,
const unsigned int unique_idUTF8Length,
int& capture_id);

Просмотреть файл

@ -70,14 +70,16 @@ int ViEInputManager::GetDeviceName(uint32_t device_number,
char* device_nameUTF8,
uint32_t device_name_length,
char* device_unique_idUTF8,
uint32_t device_unique_idUTF8Length) {
uint32_t device_unique_idUTF8Length,
pid_t* pid) {
CriticalSectionScoped cs(device_info_cs_.get());
GetDeviceInfo();
assert(capture_device_info_);
return capture_device_info_->GetDeviceName(device_number, device_nameUTF8,
device_name_length,
device_unique_idUTF8,
device_unique_idUTF8Length);
device_unique_idUTF8Length,
NULL, 0, pid);
}
int ViEInputManager::NumberOfCaptureCapabilities(

Просмотреть файл

@ -49,7 +49,8 @@ class ViEInputManager : private ViEManagerBase,
char* device_nameUTF8,
uint32_t device_name_length,
char* device_unique_idUTF8,
uint32_t device_unique_idUTF8Length);
uint32_t device_unique_idUTF8Length,
pid_t* pid);
// Returns the number of capture capabilities for a specified device.
int NumberOfCaptureCapabilities(const char* device_unique_idUTF8);