浏览代码

Moved worker handling code from App.js to WorkerWaiter.js

n1474335 7 年之前
父节点
当前提交
8c960f0661
共有 4 个文件被更改,包括 167 次插入114 次删除
  1. 1 1
      src/core/operations/Hexdump.js
  2. 10 113
      src/web/App.js
  3. 3 0
      src/web/Manager.js
  4. 153 0
      src/web/WorkerWaiter.js

+ 1 - 1
src/core/operations/Hexdump.js

@@ -92,7 +92,7 @@ const Hexdump = {
         const w = (width - 13) / 4;
         const w = (width - 13) / 4;
         // w should be the specified width of the hexdump and therefore a round number
         // w should be the specified width of the hexdump and therefore a round number
         if (Math.floor(w) !== w || input.indexOf("\r") !== -1 || output.indexOf(13) !== -1) {
         if (Math.floor(w) !== w || input.indexOf("\r") !== -1 || output.indexOf(13) !== -1) {
-            if (app) app.options.attemptHighlight = false;
+            if (self) self.setOption("attemptHighlight", false);
         }
         }
         return output;
         return output;
     },
     },

+ 10 - 113
src/web/App.js

@@ -1,5 +1,4 @@
 import Utils from "../core/Utils.js";
 import Utils from "../core/Utils.js";
-import ChefWorker from "worker-loader?inline&fallback=false!../core/ChefWorker.js";
 import Manager from "./Manager.js";
 import Manager from "./Manager.js";
 import HTMLCategory from "./HTMLCategory.js";
 import HTMLCategory from "./HTMLCategory.js";
 import HTMLOperation from "./HTMLOperation.js";
 import HTMLOperation from "./HTMLOperation.js";
