Changeset 55522 in webkit


Ignore:
Timestamp:
Mar 4, 2010 6:00:40 AM (14 years ago)
Author:
pfeldman@chromium.org
Message:

2010-03-04 Andrey Kosyakov <caseq@chromium.org>

Reviewed by Pavel Feldman.

Added support for worker instrumentation in inspector
(display list of active workers, allow debugging of workers
by injecting fake JS implementation)

https://bugs.webkit.org/show_bug.cgi?id=35568

  • English.lproj/localizedStrings.js:
  • WebCore.gypi:
  • WebCore.vcproj/WebCore.vcproj:
  • bindings/js/JSInjectedScriptHostCustom.cpp: (WebCore::InjectedScriptHost::createInjectedScript): (WebCore::InjectedScriptHost::injectedScriptFor):
  • bindings/v8/custom/V8InjectedScriptHostCustom.cpp: (WebCore::InjectedScriptHost::createInjectedScript): (WebCore::InjectedScriptHost::injectedScriptFor):
  • dom/Document.cpp: (WebCore::Document::inspectorController):
  • dom/Document.h:
  • dom/ScriptExecutionContext.h: (WebCore::ScriptExecutionContext::inspectorController):
  • inspector/InjectedScriptHost.cpp: (WebCore::InjectedScriptHost::InjectedScriptHost): (WebCore::InjectedScriptHost::injectScript): (WebCore::InjectedScriptHost::nextWorkerId): (WebCore::InjectedScriptHost::didCreateWorker): (WebCore::InjectedScriptHost::willDestroyWorker):
  • inspector/InjectedScriptHost.h:
  • inspector/InjectedScriptHost.idl:
  • inspector/InspectorController.cpp: (WebCore::InspectorController::populateScriptObjects): (WebCore::InspectorController::resetScriptObjects): (WebCore::InspectorController::didCommitLoad): (WebCore::InspectorController::didCreateWorker): (WebCore::InspectorController::willDestroyWorker):
  • inspector/InspectorController.h:
  • inspector/InspectorFrontend.cpp: (WebCore::InspectorFrontend::didCreateWorker): (WebCore::InspectorFrontend::willDestroyWorker):
  • inspector/InspectorFrontend.h:
  • inspector/InspectorWorkerResource.h: Added. (WebCore::InspectorWorkerResource::create): (WebCore::InspectorWorkerResource::id): (WebCore::InspectorWorkerResource::url): (WebCore::InspectorWorkerResource::isSharedWorker): (WebCore::InspectorWorkerResource::InspectorWorkerResource):
  • inspector/front-end/Checkbox.js: Added. (WebInspector.Checkbox.callbackWrapper): (WebInspector.Checkbox): (WebInspector.Checkbox.prototype.checked):
  • inspector/front-end/InjectedFakeWorker.js: (InjectedFakeWorker.FakeWorker): (InjectedFakeWorker.FakeWorker.prototype.terminate): (InjectedFakeWorker.FakeWorker.prototype._handleException): (InjectedFakeWorker.FakeWorker.prototype._importScripts): (InjectedFakeWorker.FakeWorker.prototype._loadScript): (InjectedFakeWorker.FakeWorker.prototype._expandURLAndCheckOrigin):
  • inspector/front-end/ScriptsPanel.js: (WebInspector.ScriptsPanel): (WebInspector.ScriptsPanel.prototype.debuggerWasEnabled): (WebInspector.ScriptsPanel.prototype.debuggerWasDisabled): (WebInspector.ScriptsPanel.prototype.reset):
  • inspector/front-end/WebKit.qrc:
  • inspector/front-end/WorkersSidebarPane.js: Added. (WebInspector.WorkersSidebarPane): (WebInspector.WorkersSidebarPane.prototype.addWorker): (WebInspector.WorkersSidebarPane.prototype.removeWorker): (WebInspector.WorkersSidebarPane.prototype.setInstrumentation): (WebInspector.WorkersSidebarPane.prototype.reset): (WebInspector.WorkersSidebarPane.prototype._onTriggerInstrument): (WebInspector.Worker): (WebInspector.didCreateWorker): (WebInspector.willDestroyWorker):
  • inspector/front-end/inspector.css:
  • inspector/front-end/inspector.html:
  • workers/AbstractWorker.cpp: (WebCore::AbstractWorker::AbstractWorker): (WebCore::AbstractWorker::~AbstractWorker): (WebCore::AbstractWorker::onDestroyWorker): (WebCore::AbstractWorker::contextDestroyed):
  • workers/AbstractWorker.h: (WebCore::AbstractWorker::id):
  • workers/SharedWorker.cpp: (WebCore::SharedWorker::SharedWorker):
  • workers/Worker.cpp: (WebCore::Worker::Worker):
