Web Inspector: Line error widget showed in the wrong resource
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Controllers / IssueManager.js
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 WebInspector.IssueManager = class IssueManager extends WebInspector.Object
27 {
28     constructor()
29     {
30         super();
31
32         WebInspector.Frame.addEventListener(WebInspector.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
33         WebInspector.logManager.addEventListener(WebInspector.LogManager.Event.Cleared, this._logCleared, this);
34
35         this.initialize();
36     }
37
38     static issueMatchSourceCode(issue, sourceCode)
39     {
40         if (sourceCode instanceof WebInspector.SourceMapResource)
41             return issue.sourceCodeLocation && issue.sourceCodeLocation.displaySourceCode === sourceCode;
42         if (sourceCode instanceof WebInspector.Resource)
43             return issue.url === sourceCode.url && (!issue.sourceCodeLocation || issue.sourceCodeLocation.sourceCode === sourceCode);
44         if (sourceCode instanceof WebInspector.Script)
45             return (issue.sourceCodeLocation && issue.sourceCodeLocation.sourceCode === sourceCode) || (!issue.sourceCodeLocation && issue.url === sourceCode.url);
46         return false;
47     }
48
49     // Public
50
51     initialize()
52     {
53         this._issues = [];
54
55         this.dispatchEventToListeners(WebInspector.IssueManager.Event.Cleared);
56     }
57
58     issueWasAdded(consoleMessage)
59     {
60         let issue = new WebInspector.IssueMessage(consoleMessage);
61
62         this._issues.push(issue);
63
64         this.dispatchEventToListeners(WebInspector.IssueManager.Event.IssueWasAdded, {issue});
65     }
66
67     issuesForSourceCode(sourceCode)
68     {
69         var issues = [];
70
71         for (var i = 0; i < this._issues.length; ++i) {
72             var issue = this._issues[i];
73             if (WebInspector.IssueManager.issueMatchSourceCode(issue, sourceCode))
74                 issues.push(issue);
75         }
76
77         return issues;
78     }
79
80     // Private
81
82     _logCleared(event)
83     {
84         this.initialize();
85     }
86
87     _mainResourceDidChange(event)
88     {
89         console.assert(event.target instanceof WebInspector.Frame);
90
91         if (!event.target.isMainFrame())
92             return;
93
94         this.initialize();
95     }
96 };
97
98 WebInspector.IssueManager.Event = {
99     IssueWasAdded: "issue-manager-issue-was-added",
100     Cleared: "issue-manager-cleared"
101 };