Changeset 95289 in webkit


Ignore:
Timestamp:
Sep 16, 2011 6:30:21 AM (13 years ago)
Author:
caseq@chromium.org
Message:

2011-09-16 Andrey Kosyakov <caseq@chromium.org>

Web Inspector: [Extensions API] support extensions for remote inspector front-end
https://bugs.webkit.org/show_bug.cgi?id=67840

Reviewed by Pavel Feldman.

  • Merge ExtensionCommon.js into ExtensionAPI.js
  • refactor building of extension API for better reuse
  • expose interface for extension registration
  • WebCore.gypi:
  • WebCore.vcproj/WebCore.vcproj:
  • inspector/front-end/ExtensionAPI.js: (defineCommonExtensionSymbols): (buildExtensionAPIInjectedScript):
  • inspector/front-end/ExtensionCommon.js:
  • inspector/front-end/ExtensionServer.js: (WebInspector.ExtensionServer.prototype._addExtensions): (WebInspector.ExtensionServer.prototype._addExtension): (WebInspector.ExtensionServer.prototype._buildExtensionAPIScript): (WebInspector.ExtensionServer.prototype._onWindowMessage): (WebInspector.ExtensionServer.prototype._registerExtension): (WebInspector.ExtensionServer.prototype._expandResourcePath):
  • inspector/front-end/WebKit.qrc:
  • inspector/front-end/inspector.html:

2011-09-16 Andrey Kosyakov <caseq@chromium.org>

Web Inspector: [Extensions API] support extensions for remote inspector front-end
https://bugs.webkit.org/show_bug.cgi?id=67840

Reviewed by Pavel Feldman.

  • expose extension API as a single, standalone file for easy reuse in remote extension scripts.
  • WebKit.gyp:
  • scripts/generate_devtools_extension_api.py: Added.
  • scripts/generate_devtools_zip.py:
Location:
trunk/Source
Files:
1 added
1 deleted
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r95287 r95289  
     12011-09-16  Andrey Kosyakov  <caseq@chromium.org>
     2
     3        Web Inspector: [Extensions API] support extensions for remote inspector front-end
     4        https://bugs.webkit.org/show_bug.cgi?id=67840
     5
     6        Reviewed by Pavel Feldman.
     7
     8        - Merge ExtensionCommon.js into ExtensionAPI.js
     9        - refactor building of extension API for better reuse
     10        - expose interface for extension registration
     11
     12        * WebCore.gypi:
     13        * WebCore.vcproj/WebCore.vcproj:
     14        * inspector/front-end/ExtensionAPI.js:
     15        (defineCommonExtensionSymbols):
     16        (buildExtensionAPIInjectedScript):
     17        * inspector/front-end/ExtensionCommon.js:
     18        * inspector/front-end/ExtensionServer.js:
     19        (WebInspector.ExtensionServer.prototype._addExtensions):
     20        (WebInspector.ExtensionServer.prototype._addExtension):
     21        (WebInspector.ExtensionServer.prototype._buildExtensionAPIScript):
     22        (WebInspector.ExtensionServer.prototype._onWindowMessage):
     23        (WebInspector.ExtensionServer.prototype._registerExtension):
     24        (WebInspector.ExtensionServer.prototype._expandResourcePath):
     25        * inspector/front-end/WebKit.qrc:
     26        * inspector/front-end/inspector.html:
     27
    1282011-09-16  Ilya Tikhonovsky  <loislo@chromium.org>
    229
  • trunk/Source/WebCore/WebCore.gypi

    r95245 r95289  
    63506350            'inspector/front-end/EmptyView.js',
    63516351            'inspector/front-end/EventListenersSidebarPane.js',
    6352             'inspector/front-end/ExtensionAPI.js',
    63536352            'inspector/front-end/ExtensionAuditCategory.js',
    6354             'inspector/front-end/ExtensionCommon.js',
    63556353            'inspector/front-end/ExtensionPanel.js',
    63566354            'inspector/front-end/ExtensionRegistryStub.js',
     
    64566454            'inspector/front-end/textViewer.css',
    64576455            '<@(webinspector_standalone_css_files)',
     6456            '<@(webinspector_extension_api_files)',
    64586457        ],
    64596458        'webinspector_standalone_css_files': [
     
    64616460            'inspector/front-end/inspectorCommon.css',
    64626461            'inspector/front-end/networkLogView.css',
     6462        ],
     6463        'webinspector_extension_api_files': [
     6464            'inspector/front-end/ExtensionAPI.js',
    64636465        ],
    64646466        'webinspector_uglifyjs_files': [
  • trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj

    r95248 r95289  
    6893468934                                </File>
    6893568935                                <File
    68936                                         RelativePath="..\inspector\front-end\ExtensionCommon.js"
    68937                                         >
    68938                                 </File>
    68939                                 <File
    6894068936                                        RelativePath="..\inspector\front-end\ExtensionPanel.js"
    6894168937                                        >
  • trunk/Source/WebCore/inspector/front-end/ExtensionAPI.js

    r94666 r95289  
    2929 */
    3030
    31 WebInspector.injectedExtensionAPI = function(InjectedScriptHost, inspectedWindow, injectedScriptId)
    32 {
     31function defineCommonExtensionSymbols(apiPrivate)
     32{
     33    if (!apiPrivate.audits)
     34        apiPrivate.audits = {};
     35
     36    apiPrivate.audits.Severity = {
     37        Info: "info",
     38        Warning: "warning",
     39        Severe: "severe"
     40    };
     41
     42    if (!apiPrivate.console)
     43        apiPrivate.console = {};
     44    apiPrivate.console.Severity = {
     45        Tip: "tip",
     46        Debug: "debug",
     47        Log: "log",
     48        Warning: "warning",
     49        Error: "error"
     50    };
     51}
     52
     53function injectedExtensionAPI(injectedScriptId)
     54{
     55
     56var apiPrivate = {};
     57
     58defineCommonExtensionSymbols(apiPrivate);
    3359
    3460// Here and below, all constructors are private to API implementation.
     
    590616
    591617}
     618
     619function buildExtensionAPIInjectedScript(platformAPI)
     620{
     621    return "(function(injectedScriptHost, inspectedWindow, injectedScriptId){ " +
     622        defineCommonExtensionSymbols.toString() + ";" +
     623        injectedExtensionAPI.toString() + ";" +
     624        "injectedExtensionAPI(injectedScriptId);" +
     625        (platformAPI || "") +
     626        "})";
     627}
  • trunk/Source/WebCore/inspector/front-end/ExtensionServer.js

    r94666 r95289  
    526526    _addExtensions: function(extensions)
    527527    {
     528        // See ExtensionAPI.js and ExtensionCommon.js for details.
     529        InspectorFrontendHost.setExtensionAPI(this._buildExtensionAPIScript());
     530        for (var i = 0; i < extensions.length; ++i)
     531            this._addExtension(extensions[i].startPage);
     532    },
     533
     534    _addExtension: function(startPage)
     535    {
    528536        const urlOriginRegExp = new RegExp("([^:]+:\/\/[^/]*)\/"); // Can't use regexp literal here, MinJS chokes on it.
    529537
    530         // See ExtensionAPI.js and ExtensionCommon.js for details.
    531         InspectorFrontendHost.setExtensionAPI(this._buildExtensionAPIInjectedScript());
    532         for (var i = 0; i < extensions.length; ++i) {
    533             var extension = extensions[i];
    534             try {
    535                 if (!extension.startPage)
    536                     return;
    537                 var originMatch = urlOriginRegExp.exec(extension.startPage);
    538                 if (!originMatch) {
    539                     console.error("Skipping extension with invalid URL: " + extension.startPage);
    540                     continue;
    541                 }
    542                 this._allowedOrigins[originMatch[1]] = true;
    543                 var iframe = document.createElement("iframe");
    544                 iframe.src = extension.startPage;
    545                 iframe.style.display = "none";
    546                 document.body.appendChild(iframe);
    547             } catch (e) {
    548                 console.error("Failed to initialize extension " + extension.startPage + ":" + e);
     538        try {
     539            var originMatch = urlOriginRegExp.exec(startPage);
     540            if (!originMatch) {
     541                console.error("Skipping extension with invalid URL: " + startPage);
     542                return false;
    549543            }
    550         }
    551     },
    552 
    553     _buildExtensionAPIInjectedScript: function()
    554     {
    555         var resourceTypes = {};
    556         var resourceTypeProperties = Object.getOwnPropertyNames(WebInspector.Resource.Type);
    557         for (var i = 0; i < resourceTypeProperties.length; ++i) {
    558              var propName = resourceTypeProperties[i];
    559              var propValue = WebInspector.Resource.Type[propName];
    560              if (typeof propValue === "number")
    561                  resourceTypes[propName] = WebInspector.Resource.Type.toString(propValue);
    562         }
     544            this._allowedOrigins[originMatch[1]] = true;
     545            var iframe = document.createElement("iframe");
     546            iframe.src = startPage;
     547            iframe.style.display = "none";
     548            document.body.appendChild(iframe);
     549        } catch (e) {
     550            console.error("Failed to initialize extension " + startPage + ":" + e);
     551            return false;
     552        }
     553        return true;
     554    },
     555
     556    _buildExtensionAPIScript: function()
     557    {
    563558        var platformAPI = WebInspector.buildPlatformExtensionAPI ? WebInspector.buildPlatformExtensionAPI() : "";
    564         return "(function(){ " +
    565             "var apiPrivate = {};" +
    566             "(" + WebInspector.commonExtensionSymbols.toString() + ")(apiPrivate);" +
    567             "(" + WebInspector.injectedExtensionAPI.toString() + ").apply(this, arguments);" +
    568             platformAPI +
    569             "})";
     559        return buildExtensionAPIInjectedScript(platformAPI);
    570560    },
    571561
    572562    _onWindowMessage: function(event)
    573563    {
    574         if (event.data !== "registerExtension")
     564        if (event.data === "registerExtension")
     565            this._registerExtension(event.origin, event.ports[0]);
     566    },
     567
     568    _registerExtension: function(origin, port)
     569    {
     570        if (!this._allowedOrigins.hasOwnProperty(origin)) {
     571            if (origin !== location.origin) // Just ignore inspector frames.
     572                console.error("Ignoring unauthorized client request from " + origin);
    575573            return;
    576         if (!this._allowedOrigins.hasOwnProperty(event.origin)) {
    577             if (event.origin !== location.origin) // Just ignore inspector frames.
    578                 console.error("Ignoring unauthorized client request from " + event.origin);
    579             return;
    580         }
    581         var port = event.ports[0];
    582         port._extensionOrigin = event.origin;
     574        }
     575        port._extensionOrigin = origin;
    583576        port.addEventListener("message", this._onmessage.bind(this), false);
    584577        port.start();
     
    621614        if (!resourcePath)
    622615            return;
    623         return extensionPath + escape(this._normalizePath(resourcePath));
     616        return extensionPath + this._normalizePath(resourcePath);
    624617    },
    625618
     
    678671
    679672WebInspector.extensionServer = new WebInspector.ExtensionServer();
     673
     674WebInspector.extensionAPI = {};
     675defineCommonExtensionSymbols(WebInspector.extensionAPI);
     676
     677window.addExtension = WebInspector.extensionServer._addExtension.bind(WebInspector.extensionServer);
  • trunk/Source/WebCore/inspector/front-end/WebKit.qrc

    r94855 r95289  
    4949    <file>ExtensionAPI.js</file>
    5050    <file>ExtensionAuditCategory.js</file>
    51     <file>ExtensionCommon.js</file>
    5251    <file>ExtensionPanel.js</file>
    5352    <file>ExtensionRegistryStub.js</file>
  • trunk/Source/WebCore/inspector/front-end/inspector.html

    r94855 r95289  
    118118    <script type="text/javascript" src="ExtensionAPI.js"></script>
    119119    <script type="text/javascript" src="ExtensionAuditCategory.js"></script>
    120     <script type="text/javascript" src="ExtensionCommon.js"></script>
    121120    <script type="text/javascript" src="ExtensionServer.js"></script>
    122121    <script type="text/javascript" src="ExtensionPanel.js"></script>
  • trunk/Source/WebKit/chromium/ChangeLog

    r95287 r95289  
     12011-09-16  Andrey Kosyakov  <caseq@chromium.org>
     2
     3        Web Inspector: [Extensions API] support extensions for remote inspector front-end
     4        https://bugs.webkit.org/show_bug.cgi?id=67840
     5
     6        Reviewed by Pavel Feldman.
     7
     8        - expose extension API as a single, standalone file for easy reuse in remote extension scripts.
     9
     10        * WebKit.gyp:
     11        * scripts/generate_devtools_extension_api.py: Added.
     12        * scripts/generate_devtools_zip.py:
     13
    1142011-09-16  Ilya Tikhonovsky  <loislo@chromium.org>
    215
  • trunk/Source/WebKit/chromium/WebKit.gyp

    r95255 r95289  
    824824        },
    825825        {
     826            'target_name': 'devtools_extension_api',
     827            'type': 'none',
     828            'actions': [{
     829                'action_name': 'devtools_html',
     830                'script_name': 'scripts/generate_devtools_extension_api.py',
     831                'inputs': [
     832                    '<@(_script_name)',
     833                    '<@(webinspector_extension_api_files)',
     834                ],
     835                'outputs': ['<(PRODUCT_DIR)/resources/inspector/devtools_extension_api.js'],
     836                'action': ['python', '<@(_script_name)', '<@(_outputs)', '<@(webinspector_extension_api_files)'],
     837            }],
     838        },
     839        {
    826840            'target_name': 'generate_devtools_grd',
    827841            'type': 'none',
    828842            'dependencies': [
    829843                'devtools_html',
     844                'devtools_extension_api'
    830845            ],
    831846            'conditions': [
     
    851866                    '<(PRODUCT_DIR)/resources/inspector/ScriptFormatterWorker.js',
    852867                    '<(PRODUCT_DIR)/resources/inspector/devTools.css',
     868                    '<(PRODUCT_DIR)/resources/inspector/devtools_extension_api.js',
    853869                    '<@(webinspector_standalone_css_files)',
    854870                ],
     
    889905                    '<@(_script_name)',
    890906                    'scripts/generate_devtools_html.py',
     907                    'scripts/generate_devtools_extension_api.py',
    891908                    '<@(_inspector_html)',
    892909                    '<@(devtools_files)',
     
    896913                    '<@(webinspector_image_files)',
    897914                    '<@(devtools_image_files)',
     915                    '<@(webinspector_extension_api_files)',
    898916                ],
    899917                'search_path': [
     
    910928                                     '--devtools-files', '<@(devtools_files)',
    911929                                     '--workers-files', '<@(_workers_files)',
     930                                     '--extension-api-files', '<@(webinspector_extension_api_files)',
    912931                                     '--search-path', '<@(_search_path)',
    913932                                     '--image-search-path', '<@(_image_search_path)',
  • trunk/Source/WebKit/chromium/scripts/generate_devtools_zip.py

    r87786 r95289  
    4545import concatenate_js_files
    4646import generate_devtools_html
     47import generate_devtools_extension_api
    4748
    4849
    4950class ParsedArgs:
    50     def __init__(self, inspector_html, devtools_files, workers_files,
     51    def __init__(self, inspector_html, devtools_files, workers_files, extension_api_files,
    5152                 search_dirs, image_search_dirs, output_filename):
    5253        self.inspector_html = inspector_html
    5354        self.devtools_files = devtools_files
    5455        self.workers_files = workers_files
     56        self.extension_api_files = extension_api_files
    5557        self.search_dirs = search_dirs
    5658        self.image_search_dirs = image_search_dirs
     
    6365    devtools_files_position = argv.index('--devtools-files')
    6466    workers_files_position = argv.index('--workers-files')
     67    extension_api_files_position = argv.index('--extension-api-files')
    6568    search_path_position = argv.index('--search-path')
    6669    image_search_path_position = argv.index('--image-search-path')
     
    6871
    6972    devtools_files = argv[devtools_files_position + 1:workers_files_position]
    70     workers_files = argv[workers_files_position + 1:search_path_position]
     73    workers_files = argv[workers_files_position + 1:extension_api_files_position]
     74    extension_api_files = argv[extension_api_files_position + 1:search_path_position]
    7175    search_dirs = argv[search_path_position + 1:image_search_path_position]
    7276    image_search_dirs = argv[image_search_path_position + 1:output_position]
    7377
    74     return ParsedArgs(inspector_html, devtools_files, workers_files,
     78    return ParsedArgs(inspector_html, devtools_files, workers_files, extension_api_files,
    7579                      search_dirs, image_search_dirs, argv[output_position + 1])
    7680
     
    8690    zip = zipfile.ZipFile(parsed_args.output_filename, 'w', zipfile.ZIP_DEFLATED)
    8791    zip.writestr("devtools.html", devtools_html.getvalue())
     92
     93    devtools_extension_api = StringIO.StringIO()
     94    generate_devtools_extension_api.write_devtools_extension_api(
     95        devtools_extension_api, parsed_args.extension_api_files)
     96    zip.writestr("devtools_extension_api.js", devtools_extension_api.getvalue())
    8897
    8998    css_extractor = concatenate_css_files.OrderedCSSFilesExtractor(
Note: See TracChangeset for help on using the changeset viewer.