From a6a04797e47d5c9fed918ef43128819239f69eec Mon Sep 17 00:00:00 2001 From: anshooarora Date: Wed, 14 Nov 2018 16:32:58 -0500 Subject: [PATCH 01/10] fixes #6 time taken is zero --- .../aventstack/extentreports/reporter/AbstractReporter.java | 3 +-- .../aventstack/extentreports/reporter/BasicFileReporter.java | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/aventstack/extentreports/reporter/AbstractReporter.java b/src/main/java/com/aventstack/extentreports/reporter/AbstractReporter.java index 043b471..0b38ce7 100644 --- a/src/main/java/com/aventstack/extentreports/reporter/AbstractReporter.java +++ b/src/main/java/com/aventstack/extentreports/reporter/AbstractReporter.java @@ -21,8 +21,7 @@ public abstract class AbstractReporter protected List statusList; private AnalysisStrategy strategy = AnalysisStrategy.TEST; - - @Override + public void flush(ReportAggregates reportAggregates) { this.endTime = Calendar.getInstance().getTime(); this.statusList = reportAggregates.getStatusList(); diff --git a/src/main/java/com/aventstack/extentreports/reporter/BasicFileReporter.java b/src/main/java/com/aventstack/extentreports/reporter/BasicFileReporter.java index 7b2b144..bf09888 100644 --- a/src/main/java/com/aventstack/extentreports/reporter/BasicFileReporter.java +++ b/src/main/java/com/aventstack/extentreports/reporter/BasicFileReporter.java @@ -163,6 +163,7 @@ public void start() { } public synchronized void flush(ReportAggregates reportAggregates) { + super.flush(reportAggregates); this.authorContext = reportAggregates.getAuthorContext(); this.categoryContext = reportAggregates.getCategoryContext(); this.deviceContext = reportAggregates.getDeviceContext(); @@ -268,11 +269,11 @@ private void autoCreateRelativePathMedia(ScreenCapture screenCapture) throws IOE public void stop() { } public Date getStartTime() { - return super.startTime; + return super.getStartTime(); } public Date getEndTime() { - return super.endTime; + return super.getEndTime(); } @Override From 4684dc36d2cf263ea6a0c0f8afb4f22315895d54 Mon Sep 17 00:00:00 2001 From: anshooarora Date: Wed, 14 Nov 2018 19:00:47 -0500 Subject: [PATCH 02/10] fixes #7 correctly display HTML tags in stacktrace --- .../com/aventstack/extentreports/view/logger/logger-test.ftl | 2 +- .../extentreports/view/v3html/test-view/v3-html-bdd.ftl | 4 ++-- .../extentreports/view/v3html/test-view/v3-html-standard.ftl | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/com/aventstack/extentreports/view/logger/logger-test.ftl b/src/main/resources/com/aventstack/extentreports/view/logger/logger-test.ftl index 2fb59e7..0e3ea58 100644 --- a/src/main/resources/com/aventstack/extentreports/view/logger/logger-test.ftl +++ b/src/main/resources/com/aventstack/extentreports/view/logger/logger-test.ftl @@ -109,7 +109,7 @@ ${log.status?replace("ing","")}<#list log.status.toString()?replace("ing","")?length..5 as x>  ${spacer}[${test.name}] <#if log.hasScreenCapture()>${log.screenCaptureContext.last.sourceWithIcon} - <#if log.details??>${log.details}<#if log.exceptionInfo??>threw an exception
${log.exceptionInfo.stackTrace}
+ <#if log.details??>${log.details}<#if log.exceptionInfo??>threw an exception
diff --git a/src/main/resources/com/aventstack/extentreports/view/v3html/test-view/v3-html-bdd.ftl b/src/main/resources/com/aventstack/extentreports/view/v3html/test-view/v3-html-bdd.ftl index 2a36bb2..2b37d5e 100644 --- a/src/main/resources/com/aventstack/extentreports/view/v3html/test-view/v3-html-bdd.ftl +++ b/src/main/resources/com/aventstack/extentreports/view/v3html/test-view/v3-html-bdd.ftl @@ -41,7 +41,7 @@ <#list child.logContext.all as log> <#if log.exceptionInfo??> -
${log.exceptionInfo.stackTrace}
+ <#else> ${log.details} @@ -63,7 +63,7 @@ <#list gc.logContext.all as log> <#if log.exceptionInfo??> -
${log.exceptionInfo.stackTrace}
+ <#else> ${log.details} diff --git a/src/main/resources/com/aventstack/extentreports/view/v3html/test-view/v3-html-standard.ftl b/src/main/resources/com/aventstack/extentreports/view/v3html/test-view/v3-html-standard.ftl index a7a408c..2613c13 100644 --- a/src/main/resources/com/aventstack/extentreports/view/v3html/test-view/v3-html-standard.ftl +++ b/src/main/resources/com/aventstack/extentreports/view/v3html/test-view/v3-html-standard.ftl @@ -47,7 +47,7 @@ <#if log.exceptionInfo??> -
${log.exceptionInfo.stackTrace}
+ <#else> ${log.details} @@ -117,7 +117,7 @@ <#if log.exceptionInfo??> -
${log.exceptionInfo.stackTrace}
+ <#else> ${log.details} From 6d622606581dc12fc452de9ec48714e98c563def Mon Sep 17 00:00:00 2001 From: anshooarora Date: Sun, 18 Nov 2018 18:37:24 -0500 Subject: [PATCH 03/10] extent.css - update for new cdn commit, init image size to 200px --- .../com/aventstack/extentreports/view/v3html/v3-html-head.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/com/aventstack/extentreports/view/v3html/v3-html-head.ftl b/src/main/resources/com/aventstack/extentreports/view/v3html/v3-html-head.ftl index 2f174bb..b742e0c 100644 --- a/src/main/resources/com/aventstack/extentreports/view/v3html/v3-html-head.ftl +++ b/src/main/resources/com/aventstack/extentreports/view/v3html/v3-html-head.ftl @@ -10,7 +10,7 @@ - + ${ config.getValue('documentTitle') } From 3bbed1442007f2db99a26bafacdc736ef40fd0cc Mon Sep 17 00:00:00 2001 From: anshooarora Date: Mon, 19 Nov 2018 14:13:15 -0500 Subject: [PATCH 04/10] fix issue with LocalMediaStorageHandler not storing images in the correct folders --- .../com/aventstack/extentreports/ExtentTest.java | 2 +- .../extentreports/MediaEntityBuilder.java | 15 +++++++-------- .../mediastorage/LocalMediaStorageHandler.java | 11 ++++++++--- .../extentreports/reporter/BasicFileReporter.java | 6 +++--- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/aventstack/extentreports/ExtentTest.java b/src/main/java/com/aventstack/extentreports/ExtentTest.java index 1506c08..b918ea9 100644 --- a/src/main/java/com/aventstack/extentreports/ExtentTest.java +++ b/src/main/java/com/aventstack/extentreports/ExtentTest.java @@ -308,7 +308,7 @@ public synchronized ExtentTest log(Status status, String details, MediaEntityMod return addLog(evt); } - private void addMedia(Log evt, MediaEntityModelProvider provider) { + private synchronized void addMedia(Log evt, MediaEntityModelProvider provider) { if (provider != null) { Class clazz = provider.getMedia().getClass(); diff --git a/src/main/java/com/aventstack/extentreports/MediaEntityBuilder.java b/src/main/java/com/aventstack/extentreports/MediaEntityBuilder.java index 32c05cb..0f73e6d 100644 --- a/src/main/java/com/aventstack/extentreports/MediaEntityBuilder.java +++ b/src/main/java/com/aventstack/extentreports/MediaEntityBuilder.java @@ -12,7 +12,7 @@ */ public class MediaEntityBuilder { - private static ThreadLocal media; + private static ThreadLocal media = new ThreadLocal(); private static class MediaBuilderInstance { static final MediaEntityBuilder INSTANCE = new MediaEntityBuilder(); @@ -22,7 +22,7 @@ private MediaBuilderInstance() { } private MediaEntityBuilder() { } - private static MediaEntityBuilder getInstance() { + private static synchronized MediaEntityBuilder getInstance() { return MediaBuilderInstance.INSTANCE; } @@ -30,25 +30,25 @@ public MediaEntityModelProvider build() { return new MediaEntityModelProvider(media.get()); } - public static MediaEntityBuilder createScreenCaptureFromPath(String path, String title) throws IOException { + public static synchronized MediaEntityBuilder createScreenCaptureFromPath(String path, String title) throws IOException { if (path == null || path.isEmpty()) throw new IOException("ScreenCapture path cannot be null or empty."); return createScreenCapture(path, title, false); } - public static MediaEntityBuilder createScreenCaptureFromPath(String path) throws IOException { + public static synchronized MediaEntityBuilder createScreenCaptureFromPath(String path) throws IOException { return createScreenCaptureFromPath(path, null); } - public static MediaEntityBuilder createScreenCaptureFromBase64String(String base64String) throws IOException { + public static synchronized MediaEntityBuilder createScreenCaptureFromBase64String(String base64String) throws IOException { if (base64String == null || base64String.trim().equals("")) throw new IOException("Base64 string cannot be null or empty."); return createScreenCapture(base64String, null, true); } - private static MediaEntityBuilder createScreenCapture(String pathOrBase64String, String title, boolean isBase64String) { + private static synchronized MediaEntityBuilder createScreenCapture(String pathOrBase64String, String title, boolean isBase64String) { ScreenCapture sc = new ScreenCapture(); sc.setMediaType(MediaType.IMG); if (isBase64String) @@ -58,8 +58,7 @@ private static MediaEntityBuilder createScreenCapture(String pathOrBase64String, if (title != null) sc.setName(title); - - media = new ThreadLocal(); + media.set(sc); return getInstance(); diff --git a/src/main/java/com/aventstack/extentreports/mediastorage/LocalMediaStorageHandler.java b/src/main/java/com/aventstack/extentreports/mediastorage/LocalMediaStorageHandler.java index f350ac9..ef2427b 100644 --- a/src/main/java/com/aventstack/extentreports/mediastorage/LocalMediaStorageHandler.java +++ b/src/main/java/com/aventstack/extentreports/mediastorage/LocalMediaStorageHandler.java @@ -30,11 +30,16 @@ public void storeMedia(Media screenCapture) throws IOException { } private void mkDirs() { - String fileName = reporterGeneratedFilePath + "."; + String ext = FileUtil.getExtension(reporterGeneratedFilePath); + String archiveName = ""; + if (ext.equalsIgnoreCase("htm") || ext.equalsIgnoreCase("html")) { + archiveName = FileUtil.getFileNameWithoutExtension(reporterGeneratedFilePath) + "."; + } String absolutePath = new File(reporterGeneratedFilePath).getAbsolutePath().replace("\\", "/"); - String basePath = new File(absolutePath).getParent().replace("\\", "/"); + String basePath = archiveName.isEmpty() ? absolutePath : new File(absolutePath).getParent().replace("\\", "/"); + archiveName = archiveName.isEmpty() ? archiveName = FileUtil.getFileNameWithoutExtension(reporterGeneratedFilePath) + "." : archiveName; - mkDirs(basePath, fileName, 0); + mkDirs(basePath, archiveName, 0); } private void mkDirs(String basePath, String fileName, int cnt) { diff --git a/src/main/java/com/aventstack/extentreports/reporter/BasicFileReporter.java b/src/main/java/com/aventstack/extentreports/reporter/BasicFileReporter.java index bf09888..da9ce86 100644 --- a/src/main/java/com/aventstack/extentreports/reporter/BasicFileReporter.java +++ b/src/main/java/com/aventstack/extentreports/reporter/BasicFileReporter.java @@ -55,7 +55,6 @@ public abstract class BasicFileReporter private static final Logger logger = Logger.getLogger(BasicFileReporter.class.getName()); private static final String DEFAULT_MEDIA_SAVE_PROPERTY_NAME = "autoCreateRelativePathMedia"; - private static final String DEFAULT_MEDIA_SAVE_PATH_NAME = "extent-media"; private static final String TEMPLATE_LOCATION = "view/"; private static String ENCODING = "UTF-8"; @@ -163,7 +162,7 @@ public void start() { } public synchronized void flush(ReportAggregates reportAggregates) { - super.flush(reportAggregates); + super.flush(reportAggregates); this.authorContext = reportAggregates.getAuthorContext(); this.categoryContext = reportAggregates.getCategoryContext(); this.deviceContext = reportAggregates.getDeviceContext(); @@ -251,6 +250,7 @@ private void mediaExists(Media m) throws IOException { } private void autoCreateRelativePathMedia(ScreenCapture screenCapture) throws IOException { + // if user has not specific a configuration, exit if (userConfig == null) return; @@ -259,7 +259,7 @@ private void autoCreateRelativePathMedia(ScreenCapture screenCapture) throws IOE if (autoCreateRelativePathMedia != null && Boolean.valueOf(autoCreateRelativePathMedia)) { if (media == null) { media = new LocalMediaStorageHandler(); - media.init(destination + DEFAULT_MEDIA_SAVE_PATH_NAME); + media.init(destination); } media.storeMedia(screenCapture); } From e51b3be7115cfa0ef57e4a0d5052e6e273f4800e Mon Sep 17 00:00:00 2001 From: anshooarora Date: Mon, 19 Nov 2018 14:13:43 -0500 Subject: [PATCH 05/10] Update logger-style.css --- .../offline/logger/css/logger-style.css | 83 +++++++++++++++++-- 1 file changed, 76 insertions(+), 7 deletions(-) diff --git a/src/main/resources/com/aventstack/extentreports/offline/logger/css/logger-style.css b/src/main/resources/com/aventstack/extentreports/offline/logger/css/logger-style.css index 4ff6df9..785c135 100644 --- a/src/main/resources/com/aventstack/extentreports/offline/logger/css/logger-style.css +++ b/src/main/resources/com/aventstack/extentreports/offline/logger/css/logger-style.css @@ -34,9 +34,6 @@ body:not(.dark) .tt,body:not(.dark) .tn,body:not(.dark) .td,body:not(.dark) .dev } body.dark .tt,body.dark .tn,body.dark .td,body.dark .device-list,body.dark .category-list,body.dark .author-list { color: rgba(160,180,200,.95); -} -.dark .logger-content { - } .tsc { margin-bottom: 5px; @@ -56,10 +53,25 @@ div.st { .ts { text-transform: uppercase; } -pre { - background-color: transparent; - margin-left: 250px; - margin-bottom: 0; +pre, .code-block { + background-color: #f8f9fa; + border: 1px solid #ebedef; + border-radius: 4px; + color: #222 !important; + font-family: Consolas,monospace; + font-size: 13px; + margin: 0; + padding: 7px 10px; + white-space: pre-wrap; +} +.dark pre, .dark .code-block { + background: transparent; + border: 1px solid #555; + color: rgba(180,200,220,.95) !important; +} +textarea { + resize: auto; + width: 100%; } #content-aside > div { @@ -112,6 +124,63 @@ pre { .skip { color: #64b5f6; } +.fail-bg, .fatal-bg,.avatar.fail,.avatar.fatal { + background: #e57373; + color: black !important; +} +.pass-bg,.avatar.pass { + background: #9ccc65; + color: black !important; +} +.skip-bg,.avatar.skip { + background: #64b5f6; + color: black !important; +} +.error-bg,.avatar.skip { + background: #ffd54f; + color: black !important; +} + +/*category,exception,attr*/ +.details { + display:none; + animation-duration: 1s; +} +.details td { + border-top: none; +} +.t + .details { + display: table-row; + animation-duration: 1s; +} + +/*[darktheme]*/ +.dark { + color: rgba(195,215,235,.95); +} + +/* JsonTree */ +.jstValue { + font-size: 11px; +} +.jstProperty, .jstFold { + color: #444; +} +.dark .jstProperty, .dark .jstFold { + color: #eee; +} +.jstStr { + color: #00b300; +} +.dark .jstStr { + color: #7ffaaa; +} +.dark .jstBool { + color: #668cff; +} +.dark .jstNum { + color: #ff66ff; +} /* Breakpoint MD */ @media (max-width: 767px) From 5b4eca701794494c37709b3fa2bf41fc7b8a111a Mon Sep 17 00:00:00 2001 From: anshooarora Date: Mon, 19 Nov 2018 14:14:24 -0500 Subject: [PATCH 06/10] style improvements --- .../commons/commons-dashboard-scripts.ftl | 8 +++-- .../view/commons/commons-dashboard.ftl | 34 ++++++++----------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/main/resources/com/aventstack/extentreports/view/commons/commons-dashboard-scripts.ftl b/src/main/resources/com/aventstack/extentreports/view/commons/commons-dashboard-scripts.ftl index 60479c3..0d4ca46 100644 --- a/src/main/resources/com/aventstack/extentreports/view/commons/commons-dashboard-scripts.ftl +++ b/src/main/resources/com/aventstack/extentreports/view/commons/commons-dashboard-scripts.ftl @@ -27,7 +27,8 @@ position: "right", labels: { boxWidth: 7, - fontSize: 10 + fontSize: 12, + fontColor: "#999" } }, cutoutPercentage: 70 @@ -60,7 +61,8 @@ position: "right", labels: { boxWidth: 7, - fontSize: 10 + fontSize: 12, + fontColor: "#999" } }, cutoutPercentage: 70 @@ -94,7 +96,7 @@ position: "right", labels: { boxWidth: 7, - fontSize: 10 + fontSize: 12 } }, cutoutPercentage: 70 diff --git a/src/main/resources/com/aventstack/extentreports/view/commons/commons-dashboard.ftl b/src/main/resources/com/aventstack/extentreports/view/commons/commons-dashboard.ftl index 1ae60f0..973b5bd 100644 --- a/src/main/resources/com/aventstack/extentreports/view/commons/commons-dashboard.ftl +++ b/src/main/resources/com/aventstack/extentreports/view/commons/commons-dashboard.ftl @@ -4,7 +4,7 @@
- ${parentHeading} + ${parentHeading}
${report.reportStatusStats.parentCount} @@ -18,7 +18,7 @@
- ${childHeading} + ${childHeading}
${report.reportStatusStats.childCount} @@ -32,13 +32,13 @@
- Start + Start
${report.startTime?datetime?string}
- +
@@ -46,13 +46,13 @@
- Time Taken + Time Taken
${report.longRunDuration}
- +
@@ -74,20 +74,17 @@
<#if report.reportStatusStats.parentCountPass!=0>
-
${report.reportStatusStats.parentPercentagePass}%
-
Passed
+
 Pass ${report.reportStatusStats.parentPercentagePass?string("#.00")}%
