2011-03-14 Pavel Podivilov <podivilov@chromium.org>

        Reviewed by Yury Semikhatsky.

        Web Inspector: refactor event listener breakpoints.
        https://bugs.webkit.org/show_bug.cgi?id=56305

        * inspector/debugger/event-listener-breakpoints-expected.txt: Added.
        * inspector/debugger/event-listener-breakpoints.html: Added.
        * platform/gtk/Skipped:
        * platform/mac/Skipped:
        * platform/qt/Skipped:
        * platform/win/Skipped:
2011-03-14  Pavel Podivilov  <podivilov@chromium.org>

        Reviewed by Yury Semikhatsky.

        Web Inspector: refactor event listener breakpoints.
        https://bugs.webkit.org/show_bug.cgi?id=56305

        - restore event listener breakpoints one by one instead of using setAllBrowserBreakpoints
        - store event listener breakpoints in a separate separate setting
        - move presentation-related code from BreakpointManager to EventListenerBreakpointsSidebarPane

        Test: inspector/debugger/event-listener-breakpoints.html

        * inspector/Inspector.idl:
        * inspector/InspectorAgent.cpp:
        (WebCore::InspectorAgent::setFrontend):
        * inspector/InspectorBrowserDebuggerAgent.cpp:
        (WebCore::InspectorBrowserDebuggerAgent::setEventListenerBreakpoint):
        (WebCore::InspectorBrowserDebuggerAgent::removeEventListenerBreakpoint):
        (WebCore::InspectorBrowserDebuggerAgent::pauseOnNativeEventIfNeeded):
        (WebCore::InspectorBrowserDebuggerAgent::clear):
        * inspector/InspectorBrowserDebuggerAgent.h:
        * inspector/InspectorInstrumentation.cpp:
        (WebCore::InspectorInstrumentation::didCommitLoadImpl):
        * inspector/front-end/BreakpointManager.js:
        (WebInspector.BreakpointManager.prototype.setEventListenerBreakpoint):
        (WebInspector.BreakpointManager.prototype.removeEventListenerBreakpoint):
        (WebInspector.BreakpointManager.prototype.breakpointViewForEventData):
        (WebInspector.BreakpointManager.prototype._projectChanged):
        (WebInspector.BreakpointManager.prototype._saveBreakpoints):
        (WebInspector.BreakpointManager.prototype._validateBreakpoints):
        (WebInspector.BreakpointManager.prototype._createDOMBreakpointId):
        * inspector/front-end/BreakpointsSidebarPane.js:
        (WebInspector.EventListenerBreakpointsSidebarPane):
        (WebInspector.EventListenerBreakpointsSidebarPane.eventNameForUI):
        (WebInspector.EventListenerBreakpointsSidebarPane.prototype._createCategory):
        (WebInspector.EventListenerBreakpointsSidebarPane.prototype._categoryCheckboxClicked):
        (WebInspector.EventListenerBreakpointsSidebarPane.prototype._breakpointCheckboxClicked):
        (WebInspector.EventListenerBreakpointsSidebarPane.prototype._setBreakpoint):
        (WebInspector.EventListenerBreakpointsSidebarPane.prototype._removeBreakpoint):
        (WebInspector.EventListenerBreakpointsSidebarPane.prototype._updateCategoryCheckbox):
        (WebInspector.EventListenerBreakpointsSidebarPane.prototype.highlightBreakpoint):
        (WebInspector.EventListenerBreakpointsSidebarPane.prototype.clearBreakpointHighlight):
        (WebInspector.EventListenerBreakpointsSidebarPane.prototype._saveBreakpoints):
        (WebInspector.EventListenerBreakpointsSidebarPane.prototype._restoreBreakpoints):
        * inspector/front-end/CallStackSidebarPane.js:
        (WebInspector.CallStackSidebarPane.prototype.update):
        (WebInspector.CallStackSidebarPane.prototype.setStatus):
        (WebInspector.CallStackSidebarPane.prototype._domBreakpointHit):
        * inspector/front-end/ScriptsPanel.js:
        (WebInspector.ScriptsPanel.prototype._debuggerPaused):
        (WebInspector.ScriptsPanel.prototype._clearInterface):
        * inspector/front-end/Settings.js:
        (WebInspector.Settings):

