Skip to content

Commit 2f978ef

Browse files
committed
fix: ctrl-s on live preview should not bring up browser save dialogue
1 parent 5fee808 commit 2f978ef

5 files changed

Lines changed: 74 additions & 2 deletions

File tree

src/LiveDevelopment/BrowserScripts/DocumentObserver.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,24 @@
2929
var _document = null;
3030
var _transport;
3131

32+
function inIframe () {
33+
try {
34+
return window.self !== window.top;
35+
} catch (e) {
36+
return true;
37+
}
38+
}
39+
40+
if(inIframe()) {
41+
// inside iframes, we disable ctrl-s browser save page workflow as it may be inside the phoenix window
42+
// It will confuse the use seeing the browser save dialog inside phoenix.
43+
document.savePageCtrlSDisabledByPhoenix = true;
44+
document.addEventListener("keydown", function(e) {
45+
if (e.key === 's' && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) {
46+
e.preventDefault();
47+
}
48+
}, false);
49+
}
3250

3351
/**
3452
* Retrieves related documents (external CSS and JS files)

src/extensions/default/Phoenix-live-preview/main.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ define(function (require, exports, module) {
239239
};
240240
return {scrollX, scrollY, currentSrc};
241241
}catch (e) {
242-
return {scrollX: 0, scrollY: 0 , currentSrc};
242+
return {scrollX: 0, scrollY: 0, currentSrc};
243243
}
244244
}
245245

@@ -254,6 +254,13 @@ define(function (require, exports, module) {
254254
_setTitle(previewDetails.filePath);
255255
}
256256
$iframe[0].onload = function () {
257+
$iframe[0].contentDocument.savePageCtrlSDisabledByPhoenix = true;
258+
$iframe[0].contentDocument.addEventListener("keydown", function(e) {
259+
// inside live preview iframe, we disable ctrl-s browser save page dialog
260+
if (e.key === 's' && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) {
261+
e.preventDefault();
262+
}
263+
}, false);
257264
if(saved.currentSrc === newSrc){
258265
$iframe[0].contentWindow.scrollTo(saved.scrollX, saved.scrollY);
259266
} else {

src/extensions/default/StaticServer/markdown.html

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,26 @@
99
<link href="{{{HIGHLIGHT_JS_CSS}}}" rel="stylesheet">
1010
<script src="{{{HIGHLIGHT_JS}}}"></script>
1111
<link rel="stylesheet" href="{{{GFM_CSS}}}" />
12+
<script type="text/javascript">
13+
function inIframe () {
14+
try {
15+
return window.self !== window.top;
16+
} catch (e) {
17+
return true;
18+
}
19+
}
20+
21+
if(inIframe()) {
22+
// inside iframes, we disable ctrl-s browser save page workflow as it may be inside the phoenix window
23+
// It will confuse the use seeing the browser save dialog inside phoenix.
24+
$iframe[0].contentDocument.savePageCtrlSDisabledByPhoenix = true;
25+
document.addEventListener("keydown", function(e) {
26+
if (e.key === 's' && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) {
27+
e.preventDefault();
28+
}
29+
}, false);
30+
}
31+
</script>
1232
<style>
1333

1434
*{

src/utils/Global.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ define(function (require, exports, module) {
7373
global.brackets.shellAPI = require("utils/ShellAPI");
7474

7575
// Determine OS/platform
76-
if (global.navigator.platform === "MacIntel" || global.navigator.platform === "MacPPC") {
76+
if (global.navigator.platform.match("Mac")) {
7777
global.brackets.platform = "mac";
7878
} else if (global.navigator.platform.indexOf("Linux") >= 0) {
7979
global.brackets.platform = "linux";

test/spec/LiveDevelopmentMultiBrowser-test.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,5 +616,32 @@ define(function (require, exports, module) {
616616

617617
await endPreviewSession();
618618
}, 5000);
619+
620+
it("should ctrl-s to save page be disabled inside live preview iframes", async function () {
621+
await awaitsForDone(SpecRunnerUtils.openProjectFiles(["simple1.html"]),
622+
"SpecRunnerUtils.openProjectFiles simple1.html", 1000);
623+
624+
await waitsForLiveDevelopmentToOpen();
625+
await _editFileAndVerifyLivePreview("simple1.html", {line: 11, ch: 45}, 'hello world ',
626+
"testId", "Brackets is hello world awesome!");
627+
let iFrame = testWindow.document.getElementById("panel-live-preview-frame");
628+
expect(iFrame.contentDocument.savePageCtrlSDisabledByPhoenix).toBeTrue();
629+
630+
await awaitsForDone(SpecRunnerUtils.openProjectFiles(["readme.md"]),
631+
"readme.md", 1000);
632+
await awaits(300);
633+
iFrame = testWindow.document.getElementById("panel-live-preview-frame");
634+
expect(iFrame.src.endsWith("readme.md")).toBeTrue();
635+
expect(iFrame.contentDocument.savePageCtrlSDisabledByPhoenix).toBeTrue();
636+
637+
await awaitsForDone(SpecRunnerUtils.openProjectFiles(["sub/icon_chevron.png"]),
638+
"icon_chevron.png", 1000);
639+
await awaits(300);
640+
iFrame = testWindow.document.getElementById("panel-live-preview-frame");
641+
expect(iFrame.src.endsWith("sub/icon_chevron.png")).toBeTrue();
642+
expect(iFrame.contentDocument.savePageCtrlSDisabledByPhoenix).toBeTrue();
643+
644+
await endPreviewSession();
645+
}, 5000);
619646
});
620647
});

0 commit comments

Comments
 (0)