<#if report.reportStatusStats.parentCountFail!=0>
-
${report.reportStatusStats.parentPercentageFail}%
-
Failed
+
 Fail ${report.reportStatusStats.parentPercentageFail?string("#.00")}%
<#if report.reportStatusStats.parentCountSkip!=0>
-
${report.reportStatusStats.parentPercentageSkip}%
-
Skipped
+
 Skip ${report.reportStatusStats.parentPercentageSkip?string("#.00")}%
@@ -115,20 +112,17 @@
<#if report.reportStatusStats.parentCountPass!=0>
-
${report.reportStatusStats.childPercentagePass}%
-
Passed
+
 Pass ${report.reportStatusStats.childPercentagePass?string("#.00")}%
<#if report.reportStatusStats.parentCountFail!=0>
-
${report.reportStatusStats.childPercentageFail}%
-
Failed
+
 Fail ${report.reportStatusStats.childPercentageFail?string("#.00")}%
<#if report.reportStatusStats.parentCountSkip!=0>
-
${report.reportStatusStats.childPercentageSkip}%
-
Skipped
+
 Skip ${report.reportStatusStats.childPercentageSkip?string("#.00")}%
@@ -213,7 +207,7 @@ <#list systemAttributeContext as sa> <#if sa?? && sa.name?? && sa.value??> - ${ sa.name } + ${ sa.name } ${ sa.value } @@ -237,7 +231,7 @@ <#list categoryContext as category> - ${category.name} + ${category.name} ${category.passed} ${category.failed} ${category.others} From 61603f623265b78643b53c6352c51cc274efe825 Mon Sep 17 00:00:00 2001 From: anshooarora Date: Mon, 19 Nov 2018 14:15:10 -0500 Subject: [PATCH 07/10] logger-reporter: allow navigating to test view from attributes/bug view --- .../extentreports/offline/commons/js/attr.js | 21 +++++++++++++++++-- .../offline/logger/js/logger-scripts.js | 14 ++++++++++++- .../view/commons/commons-exception.ftl | 1 + .../view/commons/commons-tag.ftl | 1 + .../view/logger/partials/logger-nav.ftl | 20 +++++++++--------- 5 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/main/resources/com/aventstack/extentreports/offline/commons/js/attr.js b/src/main/resources/com/aventstack/extentreports/offline/commons/js/attr.js index bf4b227..08ed890 100644 --- a/src/main/resources/com/aventstack/extentreports/offline/commons/js/attr.js +++ b/src/main/resources/com/aventstack/extentreports/offline/commons/js/attr.js @@ -20,6 +20,11 @@ null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio" **/ !function(a){"use strict";function b(a,c){if(!(this instanceof b)){var d=new b(a,c);return d.open(),d}this.id=b.id++,this.setup(a,c),this.chainCallbacks(b._callbackChain)}function c(a,b){var c={};for(var d in a)d in b&&(c[d]=a[d],delete a[d]);return c}function d(a,b){var c={},d=new RegExp("^"+b+"([A-Z])(.*)");for(var e in a){var f=e.match(d);if(f){var g=(f[1]+f[2].replace(/([A-Z])/g,"-$1")).toLowerCase();c[g]=a[e]}}return c}if("undefined"==typeof a)return void("console"in window&&window.console.info("Too much lightness, Featherlight needs jQuery."));if(a.fn.jquery.match(/-ajax/))return void("console"in window&&window.console.info("Featherlight needs regular jQuery, not the slim version."));var e=[],f=function(b){return e=a.grep(e,function(a){return a!==b&&a.$instance.closest("body").length>0})},g={allow:1,allowfullscreen:1,frameborder:1,height:1,longdesc:1,marginheight:1,marginwidth:1,mozallowfullscreen:1,name:1,referrerpolicy:1,sandbox:1,scrolling:1,src:1,srcdoc:1,style:1,webkitallowfullscreen:1,width:1},h={keyup:"onKeyUp",resize:"onResize"},i=function(c){a.each(b.opened().reverse(),function(){return c.isDefaultPrevented()||!1!==this[h[c.type]](c)?void 0:(c.preventDefault(),c.stopPropagation(),!1)})},j=function(c){if(c!==b._globalHandlerInstalled){b._globalHandlerInstalled=c;var d=a.map(h,function(a,c){return c+"."+b.prototype.namespace}).join(" ");a(window)[c?"on":"off"](d,i)}};b.prototype={constructor:b,namespace:"featherlight",targetAttr:"data-featherlight",variant:null,resetCss:!1,background:null,openTrigger:"click",closeTrigger:"click",filter:null,root:"body",openSpeed:250,closeSpeed:250,closeOnClick:"background",closeOnEsc:!0,closeIcon:"✕",loading:"",persist:!1,otherClose:null,beforeOpen:a.noop,beforeContent:a.noop,beforeClose:a.noop,afterOpen:a.noop,afterContent:a.noop,afterClose:a.noop,onKeyUp:a.noop,onResize:a.noop,type:null,contentFilters:["jquery","image","html","ajax","iframe","text"],setup:function(b,c){"object"!=typeof b||b instanceof a!=!1||c||(c=b,b=void 0);var d=a.extend(this,c,{target:b}),e=d.resetCss?d.namespace+"-reset":d.namespace,f=a(d.background||['
','
','",'
'+d.loading+"
","
","
"].join("")),g="."+d.namespace+"-close"+(d.otherClose?","+d.otherClose:"");return d.$instance=f.clone().addClass(d.variant),d.$instance.on(d.closeTrigger+"."+d.namespace,function(b){if(!b.isDefaultPrevented()){var c=a(b.target);("background"===d.closeOnClick&&c.is("."+d.namespace)||"anywhere"===d.closeOnClick||c.closest(g).length)&&(d.close(b),b.preventDefault())}}),this},getContent:function(){if(this.persist!==!1&&this.$content)return this.$content;var b=this,c=this.constructor.contentFilters,d=function(a){return b.$currentTarget&&b.$currentTarget.attr(a)},e=d(b.targetAttr),f=b.target||e||"",g=c[b.type];if(!g&&f in c&&(g=c[f],f=b.target&&e),f=f||d("href")||"",!g)for(var h in c)b[h]&&(g=c[h],f=b[h]);if(!g){var i=f;if(f=null,a.each(b.contentFilters,function(){return g=c[this],g.test&&(f=g.test(i)),!f&&g.regex&&i.match&&i.match(g.regex)&&(f=i),!f}),!f)return"console"in window&&window.console.error("Featherlight: no content filter found "+(i?' for "'+i+'"':" (no target specified)")),!1}return g.process.call(b,f)},setContent:function(b){return this.$instance.removeClass(this.namespace+"-loading"),this.$instance.toggleClass(this.namespace+"-iframe",b.is("iframe")),this.$instance.find("."+this.namespace+"-inner").not(b).slice(1).remove().end().replaceWith(a.contains(this.$instance[0],b[0])?"":b),this.$content=b.addClass(this.namespace+"-inner"),this},open:function(b){var c=this;if(c.$instance.hide().appendTo(c.root),!(b&&b.isDefaultPrevented()||c.beforeOpen(b)===!1)){b&&b.preventDefault();var d=c.getContent();if(d)return e.push(c),j(!0),c.$instance.fadeIn(c.openSpeed),c.beforeContent(b),a.when(d).always(function(a){c.setContent(a),c.afterContent(b)}).then(c.$instance.promise()).done(function(){c.afterOpen(b)})}return c.$instance.detach(),a.Deferred().reject().promise()},close:function(b){var c=this,d=a.Deferred();return c.beforeClose(b)===!1?d.reject():(0===f(c).length&&j(!1),c.$instance.fadeOut(c.closeSpeed,function(){c.$instance.detach(),c.afterClose(b),d.resolve()})),d.promise()},resize:function(a,b){if(a&&b){this.$content.css("width","").css("height","");var c=Math.max(a/(this.$content.parent().width()-1),b/(this.$content.parent().height()-1));c>1&&(c=b/Math.floor(b/c),this.$content.css("width",""+a/c+"px").css("height",""+b/c+"px"))}},chainCallbacks:function(b){for(var c in b)this[c]=a.proxy(b[c],this,a.proxy(this[c],this))}},a.extend(b,{id:0,autoBind:"[data-featherlight]",defaults:b.prototype,contentFilters:{jquery:{regex:/^[#.]\w/,test:function(b){return b instanceof a&&b},process:function(b){return this.persist!==!1?a(b):a(b).clone(!0)}},image:{regex:/\.(png|jpg|jpeg|gif|tiff?|bmp|svg)(\?\S*)?$/i,process:function(b){var c=this,d=a.Deferred(),e=new Image,f=a('');return e.onload=function(){f.naturalWidth=e.width,f.naturalHeight=e.height,d.resolve(f)},e.onerror=function(){d.reject(f)},e.src=b,d.promise()}},html:{regex:/^\s*<[\w!][^<]*>/,process:function(b){return a(b)}},ajax:{regex:/./,process:function(b){var c=a.Deferred(),d=a("
").load(b,function(a,b){"error"!==b&&c.resolve(d.contents()),c.fail()});return c.promise()}},iframe:{process:function(b){var e=new a.Deferred,f=a("