Home | History | Annotate | Download | only in front-end
      1 /*
      2  * Copyright (C) 2008 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. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 WebInspector.BreakpointsSidebarPane = function()
     27 {
     28     WebInspector.SidebarPane.call(this, WebInspector.UIString("Breakpoints"));
     29 
     30     this.breakpoints = {};
     31 
     32     this.listElement = document.createElement("ol");
     33     this.listElement.className = "breakpoint-list";
     34 
     35     this.emptyElement = document.createElement("div");
     36     this.emptyElement.className = "info";
     37     this.emptyElement.textContent = WebInspector.UIString("No Breakpoints");
     38 
     39     this.bodyElement.appendChild(this.emptyElement);
     40 }
     41 
     42 WebInspector.BreakpointsSidebarPane.prototype = {
     43     addBreakpoint: function(breakpoint)
     44     {
     45         if (this.breakpoints[breakpoint.id])
     46             return;
     47 
     48         this.breakpoints[breakpoint.id] = breakpoint;
     49 
     50         breakpoint.addEventListener("enabled", this._breakpointEnableChanged, this);
     51         breakpoint.addEventListener("disabled", this._breakpointEnableChanged, this);
     52         breakpoint.addEventListener("text-changed", this._breakpointTextChanged, this);
     53 
     54         this._appendBreakpointElement(breakpoint);
     55 
     56         if (this.emptyElement.parentElement) {
     57             this.bodyElement.removeChild(this.emptyElement);
     58             this.bodyElement.appendChild(this.listElement);
     59         }
     60 
     61         if (!InspectorBackend.debuggerEnabled() || !breakpoint.sourceID)
     62             return;
     63 
     64         if (breakpoint.enabled)
     65             InspectorBackend.addBreakpoint(breakpoint.sourceID, breakpoint.line, breakpoint.condition);
     66     },
     67 
     68     _appendBreakpointElement: function(breakpoint)
     69     {
     70         function checkboxClicked(event)
     71         {
     72             breakpoint.enabled = !breakpoint.enabled;
     73 
     74             // without this, we'd switch to the source of the clicked breakpoint
     75             event.stopPropagation();
     76         }
     77 
     78         function breakpointClicked()
     79         {
     80             var script = WebInspector.panels.scripts.scriptOrResourceForID(breakpoint.sourceID);
     81             if (script)
     82                 WebInspector.panels.scripts.showScript(script, breakpoint.line);
     83         }
     84 
     85         var breakpointElement = document.createElement("li");
     86         breakpoint._breakpointListElement = breakpointElement;
     87         breakpointElement._breakpointObject = breakpoint;
     88         breakpointElement.addEventListener("click", breakpointClicked, false);
     89 
     90         var checkboxElement = document.createElement("input");
     91         checkboxElement.className = "checkbox-elem";
     92         checkboxElement.type = "checkbox";
     93         checkboxElement.checked = breakpoint.enabled;
     94         checkboxElement.addEventListener("click", checkboxClicked, false);
     95         breakpointElement.appendChild(checkboxElement);
     96 
     97         var labelElement = document.createTextNode(breakpoint.label);
     98         breakpointElement.appendChild(labelElement);
     99 
    100         var sourceTextElement = document.createElement("div");
    101         sourceTextElement.textContent = breakpoint.sourceText;
    102         sourceTextElement.className = "source-text monospace";
    103         breakpointElement.appendChild(sourceTextElement);
    104 
    105         var currentElement = this.listElement.firstChild;
    106         while (currentElement) {
    107             var currentBreak = currentElement._breakpointObject;
    108             if (currentBreak.url > breakpoint.url) {
    109                 this.listElement.insertBefore(breakpointElement, currentElement);
    110                 return;
    111             } else if (currentBreak.url == breakpoint.url && currentBreak.line > breakpoint.line) {
    112                 this.listElement.insertBefore(breakpointElement, currentElement);
    113                 return;
    114             }
    115             currentElement = currentElement.nextSibling;
    116         }
    117         this.listElement.appendChild(breakpointElement);
    118     },
    119 
    120     removeBreakpoint: function(breakpoint)
    121     {
    122         if (!this.breakpoints[breakpoint.id])
    123             return;
    124         delete this.breakpoints[breakpoint.id];
    125 
    126         breakpoint.removeEventListener("enabled", null, this);
    127         breakpoint.removeEventListener("disabled", null, this);
    128         breakpoint.removeEventListener("text-changed", null, this);
    129 
    130         var element = breakpoint._breakpointListElement;
    131         element.parentElement.removeChild(element);
    132 
    133         if (!this.listElement.firstChild) {
    134             this.bodyElement.removeChild(this.listElement);
    135             this.bodyElement.appendChild(this.emptyElement);
    136         }
    137 
    138         if (!InspectorBackend.debuggerEnabled() || !breakpoint.sourceID)
    139             return;
    140 
    141         InspectorBackend.removeBreakpoint(breakpoint.sourceID, breakpoint.line);
    142     },
    143 
    144     _breakpointEnableChanged: function(event)
    145     {
    146         var breakpoint = event.target;
    147 
    148         var checkbox = breakpoint._breakpointListElement.firstChild;
    149         checkbox.checked = breakpoint.enabled;
    150 
    151         if (!InspectorBackend.debuggerEnabled() || !breakpoint.sourceID)
    152             return;
    153 
    154         if (breakpoint.enabled)
    155             InspectorBackend.addBreakpoint(breakpoint.sourceID, breakpoint.line, breakpoint.condition);
    156         else
    157             InspectorBackend.removeBreakpoint(breakpoint.sourceID, breakpoint.line);
    158     },
    159 
    160     _breakpointTextChanged: function(event)
    161     {
    162         var breakpoint = event.target;
    163 
    164         var sourceTextElement = breakpoint._breakpointListElement.firstChild.nextSibling.nextSibling;
    165         sourceTextElement.textContent = breakpoint.sourceText;
    166     }
    167 }
    168 
    169 WebInspector.BreakpointsSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype;
    170