@@ -44,7 +43,6 @@ const App = function(categories, operations, defaultFavourites, defaultOptions)
  */
  */
 App.prototype.setup = function() {
 App.prototype.setup = function() {
     document.dispatchEvent(this.manager.appstart);
     document.dispatchEvent(this.manager.appstart);
-    this.registerChefWorker();
     this.initialiseSplitter();
     this.initialiseSplitter();
     this.loadLocalStorage();
     this.loadLocalStorage();
     this.populateOperationsList();
     this.populateOperationsList();
@@ -58,22 +56,6 @@ App.prototype.setup = function() {
 };
 };
 
 
 
 
-/**
- * Sets up the ChefWorker and associated listeners.
- */
-App.prototype.registerChefWorker = function() {
-    this.chefWorker = new ChefWorker();
-    this.chefWorker.addEventListener("message", this.handleChefMessage.bind(this));
-
-    let docURL = document.location.href.split(/[#?]/)[0];
-    const index = docURL.lastIndexOf("/");
-    if (index > 0) {
-        docURL = docURL.substring(0, index);
-    }
-    this.chefWorker.postMessage({"action": "docURL", "data": docURL});
-};
-
-
 /**
 /**
  * Fires once all setup activities have completed.
  * Fires once all setup activities have completed.
  *
  *
@@ -114,18 +96,6 @@ App.prototype.handleError = function(err) {
 };
 };
 
 
 
 
-/**
- * Updates the UI to show if baking is in process or not.
- *
- * @param {bakingStatus}
- */
-App.prototype.setBakingStatus = function(bakingStatus) {
-    this.baking = bakingStatus;
-
-    this.manager.output.toggleLoader(bakingStatus);
-};
-
-
 /**
 /**
  * Asks the ChefWorker to bake the current input using the current recipe.
  * Asks the ChefWorker to bake the current input using the current recipe.
  *
  *
@@ -135,81 +105,13 @@ App.prototype.setBakingStatus = function(bakingStatus) {
 App.prototype.bake = function(step) {
 App.prototype.bake = function(step) {
     if (this.baking) return;
     if (this.baking) return;
 
 
-    this.setBakingStatus(true);
-
-    this.chefWorker.postMessage({
-        action: "bake",
-        data: {
-            input: this.getInput(),                 // The user's input
-            recipeConfig: this.getRecipeConfig(),   // The configuration of the recipe
-            options: this.options,                  // Options set by the user
-            progress: this.progress,                // The current position in the recipe
-            step: step                              // Whether or not to take one step or execute the whole recipe
-        }
-    });
-};
-
-
-/**
- * Cancels the current bake by terminating the ChefWorker and creating a new one.
- */
-App.prototype.cancelBake = function() {
-    this.chefWorker.terminate();
-    this.registerChefWorker();
-    this.setBakingStatus(false);
-    this.manager.controls.showStaleIndicator();
-};
-
-
-/**
- * Handler for messages sent back by the ChefWorker.
- *
- * @param {MessageEvent} e
- */
-App.prototype.handleChefMessage = function(e) {
-    switch (e.data.action) {
-        case "bakeSuccess":
-            this.bakingComplete(e.data.data);
-            break;
-        case "bakeError":
-            this.handleError(e.data.data);
-            this.setBakingStatus(false);
-            break;
-        case "silentBakeComplete":
-            break;
-        case "workerLoaded":
-            this.workerLoaded = true;
-            this.loaded();
-            break;
-        case "statusMessage":
-            this.manager.output.setStatusMsg(e.data.data);
-            break;
-        default:
-            console.error("Unrecognised message from ChefWorker", e);
-            break;
-    }
-};
-
-
-/**
- * Handler for completed bakes.
- *
- * @param {Object} response
- */
-App.prototype.bakingComplete = function(response) {
-    this.setBakingStatus(false);
-
-    if (!response) return;
-
-    if (response.error) {
-        this.handleError(response.error);
-    }
-
-    this.options  = response.options;
-    this.dishStr  = response.type === "html" ? Utils.stripHtmlTags(response.result, true) : response.result;
-    this.progress = response.progress;
-    this.manager.recipe.updateBreakpointIndicator(response.progress);
-    this.manager.output.set(response.result, response.type, response.duration);
+    this.manager.worker.bake(
+        this.getInput(),        // The user's input
+        this.getRecipeConfig(), // The configuration of the recipe
+        this.options,           // Options set by the user
+        this.progress,          // The current position in the recipe
+        step                    // Whether or not to take one step or execute the whole recipe
+    );
 };
 };
 
 
 
 
@@ -226,8 +128,8 @@ App.prototype.autoBake = function() {
 
 
 
 
 /**
 /**
- * Asks the ChefWorker to run a silent bake, forcing the browser to load and cache all the relevant
- * JavaScript code needed to do a real bake.
+ * Runs a silent bake, forcing the browser to load and cache all the relevant JavaScript code needed
+ * to do a real bake.
  *
  *
  * The output will not be modified (hence "silent" bake). This will only actually execute the recipe
  * The output will not be modified (hence "silent" bake). This will only actually execute the recipe
  * if auto-bake is enabled, otherwise it will just wake up the ChefWorker with an empty recipe.
  * if auto-bake is enabled, otherwise it will just wake up the ChefWorker with an empty recipe.
@@ -241,12 +143,7 @@ App.prototype.silentBake = function() {
         recipeConfig = this.getRecipeConfig();
         recipeConfig = this.getRecipeConfig();
     }
     }
 
 
-    this.chefWorker.postMessage({
-        action: "silentBake",
-        data: {
-            recipeConfig: recipeConfig
-        }
-    });
+    this.manager.worker.silentBake(recipeConfig);
 };
 };
 
 
 
 

+ 3 - 0
src/web/Manager.js

@@ -1,3 +1,4 @@
+import WorkerWaiter from "./WorkerWaiter.js";
 import WindowWaiter from "./WindowWaiter.js";
 import WindowWaiter from "./WindowWaiter.js";
 import ControlsWaiter from "./ControlsWaiter.js";
 import ControlsWaiter from "./ControlsWaiter.js";
 import RecipeWaiter from "./RecipeWaiter.js";
 import RecipeWaiter from "./RecipeWaiter.js";
@@ -49,6 +50,7 @@ const Manager = function(app) {
     this.statechange = new CustomEvent("statechange", {bubbles: true});
     this.statechange = new CustomEvent("statechange", {bubbles: true});
 
 
     // Define Waiter objects to handle various areas
     // Define Waiter objects to handle various areas
+    this.worker      = new WorkerWaiter(this.app, this);
     this.window      = new WindowWaiter(this.app);
     this.window      = new WindowWaiter(this.app);
     this.controls    = new ControlsWaiter(this.app, this);
     this.controls    = new ControlsWaiter(this.app, this);
     this.recipe      = new RecipeWaiter(this.app, this);
     this.recipe      = new RecipeWaiter(this.app, this);
@@ -70,6 +72,7 @@ const Manager = function(app) {
  * Sets up the various components and listeners.
  * Sets up the various components and listeners.
  */
  */
 Manager.prototype.setup = function() {
 Manager.prototype.setup = function() {
+    this.worker.registerChefWorker();
     this.recipe.initialiseOperationDragNDrop();
     this.recipe.initialiseOperationDragNDrop();
     this.controls.autoBakeChange();
     this.controls.autoBakeChange();
     this.seasonal.load();
     this.seasonal.load();

+ 153 - 0
src/web/WorkerWaiter.js

@@ -0,0 +1,153 @@
+import Utils from "../core/Utils.js";
+import ChefWorker from "worker-loader?inline&fallback=false!../core/ChefWorker.js";
+
+/**
+ * Waiter to handle conversations with the ChefWorker.
+ *
+ * @author n1474335 [n1474335@gmail.com]
+ * @copyright Crown Copyright 2017
+ * @license Apache-2.0
+ *
+ * @constructor
+ * @param {App} app - The main view object for CyberChef.
+ * @param {Manager} manager - The CyberChef event manager.
+ */
+const WorkerWaiter = function(app, manager) {
+    this.app = app;
+    this.manager = manager;
+};
+
+
+/**
+ * Sets up the ChefWorker and associated listeners.
+ */
+WorkerWaiter.prototype.registerChefWorker = function() {
+    this.chefWorker = new ChefWorker();
+    this.chefWorker.addEventListener("message", this.handleChefMessage.bind(this));
+
+    let docURL = document.location.href.split(/[#?]/)[0];
+    const index = docURL.lastIndexOf("/");
+    if (index > 0) {
+        docURL = docURL.substring(0, index);
+    }
+    this.chefWorker.postMessage({"action": "docURL", "data": docURL});
+};
+
+
+/**
+ * Handler for messages sent back by the ChefWorker.
+ *
+ * @param {MessageEvent} e
+ */
+WorkerWaiter.prototype.handleChefMessage = function(e) {
+    switch (e.data.action) {
+        case "bakeSuccess":
+            this.bakingComplete(e.data.data);
+            break;
+        case "bakeError":
+            this.app.handleError(e.data.data);
+            this.setBakingStatus(false);
+            break;
+        case "silentBakeComplete":
+            break;
+        case "workerLoaded":
+            this.app.workerLoaded = true;
+            this.app.loaded();
+            break;
+        case "statusMessage":
+            this.manager.output.setStatusMsg(e.data.data);
+            break;
+        default:
+            console.error("Unrecognised message from ChefWorker", e);
+            break;
+    }
+};
+
+
+/**
+ * Updates the UI to show if baking is in process or not.
+ *
+ * @param {bakingStatus}
+ */
+WorkerWaiter.prototype.setBakingStatus = function(bakingStatus) {
+    this.app.baking = bakingStatus;
+
+    this.manager.output.toggleLoader(bakingStatus);
+};
+
+
+/**
+ * Cancels the current bake by terminating the ChefWorker and creating a new one.
+ */
+WorkerWaiter.prototype.cancelBake = function() {
+    this.chefWorker.terminate();
+    this.registerChefWorker();
+    this.setBakingStatus(false);
+    this.manager.controls.showStaleIndicator();
+};
+
+
+/**
+ * Handler for completed bakes.
+ *
+ * @param {Object} response
+ */
+WorkerWaiter.prototype.bakingComplete = function(response) {
+    this.setBakingStatus(false);
+
+    if (!response) return;
+
+    if (response.error) {
+        this.app.handleError(response.error);
+    }
+
+    this.app.options  = response.options;
+    this.app.dishStr  = response.type === "html" ? Utils.stripHtmlTags(response.result, true) : response.result;
+    this.app.progress = response.progress;
+    this.manager.recipe.updateBreakpointIndicator(response.progress);
+    this.manager.output.set(response.result, response.type, response.duration);
+};
+
+
+/**
+ * Asks the ChefWorker to bake the current input using the current recipe.
+ *
+ * @param {string} input
+ * @param {Object[]} recipeConfig
+ * @param {Object} options
+ * @param {number} progress
+ * @param {boolean} step
+ */
+WorkerWaiter.prototype.bake = function(input, recipeConfig, options, progress, step) {
+    this.setBakingStatus(true);
+
+    this.chefWorker.postMessage({
+        action: "bake",
+        data: {
+            input: input,
+            recipeConfig: recipeConfig,
+            options: options,
+            progress: progress,
+            step: step
+        }
+    });
+};
+
+
+/**
+ * Asks the ChefWorker to run a silent bake, forcing the browser to load and cache all the relevant
+ * JavaScript code needed to do a real bake.
+ *
+ * @param {Objectp[]} [recipeConfig]
+ */
+WorkerWaiter.prototype.silentBake = function(recipeConfig) {
+    this.chefWorker.postMessage({
+        action: "silentBake",
+        data: {
+            recipeConfig: recipeConfig
+        }
+    });
+};
+
+
+export default WorkerWaiter;