Changeset 31570 in webkit


Ignore:
Timestamp:
Apr 2, 2008 10:59:44 AM (16 years ago)
Author:
Adam Roben
Message:

Make it possible for JavaScriptDebugListeners to listen to specific Pages

JavaScriptDebugServer now has overloads of its
addListener/removeListener methods that take a Page* to indicate for
which Page the JavaScriptDebugListener wishes to receive messages.

Reviewed by Darin.

  • page/JavaScriptDebugServer.cpp: (WebCore::JavaScriptDebugServer::~JavaScriptDebugServer): Delete all ListenerSets being held in m_pageListenersMap. (WebCore::JavaScriptDebugServer::addListener): Changed to call hasListeners(). (WebCore::JavaScriptDebugServer::removeListener): Ditto. (WebCore::JavaScriptDebugServer::addListener): Added. This overload takes a Page* and puts the listener in the appropriate ListenerSet within m_pageListenersMap. The ListenerSet is allocated and added to m_pageListenersMap when its first listener is added. (WebCore::JavaScriptDebugServer::removeListener): Added. This overload takes a Page* and removes the listener from the appropriate ListenerSet in m_pageListenersMap. The ListenerSet is deleted and removed from m_pageListenersMap when its last listener is removed. (WebCore::toPage): Added. Retrieves the parent Page from an ExecState. (WebCore::JavaScriptDebugServer::sourceParsed): Changed to call dispatchDidParseSource/dispatchDidFailToParseSource for both the global listeners and the Page listeners. (WebCore::dispatchFunctionToListeners): Added. This code was extracted from the JavaScriptDebugServer method of the same name. (WebCore::JavaScriptDebugServer::dispatchFunctionToListeners): Call dispatchFunctionToListeners for both the global listeners and the Page listeners.
  • page/JavaScriptDebugServer.h:
    • Added declarations for new methods.
    • Made JavaScriptExecutionCallback typedef public so that it could be used by a helper method.
    • Added new m_pageListenersMap member.
