Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / devtools / front_end / bindings / PresentationConsoleMessageHelper.js
index cb4e509..82febad 100644 (file)
  */
 WebInspector.PresentationConsoleMessageHelper = function(workspace)
 {
-    /**
-     * @type {!Object.<string, !Array.<!WebInspector.ConsoleMessage>>}
-     */
+    this._workspace = workspace;
+
+    /** @type {!Object.<string, !Array.<!WebInspector.ConsoleMessage>>} */
     this._pendingConsoleMessages = {};
+
+    /** @type {!Array.<!WebInspector.PresentationConsoleMessage>} */
     this._presentationConsoleMessages = [];
-    this._workspace = workspace;
 
+    /** @type {!Map.<!WebInspector.UISourceCode, !Array.<!WebInspector.PresentationConsoleMessage>>} */
+    this._uiSourceCodeToMessages = new Map();
+
+    /** @type {!Map.<!WebInspector.UISourceCode, !WebInspector.Object>} */
+    this._uiSourceCodeToEventTarget = new Map();
+
+    workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this);
+    workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved, this._projectRemoved, this);
     WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared, this._consoleCleared, this);
     WebInspector.multitargetConsoleModel.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded, this._onConsoleMessageAdded, this);
     WebInspector.multitargetConsoleModel.messages().forEach(this._consoleMessageAdded, this);
@@ -49,8 +58,92 @@ WebInspector.PresentationConsoleMessageHelper = function(workspace)
     WebInspector.targetManager.addModelListener(WebInspector.DebuggerModel, WebInspector.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this);
 }
 
+/**
+ * @enum {string}
+ */
+WebInspector.PresentationConsoleMessageHelper.Events = {
+    ConsoleMessageAdded: "ConsoleMessageAdded",
+    ConsoleMessageRemoved: "ConsoleMessageRemoved",
+    ConsoleMessagesCleared: "ConsoleMessagesCleared",
+}
+
 WebInspector.PresentationConsoleMessageHelper.prototype = {
     /**
+     * @param {!WebInspector.PresentationConsoleMessageHelper.Events} eventType
+     * @param {!WebInspector.UISourceCode} uiSourceCode
+     * @param {function(!WebInspector.Event)} listener
+     * @param {!Object=} thisObject
+     */
+    addConsoleMessageEventListener: function(eventType, uiSourceCode, listener, thisObject)
+    {
+        var target = this._uiSourceCodeToEventTarget.get(uiSourceCode);
+        if (!target) {
+            target = new WebInspector.Object();
+            this._uiSourceCodeToEventTarget.set(uiSourceCode, target);
+        }
+        target.addEventListener(eventType, listener, thisObject);
+    },
+
+    /**
+     * @param {!WebInspector.PresentationConsoleMessageHelper.Events} eventType
+     * @param {!WebInspector.UISourceCode} uiSourceCode
+     * @param {function(!WebInspector.Event)} listener
+     * @param {!Object=} thisObject
+     */
+    removeConsoleMessageEventListener: function(eventType, uiSourceCode, listener, thisObject)
+    {
+        var target = this._uiSourceCodeToEventTarget.get(uiSourceCode);
+        if (!target)
+            return;
+        target.removeEventListener(eventType, listener, thisObject);
+    },
+
+    /**
+     * @param {!WebInspector.UISourceCode} uiSourceCode
+     * @return {!Array.<!WebInspector.PresentationConsoleMessage>}
+     */
+    consoleMessages: function(uiSourceCode)
+    {
+        return this._uiSourceCodeToMessages.get(uiSourceCode) || [];
+    },
+
+    /**
+     * @param {!WebInspector.PresentationConsoleMessageHelper.Events} eventType
+     * @param {!WebInspector.UISourceCode} uiSourceCode
+     * @param {!WebInspector.PresentationConsoleMessage=} message
+     */
+    _dispatchConsoleEvent: function(eventType, uiSourceCode, message)
+    {
+        var target = this._uiSourceCodeToEventTarget.get(uiSourceCode);
+        if (!target)
+            return;
+        target.dispatchEventToListeners(eventType, message);
+    },
+
+    /**
+     * @param {!WebInspector.Event} event
+     */
+    _uiSourceCodeRemoved: function(event)
+    {
+        var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data);
+        this._uiSourceCodeToEventTarget.remove(uiSourceCode);
+        this._uiSourceCodeToMessages.remove(uiSourceCode);
+    },
+
+    /**
+     * @param {!WebInspector.Event} event
+     */
+    _projectRemoved: function(event)
+    {
+        var project = /** @type {!WebInspector.Project} */ (event.data);
+        var uiSourceCodes = project.uiSourceCodes();
+        for (var i = 0; i < uiSourceCodes.length; ++i) {
+            this._uiSourceCodeToEventTarget.remove(uiSourceCodes[i]);
+            this._uiSourceCodeToMessages.remove(uiSourceCodes[i]);
+        }
+    },
+
+    /**
      * @param {!WebInspector.Event} event
      */
     _onConsoleMessageAdded: function(event)
