diff --git a/Plan/bukkit/src/main/java/com/djrapitops/plan/system/tasks/BukkitTaskSystem.java b/Plan/bukkit/src/main/java/com/djrapitops/plan/system/tasks/BukkitTaskSystem.java index f31fa8914..28cfe0396 100644 --- a/Plan/bukkit/src/main/java/com/djrapitops/plan/system/tasks/BukkitTaskSystem.java +++ b/Plan/bukkit/src/main/java/com/djrapitops/plan/system/tasks/BukkitTaskSystem.java @@ -31,6 +31,7 @@ import com.djrapitops.plugin.task.RunnableFactory; import org.bukkit.Bukkit; import javax.inject.Inject; +import java.util.Optional; import java.util.concurrent.TimeUnit; /** @@ -88,6 +89,6 @@ public class BukkitTaskSystem extends ServerTaskSystem { @Override public void disable() { super.disable(); - Bukkit.getScheduler().cancelTasks(plugin); + Optional.ofNullable(Bukkit.getScheduler()).ifPresent(scheduler -> scheduler.cancelTasks(plugin)); } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/utilities/file/export/HtmlExport.java b/Plan/common/src/main/java/com/djrapitops/plan/utilities/file/export/HtmlExport.java index 506a25217..8b1957c51 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/utilities/file/export/HtmlExport.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/utilities/file/export/HtmlExport.java @@ -174,6 +174,7 @@ public class HtmlExport extends SpecificExport { private void exportJs() { String[] resources = new String[]{ + "web/js/demo.js", "web/js/admin.js", "web/js/helpers.js", "web/js/script.js", diff --git a/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/pages/DebugPage.java b/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/pages/DebugPage.java index c9a4efd9e..910711ea8 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/pages/DebugPage.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/pages/DebugPage.java @@ -60,7 +60,7 @@ public class DebugPage implements Page { private final ConnectionSystem connectionSystem; private final CombineDebugLogger debugLogger; private final Timings timings; - private final DefaultErrorHandler errorHandler; + private final ErrorHandler errorHandler; private final Formatter secondFormatter; private final Formatter yearFormatter; @@ -79,7 +79,7 @@ public class DebugPage implements Page { this.connectionSystem = connectionSystem; this.debugLogger = (CombineDebugLogger) debugLogger; this.timings = timings; - this.errorHandler = (DefaultErrorHandler) errorHandler; + this.errorHandler = errorHandler; this.secondFormatter = formatters.second(); this.yearFormatter = formatters.yearLong(); @@ -268,6 +268,16 @@ public class DebugPage implements Page { private void appendLoggedErrors(StringBuilder content) { content.append("
### Logged Errors
"); + if (errorHandler instanceof DefaultErrorHandler) { + appendErrorLines(content, (DefaultErrorHandler) errorHandler); + } else { + content.append("Using incompatible ErrorHandler"); + } + + content.append("
"); + } + + private void appendErrorLines(StringBuilder content, DefaultErrorHandler errorHandler) { List lines = errorHandler.getErrorHandler(FolderTimeStampErrorFileLogger.class) .flatMap(FolderTimeStampFileLogger::getCurrentFile) .map(file -> { @@ -300,7 +310,6 @@ public class DebugPage implements Page { } else { content.append("**No Errors logged.**
"); } - content.append(""); } private void appendDebugLog(StringBuilder content) { diff --git a/Plan/common/src/main/resources/web/player.html b/Plan/common/src/main/resources/web/player.html index ff432cca5..3c030df11 100644 --- a/Plan/common/src/main/resources/web/player.html +++ b/Plan/common/src/main/resources/web/player.html @@ -32,6 +32,9 @@ + + + @@ -795,9 +798,6 @@ - - - diff --git a/Plan/common/src/test/java/utilities/mocks/Mocker.java b/Plan/common/src/test/java/utilities/mocks/Mocker.java index 983f37a89..6b93bc509 100644 --- a/Plan/common/src/test/java/utilities/mocks/Mocker.java +++ b/Plan/common/src/test/java/utilities/mocks/Mocker.java @@ -5,10 +5,12 @@ package utilities.mocks; import com.djrapitops.plan.PlanPlugin; +import org.mockito.Mockito; import java.io.*; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; /** * Abstract Mocker for methods that can be used for both Bungee and Bukkit. @@ -58,14 +60,61 @@ abstract class Mocker { } void withPluginFiles() throws Exception { - withPluginFile("bungeeconfig.yml"); - withPluginFile("config.yml"); - withPluginFile("web/server.html"); - withPluginFile("web/player.html"); - withPluginFile("web/network.html"); - withPluginFile("web/error.html"); - withPluginFile("themes/theme.yml"); - withPluginFile("DefaultServerInfoFile.yml"); + when(planMock.getResource(Mockito.anyString())).thenCallRealMethod(); + for (String fileName : new String[]{ + "bungeeconfig.yml", + "config.yml", + "DefaultServerInfoFile.yml", + "themes/theme.yml", + + "web/server.html", + "web/player.html", + "web/network.html", + "web/error.html", + + "web/css/main.css", + "web/css/materialize.css", + "web/css/style.css", + "web/css/themes/all-themes.css", + + "web/js/demo.js", + "web/js/admin.js", + "web/js/helpers.js", + "web/js/script.js", + "web/js/charts/activityPie.js", + "web/js/charts/lineGraph.js", + "web/js/charts/horizontalBarGraph.js", + "web/js/charts/stackGraph.js", + "web/js/charts/performanceGraph.js", + "web/js/charts/playerGraph.js", + "web/js/charts/playerGraphNoNav.js", + "web/js/charts/resourceGraph.js", + "web/js/charts/diskGraph.js", + "web/js/charts/tpsGraph.js", + "web/js/charts/worldGraph.js", + "web/js/charts/worldMap.js", + "web/js/charts/punchCard.js", + "web/js/charts/serverPie.js", + "web/js/charts/worldPie.js", + "web/js/charts/healthGauge.js", + "web/js/charts/sessionCalendar.js", + "web/js/charts/onlineActivityCalendar.js", + + "web/plugins/bootstrap/css/bootstrap.css", + "web/plugins/node-waves/waves.css", + "web/plugins/node-waves/waves.js", + "web/plugins/animate-css/animate.css", + "web/plugins/jquery-slimscroll/jquery.slimscroll.js", + "web/plugins/jquery/jquery.min.js", + "web/plugins/bootstrap/js/bootstrap.js", + "web/plugins/jquery-datatable/skin/bootstrap/js/dataTables.bootstrap.js", + "web/plugins/jquery-datatable/jquery.dataTables.js", + "web/plugins/fullcalendar/fullcalendar.min.js", + "web/plugins/fullcalendar/fullcalendar.min.css", + "web/plugins/momentjs/moment.js" + }) { + withPluginFile(fileName); + } } } diff --git a/Plan/plugin/src/test/java/com/djrapitops/plan/system/webserver/JSErrorRegressionTest.java b/Plan/plugin/src/test/java/com/djrapitops/plan/system/webserver/JSErrorRegressionTest.java new file mode 100644 index 000000000..e46b1ea2e --- /dev/null +++ b/Plan/plugin/src/test/java/com/djrapitops/plan/system/webserver/JSErrorRegressionTest.java @@ -0,0 +1,128 @@ +package com.djrapitops.plan.system.webserver; + +import com.djrapitops.plan.DaggerPlanBukkitComponent; +import com.djrapitops.plan.PlanBukkitComponent; +import com.djrapitops.plan.data.container.Session; +import com.djrapitops.plan.system.PlanSystem; +import com.djrapitops.plan.system.database.DBSystem; +import com.djrapitops.plan.system.database.databases.operation.SaveOperations; +import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plan.system.settings.config.PlanConfig; +import com.djrapitops.plan.system.webserver.cache.PageId; +import com.djrapitops.plan.system.webserver.cache.ResponseCache; +import com.jayway.awaitility.Awaitility; +import org.junit.*; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; +import org.openqa.selenium.WebDriver; +import rules.SeleniumDriver; +import utilities.TestConstants; +import utilities.mocks.PlanBukkitMocker; + +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +import static org.junit.Assert.assertFalse; + +/** + * This test class is for catching any JavaScript errors. + *

+ * Errors may have been caused by: + * - Missing placeholders {@code ${placeholder}} inside {@code