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:
Wes Kocher 2017-04-26 15:21:54 -07:00
parent 7954a3d443
commit c9a5b19112
8 changed files with 883 additions and 1060 deletions

View File

@ -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]

View File

@ -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);
}
},

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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,