git-svn-id: svn://svn.chromium.org/blink/trunk@81243 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent aebe7b89
2011-03-14 Pavel Podivilov <podivilov@chromium.org>
Reviewed by Yury Semikhatsky.
Web Inspector: refactor event listener breakpoints.
https://bugs.webkit.org/show_bug.cgi?id=56305
* inspector/debugger/event-listener-breakpoints-expected.txt: Added.
* inspector/debugger/event-listener-breakpoints.html: Added.
* platform/gtk/Skipped:
* platform/mac/Skipped:
* platform/qt/Skipped:
* platform/win/Skipped:
2011-03-16 Alexander Pavlov <apavlov@chromium.org>
[Chromium] Unreviewed, update expectations.
Tests event listener breakpoints.
Debugger was enabled.
Running: testClickBreakpoint
Script execution paused.
Call stack:
0) testElementClicked (event-listener-breakpoints.html:7)
1) addListenerAndClick (event-listener-breakpoints.html:16)
2) (:1)
Script execution resumed.
Running: testTimerFiredBreakpoint
Script execution paused.
Call stack:
0) timerFired (event-listener-breakpoints.html:19)
Script execution resumed.
Debugger was disabled.
<html>
<head>
<script src="../../http/tests/inspector/inspector-test.js"></script>
<script src="../../http/tests/inspector/debugger-test.js"></script>
<script>
function testElementClicked()
{
return 0;
}
function addListenerAndClick()
{
var element = document.getElementById("test");
element.addEventListener("click", testElementClicked, true);
element.click();
}
function timerFired()
{
return 0;
}
function test()
{
var pane = WebInspector.panels.scripts.sidebarPanes.eventListenerBreakpoints;
InspectorTest.runDebuggerTestSuite([
function testClickBreakpoint(next)
{
pane._setBreakpoint("listener:click");
InspectorTest.waitUntilPaused(paused);
InspectorTest.evaluateInPageWithTimeout("addListenerAndClick()");
function paused(callFrames)
{
InspectorTest.captureStackTrace(callFrames);
pane._removeBreakpoint("listener:click");
InspectorTest.resumeExecution(resumed);
}
function resumed()
{
InspectorTest.evaluateInPage("addListenerAndClick())", next);
}
},
function testTimerFiredBreakpoint(next)
{
pane._setBreakpoint("instrumentation:timerFired");
InspectorTest.waitUntilPaused(paused);
InspectorTest.evaluateInPage("setTimeout(timerFired, 10)");
function paused(callFrames)
{
InspectorTest.captureStackTrace(callFrames);
pane._removeBreakpoint("instrumentation:timerFired");
InspectorTest.resumeExecution(next);
}
}
]);
}
</script>
</head>
<body onload="runTest()">
<p>
Tests event listener breakpoints.
</p>
<input type=button id="test"></input>
</body>
</html>
......@@ -1184,6 +1184,7 @@ sputnik/Unicode/Unicode_510/S7.6_A5.3_T2.html
# https://bugs.webkit.org/show_bug.cgi?id=43332
inspector/debugger/dom-breakpoints.html
inspector/debugger/event-listener-breakpoints.html
inspector/debugger/xhr-breakpoints.html
# https://bugs.webkit.org/show_bug.cgi?id=40300
......
......@@ -234,6 +234,7 @@ animations/play-state.html
# https://bugs.webkit.org/show_bug.cgi?id=43332
inspector/debugger/dom-breakpoints.html
inspector/debugger/event-listener-breakpoints.html
inspector/debugger/xhr-breakpoints.html
# https://bugs.webkit.org/show_bug.cgi?id=40300
......
......@@ -104,6 +104,7 @@ fast/text/hyphens.html
# https://bugs.webkit.org/show_bug.cgi?id=43332
inspector/debugger/dom-breakpoints.html
inspector/debugger/event-listener-breakpoints.html
inspector/debugger/xhr-breakpoints.html
# https://bugs.webkit.org/show_bug.cgi?id=40300
......
......@@ -1090,6 +1090,7 @@ http/tests/appcache/origin-quota.html
# https://bugs.webkit.org/show_bug.cgi?id=43332
inspector/debugger/dom-breakpoints.html
inspector/debugger/event-listener-breakpoints.html
inspector/debugger/xhr-breakpoints.html
# https://bugs.webkit.org/show_bug.cgi?id=40300
......
2011-03-14 Pavel Podivilov <podivilov@chromium.org>
Reviewed by Yury Semikhatsky.
Web Inspector: refactor event listener breakpoints.
https://bugs.webkit.org/show_bug.cgi?id=56305
- restore event listener breakpoints one by one instead of using setAllBrowserBreakpoints
- store event listener breakpoints in a separate separate setting
- move presentation-related code from BreakpointManager to EventListenerBreakpointsSidebarPane
Test: inspector/debugger/event-listener-breakpoints.html
* inspector/Inspector.idl:
* inspector/InspectorAgent.cpp:
(WebCore::InspectorAgent::setFrontend):
* inspector/InspectorBrowserDebuggerAgent.cpp:
(WebCore::InspectorBrowserDebuggerAgent::setEventListenerBreakpoint):
(WebCore::InspectorBrowserDebuggerAgent::removeEventListenerBreakpoint):
(WebCore::InspectorBrowserDebuggerAgent::pauseOnNativeEventIfNeeded):
(WebCore::InspectorBrowserDebuggerAgent::clear):
* inspector/InspectorBrowserDebuggerAgent.h:
* inspector/InspectorInstrumentation.cpp:
(WebCore::InspectorInstrumentation::didCommitLoadImpl):
* inspector/front-end/BreakpointManager.js:
(WebInspector.BreakpointManager.prototype.setEventListenerBreakpoint):
(WebInspector.BreakpointManager.prototype.removeEventListenerBreakpoint):
(WebInspector.BreakpointManager.prototype.breakpointViewForEventData):
(WebInspector.BreakpointManager.prototype._projectChanged):
(WebInspector.BreakpointManager.prototype._saveBreakpoints):
(WebInspector.BreakpointManager.prototype._validateBreakpoints):
(WebInspector.BreakpointManager.prototype._createDOMBreakpointId):
* inspector/front-end/BreakpointsSidebarPane.js:
(WebInspector.EventListenerBreakpointsSidebarPane):
(WebInspector.EventListenerBreakpointsSidebarPane.eventNameForUI):
(WebInspector.EventListenerBreakpointsSidebarPane.prototype._createCategory):
(WebInspector.EventListenerBreakpointsSidebarPane.prototype._categoryCheckboxClicked):
(WebInspector.EventListenerBreakpointsSidebarPane.prototype._breakpointCheckboxClicked):
(WebInspector.EventListenerBreakpointsSidebarPane.prototype._setBreakpoint):
(WebInspector.EventListenerBreakpointsSidebarPane.prototype._removeBreakpoint):
(WebInspector.EventListenerBreakpointsSidebarPane.prototype._updateCategoryCheckbox):
(WebInspector.EventListenerBreakpointsSidebarPane.prototype.highlightBreakpoint):
(WebInspector.EventListenerBreakpointsSidebarPane.prototype.clearBreakpointHighlight):
(WebInspector.EventListenerBreakpointsSidebarPane.prototype._saveBreakpoints):
(WebInspector.EventListenerBreakpointsSidebarPane.prototype._restoreBreakpoints):
* inspector/front-end/CallStackSidebarPane.js:
(WebInspector.CallStackSidebarPane.prototype.update):
(WebInspector.CallStackSidebarPane.prototype.setStatus):
(WebInspector.CallStackSidebarPane.prototype._domBreakpointHit):
* inspector/front-end/ScriptsPanel.js:
(WebInspector.ScriptsPanel.prototype._debuggerPaused):
(WebInspector.ScriptsPanel.prototype._clearInterface):
* inspector/front-end/Settings.js:
(WebInspector.Settings):
2011-03-16 David Kilzer <ddkilzer@apple.com>
Minor clean-up after r81156, r81172
......
......@@ -239,7 +239,6 @@ module core {
#if defined(ENABLE_JAVASCRIPT_DEBUGGER) && ENABLE_JAVASCRIPT_DEBUGGER
interface [Conditional=INSPECTOR] BrowserDebugger {
void setAllBrowserBreakpoints(in Object breakpoints);
void setDOMBreakpoint(in long nodeId, in long type);
void removeDOMBreakpoint(in long nodeId, in long type);
void setEventListenerBreakpoint(in String eventName);
......
......@@ -385,7 +385,6 @@ void InspectorAgent::setFrontend(InspectorFrontend* inspectorFrontend)
m_resourceAgent->setFrontend(m_frontend);
#if ENABLE(JAVASCRIPT_DEBUGGER)
m_debuggerAgent->setFrontend(m_frontend);
m_browserDebuggerAgent->setFrontend(m_frontend);
m_profilerAgent->setFrontend(m_frontend);
#endif
#if ENABLE(DATABASE)
......
......@@ -41,7 +41,7 @@
#include "InspectorState.h"
#include "InspectorValues.h"
#include "InstrumentingAgents.h"
#include <wtf/text/CString.h>
#include <wtf/text/StringConcatenate.h>
namespace {
......@@ -64,7 +64,7 @@ const int domBreakpointDerivedTypeShift = 16;
namespace WebCore {
namespace BrowserDebuggerAgentState {
static const char browserBreakpoints[] = "browserBreakpoints";
static const char eventListenerBreakpoints[] = "eventListenerBreakpoints";
static const char pauseOnAllXHRs[] = "pauseOnAllXHRs";
static const char xhrBreakpoints[] = "xhrBreakpoints";
}
......@@ -107,75 +107,38 @@ void InspectorBrowserDebuggerAgent::disable()
clear();
}
void InspectorBrowserDebuggerAgent::setFrontend(InspectorFrontend*)
{
// Erase sticky breakpoints. If we are restoring from a cookie setFrontend msut be called
// before the state is loaded from the cookie.
m_inspectorState->setObject(BrowserDebuggerAgentState::browserBreakpoints, InspectorObject::create());
}
void InspectorBrowserDebuggerAgent::clearFrontend()
{
disable();
}
void InspectorBrowserDebuggerAgent::setAllBrowserBreakpoints(ErrorString*, PassRefPtr<InspectorObject> breakpoints)
{
m_inspectorState->setObject(BrowserDebuggerAgentState::browserBreakpoints, breakpoints);
// FIXME: remove this call to inspector agent and dependency on the inspector agent.
inspectedURLChanged(m_inspectorAgent->inspectedURLWithoutFragment());
}
void InspectorBrowserDebuggerAgent::inspectedURLChanged(const String& url)
void InspectorBrowserDebuggerAgent::discardBindings()
{
m_eventListenerBreakpoints.clear();
RefPtr<InspectorObject> allBreakpoints = m_inspectorState->getObject(BrowserDebuggerAgentState::browserBreakpoints);
RefPtr<InspectorArray> breakpoints = allBreakpoints->getArray(url);
if (!breakpoints)
return;
for (unsigned i = 0; i < breakpoints->length(); ++i)
restoreStickyBreakpoint(breakpoints->get(i)->asObject());
m_domBreakpoints.clear();
}
void InspectorBrowserDebuggerAgent::restoreStickyBreakpoint(PassRefPtr<InspectorObject> breakpoint)
void InspectorBrowserDebuggerAgent::setEventListenerBreakpoint(ErrorString* error, const String& eventName)
{
if (!breakpoint)
return;
String type;
if (!breakpoint->getString("type", &type))
return;
bool enabled;
if (!breakpoint->getBoolean("enabled", &enabled))
if (eventName.isEmpty()) {
*error = "Event name is empty";
return;
RefPtr<InspectorObject> condition = breakpoint->getObject("condition");
if (!condition)
return;
ErrorString error;
if (type == eventListenerNativeBreakpointType) {
if (!enabled)
return;
String eventName;
if (!condition->getString("eventName", &eventName))
return;
setEventListenerBreakpoint(&error, eventName);
}
}
void InspectorBrowserDebuggerAgent::discardBindings()
{
m_domBreakpoints.clear();
RefPtr<InspectorObject> eventListenerBreakpoints = m_inspectorState->getObject(BrowserDebuggerAgentState::eventListenerBreakpoints);
eventListenerBreakpoints->setBoolean(eventName, true);
m_inspectorState->setObject(BrowserDebuggerAgentState::eventListenerBreakpoints, eventListenerBreakpoints);
}
void InspectorBrowserDebuggerAgent::setEventListenerBreakpoint(ErrorString*, const String& eventName)
void InspectorBrowserDebuggerAgent::removeEventListenerBreakpoint(ErrorString* error, const String& eventName)
{
m_eventListenerBreakpoints.add(eventName);
}
if (eventName.isEmpty()) {
*error = "Event name is empty";
return;
}
void InspectorBrowserDebuggerAgent::removeEventListenerBreakpoint(ErrorString*, const String& eventName)
{
m_eventListenerBreakpoints.remove(eventName);
RefPtr<InspectorObject> eventListenerBreakpoints = m_inspectorState->getObject(BrowserDebuggerAgentState::eventListenerBreakpoints);
eventListenerBreakpoints->remove(eventName);
m_inspectorState->setObject(BrowserDebuggerAgentState::eventListenerBreakpoints, eventListenerBreakpoints);
}
void InspectorBrowserDebuggerAgent::didInsertDOMNode(Node* node)
......@@ -347,8 +310,9 @@ void InspectorBrowserDebuggerAgent::pauseOnNativeEventIfNeeded(const String& cat
if (!debuggerAgent)
return;
String fullEventName = String::format("%s:%s", categoryType.utf8().data(), eventName.utf8().data());
if (!m_eventListenerBreakpoints.contains(fullEventName))
String fullEventName = makeString(categoryType, ":", eventName);
RefPtr<InspectorObject> eventListenerBreakpoints = m_inspectorState->getObject(BrowserDebuggerAgentState::eventListenerBreakpoints);
if (eventListenerBreakpoints->find(fullEventName) == eventListenerBreakpoints->end())
return;
RefPtr<InspectorObject> eventData = InspectorObject::create();
......@@ -416,7 +380,6 @@ void InspectorBrowserDebuggerAgent::willSendXMLHttpRequest(const String& url)
void InspectorBrowserDebuggerAgent::clear()
{
m_domBreakpoints.clear();
m_eventListenerBreakpoints.clear();
}
} // namespace WebCore
......
......@@ -36,10 +36,8 @@
#include "InspectorDebuggerAgent.h"
#include "PlatformString.h"
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
#include <wtf/PassOwnPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/text/StringHash.h>
namespace WebCore {
......@@ -62,12 +60,8 @@ public:
virtual ~InspectorBrowserDebuggerAgent();
void setFrontend(InspectorFrontend*);
void clearFrontend();
void setAllBrowserBreakpoints(ErrorString* error, PassRefPtr<InspectorObject>);
void inspectedURLChanged(const String& url);
// BrowserDebugger API for InspectorFrontend
void setXHRBreakpoint(ErrorString* error, const String& url);
void removeXHRBreakpoint(ErrorString* error, const String& url);
......@@ -93,8 +87,6 @@ private:
virtual void debuggerWasDisabled();
void disable();
void restoreStickyBreakpoint(PassRefPtr<InspectorObject> breakpoint);
void descriptionForDOMEvent(Node* target, long breakpointType, bool insertion, InspectorObject* description);
void updateSubtreeBreakpoints(Node*, uint32_t rootMask, bool set);
bool hasBreakpoint(Node*, long type);
......@@ -108,7 +100,6 @@ private:
InspectorDebuggerAgent* m_debuggerAgent;
InspectorAgent* m_inspectorAgent;
HashMap<Node*, uint32_t> m_domBreakpoints;
HashSet<String> m_eventListenerBreakpoints;
};
} // namespace WebCore
......
......@@ -530,8 +530,6 @@ void InspectorInstrumentation::didCommitLoadImpl(Page* page, InspectorAgent* ins
if (InspectorDebuggerAgent* debuggerAgent = instrumentingAgents->inspectorDebuggerAgent()) {
KURL url = inspectorAgent->inspectedURLWithoutFragment();
debuggerAgent->inspectedURLChanged(url);
if (InspectorBrowserDebuggerAgent* browserDebuggerAgent = instrumentingAgents->inspectorBrowserDebuggerAgent())
browserDebuggerAgent->inspectedURLChanged(url);
}
#endif
#if ENABLE(JAVASCRIPT_DEBUGGER) && USE(JSC)
......
......@@ -51,7 +51,6 @@ WebInspector.BreakpointManager.BreakpointTypes = {
WebInspector.BreakpointManager.Events = {
DOMBreakpointAdded: "dom-breakpoint-added",
EventListenerBreakpointAdded: "event-listener-breakpoint-added",
ProjectChanged: "project-changed"
}
......@@ -80,34 +79,6 @@ WebInspector.BreakpointManager.prototype = {
this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.DOMBreakpointAdded, breakpoint.view);
},
createEventListenerBreakpoint: function(eventName)
{
this._createEventListenerBreakpoint(eventName, true, false);
},
_createEventListenerBreakpoint: function(eventName, enabled, restored)
{
var breakpointId = this._createEventListenerBreakpointId(eventName);
if (breakpointId in this._breakpoints)
return;
var breakpoint = new WebInspector.EventListenerBreakpoint(eventName);
this._setBreakpoint(breakpointId, breakpoint, enabled, restored);
breakpoint.view = new WebInspector.EventListenerBreakpointView(this, breakpointId, enabled, eventName);
this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.EventListenerBreakpointAdded, breakpoint.view);
},
setXHRBreakpoint: function(url)
{
BrowserDebuggerAgent.setXHRBreakpoint(url);
},
removeXHRBreakpoint: function(url)
{
BrowserDebuggerAgent.removeXHRBreakpoint(url);
},
_setBreakpoint: function(breakpointId, breakpoint, enabled, restored)
{
this._breakpoints[breakpointId] = breakpoint;
......@@ -146,8 +117,6 @@ WebInspector.BreakpointManager.prototype = {
var breakpointId;
if (eventData.breakpointType === WebInspector.BreakpointManager.BreakpointTypes.DOM)
breakpointId = this._createDOMBreakpointId(eventData.nodeId, eventData.type);
else if (eventData.breakpointType === WebInspector.BreakpointManager.BreakpointTypes.EventListener)
breakpointId = this._createEventListenerBreakpointId(eventData.eventName);
else
return;
......@@ -185,18 +154,6 @@ WebInspector.BreakpointManager.prototype = {
this._breakpoints = {};
this._domBreakpointsRestored = false;
this.dispatchEventToListeners(WebInspector.BreakpointManager.Events.ProjectChanged);
var breakpoints = this._stickyBreakpoints[WebInspector.settings.projectId] || [];
for (var i = 0; i < breakpoints.length; ++i) {
var breakpoint = breakpoints[i];
if (breakpoint.type === WebInspector.BreakpointManager.BreakpointTypes.EventListener)
this._createEventListenerBreakpoint(breakpoint.condition.eventName, breakpoint.enabled, true);
}
if (!this._breakpointsPushedToFrontend) {
BrowserDebuggerAgent.setAllBrowserBreakpoints(this._stickyBreakpoints);
this._breakpointsPushedToFrontend = true;
}
},
restoreDOMBreakpoints: function()
......@@ -258,7 +215,6 @@ WebInspector.BreakpointManager.prototype = {
WebInspector.settings.nativeBreakpoints = breakpoints;
this._stickyBreakpoints[WebInspector.settings.projectId] = breakpoints;
BrowserDebuggerAgent.setAllBrowserBreakpoints(this._stickyBreakpoints);
},
_validateBreakpoints: function(persistentBreakpoints)
......@@ -275,10 +231,6 @@ WebInspector.BreakpointManager.prototype = {
if (typeof condition.path !== "string" || typeof condition.type !== "number")
continue;
id += condition.path + ":" + condition.type;
} else if (breakpoint.type === WebInspector.BreakpointManager.BreakpointTypes.EventListener) {
if (typeof condition.eventName !== "string")
continue;
id += condition.eventName;
} else
continue;
......@@ -293,11 +245,6 @@ WebInspector.BreakpointManager.prototype = {
_createDOMBreakpointId: function(nodeId, type)
{
return "dom:" + nodeId + ":" + type;
},
_createEventListenerBreakpointId: function(eventName)
{
return "eventListner:" + eventName;
}
}
......@@ -328,30 +275,6 @@ WebInspector.DOMBreakpoint.prototype = {
}
}
WebInspector.EventListenerBreakpoint = function(eventName)
{
this._eventName = eventName;
}
WebInspector.EventListenerBreakpoint.prototype = {
_enable: function()
{
BrowserDebuggerAgent.setEventListenerBreakpoint(this._eventName);
},
_disable: function()
{
BrowserDebuggerAgent.removeEventListenerBreakpoint(this._eventName);
},
_serializeToJSON: function()
{
var type = WebInspector.BreakpointManager.BreakpointTypes.EventListener;
return { type: type, condition: { eventName: this._eventName } };
}
}
WebInspector.NativeBreakpointView = function(manager, id, enabled)
{
this._manager = manager;
......@@ -485,54 +408,6 @@ WebInspector.DOMBreakpointView.prototype = {
WebInspector.DOMBreakpointView.prototype.__proto__ = WebInspector.NativeBreakpointView.prototype;
WebInspector.EventListenerBreakpointView = function(manager, id, enabled, eventName)
{
WebInspector.NativeBreakpointView.call(this, manager, id, enabled);
this._eventName = eventName;
}
WebInspector.EventListenerBreakpointView.eventNameForUI = function(eventName)
{
if (!WebInspector.EventListenerBreakpointView._eventNamesForUI) {
WebInspector.EventListenerBreakpointView._eventNamesForUI = {
"instrumentation:setTimer": WebInspector.UIString("Set Timer"),
"instrumentation:clearTimer": WebInspector.UIString("Clear Timer"),
"instrumentation:timerFired": WebInspector.UIString("Timer Fired")
};
}
return WebInspector.EventListenerBreakpointView._eventNamesForUI[eventName] || eventName.substring(eventName.indexOf(":") + 1);
}
WebInspector.EventListenerBreakpointView.prototype = {
get eventName()
{
return this._eventName;
},
compareTo: function(other)
{
return this._compare(this._eventName, other._eventName);
},
populateLabelElement: function(element)
{
element.appendChild(document.createTextNode(this._uiEventName()));
},
populateStatusMessageElement: function(element, eventData)
{
var status = WebInspector.UIString("Paused on a \"%s\" Event Listener.", this._uiEventName());
element.appendChild(document.createTextNode(status));
},
_uiEventName: function()
{
return WebInspector.EventListenerBreakpointView.eventNameForUI(this._eventName);
}
}
WebInspector.EventListenerBreakpointView.prototype.__proto__ = WebInspector.NativeBreakpointView.prototype;
WebInspector.DOMBreakpointTypes = {
SubtreeModified: 0,
AttributeModified: 1,
......
......@@ -347,7 +347,7 @@ WebInspector.XHRBreakpointsSidebarPane.prototype = {
this._addListElement(element, currentElement);
this._breakpointElements[url] = element;
if (enabled)
WebInspector.breakpointManager.setXHRBreakpoint(url);
BrowserDebuggerAgent.setXHRBreakpoint(url);
},
_removeBreakpoint: function(url)
......@@ -359,7 +359,7 @@ WebInspector.XHRBreakpointsSidebarPane.prototype = {
this._removeListElement(element);
delete this._breakpointElements[url];
if (element._checkboxElement.checked)
WebInspector.breakpointManager.removeXHRBreakpoint(url);
BrowserDebuggerAgent.removeXHRBreakpoint(url);
},
_contextMenu: function(url, event)
......@@ -546,9 +546,6 @@ WebInspector.EventListenerBreakpointsSidebarPane = function()
this.categoriesTreeOutline = new TreeOutline(this.categoriesElement);
this.bodyElement.appendChild(this.categoriesElement);
WebInspector.breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.ProjectChanged, this._projectChanged, this);
WebInspector.breakpointManager.addEventListener(WebInspector.BreakpointManager.Events.EventListenerBreakpointAdded, this._breakpointAdded, this);
this._breakpointItems = {};
this._createCategory(WebInspector.UIString("Keyboard"), "listener", ["keydown", "keyup", "keypress", "textInput"]);
this._createCategory(WebInspector.UIString("Mouse"), "listener", ["click", "dblclick", "mousedown", "mouseup", "mouseover", "mousemove", "mouseout", "mousewheel"]);
......@@ -561,6 +558,20 @@ WebInspector.EventListenerBreakpointsSidebarPane = function()
this._createCategory(WebInspector.UIString("DOM Mutation"), "listener", ["DOMActivate", "DOMFocusIn", "DOMFocusOut", "DOMAttrModified", "DOMCharacterDataModified", "DOMNodeInserted", "DOMNodeInsertedIntoDocument", "DOMNodeRemoved", "DOMNodeRemovedFromDocument", "DOMSubtreeModified", "DOMContentLoaded"]);
this._createCategory(WebInspector.UIString("Device"), "listener", ["deviceorientation", "devicemotion"]);
this._createCategory(WebInspector.UIString("Timer"), "instrumentation", ["setTimer", "clearTimer", "timerFired"]);
this._restoreBreakpoints();
}
WebInspector.EventListenerBreakpointsSidebarPane.eventNameForUI = function(eventName)
{
if (!WebInspector.EventListenerBreakpointsSidebarPane._eventNamesForUI) {
WebInspector.EventListenerBreakpointsSidebarPane._eventNamesForUI = {
"instrumentation:setTimer": WebInspector.UIString("Set Timer"),
"instrumentation:clearTimer": WebInspector.UIString("Clear Timer"),
"instrumentation:timerFired": WebInspector.UIString("Timer Fired")
};
}
return WebInspector.EventListenerBreakpointsSidebarPane._eventNamesForUI[eventName] || eventName.substring(eventName.indexOf(":") + 1);
}
WebInspector.EventListenerBreakpointsSidebarPane.prototype = {
......@@ -580,7 +591,7 @@ WebInspector.EventListenerBreakpointsSidebarPane.prototype = {
var eventName = type + ":" + eventNames[i];
var breakpointItem = {};
var title = WebInspector.EventListenerBreakpointView.eventNameForUI(eventName);
var title = WebInspector.EventListenerBreakpointsSidebarPane.eventNameForUI(eventName);
breakpointItem.element = new TreeElement(title);
categoryItem.element.appendChild(breakpointItem.element);
var hitMarker = document.createElement("div");
......@@ -590,9 +601,8 @@ WebInspector.EventListenerBreakpointsSidebarPane.prototype = {
breakpointItem.element.selectable = true;
breakpointItem.checkbox = this._createCheckbox(breakpointItem.element);
breakpointItem.checkbox.addEventListener("click", this._breakpointCheckboxClicked.bind(this, breakpointItem), true);
breakpointItem.checkbox.addEventListener("click", this._breakpointCheckboxClicked.bind(this, eventName), true);
breakpointItem.parent = categoryItem;
breakpointItem.eventName = eventName;
this._breakpointItems[eventName] = breakpointItem;
categoryItem.children[eventName] = breakpointItem;
......@@ -613,54 +623,47 @@ WebInspector.EventListenerBreakpointsSidebarPane.prototype = {
var checked = categoryItem.checkbox.checked;
for (var eventName in categoryItem.children) {
var breakpointItem = categoryItem.children[eventName];
if (breakpointItem.checkbox.checked !== checked) {
breakpointItem.checkbox.checked = checked;
this._breakpointCheckboxClicked(breakpointItem);
}
if (breakpointItem.checkbox.checked === checked)
continue;
if (checked)
this._setBreakpoint(eventName);
else
this._removeBreakpoint(eventName);
}
this._saveBreakpoints();
},
_breakpointCheckboxClicked: function(breakpointItem)
_breakpointCheckboxClicked: function(eventName, event)
{
if (breakpointItem.checkbox.checked)
WebInspector.breakpointManager.createEventListenerBreakpoint(breakpointItem.eventName);
if (event.target.checked)
this._setBreakpoint(eventName);
else
breakpointItem.breakpoint.remove();
this._removeBreakpoint(eventName);
this._saveBreakpoints();
},
_breakpointAdded: function(event)
_setBreakpoint: function(eventName)
{
var breakpoint = event.data;
var breakpointItem = this._breakpointItems[breakpoint.eventName];
breakpointItem.breakpoint = breakpoint;
breakpoint.addEventListener("hit-state-changed", this._breakpointHitStateChanged.bind(this, breakpointItem));
breakpoint.addEventListener("removed", this._breakpointRemoved.bind(this, breakpointItem));
var breakpointItem = this._breakpointItems[eventName];
if (!breakpointItem)
return;
breakpointItem.checkbox.checked = true;
this._updateCategoryCheckbox(breakpointItem);
},
_breakpointHitStateChanged: function(breakpointItem, event)
{
if (event.target.hit) {
this.expanded = true;
var categoryItem = breakpointItem.parent;
categoryItem.element.expand();
breakpointItem.element.listItemElement.addStyleClass("breakpoint-hit");
} else
breakpointItem.element.listItemElement.removeStyleClass("breakpoint-hit");
BrowserDebuggerAgent.setEventListenerBreakpoint(eventName);
this._updateCategoryCheckbox(breakpointItem.parent);
},
_breakpointRemoved: function(breakpointItem)
_removeBreakpoint: function(eventName)
{
breakpointItem.breakpoint = null;
var breakpointItem = this._breakpointItems[eventName];
if (!breakpointItem)
return;
breakpointItem.checkbox.checked = false;
this._updateCategoryCheckbox(breakpointItem);
BrowserDebuggerAgent.removeEventListenerBreakpoint(eventName);
this._updateCategoryCheckbox(breakpointItem.parent);
},
_updateCategoryCheckbox: function(breakpointItem)
_updateCategoryCheckbox: function(categoryItem)
{
var categoryItem = breakpointItem.parent;
var hasEnabled = false, hasDisabled = false;
for (var eventName in categoryItem.children) {
var breakpointItem = categoryItem.children[eventName];
......@@ -673,13 +676,42 @@ WebInspector.EventListenerBreakpointsSidebarPane.prototype = {
categoryItem.checkbox.indeterminate = hasEnabled && hasDisabled;
},
_projectChanged: function()
highlightBreakpoint: function(eventName)
{
for (var eventName in this._breakpointItems) {
var breakpointItem = this._breakpointItems[eventName];
breakpointItem.breakpoint = null;
breakpointItem.checkbox.checked = false;
this._updateCategoryCheckbox(breakpointItem);
if (!breakpointItem)
return;
this.expanded = true;
breakpointItem.parent.element.expand();
breakpointItem.element.listItemElement.addStyleClass("breakpoint-hit");
this._highlightedElement = breakpointItem.element.listItemElement;
},
clearBreakpointHighlight: function()
{
if (this._highlightedElement) {
this._highlightedElement.removeStyleClass("breakpoint-hit");
delete this._highlightedElement;
}
},
_saveBreakpoints: function()
{
var breakpoints = [];
for (var eventName in this._breakpointItems) {
if (this._breakpointItems[eventName].checkbox.checked)
breakpoints.push({ eventName: eventName });
}
WebInspector.settings.eventListenerBreakpoints = breakpoints;
},
_restoreBreakpoints: function()
{
var breakpoints = WebInspector.settings.eventListenerBreakpoints;
for (var i = 0; i < breakpoints.length; ++i) {
var breakpoint = breakpoints[i];
if (breakpoint && typeof breakpoint.eventName === "string")
this._setBreakpoint(breakpoint.eventName);
}
}
}
......
......@@ -85,13 +85,9 @@ WebInspector.CallStackSidebarPane.prototype = {
this._text += WebInspector.UIString("%s() at %s", i + 1, title, subtitle) + "\n";
}
if (details.breakpoint)
this._scriptBreakpointHit();
else if (details.eventType === WebInspector.DebuggerEventTypes.NativeBreakpoint) {
if (details.eventData.breakpointType === WebInspector.BreakpointManager.BreakpointTypes.XHR)
this._xhrBreakpointHit();
else
this._nativeBreakpointHit(details.eventData);
if (details.eventType === WebInspector.DebuggerEventTypes.NativeBreakpoint) {
if (details.eventData.breakpointType === WebInspector.BreakpointManager.BreakpointTypes.DOM)
this._domBreakpointHit(details.eventData);
}
},
......@@ -182,23 +178,15 @@ WebInspector.CallStackSidebarPane.prototype = {
section.addRelatedKeys([ nextCallFrame.name, prevCallFrame.name ], WebInspector.UIString("Next/previous call frame"));
},
_scriptBreakpointHit: function()
{
var statusMessageElement = document.createElement("div");
statusMessageElement.className = "info";
statusMessageElement.appendChild(document.createTextNode(WebInspector.UIString("Paused on a JavaScript breakpoint.")));
this.bodyElement.appendChild(statusMessageElement);
},
_xhrBreakpointHit: function()
setStatus: function(status)
{
var statusMessageElement = document.createElement("div");
statusMessageElement.className = "info";
statusMessageElement.textContent = WebInspector.UIString("Paused on a XMLHttpRequest.");
statusMessageElement.textContent = status;
this.bodyElement.appendChild(statusMessageElement);
},
_nativeBreakpointHit: function(eventData)
_domBreakpointHit: function(eventData)
{
var breakpoint = WebInspector.breakpointManager.breakpointViewForEventData(eventData);
if (!breakpoint)
......
......@@ -438,13 +438,25 @@ WebInspector.ScriptsPanel.prototype = {
this.sidebarPanes.callstack.update(event.data);
this.sidebarPanes.callstack.selectedCallFrame = callFrames[0];
var status;
if (details.eventType === WebInspector.DebuggerEventTypes.NativeBreakpoint) {
if (details.eventData.breakpointType === WebInspector.BreakpointManager.BreakpointTypes.XHR)
if (details.eventData.breakpointType === WebInspector.BreakpointManager.BreakpointTypes.EventListener) {
var eventName = details.eventData.eventName;
this.sidebarPanes.eventListenerBreakpoints.highlightBreakpoint(details.eventData.eventName);
var eventNameForUI = WebInspector.EventListenerBreakpointsSidebarPane.eventNameForUI(eventName);
status = WebInspector.UIString("Paused on a \"%s\" Event Listener.", eventNameForUI);
} else if (details.eventData.breakpointType === WebInspector.BreakpointManager.BreakpointTypes.XHR) {
this.sidebarPanes.xhrBreakpoints.highlightBreakpoint(details.eventData.breakpointURL);
status = WebInspector.UIString("Paused on a XMLHttpRequest.");
}
} else {
var sourceLocation = this._presentationModel.selectedCallFrame.sourceLocation;
this.sidebarPanes.jsBreakpoints.highlightBreakpoint(sourceLocation.sourceFileId, sourceLocation.lineNumber);
if (details.breakpoint)
status = WebInspector.UIString("Paused on a JavaScript breakpoint.");
}
if (status)
this.sidebarPanes.callstack.setStatus(status);
window.focus();
InspectorFrontendHost.bringToFront();
......@@ -806,8 +818,10 @@ WebInspector.ScriptsPanel.prototype = {
this.sidebarPanes.callstack.update(null);
this.sidebarPanes.scopechain.update(null);
this.sidebarPanes.jsBreakpoints.clearBreakpointHighlight();
if (Preferences.nativeInstrumentationEnabled)
if (Preferences.nativeInstrumentationEnabled) {
this.sidebarPanes.eventListenerBreakpoints.clearBreakpointHighlight();
this.sidebarPanes.xhrBreakpoints.clearBreakpointHighlight();
}
this._clearCurrentExecutionLine();
this._updateDebuggerButtons();
......
......@@ -71,6 +71,7 @@ WebInspector.Settings = function()
this.installApplicationSetting("showUserAgentStyles", true);
this.installApplicationSetting("watchExpressions", []);
this.installApplicationSetting("breakpoints", []);
this.installApplicationSetting("eventListenerBreakpoints", []);
this.installApplicationSetting("xhrBreakpoints", []);
this.installProjectSetting("nativeBreakpoints", []);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment