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)
31f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/codemirror.js");
32f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/css.js");
33f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/javascript.js");
34f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/xml.js");
35f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/htmlmixed.js");
36f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
37f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/matchbrackets.js");
38f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/closebrackets.js");
39f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/markselection.js");
40f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/comment.js");
41f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/overlay.js");
42f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
43f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/htmlembedded.js");
44f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/clike.js");
45f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/coffeescript.js");
46f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/php.js");
47f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/python.js");
48f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("../cm/shell.js");
49f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("CodeMirrorUtils.js");
50f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("CodeMirrorTextEditor.js");
51f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
53d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.VBox}
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @implements {WebInspector.Replaceable}
56a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.ContentProvider} contentProvider
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SourceFrame = function(contentProvider)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.VBox.call(this);
61a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this.element.classList.add("script-view");
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._url = contentProvider.contentURL();
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._contentProvider = contentProvider;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var textEditorDelegate = new WebInspector.TextEditorDelegateForSourceFrame(this);
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    this._textEditor = new WebInspector.CodeMirrorTextEditor(this._url, textEditorDelegate);
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._currentSearchResultIndex = -1;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._searchResults = [];
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._messages = [];
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._rowMessages = {};
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._messageBubbles = {};
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._textEditor.setReadOnly(!this.canEditSource());
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._shortcuts = {};
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.addEventListener("keydown", this._handleKeyDown.bind(this), false);
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._sourcePosition = new WebInspector.StatusBarText("", "source-frame-cursor-position");
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string} query
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string=} modifiers
8800d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch * @return {!RegExp}
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SourceFrame.createSearchRegex = function(query, modifiers)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var regex;
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    modifiers = modifiers || "";
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // First try creating regex if user knows the / / hint.
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try {
9700d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch        if (/^\/.+\/$/.test(query)) {
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            regex = new RegExp(query.substring(1, query.length - 1), modifiers);
9900d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch            regex.__fromRegExpQuery = true;
10000d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch        }
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } catch (e) {
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Silent catch.
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Otherwise just do case-insensitive search.
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!regex)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        regex = createPlainTextSearchRegex(query, "i" + modifiers);
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return regex;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SourceFrame.Events = {
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScrollChanged: "ScrollChanged",
11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    SelectionChanged: "SelectionChanged",
11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    JumpHappened: "JumpHappened"
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SourceFrame.prototype = {
1195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    /**
1205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @param {number} key
1215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @param {function()} handler
1225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     */
1235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    addShortcut: function(key, handler)
1245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
1255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        this._shortcuts[key] = handler;
1265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    },
1275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    wasShown: function()
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._ensureContentLoaded();
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.show(this.element);
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._editorAttached = true;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._wasShownOrLoaded();
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {boolean}
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _isEditorShowing: function()
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this.isShowing() && this._editorAttached;
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    willHide: function()
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.View.prototype.willHide.call(this);
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._clearPositionToReveal();
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {?Element}
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    statusBarText: function()
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
15653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return this._sourcePosition.element;
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
160a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Array.<!Element>}
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    statusBarItems: function()
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return [];
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
16809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {!Element}
16909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    defaultFocusedElement: function()
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._textEditor.defaultFocusedElement();
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get loaded()
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._loaded;
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
18109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
18209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    hasContent: function()
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get textEditor()
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._textEditor;
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _ensureContentLoaded: function()
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._contentRequested) {
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._contentRequested = true;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._contentProvider.requestContent(this.setContent.bind(this));
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    addMessage: function(msg)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._messages.push(msg);
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.loaded)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.addMessageToSource(msg.line - 1, msg);
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearMessages: function()
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var line in this._messageBubbles) {
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var bubble = this._messageBubbles[line];
212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var lineNumber = parseInt(line, 10);
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._textEditor.removeDecoration(lineNumber, bubble);
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._messages = [];
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._rowMessages = {};
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._messageBubbles = {};
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} line
22343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)     * @param {number=} column
22443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)     * @param {boolean=} shouldHighlight
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
22643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    revealPosition: function(line, column, shouldHighlight)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._clearLineToScrollTo();
229591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._clearSelectionToSet();
23043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._positionToReveal = { line: line, column: column, shouldHighlight: shouldHighlight };
23143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._innerRevealPositionIfNeeded();
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    _innerRevealPositionIfNeeded: function()
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
23643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        if (!this._positionToReveal)
23743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            return;
23843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
23943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        if (!this.loaded || !this._isEditorShowing())
24043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)            return;
24143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
24243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._textEditor.revealPosition(this._positionToReveal.line, this._positionToReveal.column, this._positionToReveal.shouldHighlight);
24343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        delete this._positionToReveal;
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    _clearPositionToReveal: function()
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
24843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._textEditor.clearPositionHighlight();
24943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        delete this._positionToReveal;
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} line
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scrollToLine: function(line)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
25743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._clearPositionToReveal();
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._lineToScrollTo = line;
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._innerScrollToLineIfNeeded();
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _innerScrollToLineIfNeeded: function()
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (typeof this._lineToScrollTo === "number") {
265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (this.loaded && this._isEditorShowing()) {
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._textEditor.scrollToLine(this._lineToScrollTo);
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                delete this._lineToScrollTo;
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _clearLineToScrollTo: function()
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete this._lineToScrollTo;
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
278d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     * @return {!WebInspector.TextRange}
279d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)     */
280d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    selection: function()
281d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
282d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return this.textEditor.selection();
283d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    },
284d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
285d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    /**
286a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.TextRange} textRange
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setSelection: function(textRange)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._selectionToSet = textRange;
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._innerSetSelectionIfNeeded();
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _innerSetSelectionIfNeeded: function()
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this._selectionToSet && this.loaded && this._isEditorShowing()) {
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._textEditor.setSelection(this._selectionToSet);
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            delete this._selectionToSet;
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
302591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _clearSelectionToSet: function()
303591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
304591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        delete this._selectionToSet;
305591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
306591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _wasShownOrLoaded: function()
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
30943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._innerRevealPositionIfNeeded();
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._innerSetSelectionIfNeeded();
311591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._innerScrollToLineIfNeeded();
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onTextChanged: function(oldRange, newRange)
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
31651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (this._searchResultsChangedCallback && !this._isReplacing)
31751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            this._searchResultsChangedCallback();
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.clearMessages();
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
321591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _simplifyMimeType: function(content, mimeType)
32253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
32353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!mimeType)
32453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return "";
32553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (mimeType.indexOf("javascript") >= 0 ||
32653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            mimeType.indexOf("jscript") >= 0 ||
32753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            mimeType.indexOf("ecmascript") >= 0)
32853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return "text/javascript";
329591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        // A hack around the fact that files with "php" extension might be either standalone or html embedded php scripts.
330591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (mimeType === "text/x-php" && content.match(/\<\?.*\?\>/g))
331591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return "application/x-httpd-php";
33253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return mimeType;
33353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
33453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
3361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     * @param {string} highlighterType
3371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     */
3381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    setHighlighterType: function(highlighterType)
3391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    {
3401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        this._highlighterType = highlighterType;
3411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        this._updateHighlighterType("");
3421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    },
3431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
3441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    /**
3451e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     * @param {string} content
3461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)     */
3471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    _updateHighlighterType: function(content)
3481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    {
3491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        this._textEditor.setMimeType(this._simplifyMimeType(content, this._highlighterType));
3501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    },
3511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
3521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    /**
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {?string} content
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
3551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    setContent: function(content)
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!this._loaded) {
358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._loaded = true;
359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._textEditor.setText(content || "");
36053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            this._textEditor.markClean();
361e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        } else {
362e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            var firstLine = this._textEditor.firstVisibleLine();
363e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            var selection = this._textEditor.selection();
36483750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch            this._textEditor.setText(content || "");
365e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            this._textEditor.scrollToLine(firstLine);
366e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch            this._textEditor.setSelection(selection);
367e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        }
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3691e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        this._updateHighlighterType(content || "");
3705267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.beginUpdates();
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._setTextEditorDecorations();
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._wasShownOrLoaded();
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._delayedFindSearchMatches) {
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._delayedFindSearchMatches();
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            delete this._delayedFindSearchMatches;
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.onTextEditorContentLoaded();
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.endUpdates();
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onTextEditorContentLoaded: function() {},
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _setTextEditorDecorations: function()
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._rowMessages = {};
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._messageBubbles = {};
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.beginUpdates();
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._addExistingMessagesToSource();
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.endUpdates();
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} query
403591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {boolean} shouldJump
404a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @param {boolean} jumpBackwards
405a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {function(!WebInspector.View, number)} callback
40651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     * @param {function(number)} currentMatchChangedCallback
40751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     * @param {function()} searchResultsChangedCallback
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
409a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    performSearch: function(query, shouldJump, jumpBackwards, callback, currentMatchChangedCallback, searchResultsChangedCallback)
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
41109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
41209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @param {string} query
41309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.SourceFrame}
41409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function doFindSearchMatches(query)
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._currentSearchResultIndex = -1;
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._searchResults = [];
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var regex = WebInspector.SourceFrame.createSearchRegex(query);
421591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._searchRegex = regex;
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._searchResults = this._collectRegexMatches(regex);
423591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            if (!this._searchResults.length)
424591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                this._textEditor.cancelSearchResultsHighlight();
425a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            else if (shouldJump && jumpBackwards)
426a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                this.jumpToPreviousSearchResult();
427591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            else if (shouldJump)
428591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                this.jumpToNextSearchResult();
429591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            else
430591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                this._textEditor.highlightSearchResults(regex, null);
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            callback(this, this._searchResults.length);
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
434591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._resetSearch();
435591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._currentSearchMatchChangedCallback = currentMatchChangedCallback;
43651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        this._searchResultsChangedCallback = searchResultsChangedCallback;
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.loaded)
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            doFindSearchMatches.call(this, query);
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._delayedFindSearchMatches = doFindSearchMatches.bind(this, query);
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._ensureContentLoaded();
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _editorFocused: function()
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
447a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._resetCurrentSearchResultIndex();
448a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
449a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
450a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    _resetCurrentSearchResultIndex: function()
451a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
452591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!this._searchResults.length)
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
454591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._currentSearchResultIndex = -1;
455591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._currentSearchMatchChangedCallback)
456591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._currentSearchMatchChangedCallback(this._currentSearchResultIndex);
457591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._textEditor.highlightSearchResults(this._searchRegex, null);
458591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
460591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _resetSearch: function()
461591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
462591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        delete this._delayedFindSearchMatches;
463591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        delete this._currentSearchMatchChangedCallback;
46451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        delete this._searchResultsChangedCallback;
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._currentSearchResultIndex = -1;
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._searchResults = [];
467591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        delete this._searchRegex;
468591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
469591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
470591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    searchCanceled: function()
471591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
472591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var range = this._currentSearchResultIndex !== -1 ? this._searchResults[this._currentSearchResultIndex] : null;
473591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._resetSearch();
474591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!this.loaded)
475591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return;
476591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._textEditor.cancelSearchResultsHighlight();
477591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (range)
478591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._textEditor.setSelection(range);
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
48209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
48309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    hasSearchResults: function()
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._searchResults.length > 0;
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToFirstSearchResult: function()
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.jumpToSearchResult(0);
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToLastSearchResult: function()
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.jumpToSearchResult(this._searchResults.length - 1);
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
499a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    /**
500a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @return {number}
501a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     */
502a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    _searchResultIndexForCurrentSelection: function()
503a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
504a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return insertionIndexForObjectInListSortedByFunction(this._textEditor.selection(), this._searchResults, WebInspector.TextRange.comparator);
505a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
506a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToNextSearchResult: function()
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
509a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var currentIndex = this._searchResultIndexForCurrentSelection();
510591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var nextIndex = this._currentSearchResultIndex === -1 ? currentIndex : currentIndex + 1;
511591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this.jumpToSearchResult(nextIndex);
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToPreviousSearchResult: function()
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
516a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var currentIndex = this._searchResultIndexForCurrentSelection();
517591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this.jumpToSearchResult(currentIndex - 1);
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
52109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
52209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    showingFirstSearchResult: function()
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._searchResults.length &&  this._currentSearchResultIndex === 0;
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
52909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
53009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    showingLastSearchResult: function()
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._searchResults.length && this._currentSearchResultIndex === (this._searchResults.length - 1);
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get currentSearchResultIndex()
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._currentSearchResultIndex;
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jumpToSearchResult: function(index)
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.loaded || !this._searchResults.length)
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._currentSearchResultIndex = (index + this._searchResults.length) % this._searchResults.length;
546591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._currentSearchMatchChangedCallback)
547591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._currentSearchMatchChangedCallback(this._currentSearchResultIndex);
548591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._textEditor.highlightSearchResults(this._searchRegex, this._searchResults[this._currentSearchResultIndex]);
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} text
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
55409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    replaceSelectionWith: function(text)
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var range = this._searchResults[this._currentSearchResultIndex];
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!range)
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
559591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._textEditor.highlightSearchResults(this._searchRegex, null);
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._isReplacing = true;
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var newRange = this._textEditor.editRange(range, text);
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete this._isReplacing;
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.setSelection(newRange.collapseToEnd());
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} query
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} replacement
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    replaceAllWith: function(query, replacement)
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
574a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._resetCurrentSearchResultIndex();
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var text = this._textEditor.text();
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var range = this._textEditor.range();
57800d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch        var regex = WebInspector.SourceFrame.createSearchRegex(query, "g");
57900d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch        if (regex.__fromRegExpQuery)
58000d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch            text = text.replace(regex, replacement);
58100d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch        else
58200d3faa021f1e9934a353eeebe4e57e354856cf6Ben Murdoch            text = text.replace(regex, function() { return replacement; });
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
584a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var ranges = this._collectRegexMatches(regex);
585a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (!ranges.length)
586a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            return;
587a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
588a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        // Calculate the position of the end of the last range to be edited.
589a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var currentRangeIndex = insertionIndexForObjectInListSortedByFunction(this._textEditor.selection(), ranges, WebInspector.TextRange.comparator);
590a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var lastRangeIndex = mod(currentRangeIndex - 1, ranges.length);
591a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var lastRange = ranges[lastRangeIndex];
592a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var replacementLineEndings = replacement.lineEndings();
593a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var replacementLineCount = replacementLineEndings.length;
594a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var lastLineNumber = lastRange.startLine + replacementLineEndings.length - 1;
595a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var lastColumnNumber = lastRange.startColumn;
596a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (replacementLineEndings.length > 1)
597a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            lastColumnNumber = replacementLineEndings[replacementLineCount - 1] - replacementLineEndings[replacementLineCount - 2] - 1;
598a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._isReplacing = true;
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.editRange(range, text);
601a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._textEditor.revealPosition(lastLineNumber, lastColumnNumber);
602a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._textEditor.setSelection(WebInspector.TextRange.createFromLocation(lastLineNumber, lastColumnNumber));
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete this._isReplacing;
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _collectRegexMatches: function(regexObject)
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var ranges = [];
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < this._textEditor.linesCount; ++i) {
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var line = this._textEditor.line(i);
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var offset = 0;
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            do {
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var match = regexObject.exec(line);
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (match) {
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (match[0].length)
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        ranges.push(new WebInspector.TextRange(i, offset + match.index, i, offset + match.index + match[0].length));
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    offset += match.index + 1;
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    line = line.substring(match.index + 1);
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } while (match && line);
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ranges;
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _addExistingMessagesToSource: function()
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var length = this._messages.length;
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < length; ++i)
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.addMessageToSource(this._messages[i].line - 1, this._messages[i]);
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
632926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
633926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} lineNumber
634a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.ConsoleMessage} msg
635926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    addMessageToSource: function(lineNumber, msg)
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (lineNumber >= this._textEditor.linesCount)
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            lineNumber = this._textEditor.linesCount - 1;
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (lineNumber < 0)
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            lineNumber = 0;
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var rowMessages = this._rowMessages[lineNumber];
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!rowMessages) {
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            rowMessages = [];
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._rowMessages[lineNumber] = rowMessages;
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < rowMessages.length; ++i) {
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (rowMessages[i].consoleMessage.isEqual(msg)) {
65107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                rowMessages[i].repeatCount++;
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._updateMessageRepeatCount(rowMessages[i]);
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var rowMessage = { consoleMessage: msg };
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rowMessages.push(rowMessage);
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
660926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._textEditor.beginUpdates();
661926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var messageBubbleElement = this._messageBubbles[lineNumber];
662926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!messageBubbleElement) {
663926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            messageBubbleElement = document.createElement("div");
664926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            messageBubbleElement.className = "webkit-html-message-bubble";
665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._messageBubbles[lineNumber] = messageBubbleElement;
666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._textEditor.addDecoration(lineNumber, messageBubbleElement);
667926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
668926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
66953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var imageElement = document.createElement("div");
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (msg.level) {
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case WebInspector.ConsoleMessage.MessageLevel.Error:
672a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                messageBubbleElement.classList.add("webkit-html-error-message");
67353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                imageElement.className = "error-icon-small";
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case WebInspector.ConsoleMessage.MessageLevel.Warning:
676a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                messageBubbleElement.classList.add("webkit-html-warning-message");
67753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                imageElement.className = "warning-icon-small";
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var messageLineElement = document.createElement("div");
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        messageLineElement.className = "webkit-html-message-line";
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        messageBubbleElement.appendChild(messageLineElement);
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Create the image element in the Inspector's document so we can use relative image URLs.
68653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        messageLineElement.appendChild(imageElement);
687d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        messageLineElement.appendChild(document.createTextNode(msg.messageText));
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rowMessage.element = messageLineElement;
69007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        rowMessage.repeatCount = 1;
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._updateMessageRepeatCount(rowMessage);
692926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._textEditor.endUpdates();
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _updateMessageRepeatCount: function(rowMessage)
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (rowMessage.repeatCount < 2)
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!rowMessage.repeatCountElement) {
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var repeatCountElement = document.createElement("span");
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            rowMessage.element.appendChild(repeatCountElement);
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            rowMessage.repeatCountElement = repeatCountElement;
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rowMessage.repeatCountElement.textContent = WebInspector.UIString(" (repeated %d times)", rowMessage.repeatCount);
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
709926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
710926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} lineNumber
711a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.ConsoleMessage} msg
712926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    removeMessageFromSource: function(lineNumber, msg)
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (lineNumber >= this._textEditor.linesCount)
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            lineNumber = this._textEditor.linesCount - 1;
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (lineNumber < 0)
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            lineNumber = 0;
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var rowMessages = this._rowMessages[lineNumber];
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; rowMessages && i < rowMessages.length; ++i) {
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var rowMessage = rowMessages[i];
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (rowMessage.consoleMessage !== msg)
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                continue;
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var messageLineElement = rowMessage.element;
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var messageBubbleElement = messageLineElement.parentElement;
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            messageBubbleElement.removeChild(messageLineElement);
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            rowMessages.remove(rowMessage);
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!rowMessages.length)
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                delete this._rowMessages[lineNumber];
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!messageBubbleElement.childElementCount) {
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._textEditor.removeDecoration(lineNumber, messageBubbleElement);
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                delete this._messageBubbles[lineNumber];
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    populateLineGutterContextMenu: function(contextMenu, lineNumber)
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    populateTextAreaContextMenu: function(contextMenu, lineNumber)
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
74809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
74909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {?WebInspector.TextRange} from
75009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {?WebInspector.TextRange} to
75109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
75209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    onJumpToPosition: function(from, to)
75309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
75409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.SourceFrame.Events.JumpHappened, {
75509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            from: from,
75609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            to: to
75709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        });
75809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    },
75909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inheritScrollPositions: function(sourceFrame)
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._textEditor.inheritScrollPositions(sourceFrame._textEditor);
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    canEditSource: function()
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
774a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.TextRange} textRange
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selectionChanged: function(textRange)
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7786f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        this._updateSourcePosition();
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.SourceFrame.Events.SelectionChanged, textRange);
7801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        WebInspector.notifications.dispatchEventToListeners(WebInspector.SourceFrame.Events.SelectionChanged, textRange);
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7836f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    _updateSourcePosition: function()
784926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
7856f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        var selections = this._textEditor.selections();
7866f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (!selections.length)
787926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
7886f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (selections.length > 1) {
7896f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            this._sourcePosition.setText(WebInspector.UIString("%d selection regions", selections.length));
7906f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch            return;
7916f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        }
7926f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        var textRange = selections[0];
793926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (textRange.isEmpty()) {
79453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            this._sourcePosition.setText(WebInspector.UIString("Line %d, Column %d", textRange.endLine + 1, textRange.endColumn + 1));
795926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
796926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
797926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        textRange = textRange.normalize();
798926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
799926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var selectedText = this._textEditor.copyRange(textRange);
800926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (textRange.startLine === textRange.endLine)
80153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            this._sourcePosition.setText(WebInspector.UIString("%d characters selected", selectedText.length));
802926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        else
80353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            this._sourcePosition.setText(WebInspector.UIString("%d lines, %d characters selected", textRange.endLine - textRange.startLine + 1, selectedText.length));
804926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
805926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
806926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} lineNumber
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scrollChanged: function(lineNumber)
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.SourceFrame.Events.ScrollChanged, lineNumber);
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _handleKeyDown: function(e)
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var shortcutKey = WebInspector.KeyboardShortcut.makeKeyFromEvent(e);
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var handler = this._shortcuts[shortcutKey];
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (handler && handler())
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            e.consume(true);
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
822d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    __proto__: WebInspector.VBox.prototype
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @implements {WebInspector.TextEditorDelegate}
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.TextEditorDelegateForSourceFrame = function(sourceFrame)
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._sourceFrame = sourceFrame;
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.TextEditorDelegateForSourceFrame.prototype = {
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onTextChanged: function(oldRange, newRange)
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._sourceFrame.onTextChanged(oldRange, newRange);
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
842a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.TextRange} textRange
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selectionChanged: function(textRange)
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._sourceFrame.selectionChanged(textRange);
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} lineNumber
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    scrollChanged: function(lineNumber)
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._sourceFrame.scrollChanged(lineNumber);
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
857591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    editorFocused: function()
858591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
859591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._sourceFrame._editorFocused();
860591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
861591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    populateLineGutterContextMenu: function(contextMenu, lineNumber)
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._sourceFrame.populateLineGutterContextMenu(contextMenu, lineNumber);
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    populateTextAreaContextMenu: function(contextMenu, lineNumber)
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._sourceFrame.populateTextAreaContextMenu(contextMenu, lineNumber);
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} hrefValue
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {boolean} isExternal
875a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Element}
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    createLink: function(hrefValue, isExternal)
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var targetLocation = WebInspector.ParsedURL.completeURL(this._sourceFrame._url, hrefValue);
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WebInspector.linkifyURLAsNode(targetLocation || hrefValue, hrefValue, undefined, isExternal);
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
88409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {?WebInspector.TextRange} from
88509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {?WebInspector.TextRange} to
88609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
88709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    onJumpToPosition: function(from, to)
88809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
88909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._sourceFrame.onJumpToPosition(from, to);
89009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
892f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
893f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("GoToLineDialog.js");
894f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("ResourceView.js");
895f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("FontView.js");
896f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuimportScript("ImageView.js");
897