mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 03:45:46 +00:00
Backed out 5 changesets (bug 1320994) for browser_downloads_panel_block.js permafails on Win7VM a=backout CLOSED TREE
Backed out changeset b744a070cafb (bug 1320994) Backed out changeset 5766ba7143b4 (bug 1320994) Backed out changeset 31afc3fcd61f (bug 1320994) Backed out changeset 78e5f8775727 (bug 1320994) Backed out changeset 6d4e1736fd69 (bug 1320994) MozReview-Commit-ID: 9tPD6gwXttd --HG-- extra : source : f2c9825b0c32f46bdb33c6d53d5ec3c3950264ec extra : amend_source : 900d86941bc0e5ead4f06dcdf7859aec343c15e6
This commit is contained in:
parent
7954a3d443
commit
c9a5b19112
@ -12,9 +12,10 @@ skip-if = (os == "linux" && debug) # linux: bug 976544
|
||||
[browser_devices_get_user_media_multi_process.js]
|
||||
skip-if = e10s && (asan || debug) # bug 1347625
|
||||
[browser_devices_get_user_media_screen.js]
|
||||
skip-if = (os == "linux") || (os == "win" && !debug) # bug 1320994 for linux opt, bug 1338038 for windows and linux debug
|
||||
[browser_devices_get_user_media_tear_off_tab.js]
|
||||
[browser_devices_get_user_media_unprompted_access.js]
|
||||
[browser_devices_get_user_media_unprompted_access_in_frame.js]
|
||||
[browser_devices_get_user_media_unprompted_access_tear_off_tab.js]
|
||||
skip-if = (os == "win" && bits == 64) # win8: bug 1334752
|
||||
skip-if = (os == "linux") || (os == "win" && bits == 64) # linux: bug 1331616, win8: bug 1334752
|
||||
[browser_webrtc_hooks.js]
|
||||
|
@ -410,7 +410,7 @@ var gTests = [
|
||||
yield check({video: true, audio: true});
|
||||
|
||||
info("Stop the camera, everything should stop.");
|
||||
yield stopSharing("camera");
|
||||
yield stopSharing("camera", false, true);
|
||||
|
||||
info("Now, share only the screen...");
|
||||
indicator = promiseIndicatorWindow();
|
||||
@ -423,7 +423,7 @@ var gTests = [
|
||||
yield check({video: true, audio: true, screen: "Screen"});
|
||||
|
||||
info("Stop the camera, this should stop everything.");
|
||||
yield stopSharing("camera");
|
||||
yield stopSharing("camera", false, true);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -62,7 +62,7 @@ var gTests = [
|
||||
SitePermissions.remove(null, "microphone", gBrowser.selectedBrowser);
|
||||
|
||||
// After closing all streams, gUM(audio+camera) causes a prompt.
|
||||
yield closeStream();
|
||||
yield closeStream(false, 0, 2);
|
||||
promise = promisePopupNotificationShown("webRTC-shareDevices");
|
||||
yield promiseRequestDevice(true, true);
|
||||
yield promise;
|
||||
@ -169,7 +169,7 @@ var gTests = [
|
||||
yield checkSharingUI({audio: false, video: true});
|
||||
|
||||
// close all streams
|
||||
yield closeStream();
|
||||
yield closeStream(false, 0, 2);
|
||||
}
|
||||
},
|
||||
|
||||
@ -241,7 +241,7 @@ var gTests = [
|
||||
yield checkSharingUI({audio: true, video: false});
|
||||
|
||||
// close all streams
|
||||
yield closeStream();
|
||||
yield closeStream(false, 0, 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -57,7 +57,7 @@ var gTests = [
|
||||
yield expectObserverCalled("recording-device-events");
|
||||
|
||||
// close the stream
|
||||
yield closeStream(false, "frame1");
|
||||
yield closeStream(false, "frame1", 2);
|
||||
}
|
||||
},
|
||||
|
||||
@ -197,7 +197,7 @@ var gTests = [
|
||||
yield expectObserverCalled("recording-window-ended");
|
||||
|
||||
// close the stream
|
||||
yield closeStream();
|
||||
yield closeStream(false);
|
||||
SitePermissions.remove(null, "screen", gBrowser.selectedBrowser);
|
||||
SitePermissions.remove(null, "camera", gBrowser.selectedBrowser);
|
||||
SitePermissions.remove(null, "microphone", gBrowser.selectedBrowser);
|
||||
|
@ -41,6 +41,7 @@ var gTests = [
|
||||
yield Promise.all(promises);
|
||||
|
||||
promises = [promiseObserverCalled("recording-device-events"),
|
||||
promiseObserverCalled("recording-device-events"),
|
||||
promiseObserverCalled("recording-window-ended")];
|
||||
yield BrowserTestUtils.closeWindow(win);
|
||||
yield Promise.all(promises);
|
||||
|
@ -215,7 +215,7 @@ function expectObserverCalled(aTopic) {
|
||||
});
|
||||
}
|
||||
|
||||
function expectNoObserverCalled() {
|
||||
function expectNoObserverCalled(aIgnoreDeviceEvents = false) {
|
||||
return new Promise(resolve => {
|
||||
let mm = _mm();
|
||||
mm.addMessageListener("Test:ExpectNoObserverCalled:Reply",
|
||||
@ -225,7 +225,15 @@ function expectNoObserverCalled() {
|
||||
if (!data[topic])
|
||||
continue;
|
||||
|
||||
is(data[topic], 0, topic + " notification unexpected");
|
||||
// If we are stopping tracks that were created from 2 different
|
||||
// getUserMedia calls, the "recording-device-events" notification is
|
||||
// fired twice on Windows and Mac, and intermittently twice on Linux.
|
||||
if (topic == "recording-device-events" && aIgnoreDeviceEvents) {
|
||||
todo(false, "Got " + data[topic] + " unexpected " + topic +
|
||||
" notifications, see bug 1320994");
|
||||
} else {
|
||||
is(data[topic], 0, topic + " notification unexpected");
|
||||
}
|
||||
}
|
||||
resolve();
|
||||
});
|
||||
@ -346,7 +354,8 @@ function getMediaCaptureState() {
|
||||
});
|
||||
}
|
||||
|
||||
function* stopSharing(aType = "camera", aShouldKeepSharing = false) {
|
||||
function* stopSharing(aType = "camera", aShouldKeepSharing = false,
|
||||
aExpectDoubleRecordingEvent = false) {
|
||||
let promiseRecordingEvent = promiseObserverCalled("recording-device-events");
|
||||
gIdentityHandler._identityBox.click();
|
||||
let permissions = document.getElementById("identity-popup-permission-list");
|
||||
@ -363,7 +372,7 @@ function* stopSharing(aType = "camera", aShouldKeepSharing = false) {
|
||||
if (!aShouldKeepSharing)
|
||||
yield expectObserverCalled("recording-window-ended");
|
||||
|
||||
yield expectNoObserverCalled();
|
||||
yield expectNoObserverCalled(aExpectDoubleRecordingEvent);
|
||||
|
||||
if (!aShouldKeepSharing)
|
||||
yield* checkNotSharing();
|
||||
@ -382,13 +391,16 @@ function promiseRequestDevice(aRequestAudio, aRequestVideo, aFrameId, aType,
|
||||
});
|
||||
}
|
||||
|
||||
function* closeStream(aAlreadyClosed, aFrameId) {
|
||||
function* closeStream(aAlreadyClosed, aFrameId, aStreamCount = 1) {
|
||||
yield expectNoObserverCalled();
|
||||
|
||||
let promises;
|
||||
if (!aAlreadyClosed) {
|
||||
promises = [promiseObserverCalled("recording-device-events"),
|
||||
promiseObserverCalled("recording-window-ended")];
|
||||
promises = [];
|
||||
for (let i = 0; i < aStreamCount; i++) {
|
||||
promises.push(promiseObserverCalled("recording-device-events"));
|
||||
}
|
||||
promises.push(promiseObserverCalled("recording-window-ended"));
|
||||
}
|
||||
|
||||
info("closing the stream");
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -55,10 +55,12 @@ namespace ipc {
|
||||
class PrincipalInfo;
|
||||
}
|
||||
|
||||
class GetUserMediaTask;
|
||||
class GetUserMediaWindowListener;
|
||||
class MediaManager;
|
||||
class SourceListener;
|
||||
class GetUserMediaCallbackMediaStreamListener;
|
||||
class GetUserMediaTask;
|
||||
|
||||
extern LogModule* GetMediaManagerLog();
|
||||
#define MM_LOG(msg) MOZ_LOG(GetMediaManagerLog(), mozilla::LogLevel::Debug, msg)
|
||||
|
||||
class MediaDevice : public nsIMediaDevice
|
||||
{
|
||||
@ -134,29 +136,34 @@ class GetUserMediaNotificationEvent: public Runnable
|
||||
enum GetUserMediaStatus {
|
||||
STARTING,
|
||||
STOPPING,
|
||||
STOPPED_TRACK,
|
||||
};
|
||||
GetUserMediaNotificationEvent(GetUserMediaStatus aStatus,
|
||||
uint64_t aWindowID);
|
||||
GetUserMediaNotificationEvent(GetUserMediaCallbackMediaStreamListener* aListener,
|
||||
GetUserMediaStatus aStatus,
|
||||
bool aIsAudio, bool aIsVideo, uint64_t aWindowID);
|
||||
|
||||
GetUserMediaNotificationEvent(GetUserMediaStatus aStatus,
|
||||
already_AddRefed<DOMMediaStream> aStream,
|
||||
already_AddRefed<media::Refcountable<UniquePtr<OnTracksAvailableCallback>>> aOnTracksAvailableCallback,
|
||||
uint64_t aWindowID,
|
||||
OnTracksAvailableCallback* aOnTracksAvailableCallback,
|
||||
bool aIsAudio, bool aIsVideo, uint64_t aWindowID,
|
||||
already_AddRefed<nsIDOMGetUserMediaErrorCallback> aError);
|
||||
virtual ~GetUserMediaNotificationEvent();
|
||||
|
||||
NS_IMETHOD Run() override;
|
||||
|
||||
protected:
|
||||
RefPtr<GetUserMediaWindowListener> mListener; // threadsafe
|
||||
RefPtr<GetUserMediaCallbackMediaStreamListener> mListener; // threadsafe
|
||||
RefPtr<DOMMediaStream> mStream;
|
||||
RefPtr<media::Refcountable<UniquePtr<OnTracksAvailableCallback>>> mOnTracksAvailableCallback;
|
||||
nsAutoPtr<OnTracksAvailableCallback> mOnTracksAvailableCallback;
|
||||
GetUserMediaStatus mStatus;
|
||||
bool mIsAudio;
|
||||
bool mIsVideo;
|
||||
uint64_t mWindowID;
|
||||
RefPtr<nsIDOMGetUserMediaErrorCallback> mOnFailure;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
MEDIA_START,
|
||||
MEDIA_STOP,
|
||||
MEDIA_STOP_TRACK,
|
||||
MEDIA_DIRECT_LISTENERS,
|
||||
@ -165,30 +172,30 @@ typedef enum {
|
||||
class ReleaseMediaOperationResource : public Runnable
|
||||
{
|
||||
public:
|
||||
ReleaseMediaOperationResource(
|
||||
already_AddRefed<DOMMediaStream> aStream,
|
||||
already_AddRefed<media::Refcountable<UniquePtr<OnTracksAvailableCallback>>> aOnTracksAvailableCallback):
|
||||
ReleaseMediaOperationResource(already_AddRefed<DOMMediaStream> aStream,
|
||||
OnTracksAvailableCallback* aOnTracksAvailableCallback):
|
||||
mStream(aStream),
|
||||
mOnTracksAvailableCallback(aOnTracksAvailableCallback) {}
|
||||
NS_IMETHOD Run() override {return NS_OK;}
|
||||
private:
|
||||
RefPtr<DOMMediaStream> mStream;
|
||||
RefPtr<media::Refcountable<UniquePtr<OnTracksAvailableCallback>>> mOnTracksAvailableCallback;
|
||||
nsAutoPtr<OnTracksAvailableCallback> mOnTracksAvailableCallback;
|
||||
};
|
||||
|
||||
typedef nsRefPtrHashtable<nsUint64HashKey, GetUserMediaWindowListener> WindowTable;
|
||||
typedef nsTArray<RefPtr<GetUserMediaCallbackMediaStreamListener> > StreamListeners;
|
||||
typedef nsClassHashtable<nsUint64HashKey, StreamListeners> WindowTable;
|
||||
|
||||
// we could add MediaManager if needed
|
||||
typedef void (*WindowListenerCallback)(MediaManager *aThis,
|
||||
uint64_t aWindowID,
|
||||
GetUserMediaWindowListener *aListener,
|
||||
StreamListeners *aListeners,
|
||||
void *aData);
|
||||
|
||||
class MediaManager final : public nsIMediaManagerService,
|
||||
public nsIObserver
|
||||
,public DeviceChangeCallback
|
||||
{
|
||||
friend SourceListener;
|
||||
friend GetUserMediaCallbackMediaStreamListener;
|
||||
public:
|
||||
static already_AddRefed<MediaManager> GetInstance();
|
||||
|
||||
@ -209,7 +216,9 @@ public:
|
||||
}
|
||||
|
||||
static nsresult NotifyRecordingStatusChange(nsPIDOMWindowInner* aWindow,
|
||||
const nsString& aMsg);
|
||||
const nsString& aMsg,
|
||||
const bool& aIsAudio,
|
||||
const bool& aIsVideo);
|
||||
|
||||
NS_DECL_THREADSAFE_ISUPPORTS
|
||||
NS_DECL_NSIOBSERVER
|
||||
@ -217,23 +226,17 @@ public:
|
||||
|
||||
media::Parent<media::NonE10s>* GetNonE10sParent();
|
||||
MediaEngine* GetBackend(uint64_t aWindowId = 0);
|
||||
|
||||
WindowTable *GetActiveWindows() {
|
||||
StreamListeners *GetWindowListeners(uint64_t aWindowId) {
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
return &mActiveWindows;
|
||||
return mActiveWindows.Get(aWindowId);
|
||||
}
|
||||
GetUserMediaWindowListener *GetWindowListener(uint64_t aWindowId) {
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
return mActiveWindows.GetWeak(aWindowId);
|
||||
}
|
||||
void AddWindowID(uint64_t aWindowId, GetUserMediaWindowListener *aListener);
|
||||
void RemoveWindowID(uint64_t aWindowId);
|
||||
bool IsWindowStillActive(uint64_t aWindowId) {
|
||||
return !!GetWindowListener(aWindowId);
|
||||
return !!GetWindowListeners(aWindowId);
|
||||
}
|
||||
// Note: also calls aListener->Remove(), even if inactive
|
||||
void RemoveFromWindowList(uint64_t aWindowID,
|
||||
GetUserMediaWindowListener *aListener);
|
||||
GetUserMediaCallbackMediaStreamListener *aListener);
|
||||
|
||||
nsresult GetUserMedia(
|
||||
nsPIDOMWindowInner* aWindow,
|
||||
@ -290,6 +293,12 @@ private:
|
||||
bool aIsChrome,
|
||||
RefPtr<media::Refcountable<UniquePtr<SourceSet>>>& aSources);
|
||||
|
||||
StreamListeners* AddWindowID(uint64_t aWindowId);
|
||||
WindowTable *GetActiveWindows() {
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
return &mActiveWindows;
|
||||
}
|
||||
|
||||
void GetPref(nsIPrefBranch *aBranch, const char *aPref,
|
||||
const char *aData, int32_t *aVal);
|
||||
void GetPrefBool(nsIPrefBranch *aBranch, const char *aPref,
|
||||
|
Loading…
Reference in New Issue
Block a user