Changeset 31570 in webkit
- Timestamp:
- Apr 2, 2008 10:59:44 AM (16 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r31567 r31570 1 2008-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. 1 39 2008-04-02 Simon Hausmann <hausmann@webkit.org> 2 40 -
trunk/WebCore/page/JavaScriptDebugServer.cpp
r30874 r31570 55 55 JavaScriptDebugServer::~JavaScriptDebugServer() 56 56 { 57 deleteAllValues(m_pageListenersMap); 57 58 } 58 59 59 60 void JavaScriptDebugServer::addListener(JavaScriptDebugListener* listener) 60 61 { 61 if ( m_listeners.isEmpty())62 if (!hasListeners()) 62 63 Page::setDebuggerForAllPages(this); 63 64 … … 68 69 { 69 70 m_listeners.remove(listener); 70 if ( m_listeners.isEmpty())71 if (!hasListeners()) 71 72 Page::setDebuggerForAllPages(0); 72 73 } 73 74 75 void 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 90 void 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 74 111 void JavaScriptDebugServer::pageCreated(Page* page) 75 112 { 76 if ( m_listeners.isEmpty())113 if (!hasListeners()) 77 114 return; 78 115 … … 96 133 } 97 134 135 static 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 98 145 bool JavaScriptDebugServer::sourceParsed(ExecState* state, int sourceID, const UString& sourceURL, const UString& source, int startingLineNumber, int errorLine, const UString& errorMessage) 99 146 { 100 147 if (m_callingListeners) 101 148 return true; 149 150 Page* page = toPage(state); 151 if (!page) 152 return true; 153 102 154 m_callingListeners = true; 103 155 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 } 109 174 110 175 m_callingListeners = false; … … 112 177 } 113 178 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()); 179 static void dispatchFunctionToListeners(const ListenerSet& listeners, JavaScriptDebugServer::JavaScriptExecutionCallback callback, ExecState* state, int sourceID, int lineNumber) 180 { 121 181 Vector<JavaScriptDebugListener*> copy; 122 copyToVector( m_listeners, copy);182 copyToVector(listeners, copy); 123 183 for (size_t i = 0; i < copy.size(); ++i) 124 184 (copy[i]->*callback)(state, sourceID, lineNumber); 185 } 186 187 void 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 } 125 205 126 206 m_callingListeners = false; -
trunk/WebCore/page/JavaScriptDebugServer.h
r30874 r31570 48 48 void removeListener(JavaScriptDebugListener*); 49 49 50 void addListener(JavaScriptDebugListener*, Page*); 51 void removeListener(JavaScriptDebugListener*, Page*); 52 50 53 void pageCreated(Page*); 51 54 52 55 typedef HashSet<JavaScriptDebugListener*> ListenerSet; 56 typedef void (JavaScriptDebugListener::*JavaScriptExecutionCallback)(KJS::ExecState*, int sourceID, int lineNumber); 53 57 54 58 private: … … 56 60 ~JavaScriptDebugServer(); 57 61 58 typedef void (JavaScriptDebugListener::*JavaScriptExecutionCallback)(KJS::ExecState*, int sourceID, int lineNumber); 62 bool hasListeners() const { return !m_listeners.isEmpty() || !m_pageListenersMap.isEmpty(); } 63 59 64 void dispatchFunctionToListeners(JavaScriptExecutionCallback, KJS::ExecState*, int sourceID, int lineNumber); 60 65 … … 65 70 virtual bool exception(KJS::ExecState*, int sourceID, int lineNumber, KJS::JSValue* exception); 66 71 72 typedef HashMap<Page*, ListenerSet*> PageListenersMap; 73 PageListenersMap m_pageListenersMap; 67 74 ListenerSet m_listeners; 68 75 bool m_callingListeners;
Note: See TracChangeset
for help on using the changeset viewer.