Skip to content
This repository was archived by the owner on Sep 6, 2021. It is now read-only.

Commit f071713

Browse files
committed
Add pref for extensionless preview, add tests.
1 parent 1c626c0 commit f071713

File tree

3 files changed

+110
-7
lines changed

3 files changed

+110
-7
lines changed

src/extensions/default/QuickView/main.js

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ define(function (require, exports, module) {
4848
$previewContainer, // Preview container
4949
$previewContent, // Preview content holder
5050
lastMousePos, // Last mouse position
51-
animationRequest; // Request for animation frame
51+
animationRequest, // Request for animation frame
52+
extensionlessImagePreview; // Whether to try and preview extensionless URLs
5253

5354
// Constants
5455
var CMD_ENABLE_QUICK_VIEW = "view.enableQuickView",
@@ -60,6 +61,9 @@ define(function (require, exports, module) {
6061

6162
prefs = PreferencesManager.getExtensionPrefs("quickview");
6263
prefs.definePreference("enabled", "boolean", true);
64+
// Whether or not to try and show image previews for URLs missing extensions
65+
// (e.g., https://avatars2.githubusercontent.com/u/476009?v=3&s=200)
66+
prefs.definePreference("extensionlessImagePreview", "boolean", true);
6367

6468
/**
6569
* There are three states for this var:
@@ -471,14 +475,17 @@ define(function (require, exports, module) {
471475

472476
// Use this URL if this is an absolute URL and either points to a
473477
// filename with a known image extension, or lacks an extension (e.g.,
474-
// a web service that returns an image).
475-
if (hasProtocol && (isImage || !ext)) {
478+
// a web service that returns an image). Honour the extensionlessImagePreview
479+
// preference as well in the latter case.
480+
if (hasProtocol && (isImage || (!ext && extensionlessImagePreview))) {
476481
imgPath = tokenString;
477482
}
478483
// Use this filename if this is a path with a known image extension.
479484
else if (!hasProtocol && isImage) {
480485
imgPath = "file:///" + FileUtils.getDirectoryPath(docPath) + tokenString;
481-
} else {
486+
}
487+
488+
if (!imgPath) {
482489
return null;
483490
}
484491

@@ -535,7 +542,6 @@ define(function (require, exports, module) {
535542
* Lacks only hoverTimer (supplied by handleMouseMove()) and marker (supplied by showPreview()).
536543
*/
537544
function queryPreviewProviders(editor, pos, token) {
538-
539545
var line = editor.document.getLine(pos.line);
540546

541547
// FUTURE: Support plugin providers. For now we just hard-code...
@@ -732,6 +738,14 @@ define(function (require, exports, module) {
732738
CommandManager.get(CMD_ENABLE_QUICK_VIEW).setChecked(enabled);
733739
}
734740

741+
function setExtensionlessImagePreview(_extensionlessImagePreview) {
742+
if(extensionlessImagePreview !== _extensionlessImagePreview) {
743+
extensionlessImagePreview = _extensionlessImagePreview;
744+
prefs.set("extensionlessImagePreview", enabled);
745+
prefs.save();
746+
}
747+
}
748+
735749
function setEnabled(_enabled, doNotSave) {
736750
if (enabled !== _enabled) {
737751
enabled = _enabled;
@@ -798,10 +812,15 @@ define(function (require, exports, module) {
798812

799813
// Setup initial UI state
800814
setEnabled(prefs.get("enabled"), true);
815+
setExtensionlessImagePreview(prefs.get("extensionlessImagePreview"));
801816

802817
prefs.on("change", "enabled", function () {
803818
setEnabled(prefs.get("enabled"), true);
804819
});
820+
821+
prefs.on("change", "extensionlessImagePreview", function () {
822+
setExtensionlessImagePreview(prefs.get("extensionlessImagePreview"));
823+
});
805824

806825
// For unit testing
807826
exports._queryPreviewProviders = queryPreviewProviders;

src/extensions/default/QuickView/unittest-files/test.css

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,3 +190,34 @@ background: -ms-linear-gradient(top, #d2dfed 0%,#c8d7eb 26%,#bed0ea 51%,#a6c0e3
190190
background-image: linear-gradient(to bottom, #333, #CCC;
191191
background-image: -webkit-gradient(linear, left top, left bottom, from(rgb(51,51,51)), to(rgb(204,204,204));
192192
}
193+
194+
.good-preview-image-urls {
195+
background: "http://example.com/image.gif";
196+
background: "http://example.com/image.png";
197+
background: "http://example.com/image.jpe";
198+
background: "http://example.com/image.jpeg";
199+
background: "http://example.com/image.jpg";
200+
background: "http://example.com/image.ico";
201+
background: "http://example.com/image.bmp";
202+
background: "http://example.com/image.svg";
203+
204+
background: "https://image.service.com/id/1234513";
205+
background: "http://image.service.com/id/1234513";
206+
background: "https://image.service.com/id/1234513?w=300&h=400";
207+
}
208+
209+
.ignored-preview-image-urls {
210+
background: "https://website.com/index.html";
211+
background: "https://website.com/style.css";
212+
background: "https://website.com/script.js";
213+
background: "https://website.com/package.json";
214+
background: "https://website.com/readme.md";
215+
background: "https://website.com/data.xml";
216+
background: "https://website.com/music.mp3";
217+
background: "https://website.com/video.ogv";
218+
background: "https://website.com/video.mp4";
219+
background: "https://website.com/video.mpeg";
220+
background: "https://website.com/video.webm";
221+
background: "https://website.com/archive.zip";
222+
background: "https://website.com/archive.tgz";
223+
}

src/extensions/default/QuickView/unittests.js

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
define(function (require, exports, module) {
2828
"use strict";
2929

30-
var SpecRunnerUtils = brackets.getModule("spec/SpecRunnerUtils"),
31-
FileUtils = brackets.getModule("file/FileUtils");
30+
var SpecRunnerUtils = brackets.getModule("spec/SpecRunnerUtils"),
31+
FileUtils = brackets.getModule("file/FileUtils"),
32+
PreferencesManager = brackets.getModule("preferences/PreferencesManager"),
33+
prefs = PreferencesManager.getExtensionPrefs("quickview");
3234

3335
describe("Quick View", function () {
3436
var testFolder = FileUtils.getNativeModuleDirectoryPath(module) + "/unittest-files/";
@@ -472,6 +474,57 @@ define(function (require, exports, module) {
472474
checkImagePathAtPos("img/don't.png", 184, 26); // url("") containing '
473475
checkImageDataAtPos("data:image/svg+xml;utf8, <svg version='1.1' xmlns='http://www.w3.org/2000/svg'></svg>", 185, 26); // data url("") containing '
474476
});
477+
478+
it("Should show image preview for URLs with known image extensions", function() {
479+
checkImageDataAtPos("http://example.com/image.gif", 194, 20);
480+
checkImageDataAtPos("http://example.com/image.png", 195, 20);
481+
checkImageDataAtPos("http://example.com/image.jpe", 196, 20);
482+
checkImageDataAtPos("http://example.com/image.jpeg", 197, 20);
483+
checkImageDataAtPos("http://example.com/image.jpg", 198, 20);
484+
checkImageDataAtPos("http://example.com/image.ico", 199, 20);
485+
checkImageDataAtPos("http://example.com/image.bmp", 200, 20);
486+
checkImageDataAtPos("http://example.com/image.svg", 201, 20);
487+
});
488+
489+
it("Should show image preview for extensionless URLs (with protocol) with pref set", function() {
490+
// Flip the pref on and restore when done
491+
var original = prefs.get("extensionlessImagePreview");
492+
prefs.set("extensionlessImagePreview", true);
493+
494+
checkImageDataAtPos("https://image.service.com/id/1234513", 203, 20); // https
495+
checkImageDataAtPos("http://image.service.com/id/1234513", 204, 20); // http
496+
checkImageDataAtPos("https://image.service.com/id/1234513?w=300&h=400", 205, 20); // qs params
497+
498+
prefs.set("extensionlessImagePreview", original);
499+
});
500+
501+
it("Should not show image preview for extensionless URLs (with protocol) without pref set", function() {
502+
// Flip the pref off and restore when done
503+
var original = prefs.get("extensionlessImagePreview");
504+
prefs.set("extensionlessImagePreview", false);
505+
506+
checkImageDataAtPos("https://image.service.com/id/1234513", 203, 20); // https
507+
checkImageDataAtPos("http://image.service.com/id/1234513", 204, 20); // http
508+
checkImageDataAtPos("https://image.service.com/id/1234513?w=300&h=400", 205, 20); // qs params
509+
510+
prefs.set("extensionlessImagePreview", original);
511+
});
512+
513+
it("Should ignore URLs for common non-image extensions", function() {
514+
expectNoPreviewAtPos(209, 20); // .html
515+
expectNoPreviewAtPos(210, 20); // .css
516+
expectNoPreviewAtPos(211, 20); // .js
517+
expectNoPreviewAtPos(212, 20); // .json
518+
expectNoPreviewAtPos(213, 20); // .md
519+
expectNoPreviewAtPos(214, 20); // .xml
520+
expectNoPreviewAtPos(215, 20); // .mp3
521+
expectNoPreviewAtPos(216, 20); // .ogv
522+
expectNoPreviewAtPos(217, 20); // .mp4
523+
expectNoPreviewAtPos(218, 20); // .mpeg
524+
expectNoPreviewAtPos(219, 20); // .webm
525+
expectNoPreviewAtPos(220, 20); // .zip
526+
expectNoPreviewAtPos(221, 20); // .tgz
527+
});
475528

476529
it("Should show image preview for a data URI inside url()", function () {
477530
runs(function () {

0 commit comments

Comments
 (0)