Changeset 205674 in webkit


Ignore:
Timestamp:
Sep 8, 2016 4:13:57 PM (8 years ago)
Author:
Nikita Vasilyev
Message:

Web Inspector: Add a button to navigation bar to toggle Control Flow Profiler
https://bugs.webkit.org/show_bug.cgi?id=160973
<rdar://problem/27912606>

Reviewed by Brian Burg.

  • Localizations/en.lproj/localizedStrings.js:

Add "Fade unexecuted code" and "Do not fade unexecuted code".

  • UserInterface/Base/Main.js:

(WebInspector.loaded):
Add a setting to remember whether Code Coverage Profiler is on or off between Web Inspector reloads.

  • UserInterface/Views/SourceCodeTextEditor.js:

(WebInspector.SourceCodeTextEditor.prototype.shown):
(WebInspector.SourceCodeTextEditor.prototype.canShowTypeAnnotations):
(WebInspector.SourceCodeTextEditor.prototype.canShowCoverageHints):
(WebInspector.SourceCodeTextEditor.prototype.contentDidChange):
(WebInspector.SourceCodeTextEditor.prototype.toggleTypeAnnotations):
(WebInspector.SourceCodeTextEditor.prototype.toggleUnexecutedCodeHighlights):
(WebInspector.SourceCodeTextEditor.prototype.prettyPrint):
(WebInspector.SourceCodeTextEditor.prototype._proceedPopulateWithContent):
(WebInspector.SourceCodeTextEditor.prototype._setTypeTokenAnnotatorEnabledState):
(WebInspector.SourceCodeTextEditor.prototype.set _basicBlockAnnotatorEnabled):
(WebInspector.SourceCodeTextEditor.prototype._enableScrollEventsForTypeTokenAnnotator):
(WebInspector.SourceCodeTextEditor.prototype._enableScrollEventsForControlFlowAnnotator):
(WebInspector.SourceCodeTextEditor.prototype._disableScrollEventsForControlFlowAnnotator):
(WebInspector.SourceCodeTextEditor.prototype._createTypeTokenScrollEventHandler):
(WebInspector.SourceCodeTextEditor.prototype._createControlFlowScrollEventHandler):
(WebInspector.SourceCodeTextEditor.prototype.canBeFormatted): Deleted.
(WebInspector.SourceCodeTextEditor.prototype.dialogWasDismissed): Deleted.
(WebInspector.SourceCodeTextEditor.prototype.showPopoverForTypes): Deleted.
(WebInspector.SourceCodeTextEditor.prototype._addBreakpointWithEditorLineInfo): Deleted.
(WebInspector.SourceCodeTextEditor.prototype._removeBreakpointWithEditorLineInfo): Deleted.
(WebInspector.SourceCodeTextEditor.prototype._tokenTrackingControllerHighlightedMarkedExpression): Deleted.
(WebInspector.SourceCodeTextEditor.prototype._dismissEditingController): Deleted.
(WebInspector.SourceCodeTextEditor.prototype.editingControllerDidStartEditing): Deleted.
(WebInspector.SourceCodeTextEditor.prototype.editingControllerDidFinishEditing): Deleted.
(WebInspector.SourceCodeTextEditor.prototype._getAssociatedScript): Deleted.
(WebInspector.SourceCodeTextEditor.prototype._createTypeTokenAnnotator): Deleted.
Make Code Coverage profiler independent from Type Profiler.

  • UserInterface/Views/TextContentView.js:

(WebInspector.TextContentView):
(WebInspector.TextContentView.prototype.get navigationItems):
(WebInspector.TextContentView.prototype.get textEditor): Deleted.

  • UserInterface/Views/TextEditor.js:

(WebInspector.TextEditor.prototype.get hasModified):
(WebInspector.TextEditor.prototype.canShowCoverageHints):

  • UserInterface/Views/TextResourceContentView.js:

(WebInspector.TextResourceContentView):
(WebInspector.TextResourceContentView.prototype.get navigationItems):
(WebInspector.TextResourceContentView.prototype._contentDidPopulate):
(WebInspector.TextResourceContentView.prototype._toggleTypeAnnotations):
(WebInspector.TextResourceContentView.prototype._toggleUnexecutedCodeHighlights):
(WebInspector.TextResourceContentView.prototype._enableControlFlowProfilerSettingChanged):
(WebInspector.TextResourceContentView.prototype._contentWillPopulate): Deleted.

  • UserInterface/Views/ScriptContentView.js:

(WebInspector.ScriptContentView):
(WebInspector.ScriptContentView.prototype.get navigationItems):
(WebInspector.ScriptContentView.prototype._contentDidPopulate):
(WebInspector.ScriptContentView.prototype._toggleTypeAnnotations):
(WebInspector.ScriptContentView.prototype._toggleUnexecutedCodeHighlights):
(WebInspector.ScriptContentView.prototype._enableControlFlowProfilerSettingChanged):
(WebInspector.ScriptContentView.prototype._contentWillPopulate): Deleted.
Add the [C] icon right next to the [T] (Type Profiler) icon.

Location:
trunk/Source/WebInspectorUI
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebInspectorUI/ChangeLog

    r205651 r205674  
     12016-09-08  Nikita Vasilyev  <nvasilyev@apple.com>
     2
     3        Web Inspector: Add a button to navigation bar to toggle Control Flow Profiler
     4        https://bugs.webkit.org/show_bug.cgi?id=160973
     5        <rdar://problem/27912606>
     6
     7        Reviewed by Brian Burg.
     8
     9        * Localizations/en.lproj/localizedStrings.js:
     10        Add "Fade unexecuted code" and "Do not fade unexecuted code".
     11
     12        * UserInterface/Base/Main.js:
     13        (WebInspector.loaded):
     14        Add a setting to remember whether Code Coverage Profiler is on or off between Web Inspector reloads.
     15
     16        * UserInterface/Views/SourceCodeTextEditor.js:
     17        (WebInspector.SourceCodeTextEditor.prototype.shown):
     18        (WebInspector.SourceCodeTextEditor.prototype.canShowTypeAnnotations):
     19        (WebInspector.SourceCodeTextEditor.prototype.canShowCoverageHints):
     20        (WebInspector.SourceCodeTextEditor.prototype.contentDidChange):
     21        (WebInspector.SourceCodeTextEditor.prototype.toggleTypeAnnotations):
     22        (WebInspector.SourceCodeTextEditor.prototype.toggleUnexecutedCodeHighlights):
     23        (WebInspector.SourceCodeTextEditor.prototype.prettyPrint):
     24        (WebInspector.SourceCodeTextEditor.prototype._proceedPopulateWithContent):
     25        (WebInspector.SourceCodeTextEditor.prototype._setTypeTokenAnnotatorEnabledState):
     26        (WebInspector.SourceCodeTextEditor.prototype.set _basicBlockAnnotatorEnabled):
     27        (WebInspector.SourceCodeTextEditor.prototype._enableScrollEventsForTypeTokenAnnotator):
     28        (WebInspector.SourceCodeTextEditor.prototype._enableScrollEventsForControlFlowAnnotator):
     29        (WebInspector.SourceCodeTextEditor.prototype._disableScrollEventsForControlFlowAnnotator):
     30        (WebInspector.SourceCodeTextEditor.prototype._createTypeTokenScrollEventHandler):
     31        (WebInspector.SourceCodeTextEditor.prototype._createControlFlowScrollEventHandler):
     32        (WebInspector.SourceCodeTextEditor.prototype.canBeFormatted): Deleted.
     33        (WebInspector.SourceCodeTextEditor.prototype.dialogWasDismissed): Deleted.
     34        (WebInspector.SourceCodeTextEditor.prototype.showPopoverForTypes): Deleted.
     35        (WebInspector.SourceCodeTextEditor.prototype._addBreakpointWithEditorLineInfo): Deleted.
     36        (WebInspector.SourceCodeTextEditor.prototype._removeBreakpointWithEditorLineInfo): Deleted.
     37        (WebInspector.SourceCodeTextEditor.prototype._tokenTrackingControllerHighlightedMarkedExpression): Deleted.
     38        (WebInspector.SourceCodeTextEditor.prototype._dismissEditingController): Deleted.
     39        (WebInspector.SourceCodeTextEditor.prototype.editingControllerDidStartEditing): Deleted.
     40        (WebInspector.SourceCodeTextEditor.prototype.editingControllerDidFinishEditing): Deleted.
     41        (WebInspector.SourceCodeTextEditor.prototype._getAssociatedScript): Deleted.
     42        (WebInspector.SourceCodeTextEditor.prototype._createTypeTokenAnnotator): Deleted.
     43        Make Code Coverage profiler independent from Type Profiler.
     44
     45        * UserInterface/Views/TextContentView.js:
     46        (WebInspector.TextContentView):
     47        (WebInspector.TextContentView.prototype.get navigationItems):
     48        (WebInspector.TextContentView.prototype.get textEditor): Deleted.
     49        * UserInterface/Views/TextEditor.js:
     50        (WebInspector.TextEditor.prototype.get hasModified):
     51        (WebInspector.TextEditor.prototype.canShowCoverageHints):
     52        * UserInterface/Views/TextResourceContentView.js:
     53        (WebInspector.TextResourceContentView):
     54        (WebInspector.TextResourceContentView.prototype.get navigationItems):
     55        (WebInspector.TextResourceContentView.prototype._contentDidPopulate):
     56        (WebInspector.TextResourceContentView.prototype._toggleTypeAnnotations):
     57        (WebInspector.TextResourceContentView.prototype._toggleUnexecutedCodeHighlights):
     58        (WebInspector.TextResourceContentView.prototype._enableControlFlowProfilerSettingChanged):
     59        (WebInspector.TextResourceContentView.prototype._contentWillPopulate): Deleted.
     60        * UserInterface/Views/ScriptContentView.js:
     61        (WebInspector.ScriptContentView):
     62        (WebInspector.ScriptContentView.prototype.get navigationItems):
     63        (WebInspector.ScriptContentView.prototype._contentDidPopulate):
     64        (WebInspector.ScriptContentView.prototype._toggleTypeAnnotations):
     65        (WebInspector.ScriptContentView.prototype._toggleUnexecutedCodeHighlights):
     66        (WebInspector.ScriptContentView.prototype._enableControlFlowProfilerSettingChanged):
     67        (WebInspector.ScriptContentView.prototype._contentWillPopulate): Deleted.
     68        Add the [C] icon right next to the [T] (Type Profiler) icon.
     69
    1702016-09-08  Joseph Pecoraro  <pecoraro@apple.com>
    271
  • trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js

    r205651 r205674  
    1 var localizedStrings = new Object;
     1var localizedStrings = new Object;
    22
    33localizedStrings[" (Prototype)"] = " (Prototype)";
     
    250250localizedStrings["Disabled"] = "Disabled";
    251251localizedStrings["Display"] = "Display";
     252localizedStrings["Do not fade unexecuted code"] = "Do not fade unexecuted code";
    252253localizedStrings["Dock to bottom of window"] = "Dock to bottom of window";
    253254localizedStrings["Dock to right of window"] = "Dock to right of window";
     
    333334localizedStrings["Extension Scripts"] = "Extension Scripts";
    334335localizedStrings["Extra Scripts"] = "Extra Scripts";
     336localizedStrings["Fade unexecuted code"] = "Fade unexecuted code";
    335337localizedStrings["Family"] = "Family";
    336338localizedStrings["Features"] = "Features";
  • trunk/Source/WebInspectorUI/UserInterface/Base/Main.js

    r205529 r205674  
    163163    if (this.showJavaScriptTypeInformationSetting.value && window.RuntimeAgent && RuntimeAgent.enableTypeProfiler) {
    164164        RuntimeAgent.enableTypeProfiler();
    165         if (RuntimeAgent.enableControlFlowProfiler)
    166             RuntimeAgent.enableControlFlowProfiler();
    167     }
     165    }
     166
     167    this.enableControlFlowProfilerSetting = new WebInspector.Setting("enable-control-flow-profiler", false);
     168    if (this.enableControlFlowProfilerSetting.value && window.RuntimeAgent && RuntimeAgent.enableControlFlowProfiler)
     169        RuntimeAgent.enableControlFlowProfiler();
    168170
    169171    // COMPATIBILITY (iOS 8): Page.setShowPaintRects did not exist.
  • trunk/Source/WebInspectorUI/UserInterface/Views/ScriptContentView.js

    r199169 r205674  
    6464        this._showTypesButtonNavigationItem.addEventListener(WebInspector.ButtonNavigationItem.Event.Clicked, this._toggleTypeAnnotations, this);
    6565        this._showTypesButtonNavigationItem.enabled = false;
    66 
    6766        WebInspector.showJavaScriptTypeInformationSetting.addEventListener(WebInspector.Setting.Event.Changed, this._showJavaScriptTypeInformationSettingChanged, this);
     67
     68        let toolTipCodeCoverage = WebInspector.UIString("Fade unexecuted code");
     69        let activatedToolTipCodeCoverage = WebInspector.UIString("Do not fade unexecuted code");
     70        this._codeCoverageButtonNavigationItem = new WebInspector.ActivateButtonNavigationItem("code-coverage", toolTipCodeCoverage, activatedToolTipCodeCoverage, "Images/NavigationItemCodeCoverage.svg", 13, 14);
     71        this._codeCoverageButtonNavigationItem.addEventListener(WebInspector.ButtonNavigationItem.Event.Clicked, this._toggleUnexecutedCodeHighlights, this);
     72        this._codeCoverageButtonNavigationItem.enabled = false;
     73        WebInspector.enableControlFlowProfilerSetting.addEventListener(WebInspector.Setting.Event.Changed, this._enableControlFlowProfilerSettingChanged, this);
    6874    }
    6975
     
    7278    get navigationItems()
    7379    {
    74         return [this._prettyPrintButtonNavigationItem, this._showTypesButtonNavigationItem];
     80        return [this._prettyPrintButtonNavigationItem, this._showTypesButtonNavigationItem, this._codeCoverageButtonNavigationItem];
    7581    }
    7682
     
    203209    {
    204210        this._prettyPrintButtonNavigationItem.enabled = this._textEditor.canBeFormatted();
     211
    205212        this._showTypesButtonNavigationItem.enabled = this._textEditor.canShowTypeAnnotations();
    206213        this._showTypesButtonNavigationItem.activated = WebInspector.showJavaScriptTypeInformationSetting.value;
     214
     215        this._codeCoverageButtonNavigationItem.enabled = this._textEditor.canShowCoverageHints();
     216        this._codeCoverageButtonNavigationItem.activated = WebInspector.enableControlFlowProfilerSetting.value;
    207217    }
    208218
     
    215225    _toggleTypeAnnotations(event)
    216226    {
    217         this._textEditor.toggleTypeAnnotations();
     227        this._showTypesButtonNavigationItem.enabled = false;
     228        this._textEditor.toggleTypeAnnotations().then(() => {
     229            this._showTypesButtonNavigationItem.enabled = true;
     230        })
     231    }
     232
     233    _toggleUnexecutedCodeHighlights(event)
     234    {
     235        this._codeCoverageButtonNavigationItem.enabled = false;
     236        this._textEditor.toggleUnexecutedCodeHighlights().then(() => {
     237            this._codeCoverageButtonNavigationItem.enabled = true;
     238        });
    218239    }
    219240
     
    223244    }
    224245
     246    _enableControlFlowProfilerSettingChanged(event)
     247    {
     248        this._codeCoverageButtonNavigationItem.activated = WebInspector.enableControlFlowProfilerSetting.value;
     249    }
     250
    225251    _textEditorFormattingDidChange(event)
    226252    {
  • trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js

    r205401 r205674  
    102102            if (this._typeTokenAnnotator)
    103103                this._typeTokenAnnotator.resume();
     104            if (!this._typeTokenScrollHandler && this._typeTokenAnnotator)
     105                this._enableScrollEventsForTypeTokenAnnotator();
     106        } else {
     107            if (this._typeTokenAnnotator)
     108                this._setTypeTokenAnnotatorEnabledState(false);
     109        }
     110
     111        if (WebInspector.enableControlFlowProfilerSetting.value) {
    104112            if (this._basicBlockAnnotator)
    105113                this._basicBlockAnnotator.resume();
    106             if (!this._typeTokenScrollHandler && (this._typeTokenAnnotator || this._basicBlockAnnotator))
    107                 this._enableScrollEventsForTypeTokenAnnotator();
     114
     115            if (!this._controlFlowScrollHandler && this._basicBlockAnnotator)
     116                this._enableScrollEventsForControlFlowAnnotator();
    108117        } else {
    109             if (this._typeTokenAnnotator || this._basicBlockAnnotator)
    110                 this._setTypeTokenAnnotatorEnabledState(false);
     118            this._basicBlockAnnotatorEnabled = false;
    111119        }
    112120    }
     
    162170    canShowTypeAnnotations()
    163171    {
    164         return !!this._typeTokenAnnotator;
     172        // Type annotations for modified scripts are currently unsupported.
     173        return !!this._getAssociatedScript() && !this.hasModified;
     174    }
     175
     176    canShowCoverageHints()
     177    {
     178        // Code coverage hints for modified scripts are currently unsupported.
     179        return !!this._getAssociatedScript() && !this.hasModified;
    165180    }
    166181
     
    250265            this._updateEditableMarkers(range);
    251266
    252         if (this._typeTokenAnnotator || this._basicBlockAnnotator) {
     267        if (this._basicBlockAnnotator) {
     268            this._basicBlockAnnotatorEnabled = false;
     269            this._basicBlockAnnotator = null;
     270        }
     271
     272        if (this._typeTokenAnnotator) {
    253273            this._setTypeTokenAnnotatorEnabledState(false);
    254274            this._typeTokenAnnotator = null;
    255             this._basicBlockAnnotator = null;
    256275        }
    257276    }
     
    264283        var newActivatedState = !this._typeTokenAnnotator.isActive();
    265284        if (newActivatedState && this._isProbablyMinified && !this.formatted) {
    266             this.updateFormattedState(true).then(() => {
     285            return this.updateFormattedState(true).then(() => {
    267286                this._setTypeTokenAnnotatorEnabledState(newActivatedState);
    268287            });
    269             return;
    270288        }
    271289
    272290        this._setTypeTokenAnnotatorEnabledState(newActivatedState);
    273         return newActivatedState;
     291        return Promise.resolve();
     292    }
     293
     294    toggleUnexecutedCodeHighlights()
     295    {
     296        if (!this._basicBlockAnnotator)
     297            return false;
     298
     299        let newActivatedState = !this._basicBlockAnnotator.isActive();
     300        if (newActivatedState && this._isProbablyMinified && !this.formatted) {
     301            return this.updateFormattedState(true).then(() => {
     302                this._basicBlockAnnotatorEnabled = newActivatedState;
     303            });
     304        }
     305
     306        this._basicBlockAnnotatorEnabled = newActivatedState;
     307        return Promise.resolve();
    274308    }
    275309
     
    300334        // after so that they clear their annotations in a known state and insert new annotations
    301335        // in the new state.
    302         var shouldResumeTypeTokenAnnotator = this._typeTokenAnnotator && this._typeTokenAnnotator.isActive();
     336
    303337        var shouldResumeBasicBlockAnnotator = this._basicBlockAnnotator && this._basicBlockAnnotator.isActive();
    304         if (shouldResumeTypeTokenAnnotator || shouldResumeBasicBlockAnnotator)
     338        if (shouldResumeBasicBlockAnnotator)
     339            this._basicBlockAnnotatorEnabled = false;
     340
     341        let shouldResumeTypeTokenAnnotator = this._typeTokenAnnotator && this._typeTokenAnnotator.isActive();
     342        if (shouldResumeTypeTokenAnnotator)
    305343            this._setTypeTokenAnnotatorEnabledState(false);
    306344
    307345        return super.prettyPrint(pretty).then(() => {
    308346            if (pretty || !this._isProbablyMinified) {
    309                 if (shouldResumeTypeTokenAnnotator || shouldResumeBasicBlockAnnotator)
     347                if (shouldResumeBasicBlockAnnotator)
     348                    this._basicBlockAnnotatorEnabled = true;
     349
     350                if (shouldResumeTypeTokenAnnotator)
    310351                    this._setTypeTokenAnnotatorEnabledState(true);
    311352            } else {
    312353                console.assert(!pretty && this._isProbablyMinified);
    313                 if (this._typeTokenAnnotator || this._basicBlockAnnotator)
    314                     this._setTypeTokenAnnotatorEnabledState(false);
     354                if (this._basicBlockAnnotator)
     355                    this._basicBlockAnnotatorEnabled = false;
     356
     357                this._setTypeTokenAnnotatorEnabledState(false);
    315358            }
    316359        });
     
    393436        this.string = content;
    394437
    395         this._makeTypeTokenAnnotator();
    396         this._makeBasicBlockAnnotator();
    397 
    398         if (WebInspector.showJavaScriptTypeInformationSetting.value) {
    399             if (this._basicBlockAnnotator || this._typeTokenAnnotator)
    400                 this._setTypeTokenAnnotatorEnabledState(true);
    401         }
     438        this._createBasicBlockAnnotator();
     439        if (WebInspector.enableControlFlowProfilerSetting.value && this._basicBlockAnnotator)
     440            this._basicBlockAnnotatorEnabled = true;
     441
     442        this._createTypeTokenAnnotator();
     443        if (WebInspector.showJavaScriptTypeInformationSetting.value)
     444            this._setTypeTokenAnnotatorEnabledState(true);
    402445
    403446        this._contentDidPopulate();
     
    16791722    _setTypeTokenAnnotatorEnabledState(shouldActivate)
    16801723    {
    1681         console.assert(this._typeTokenAnnotator);
    16821724        if (!this._typeTokenAnnotator)
    16831725            return;
     
    16851727        if (shouldActivate) {
    16861728            console.assert(this.visible, "Annotators should not be enabled if the TextEditor is not visible");
    1687 
    16881729            RuntimeAgent.enableTypeProfiler();
    1689             if (RuntimeAgent.enableControlFlowProfiler)
    1690                 RuntimeAgent.enableControlFlowProfiler();
    1691 
    16921730            this._typeTokenAnnotator.reset();
    1693             if (this._basicBlockAnnotator) {
    1694                 console.assert(!this._basicBlockAnnotator.isActive());
    1695                 this._basicBlockAnnotator.reset();
    1696             }
    16971731
    16981732            if (!this._typeTokenScrollHandler)
     
    17061740
    17071741            this._typeTokenAnnotator.clear();
    1708             if (this._basicBlockAnnotator)
    1709                 this._basicBlockAnnotator.clear();
    17101742
    17111743            if (this._typeTokenScrollHandler)
     
    17161748
    17171749        this._updateTokenTrackingControllerState();
     1750    }
     1751
     1752    set _basicBlockAnnotatorEnabled(shouldActivate)
     1753    {
     1754        if (!this._basicBlockAnnotator)
     1755            return;
     1756
     1757        if (shouldActivate) {
     1758            console.assert(this.visible, "Annotators should not be enabled if the TextEditor is not visible");
     1759
     1760            RuntimeAgent.enableControlFlowProfiler();
     1761
     1762            console.assert(!this._basicBlockAnnotator.isActive());
     1763            this._basicBlockAnnotator.reset();
     1764
     1765            if (!this._controlFlowScrollHandler)
     1766                this._enableScrollEventsForControlFlowAnnotator();
     1767        } else {
     1768            this._basicBlockAnnotator.clear();
     1769
     1770            if (this._controlFlowScrollHandler)
     1771                this._disableScrollEventsForControlFlowAnnotator();
     1772        }
     1773
     1774        WebInspector.enableControlFlowProfilerSetting.value = shouldActivate;
    17181775    }
    17191776
     
    17291786    }
    17301787
    1731     _makeTypeTokenAnnotator()
     1788    _createTypeTokenAnnotator()
    17321789    {
    17331790        // COMPATIBILITY (iOS 8): Runtime.getRuntimeTypesForVariablesAtOffsets did not exist yet.
     
    17421799    }
    17431800
    1744     _makeBasicBlockAnnotator()
     1801    _createBasicBlockAnnotator()
    17451802    {
    17461803        // COMPATIBILITY (iOS 8): Runtime.getBasicBlocks did not exist yet.
     
    17591816        // Pause updating type tokens while scrolling to prevent frame loss.
    17601817        console.assert(!this._typeTokenScrollHandler);
    1761         this._typeTokenScrollHandler = this._makeTypeTokenScrollEventHandler();
     1818        this._typeTokenScrollHandler = this._createTypeTokenScrollEventHandler();
    17621819        this.addScrollHandler(this._typeTokenScrollHandler);
     1820    }
     1821
     1822    _enableScrollEventsForControlFlowAnnotator()
     1823    {
     1824        console.assert(!this._controlFlowScrollHandler);
     1825        this._controlFlowScrollHandler = this._createControlFlowScrollEventHandler();
     1826        this.addScrollHandler(this._controlFlowScrollHandler);
    17631827    }
    17641828
     
    17701834    }
    17711835
    1772     _makeTypeTokenScrollEventHandler()
    1773     {
    1774         var timeoutIdentifier = null;
    1775         function scrollHandler()
    1776         {
     1836    _disableScrollEventsForControlFlowAnnotator()
     1837    {
     1838        console.assert(this._controlFlowScrollHandler);
     1839        this.removeScrollHandler(this._controlFlowScrollHandler);
     1840        this._controlFlowScrollHandler = null;
     1841    }
     1842
     1843    _createTypeTokenScrollEventHandler()
     1844    {
     1845        let timeoutIdentifier = null;
     1846        let scrollHandler = () => {
    17771847            if (timeoutIdentifier)
    17781848                clearTimeout(timeoutIdentifier);
     
    17801850                if (this._typeTokenAnnotator)
    17811851                    this._typeTokenAnnotator.pause();
    1782                 if (this._basicBlockAnnotator)
    1783                     this._basicBlockAnnotator.pause();
    17841852            }
    17851853
    1786             timeoutIdentifier = setTimeout(function() {
     1854            timeoutIdentifier = setTimeout(() => {
    17871855                timeoutIdentifier = null;
    17881856                if (this._typeTokenAnnotator)
    17891857                    this._typeTokenAnnotator.resume();
     1858            }, WebInspector.SourceCodeTextEditor.DurationToUpdateTypeTokensAfterScrolling);
     1859        };
     1860
     1861        return scrollHandler;
     1862    }
     1863
     1864    _createControlFlowScrollEventHandler()
     1865    {
     1866        let timeoutIdentifier = null;
     1867        let scrollHandler = () => {
     1868            if (timeoutIdentifier)
     1869                clearTimeout(timeoutIdentifier);
     1870            else if (this._basicBlockAnnotator)
     1871                this._basicBlockAnnotator.pause();
     1872
     1873            timeoutIdentifier = setTimeout(()  => {
     1874                timeoutIdentifier = null;
    17901875                if (this._basicBlockAnnotator)
    17911876                    this._basicBlockAnnotator.resume();
    1792             }.bind(this), WebInspector.SourceCodeTextEditor.DurationToUpdateTypeTokensAfterScrolling);
    1793         }
    1794 
    1795         return scrollHandler.bind(this);
     1877            }, WebInspector.SourceCodeTextEditor.DurationToUpdateTypeTokensAfterScrolling);
     1878        };
     1879
     1880        return scrollHandler;
    17961881    }
    17971882
  • trunk/Source/WebInspectorUI/UserInterface/Views/TextContentView.js

    r205401 r205674  
    5252        this._showTypesButtonNavigationItem = new WebInspector.ActivateButtonNavigationItem("show-types", toolTipTypes, activatedToolTipTypes, "Images/NavigationItemTypes.svg", 13, 14);
    5353        this._showTypesButtonNavigationItem.enabled = false;
     54
     55        let toolTipCodeCoverage = WebInspector.UIString("Fade unexecuted code");
     56        let activatedToolTipCodeCoverage = WebInspector.UIString("Do not fade unexecuted code");
     57        this._codeCoverageButtonNavigationItem = new WebInspector.ActivateButtonNavigationItem("code-coverage", toolTipCodeCoverage, activatedToolTipCodeCoverage, "Images/NavigationItemCodeCoverage.svg", 13, 14);
     58        this._codeCoverageButtonNavigationItem.enabled = false;
    5459    }
    5560
     
    6368    get navigationItems()
    6469    {
    65         return [this._prettyPrintButtonNavigationItem, this._showTypesButtonNavigationItem];
     70        return [this._prettyPrintButtonNavigationItem, this._showTypesButtonNavigationItem, this._codeCoverageButtonNavigationItem];
    6671    }
    6772
  • trunk/Source/WebInspectorUI/UserInterface/Views/TextEditor.js

    r205425 r205674  
    138138    }
    139139
     140    get hasModified()
     141    {
     142        let historySize = this._codeMirror.historySize().undo;
     143
     144        // Formatting code creates a history item.
     145        if (this._formatted)
     146            historySize--;
     147
     148        return historySize > 0;
     149    }
     150
    140151    updateFormattedState(formatted)
    141152    {
     
    156167
    157168    canShowTypeAnnotations()
     169    {
     170        return false;
     171    }
     172
     173    canShowCoverageHints()
    158174    {
    159175        return false;
  • trunk/Source/WebInspectorUI/UserInterface/Views/TextResourceContentView.js

    r201019 r205674  
    5454        this._showTypesButtonNavigationItem.addEventListener(WebInspector.ButtonNavigationItem.Event.Clicked, this._toggleTypeAnnotations, this);
    5555        this._showTypesButtonNavigationItem.enabled = false;
    56 
    5756        WebInspector.showJavaScriptTypeInformationSetting.addEventListener(WebInspector.Setting.Event.Changed, this._showJavaScriptTypeInformationSettingChanged, this);
     57
     58        let toolTipCodeCoverage = WebInspector.UIString("Fade unexecuted code");
     59        let activatedToolTipCodeCoverage = WebInspector.UIString("Do not fade unexecuted code");
     60        this._codeCoverageButtonNavigationItem = new WebInspector.ActivateButtonNavigationItem("code-coverage", toolTipCodeCoverage, activatedToolTipCodeCoverage, "Images/NavigationItemCodeCoverage.svg", 13, 14);
     61        this._codeCoverageButtonNavigationItem.addEventListener(WebInspector.ButtonNavigationItem.Event.Clicked, this._toggleUnexecutedCodeHighlights, this);
     62        this._codeCoverageButtonNavigationItem.enabled = false;
     63        WebInspector.enableControlFlowProfilerSetting.addEventListener(WebInspector.Setting.Event.Changed, this._enableControlFlowProfilerSettingChanged, this);
    5864    }
    5965
     
    6268    get navigationItems()
    6369    {
    64         return [this._prettyPrintButtonNavigationItem, this._showTypesButtonNavigationItem];
     70        return [this._prettyPrintButtonNavigationItem, this._showTypesButtonNavigationItem, this._codeCoverageButtonNavigationItem];
    6571    }
    6672
     
    197203    {
    198204        this._prettyPrintButtonNavigationItem.enabled = this._textEditor.canBeFormatted();
     205
    199206        this._showTypesButtonNavigationItem.enabled = this._textEditor.canShowTypeAnnotations();
    200207        this._showTypesButtonNavigationItem.activated = WebInspector.showJavaScriptTypeInformationSetting.value;
     208
     209        this._codeCoverageButtonNavigationItem.enabled = this._textEditor.canShowCoverageHints();
     210        this._codeCoverageButtonNavigationItem.activated = WebInspector.enableControlFlowProfilerSetting.value;
    201211    }
    202212
     
    209219    _toggleTypeAnnotations(event)
    210220    {
    211         this._textEditor.toggleTypeAnnotations();
     221        this._showTypesButtonNavigationItem.enabled = false;
     222        this._textEditor.toggleTypeAnnotations().then(() => {
     223            this._showTypesButtonNavigationItem.enabled = true;
     224        })
     225    }
     226
     227    _toggleUnexecutedCodeHighlights(event)
     228    {
     229        this._codeCoverageButtonNavigationItem.enabled = false;
     230        this._textEditor.toggleUnexecutedCodeHighlights().then(() => {
     231            this._codeCoverageButtonNavigationItem.enabled = true;
     232        });
    212233    }
    213234
     
    215236    {
    216237        this._showTypesButtonNavigationItem.activated = WebInspector.showJavaScriptTypeInformationSetting.value;
     238    }
     239
     240    _enableControlFlowProfilerSettingChanged(event)
     241    {
     242        this._codeCoverageButtonNavigationItem.activated = WebInspector.enableControlFlowProfilerSetting.value;
    217243    }
    218244
Note: See TracChangeset for help on using the changeset viewer.