Location:
trunk
Files:
1 added
27 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r55520 r55522  
     12010-03-04  Andrey Kosyakov  <caseq@chromium.org>
     2
     3        Reviewed by Pavel Feldman.
     4
     5        Added support for worker instrumentation in inspector
     6        (display list of active workers, allow debugging of workers
     7        by injecting fake JS implementation)
     8
     9        https://bugs.webkit.org/show_bug.cgi?id=35568
     10
     11        * English.lproj/localizedStrings.js:
     12        * WebCore.gypi:
     13        * WebCore.vcproj/WebCore.vcproj:
     14        * bindings/js/JSInjectedScriptHostCustom.cpp:
     15        (WebCore::InjectedScriptHost::createInjectedScript):
     16        (WebCore::InjectedScriptHost::injectedScriptFor):
     17        * bindings/v8/custom/V8InjectedScriptHostCustom.cpp:
     18        (WebCore::InjectedScriptHost::createInjectedScript):
     19        (WebCore::InjectedScriptHost::injectedScriptFor):
     20        * dom/Document.cpp:
     21        (WebCore::Document::inspectorController):
     22        * dom/Document.h:
     23        * dom/ScriptExecutionContext.h:
     24        (WebCore::ScriptExecutionContext::inspectorController):
     25        * inspector/InjectedScriptHost.cpp:
     26        (WebCore::InjectedScriptHost::InjectedScriptHost):
     27        (WebCore::InjectedScriptHost::injectScript):
     28        (WebCore::InjectedScriptHost::nextWorkerId):
     29        (WebCore::InjectedScriptHost::didCreateWorker):
     30        (WebCore::InjectedScriptHost::willDestroyWorker):
     31        * inspector/InjectedScriptHost.h:
     32        * inspector/InjectedScriptHost.idl:
     33        * inspector/InspectorController.cpp:
     34        (WebCore::InspectorController::populateScriptObjects):
     35        (WebCore::InspectorController::resetScriptObjects):
     36        (WebCore::InspectorController::didCommitLoad):
     37        (WebCore::InspectorController::didCreateWorker):
     38        (WebCore::InspectorController::willDestroyWorker):
     39        * inspector/InspectorController.h:
     40        * inspector/InspectorFrontend.cpp:
     41        (WebCore::InspectorFrontend::didCreateWorker):
     42        (WebCore::InspectorFrontend::willDestroyWorker):
     43        * inspector/InspectorFrontend.h:
     44        * inspector/InspectorWorkerResource.h: Added.
     45        (WebCore::InspectorWorkerResource::create):
     46        (WebCore::InspectorWorkerResource::id):
     47        (WebCore::InspectorWorkerResource::url):
     48        (WebCore::InspectorWorkerResource::isSharedWorker):
     49        (WebCore::InspectorWorkerResource::InspectorWorkerResource):
     50        * inspector/front-end/Checkbox.js: Added.
     51        (WebInspector.Checkbox.callbackWrapper):
     52        (WebInspector.Checkbox):
     53        (WebInspector.Checkbox.prototype.checked):
     54        * inspector/front-end/InjectedFakeWorker.js:
     55        (InjectedFakeWorker.FakeWorker):
     56        (InjectedFakeWorker.FakeWorker.prototype.terminate):
     57        (InjectedFakeWorker.FakeWorker.prototype._handleException):
     58        (InjectedFakeWorker.FakeWorker.prototype._importScripts):
     59        (InjectedFakeWorker.FakeWorker.prototype._loadScript):
     60        (InjectedFakeWorker.FakeWorker.prototype._expandURLAndCheckOrigin):
     61        * inspector/front-end/ScriptsPanel.js:
     62        (WebInspector.ScriptsPanel):
     63        (WebInspector.ScriptsPanel.prototype.debuggerWasEnabled):
     64        (WebInspector.ScriptsPanel.prototype.debuggerWasDisabled):
     65        (WebInspector.ScriptsPanel.prototype.reset):
     66        * inspector/front-end/WebKit.qrc:
     67        * inspector/front-end/WorkersSidebarPane.js: Added.
     68        (WebInspector.WorkersSidebarPane):
     69        (WebInspector.WorkersSidebarPane.prototype.addWorker):
     70        (WebInspector.WorkersSidebarPane.prototype.removeWorker):
     71        (WebInspector.WorkersSidebarPane.prototype.setInstrumentation):
     72        (WebInspector.WorkersSidebarPane.prototype.reset):
     73        (WebInspector.WorkersSidebarPane.prototype._onTriggerInstrument):
     74        (WebInspector.Worker):
     75        (WebInspector.didCreateWorker):
     76        (WebInspector.willDestroyWorker):
     77        * inspector/front-end/inspector.css:
     78        * inspector/front-end/inspector.html:
     79        * workers/AbstractWorker.cpp:
     80        (WebCore::AbstractWorker::AbstractWorker):
     81        (WebCore::AbstractWorker::~AbstractWorker):
     82        (WebCore::AbstractWorker::onDestroyWorker):
     83        (WebCore::AbstractWorker::contextDestroyed):
     84        * workers/AbstractWorker.h:
     85        (WebCore::AbstractWorker::id):
     86        * workers/SharedWorker.cpp:
     87        (WebCore::SharedWorker::SharedWorker):
     88        * workers/Worker.cpp:
     89        (WebCore::Worker::Worker):
     90
    1912010-03-04  Jocelyn Turcotte  <jocelyn.turcotte@nokia.com>
    292
  • trunk/WebCore/WebCore.gypi

    r55505 r55522  
    16151615            'inspector/InspectorTimelineAgent.cpp',
    16161616            'inspector/InspectorTimelineAgent.h',
     1617            'inspector/InspectorWorkerResource.h',
    16171618            'inspector/JavaScriptCallFrame.cpp',
    16181619            'inspector/JavaScriptCallFrame.h',
     
    37323733            'inspector/front-end/CallStackSidebarPane.js',
    37333734            'inspector/front-end/ChangesView.js',
     3735            'inspector/front-end/Checkbox.js',
    37343736            'inspector/front-end/Color.js',
    37353737            'inspector/front-end/ConsolePanel.js',
     
    38083810            'inspector/front-end/WatchExpressionsSidebarPane.js',
    38093811            'inspector/front-end/WelcomeView.js',
     3812            'inspector/front-end/WorkersSidebarPane.js',
    38103813            'inspector/front-end/audits.css',
    38113814            'inspector/front-end/inspector.css',
  • trunk/WebCore/WebCore.vcproj/WebCore.vcproj

    r55505 r55522  
    4271842718                        </File>
    4271942719                        <File
     42720                                RelativePath="..\inspector\InspectorWorkerResource.h"
     42721                                >
     42722                        </File>
     42723                        <File
    4272042724                                RelativePath="..\inspector\JavaScriptCallFrame.cpp"
    4272142725                                >
     
    4279742801                                </File>
    4279842802                                <File
     42803                                        RelativePath="..\inspector\front-end\Checkbox.js"
     42804                                        >
     42805                                </File>
     42806                                <File
    4279942807                                        RelativePath="..\inspector\front-end\Color.js"
    4280042808                                        >
     
    4310243110                                <File
    4310343111                                        RelativePath="..\inspector\front-end\WelcomeView.js"
     43112                                        >
     43113                                </File>
     43114                                <File
     43115                                        RelativePath="..\inspector\front-end\WorkersSidebarPane.js"
    4310443116                                        >
    4310543117                                </File>
  • trunk/WebCore/bindings/js/JSInjectedScriptHostCustom.cpp

    r55071 r55522  
    22 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
    33 * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
    4  * Copyright (C) 2009 Google Inc. All rights reserved.
     4 * Copyright (C) 2010 Google Inc. All rights reserved.
    55 *
    66 * Redistribution and use in source and binary forms, with or without
     
    7676namespace WebCore {
    7777
    78 static ScriptObject createInjectedScript(const String& source, InjectedScriptHost* injectedScriptHost, ScriptState* scriptState, long id)
     78ScriptObject InjectedScriptHost::createInjectedScript(const String& source, ScriptState* scriptState, long id)
    7979{
    8080    SourceCode sourceCode = makeSource(source);
     
    9292
    9393    MarkedArgumentBuffer args;
    94     args.append(toJS(scriptState, globalObject, injectedScriptHost));
     94    args.append(toJS(scriptState, globalObject, this));
    9595    args.append(globalThisValue);
    9696    args.append(jsNumber(scriptState, id));
     
    222222        return InjectedScript(ScriptObject(scriptState, injectedScript));
    223223
    224     ASSERT(!m_injectedScriptSource.isEmpty());
    225     ScriptObject injectedScriptObject = createInjectedScript(m_injectedScriptSource, this, scriptState, m_nextInjectedScriptId);
    226     globalObject->setInjectedScript(injectedScriptObject.jsObject());
    227     InjectedScript result(injectedScriptObject);
    228     m_idToInjectedScript.set(m_nextInjectedScriptId, result);
    229     m_nextInjectedScriptId++;
     224    ASSERT(!m_injectedScriptSource.isEmpty());
     225    pair<long, ScriptObject> injectedScriptObject = injectScript(m_injectedScriptSource, scriptState);
     226    globalObject->setInjectedScript(injectedScriptObject.second.jsObject());
     227    InjectedScript result(injectedScriptObject.second);
     228    m_idToInjectedScript.set(injectedScriptObject.first, result);
    230229    return result;
    231230}
  • trunk/WebCore/bindings/v8/custom/V8InjectedScriptHostCustom.cpp

    r55071 r55522  
    8080}
    8181
    82 static ScriptObject createInjectedScript(const String& scriptSource, InjectedScriptHost* injectedScriptHost, ScriptState* inspectedScriptState, long id)
     82ScriptObject InjectedScriptHost::createInjectedScript(const String& scriptSource, ScriptState* inspectedScriptState, long id)
    8383{
    8484    v8::HandleScope scope;
     
    9191    // wrapper in the current context.
    9292    // FIXME: make it possible to use generic bindings factory for InjectedScriptHost.
    93     v8::Local<v8::Object> scriptHostWrapper = createInjectedScriptHostV8Wrapper(injectedScriptHost);
     93    v8::Local<v8::Object> scriptHostWrapper = createInjectedScriptHostV8Wrapper(this);
    9494    if (scriptHostWrapper.IsEmpty())
    9595        return ScriptObject();
     
    241241
    242242    ASSERT(!m_injectedScriptSource.isEmpty());
    243     ScriptObject injectedScriptObject = createInjectedScript(m_injectedScriptSource, this, inspectedScriptState, m_nextInjectedScriptId);
    244     InjectedScript result(injectedScriptObject);
    245     m_idToInjectedScript.set(m_nextInjectedScriptId, result);
    246     ++m_nextInjectedScriptId;
    247     global->SetHiddenValue(key, injectedScriptObject.v8Object());
     243    pair<long, ScriptObject> injectedScript = injectScript(m_injectedScriptSource, inspectedScriptState);
     244    InjectedScript result(injectedScript.second);
     245    m_idToInjectedScript.set(injectedScript.first, result);
     246    global->SetHiddenValue(key, injectedScript.second.v8Object());
    248247    return result;
    249248}
  • trunk/WebCore/dom/Document.cpp

    r55485 r55522  
    47994799    return page() ? page()->inspectorTimelineAgent() : 0;
    48004800}
     4801
     4802InspectorController* Document::inspectorController() const
     4803{
     4804    return page() ? page()->inspectorController() : 0;
     4805}
    48014806#endif
    48024807
  • trunk/WebCore/dom/Document.h

    r55461 r55522  
    451451#if ENABLE(INSPECTOR)
    452452    InspectorTimelineAgent* inspectorTimelineAgent() const; // can be NULL
     453    virtual InspectorController* inspectorController() const; // can be NULL
    453454#endif
    454455
  • trunk/WebCore/dom/ScriptExecutionContext.h

    r53595 r55522  
    5050    class ScriptString;
    5151    class String;
     52#if ENABLE(INSPECTOR)
     53    class InspectorController;
     54#endif
    5255
    5356    enum MessageDestination {
     
    8588
    8689        SecurityOrigin* securityOrigin() const { return m_securityOrigin.get(); }
     90#if ENABLE(INSPECTOR)
     91        virtual InspectorController* inspectorController() const { return 0; }
     92#endif
    8793
    8894        virtual void reportException(const String& errorMessage, int lineNumber, const String& sourceURL) = 0;
  • trunk/WebCore/inspector/InjectedScriptHost.cpp

    r55071 r55522  
    22 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
    33 * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
    4  * Copyright (C) 2009 Google Inc. All rights reserved.
     4 * Copyright (C) 2010 Google Inc. All rights reserved.
    55 *
    66 * Redistribution and use in source and binary forms, with or without
     
    7171    : m_inspectorController(inspectorController)
    7272    , m_nextInjectedScriptId(1)
     73    , m_lastWorkerId(1 << 31) // Distinguish ids of fake workers from real ones, to minimize the chances they overlap.
    7374{
    7475}
     
    195196}
    196197
     198pair<long, ScriptObject> InjectedScriptHost::injectScript(const String& source, ScriptState* scriptState)
     199{
     200    long id = m_nextInjectedScriptId++;
     201    return std::make_pair(id, createInjectedScript(source, scriptState, id));
     202}
     203
     204#if ENABLE(WORKERS)
     205long InjectedScriptHost::nextWorkerId()
     206{
     207    return ++m_lastWorkerId;
     208}
     209
     210void InjectedScriptHost::didCreateWorker(long id, const String& url, bool isSharedWorker)
     211{
     212    if (m_inspectorController)
     213        m_inspectorController->didCreateWorker(id, url, isSharedWorker);
     214}
     215
     216void InjectedScriptHost::willDestroyWorker(long id)
     217{
     218    if (m_inspectorController)
     219        m_inspectorController->willDestroyWorker(id);
     220}
     221#endif // ENABLE(WORKERS)
     222
    197223} // namespace WebCore
    198224
  • trunk/WebCore/inspector/InjectedScriptHost.h

    r55071 r55522  
    8181    void selectDOMStorage(Storage* storage);
    8282#endif
     83#if ENABLE(WORKERS)
     84    long nextWorkerId();
     85    void didCreateWorker(long id, const String& url, bool isSharedWorker);
     86    void willDestroyWorker(long id);
     87#endif
    8388    void reportDidDispatchOnInjectedScript(long callId, SerializedScriptValue* result, bool isException);
    8489
     90    pair<long, ScriptObject> injectScript(const String& source, ScriptState*);
    8591    InjectedScript injectedScriptFor(ScriptState*);
    8692    InjectedScript injectedScriptForId(long);
     
    9298    InspectorDOMAgent* inspectorDOMAgent();
    9399    InspectorFrontend* inspectorFrontend();
     100    ScriptObject createInjectedScript(const String& source, ScriptState* scriptState, long id);
    94101
    95102    InspectorController* m_inspectorController;
    96103    String m_injectedScriptSource;
    97104    long m_nextInjectedScriptId;
     105    long m_lastWorkerId;
    98106    typedef HashMap<long, InjectedScript> IdToInjectedScriptMap;
    99107    IdToInjectedScriptMap m_idToInjectedScript;
  • trunk/WebCore/inspector/InjectedScriptHost.idl

    r55071 r55522  
    22 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
    33 * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
    4  * Copyright (C) 2009 Google Inc. All rights reserved.
     4 * Copyright (C) 2010 Google Inc. All rights reserved.
    55 *
    66 * Redistribution and use in source and binary forms, with or without
     
    5656#endif
    5757
     58#if defined(ENABLE_WORKERS) && ENABLE_WORKERS
     59        void didCreateWorker(in long id, in DOMString url, in boolean isFakeWorker);
     60        void willDestroyWorker(in long id);
     61        long nextWorkerId();
     62#endif
    5863        [Custom] void reportDidDispatchOnInjectedScript(in long callId, in DOMObject result, in boolean isException);
    5964    };
  • trunk/WebCore/inspector/InspectorController.cpp

    r55464 r55522  
    6464#include "InspectorFrontendHost.h"
    6565#include "InspectorResource.h"
     66#include "InspectorWorkerResource.h"
    6667#include "InspectorTimelineAgent.h"
    6768#include "Page.h"
     
    690691        it->second->bind(m_frontend.get());
    691692#endif
    692 
     693#if ENABLE(WORKERS)
     694    WorkersMap::iterator workersEnd = m_workers.end();
     695    for (WorkersMap::iterator it = m_workers.begin(); it != workersEnd; ++it)
     696        m_frontend->didCreateWorker(*it->second);
     697#endif
    693698    if (m_profilerEnabled)
    694699        m_frontend->profilerWasEnabled();
     
    721726        it->second->unbind();
    722727#endif
    723 
     728#if ENABLE(WORKERS)
     729    m_workers.clear();
     730#endif
    724731    if (m_timelineAgent)
    725732        m_timelineAgent->reset();
     
    808815            pruneResources(resourceMap, loader);
    809816
     817    ScriptState* scriptState = mainWorldScriptState(loader->frame());
    810818    for (Vector<String>::iterator it = m_scriptsToEvaluateOnLoad.begin();
    811819         it != m_scriptsToEvaluateOnLoad.end(); ++it) {
    812         ScriptSourceCode scriptSourceCode(*it);
    813         loader->frame()->script()->evaluate(scriptSourceCode);
     820        m_injectedScriptHost->injectScript(*it, scriptState);
    814821    }
    815822}
     
    11531160        m_frontend->timelineProfilerWasStopped();
    11541161}
     1162
     1163#if ENABLE(WORKERS)
     1164void InspectorController::didCreateWorker(long id, const String& url, bool isSharedWorker)
     1165{
     1166    if (!enabled())
     1167        return;
     1168
     1169    RefPtr<InspectorWorkerResource> workerResource(InspectorWorkerResource::create(id, url, isSharedWorker));
     1170    m_workers.set(id, workerResource);
     1171    if (m_frontend)
     1172        m_frontend->didCreateWorker(*workerResource);
     1173}
     1174
     1175void InspectorController::willDestroyWorker(long id)
     1176{
     1177    if (!enabled())
     1178        return;
     1179
     1180    WorkersMap::iterator workerResource = m_workers.find(id);
     1181    if (workerResource == m_workers.end())
     1182        return;
     1183    if (m_frontend)
     1184        m_frontend->willDestroyWorker(*workerResource->second);
     1185    m_workers.remove(workerResource);
     1186}
     1187#endif // ENABLE(WORKERS)
    11551188
    11561189#if ENABLE(DATABASE)
  • trunk/WebCore/inspector/InspectorController.h

    r55227 r55522  
    8686class InspectorDOMStorageResource;
    8787class InspectorResource;
     88class InspectorWorkerResource;
    8889
    8990class InspectorController
     
    187188    void mainResourceFiredLoadEvent(DocumentLoader*, const KURL&);
    188189    void mainResourceFiredDOMContentEvent(DocumentLoader*, const KURL&);
    189    
     190
    190191    void didInsertDOMNode(Node*);
    191192    void didRemoveDOMNode(Node*);
    192193    void didModifyDOMAttr(Element*);
    193                                                        
     194#if ENABLE(WORKERS)
     195    void didCreateWorker(long id, const String& url, bool isSharedWorker);
     196    void willDestroyWorker(long id);
     197#endif
    194198    void getCookies(long callId);
    195199
     
    366370    ProfilesMap m_profiles;
    367371#endif
     372#if ENABLE(WORKERS)
     373    typedef HashMap<long, RefPtr<InspectorWorkerResource> > WorkersMap;
     374
     375    WorkersMap m_workers;
     376#endif
    368377};
    369378
  • trunk/WebCore/inspector/InspectorFrontend.cpp

    r55071 r55522  
    3838#include "InjectedScriptHost.h"
    3939#include "InspectorController.h"
     40#include "InspectorWorkerResource.h"
    4041#include "Node.h"
    4142#include "ScriptFunctionCall.h"
     
    453454}
    454455
     456#if ENABLE(WORKERS)
     457void InspectorFrontend::didCreateWorker(const InspectorWorkerResource& worker)
     458{
     459    ScriptFunctionCall function(m_webInspector, "dispatch");
     460    function.appendArgument("didCreateWorker");
     461    function.appendArgument(worker.id());
     462    function.appendArgument(worker.url());
     463    function.appendArgument(worker.isSharedWorker());
     464    function.call();
     465}
     466
     467void InspectorFrontend::willDestroyWorker(const InspectorWorkerResource& worker)
     468{
     469    ScriptFunctionCall function(m_webInspector, "dispatch");
     470    function.appendArgument("willDestroyWorker");
     471    function.appendArgument(worker.id());
     472    function.call();
     473}
     474#endif // ENABLE(WORKERS)
     475
    455476void InspectorFrontend::didGetCookies(int callId, const ScriptArray& cookies, const String& cookiesString)
    456477{
  • trunk/WebCore/inspector/InspectorFrontend.h

    r55071 r55522  
    4646    class SerializedScriptValue;
    4747    class Storage;
     48    class InspectorWorkerResource;
    4849
    4950    class InspectorFrontend : public Noncopyable {
     
    127128        void addRecordToTimeline(const ScriptObject&);
    128129
     130#if ENABLE(WORKERS)
     131        void didCreateWorker(const InspectorWorkerResource&);
     132        void willDestroyWorker(const InspectorWorkerResource&);
     133#endif // ENABLE(WORKER)
     134
    129135        void didGetCookies(int callId, const ScriptArray& cookies, const String& cookiesString);
    130136        void didDispatchOnInjectedScript(int callId, SerializedScriptValue* result, bool isException);
  • trunk/WebCore/inspector/InspectorWorkerResource.h

    r55521 r55522  
    11/*
    2  * Copyright (C) 2009 Google Inc. All rights reserved.
     2 * Copyright (C) 2010 Google Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2929 */
    3030
    31 #include "config.h"
     31#ifndef InspectorWorkerResource_h
     32#define InspectorWorkerResource_h
    3233
    33 #if ENABLE(SHARED_WORKERS)
     34#if ENABLE(WORKERS) && ENABLE(INSPECTOR)
    3435
    35 #include "SharedWorker.h"
    36 
    37 #include "KURL.h"
    38 #include "MessageChannel.h"
    39 #include "MessagePort.h"
    40 #include "SharedWorkerRepository.h"
     36#include "PlatformString.h"
     37#include <wtf/PassRefPtr.h>
     38#include <wtf/RefCounted.h>
     39#include <wtf/RefPtr.h>
    4140
    4241namespace WebCore {
    4342
    44 SharedWorker::SharedWorker(const String& url, const String& name, ScriptExecutionContext* context, ExceptionCode& ec)
    45     : AbstractWorker(context)
    46 {
    47     RefPtr<MessageChannel> channel = MessageChannel::create(scriptExecutionContext());
    48     m_port = channel->port1();
    49     OwnPtr<MessagePortChannel> remotePort = channel->port2()->disentangle(ec);
    50     ASSERT(!ec);
     43class InspectorWorkerResource : public RefCounted<InspectorWorkerResource> {
     44public:
     45    static PassRefPtr<InspectorWorkerResource> create(long id, const String& url, bool isSharedWorker)
     46    {
     47        return adoptRef(new InspectorWorkerResource(id, url, isSharedWorker));
     48    }
    5149
    52     KURL scriptUrl = resolveURL(url, ec);
    53     if (ec)
    54         return;
    55     SharedWorkerRepository::connect(this, remotePort.release(), scriptUrl, name, ec);
    56 }
     50    long id() const { return m_id; }
     51    const String& url() const { return m_url; }
     52    bool isSharedWorker() const { return m_isSharedWorker; }
     53private:
     54    InspectorWorkerResource(long id, const String& url, bool isSharedWorker)
     55        : m_id(id)
     56        , m_url(url)
     57        , m_isSharedWorker(isSharedWorker)
     58    {
     59    }
    5760
    58 SharedWorker::~SharedWorker()
    59 {
    60 }
     61    int m_id;
     62    String m_url;
     63    bool m_isSharedWorker;
     64};
    6165
    6266} // namespace WebCore
    6367
    64 #endif  // ENABLE(SHARED_WORKERS)
     68#endif // ENABLE(WORKERS) && ENABLE(INSPECTOR)
     69
     70#endif // InspectorWorkerResource_h
  • trunk/WebCore/inspector/front-end/Checkbox.js

    r55521 r55522  
    11/*
    2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
     2 * Copyright (C) 2010 Google Inc. All Rights Reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 WebInspector.Script = function(sourceID, sourceURL, source, startingLine, errorLine, errorMessage)
     26WebInspector.Checkbox = function(label, callback, checked, className, tooltip)
    2727{
    28     this.sourceID = sourceID;
    29     this.sourceURL = sourceURL;
    30     this.source = source;
    31     this.startingLine = startingLine;
    32     this.errorLine = errorLine;
    33     this.errorMessage = errorMessage;
     28    this.element = document.createElement('label');
     29    this._inputElement = document.createElement('input');
    3430
    35     // if no URL, look for "//@ sourceURL=" decorator
    36     // note that this sourceURL comment decorator is behavior that FireBug added
    37     // in it's 1.1 release as noted in the release notes:
    38     // http://fbug.googlecode.com/svn/branches/firebug1.1/docs/ReleaseNotes_1.1.txt
    39     if (!sourceURL) {
    40         // use of [ \t] rather than \s is to prevent \n from matching
    41         var pattern = /^\s*\/\/[ \t]*@[ \t]*sourceURL[ \t]*=[ \t]*(\S+).*$/m;
    42         var match = pattern.exec(source);
     31    function callbackWrapper(event)
     32    {
     33        if (callback)
     34            callback(event);
     35        event.stopPropagation();
     36        return true;
     37    }
     38    this._inputElement.type = "checkbox";
     39    this._inputElement.checked = checked;
     40    this._inputElement.addEventListener("click", callbackWrapper, false);
    4341
    44         if (match)
    45             this.sourceURL = WebInspector.UIString("(program): %s", match[1]);
     42    this.element.className = className;
     43    this.element.appendChild(this._inputElement);
     44    this.element.appendChild(document.createTextNode(label));
     45    this.element.title = tooltip;
     46    this.element.addEventListener("click", callbackWrapper, false);
     47}
     48
     49WebInspector.Checkbox.prototype = {
     50    checked: function()
     51    {
     52        return this._inputElement.checked;
    4653    }
    4754}
    48 
    49 WebInspector.Script.prototype = {
    50     get linesCount()
    51     {
    52         if (!this.source)
    53             return 0;
    54         this._linesCount = 0;
    55         var lastIndex = this.source.indexOf("\n");
    56         while (lastIndex !== -1) {
    57             lastIndex = this.source.indexOf("\n", lastIndex + 1)
    58             this._linesCount++;
    59         }
    60     }
    61 }
  • trunk/WebCore/inspector/front-end/InjectedFakeWorker.js

    r55227 r55522  
    2929 */
    3030
    31 var InjectedFakeWorker = function()
     31var InjectedFakeWorker = function(InjectedScriptHost, inspectedWindow, injectedScriptId)
    3232{
    3333
     
    4646function FakeWorker(worker, url)
    4747{
    48     var scriptURL = new URL(document.baseURI).completeWith(url);
    49 
    50     if (!scriptURL.sameOrigin(location.href))
    51         throw new DOMCoreException("SECURITY_ERR",18);
     48    var scriptURL = this._expandURLAndCheckOrigin(document.baseURI, location.href, url);
    5249
    5350    this._worker = worker;
    5451    this._buildWorker(scriptURL);
     52    this._id = InjectedScriptHost.nextWorkerId();
     53
     54    InjectedScriptHost.didCreateWorker(this._id, scriptURL.url, false);
    5555}
    5656
     
    6464    terminate: function()
    6565    {
     66        InjectedScriptHost.willDestroyWorker(this._id);
     67
    6668        if (this._frame != null) {
    6769            this._frame.onmessage = this._worker.onmessage = noop;
     
    9799    {
    98100        // NB: it should be an ErrorEvent, but creating it from script is not
    99         // currently supported, to emulate it on top of plain vanilla Event.
     101        // currently supported, so emulate it on top of plain vanilla Event.
    100102        var errorEvent = this._document.createEvent("Event");
    101103        errorEvent.initEvent("Event", false, false);
     
    148150    },
    149151
    150     _importScripts: function(evalTarget)
    151     {
    152         for (var i = 1; i < arguments.length; ++i)
    153             evalTarget.eval(this._loadScript(arguments[i]));
     152    _importScripts: function(targetFrame)
     153    {
     154        for (var i = 1; i < arguments.length; ++i) {
     155            var workerOrigin = targetFrame.__devtools.location.href;
     156            var url = this._expandURLAndCheckOrigin(workerOrigin, workerOrigin, arguments[i]);
     157            targetFrame.eval(this._loadScript(url.url) + "\n//@ sourceURL= " + url.url);
     158        }
    154159    },
    155160
     
    166171        }
    167172        return text;
     173    },
     174
     175    _expandURLAndCheckOrigin: function(baseURL, origin, url)
     176    {
     177        var scriptURL = new URL(baseURL).completeWith(url);
     178
     179        if (!scriptURL.sameOrigin(origin))
     180            throw new DOMCoreException("SECURITY_ERR",18);
     181        return scriptURL;
    168182    }
    169183};
  • trunk/WebCore/inspector/front-end/Script.js

    r55241 r55522  
    4343
    4444        if (match)
    45             this.sourceURL = WebInspector.UIString("(program): %s", match[1]);
     45            this.sourceURL = match[1];
    4646    }
    4747}
  • trunk/WebCore/inspector/front-end/ScriptsPanel.js

    r55464 r55522  
    136136    this.sidebarPanes.scopechain = new WebInspector.ScopeChainSidebarPane();
    137137    this.sidebarPanes.breakpoints = new WebInspector.BreakpointsSidebarPane();
     138    this.sidebarPanes.workers = new WebInspector.WorkersSidebarPane();
    138139
    139140    for (var pane in this.sidebarPanes)
     
    261262        this._sourceIDMap[sourceID] = script;
    262263
    263         var resource = WebInspector.resourceURLMap[sourceURL];
     264        var resource = WebInspector.resourceURLMap[script.sourceURL];
    264265        if (resource) {
    265266            if (resource.finished) {
     
    424425
    425426        this._debuggerEnabled = true;
    426         this.reset();
     427        this.reset(true);
    427428    },
    428429
     
    433434
    434435        this._debuggerEnabled = false;
    435         this.reset();
    436     },
    437 
    438     reset: function()
     436        this.reset(true);
     437    },
     438
     439    reset: function(preserveWorkers)
    439440    {
    440441        this.visibleView = null;
     
    472473        this.sidebarPanes.watchExpressions.refreshExpressions();
    473474        this.sidebarPanes.breakpoints.reset();
     475        if (!preserveWorkers)
     476            this.sidebarPanes.workers.reset();
    474477    },
    475478
  • trunk/WebCore/inspector/front-end/WebKit.qrc

    r55422 r55522  
    1414    <file>CallStackSidebarPane.js</file>
    1515    <file>ChangesView.js</file>
     16    <file>Checkbox.js</file>
    1617    <file>Color.js</file>
    1718    <file>ConsolePanel.js</file>
     
    9091    <file>WatchExpressionsSidebarPane.js</file>
    9192    <file>WelcomeView.js</file>
     93    <file>WorkersSidebarPane.js</file>
    9294    <file>audits.css</file>
    9395    <file>inspector.css</file>
  • trunk/WebCore/inspector/front-end/inspector.css

    r55466 r55522  
    17221722}
    17231723
     1724.sidebar-pane-subtitle {
     1725    float: right;
     1726    overflow: hidden;
     1727}
     1728
     1729.sidebar-pane-subtitle input {
     1730    width: 10px;
     1731    margin-left: 0;
     1732    margin-top: 0;
     1733    margin-bottom: 0;
     1734}
     1735
    17241736.metrics {
    17251737    padding: 8px;
     
    38723884    white-space: nowrap;
    38733885}
     3886
     3887.workers-list {
     3888    list-style: none;
     3889    margin: 0;
     3890    padding: 0;
     3891}
     3892
     3893.workers-list > li {
     3894    overflow: hidden;
     3895    text-overflow: ellipsis;
     3896    white-space: nowrap;
     3897    margin-left: 1em;
     3898    font-size: 12px;
     3899}
     3900
     3901a.worker-item {
     3902    color: rgb(33%, 33%, 33%);
     3903    cursor: pointer;
     3904    text-decoration: none;
     3905}
     3906
     3907a.worker-item:hover {
     3908    color: rgb(15%, 15%, 15%);
     3909}
  • trunk/WebCore/inspector/front-end/inspector.html

    r55227 r55522  
    4242    <script type="text/javascript" src="Object.js"></script>
    4343    <script type="text/javascript" src="Settings.js"></script>
     44    <script type="text/javascript" src="Checkbox.js"></script>
    4445    <script type="text/javascript" src="ContextMenu.js"></script>
    4546    <script type="text/javascript" src="KeyboardShortcut.js"></script>
     
    7576    <script type="text/javascript" src="ScopeChainSidebarPane.js"></script>
    7677    <script type="text/javascript" src="WatchExpressionsSidebarPane.js"></script>
     78    <script type="text/javascript" src="WorkersSidebarPane.js"></script>
    7779    <script type="text/javascript" src="MetricsSidebarPane.js"></script>
    7880    <script type="text/javascript" src="PropertiesSidebarPane.js"></script>
  • trunk/WebCore/workers/AbstractWorker.cpp

    r48701 r55522  
    11/*
    2  * Copyright (C) 2009 Google Inc. All rights reserved.
     2 * Copyright (C) 2010 Google Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    3939#include "EventException.h"
    4040#include "EventNames.h"
     41#include "InspectorController.h"
    4142#include "ScriptExecutionContext.h"
    4243#include "SecurityOrigin.h"
     
    4445namespace WebCore {
    4546
     47long AbstractWorker::s_lastId;
     48
    4649AbstractWorker::AbstractWorker(ScriptExecutionContext* context)
    4750    : ActiveDOMObject(context, this)
     51    , m_id(++s_lastId)
    4852{
    4953}
     
    5155AbstractWorker::~AbstractWorker()
    5256{
     57    onDestroyWorker();
     58}
     59
     60void AbstractWorker::onDestroyWorker()
     61{
     62#if ENABLE(INSPECTOR)
     63    if (InspectorController* inspector = scriptExecutionContext() ? scriptExecutionContext()->inspectorController() : 0)
     64        inspector->willDestroyWorker(id());
     65#endif
     66}
     67
     68void AbstractWorker::contextDestroyed()
     69{
     70    onDestroyWorker();
     71    ActiveDOMObject::contextDestroyed();
    5372}
    5473
  • trunk/WebCore/workers/AbstractWorker.h

    r48701 r55522  
    11/*
    2  * Copyright (C) 2009 Google Inc. All rights reserved.
     2 * Copyright (C) 2010 Google Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    5858        using RefCounted<AbstractWorker>::deref;
    5959
     60        long id() const { return m_id; }
     61        virtual void contextDestroyed();
    6062        AbstractWorker(ScriptExecutionContext*);
    6163        virtual ~AbstractWorker();
     
    7072        virtual EventTargetData* eventTargetData();
    7173        virtual EventTargetData* ensureEventTargetData();
     74        void onDestroyWorker();
    7275       
    7376        EventTargetData m_eventTargetData;
     77        long m_id;
     78
     79        static long s_lastId;
    7480    };
    7581
  • trunk/WebCore/workers/SharedWorker.cpp

    r46925 r55522  
    3535#include "SharedWorker.h"
    3636
     37#include "InspectorController.h"
    3738#include "KURL.h"
    3839#include "MessageChannel.h"
     
    5455        return;
    5556    SharedWorkerRepository::connect(this, remotePort.release(), scriptUrl, name, ec);
     57#if ENABLE(INSPECTOR)
     58    if (InspectorController* inspector = scriptExecutionContext()->inspectorController())
     59        inspector->didCreateWorker(id(), scriptUrl.string(), true);
     60#endif
    5661}
    5762
  • trunk/WebCore/workers/Worker.cpp

    r49734 r55522  
    4141#include "Frame.h"
    4242#include "FrameLoader.h"
     43#include "InspectorController.h"
    4344#include "MessageEvent.h"
    4445#include "TextEncoding.h"
     
    6162    m_scriptLoader->loadAsynchronously(scriptExecutionContext(), scriptURL, DenyCrossOriginRequests, this);
    6263    setPendingActivity(this);  // The worker context does not exist while loading, so we must ensure that the worker object is not collected, as well as its event listeners.
     64#if ENABLE(INSPECTOR)
     65    if (InspectorController* inspector = scriptExecutionContext()->inspectorController())
     66        inspector->didCreateWorker(id(), scriptURL.string(), false);
     67#endif
    6368}
    6469
  • trunk/WebKit/chromium/src/js/InspectorControllerImpl.js

    r55347 r55522  
    3939{
    4040    WebInspector.InspectorBackendStub.call(this);
     41    this.installInspectorControllerDelegate_("addScriptToEvaluateOnLoad");
    4142    this.installInspectorControllerDelegate_("clearMessages");
    4243    this.installInspectorControllerDelegate_("copyNode");
     
    5657    this.installInspectorControllerDelegate_("hideDOMNodeHighlight");
    5758    this.installInspectorControllerDelegate_("releaseWrapperObjectGroup");
     59    this.installInspectorControllerDelegate_("removeAllScriptsToEvaluateOnLoad");
    5860    this.installInspectorControllerDelegate_("reloadPage");
    5961    this.installInspectorControllerDelegate_("removeAttribute");
Note: See TracChangeset for help on using the changeset viewer.