Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(302)

Side by Side Diff: third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp

Issue 2585113005: DevTools: make ignoreInputEvents a static flag (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2010-2011 Google Inc. All rights reserved. 2 * Copyright (C) 2010-2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 static void ensureMainThreadDebuggerCreated(WebDevToolsAgentClient* client) { 110 static void ensureMainThreadDebuggerCreated(WebDevToolsAgentClient* client) {
111 if (s_instance) 111 if (s_instance)
112 return; 112 return;
113 std::unique_ptr<ClientMessageLoopAdapter> instance = 113 std::unique_ptr<ClientMessageLoopAdapter> instance =
114 WTF::wrapUnique(new ClientMessageLoopAdapter( 114 WTF::wrapUnique(new ClientMessageLoopAdapter(
115 WTF::wrapUnique(client->createClientMessageLoop()))); 115 WTF::wrapUnique(client->createClientMessageLoop())));
116 s_instance = instance.get(); 116 s_instance = instance.get();
117 MainThreadDebugger::instance()->setClientMessageLoop(std::move(instance)); 117 MainThreadDebugger::instance()->setClientMessageLoop(std::move(instance));
118 } 118 }
119 119
120 static void webViewImplClosed(WebViewImpl* view) {
121 if (s_instance)
122 s_instance->m_frozenViews.remove(view);
123 }
124
125 static void webFrameWidgetImplClosed(WebFrameWidgetImpl* widget) {
126 if (s_instance)
127 s_instance->m_frozenWidgets.remove(widget);
128 }
129
130 static void continueProgram() { 120 static void continueProgram() {
131 // Release render thread if necessary. 121 // Release render thread if necessary.
132 if (s_instance) 122 if (s_instance)
133 s_instance->quitNow(); 123 s_instance->quitNow();
134 } 124 }
135 125
136 static void pauseForCreateWindow(WebLocalFrameImpl* frame) { 126 static void pauseForCreateWindow(WebLocalFrameImpl* frame) {
137 if (s_instance) 127 if (s_instance)
138 s_instance->runForCreateWindow(frame); 128 s_instance->runForCreateWindow(frame);
139 } 129 }
(...skipping 28 matching lines...) Expand all
168 m_runningForCreateWindow = true; 158 m_runningForCreateWindow = true;
169 if (!m_runningForDebugBreak) 159 if (!m_runningForDebugBreak)
170 runLoop(frame); 160 runLoop(frame);
171 } 161 }
172 162
173 void runLoop(WebLocalFrameImpl* frame) { 163 void runLoop(WebLocalFrameImpl* frame) {
174 // 0. Flush pending frontend messages. 164 // 0. Flush pending frontend messages.
175 WebDevToolsAgentImpl* agent = frame->devToolsAgentImpl(); 165 WebDevToolsAgentImpl* agent = frame->devToolsAgentImpl();
176 agent->flushProtocolNotifications(); 166 agent->flushProtocolNotifications();
177 167
178 Vector<WebViewImpl*> views;
179 HeapVector<Member<WebFrameWidgetImpl>> widgets;
180
181 // 1. Disable input events. 168 // 1. Disable input events.
182 const HashSet<WebViewImpl*>& viewImpls = WebViewImpl::allInstances(); 169 WebFrameWidgetBase::setIgnoreInputEvents(true);
183 HashSet<WebViewImpl*>::const_iterator viewImplsEnd = viewImpls.end(); 170 for (const auto view : WebViewImpl::allInstances())
184 for (HashSet<WebViewImpl*>::const_iterator it = viewImpls.begin();
185 it != viewImplsEnd; ++it) {
186 WebViewImpl* view = *it;
187 m_frozenViews.add(view);
188 views.append(view);
189 view->setIgnoreInputEvents(true);
190 view->chromeClient().notifyPopupOpeningObservers(); 171 view->chromeClient().notifyPopupOpeningObservers();
191 }
192
193 const WebFrameWidgetsSet& widgetImpls = WebFrameWidgetImpl::allInstances();
194 WebFrameWidgetsSet::const_iterator widgetImplsEnd = widgetImpls.end();
195 for (WebFrameWidgetsSet::const_iterator it = widgetImpls.begin();
196 it != widgetImplsEnd; ++it) {
197 WebFrameWidgetImpl* widget = *it;
198 m_frozenWidgets.add(widget);
199 widgets.append(widget);
200 widget->setIgnoreInputEvents(true);
201 }
202 172
203 // 2. Notify embedder about pausing. 173 // 2. Notify embedder about pausing.
204 if (agent->client()) 174 if (agent->client())
205 agent->client()->willEnterDebugLoop(); 175 agent->client()->willEnterDebugLoop();
206 176
207 // 3. Disable active objects 177 // 3. Disable active objects
208 WebView::willEnterModalLoop(); 178 WebView::willEnterModalLoop();
209 179
210 // 4. Process messages until quitNow is called. 180 // 4. Process messages until quitNow is called.
211 m_messageLoop->run(); 181 m_messageLoop->run();
212 182
213 // 5. Resume active objects 183 // 5. Resume active objects
214 WebView::didExitModalLoop(); 184 WebView::didExitModalLoop();
215 185
216 // 6. Resume input events. 186 WebFrameWidgetBase::setIgnoreInputEvents(false);
217 for (Vector<WebViewImpl*>::iterator it = views.begin(); it != views.end();
218 ++it) {
219 if (m_frozenViews.contains(*it)) {
220 // The view was not closed during the dispatch.
221 (*it)->setIgnoreInputEvents(false);
222 }
223 }
224 for (HeapVector<Member<WebFrameWidgetImpl>>::iterator it = widgets.begin();
225 it != widgets.end(); ++it) {
226 if (m_frozenWidgets.contains(*it)) {
227 // The widget was not closed during the dispatch.
228 (*it)->setIgnoreInputEvents(false);
229 }
230 }
231 187
232 // 7. Notify embedder about resuming. 188 // 7. Notify embedder about resuming.
233 if (agent->client()) 189 if (agent->client())
234 agent->client()->didExitDebugLoop(); 190 agent->client()->didExitDebugLoop();
235
236 // 8. All views have been resumed, clear the set.
237 m_frozenViews.clear();
238 m_frozenWidgets.clear();
239 } 191 }
240 192
241 void quitNow() override { 193 void quitNow() override {
242 if (m_runningForDebugBreak) { 194 if (m_runningForDebugBreak) {
243 m_runningForDebugBreak = false; 195 m_runningForDebugBreak = false;
244 if (!m_runningForCreateWindow) 196 if (!m_runningForCreateWindow)
245 m_messageLoop->quitNow(); 197 m_messageLoop->quitNow();
246 } 198 }
247 } 199 }
248 200
(...skipping 15 matching lines...) Expand all
264 WebDevToolsAgentImpl* agent = 216 WebDevToolsAgentImpl* agent =
265 WebLocalFrameImpl::fromFrame(frame)->devToolsAgentImpl(); 217 WebLocalFrameImpl::fromFrame(frame)->devToolsAgentImpl();
266 if (agent && agent->client()) 218 if (agent && agent->client())
267 agent->client()->resumeStartup(); 219 agent->client()->resumeStartup();
268 } 220 }
269 221
270 bool m_runningForDebugBreak; 222 bool m_runningForDebugBreak;
271 bool m_runningForCreateWindow; 223 bool m_runningForCreateWindow;
272 std::unique_ptr<WebDevToolsAgentClient::WebKitClientMessageLoop> 224 std::unique_ptr<WebDevToolsAgentClient::WebKitClientMessageLoop>
273 m_messageLoop; 225 m_messageLoop;
274 typedef HashSet<WebViewImpl*> FrozenViewsSet; 226
275 FrozenViewsSet m_frozenViews;
276 WebFrameWidgetsSet m_frozenWidgets;
277 static ClientMessageLoopAdapter* s_instance; 227 static ClientMessageLoopAdapter* s_instance;
278 }; 228 };
279 229
280 ClientMessageLoopAdapter* ClientMessageLoopAdapter::s_instance = nullptr; 230 ClientMessageLoopAdapter* ClientMessageLoopAdapter::s_instance = nullptr;
281 231
282 // static 232 // static
283 WebDevToolsAgentImpl* WebDevToolsAgentImpl::create( 233 WebDevToolsAgentImpl* WebDevToolsAgentImpl::create(
284 WebLocalFrameImpl* frame, 234 WebLocalFrameImpl* frame,
285 WebDevToolsAgentClient* client) { 235 WebDevToolsAgentClient* client) {
286 InspectorOverlay* overlay = new InspectorOverlay(frame); 236 InspectorOverlay* overlay = new InspectorOverlay(frame);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 m_includeViewAgents(includeViewAgents), 272 m_includeViewAgents(includeViewAgents),
323 m_layerTreeId(0) { 273 m_layerTreeId(0) {
324 DCHECK(isMainThread()); 274 DCHECK(isMainThread());
325 DCHECK(m_webLocalFrameImpl->frame()); 275 DCHECK(m_webLocalFrameImpl->frame());
326 } 276 }
327 277
328 WebDevToolsAgentImpl::~WebDevToolsAgentImpl() { 278 WebDevToolsAgentImpl::~WebDevToolsAgentImpl() {
329 DCHECK(!m_client); 279 DCHECK(!m_client);
330 } 280 }
331 281
332 // static
333 void WebDevToolsAgentImpl::webViewImplClosed(WebViewImpl* webViewImpl) {
334 ClientMessageLoopAdapter::webViewImplClosed(webViewImpl);
335 }
336
337 // static
338 void WebDevToolsAgentImpl::webFrameWidgetImplClosed(
339 WebFrameWidgetImpl* webFrameWidgetImpl) {
340 ClientMessageLoopAdapter::webFrameWidgetImplClosed(webFrameWidgetImpl);
341 }
342
343 DEFINE_TRACE(WebDevToolsAgentImpl) { 282 DEFINE_TRACE(WebDevToolsAgentImpl) {
344 visitor->trace(m_webLocalFrameImpl); 283 visitor->trace(m_webLocalFrameImpl);
345 visitor->trace(m_instrumentingAgents); 284 visitor->trace(m_instrumentingAgents);
346 visitor->trace(m_resourceContentLoader); 285 visitor->trace(m_resourceContentLoader);
347 visitor->trace(m_overlay); 286 visitor->trace(m_overlay);
348 visitor->trace(m_inspectedFrames); 287 visitor->trace(m_inspectedFrames);
349 visitor->trace(m_resourceContainer); 288 visitor->trace(m_resourceContainer);
350 visitor->trace(m_domAgent); 289 visitor->trace(m_domAgent);
351 visitor->trace(m_pageAgent); 290 visitor->trace(m_pageAgent);
352 visitor->trace(m_networkAgent); 291 visitor->trace(m_networkAgent);
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 } 638 }
700 639
701 bool WebDevToolsAgent::shouldInterruptForMethod(const WebString& method) { 640 bool WebDevToolsAgent::shouldInterruptForMethod(const WebString& method) {
702 return method == "Debugger.pause" || method == "Debugger.setBreakpoint" || 641 return method == "Debugger.pause" || method == "Debugger.setBreakpoint" ||
703 method == "Debugger.setBreakpointByUrl" || 642 method == "Debugger.setBreakpointByUrl" ||
704 method == "Debugger.removeBreakpoint" || 643 method == "Debugger.removeBreakpoint" ||
705 method == "Debugger.setBreakpointsActive"; 644 method == "Debugger.setBreakpointsActive";
706 } 645 }
707 646
708 } // namespace blink 647 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/web/WebDevToolsAgentImpl.h ('k') | third_party/WebKit/Source/web/WebFrameWidgetBase.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698