1 /* 2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "InspectorInstrumentation.h" 33 34 #if ENABLE(INSPECTOR) 35 36 #include "DOMWindow.h" 37 #include "Database.h" 38 #include "DocumentLoader.h" 39 #include "Event.h" 40 #include "EventContext.h" 41 #include "InspectorAgent.h" 42 #include "InspectorApplicationCacheAgent.h" 43 #include "InspectorBrowserDebuggerAgent.h" 44 #include "InspectorCSSAgent.h" 45 #include "InspectorConsoleAgent.h" 46 #include "InspectorDatabaseAgent.h" 47 #include "InspectorDOMAgent.h" 48 #include "InspectorDOMStorageAgent.h" 49 #include "InspectorDebuggerAgent.h" 50 #include "InspectorPageAgent.h" 51 #include "InspectorProfilerAgent.h" 52 #include "InspectorResourceAgent.h" 53 #include "InspectorTimelineAgent.h" 54 #include "InstrumentingAgents.h" 55 #include "ScriptArguments.h" 56 #include "ScriptCallStack.h" 57 #include "XMLHttpRequest.h" 58 #include <wtf/text/CString.h> 59 60 namespace WebCore { 61 62 static const char* const listenerEventCategoryType = "listener"; 63 static const char* const instrumentationEventCategoryType = "instrumentation"; 64 65 static const char* const setTimerEventName = "setTimer"; 66 static const char* const clearTimerEventName = "clearTimer"; 67 static const char* const timerFiredEventName = "timerFired"; 68 69 HashMap<Page*, InspectorAgent*>& InspectorInstrumentation::inspectorAgents() 70 { 71 static HashMap<Page*, InspectorAgent*>& agents = *new HashMap<Page*, InspectorAgent*>; 72 return agents; 73 } 74 75 int InspectorInstrumentation::s_frontendCounter = 0; 76 77 static bool eventHasListeners(const AtomicString& eventType, DOMWindow* window, Node* node, const Vector<EventContext>& ancestors) 78 { 79 if (window && window->hasEventListeners(eventType)) 80 return true; 81 82 if (node->hasEventListeners(eventType)) 83 return true; 84 85 for (size_t i = 0; i < ancestors.size(); i++) { 86 Node* ancestor = ancestors[i].node(); 87 if (ancestor->hasEventListeners(eventType)) 88 return true; 89 } 90 91 return false; 92 } 93 94 void InspectorInstrumentation::didClearWindowObjectInWorldImpl(InspectorAgent* inspectorAgent, Frame* frame, DOMWrapperWorld* world) 95 { 96 if (InspectorPageAgent* pageAgent = inspectorAgent->instrumentingAgents()->inspectorPageAgent()) 97 pageAgent->didClearWindowObjectInWorld(frame, world); 98 inspectorAgent->didClearWindowObjectInWorld(frame, world); 99 } 100 101 void InspectorInstrumentation::inspectedPageDestroyedImpl(InspectorAgent* inspectorAgent) 102 { 103 inspectorAgent->inspectedPageDestroyed(); 104 } 105 106 void InspectorInstrumentation::willInsertDOMNodeImpl(InspectorAgent* inspectorAgent, Node* node, Node* parent) 107 { 108 #if ENABLE(JAVASCRIPT_DEBUGGER) 109 if (InspectorBrowserDebuggerAgent* browserDebuggerAgent = inspectorAgent->instrumentingAgents()->inspectorBrowserDebuggerAgent()) 110 browserDebuggerAgent->willInsertDOMNode(node, parent); 111 #endif 112 } 113 114 void InspectorInstrumentation::didInsertDOMNodeImpl(InspectorAgent* inspectorAgent, Node* node) 115 { 116 if (InspectorDOMAgent* domAgent = inspectorAgent->domAgent()) 117 domAgent->didInsertDOMNode(node); 118 #if ENABLE(JAVASCRIPT_DEBUGGER) 119 if (InspectorBrowserDebuggerAgent* browserDebuggerAgent = inspectorAgent->instrumentingAgents()->inspectorBrowserDebuggerAgent()) 120 browserDebuggerAgent->didInsertDOMNode(node); 121 #endif 122 } 123 124 void InspectorInstrumentation::willRemoveDOMNodeImpl(InspectorAgent* inspectorAgent, Node* node) 125 { 126 #if ENABLE(JAVASCRIPT_DEBUGGER) 127 if (InspectorBrowserDebuggerAgent* browserDebuggerAgent = inspectorAgent->instrumentingAgents()->inspectorBrowserDebuggerAgent()) 128 browserDebuggerAgent->willRemoveDOMNode(node); 129 #endif 130 } 131 132 void InspectorInstrumentation::didRemoveDOMNodeImpl(InspectorAgent* inspectorAgent, Node* node) 133 { 134 #if ENABLE(JAVASCRIPT_DEBUGGER) 135 if (InspectorBrowserDebuggerAgent* browserDebuggerAgent = inspectorAgent->instrumentingAgents()->inspectorBrowserDebuggerAgent()) 136 browserDebuggerAgent->didRemoveDOMNode(node); 137 #endif 138 if (InspectorDOMAgent* domAgent = inspectorAgent->domAgent()) 139 domAgent->didRemoveDOMNode(node); 140 } 141 142 void InspectorInstrumentation::willModifyDOMAttrImpl(InspectorAgent* inspectorAgent, Element* element) 143 { 144 #if ENABLE(JAVASCRIPT_DEBUGGER) 145 if (InspectorBrowserDebuggerAgent* browserDebuggerAgent = inspectorAgent->instrumentingAgents()->inspectorBrowserDebuggerAgent()) 146 browserDebuggerAgent->willModifyDOMAttr(element); 147 #endif 148 } 149 150 void InspectorInstrumentation::didModifyDOMAttrImpl(InspectorAgent* inspectorAgent, Element* element) 151 { 152 if (InspectorDOMAgent* domAgent = inspectorAgent->domAgent()) 153 domAgent->didModifyDOMAttr(element); 154 } 155 156 void InspectorInstrumentation::didInvalidateStyleAttrImpl(InspectorAgent* inspectorAgent, Node* node) 157 { 158 if (InspectorDOMAgent* domAgent = inspectorAgent->domAgent()) 159 domAgent->didInvalidateStyleAttr(node); 160 } 161 162 void InspectorInstrumentation::mouseDidMoveOverElementImpl(InspectorAgent* inspectorAgent, const HitTestResult& result, unsigned modifierFlags) 163 { 164 if (InspectorDOMAgent* domAgent = inspectorAgent->instrumentingAgents()->inspectorDOMAgent()) 165 domAgent->mouseDidMoveOverElement(result, modifierFlags); 166 } 167 168 bool InspectorInstrumentation::handleMousePressImpl(InspectorAgent* inspectorAgent) 169 { 170 if (InspectorDOMAgent* domAgent = inspectorAgent->instrumentingAgents()->inspectorDOMAgent()) 171 return domAgent->handleMousePress(); 172 return false; 173 } 174 175 void InspectorInstrumentation::characterDataModifiedImpl(InspectorAgent* inspectorAgent, CharacterData* characterData) 176 { 177 if (InspectorDOMAgent* domAgent = inspectorAgent->domAgent()) 178 domAgent->characterDataModified(characterData); 179 } 180 181 void InspectorInstrumentation::willSendXMLHttpRequestImpl(InspectorAgent* inspectorAgent, const String& url) 182 { 183 #if ENABLE(JAVASCRIPT_DEBUGGER) 184 if (InspectorBrowserDebuggerAgent* browserDebuggerAgent = inspectorAgent->instrumentingAgents()->inspectorBrowserDebuggerAgent()) 185 browserDebuggerAgent->willSendXMLHttpRequest(url); 186 #endif 187 } 188 189 void InspectorInstrumentation::didScheduleResourceRequestImpl(InspectorAgent* inspectorAgent, const String& url) 190 { 191 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent)) 192 timelineAgent->didScheduleResourceRequest(url); 193 } 194 195 void InspectorInstrumentation::didInstallTimerImpl(InspectorAgent* inspectorAgent, int timerId, int timeout, bool singleShot) 196 { 197 pauseOnNativeEventIfNeeded(inspectorAgent, instrumentationEventCategoryType, setTimerEventName, true); 198 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent)) 199 timelineAgent->didInstallTimer(timerId, timeout, singleShot); 200 } 201 202 void InspectorInstrumentation::didRemoveTimerImpl(InspectorAgent* inspectorAgent, int timerId) 203 { 204 pauseOnNativeEventIfNeeded(inspectorAgent, instrumentationEventCategoryType, clearTimerEventName, true); 205 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent)) 206 timelineAgent->didRemoveTimer(timerId); 207 } 208 209 InspectorInstrumentationCookie InspectorInstrumentation::willCallFunctionImpl(InspectorAgent* inspectorAgent, const String& scriptName, int scriptLine) 210 { 211 int timelineAgentId = 0; 212 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent); 213 if (timelineAgent) { 214 timelineAgent->willCallFunction(scriptName, scriptLine); 215 timelineAgentId = timelineAgent->id(); 216 } 217 return InspectorInstrumentationCookie(inspectorAgent, timelineAgentId); 218 } 219 220 void InspectorInstrumentation::didCallFunctionImpl(const InspectorInstrumentationCookie& cookie) 221 { 222 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) 223 timelineAgent->didCallFunction(); 224 } 225 226 InspectorInstrumentationCookie InspectorInstrumentation::willChangeXHRReadyStateImpl(InspectorAgent* inspectorAgent, XMLHttpRequest* request) 227 { 228 int timelineAgentId = 0; 229 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent); 230 if (timelineAgent && request->hasEventListeners(eventNames().readystatechangeEvent)) { 231 timelineAgent->willChangeXHRReadyState(request->url().string(), request->readyState()); 232 timelineAgentId = timelineAgent->id(); 233 } 234 return InspectorInstrumentationCookie(inspectorAgent, timelineAgentId); 235 } 236 237 void InspectorInstrumentation::didChangeXHRReadyStateImpl(const InspectorInstrumentationCookie& cookie) 238 { 239 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) 240 timelineAgent->didChangeXHRReadyState(); 241 } 242 243 InspectorInstrumentationCookie InspectorInstrumentation::willDispatchEventImpl(InspectorAgent* inspectorAgent, const Event& event, DOMWindow* window, Node* node, const Vector<EventContext>& ancestors) 244 { 245 pauseOnNativeEventIfNeeded(inspectorAgent, listenerEventCategoryType, event.type(), false); 246 247 int timelineAgentId = 0; 248 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent); 249 if (timelineAgent && eventHasListeners(event.type(), window, node, ancestors)) { 250 timelineAgent->willDispatchEvent(event); 251 timelineAgentId = timelineAgent->id(); 252 } 253 return InspectorInstrumentationCookie(inspectorAgent, timelineAgentId); 254 } 255 256 void InspectorInstrumentation::didDispatchEventImpl(const InspectorInstrumentationCookie& cookie) 257 { 258 cancelPauseOnNativeEvent(cookie.first); 259 260 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) 261 timelineAgent->didDispatchEvent(); 262 } 263 264 InspectorInstrumentationCookie InspectorInstrumentation::willDispatchEventOnWindowImpl(InspectorAgent* inspectorAgent, const Event& event, DOMWindow* window) 265 { 266 pauseOnNativeEventIfNeeded(inspectorAgent, listenerEventCategoryType, event.type(), false); 267 268 int timelineAgentId = 0; 269 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent); 270 if (timelineAgent && window->hasEventListeners(event.type())) { 271 timelineAgent->willDispatchEvent(event); 272 timelineAgentId = timelineAgent->id(); 273 } 274 return InspectorInstrumentationCookie(inspectorAgent, timelineAgentId); 275 } 276 277 void InspectorInstrumentation::didDispatchEventOnWindowImpl(const InspectorInstrumentationCookie& cookie) 278 { 279 cancelPauseOnNativeEvent(cookie.first); 280 281 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) 282 timelineAgent->didDispatchEvent(); 283 } 284 285 InspectorInstrumentationCookie InspectorInstrumentation::willEvaluateScriptImpl(InspectorAgent* inspectorAgent, const String& url, int lineNumber) 286 { 287 int timelineAgentId = 0; 288 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent); 289 if (timelineAgent) { 290 timelineAgent->willEvaluateScript(url, lineNumber); 291 timelineAgentId = timelineAgent->id(); 292 } 293 return InspectorInstrumentationCookie(inspectorAgent, timelineAgentId); 294 } 295 296 void InspectorInstrumentation::didEvaluateScriptImpl(const InspectorInstrumentationCookie& cookie) 297 { 298 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) 299 timelineAgent->didEvaluateScript(); 300 } 301 302 InspectorInstrumentationCookie InspectorInstrumentation::willFireTimerImpl(InspectorAgent* inspectorAgent, int timerId) 303 { 304 pauseOnNativeEventIfNeeded(inspectorAgent, instrumentationEventCategoryType, timerFiredEventName, false); 305 306 int timelineAgentId = 0; 307 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent); 308 if (timelineAgent) { 309 timelineAgent->willFireTimer(timerId); 310 timelineAgentId = timelineAgent->id(); 311 } 312 return InspectorInstrumentationCookie(inspectorAgent, timelineAgentId); 313 } 314 315 void InspectorInstrumentation::didFireTimerImpl(const InspectorInstrumentationCookie& cookie) 316 { 317 cancelPauseOnNativeEvent(cookie.first); 318 319 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) 320 timelineAgent->didFireTimer(); 321 } 322 323 InspectorInstrumentationCookie InspectorInstrumentation::willLayoutImpl(InspectorAgent* inspectorAgent) 324 { 325 int timelineAgentId = 0; 326 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent); 327 if (timelineAgent) { 328 timelineAgent->willLayout(); 329 timelineAgentId = timelineAgent->id(); 330 } 331 return InspectorInstrumentationCookie(inspectorAgent, timelineAgentId); 332 } 333 334 void InspectorInstrumentation::didLayoutImpl(const InspectorInstrumentationCookie& cookie) 335 { 336 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) 337 timelineAgent->didLayout(); 338 } 339 340 InspectorInstrumentationCookie InspectorInstrumentation::willLoadXHRImpl(InspectorAgent* inspectorAgent, XMLHttpRequest* request) 341 { 342 int timelineAgentId = 0; 343 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent); 344 if (timelineAgent && request->hasEventListeners(eventNames().loadEvent)) { 345 timelineAgent->willLoadXHR(request->url()); 346 timelineAgentId = timelineAgent->id(); 347 } 348 return InspectorInstrumentationCookie(inspectorAgent, timelineAgentId); 349 } 350 351 void InspectorInstrumentation::didLoadXHRImpl(const InspectorInstrumentationCookie& cookie) 352 { 353 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) 354 timelineAgent->didLoadXHR(); 355 } 356 357 InspectorInstrumentationCookie InspectorInstrumentation::willPaintImpl(InspectorAgent* inspectorAgent, const IntRect& rect) 358 { 359 int timelineAgentId = 0; 360 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent); 361 if (timelineAgent) { 362 timelineAgent->willPaint(rect); 363 timelineAgentId = timelineAgent->id(); 364 } 365 return InspectorInstrumentationCookie(inspectorAgent, timelineAgentId); 366 } 367 368 void InspectorInstrumentation::didPaintImpl(const InspectorInstrumentationCookie& cookie) 369 { 370 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) 371 timelineAgent->didPaint(); 372 } 373 374 InspectorInstrumentationCookie InspectorInstrumentation::willRecalculateStyleImpl(InspectorAgent* inspectorAgent) 375 { 376 int timelineAgentId = 0; 377 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent); 378 if (timelineAgent) { 379 timelineAgent->willRecalculateStyle(); 380 timelineAgentId = timelineAgent->id(); 381 } 382 return InspectorInstrumentationCookie(inspectorAgent, timelineAgentId); 383 } 384 385 void InspectorInstrumentation::didRecalculateStyleImpl(const InspectorInstrumentationCookie& cookie) 386 { 387 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) 388 timelineAgent->didRecalculateStyle(); 389 } 390 391 void InspectorInstrumentation::applyUserAgentOverrideImpl(InspectorAgent* inspectorAgent, String* userAgent) 392 { 393 if (InspectorPageAgent* pageAgent = retrievePageAgent(inspectorAgent)) 394 pageAgent->applyUserAgentOverride(userAgent); 395 } 396 397 void InspectorInstrumentation::willSendRequestImpl(InspectorAgent* inspectorAgent, unsigned long identifier, DocumentLoader* loader, ResourceRequest& request, const ResourceResponse& redirectResponse) 398 { 399 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent)) 400 timelineAgent->willSendResourceRequest(identifier, request); 401 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 402 resourceAgent->willSendRequest(identifier, loader, request, redirectResponse); 403 } 404 405 void InspectorInstrumentation::markResourceAsCachedImpl(InspectorAgent* inspectorAgent, unsigned long identifier) 406 { 407 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 408 resourceAgent->markResourceAsCached(identifier); 409 } 410 411 void InspectorInstrumentation::didLoadResourceFromMemoryCacheImpl(InspectorAgent* inspectorAgent, DocumentLoader* loader, const CachedResource* cachedResource) 412 { 413 if (!inspectorAgent->enabled()) 414 return; 415 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 416 resourceAgent->didLoadResourceFromMemoryCache(loader, cachedResource); 417 } 418 419 InspectorInstrumentationCookie InspectorInstrumentation::willReceiveResourceDataImpl(InspectorAgent* inspectorAgent, unsigned long identifier) 420 { 421 int timelineAgentId = 0; 422 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent); 423 if (timelineAgent) { 424 timelineAgent->willReceiveResourceData(identifier); 425 timelineAgentId = timelineAgent->id(); 426 } 427 return InspectorInstrumentationCookie(inspectorAgent, timelineAgentId); 428 } 429 430 void InspectorInstrumentation::didReceiveResourceDataImpl(const InspectorInstrumentationCookie& cookie) 431 { 432 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) 433 timelineAgent->didReceiveResourceData(); 434 } 435 436 InspectorInstrumentationCookie InspectorInstrumentation::willReceiveResourceResponseImpl(InspectorAgent* inspectorAgent, unsigned long identifier, const ResourceResponse& response) 437 { 438 int timelineAgentId = 0; 439 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent); 440 if (timelineAgent) { 441 timelineAgent->willReceiveResourceResponse(identifier, response); 442 timelineAgentId = timelineAgent->id(); 443 } 444 return InspectorInstrumentationCookie(inspectorAgent, timelineAgentId); 445 } 446 447 void InspectorInstrumentation::didReceiveResourceResponseImpl(const InspectorInstrumentationCookie& cookie, unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response) 448 { 449 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) 450 timelineAgent->didReceiveResourceResponse(); 451 if (!loader) 452 return; 453 if (InspectorAgent* inspectorAgent = inspectorAgentForFrame(loader->frame())) { 454 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 455 resourceAgent->didReceiveResponse(identifier, loader, response); 456 inspectorAgent->consoleAgent()->didReceiveResponse(identifier, response); // This should come AFTER resource notification, front-end relies on this. 457 } 458 } 459 460 void InspectorInstrumentation::didReceiveResourceResponseButCanceledImpl(Frame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r) 461 { 462 InspectorInstrumentationCookie cookie = InspectorInstrumentation::willReceiveResourceResponse(frame, identifier, r); 463 InspectorInstrumentation::didReceiveResourceResponse(cookie, identifier, loader, r); 464 } 465 466 void InspectorInstrumentation::continueAfterXFrameOptionsDeniedImpl(Frame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r) 467 { 468 didReceiveResourceResponseButCanceledImpl(frame, loader, identifier, r); 469 } 470 471 void InspectorInstrumentation::continueWithPolicyDownloadImpl(Frame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r) 472 { 473 didReceiveResourceResponseButCanceledImpl(frame, loader, identifier, r); 474 } 475 476 void InspectorInstrumentation::continueWithPolicyIgnoreImpl(Frame* frame, DocumentLoader* loader, unsigned long identifier, const ResourceResponse& r) 477 { 478 didReceiveResourceResponseButCanceledImpl(frame, loader, identifier, r); 479 } 480 481 void InspectorInstrumentation::didReceiveContentLengthImpl(InspectorAgent* inspectorAgent, unsigned long identifier, int dataLength, int encodedDataLength) 482 { 483 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 484 resourceAgent->didReceiveContentLength(identifier, dataLength, encodedDataLength); 485 } 486 487 void InspectorInstrumentation::didFinishLoadingImpl(InspectorAgent* inspectorAgent, unsigned long identifier, double finishTime) 488 { 489 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent)) 490 timelineAgent->didFinishLoadingResource(identifier, false, finishTime); 491 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 492 resourceAgent->didFinishLoading(identifier, finishTime); 493 } 494 495 void InspectorInstrumentation::didFailLoadingImpl(InspectorAgent* inspectorAgent, unsigned long identifier, const ResourceError& error) 496 { 497 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent)) 498 timelineAgent->didFinishLoadingResource(identifier, true, 0); 499 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 500 resourceAgent->didFailLoading(identifier, error); 501 inspectorAgent->consoleAgent()->didFailLoading(identifier, error); // This should come AFTER resource notification, front-end relies on this. 502 } 503 504 void InspectorInstrumentation::resourceRetrievedByXMLHttpRequestImpl(InspectorAgent* inspectorAgent, unsigned long identifier, const String& sourceString, const String& url, const String& sendURL, unsigned sendLineNumber) 505 { 506 inspectorAgent->consoleAgent()->resourceRetrievedByXMLHttpRequest(url, sendURL, sendLineNumber); 507 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 508 resourceAgent->setInitialXHRContent(identifier, sourceString); 509 } 510 511 void InspectorInstrumentation::scriptImportedImpl(InspectorAgent* inspectorAgent, unsigned long identifier, const String& sourceString) 512 { 513 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 514 resourceAgent->setInitialScriptContent(identifier, sourceString); 515 } 516 517 void InspectorInstrumentation::domContentLoadedEventFiredImpl(InspectorAgent* inspectorAgent, Frame* frame, const KURL& url) 518 { 519 DocumentLoader* documentLoader = frame->loader()->documentLoader(); 520 ASSERT(documentLoader); 521 522 if (frame->page()->mainFrame() != frame || url != documentLoader->requestURL()) 523 return; 524 525 inspectorAgent->domContentLoadedEventFired(); 526 527 if (InspectorDOMAgent* domAgent = inspectorAgent->instrumentingAgents()->inspectorDOMAgent()) 528 domAgent->mainFrameDOMContentLoaded(); 529 530 if (InspectorTimelineAgent* timelineAgent = inspectorAgent->instrumentingAgents()->inspectorTimelineAgent()) 531 timelineAgent->didMarkDOMContentEvent(); 532 533 if (InspectorResourceAgent* resourceAgent = inspectorAgent->instrumentingAgents()->inspectorResourceAgent()) 534 resourceAgent->domContentEventFired(); 535 536 if (InspectorPageAgent* pageAgent = inspectorAgent->instrumentingAgents()->inspectorPageAgent()) 537 pageAgent->domContentEventFired(); 538 } 539 540 void InspectorInstrumentation::loadEventFiredImpl(InspectorAgent* inspectorAgent, Frame* frame, const KURL& url) 541 { 542 DocumentLoader* documentLoader = frame->loader()->documentLoader(); 543 ASSERT(documentLoader); 544 545 if (InspectorDOMAgent* domAgent = inspectorAgent->instrumentingAgents()->inspectorDOMAgent()) 546 domAgent->loadEventFired(documentLoader->frame()->document()); 547 548 if (frame->page()->mainFrame() != frame || url != documentLoader->requestURL()) 549 return; 550 551 if (InspectorTimelineAgent* timelineAgent = inspectorAgent->instrumentingAgents()->inspectorTimelineAgent()) 552 timelineAgent->didMarkLoadEvent(); 553 554 if (InspectorResourceAgent* resourceAgent = inspectorAgent->instrumentingAgents()->inspectorResourceAgent()) 555 resourceAgent->loadEventFired(); 556 557 if (InspectorPageAgent* pageAgent = inspectorAgent->instrumentingAgents()->inspectorPageAgent()) 558 pageAgent->loadEventFired(); 559 } 560 561 void InspectorInstrumentation::frameDetachedFromParentImpl(InspectorAgent* inspectorAgent, Frame* frame) 562 { 563 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 564 resourceAgent->frameDetachedFromParent(frame); 565 } 566 567 void InspectorInstrumentation::didCommitLoadImpl(Page* page, InspectorAgent* inspectorAgent, DocumentLoader* loader) 568 { 569 if (!inspectorAgent->enabled()) 570 return; 571 572 InstrumentingAgents* instrumentingAgents = inspectorAgent->instrumentingAgents(); 573 if (InspectorResourceAgent* resourceAgent = instrumentingAgents->inspectorResourceAgent()) 574 resourceAgent->didCommitLoad(loader); 575 576 Frame* mainFrame = page->mainFrame(); 577 if (loader->frame() != mainFrame) 578 return; 579 580 if (InspectorConsoleAgent* consoleAgent = instrumentingAgents->inspectorConsoleAgent()) 581 consoleAgent->reset(); 582 #if ENABLE(JAVASCRIPT_DEBUGGER) 583 if (InspectorDebuggerAgent* debuggerAgent = instrumentingAgents->inspectorDebuggerAgent()) { 584 KURL url = inspectorAgent->inspectedURLWithoutFragment(); 585 debuggerAgent->inspectedURLChanged(url); 586 } 587 #endif 588 #if ENABLE(JAVASCRIPT_DEBUGGER) && USE(JSC) 589 if (InspectorProfilerAgent* profilerAgent = instrumentingAgents->inspectorProfilerAgent()) { 590 profilerAgent->stopUserInitiatedProfiling(true); 591 profilerAgent->resetState(); 592 } 593 #endif 594 if (InspectorCSSAgent* cssAgent = instrumentingAgents->inspectorCSSAgent()) 595 cssAgent->reset(); 596 #if ENABLE(DATABASE) 597 if (InspectorDatabaseAgent* databaseAgent = instrumentingAgents->inspectorDatabaseAgent()) 598 databaseAgent->clearResources(); 599 #endif 600 #if ENABLE(DOM_STORAGE) 601 if (InspectorDOMStorageAgent* domStorageAgent = instrumentingAgents->inspectorDOMStorageAgent()) 602 domStorageAgent->clearResources(); 603 #endif 604 if (InspectorDOMAgent* domAgent = instrumentingAgents->inspectorDOMAgent()) 605 domAgent->setDocument(mainFrame->document()); 606 607 if (InspectorPageAgent* pageAgent = instrumentingAgents->inspectorPageAgent()) 608 pageAgent->inspectedURLChanged(loader->url().string()); 609 610 inspectorAgent->didCommitLoad(); 611 } 612 613 InspectorInstrumentationCookie InspectorInstrumentation::willWriteHTMLImpl(InspectorAgent* inspectorAgent, unsigned int length, unsigned int startLine) 614 { 615 int timelineAgentId = 0; 616 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent); 617 if (timelineAgent) { 618 timelineAgent->willWriteHTML(length, startLine); 619 timelineAgentId = timelineAgent->id(); 620 } 621 return InspectorInstrumentationCookie(inspectorAgent, timelineAgentId); 622 } 623 624 void InspectorInstrumentation::didWriteHTMLImpl(const InspectorInstrumentationCookie& cookie, unsigned int endLine) 625 { 626 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) 627 timelineAgent->didWriteHTML(endLine); 628 } 629 630 void InspectorInstrumentation::addMessageToConsoleImpl(InspectorAgent* inspectorAgent, MessageSource source, MessageType type, MessageLevel level, const String& message, PassRefPtr<ScriptArguments> arguments, PassRefPtr<ScriptCallStack> callStack) 631 { 632 inspectorAgent->consoleAgent()->addMessageToConsole(source, type, level, message, arguments, callStack); 633 } 634 635 void InspectorInstrumentation::addMessageToConsoleImpl(InspectorAgent* inspectorAgent, MessageSource source, MessageType type, MessageLevel level, const String& message, unsigned lineNumber, const String& sourceID) 636 { 637 inspectorAgent->consoleAgent()->addMessageToConsole(source, type, level, message, lineNumber, sourceID); 638 } 639 640 void InspectorInstrumentation::consoleCountImpl(InspectorAgent* inspectorAgent, PassRefPtr<ScriptArguments> arguments, PassRefPtr<ScriptCallStack> stack) 641 { 642 inspectorAgent->consoleAgent()->count(arguments, stack); 643 } 644 645 void InspectorInstrumentation::startConsoleTimingImpl(InspectorAgent* inspectorAgent, const String& title) 646 { 647 inspectorAgent->consoleAgent()->startTiming(title); 648 } 649 650 void InspectorInstrumentation::stopConsoleTimingImpl(InspectorAgent* inspectorAgent, const String& title, PassRefPtr<ScriptCallStack> stack) 651 { 652 inspectorAgent->consoleAgent()->stopTiming(title, stack); 653 } 654 655 void InspectorInstrumentation::consoleMarkTimelineImpl(InspectorAgent* inspectorAgent, PassRefPtr<ScriptArguments> arguments) 656 { 657 if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(inspectorAgent)) { 658 String message; 659 arguments->getFirstArgumentAsString(message); 660 timelineAgent->didMarkTimeline(message); 661 } 662 } 663 664 #if ENABLE(JAVASCRIPT_DEBUGGER) 665 void InspectorInstrumentation::addStartProfilingMessageToConsoleImpl(InspectorAgent* inspectorAgent, const String& title, unsigned lineNumber, const String& sourceURL) 666 { 667 if (InspectorProfilerAgent* profilerAgent = inspectorAgent->profilerAgent()) 668 profilerAgent->addStartProfilingMessageToConsole(title, lineNumber, sourceURL); 669 } 670 671 void InspectorInstrumentation::addProfileImpl(InspectorAgent* inspectorAgent, RefPtr<ScriptProfile> profile, PassRefPtr<ScriptCallStack> callStack) 672 { 673 if (InspectorProfilerAgent* profilerAgent = inspectorAgent->profilerAgent()) { 674 const ScriptCallFrame& lastCaller = callStack->at(0); 675 profilerAgent->addProfile(profile, lastCaller.lineNumber(), lastCaller.sourceURL()); 676 } 677 } 678 679 String InspectorInstrumentation::getCurrentUserInitiatedProfileNameImpl(InspectorAgent* inspectorAgent, bool incrementProfileNumber) 680 { 681 if (InspectorProfilerAgent* profilerAgent = inspectorAgent->profilerAgent()) 682 return profilerAgent->getCurrentUserInitiatedProfileName(incrementProfileNumber); 683 return ""; 684 } 685 686 bool InspectorInstrumentation::profilerEnabledImpl(InspectorAgent* inspectorAgent) 687 { 688 return inspectorAgent->instrumentingAgents()->inspectorProfilerAgent()->enabled(); 689 } 690 #endif 691 692 #if ENABLE(DATABASE) 693 void InspectorInstrumentation::didOpenDatabaseImpl(InspectorAgent* inspectorAgent, PassRefPtr<Database> database, const String& domain, const String& name, const String& version) 694 { 695 if (!inspectorAgent->enabled()) 696 return; 697 if (InspectorDatabaseAgent* dbAgent = inspectorAgent->instrumentingAgents()->inspectorDatabaseAgent()) 698 dbAgent->didOpenDatabase(database, domain, name, version); 699 } 700 #endif 701 702 #if ENABLE(DOM_STORAGE) 703 void InspectorInstrumentation::didUseDOMStorageImpl(InspectorAgent* inspectorAgent, StorageArea* storageArea, bool isLocalStorage, Frame* frame) 704 { 705 if (!inspectorAgent->enabled()) 706 return; 707 if (InspectorDOMStorageAgent* domStorageAgent = inspectorAgent->instrumentingAgents()->inspectorDOMStorageAgent()) 708 domStorageAgent->didUseDOMStorage(storageArea, isLocalStorage, frame); 709 } 710 #endif 711 712 #if ENABLE(WORKERS) 713 void InspectorInstrumentation::didCreateWorkerImpl(InspectorAgent* inspectorAgent, intptr_t id, const String& url, bool isSharedWorker) 714 { 715 inspectorAgent->didCreateWorker(id, url, isSharedWorker); 716 } 717 718 void InspectorInstrumentation::didDestroyWorkerImpl(InspectorAgent* inspectorAgent, intptr_t id) 719 { 720 inspectorAgent->didDestroyWorker(id); 721 } 722 #endif 723 724 #if ENABLE(WEB_SOCKETS) 725 void InspectorInstrumentation::didCreateWebSocketImpl(InspectorAgent* inspectorAgent, unsigned long identifier, const KURL& requestURL, const KURL&) 726 { 727 if (!inspectorAgent->enabled()) 728 return; 729 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 730 resourceAgent->didCreateWebSocket(identifier, requestURL); 731 } 732 733 void InspectorInstrumentation::willSendWebSocketHandshakeRequestImpl(InspectorAgent* inspectorAgent, unsigned long identifier, const WebSocketHandshakeRequest& request) 734 { 735 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 736 resourceAgent->willSendWebSocketHandshakeRequest(identifier, request); 737 } 738 739 void InspectorInstrumentation::didReceiveWebSocketHandshakeResponseImpl(InspectorAgent* inspectorAgent, unsigned long identifier, const WebSocketHandshakeResponse& response) 740 { 741 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 742 resourceAgent->didReceiveWebSocketHandshakeResponse(identifier, response); 743 } 744 745 void InspectorInstrumentation::didCloseWebSocketImpl(InspectorAgent* inspectorAgent, unsigned long identifier) 746 { 747 if (InspectorResourceAgent* resourceAgent = retrieveResourceAgent(inspectorAgent)) 748 resourceAgent->didCloseWebSocket(identifier); 749 } 750 #endif 751 752 #if ENABLE(OFFLINE_WEB_APPLICATIONS) 753 void InspectorInstrumentation::networkStateChangedImpl(InspectorAgent* inspectorAgent) 754 { 755 if (InspectorApplicationCacheAgent* applicationCacheAgent = inspectorAgent->instrumentingAgents()->inspectorApplicationCacheAgent()) 756 applicationCacheAgent->networkStateChanged(); 757 } 758 759 void InspectorInstrumentation::updateApplicationCacheStatusImpl(InspectorAgent* inspectorAgent, Frame* frame) 760 { 761 if (InspectorApplicationCacheAgent* applicationCacheAgent = inspectorAgent->instrumentingAgents()->inspectorApplicationCacheAgent()) 762 applicationCacheAgent->updateApplicationCacheStatus(frame); 763 } 764 #endif 765 766 bool InspectorInstrumentation::hasFrontend(InspectorAgent* inspectorAgent) 767 { 768 return inspectorAgent->hasFrontend(); 769 } 770 771 void InspectorInstrumentation::pauseOnNativeEventIfNeeded(InspectorAgent* inspectorAgent, const String& categoryType, const String& eventName, bool synchronous) 772 { 773 #if ENABLE(JAVASCRIPT_DEBUGGER) 774 if (InspectorBrowserDebuggerAgent* browserDebuggerAgent = inspectorAgent->instrumentingAgents()->inspectorBrowserDebuggerAgent()) 775 browserDebuggerAgent->pauseOnNativeEventIfNeeded(categoryType, eventName, synchronous); 776 #endif 777 } 778 779 void InspectorInstrumentation::cancelPauseOnNativeEvent(InspectorAgent* inspectorAgent) 780 { 781 #if ENABLE(JAVASCRIPT_DEBUGGER) 782 if (InspectorDebuggerAgent* debuggerAgent = inspectorAgent->debuggerAgent()) 783 debuggerAgent->cancelPauseOnNextStatement(); 784 #endif 785 } 786 787 InspectorTimelineAgent* InspectorInstrumentation::retrieveTimelineAgent(InspectorAgent* inspectorAgent) 788 { 789 return inspectorAgent->instrumentingAgents()->inspectorTimelineAgent(); 790 } 791 792 InspectorTimelineAgent* InspectorInstrumentation::retrieveTimelineAgent(const InspectorInstrumentationCookie& cookie) 793 { 794 if (!cookie.first) 795 return 0; 796 InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie.first); 797 if (timelineAgent && timelineAgent->id() == cookie.second) 798 return timelineAgent; 799 return 0; 800 } 801 802 InspectorResourceAgent* InspectorInstrumentation::retrieveResourceAgent(InspectorAgent* inspectorAgent) 803 { 804 return inspectorAgent->instrumentingAgents()->inspectorResourceAgent(); 805 } 806 807 InspectorPageAgent* InspectorInstrumentation::retrievePageAgent(InspectorAgent* inspectorAgent) 808 { 809 return inspectorAgent->instrumentingAgents()->inspectorPageAgent(); 810 } 811 812 } // namespace WebCore 813 814 #endif // !ENABLE(INSPECTOR) 815