Skip to content

Commit

Permalink
Merge autoland to mozilla-central. a=merge
Browse files Browse the repository at this point in the history
  • Loading branch information
nerli1 committed Oct 9, 2018
2 parents 8e3fe95 + 1b619b4 commit d07327c
Show file tree
Hide file tree
Showing 41 changed files with 1,432 additions and 252 deletions.
75 changes: 58 additions & 17 deletions browser/base/content/browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -3280,36 +3280,77 @@ function getWebNavigation() {
}

function BrowserReloadWithFlags(reloadFlags) {
let url = gBrowser.currentURI.spec;
if (gBrowser.updateBrowserRemotenessByURL(gBrowser.selectedBrowser, url)) {
// If the remoteness has changed, the new browser doesn't have any
// information of what was loaded before, so we need to load the previous
// URL again.
gBrowser.loadURI(url, {
flags: reloadFlags,
triggeringPrincipal: gBrowser.selectedBrowser.contentPrincipal,
});
let unchangedRemoteness = [];

for (let tab of gBrowser.selectedTabs) {
let browser = tab.linkedBrowser;
let url = browser.currentURI.spec;
if (gBrowser.updateBrowserRemotenessByURL(browser, url)) {
// If the remoteness has changed, the new browser doesn't have any
// information of what was loaded before, so we need to load the previous
// URL again.
if (tab.linkedPanel) {
loadBrowserURI(browser, url);
} else {
// Shift to fully loaded browser and make
// sure load handler is instantiated.
tab.addEventListener("SSTabRestoring",
() => loadBrowserURI(browser, url),
{ once: true });
gBrowser._insertBrowser(tab);
}
} else {
unchangedRemoteness.push(tab);
}
}

if (unchangedRemoteness.length == 0) {
return;
}

// Do this after the above case where we might flip remoteness.
// Unfortunately, we'll count the remoteness flip case as a
// "newURL" load, since we're using loadURI, but hopefully
// that's rare enough to not matter.
maybeRecordAbandonmentTelemetry(gBrowser.selectedTab, "reload");
for (let tab of unchangedRemoteness) {
maybeRecordAbandonmentTelemetry(tab, "reload");
}

// Reset temporary permissions on the current tab. This is done here
// because we only want to reset permissions on user reload.
SitePermissions.clearTemporaryPermissions(gBrowser.selectedBrowser);
// Reset temporary permissions on the remaining tabs to reload.
// This is done here because we only want to reset
// permissions on user reload.
for (let tab of unchangedRemoteness) {
SitePermissions.clearTemporaryPermissions(tab.linkedBrowser);
}
PanelMultiView.hidePopup(gIdentityHandler._identityPopup);


let handlingUserInput = window.windowUtils.isHandlingUserInput;

gBrowser.selectedBrowser
.messageManager
.sendAsyncMessage("Browser:Reload",
{ flags: reloadFlags, handlingUserInput });
for (let tab of unchangedRemoteness) {
if (tab.linkedPanel) {
sendReloadMessage(tab);
} else {
// Shift to fully loaded browser and make
// sure load handler is instantiated.
tab.addEventListener("SSTabRestoring", () => sendReloadMessage(tab), { once: true });
gBrowser._insertBrowser(tab);
}
}

function loadBrowserURI(browser, url) {
browser.loadURI(url, {
flags: reloadFlags,
triggeringPrincipal: browser.contentPrincipal,
});
}

function sendReloadMessage(tab) {
tab.linkedBrowser
.messageManager
.sendAsyncMessage("Browser:Reload",
{ flags: reloadFlags, handlingUserInput });
}
}

function getSecurityInfo(securityInfoAsString) {
Expand Down
77 changes: 58 additions & 19 deletions browser/base/content/test/tabs/browser_multiselect_tabs_reload.js
Original file line number Diff line number Diff line change
@@ -1,43 +1,81 @@
const PREF_MULTISELECT_TABS = "browser.tabs.multiselect";

async function tabLoaded(tab) {
const browser = gBrowser.getBrowserForTab(tab);
await BrowserTestUtils.browserLoaded(browser);
return true;
const browser = gBrowser.getBrowserForTab(tab);
await BrowserTestUtils.browserLoaded(browser);
return true;
}

add_task(async function setPref() {
await SpecialPowers.pushPrefEnv({
set: [[PREF_MULTISELECT_TABS, true]],
});
await SpecialPowers.pushPrefEnv({
set: [[PREF_MULTISELECT_TABS, true]],
});
});

add_task(async function test() {
add_task(async function test_usingTabContextMenu() {
let tab1 = await addTab();
let tab2 = await addTab();
let tab3 = await addTab();

let menuItemReloadTab = document.getElementById("context_reloadTab");
let menuItemReloadSelectedTabs = document.getElementById("context_reloadSelectedTabs");

await BrowserTestUtils.switchTab(gBrowser, tab1);
await triggerClickOn(tab2, { ctrlKey: true });

ok(tab1.multiselected, "Tab1 is multi-selected");
ok(tab2.multiselected, "Tab2 is multi-selected");
ok(!tab3.multiselected, "Tab3 is not multi-selected");

updateTabContextMenu(tab3);
is(menuItemReloadTab.hidden, false, "Reload Tab is visible");
is(menuItemReloadSelectedTabs.hidden, true, "Reload Tabs is hidden");

updateTabContextMenu(tab2);
is(menuItemReloadTab.hidden, true, "Reload Tab is hidden");
is(menuItemReloadSelectedTabs.hidden, false, "Reload Tabs is visible");

let tab1Loaded = tabLoaded(tab1);
let tab2Loaded = tabLoaded(tab2);
menuItemReloadSelectedTabs.click();
await tab1Loaded;
await tab2Loaded;

// We got here because tab1 and tab2 are reloaded. Otherwise the test would have timed out and failed.
ok(true, "Tab1 and Tab2 are reloaded");

BrowserTestUtils.removeTab(tab1);
BrowserTestUtils.removeTab(tab2);
BrowserTestUtils.removeTab(tab3);
});

add_task(async function test_usingKeyboardShortcuts() {
let keys = [
["R", { accelKey: true }],
["R", { accelKey: true, shift: true }],
["VK_F5", {}],
];

if (AppConstants.platform != "macosx") {
keys.push(["VK_F5", { accelKey: true }]);
}

for (let key of keys) {

let tab1 = await addTab();
let tab2 = await addTab();
let tab3 = await addTab();

let menuItemReloadTab = document.getElementById("context_reloadTab");
let menuItemReloadSelectedTabs = document.getElementById("context_reloadSelectedTabs");

await BrowserTestUtils.switchTab(gBrowser, tab1);
await triggerClickOn(tab2, { ctrlKey: true });

ok(tab1.multiselected, "Tab1 is multi-selected");
ok(tab2.multiselected, "Tab2 is multi-selected");
ok(!tab3.multiselected, "Tab3 is not multi-selected");

updateTabContextMenu(tab3);
is(menuItemReloadTab.hidden, false, "Reload Tab is visible");
is(menuItemReloadSelectedTabs.hidden, true, "Reload Selected Tabs is hidden");

updateTabContextMenu(tab2);
is(menuItemReloadTab.hidden, true, "Reload Tab is hidden");
is(menuItemReloadSelectedTabs.hidden, false, "Reload Selected Tabs is visible");

let tab1Loaded = tabLoaded(tab1);
let tab2Loaded = tabLoaded(tab2);
menuItemReloadSelectedTabs.click();
EventUtils.synthesizeKey(key[0], key[1]);
await tab1Loaded;
await tab2Loaded;

Expand All @@ -47,4 +85,5 @@ add_task(async function test() {
BrowserTestUtils.removeTab(tab1);
BrowserTestUtils.removeTab(tab2);
BrowserTestUtils.removeTab(tab3);
}
});
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ skip-if = (verify && (os == 'linux' || os == 'mac'))
[browser_ext_commands_update.js]
[browser_ext_connect_and_move_tabs.js]
[browser_ext_contentscript_connect.js]
[browser_ext_contentscript_nontab_connect.js]
[browser_ext_contextMenus.js]
[browser_ext_contextMenus_checkboxes.js]
[browser_ext_contextMenus_commands.js]
Expand Down
2 changes: 2 additions & 0 deletions browser/components/extensions/test/browser/browser-remote.ini
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ skip-if = !e10s
support-files =
head.js

[browser_ext_contentscript_nontab_connect.js]

[browser_ext_popup_select.js]
skip-if = debug || os != 'win' # FIXME: re-enable on debug build (bug 1442822)

Expand Down
4 changes: 4 additions & 0 deletions dom/bindings/Bindings.conf
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,10 @@ DOMInterfaces = {
'nativeType': 'mozilla::dom::Worklet',
},

'AudioWorkletGlobalScope': {
'implicitJSContext': [ 'registerProcessor' ],
},

'BarProp': {
'headerFile': 'mozilla/dom/BarProps.h',
},
Expand Down
1 change: 1 addition & 0 deletions dom/bindings/Errors.msg
Original file line number Diff line number Diff line change
Expand Up @@ -115,3 +115,4 @@ MSG_DEF(MSG_VALUE_OUT_OF_RANGE, 1, JSEXN_RANGEERR, "The value for the {0} is out
MSG_DEF(MSG_INVALID_PANNERNODE_REFDISTANCE_ERROR, 0, JSEXN_RANGEERR, "The refDistance value passed to PannerNode must not be negative.")
MSG_DEF(MSG_INVALID_PANNERNODE_MAXDISTANCE_ERROR, 0, JSEXN_RANGEERR, "The maxDistance value passed to PannerNode must be positive.")
MSG_DEF(MSG_INVALID_PANNERNODE_ROLLOFF_ERROR, 0, JSEXN_RANGEERR, "The rolloffFactor value passed to PannerNode must not be negative.")
MSG_DEF(MSG_NOT_ARRAY_NOR_UNDEFINED, 1, JSEXN_TYPEERR, "{0} is neither an array nor undefined.")
37 changes: 24 additions & 13 deletions dom/html/HTMLMediaElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2699,8 +2699,8 @@ HTMLMediaElement::FastSeek(double aTime, ErrorResult& aRv)
LOG(LogLevel::Debug, ("%p FastSeek(%f) called by JS", this, aTime));
LOG(LogLevel::Debug, ("Reporting telemetry VIDEO_FASTSEEK_USED"));
Telemetry::Accumulate(Telemetry::VIDEO_FASTSEEK_USED, 1);
RefPtr<Promise> tobeDropped = Seek(aTime, SeekTarget::PrevSyncPoint, aRv);
aRv.SuppressException();
RefPtr<Promise> tobeDropped = Seek(aTime, SeekTarget::PrevSyncPoint,
IgnoreErrors());
}

already_AddRefed<Promise>
Expand All @@ -2725,8 +2725,8 @@ HTMLMediaElement::SetCurrentTime(double aCurrentTime, ErrorResult& aRv)
{
LOG(LogLevel::Debug,
("%p SetCurrentTime(%f) called by JS", this, aCurrentTime));
RefPtr<Promise> tobeDropped = Seek(aCurrentTime, SeekTarget::Accurate, aRv);
aRv.SuppressException();
RefPtr<Promise> tobeDropped = Seek(aCurrentTime, SeekTarget::Accurate,
IgnoreErrors());
}

/**
Expand Down Expand Up @@ -2769,6 +2769,7 @@ HTMLMediaElement::Seek(double aTime,
// aTime should be non-NaN.
MOZ_ASSERT(!mozilla::IsNaN(aTime));

RefPtr<Promise> promise = CreateDOMPromise(aRv);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
Expand Down Expand Up @@ -2890,7 +2891,9 @@ HTMLMediaElement::Seek(double aTime,
AddRemoveSelfReference();

// Keep the DOM promise.
return do_AddRef(mSeekDOMPromise = CreateDOMPromise(aRv));
mSeekDOMPromise = promise;

return promise.forget();
}

double
Expand Down Expand Up @@ -4279,28 +4282,29 @@ HTMLMediaElement::UpdateWakeLock()
Volume() > 0.0 && !mMuted && mIsAudioTrackAudible;
// WakeLock when playing audible media.
if (playing && isAudible) {
WakeLockCreate();
CreateAudioWakeLockIfNeeded();
} else {
WakeLockRelease();
ReleaseAudioWakeLockIfExists();
}
}

void
HTMLMediaElement::WakeLockCreate()
HTMLMediaElement::CreateAudioWakeLockIfNeeded()
{
if (!mWakeLock) {
RefPtr<power::PowerManagerService> pmService =
power::PowerManagerService::GetInstance();
NS_ENSURE_TRUE_VOID(pmService);

ErrorResult rv;
mWakeLock = pmService->NewWakeLock(
NS_LITERAL_STRING("audio-playing"), OwnerDoc()->GetInnerWindow(), rv);
mWakeLock = pmService->NewWakeLock(NS_LITERAL_STRING("audio-playing"),
OwnerDoc()->GetInnerWindow(),
rv);
}
}

void
HTMLMediaElement::WakeLockRelease()
HTMLMediaElement::ReleaseAudioWakeLockIfExists()
{
if (mWakeLock) {
ErrorResult rv;
Expand All @@ -4310,6 +4314,12 @@ HTMLMediaElement::WakeLockRelease()
}
}

void
HTMLMediaElement::WakeLockRelease()
{
ReleaseAudioWakeLockIfExists();
}

HTMLMediaElement::OutputMediaStream::OutputMediaStream()
: mNextAvailableTrackID(1)
, mFinishWhenEnded(false)
Expand Down Expand Up @@ -7753,6 +7763,7 @@ HTMLMediaElement::SetMediaInfo(const MediaInfo& aInfo)
if (mAudioChannelWrapper) {
mAudioChannelWrapper->AudioCaptureStreamChangeIfNeeded();
}
UpdateWakeLock();
}

void
Expand Down Expand Up @@ -8191,7 +8202,7 @@ HTMLMediaElement::AsyncResolveSeekDOMPromiseIfExists()
RefPtr<dom::Promise> promise = mSeekDOMPromise.forget();
nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction(
"dom::HTMLMediaElement::AsyncResolveSeekDOMPromiseIfExists",
[=]() { promise->MaybeResolveWithUndefined(); });
[promise]() { promise->MaybeResolveWithUndefined(); });
mAbstractMainThread->Dispatch(r.forget());
mSeekDOMPromise = nullptr;
}
Expand All @@ -8205,7 +8216,7 @@ HTMLMediaElement::AsyncRejectSeekDOMPromiseIfExists()
RefPtr<dom::Promise> promise = mSeekDOMPromise.forget();
nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction(
"dom::HTMLMediaElement::AsyncRejectSeekDOMPromiseIfExists",
[=]() { promise->MaybeReject(NS_ERROR_DOM_ABORT_ERR); });
[promise]() { promise->MaybeReject(NS_ERROR_DOM_ABORT_ERR); });
mAbstractMainThread->Dispatch(r.forget());
mSeekDOMPromise = nullptr;
}
Expand Down
11 changes: 6 additions & 5 deletions dom/html/HTMLMediaElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -844,8 +844,6 @@ class HTMLMediaElement : public nsGenericHTMLElement,

void SetDecoder(MediaDecoder* aDecoder);

void UpdateWakeLock();

// Holds references to the DOM wrappers for the MediaStreams that we're
// writing to.
struct OutputMediaStream {
Expand Down Expand Up @@ -882,11 +880,14 @@ class HTMLMediaElement : public nsGenericHTMLElement,
void ChangeNetworkState(nsMediaNetworkState aState);

/**
* These two methods are called when mPaused is changed to ensure we have
* a wake lock active when we're playing audibly.
* The MediaElement will be responsible for creating and releasing the audio
* wakelock depending on the playing and audible state.
*/
virtual void WakeLockCreate();
virtual void WakeLockRelease();
virtual void UpdateWakeLock();

void CreateAudioWakeLockIfNeeded();
void ReleaseAudioWakeLockIfExists();
RefPtr<WakeLock> mWakeLock;

/**
Expand Down
Loading

0 comments on commit d07327c

Please sign in to comment.