Changeset 37656 in webkit


Ignore:
Timestamp:
Oct 17, 2008 9:51:03 AM (16 years ago)
Author:
timothy@apple.com
Message:

Fixes a regression where starting a debugging session in
another Web Inspector window would not show any scripts.
Also only attach the debugger to only the required Pages.

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

Reviewed by Darin Adler.

  • inspector/JavaScriptDebugServer.cpp: (WebCore::JavaScriptDebugServer::addListener): Add an assert and remove the call to willAddFirstListener(). Add a call to didAddListener(). (WebCore::JavaScriptDebugServer::removeListener): Add an assert and call to didRemoveListener(). (WebCore::JavaScriptDebugServer::pageCreated): Attach the debugger if there is a listener interested in the new Page. (WebCore::JavaScriptDebugServer::hasListenersInterestedInPage): Use hasGlobalListeners() instead of isEmpty(). (WebCore::JavaScriptDebugServer::sourceParsed): Ditto. (WebCore::JavaScriptDebugServer::didAddListener): Added. Attach the debugger to the page if non-null, or all pages if page is null. (WebCore::JavaScriptDebugServer::didRemoveListener): Added. Detach the debugger only if there are no interested listeners. (WebCore::JavaScriptDebugServer::didRemoveLastListener): Remove the call to Page::setDebuggerForAllPages().
  • inspector/JavaScriptDebugServer.h: (WebCore::JavaScriptDebugServer::hasGlobalListeners): Added.
