Files
tubestation/waterfox/browser/components/sidebar/common/user-operation-blocker.js
2025-11-06 14:13:52 +00:00

110 lines
3.3 KiB
JavaScript

/*
# This Source Code Form is subject to the terms of the Mozilla Public
# 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/.
*/
'use strict';
import {
log as internalLogger,
configs
} from './common.js';
import * as Constants from './constants.js';
import * as SidebarConnection from './sidebar-connection.js';
import * as TabsStore from './tabs-store.js';
function log(...args) {
internalLogger('common/user-operation-blocker', ...args);
}
let mBlockingCount = 0;
let mBlockingThrobberCount = 0;
const mProgressbar = document.querySelector('#blocking-screen progress');
export function block({ throbber, shade } = {}) {
mBlockingCount++;
document.documentElement.classList.add(Constants.kTABBAR_STATE_BLOCKING);
log('block ', mBlockingCount, () => new Error().stack);
if (throbber) {
mBlockingThrobberCount++;
mProgressbar.delayedShow = setTimeout(() => {
mProgressbar.delayedShow = null;
mProgressbar.classList.add('shown');
}, configs.delayToShowProgressForBlockedUserOperation);
document.documentElement.classList.add(Constants.kTABBAR_STATE_BLOCKING_WITH_THROBBER);
}
else if (shade) {
document.documentElement.classList.add(Constants.kTABBAR_STATE_BLOCKING_WITH_SHADE);
}
}
export function setProgress(percentage, windowId = null) {
percentage = Math.max(0, Math.min(100, percentage));
if (mProgressbar)
mProgressbar.value = percentage;
if (windowId && !TabsStore.getCurrentWindowId())
SidebarConnection.sendMessage({
type: Constants.kCOMMAND_PROGRESS_USER_OPERATIONS,
windowId,
percentage
});
}
export function blockIn(windowId, { throbber, shade } = {}) {
const targetWindow = TabsStore.getCurrentWindowId();
if (targetWindow && targetWindow != windowId)
return;
log(`blockIn(${windowId}) `, () => new Error().stack);
if (!targetWindow) {
SidebarConnection.sendMessage({
type: Constants.kCOMMAND_BLOCK_USER_OPERATIONS,
windowId,
throbber: !!throbber,
shade: !!shade
});
return;
}
block({ throbber, shade });
}
export function unblock() {
mBlockingThrobberCount--;
log('unblock ', mBlockingCount, () => new Error().stack);
if (mBlockingThrobberCount < 0)
mBlockingThrobberCount = 0;
if (mBlockingThrobberCount == 0) {
setProgress(0);
mProgressbar.classList.remove('shown');
if (mProgressbar.delayedShow)
clearTimeout(mProgressbar.delayedShow);
document.documentElement.classList.remove(Constants.kTABBAR_STATE_BLOCKING_WITH_THROBBER);
document.documentElement.classList.remove(Constants.kTABBAR_STATE_BLOCKING_WITH_SHADE);
}
mBlockingCount--;
if (mBlockingCount < 0)
mBlockingCount = 0;
if (mBlockingCount == 0)
document.documentElement.classList.remove(Constants.kTABBAR_STATE_BLOCKING);
}
export function unblockIn(windowId, { throbber, shade } = {}) {
const targetWindow = TabsStore.getCurrentWindowId();
if (targetWindow && targetWindow != windowId)
return;
log(`unblockIn(${windowId}) `, () => new Error().stack);
if (!targetWindow) {
SidebarConnection.sendMessage({
type: Constants.kCOMMAND_UNBLOCK_USER_OPERATIONS,
windowId,
throbber: !!throbber,
shade: !!shade
});
return;
}
unblock({ throbber, shade });
}