blob: da39cdbd9886b6ceed75d897cde8e3b4507c7e4e [file] [log] [blame]
/*
* Copyright (C) 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
WebInspector.BreakpointTreeElement = function(breakpoint, className, title)
{
console.assert(breakpoint instanceof WebInspector.Breakpoint);
if (!className)
className = WebInspector.BreakpointTreeElement.GenericLineIconStyleClassName;
WebInspector.GeneralTreeElement.call(this, [WebInspector.BreakpointTreeElement.StyleClassName, className], title, null, breakpoint, false);
this._breakpoint = breakpoint;
if (!title)
this._breakpoint.addEventListener(WebInspector.Breakpoint.Event.LocationDidChange, this._breakpointLocationDidChange, this);
this._breakpoint.addEventListener(WebInspector.Breakpoint.Event.DisabledStateDidChange, this._updateStatus, this);
this._breakpoint.addEventListener(WebInspector.Breakpoint.Event.AutoContinueDidChange, this._updateStatus, this);
this._breakpoint.addEventListener(WebInspector.Breakpoint.Event.ResolvedStateDidChange, this._updateStatus, this);
this._statusImageElement = document.createElement("img");
this._statusImageElement.className = WebInspector.BreakpointTreeElement.StatusImageElementStyleClassName;
this._statusImageElement.addEventListener("mousedown", this._statusImageElementMouseDown.bind(this));
this._statusImageElement.addEventListener("click", this._statusImageElementClicked.bind(this));
if (!title)
this._updateTitles();
this._updateStatus();
this.status = this._statusImageElement;
this.small = true;
};
WebInspector.BreakpointTreeElement.GenericLineIconStyleClassName = "breakpoint-generic-line-icon";
WebInspector.BreakpointTreeElement.StyleClassName = "breakpoint";
WebInspector.BreakpointTreeElement.StatusImageElementStyleClassName = "status-image";
WebInspector.BreakpointTreeElement.StatusImageResolvedStyleClassName = "resolved";
WebInspector.BreakpointTreeElement.StatusImageAutoContinueStyleClassName = "auto-continue";
WebInspector.BreakpointTreeElement.StatusImageDisabledStyleClassName = "disabled";
WebInspector.BreakpointTreeElement.FormattedLocationStyleClassName = "formatted-location";
WebInspector.BreakpointTreeElement.prototype = {
constructor: WebInspector.BreakpointTreeElement,
// Public
get breakpoint()
{
return this._breakpoint;
},
ondelete: function()
{
if (!WebInspector.debuggerManager.isBreakpointRemovable(this._breakpoint))
return false;
WebInspector.debuggerManager.removeBreakpoint(this._breakpoint);
return true;
},
onenter: function()
{
this._breakpoint.cycleToNextMode();
return true;
},
onspace: function()
{
this._breakpoint.cycleToNextMode();
return true;
},
oncontextmenu: function(event)
{
var contextMenu = new WebInspector.ContextMenu(event);
this._breakpoint.appendContextMenuItems(contextMenu, this._statusImageElement);
contextMenu.show();
},
// Private
_updateTitles: function()
{
var sourceCodeLocation = this._breakpoint.sourceCodeLocation;
var displayLineNumber = sourceCodeLocation.displayLineNumber;
var displayColumnNumber = sourceCodeLocation.displayColumnNumber;
if (displayColumnNumber > 0)
this.mainTitle = WebInspector.UIString("Line %d:%d").format(displayLineNumber + 1, displayColumnNumber + 1); // The user visible line and column numbers are 1-based.
else
this.mainTitle = WebInspector.UIString("Line %d").format(displayLineNumber + 1); // The user visible line number is 1-based.
if (sourceCodeLocation.hasMappedLocation()) {
this.subtitle = sourceCodeLocation.formattedLocationString();
if (sourceCodeLocation.hasFormattedLocation())
this.subtitleElement.classList.add(WebInspector.BreakpointTreeElement.FormattedLocationStyleClassName);
else
this.subtitleElement.classList.remove(WebInspector.BreakpointTreeElement.FormattedLocationStyleClassName);
this.tooltip = this.mainTitle + " \u2014 " + WebInspector.UIString("originally %s").format(sourceCodeLocation.originalLocationString());
}
},
_updateStatus: function()
{
if (this._breakpoint.disabled)
this._statusImageElement.classList.add(WebInspector.BreakpointTreeElement.StatusImageDisabledStyleClassName);
else
this._statusImageElement.classList.remove(WebInspector.BreakpointTreeElement.StatusImageDisabledStyleClassName);
if (this._breakpoint.autoContinue)
this._statusImageElement.classList.add(WebInspector.BreakpointTreeElement.StatusImageAutoContinueStyleClassName);
else
this._statusImageElement.classList.remove(WebInspector.BreakpointTreeElement.StatusImageAutoContinueStyleClassName);
if (this._breakpoint.resolved)
this._statusImageElement.classList.add(WebInspector.BreakpointTreeElement.StatusImageResolvedStyleClassName);
else
this._statusImageElement.classList.remove(WebInspector.BreakpointTreeElement.StatusImageResolvedStyleClassName);
},
_breakpointLocationDidChange: function(event)
{
console.assert(event.target === this._breakpoint);
// The Breakpoint has a new display SourceCode. The sidebar will remove us. Stop listening to the breakpoint.
if (event.data.oldDisplaySourceCode === this._breakpoint.displaySourceCode) {
this._breakpoint.addEventListener(WebInspector.Breakpoint.Event.LocationDidChange, this._breakpointLocationDidChange, this);
this._breakpoint.addEventListener(WebInspector.Breakpoint.Event.DisabledStateDidChange, this._updateStatus, this);
this._breakpoint.addEventListener(WebInspector.Breakpoint.Event.AutoContinueDidChange, this._updateStatus, this);
this._breakpoint.addEventListener(WebInspector.Breakpoint.Event.ResolvedStateDidChange, this._updateStatus, this);
return;
}
this._updateTitles();
},
_statusImageElementMouseDown: function(event)
{
// To prevent the tree element from selecting.
event.stopPropagation();
},
_statusImageElementClicked: function(event)
{
this._breakpoint.cycleToNextMode();
}
};
WebInspector.BreakpointTreeElement.prototype.__proto__ = WebInspector.GeneralTreeElement.prototype;