15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
32d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.VBox}
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @implements {WebInspector.Replaceable}
35a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.ContentProvider} contentProvider
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SourceFrame = function(contentProvider)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.VBox.call(this);
40a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this.element.classList.add("script-view");
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._url = contentProvider.contentURL();
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._contentProvider = contentProvider;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var textEditorDelegate = new WebInspector.TextEditorDelegateForSourceFrame(this);
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    this._textEditor = new WebInspector.CodeMirrorTextEditor(this._url, textEditorDelegate);
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._currentSearchResultIndex = -1;
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._searchResults = [];
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._messages = [];
53c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._rowMessageBuckets = {};
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._textEditor.setReadOnly(!this.canEditSource());
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._shortcuts = {};
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.addEventListener("keydown", this._handleKeyDown.bind(this), false);
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._sourcePosition = new WebInspector.StatusBarText("", "source-frame-cursor-position");
61c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._errorPopoverHelper = new WebInspector.PopoverHelper(this.element, this._getErrorAnchor.bind(this), this._showErrorPopover.bind(this));
63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._errorPopoverHelper.setTimeout(100, 100);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string} query
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string=} modifiers
6900d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch * @return {!RegExp}
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SourceFrame.createSearchRegex = function(query, modifiers)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var regex;
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    modifiers = modifiers || "";
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // First try creating regex if user knows the / / hint.
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
7800d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch        if (/^\/.+\/$/.test(query)) {
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            regex = new RegExp(query.substring(1, query.length - 1), modifiers);
8000d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch            regex.__fromRegExpQuery = true;
8100d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch        }
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) {
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Silent catch.
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Otherwise just do case-insensitive search.
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!regex)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        regex = createPlainTextSearchRegex(query, "i" + modifiers);
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return regex;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SourceFrame.Events = {
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollChanged: "ScrollChanged",
9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    SelectionChanged: "SelectionChanged",
9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    JumpHappened: "JumpHappened"
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SourceFrame.prototype = {
1005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    /**
101c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @param {!Element} target
102c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @param {!Event} event
103c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @return {(!Element|undefined)}
104c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     */
105c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    _getErrorAnchor: function(target, event)
106c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
107c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var element = target.enclosingNodeOrSelfWithClass("text-editor-line-decoration-icon")
108c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            || target.enclosingNodeOrSelfWithClass("text-editor-line-decoration-wave");
109c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (!element)
110c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return;
111c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._errorWavePopoverAnchor = new AnchorBox(event.clientX, event.clientY, 1, 1);
112c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return element;
113c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    },
114c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
115c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /**
116c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @param {!Element} anchor
117c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @param {!WebInspector.Popover} popover
118c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     */
119c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    _showErrorPopover: function(anchor, popover)
120c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
121c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var messageBucket = anchor.enclosingNodeOrSelfWithClass("text-editor-line-decoration")._messageBucket;
122c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var messagesOutline = messageBucket.messagesDescription();
123c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var popoverAnchor = anchor.enclosingNodeOrSelfWithClass("text-editor-line-decoration-icon") ? anchor : this._errorWavePopoverAnchor;
124c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        popover.show(messagesOutline, popoverAnchor);
125c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    },
126c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
127c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /**
1285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @param {number} key
129c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @param {function():boolean} handler
1305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     */
1315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    addShortcut: function(key, handler)
1325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
1335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        this._shortcuts[key] = handler;
1345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    },
1355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    wasShown: function()
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._ensureContentLoaded();
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.show(this.element);
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._editorAttached = true;
141c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        for (var line in this._rowMessageBuckets) {
142c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            var bucket = this._rowMessageBuckets[line];
143c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            bucket._updateDecorationPosition();
144c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._wasShownOrLoaded();
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {boolean}
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _isEditorShowing: function()
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this.isShowing() && this._editorAttached;
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    willHide: function()
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.View.prototype.willHide.call(this);
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._clearPositionToReveal();
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {?Element}
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    statusBarText: function()
167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
16853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return this._sourcePosition.element;
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
172a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Array.<!Element>}
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    statusBarItems: function()
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return [];
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
18009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {!Element}
18109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    defaultFocusedElement: function()
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._textEditor.defaultFocusedElement();
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get loaded()
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._loaded;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
19309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
19409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    hasContent: function()
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get textEditor()
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._textEditor;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _ensureContentLoaded: function()
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._contentRequested) {
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._contentRequested = true;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._contentProvider.requestContent(this.setContent.bind(this));
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    addMessage: function(msg)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._messages.push(msg);
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.loaded)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.addMessageToSource(msg.line - 1, msg);
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearMessages: function()
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
222c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        for (var line in this._rowMessageBuckets) {
223c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            var bubble = this._rowMessageBuckets[line];
224c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            bubble.detachFromEditor();
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._messages = [];
228c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._rowMessageBuckets = {};
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
2327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @param {number} line 0-based
23343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)     * @param {number=} column
23443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)     * @param {boolean=} shouldHighlight
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
23643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    revealPosition: function(line, column, shouldHighlight)
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._clearLineToScrollTo();
239591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._clearSelectionToSet();
24043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._positionToReveal = { line: line, column: column, shouldHighlight: shouldHighlight };
24143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._innerRevealPositionIfNeeded();
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    _innerRevealPositionIfNeeded: function()
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
24643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        if (!this._positionToReveal)
24743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            return;
24843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
24943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        if (!this.loaded || !this._isEditorShowing())
25043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            return;
25143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
25243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._textEditor.revealPosition(this._positionToReveal.line, this._positionToReveal.column, this._positionToReveal.shouldHighlight);
25343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        delete this._positionToReveal;
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    _clearPositionToReveal: function()
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
25843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._textEditor.clearPositionHighlight();
25943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        delete this._positionToReveal;
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} line
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scrollToLine: function(line)
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
26743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._clearPositionToReveal();
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._lineToScrollTo = line;
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._innerScrollToLineIfNeeded();
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _innerScrollToLineIfNeeded: function()
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (typeof this._lineToScrollTo === "number") {
275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (this.loaded && this._isEditorShowing()) {
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._textEditor.scrollToLine(this._lineToScrollTo);
277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                delete this._lineToScrollTo;
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _clearLineToScrollTo: function()
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete this._lineToScrollTo;
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
288d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {!WebInspector.TextRange}
289d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
290d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    selection: function()
291d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
292d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return this.textEditor.selection();
293d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
294d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
295d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
296a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.TextRange} textRange
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setSelection: function(textRange)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._selectionToSet = textRange;
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._innerSetSelectionIfNeeded();
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _innerSetSelectionIfNeeded: function()
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this._selectionToSet && this.loaded && this._isEditorShowing()) {
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._textEditor.setSelection(this._selectionToSet);
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            delete this._selectionToSet;
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
312591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _clearSelectionToSet: function()
313591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
314591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        delete this._selectionToSet;
315591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
316591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _wasShownOrLoaded: function()
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
31943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._innerRevealPositionIfNeeded();
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._innerSetSelectionIfNeeded();
321591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._innerScrollToLineIfNeeded();
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onTextChanged: function(oldRange, newRange)
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (this._searchResultsChangedCallback)
32751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            this._searchResultsChangedCallback();
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.clearMessages();
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
331591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _simplifyMimeType: function(content, mimeType)
33253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
33353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!mimeType)
33453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return "";
33553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (mimeType.indexOf("javascript") >= 0 ||
33653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            mimeType.indexOf("jscript") >= 0 ||
33753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            mimeType.indexOf("ecmascript") >= 0)
33853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return "text/javascript";
339591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        // A hack around the fact that files with "php" extension might be either standalone or html embedded php scripts.
340591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (mimeType === "text/x-php" && content.match(/\<\?.*\?\>/g))
341591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return "application/x-httpd-php";
34253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return mimeType;
34353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
34453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
3461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     * @param {string} highlighterType
3471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     */
3481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    setHighlighterType: function(highlighterType)
3491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    {
3501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        this._highlighterType = highlighterType;
3511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        this._updateHighlighterType("");
3521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    },
3531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
3541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    /**
3551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     * @param {string} content
3561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     */
3571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    _updateHighlighterType: function(content)
3581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    {
3591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        this._textEditor.setMimeType(this._simplifyMimeType(content, this._highlighterType));
3601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    },
3611e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
3621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    /**
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {?string} content
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
3651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    setContent: function(content)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!this._loaded) {
368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._loaded = true;
369926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._textEditor.setText(content || "");
37053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            this._textEditor.markClean();
371e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        } else {
372e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            var firstLine = this._textEditor.firstVisibleLine();
373e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            var selection = this._textEditor.selection();
37483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            this._textEditor.setText(content || "");
375e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            this._textEditor.scrollToLine(firstLine);
376e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            this._textEditor.setSelection(selection);
377e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        }
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3791e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        this._updateHighlighterType(content || "");
3805267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.beginUpdates();
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._setTextEditorDecorations();
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._wasShownOrLoaded();
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._delayedFindSearchMatches) {
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._delayedFindSearchMatches();
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            delete this._delayedFindSearchMatches;
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.onTextEditorContentLoaded();
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.endUpdates();
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onTextEditorContentLoaded: function() {},
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _setTextEditorDecorations: function()
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
401c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._rowMessageBuckets = {};
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.beginUpdates();
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._addExistingMessagesToSource();
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.endUpdates();
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} query
410591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {boolean} shouldJump
411a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @param {boolean} jumpBackwards
412a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!WebInspector.View, number)} callback
41351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     * @param {function(number)} currentMatchChangedCallback
41451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     * @param {function()} searchResultsChangedCallback
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
416a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    performSearch: function(query, shouldJump, jumpBackwards, callback, currentMatchChangedCallback, searchResultsChangedCallback)
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
41809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
41909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @param {string} query
42009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.SourceFrame}
42109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function doFindSearchMatches(query)
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._currentSearchResultIndex = -1;
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._searchResults = [];
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var regex = WebInspector.SourceFrame.createSearchRegex(query);
428591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._searchRegex = regex;
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._searchResults = this._collectRegexMatches(regex);
430591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            if (!this._searchResults.length)
431591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                this._textEditor.cancelSearchResultsHighlight();
432a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            else if (shouldJump && jumpBackwards)
433a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                this.jumpToPreviousSearchResult();
434591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            else if (shouldJump)
435591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                this.jumpToNextSearchResult();
436591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            else
437591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                this._textEditor.highlightSearchResults(regex, null);
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            callback(this, this._searchResults.length);
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
441591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._resetSearch();
442591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._currentSearchMatchChangedCallback = currentMatchChangedCallback;
44351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        this._searchResultsChangedCallback = searchResultsChangedCallback;
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.loaded)
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            doFindSearchMatches.call(this, query);
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._delayedFindSearchMatches = doFindSearchMatches.bind(this, query);
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._ensureContentLoaded();
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
452591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _editorFocused: function()
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
454a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._resetCurrentSearchResultIndex();
455a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
456a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
457a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    _resetCurrentSearchResultIndex: function()
458a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
459591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!this._searchResults.length)
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
461591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._currentSearchResultIndex = -1;
462591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._currentSearchMatchChangedCallback)
463591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._currentSearchMatchChangedCallback(this._currentSearchResultIndex);
464591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._textEditor.highlightSearchResults(this._searchRegex, null);
465591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
467591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _resetSearch: function()
468591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
469591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        delete this._delayedFindSearchMatches;
470591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        delete this._currentSearchMatchChangedCallback;
47151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        delete this._searchResultsChangedCallback;
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._currentSearchResultIndex = -1;
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._searchResults = [];
474591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        delete this._searchRegex;
475591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
476591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
477591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    searchCanceled: function()
478591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
479591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var range = this._currentSearchResultIndex !== -1 ? this._searchResults[this._currentSearchResultIndex] : null;
480591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._resetSearch();
481591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!this.loaded)
482591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return;
483591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._textEditor.cancelSearchResultsHighlight();
484591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (range)
485591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._textEditor.setSelection(range);
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
48909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
49009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    hasSearchResults: function()
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._searchResults.length > 0;
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToFirstSearchResult: function()
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.jumpToSearchResult(0);
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToLastSearchResult: function()
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.jumpToSearchResult(this._searchResults.length - 1);
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
506a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    /**
507a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @return {number}
508a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     */
509a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    _searchResultIndexForCurrentSelection: function()
510a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
511a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return insertionIndexForObjectInListSortedByFunction(this._textEditor.selection(), this._searchResults, WebInspector.TextRange.comparator);
512a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
513a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToNextSearchResult: function()
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
516a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var currentIndex = this._searchResultIndexForCurrentSelection();
517591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var nextIndex = this._currentSearchResultIndex === -1 ? currentIndex : currentIndex + 1;
518591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this.jumpToSearchResult(nextIndex);
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToPreviousSearchResult: function()
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
523a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var currentIndex = this._searchResultIndexForCurrentSelection();
524591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this.jumpToSearchResult(currentIndex - 1);
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
52809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
52909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    showingFirstSearchResult: function()
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._searchResults.length &&  this._currentSearchResultIndex === 0;
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
53609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
53709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    showingLastSearchResult: function()
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._searchResults.length && this._currentSearchResultIndex === (this._searchResults.length - 1);
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get currentSearchResultIndex()
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._currentSearchResultIndex;
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToSearchResult: function(index)
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.loaded || !this._searchResults.length)
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._currentSearchResultIndex = (index + this._searchResults.length) % this._searchResults.length;
553591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._currentSearchMatchChangedCallback)
554591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._currentSearchMatchChangedCallback(this._currentSearchResultIndex);
555591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._textEditor.highlightSearchResults(this._searchRegex, this._searchResults[this._currentSearchResultIndex]);
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} text
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
56109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    replaceSelectionWith: function(text)
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var range = this._searchResults[this._currentSearchResultIndex];
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!range)
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
566591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._textEditor.highlightSearchResults(this._searchRegex, null);
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var newRange = this._textEditor.editRange(range, text);
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.setSelection(newRange.collapseToEnd());
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} query
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} replacement
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    replaceAllWith: function(query, replacement)
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
577a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._resetCurrentSearchResultIndex();
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var text = this._textEditor.text();
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var range = this._textEditor.range();
58100d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch        var regex = WebInspector.SourceFrame.createSearchRegex(query, "g");
58200d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch        if (regex.__fromRegExpQuery)
58300d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch            text = text.replace(regex, replacement);
58400d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch        else
58500d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch            text = text.replace(regex, function() { return replacement; });
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
587a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var ranges = this._collectRegexMatches(regex);
588a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (!ranges.length)
589a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            return;
590a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
591a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        // Calculate the position of the end of the last range to be edited.
592a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var currentRangeIndex = insertionIndexForObjectInListSortedByFunction(this._textEditor.selection(), ranges, WebInspector.TextRange.comparator);
593a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var lastRangeIndex = mod(currentRangeIndex - 1, ranges.length);
594a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var lastRange = ranges[lastRangeIndex];
595a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var replacementLineEndings = replacement.lineEndings();
596a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var replacementLineCount = replacementLineEndings.length;
597a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var lastLineNumber = lastRange.startLine + replacementLineEndings.length - 1;
598a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var lastColumnNumber = lastRange.startColumn;
599a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (replacementLineEndings.length > 1)
600a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            lastColumnNumber = replacementLineEndings[replacementLineCount - 1] - replacementLineEndings[replacementLineCount - 2] - 1;
601a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.editRange(range, text);
603a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._textEditor.revealPosition(lastLineNumber, lastColumnNumber);
604a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._textEditor.setSelection(WebInspector.TextRange.createFromLocation(lastLineNumber, lastColumnNumber));
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _collectRegexMatches: function(regexObject)
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var ranges = [];
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < this._textEditor.linesCount; ++i) {
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var line = this._textEditor.line(i);
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var offset = 0;
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            do {
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var match = regexObject.exec(line);
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (match) {
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (match[0].length)
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        ranges.push(new WebInspector.TextRange(i, offset + match.index, i, offset + match.index + match[0].length));
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    offset += match.index + 1;
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    line = line.substring(match.index + 1);
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } while (match && line);
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ranges;
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _addExistingMessagesToSource: function()
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var length = this._messages.length;
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < length; ++i)
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.addMessageToSource(this._messages[i].line - 1, this._messages[i]);
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
633926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
634926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} lineNumber
635c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @param {!WebInspector.ConsoleMessage} consoleMessage
636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
637c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    addMessageToSource: function(lineNumber, consoleMessage)
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (lineNumber >= this._textEditor.linesCount)
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            lineNumber = this._textEditor.linesCount - 1;
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (lineNumber < 0)
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            lineNumber = 0;
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
644c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (!this._rowMessageBuckets[lineNumber])
645c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            this._rowMessageBuckets[lineNumber] = new WebInspector.SourceFrame.RowMessageBucket(this, this._textEditor, lineNumber);
646c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var messageBucket = this._rowMessageBuckets[lineNumber];
647c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        messageBucket.addMessage(consoleMessage);
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
650926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
651926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} lineNumber
652a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.ConsoleMessage} msg
653926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    removeMessageFromSource: function(lineNumber, msg)
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (lineNumber >= this._textEditor.linesCount)
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            lineNumber = this._textEditor.linesCount - 1;
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (lineNumber < 0)
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            lineNumber = 0;
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
661c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var messageBucket = this._rowMessageBuckets[lineNumber];
662c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (!messageBucket)
663c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return;
664c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        messageBucket.removeMessage(msg);
665c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (!messageBucket.uniqueMessagesCount()) {
666c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            messageBucket.detachFromEditor();
667c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            delete this._rowMessageBuckets[lineNumber];
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    populateLineGutterContextMenu: function(contextMenu, lineNumber)
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    populateTextAreaContextMenu: function(contextMenu, lineNumber)
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
67909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
68009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {?WebInspector.TextRange} from
68109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {?WebInspector.TextRange} to
68209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
68309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    onJumpToPosition: function(from, to)
68409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
68509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.SourceFrame.Events.JumpHappened, {
68609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            from: from,
68709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            to: to
68809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        });
68909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    },
69009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inheritScrollPositions: function(sourceFrame)
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.inheritScrollPositions(sourceFrame._textEditor);
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    canEditSource: function()
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
705a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.TextRange} textRange
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selectionChanged: function(textRange)
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7096f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        this._updateSourcePosition();
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.SourceFrame.Events.SelectionChanged, textRange);
7111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        WebInspector.notifications.dispatchEventToListeners(WebInspector.SourceFrame.Events.SelectionChanged, textRange);
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7146f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    _updateSourcePosition: function()
715926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
7166f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        var selections = this._textEditor.selections();
7176f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (!selections.length)
718926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
7196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (selections.length > 1) {
7206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            this._sourcePosition.setText(WebInspector.UIString("%d selection regions", selections.length));
7216f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            return;
7226f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        }
7236f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        var textRange = selections[0];
724926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (textRange.isEmpty()) {
72553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            this._sourcePosition.setText(WebInspector.UIString("Line %d, Column %d", textRange.endLine + 1, textRange.endColumn + 1));
726926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
727926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
728926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        textRange = textRange.normalize();
729926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
730926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var selectedText = this._textEditor.copyRange(textRange);
731926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (textRange.startLine === textRange.endLine)
73253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            this._sourcePosition.setText(WebInspector.UIString("%d characters selected", selectedText.length));
733926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        else
73453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            this._sourcePosition.setText(WebInspector.UIString("%d lines, %d characters selected", textRange.endLine - textRange.startLine + 1, selectedText.length));
735926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
736926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
737926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} lineNumber
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scrollChanged: function(lineNumber)
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.SourceFrame.Events.ScrollChanged, lineNumber);
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _handleKeyDown: function(e)
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var shortcutKey = WebInspector.KeyboardShortcut.makeKeyFromEvent(e);
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var handler = this._shortcuts[shortcutKey];
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (handler && handler())
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            e.consume(true);
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
753d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    __proto__: WebInspector.VBox.prototype
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
756c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WebInspector.SourceFrame._iconClassPerLevel = {};
757c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WebInspector.SourceFrame._iconClassPerLevel[WebInspector.ConsoleMessage.MessageLevel.Error] = "error-icon-small";
758c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WebInspector.SourceFrame._iconClassPerLevel[WebInspector.ConsoleMessage.MessageLevel.Warning] = "warning-icon-small";
759c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
760c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WebInspector.SourceFrame._lineClassPerLevel = {};
761c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WebInspector.SourceFrame._lineClassPerLevel[WebInspector.ConsoleMessage.MessageLevel.Error] = "text-editor-line-with-error";
762c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WebInspector.SourceFrame._lineClassPerLevel[WebInspector.ConsoleMessage.MessageLevel.Warning] = "text-editor-line-with-warning";
763c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
764c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)/**
765c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) * @constructor
766c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) * @param {!WebInspector.ConsoleMessage} consoleMessage
767c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) */
768c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WebInspector.SourceFrame.RowMessage = function(consoleMessage)
769c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
770c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._consoleMessage = consoleMessage;
771c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._repeatCount = 1;
772c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this.element = document.createElementWithClass("div", "text-editor-row-message");
773c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._icon = this.element.createChild("span", "text-editor-row-message-icon");
774c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._icon.classList.add(WebInspector.SourceFrame._iconClassPerLevel[consoleMessage.level]);
775c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._repeatCountElement = this.element.createChild("span", "bubble-repeat-count hidden error");
7769e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    var linesContainer = this.element.createChild("div", "text-editor-row-message-lines");
7779e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    var lines = this._consoleMessage.messageText.split("\n");
7789e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    for (var i = 0; i < lines.length; ++i) {
7799e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        var messageLine = linesContainer.createChild("div");
7809e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        messageLine.textContent = lines[i];
7819e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    }
782c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
783c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
784c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WebInspector.SourceFrame.RowMessage.prototype = {
785c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /**
786c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @return {!WebInspector.ConsoleMessage}
787c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     */
788c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    consoleMessage: function()
789c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
790c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return this._consoleMessage;
791c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    },
792c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
793c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /**
794c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @return {number}
795c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     */
796c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    repeatCount: function()
797c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
798c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return this._repeatCount;
799c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    },
800c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
801c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    setRepeatCount: function(repeatCount)
802c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
803c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (this._repeatCount === repeatCount)
804c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return;
805c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._repeatCount = repeatCount;
806c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._updateMessageRepeatCount();
807c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    },
808c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
809c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    _updateMessageRepeatCount: function()
810c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
811c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._repeatCountElement.textContent = this._repeatCount;
812c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var showRepeatCount = this._repeatCount > 1;
813c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._repeatCountElement.classList.toggle("hidden", !showRepeatCount);
814c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._icon.classList.toggle("hidden", showRepeatCount);
815c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
816c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
817c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
818c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)/**
819c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) * @constructor
820c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) * @param {!WebInspector.SourceFrame} sourceFrame
821c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) * @param {!WebInspector.TextEditor} textEditor
822c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) * @param {number} lineNumber
823c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) */
824c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WebInspector.SourceFrame.RowMessageBucket = function(sourceFrame, textEditor, lineNumber)
825c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
826c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._sourceFrame = sourceFrame;
827c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._textEditor = textEditor;
828c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._lineHandle = textEditor.textEditorPositionHandle(lineNumber, 0);
829c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._decoration = document.createElementWithClass("div", "text-editor-line-decoration");
830c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._decoration._messageBucket = this;
831c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._wave = this._decoration.createChild("div", "text-editor-line-decoration-wave");
832c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._icon = this._wave.createChild("div", "text-editor-line-decoration-icon");
833c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
834c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._textEditor.addDecoration(lineNumber, this._decoration);
835c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
836c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._messagesDescriptionElement = document.createElementWithClass("div", "text-editor-messages-description-container");
837c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Array.<!WebInspector.SourceFrame.RowMessage>} */
838c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._messages = [];
839c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
840c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._updateDecorationPosition();
841c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
842c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._level = null;
843c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
844c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
845c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)WebInspector.SourceFrame.RowMessageBucket.prototype = {
846c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    _updateDecorationPosition: function()
847c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
848c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (!this._sourceFrame._isEditorShowing())
849c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return;
850c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var position = this._lineHandle.resolve();
851c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (!position)
852c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return;
853c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var lineNumber = position.lineNumber;
854c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var lineText = this._textEditor.line(lineNumber);
855c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var lineIndent = WebInspector.TextUtils.lineIndent(lineText).length;
856c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var base = this._textEditor.cursorPositionToCoordinates(lineNumber, 0);
857c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var start = this._textEditor.cursorPositionToCoordinates(lineNumber, lineIndent);
858c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var end = this._textEditor.cursorPositionToCoordinates(lineNumber, lineText.length);
8597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        /** @const */
8607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var codeMirrorLinesLeftPadding = 4;
8617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._wave.style.left = (start.x - base.x + codeMirrorLinesLeftPadding) + "px";
862c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._wave.style.width = (end.x - start.x) + "px";
863c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    },
864c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
865c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /**
866c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @return {!Element}
867c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     */
868c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    messagesDescription: function()
869c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
870c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._messagesDescriptionElement.removeChildren();
871c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        for (var i = 0; i < this._messages.length; ++i) {
872c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            this._messagesDescriptionElement.appendChild(this._messages[i].element);
873c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
874c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return this._messagesDescriptionElement;
875c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    },
876c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
877c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    detachFromEditor: function()
878c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
879c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var position = this._lineHandle.resolve();
880c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (!position)
881c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return;
882c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var lineNumber = position.lineNumber;
883c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (this._level)
884c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            this._textEditor.toggleLineClass(lineNumber, WebInspector.SourceFrame._lineClassPerLevel[this._level], false);
885c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._textEditor.removeDecoration(lineNumber, this._decoration);
886c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    },
887c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
888c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /**
889c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @return {number}
890c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     */
891c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    uniqueMessagesCount: function()
892c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
893c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return this._messages.length;
894c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    },
895c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
896c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /**
897c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @param {!WebInspector.ConsoleMessage} consoleMessage
898c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     */
899c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    addMessage: function(consoleMessage)
900c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
901c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        for (var i = 0; i < this._messages.length; ++i) {
902c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            var message = this._messages[i];
903c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            if (message.consoleMessage().isEqual(consoleMessage)) {
904c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                message.setRepeatCount(message.repeatCount() + 1);
905c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                return;
906c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            }
907c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
908c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
909c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var rowMessage = new WebInspector.SourceFrame.RowMessage(consoleMessage);
910c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._messages.push(rowMessage);
911c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._updateBucketLevel();
912c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    },
913c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
914c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /**
915c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @param {!WebInspector.ConsoleMessage} consoleMessage
916c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     */
917c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    removeMessage: function(consoleMessage)
918c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
919c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        for (var i = 0; i < this._messages.length; ++i) {
920c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            var rowMessage = this._messages[i];
921c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            if (!rowMessage.consoleMessage().isEqual(consoleMessage))
922c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                continue;
923c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            rowMessage.setRepeatCount(rowMessage.repeatCount() - 1);
924c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            if (!rowMessage.repeatCount())
925c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                this._messages.splice(i, 1);
926c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            this._updateBucketLevel();
927c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return;
928c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
929c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    },
930c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
931c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    _updateBucketLevel: function()
932c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
933c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (!this._messages.length)
934c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return;
935c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var position = this._lineHandle.resolve();
936c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (!position)
937c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return;
938c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
939c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var lineNumber = position.lineNumber;
940c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        var maxMessage = null;
941c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        for (var i = 0; i < this._messages.length; ++i) {
942c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            var message = this._messages[i].consoleMessage();;
943c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            if (!maxMessage || WebInspector.ConsoleMessage.messageLevelComparator(maxMessage, message) < 0)
944c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)                maxMessage = message;
945c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
946c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
947c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (this._level) {
948c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            this._textEditor.toggleLineClass(lineNumber, WebInspector.SourceFrame._lineClassPerLevel[this._level], false);
949c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            this._icon.classList.toggle(WebInspector.SourceFrame._iconClassPerLevel[this._level], false);
950c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        }
951c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._level = maxMessage.level;
952c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (!this._level)
953c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            return;
954c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._textEditor.toggleLineClass(lineNumber, WebInspector.SourceFrame._lineClassPerLevel[this._level], true);
955c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._icon.classList.toggle(WebInspector.SourceFrame._iconClassPerLevel[this._level], true);
956c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
957c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @implements {WebInspector.TextEditorDelegate}
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.TextEditorDelegateForSourceFrame = function(sourceFrame)
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._sourceFrame = sourceFrame;
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.TextEditorDelegateForSourceFrame.prototype = {
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onTextChanged: function(oldRange, newRange)
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._sourceFrame.onTextChanged(oldRange, newRange);
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
975a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.TextRange} textRange
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selectionChanged: function(textRange)
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._sourceFrame.selectionChanged(textRange);
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} lineNumber
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scrollChanged: function(lineNumber)
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._sourceFrame.scrollChanged(lineNumber);
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
990591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    editorFocused: function()
991591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
992591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._sourceFrame._editorFocused();
993591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
994591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    populateLineGutterContextMenu: function(contextMenu, lineNumber)
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._sourceFrame.populateLineGutterContextMenu(contextMenu, lineNumber);
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    populateTextAreaContextMenu: function(contextMenu, lineNumber)
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._sourceFrame.populateTextAreaContextMenu(contextMenu, lineNumber);
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} hrefValue
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {boolean} isExternal
1008a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Element}
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    createLink: function(hrefValue, isExternal)
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var targetLocation = WebInspector.ParsedURL.completeURL(this._sourceFrame._url, hrefValue);
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebInspector.linkifyURLAsNode(targetLocation || hrefValue, hrefValue, undefined, isExternal);
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
101609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
101709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {?WebInspector.TextRange} from
101809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {?WebInspector.TextRange} to
101909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
102009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    onJumpToPosition: function(from, to)
102109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
102209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._sourceFrame.onJumpToPosition(from, to);
102309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1025