Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 57 additions & 17 deletions background.js
Original file line number Diff line number Diff line change
Expand Up @@ -501,9 +501,6 @@ function checkTab(id, isBeforeNav, isRepeat) {
// Get current time/date
let timedate = new Date(now * 1000);

// Get override end time
let overrideEndTime = gOptions["oret"];

gTabs[id].secsLeft = Infinity;
gTabs[id].secsLeftSet = 0;
gTabs[id].showTimer = false;
Expand Down Expand Up @@ -645,9 +642,12 @@ function checkTab(id, isBeforeNav, isRepeat) {
// Check lockdown condition
let lockdown = (timedata[4] > now);

// Check override condition
// Check override condition (per-set override stored in timedata[8])
// Note: allowOverride is checked at activation time, not here, so active overrides
// persist until end time even if allowOverride is later disabled (matching lockdown behavior)
let overrideEndTime = timedata[8];
let override = (prevOverride || !isInternalPage) && (overrideEndTime > now)
&& allowOverride && (allowOverLock || !lockdown);
&& (allowOverLock || !lockdown);

// Determine whether this page should now be blocked
let doBlock = lockdown
Expand Down Expand Up @@ -1055,14 +1055,21 @@ function updateIcon() {
// Get current time in seconds
let now = Math.floor(Date.now() / 1000) + (gClockOffset * 60);

// Get override end time
let overrideEndTime = gOptions["oret"];
// Check if any block set has active override (per-set override stored in timedata[8])
let anyOverrideActive = false;
for (let set = 1; set <= gNumSets; set++) {
let timedata = gOptions[`timedata${set}`];
if (timedata && timedata[8] > now) {
anyOverrideActive = true;
break;
}
}

// Change icon only if override status has changed
if (!gOverrideIcon && overrideEndTime > now) {
if (!gOverrideIcon && anyOverrideActive) {
browser.action.setIcon({ path: OVERRIDE_ICON });
gOverrideIcon = true;
} else if (gOverrideIcon && overrideEndTime <= now) {
} else if (gOverrideIcon && !anyOverrideActive) {
browser.action.setIcon({ path: DEFAULT_ICON });
gOverrideIcon = false;
}
Expand Down Expand Up @@ -1340,19 +1347,25 @@ function cancelLockdown(set) {
saveTimeData();
}

// Apply override
// Apply override for specified sets
//
function applyOverride(endTime) {
//log("applyOverride: " + endTime);
function applyOverride(sets, endTime) {
//log("applyOverride: " + sets + " " + endTime);

if (!gGotOptions) {
if (!gGotOptions || !sets || sets.length == 0) {
return;
}

let options = {};

// Set override end time
options["oret"] = gOptions["oret"] = endTime;
// Apply override to each set (only if it doesn't reduce any current override)
for (let set of sets) {
if (set >= 1 && set <= gNumSets) {
if (endTime > gOptions[`timedata${set}`][8]) {
gOptions[`timedata${set}`][8] = endTime;
}
}
}

if (endTime) {
// Get current time in seconds
Expand Down Expand Up @@ -1386,6 +1399,22 @@ function applyOverride(endTime) {
function (error) { warn("Cannot set options: " + error); }
);

saveTimeData();
updateIcon();
}

// Cancel override for specified set
//
function cancelOverride(set) {
//log("cancelOverride: " + set);

if (!gGotOptions || set < 1 || set > gNumSets) {
return;
}

gOptions[`timedata${set}`][8] = 0;

saveTimeData();
updateIcon();
}

Expand Down Expand Up @@ -1629,7 +1658,10 @@ function handleCommand(command) {
break;

case "lb-cancel-override":
applyOverride(0);
// Cancel override for all sets
for (let set = 1; set <= gNumSets; set++) {
cancelOverride(set);
}
break;

case "lb-add-sites":
Expand Down Expand Up @@ -1716,7 +1748,15 @@ function handleMessage(message, sender, sendResponse) {

case "override":
// Override requested
applyOverride(message.endTime);
if (!message.endTime) {
// Override canceled - cancel all overrides
for (let set = 1; set <= gNumSets; set++) {
cancelOverride(set);
}
} else {
// Override requested for specified sets
applyOverride(message.sets, message.endTime);
}
break;

case "password":
Expand Down
7 changes: 5 additions & 2 deletions common.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ const GENERAL_OPTIONS = {
orlps: { type: "number", def: 0, id: null }, // default: no override limit period start time
orlc: { type: "number", def: 0, id: null }, // default: no override limit count
oret: { type: "number", def: 0, id: null }, // default: no override end time
orHours: { type: "string", def: "", id: null }, // default: blank (for UI state persistence)
orMins: { type: "string", def: "", id: null }, // default: blank (for UI state persistence)
warnSecs: { type: "string", def: "", id: "warnSecs" }, // default: no warning
warnImmediate: { type: "boolean", def: true, id: "warnImmediate" }, // default: warn only for immediate block
contextMenu: { type: "boolean", def: true, id: "contextMenu" }, // default: enabled
Expand Down Expand Up @@ -181,6 +183,7 @@ function cleanOptions(options) {
// timedata[5] = rollover time for current period (secs)
// timedata[6] = rollover time for next period (secs)
// timedata[7] = start time for next rollover period (secs since epoch)
// timedata[8] = end time for override (secs since epoch)
//
function cleanTimeData(options) {
let numSets = +options["numSets"];
Expand All @@ -189,8 +192,8 @@ function cleanTimeData(options) {
for (let set = 1; set <= numSets; set++) {
let timedata = options[`timedata${set}`];
if (!Array.isArray(timedata)) {
timedata = [now, 0, 0, 0, 0, 0, 0, 0];
} else while (timedata.length < 8) {
timedata = [now, 0, 0, 0, 0, 0, 0, 0, 0];
} else while (timedata.length < 9) {
timedata.push(0);
}
options[`timedata${set}`] = timedata;
Expand Down
53 changes: 50 additions & 3 deletions override.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,48 @@
<fieldset class="ui-widget ui-widget-content">
<legend>LeechBlock Override</legend>
<p>
Allow blocking to be suspended for <input id="mins" type="text" size="2"> minute(s)
<label>Enter the duration of the override:</label><br>
<div>
<input id="hours" type="text" size="6" list="hours-list">
<datalist id="hours-list">
<option value="1">
<option value="2">
<option value="3">
<option value="4">
<option value="5">
<option value="6">
<option value="12">
<option value="18">
<option value="24">
</datalist>
<label for="hours">hour(s)</label>
&nbsp;&nbsp;&nbsp;&nbsp;
<input id="mins" type="text" size="6" list="mins-list">
<datalist id="mins-list">
<option value="5">
<option value="10">
<option value="15">
<option value="20">
<option value="25">
<option value="30">
<option value="35">
<option value="40">
<option value="45">
<option value="50">
<option value="55">
</datalist>
<label for="mins">minute(s)</label>
</div>
</p>
<hr>
<p>
<label>Select the sites to override:</label><br>
<div id="blockSets">
<p>
<input id="blockSet1" type="checkbox">
<label id="blockSetLabel1" for="blockSet1">Sites specified in Block Set 1</label>
</p>
</div>
</p>
</fieldset>

Expand All @@ -46,10 +87,16 @@
<div id="alertNoDuration" title="LeechBlock Override">
<p>Please enter a non-zero duration for the override.</p>
</div>
<div id="alertNoSets" title="LeechBlock Override">
<p>Please select the sites to override.</p>
</div>
<div id="alertNoEligibleSets" title="LeechBlock Override">
<p>No block sets have "Allow temporary override" enabled.</p>
<p>You can enable this in Options for each block set.</p>
</div>
<div id="alertOverrideActivated" title="LeechBlock Override">
<p>Override activated. Blocking will be suspended until <strong><span id="alertOverrideEndTime"></span></strong>.</p>
<p id="alertOverrideNoSets"><strong>Note:</strong> Override will have no effect because you have not selected<br>"Allow temporary override for these sites" for any block sets.</p>
<p id="alertOverrideSets" style="display: none;">Override will be applied to sites in: <span id="alertOverrideSetList"></span></p>
<p id="alertOverrideSets">Override will be applied to sites in: <span id="alertOverrideSetList"></span></p>
<p id="alertOverrideLimit" style="display: none;">You are allowed <strong><span id="alertLimitLeft"></span></strong> more override(s) <span id="alertLimitPeriod"></span>.</p>
</div>
</div>
Expand Down
Loading