@@ -83,6 +176,8 @@ WebInspector.PresentationConsoleMessageHelper.prototype = {
         // FIXME(62725): stack trace line/column numbers are one-based.
         var lineNumber = message.stackTrace ? message.stackTrace[0].lineNumber - 1 : message.line - 1;
         var columnNumber = message.stackTrace && message.stackTrace[0].columnNumber ? message.stackTrace[0].columnNumber - 1 : 0;
+        if (message.scriptId)
+            return message.target().debuggerModel.createRawLocationByScriptId(message.scriptId, message.url || "", lineNumber, columnNumber);
         return message.target().debuggerModel.createRawLocationByURL(message.url || "", lineNumber, columnNumber);
     },
 
@@ -134,15 +229,44 @@ WebInspector.PresentationConsoleMessageHelper.prototype = {
             delete this._pendingConsoleMessages[script.sourceURL];
     },
 
+    /**
+     * @param {!WebInspector.PresentationConsoleMessage} message
+     */
+    _presentationConsoleMessageAdded: function(message)
+    {
+        var uiSourceCode = message._uiLocation.uiSourceCode;
+        var messages = this._uiSourceCodeToMessages.get(uiSourceCode);
+        if (!messages) {
+            messages = [];
+            this._uiSourceCodeToMessages.set(uiSourceCode, messages);
+        }
+        messages.push(message);
+        this._dispatchConsoleEvent(WebInspector.PresentationConsoleMessageHelper.Events.ConsoleMessageAdded, uiSourceCode, message);
+    },
+
+    /**
+     * @param {!WebInspector.PresentationConsoleMessage} message
+     */
+    _presentationConsoleMessageRemoved: function(message)
+    {
+        var uiSourceCode = message._uiLocation.uiSourceCode;
+        var messages = this._uiSourceCodeToMessages.get(uiSourceCode);
+        if (!messages)
+            return;
+        messages.remove(message);
+        this._dispatchConsoleEvent(WebInspector.PresentationConsoleMessageHelper.Events.ConsoleMessageRemoved, uiSourceCode, message);
+    },
+
     _consoleCleared: function()
     {
         this._pendingConsoleMessages = {};
         for (var i = 0; i < this._presentationConsoleMessages.length; ++i)
             this._presentationConsoleMessages[i].dispose();
         this._presentationConsoleMessages = [];
-        var uiSourceCodes = this._workspace.uiSourceCodes();
-        for (var i = 0; i < uiSourceCodes.length; ++i)
-            uiSourceCodes[i].consoleMessagesCleared();
+        var targets = this._uiSourceCodeToEventTarget.values();
+        for (var i = 0; i < targets.length; ++i)
+            targets[i].dispatchEventToListeners(WebInspector.PresentationConsoleMessageHelper.Events.ConsoleMessagesCleared);
+        this._uiSourceCodeToMessages.clear();
     },
 
     _debuggerReset: function()
@@ -154,7 +278,6 @@ WebInspector.PresentationConsoleMessageHelper.prototype = {
 
 /**
  * @constructor
- * @implements {WebInspector.PresentationMessage}
  * @param {!WebInspector.ConsoleMessage} message
  * @param {!WebInspector.DebuggerModel.Location} rawLocation
  */
@@ -171,9 +294,9 @@ WebInspector.PresentationConsoleMessage.prototype = {
     _updateLocation: function(uiLocation)
     {
         if (this._uiLocation)
-            this._uiLocation.uiSourceCode.consoleMessageRemoved(this);
+            WebInspector.presentationConsoleMessageHelper._presentationConsoleMessageRemoved(this);
         this._uiLocation = uiLocation;
-        this._uiLocation.uiSourceCode.consoleMessageAdded(this);
+        WebInspector.presentationConsoleMessageHelper._presentationConsoleMessageAdded(this);
     },
 
     get lineNumber()
@@ -186,3 +309,6 @@ WebInspector.PresentationConsoleMessage.prototype = {
         this._liveLocation.dispose();
     }
 }
+
+/** @type {!WebInspector.PresentationConsoleMessageHelper} */
+WebInspector.presentationConsoleMessageHelper;
\ No newline at end of file