Location:
trunk/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r37655 r37656  
     12008-10-17  Timothy Hatcher  <timothy@apple.com>
     2
     3        Fixes a regression where starting a debugging session in
     4        another Web Inspector window would not show any scripts.
     5        Also only attach the debugger to only the required Pages.
     6
     7        https://bugs.webkit.org/show_bug.cgi?id=21708
     8
     9        Reviewed by Darin Adler.
     10
     11        * inspector/JavaScriptDebugServer.cpp:
     12        (WebCore::JavaScriptDebugServer::addListener): Add an assert and
     13        remove the call to willAddFirstListener(). Add a call to
     14        didAddListener().
     15        (WebCore::JavaScriptDebugServer::removeListener): Add an assert
     16        and call to didRemoveListener().
     17        (WebCore::JavaScriptDebugServer::pageCreated): Attach the debugger
     18        if there is a listener interested in the new Page.
     19        (WebCore::JavaScriptDebugServer::hasListenersInterestedInPage):
     20        Use hasGlobalListeners() instead of isEmpty().
     21        (WebCore::JavaScriptDebugServer::sourceParsed): Ditto.
     22        (WebCore::JavaScriptDebugServer::didAddListener): Added. Attach the
     23        debugger to the page if non-null, or all pages if page is null.
     24        (WebCore::JavaScriptDebugServer::didRemoveListener): Added. Detach
     25        the debugger only if there are no interested listeners.
     26        (WebCore::JavaScriptDebugServer::didRemoveLastListener): Remove the
     27        call to Page::setDebuggerForAllPages().
     28        * inspector/JavaScriptDebugServer.h:
     29        (WebCore::JavaScriptDebugServer::hasGlobalListeners): Added.
     30
    1312008-10-15  Brett Wilson  <brettw@chromium.org>
    232
  • trunk/WebCore/inspector/JavaScriptDebugServer.cpp

    r37622 r37656  
    8484void JavaScriptDebugServer::addListener(JavaScriptDebugListener* listener)
    8585{
    86     if (!hasListeners())
    87         willAddFirstListener();
     86    ASSERT_ARG(listener, listener);
    8887
    8988    m_listeners.add(listener);
     89
     90    didAddListener(0);
    9091}
    9192
    9293void JavaScriptDebugServer::removeListener(JavaScriptDebugListener* listener)
    9394{
     95    ASSERT_ARG(listener, listener);
     96
    9497    m_listeners.remove(listener);
     98
     99    didRemoveListener(0);
    95100    if (!hasListeners())
    96101        didRemoveLastListener();
     
    99104void JavaScriptDebugServer::addListener(JavaScriptDebugListener* listener, Page* page)
    100105{
     106    ASSERT_ARG(listener, listener);
    101107    ASSERT_ARG(page, page);
    102 
    103     if (!hasListeners())
    104         willAddFirstListener();
    105108
    106109    pair<PageListenersMap::iterator, bool> result = m_pageListenersMap.add(page, 0);
    107110    if (result.second)
    108111        result.first->second = new ListenerSet;
     112
    109113    ListenerSet* listeners = result.first->second;
    110 
    111114    listeners->add(listener);
     115
     116    didAddListener(page);
    112117}
    113118
    114119void JavaScriptDebugServer::removeListener(JavaScriptDebugListener* listener, Page* page)
    115120{
     121    ASSERT_ARG(listener, listener);
    116122    ASSERT_ARG(page, page);
    117123
     
    127133    }
    128134
     135    didRemoveListener(page);
    129136    if (!hasListeners())
    130137        didRemoveLastListener();
     
    133140void JavaScriptDebugServer::pageCreated(Page* page)
    134141{
    135     if (!hasListeners())
    136         return;
    137 
     142    ASSERT_ARG(page, page);
     143
     144    if (!hasListenersInterestedInPage(page))
     145        return;
    138146    page->setDebugger(this);
    139147}
     
    143151    ASSERT_ARG(page, page);
    144152
    145     if (!m_listeners.isEmpty())
     153    if (hasGlobalListeners())
    146154        return true;
    147155
     
    282290    bool isError = errorLine != -1;
    283291
    284     if (!m_listeners.isEmpty()) {
     292    if (hasGlobalListeners()) {
    285293        if (isError)
    286294            dispatchFailedToParseSource(m_listeners, exec, source, errorLine, errorMessage);
     
    318326
    319327    WebCore::dispatchFunctionToListeners(m_listeners, callback);
     328
    320329    if (ListenerSet* pageListeners = m_pageListenersMap.get(page)) {
    321330        ASSERT(!pageListeners->isEmpty());
     
    510519    if (m_paused)
    511520        return;
    512    
     521
    513522    ASSERT(m_currentCallFrame);
    514523    if (!m_currentCallFrame)
     
    524533    JSLock lock(false);
    525534    JSGlobalData* globalData = JSDOMWindow::commonJSGlobalData();
    526    
     535
    527536    // If JavaScript is running, it's not safe to recompile, since we'll end
    528537    // up throwing away code that is live on the stack.
     
    543552    FunctionBodyMap functionBodies;
    544553    SourceProviderSet sourceProviders;
    545    
     554
    546555    size_t size = functions.size();
    547556    for (size_t i = 0; i < size; ++i) {
    548557        JSFunction* function = functions[i];
    549        
     558
    550559        FunctionBodyNode* oldBody = function->m_body.get();
    551560        pair<FunctionBodyMap::iterator, bool> result = functionBodies.add(oldBody, 0);
     
    561570        ASSERT(newBody);
    562571        newBody->finishParsing(oldBody->copyParameters(), oldBody->parameterCount());
    563        
     572
    564573        result.first->second = newBody;
    565574        function->m_body = newBody.release();
     
    573582}
    574583
    575 void JavaScriptDebugServer::willAddFirstListener()
    576 {
    577     Page::setDebuggerForAllPages(this);
     584void JavaScriptDebugServer::didAddListener(Page* page)
     585{
    578586    m_recompileTimer.startOneShot(0);
     587
     588    if (page)
     589        page->setDebugger(this);
     590    else
     591        Page::setDebuggerForAllPages(this);
     592}
     593
     594void JavaScriptDebugServer::didRemoveListener(Page* page)
     595{
     596    if (hasGlobalListeners() || (page && hasListenersInterestedInPage(page)))
     597        return;
     598
     599    if (page)
     600        page->setDebugger(0);
     601    else
     602        Page::setDebuggerForAllPages(0);
    579603}
    580604
    581605void JavaScriptDebugServer::didRemoveLastListener()
    582606{
    583     Page::setDebuggerForAllPages(0);
    584607    m_doneProcessingDebuggerEvents = true;
    585608    m_recompileTimer.startOneShot(0);
  • trunk/WebCore/inspector/JavaScriptDebugServer.h

    r37622 r37656  
    8888
    8989        bool hasListeners() const { return !m_listeners.isEmpty() || !m_pageListenersMap.isEmpty(); }
     90        bool hasGlobalListeners() const { return !m_listeners.isEmpty(); }
    9091        bool hasListenersInterestedInPage(Page*);
    9192
     
    107108        virtual void didReachBreakpoint(const JSC::DebuggerCallFrame&, intptr_t sourceID, int lineno);
    108109       
    109         void willAddFirstListener();
     110        void didAddListener(Page*);
     111        void didRemoveListener(Page*);
    110112        void didRemoveLastListener();
    111113
Note: See TracChangeset for help on using the changeset viewer.