Location:
trunk/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r31567 r31570  
     12008-04-02  Adam Roben  <aroben@apple.com>
     2
     3        Make it possible for JavaScriptDebugListeners to listen to specific Pages
     4
     5        JavaScriptDebugServer now has overloads of its
     6        addListener/removeListener methods that take a Page* to indicate for
     7        which Page the JavaScriptDebugListener wishes to receive messages.
     8
     9        Reviewed by Darin.
     10
     11        * page/JavaScriptDebugServer.cpp:
     12        (WebCore::JavaScriptDebugServer::~JavaScriptDebugServer): Delete all
     13        ListenerSets being held in m_pageListenersMap.
     14        (WebCore::JavaScriptDebugServer::addListener): Changed to call
     15        hasListeners().
     16        (WebCore::JavaScriptDebugServer::removeListener): Ditto.
     17        (WebCore::JavaScriptDebugServer::addListener): Added. This overload
     18        takes a Page* and puts the listener in the appropriate ListenerSet
     19        within m_pageListenersMap. The ListenerSet is allocated and added to
     20        m_pageListenersMap when its first listener is added.
     21        (WebCore::JavaScriptDebugServer::removeListener): Added. This overload
     22        takes a Page* and removes the listener from the appropriate
     23        ListenerSet in m_pageListenersMap. The ListenerSet is deleted and
     24        removed from m_pageListenersMap when its last listener is removed.
     25        (WebCore::toPage): Added. Retrieves the parent Page from an ExecState.
     26        (WebCore::JavaScriptDebugServer::sourceParsed): Changed to call
     27        dispatchDidParseSource/dispatchDidFailToParseSource for both the
     28        global listeners and the Page listeners.
     29        (WebCore::dispatchFunctionToListeners): Added. This code was extracted
     30        from the JavaScriptDebugServer method of the same name.
     31        (WebCore::JavaScriptDebugServer::dispatchFunctionToListeners): Call
     32        dispatchFunctionToListeners for both the global listeners and the Page
     33        listeners.
     34        * page/JavaScriptDebugServer.h:
     35          - Added declarations for new methods.
     36          - Made JavaScriptExecutionCallback typedef public so that it could
     37            be used by a helper method.
     38          - Added new m_pageListenersMap member.
    1392008-04-02  Simon Hausmann  <hausmann@webkit.org>
    240
  • trunk/WebCore/page/JavaScriptDebugServer.cpp

    r30874 r31570  
    5555JavaScriptDebugServer::~JavaScriptDebugServer()
    5656{
     57    deleteAllValues(m_pageListenersMap);
    5758}
    5859
    5960void JavaScriptDebugServer::addListener(JavaScriptDebugListener* listener)
    6061{
    61     if (m_listeners.isEmpty())
     62    if (!hasListeners())
    6263        Page::setDebuggerForAllPages(this);
    6364
     
    6869{
    6970    m_listeners.remove(listener);
    70     if (m_listeners.isEmpty())
     71    if (!hasListeners())
    7172        Page::setDebuggerForAllPages(0);
    7273}
    7374
     75void JavaScriptDebugServer::addListener(JavaScriptDebugListener* listener, Page* page)
     76{
     77    ASSERT_ARG(page, page);
     78
     79    if (!hasListeners())
     80        Page::setDebuggerForAllPages(this);
     81
     82    pair<PageListenersMap::iterator, bool> result = m_pageListenersMap.add(page, 0);
     83    if (result.second)
     84        result.first->second = new ListenerSet;
     85    ListenerSet* listeners = result.first->second;
     86
     87    listeners->add(listener);
     88}
     89
     90void JavaScriptDebugServer::removeListener(JavaScriptDebugListener* listener, Page* page)
     91{
     92    ASSERT_ARG(page, page);
     93
     94    PageListenersMap::iterator it = m_pageListenersMap.find(page);
     95    if (it == m_pageListenersMap.end())
     96        return;
     97
     98    ListenerSet* listeners = it->second;
     99
     100    listeners->remove(listener);
     101
     102    if (listeners->isEmpty()) {
     103        m_pageListenersMap.remove(it);
     104        delete listeners;
     105    }
     106
     107    if (!hasListeners())
     108        Page::setDebuggerForAllPages(0);
     109}
     110
    74111void JavaScriptDebugServer::pageCreated(Page* page)
    75112{
    76     if (m_listeners.isEmpty())
     113    if (!hasListeners())
    77114        return;
    78115
     
    96133}
    97134
     135static Page* toPage(ExecState* state)
     136{
     137    ASSERT_ARG(state, state);
     138
     139    JSDOMWindow* window = toJSDOMWindow(state->dynamicGlobalObject());
     140    ASSERT(window);
     141
     142    return window->impl()->frame()->page();
     143}
     144
    98145bool JavaScriptDebugServer::sourceParsed(ExecState* state, int sourceID, const UString& sourceURL, const UString& source, int startingLineNumber, int errorLine, const UString& errorMessage)
    99146{
    100147    if (m_callingListeners)
    101148        return true;
     149
     150    Page* page = toPage(state);
     151    if (!page)
     152        return true;
     153
    102154    m_callingListeners = true;
    103155
    104     ASSERT(!m_listeners.isEmpty());
    105     if (errorLine == -1)
    106         dispatchDidParseSource(m_listeners, state, source, startingLineNumber, sourceURL, sourceID);
    107     else
    108         dispatchFailedToParseSource(m_listeners, state, source, startingLineNumber, sourceURL, errorLine, errorMessage);
     156    ASSERT(hasListeners());
     157
     158    bool isError = errorLine != -1;
     159
     160    if (!m_listeners.isEmpty()) {
     161        if (isError)
     162            dispatchFailedToParseSource(m_listeners, state, source, startingLineNumber, sourceURL, errorLine, errorMessage);
     163        else
     164            dispatchDidParseSource(m_listeners, state, source, startingLineNumber, sourceURL, sourceID);
     165    }
     166
     167    if (ListenerSet* pageListeners = m_pageListenersMap.get(page)) {
     168        ASSERT(!pageListeners->isEmpty());
     169        if (isError)
     170            dispatchFailedToParseSource(*pageListeners, state, source, startingLineNumber, sourceURL, errorLine, errorMessage);
     171        else
     172            dispatchDidParseSource(*pageListeners, state, source, startingLineNumber, sourceURL, sourceID);
     173    }
    109174
    110175    m_callingListeners = false;
     
    112177}
    113178
    114 void JavaScriptDebugServer::dispatchFunctionToListeners(JavaScriptExecutionCallback callback, ExecState* state, int sourceID, int lineNumber)
    115 {
    116     if (m_callingListeners)
    117         return;
    118     m_callingListeners = true;
    119 
    120     ASSERT(!m_listeners.isEmpty());
     179static void dispatchFunctionToListeners(const ListenerSet& listeners, JavaScriptDebugServer::JavaScriptExecutionCallback callback, ExecState* state, int sourceID, int lineNumber)
     180{
    121181    Vector<JavaScriptDebugListener*> copy;
    122     copyToVector(m_listeners, copy);
     182    copyToVector(listeners, copy);
    123183    for (size_t i = 0; i < copy.size(); ++i)
    124184        (copy[i]->*callback)(state, sourceID, lineNumber);
     185}
     186
     187void JavaScriptDebugServer::dispatchFunctionToListeners(JavaScriptExecutionCallback callback, ExecState* state, int sourceID, int lineNumber)
     188{
     189    if (m_callingListeners)
     190        return;
     191
     192    Page* page = toPage(state);
     193    if (!page)
     194        return;
     195
     196    m_callingListeners = true;
     197
     198    ASSERT(hasListeners());
     199
     200    WebCore::dispatchFunctionToListeners(m_listeners, callback, state, sourceID, lineNumber);
     201    if (ListenerSet* pageListeners = m_pageListenersMap.get(page)) {
     202        ASSERT(!pageListeners->isEmpty());
     203        WebCore::dispatchFunctionToListeners(*pageListeners, callback, state, sourceID, lineNumber);
     204    }
    125205
    126206    m_callingListeners = false;
  • trunk/WebCore/page/JavaScriptDebugServer.h

    r30874 r31570  
    4848        void removeListener(JavaScriptDebugListener*);
    4949
     50        void addListener(JavaScriptDebugListener*, Page*);
     51        void removeListener(JavaScriptDebugListener*, Page*);
     52
    5053        void pageCreated(Page*);
    5154
    5255        typedef HashSet<JavaScriptDebugListener*> ListenerSet;
     56        typedef void (JavaScriptDebugListener::*JavaScriptExecutionCallback)(KJS::ExecState*, int sourceID, int lineNumber);
    5357
    5458    private:
     
    5660        ~JavaScriptDebugServer();
    5761
    58         typedef void (JavaScriptDebugListener::*JavaScriptExecutionCallback)(KJS::ExecState*, int sourceID, int lineNumber);
     62        bool hasListeners() const { return !m_listeners.isEmpty() || !m_pageListenersMap.isEmpty(); }
     63
    5964        void dispatchFunctionToListeners(JavaScriptExecutionCallback, KJS::ExecState*, int sourceID, int lineNumber);
    6065
     
    6570        virtual bool exception(KJS::ExecState*, int sourceID, int lineNumber, KJS::JSValue* exception);
    6671
     72        typedef HashMap<Page*, ListenerSet*> PageListenersMap;
     73        PageListenersMap m_pageListenersMap;
    6774        ListenerSet m_listeners;
    6875        bool m_callingListeners;
Note: See TracChangeset for help on using the changeset viewer.