Skip to content
This repository was archived by the owner on Aug 27, 2019. It is now read-only.

Commit 35f8b15

Browse files
committed
Add Fullscreen feature
Thanks to @nt1m for figuring out how to implement this using the `browser.windows` API in pull request #3. # TODO: - Make the Fullscreen icon dynamic in the Photon theme.
1 parent 28de787 commit 35f8b15

File tree

7 files changed

+70
-38
lines changed

7 files changed

+70
-38
lines changed

src/_locales/en/messages.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,8 @@
7878
"popup_helpAbout": { "message": "About Firefox" },
7979

8080
"options_header": { "message": "Options" },
81-
"options_theme": { "message": "Theme:" }
81+
"options_theme": { "message": "Theme:" },
82+
"options_preferredWindowState": { "message": "Preferred window state:" },
83+
"options_preferredWindowState_maximized": { "message": "Maximized" },
84+
"options_preferredWindowState_normal": { "message": "Normal window" }
8285
}

src/background.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
*/
1717
/* global browser */
1818

19+
let prevStates = new Map();
20+
1921
(async function() {
2022
let themeDir = (await browser.storage.sync.get({
2123
theme: await getDefaultTheme()
@@ -92,7 +94,11 @@ var tabHandler = (function() {
9294
*/
9395
async function handlePopupMessage(message) {
9496
let method = String(message.method);
95-
let tab = (await browser.tabs.query({ active: true, windowId: browser.windows.WINDOW_ID_CURRENT }))[0];
97+
let window, tab;
98+
[window, tab] = await Promise.all([
99+
browser.windows.getCurrent(),
100+
browser.tabs.query({ active: true, currentWindow: true }).then(tabs => tabs[0])
101+
]);
96102
switch (method) {
97103
case "init": {
98104
let response;
@@ -119,6 +125,7 @@ async function handlePopupMessage(message) {
119125
"emailLink",
120126
"devGetTools",
121127
"openAddons",
128+
"fullscreen",
122129
"openHelp*"
123130
]
124131
};
@@ -170,6 +177,18 @@ async function handlePopupMessage(message) {
170177
if (browser.tabs.print) {
171178
return browser.tabs.print();
172179
}
180+
} case "fullscreen": {
181+
let prevState = window.state;
182+
let newState = prevStates.get(window.id);
183+
newState = (newState && newState !== "fullscreen" ? newState : browser.storage.sync.get({preferredWindowState: "maximized"}));
184+
if (newState instanceof Promise) {
185+
newState = (await newState).preferredWindowState;
186+
}
187+
let result = await browser.windows.update(window.id, {
188+
state: window.state === "fullscreen" ? newState : "fullscreen"
189+
});
190+
prevStates.set(window.id, prevState);
191+
return result;
173192
} default: {
174193
if (method.startsWith("openHelp")) {
175194
let browserInfo;

src/content/content.js

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,6 @@ if (!amLoaded) {
3838
result.enable.push("edit*");
3939
}
4040
return result;
41-
} case "fullscreen": {
42-
if (window.fullScreen) {
43-
if (document.exitFullscreen) {
44-
return document.exitFullscreen();
45-
} else {
46-
return document.mozCancelFullScreen();
47-
}
48-
} else {
49-
if (document.documentElement.requestFullScreen) {
50-
return document.documentElement.requestFullScreen();
51-
} else {
52-
return document.documentElement.mozRequestFullScreen();
53-
}
54-
}
55-
return;
5641
} case "editCut": {
5742
return document.execCommand("cut");
5843
} case "editCopy": {

src/options/options.js

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,24 @@ document.addEventListener("DOMContentLoaded", async () => {
2323

2424
async function initOptions() {
2525
let themes = ["photon", "australis", "classic", "pastel-svg", "aero"];
26-
let currentTheme = (await browser.storage.sync.get({
27-
theme: await getDefaultTheme()
28-
})).theme;
26+
let data = (await browser.storage.sync.get({
27+
theme: await getDefaultTheme(),
28+
preferredWindowState: "maximized"
29+
}));
30+
let currentTheme = data.theme;
2931
let themeSelector = document.querySelector("#theme");
3032

33+
let preferredWindowStateSelector = document.querySelector("#fullscreenExitState");
34+
for (let i = 0; i < preferredWindowStateSelector.length; i++) {
35+
let option = preferredWindowStateSelector.item(i);
36+
if (option.value === data.preferredWindowState) {
37+
preferredWindowStateSelector.selectedIndex = i;
38+
option.setAttribute("selected", true);
39+
} else {
40+
option.selected = false;
41+
}
42+
}
43+
3144
for (let t of themes) {
3245
try {
3346
let response = await fetch(`/themes/${t}/theme.json`);
@@ -87,10 +100,10 @@ async function initOptions() {
87100
select.addEventListener("change", evt => {
88101
if (select.selectedIndex >= 0) {
89102
let selectedOption = select.item(select.selectedIndex);
90-
let themeDir = select.item(select.selectedIndex).value;
91-
browser.storage.sync.set({
92-
theme: themeDir
93-
});
103+
let value = select.item(select.selectedIndex).value;
104+
let data = {};
105+
data[select.dataset.save] = value;
106+
browser.storage.sync.set(data);
94107
// if (selectedOption.dataset.icon) {
95108
// select.style.cssText = `
96109
// background-image: url("${selectedOption.dataset.icon}"), url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE2IDE2Ij4KICA8cGF0aCBkPSJNOCwxMkwzLDcsNCw2bDQsNCw0LTQsMSwxWiIgZmlsbD0iIzZBNkE2QSIgLz4KPC9zdmc+Cg==) !important;
@@ -102,26 +115,28 @@ async function initOptions() {
102115
// select.removeAttribute("style");
103116
// }
104117

105-
fetch(`/themes/${themeDir}/theme.json`).then(r => r.json()).then(config => {
106-
let extension = config.default_extension || "svg";
107-
if (config.browser_action) {
108-
let path = {};
109-
for (let k in config.browser_action) {
110-
path[k] = `/themes/${themeDir}/${config.browser_action[k].includes('.') ?
111-
config.browser_action[k] : config.browser_action[k] + '.' + extension}`
118+
if (select.dataset.save === "theme") {
119+
fetch(`/themes/${value}/theme.json`).then(r => r.json()).then(config => {
120+
let extension = config.default_extension || "svg";
121+
if (config.browser_action) {
122+
let path = {};
123+
for (let k in config.browser_action) {
124+
path[k] = `/themes/${value}/${config.browser_action[k].includes('.') ?
125+
config.browser_action[k] : config.browser_action[k] + '.' + extension}`
126+
}
127+
browser.browserAction.setIcon({path: path});
128+
} else {
129+
browser.browserAction.setIcon({path: `/themes/${value}/firefox.${extension}`});
112130
}
113-
browser.browserAction.setIcon({path: path});
114-
} else {
115-
browser.browserAction.setIcon({path: `/themes/${themeDir}/firefox.${extension}`});
116-
}
117-
});
131+
});
132+
}
118133
}
119134
});
120135
});
121136
}
122137

123138
async function i18nInit() {
124-
document.querySelectorAll("label[for]").forEach(translatable => {
139+
document.querySelectorAll("label[for]:not([data-i18n])").forEach(translatable => {
125140
let text = browser.i18n.getMessage(`options_${translatable.getAttribute("for")}`);
126141
if (text.length > 0)
127142
translatable.textContent = text;

src/options/options.xhtml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
3131
<div class="options-grid browser-style">
3232
<label for="theme" class="browser-style"/>
3333
<select id="theme" data-save="theme" class="browser-style"/>
34+
35+
<label data-i18n="options_preferredWindowState" for="fullscreenExitState" class="browser-style"/>
36+
<select id="fullscreenExitState" data-save="preferredWindowState" class="browser-style">
37+
<option value="maximized" data-i18n="options_preferredWindowState_maximized" selected="true"/>
38+
<option value="normal" data-i18n="options_preferredWindowState_normal"/>
39+
</select>
3440
</div>
3541
</body>
3642
</html>

src/popup/popup.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ document.addEventListener("DOMContentLoaded", () => {
2929
]);
3030
});
3131

32+
async function loadSpecialIcons() {
33+
// TODO: Handle dynamic icons (ex. fullscreen)
34+
}
35+
3236
async function loadIcons() {
3337
let themeDir = (await browser.storage.sync.get({
3438
theme: await getDefaultTheme()

src/popup/popup.xhtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
8989
</div>
9090
<div class="panel-section-separator"/>
9191
<div class="panel-list-item" data-ipc-message="fullscreen">
92-
<i class="eb-icon-placeholder" data-icon="fullscreen"/>
92+
<i class="eb-icon-placeholder" data-icon="fullscreen" data-icon-special="fullscreen"/>
9393
<div class="text" data-i18n="popup_fullScreen"/>
9494
<div class="text-shortcut">
9595
F11

0 commit comments

Comments
 (0)