11e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
21e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Redistribution and use in source and binary forms, with or without
31e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// modification, are permitted provided that the following conditions are
41e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// met:
51e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org//
61e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org//     * Redistributions of source code must retain the above copyright
71e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org//       notice, this list of conditions and the following disclaimer.
81e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org//     * Redistributions in binary form must reproduce the above
91e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org//       copyright notice, this list of conditions and the following
101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org//       disclaimer in the documentation and/or other materials provided
111e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org//       with the distribution.
121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org//     * Neither the name of Google Inc. nor the names of its
131e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org//       contributors may be used to endorse or promote products derived
141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org//       from this software without specific prior written permission.
151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org//
161e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
171e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
181e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
191e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
211e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
221e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
231e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
241e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
251e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
281e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// This is a copy from blink dev tools, see:
291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// http://src.chromium.org/viewvc/blink/trunk/Source/devtools/front_end/SourceMap.js
301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// revision: 153407
311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
321e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Added to make the file work without dev tools
331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgWebInspector = {};
341e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgWebInspector.ParsedURL = {};
351e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgWebInspector.ParsedURL.completeURL = function(){};
361e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// start of original file content
371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org/*
391e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * Copyright (C) 2012 Google Inc. All rights reserved.
401e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org *
411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * Redistribution and use in source and binary forms, with or without
421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * modification, are permitted provided that the following conditions are
431e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * met:
441e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org *
451e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org *     * Redistributions of source code must retain the above copyright
461e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * notice, this list of conditions and the following disclaimer.
471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org *     * Redistributions in binary form must reproduce the above
481e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * copyright notice, this list of conditions and the following disclaimer
491e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * in the documentation and/or other materials provided with the
501e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * distribution.
511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org *     * Neither the name of Google Inc. nor the names of its
521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * contributors may be used to endorse or promote products derived from
531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * this software without specific prior written permission.
541e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org *
551e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
571e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
581e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org */
671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org/**
691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * Implements Source Map V3 model. See http://code.google.com/p/closure-compiler/wiki/SourceMaps
701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * for format description.
711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * @constructor
721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * @param {string} sourceMappingURL
731e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * @param {SourceMapV3} payload
741e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org */
751e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgWebInspector.SourceMap = function(sourceMappingURL, payload)
761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org{
771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    if (!WebInspector.SourceMap.prototype._base64Map) {
781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        const base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
791e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        WebInspector.SourceMap.prototype._base64Map = {};
801e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        for (var i = 0; i < base64Digits.length; ++i)
811e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            WebInspector.SourceMap.prototype._base64Map[base64Digits.charAt(i)] = i;
821e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    }
831e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
841e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    this._sourceMappingURL = sourceMappingURL;
851e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    this._reverseMappingsBySourceURL = {};
861e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    this._mappings = [];
871e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    this._sources = {};
881e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    this._sourceContentByURL = {};
891e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    this._parseMappingPayload(payload);
901e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
911e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
921e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org/**
931e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * @param {string} sourceMapURL
941e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * @param {string} compiledURL
951e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * @param {function(WebInspector.SourceMap)} callback
961e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org */
971e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgWebInspector.SourceMap.load = function(sourceMapURL, compiledURL, callback)
981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org{
991e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    NetworkAgent.loadResourceForFrontend(WebInspector.resourceTreeModel.mainFrame.id, sourceMapURL, undefined, contentLoaded.bind(this));
1001e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
1021e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {?Protocol.Error} error
1031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {number} statusCode
1041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {NetworkAgent.Headers} headers
1051e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {string} content
1061e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
1071e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    function contentLoaded(error, statusCode, headers, content)
1081e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
1091e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        if (error || !content || statusCode >= 400) {
1101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            console.error("Could not load content for " + sourceMapURL + " : " + (error || ("HTTP status code: " + statusCode)));
1111e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            callback(null);
1121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            return;
1131e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        }
1141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        if (content.slice(0, 3) === ")]}")
1161e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            content = content.substring(content.indexOf('\n'));
1171e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        try {
1181e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var payload = /** @type {SourceMapV3} */ (JSON.parse(content));
1191e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var baseURL = sourceMapURL.startsWith("data:") ? compiledURL : sourceMapURL;
1201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            callback(new WebInspector.SourceMap(baseURL, payload));
1211e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        } catch(e) {
1221e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            console.error(e.message);
1231e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            callback(null);
1241e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        }
1251e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    }
1261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
1271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1281e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgWebInspector.SourceMap.prototype = {
1291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
1301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @return {Array.<string>}
1311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
1321e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    sources: function()
1331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
1341e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        return Object.keys(this._sources);
1351e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    },
1361e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
1381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {string} sourceURL
1391e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @return {string|undefined}
1401e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
1411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    sourceContent: function(sourceURL)
1421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
1431e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        return this._sourceContentByURL[sourceURL];
1441e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    },
1451e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1461e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
1471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {string} sourceURL
1481e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {WebInspector.ResourceType} contentType
1491e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @return {WebInspector.ContentProvider}
1501e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
1511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    sourceContentProvider: function(sourceURL, contentType)
1521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
1531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var lastIndexOfDot = sourceURL.lastIndexOf(".");
1541e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var extension = lastIndexOfDot !== -1 ? sourceURL.substr(lastIndexOfDot + 1) : "";
1551e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var mimeType = WebInspector.ResourceType.mimeTypesForExtensions[extension.toLowerCase()];
1561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var sourceContent = this.sourceContent(sourceURL);
1571e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        if (sourceContent)
1581e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            return new WebInspector.StaticContentProvider(contentType, sourceContent, mimeType);
1591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        return new WebInspector.CompilerSourceMappingContentProvider(sourceURL, contentType, mimeType);
1601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    },
1611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
1631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {SourceMapV3} mappingPayload
1641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
1651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    _parseMappingPayload: function(mappingPayload)
1661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
1671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        if (mappingPayload.sections)
1681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            this._parseSections(mappingPayload.sections);
1691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        else
1701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            this._parseMap(mappingPayload, 0, 0);
1711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    },
1721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1731e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
1741e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {Array.<SourceMapV3.Section>} sections
1751e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
1761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    _parseSections: function(sections)
1771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
1781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        for (var i = 0; i < sections.length; ++i) {
1791e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var section = sections[i];
1801e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            this._parseMap(section.map, section.offset.line, section.offset.column);
1811e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        }
1821e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    },
1831e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
1841e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
1851e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {number} lineNumber in compiled resource
1861e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {number} columnNumber in compiled resource
1871e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @return {?Array}
1881e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
1891e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    findEntry: function(lineNumber, columnNumber)
1901e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
1911e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var first = 0;
1921e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var count = this._mappings.length;
1931e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        while (count > 1) {
1941e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org          var step = count >> 1;
1951e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org          var middle = first + step;
1961e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org          var mapping = this._mappings[middle];
1971e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org          if (lineNumber < mapping[0] || (lineNumber === mapping[0] && columnNumber < mapping[1]))
1981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org              count = step;
1991e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org          else {
2001e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org              first = middle;
2011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org              count -= step;
2021e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org          }
2031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        }
2041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var entry = this._mappings[first];
2051e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        if (!first && entry && (lineNumber < entry[0] || (lineNumber === entry[0] && columnNumber < entry[1])))
2061e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            return null;
2071e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        return entry;
2081e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    },
2091e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
2111e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {string} sourceURL of the originating resource
2121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {number} lineNumber in the originating resource
2131e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @return {Array}
2141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
2151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    findEntryReversed: function(sourceURL, lineNumber)
2161e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
2171e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var mappings = this._reverseMappingsBySourceURL[sourceURL];
2181e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        for ( ; lineNumber < mappings.length; ++lineNumber) {
2191e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var mapping = mappings[lineNumber];
2201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            if (mapping)
2211e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                return mapping;
2221e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        }
2231e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        return this._mappings[0];
2241e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    },
2251e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
2271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @override
2281e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
2291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    _parseMap: function(map, lineNumber, columnNumber)
2301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
2311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var sourceIndex = 0;
2321e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var sourceLineNumber = 0;
2331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var sourceColumnNumber = 0;
2341e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var nameIndex = 0;
2351e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2361e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var sources = [];
2371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var originalToCanonicalURLMap = {};
2381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        for (var i = 0; i < map.sources.length; ++i) {
2391e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var originalSourceURL = map.sources[i];
2401e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var sourceRoot = map.sourceRoot || "";
2411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            if (sourceRoot && !sourceRoot.endsWith("/"))
2421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                sourceRoot += "/";
2431e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var href = sourceRoot + originalSourceURL;
2441e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var url = WebInspector.ParsedURL.completeURL(this._sourceMappingURL, href) || href;
2451e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            originalToCanonicalURLMap[originalSourceURL] = url;
2461e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            sources.push(url);
2471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            this._sources[url] = true;
2481e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2491e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            if (map.sourcesContent && map.sourcesContent[i])
2501e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                this._sourceContentByURL[url] = map.sourcesContent[i];
2511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        }
2521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var stringCharIterator = new WebInspector.SourceMap.StringCharIterator(map.mappings);
2541e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var sourceURL = sources[sourceIndex];
2551e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        while (true) {
2571e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            if (stringCharIterator.peek() === ",")
2581e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                stringCharIterator.next();
2591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            else {
2601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                while (stringCharIterator.peek() === ";") {
2611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                    lineNumber += 1;
2621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                    columnNumber = 0;
2631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                    stringCharIterator.next();
2641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                }
2651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                if (!stringCharIterator.hasNext())
2661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                    break;
2671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            }
2681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            columnNumber += this._decodeVLQ(stringCharIterator);
2701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            if (this._isSeparator(stringCharIterator.peek())) {
2711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                this._mappings.push([lineNumber, columnNumber]);
2721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                continue;
2731e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            }
2741e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2751e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var sourceIndexDelta = this._decodeVLQ(stringCharIterator);
2761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            if (sourceIndexDelta) {
2771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                sourceIndex += sourceIndexDelta;
2781e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                sourceURL = sources[sourceIndex];
2791e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            }
2801e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            sourceLineNumber += this._decodeVLQ(stringCharIterator);
2811e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            sourceColumnNumber += this._decodeVLQ(stringCharIterator);
2821e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            if (!this._isSeparator(stringCharIterator.peek()))
2831e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                nameIndex += this._decodeVLQ(stringCharIterator);
2841e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2851e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            this._mappings.push([lineNumber, columnNumber, sourceURL, sourceLineNumber, sourceColumnNumber]);
2861e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        }
2871e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2881e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        for (var i = 0; i < this._mappings.length; ++i) {
2891e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var mapping = this._mappings[i];
2901e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var url = mapping[2];
2911e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            if (!url)
2921e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                continue;
2931e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            if (!this._reverseMappingsBySourceURL[url])
2941e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                this._reverseMappingsBySourceURL[url] = [];
2951e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var reverseMappings = this._reverseMappingsBySourceURL[url];
2961e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var sourceLine = mapping[3];
2971e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            if (!reverseMappings[sourceLine])
2981e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                reverseMappings[sourceLine] = [mapping[0], mapping[1]];
2991e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        }
3001e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    },
3011e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
3021e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
3031e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {string} char
3041e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @return {boolean}
3051e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
3061e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    _isSeparator: function(char)
3071e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
3081e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        return char === "," || char === ";";
3091e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    },
3101e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
3111e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
3121e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @param {WebInspector.SourceMap.StringCharIterator} stringCharIterator
3131e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @return {number}
3141e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
3151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    _decodeVLQ: function(stringCharIterator)
3161e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
3171e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        // Read unsigned value.
3181e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var result = 0;
3191e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var shift = 0;
3201e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        do {
3211e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            var digit = this._base64Map[stringCharIterator.next()];
3221e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            result += (digit & this._VLQ_BASE_MASK) << shift;
3231e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org            shift += this._VLQ_BASE_SHIFT;
3241e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        } while (digit & this._VLQ_CONTINUATION_MASK);
3251e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
3261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        // Fix the sign.
3271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        var negative = result & 1;
3281e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        result >>= 1;
3291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        return negative ? -result : result;
3301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    },
3311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
3321e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    _VLQ_BASE_SHIFT: 5,
3331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    _VLQ_BASE_MASK: (1 << 5) - 1,
3341e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    _VLQ_CONTINUATION_MASK: 1 << 5
3351e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
3361e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
3371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org/**
3381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * @constructor
3391e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * @param {string} string
3401e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org */
3411e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgWebInspector.SourceMap.StringCharIterator = function(string)
3421e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org{
3431e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    this._string = string;
3441e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    this._position = 0;
3451e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
3461e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
3471e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgWebInspector.SourceMap.StringCharIterator.prototype = {
3481e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
3491e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @return {string}
3501e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
3511e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    next: function()
3521e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
3531e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        return this._string.charAt(this._position++);
3541e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    },
3551e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
3561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
3571e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @return {string}
3581e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
3591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    peek: function()
3601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
3611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        return this._string.charAt(this._position);
3621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    },
3631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
3641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    /**
3651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     * @return {boolean}
3661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org     */
3671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    hasNext: function()
3681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    {
3691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org        return this._position < this._string.length;
3701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    }
3711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
372