diff options
Diffstat (limited to 'WebCore/inspector/InspectorController.cpp')
-rw-r--r-- | WebCore/inspector/InspectorController.cpp | 248 |
1 files changed, 134 insertions, 114 deletions
diff --git a/WebCore/inspector/InspectorController.cpp b/WebCore/inspector/InspectorController.cpp index d0ae442..8355cdf 100644 --- a/WebCore/inspector/InspectorController.cpp +++ b/WebCore/inspector/InspectorController.cpp @@ -53,13 +53,13 @@ #include "FrameView.h" #include "GraphicsContext.h" #include "HTMLFrameOwnerElement.h" +#include "HTTPHeaderMap.h" #include "HitTestResult.h" #include "InjectedScript.h" #include "InjectedScriptHost.h" #include "InspectorBackend.h" #include "InspectorBackendDispatcher.h" #include "InspectorCSSAgent.h" -#include "InspectorCSSStore.h" #include "InspectorClient.h" #include "InspectorDOMAgent.h" #include "InspectorDOMStorageResource.h" @@ -125,10 +125,6 @@ using namespace std; namespace WebCore { -static const char* const domNativeBreakpointType = "DOM"; -static const char* const eventListenerNativeBreakpointType = "EventListener"; -static const char* const xhrNativeBreakpointType = "XHR"; - const char* const InspectorController::ElementsPanel = "elements"; const char* const InspectorController::ConsolePanel = "console"; const char* const InspectorController::ScriptsPanel = "scripts"; @@ -144,10 +140,8 @@ InspectorController::InspectorController(Page* page, InspectorClient* client) , m_client(client) , m_openingFrontend(false) , m_cssAgent(new InspectorCSSAgent()) - , m_cssStore(new InspectorCSSStore(this)) , m_mainResourceIdentifier(0) , m_expiredConsoleMessageCount(0) - , m_groupLevel(0) , m_previousMessage(0) , m_settingsLoaded(false) , m_inspectorBackend(InspectorBackend::create(this)) @@ -155,7 +149,7 @@ InspectorController::InspectorController(Page* page, InspectorClient* client) , m_injectedScriptHost(InjectedScriptHost::create(this)) #if ENABLE(JAVASCRIPT_DEBUGGER) , m_attachDebuggerWhenShown(false) - , m_lastBreakpointId(0) + , m_hasXHRBreakpointWithEmptyURL(false) , m_profilerAgent(InspectorProfilerAgent::create(this)) #endif { @@ -330,12 +324,12 @@ void InspectorController::setConsoleMessagesEnabled(bool enabled) m_consoleMessages[i]->addToFrontend(m_frontend.get(), m_injectedScriptHost.get()); } -void InspectorController::addMessageToConsole(MessageSource source, MessageType type, MessageLevel level, const String& message, PassOwnPtr<ScriptArguments> arguments, PassOwnPtr<ScriptCallStack> callStack) +void InspectorController::addMessageToConsole(MessageSource source, MessageType type, MessageLevel level, const String& message, PassRefPtr<ScriptArguments> arguments, PassRefPtr<ScriptCallStack> callStack) { if (!enabled()) return; - addConsoleMessage(new ConsoleMessage(source, type, level, message, arguments, callStack, m_groupLevel)); + addConsoleMessage(new ConsoleMessage(source, type, level, message, arguments, callStack)); } void InspectorController::addMessageToConsole(MessageSource source, MessageType type, MessageLevel level, const String& message, unsigned lineNumber, const String& sourceID) @@ -343,7 +337,7 @@ void InspectorController::addMessageToConsole(MessageSource source, MessageType if (!enabled()) return; - addConsoleMessage(new ConsoleMessage(source, type, level, message, lineNumber, sourceID, m_groupLevel)); + addConsoleMessage(new ConsoleMessage(source, type, level, message, lineNumber, sourceID)); } void InspectorController::addConsoleMessage(PassOwnPtr<ConsoleMessage> consoleMessage) @@ -373,7 +367,6 @@ void InspectorController::clearConsoleMessages() m_consoleMessages.clear(); m_expiredConsoleMessageCount = 0; m_previousMessage = 0; - m_groupLevel = 0; m_injectedScriptHost->releaseWrapperObjectGroup(0 /* release the group in all scripts */, "console"); if (m_domAgent) m_domAgent->releaseDanglingNodes(); @@ -381,21 +374,14 @@ void InspectorController::clearConsoleMessages() m_frontend->consoleMessagesCleared(); } -void InspectorController::startGroup(PassOwnPtr<ScriptArguments> arguments, PassOwnPtr<ScriptCallStack> callStack, bool collapsed) +void InspectorController::startGroup(PassRefPtr<ScriptArguments> arguments, PassRefPtr<ScriptCallStack> callStack, bool collapsed) { - ++m_groupLevel; - - addConsoleMessage(new ConsoleMessage(JSMessageSource, collapsed ? StartGroupCollapsedMessageType : StartGroupMessageType, LogMessageLevel, "", arguments, callStack, m_groupLevel)); + addConsoleMessage(new ConsoleMessage(JSMessageSource, collapsed ? StartGroupCollapsedMessageType : StartGroupMessageType, LogMessageLevel, "", arguments, callStack)); } void InspectorController::endGroup(MessageSource source, unsigned lineNumber, const String& sourceURL) { - if (!m_groupLevel) - return; - - --m_groupLevel; - - addConsoleMessage(new ConsoleMessage(source, EndGroupMessageType, LogMessageLevel, String(), lineNumber, sourceURL, m_groupLevel)); + addConsoleMessage(new ConsoleMessage(source, EndGroupMessageType, LogMessageLevel, String(), lineNumber, sourceURL)); } void InspectorController::markTimeline(const String& message) @@ -484,7 +470,7 @@ void InspectorController::connectFrontend() m_openingFrontend = false; releaseFrontendLifetimeAgents(); m_frontend = new InspectorFrontend(m_client); - m_domAgent = InspectorDOMAgent::create(m_cssStore.get(), m_frontend.get()); + m_domAgent = InspectorDOMAgent::create(m_frontend.get()); m_resourceAgent = InspectorResourceAgent::create(m_inspectedPage, m_frontend.get()); m_cssAgent->setDOMAgent(m_domAgent.get()); @@ -575,7 +561,6 @@ void InspectorController::disconnectFrontend() bool debuggerWasEnabled = debuggerEnabled(); disableDebugger(); m_attachDebuggerWhenShown = debuggerWasEnabled; - clearNativeBreakpoints(); #endif setSearchingForNode(false); unbindAllResources(); @@ -590,6 +575,7 @@ void InspectorController::disconnectFrontend() releaseFrontendLifetimeAgents(); m_timelineAgent.clear(); + m_extraHeaders.clear(); } void InspectorController::releaseFrontendLifetimeAgents() @@ -653,7 +639,7 @@ void InspectorController::populateScriptObjects() for (DOMStorageResourcesMap::iterator it = m_domStorageResources.begin(); it != domStorageEnd; ++it) it->second->bind(m_frontend.get()); #endif -#if ENABLE(WORKERS) +#if ENABLE(JAVASCRIPT_DEBUGGER) && ENABLE(WORKERS) WorkersMap::iterator workersEnd = m_workers.end(); for (WorkersMap::iterator it = m_workers.begin(); it != workersEnd; ++it) { InspectorWorkerResource* worker = it->second.get(); @@ -732,10 +718,10 @@ void InspectorController::didCommitLoad(DocumentLoader* loader) m_counts.clear(); #if ENABLE(JAVASCRIPT_DEBUGGER) - if (m_debuggerAgent) + if (m_debuggerAgent) { m_debuggerAgent->clearForPageNavigation(); - - clearNativeBreakpoints(); + restoreStickyBreakpoints(); + } #endif #if ENABLE(JAVASCRIPT_DEBUGGER) && USE(JSC) @@ -747,7 +733,6 @@ void InspectorController::didCommitLoad(DocumentLoader* loader) // resources are cleared so that it has a chance to unbind them. unbindAllResources(); - m_cssStore->reset(); if (m_frontend) { m_frontend->reset(); m_domAgent->reset(); @@ -839,15 +824,21 @@ void InspectorController::willSendRequest(unsigned long identifier, ResourceRequ if (!enabled()) return; - // Only enable load timing and raw headers if front-end is attached, as otherwise we may produce overhead. - // permissions to fetch the headers. + request.setReportLoadTiming(true); + if (m_frontend) { - request.setReportLoadTiming(true); + // Only enable raw headers if front-end is attached, as otherwise we may lack + // permissions to fetch the headers. request.setReportRawHeaders(true); + + if (m_extraHeaders) { + HTTPHeaderMap::const_iterator end = m_extraHeaders->end(); + for (HTTPHeaderMap::const_iterator it = m_extraHeaders->begin(); it != end; ++it) + request.setHTTPHeaderField(it->first, it->second); + } } bool isMainResource = m_mainResourceIdentifier == identifier; - if (m_timelineAgent) m_timelineAgent->willSendResourceRequest(identifier, isMainResource, request); @@ -874,7 +865,7 @@ void InspectorController::didReceiveResponse(unsigned long identifier, DocumentL if (response.httpStatusCode() >= 400) { String message = makeString("Failed to load resource: the server responded with a status of ", String::number(response.httpStatusCode()), " (", response.httpStatusText(), ')'); - addMessageToConsole(OtherMessageSource, LogMessageType, ErrorMessageLevel, message, 0, response.url().string()); + addConsoleMessage(new ConsoleMessage(OtherMessageSource, NetworkErrorMessageType, ErrorMessageLevel, message, response.url().string(), identifier)); } } @@ -910,7 +901,7 @@ void InspectorController::didFailLoading(unsigned long identifier, const Resourc String message = "Failed to load resource"; if (!error.localizedDescription().isEmpty()) message += ": " + error.localizedDescription(); - addMessageToConsole(OtherMessageSource, LogMessageType, ErrorMessageLevel, message, 0, error.failingURL()); + addConsoleMessage(new ConsoleMessage(OtherMessageSource, NetworkErrorMessageType, ErrorMessageLevel, message, error.failingURL(), identifier)); if (m_resourceAgent) m_resourceAgent->didFailLoading(identifier, error); @@ -1006,6 +997,7 @@ void InspectorController::postWorkerNotificationToFrontend(const InspectorWorker { if (!m_frontend) return; +#if ENABLE(JAVASCRIPT_DEBUGGER) switch (action) { case InspectorController::WorkerCreated: m_frontend->didCreateWorker(worker.id(), worker.url(), worker.isSharedWorker()); @@ -1014,6 +1006,7 @@ void InspectorController::postWorkerNotificationToFrontend(const InspectorWorker m_frontend->didDestroyWorker(worker.id()); break; } +#endif } void InspectorController::didCreateWorker(intptr_t id, const String& url, bool isSharedWorker) @@ -1355,6 +1348,7 @@ void InspectorController::enableDebuggerFromFrontend(bool always) ASSERT(m_inspectedPage); m_debuggerAgent = InspectorDebuggerAgent::create(this, m_frontend.get()); + restoreStickyBreakpoints(); m_frontend->debuggerWasEnabled(); } @@ -1399,82 +1393,118 @@ void InspectorController::resume() m_debuggerAgent->resume(); } -void InspectorController::setNativeBreakpoint(PassRefPtr<InspectorObject> breakpoint, String* breakpointId) +void InspectorController::setStickyBreakpoints(PassRefPtr<InspectorObject> breakpoints) +{ + m_state->setObject(InspectorState::stickyBreakpoints, breakpoints); +} + +void InspectorController::restoreStickyBreakpoints() { - *breakpointId = ""; + m_eventListenerBreakpoints.clear(); + m_XHRBreakpoints.clear(); + m_hasXHRBreakpointWithEmptyURL = false; + + RefPtr<InspectorObject> allBreakpoints = m_state->getObject(InspectorState::stickyBreakpoints); + KURL url = m_inspectedPage->mainFrame()->loader()->url(); + url.removeFragmentIdentifier(); + RefPtr<InspectorArray> breakpoints = allBreakpoints->getArray(url); + if (!breakpoints) + return; + for (unsigned i = 0; i < breakpoints->length(); ++i) + restoreStickyBreakpoint(breakpoints->get(i)->asObject()); +} + +void InspectorController::restoreStickyBreakpoint(PassRefPtr<InspectorObject> breakpoint) +{ + DEFINE_STATIC_LOCAL(String, eventListenerBreakpointType, ("EventListener")); + DEFINE_STATIC_LOCAL(String, javaScriptBreakpointType, ("JS")); + DEFINE_STATIC_LOCAL(String, xhrBreakpointType, ("XHR")); + + if (!breakpoint) + return; String type; if (!breakpoint->getString("type", &type)) return; + bool enabled; + if (!breakpoint->getBoolean("enabled", &enabled)) + return; RefPtr<InspectorObject> condition = breakpoint->getObject("condition"); if (!condition) return; - if (type == xhrNativeBreakpointType) { - String url; - if (!condition->getString("url", &url)) + + if (type == eventListenerBreakpointType) { + if (!enabled) return; - *breakpointId = String::number(++m_lastBreakpointId); - m_XHRBreakpoints.set(*breakpointId, url); - m_nativeBreakpoints.set(*breakpointId, type); - } else if (type == eventListenerNativeBreakpointType) { String eventName; - if (!condition->getString("eventName", &eventName)) - return; - if (m_eventListenerBreakpoints.contains(eventName)) + if (condition->getString("eventName", &eventName)) + setEventListenerBreakpoint(eventName); + } else if (type == javaScriptBreakpointType) { + String url; + if (!condition->getString("url", &url)) return; - *breakpointId = eventName; - m_eventListenerBreakpoints.add(eventName); - m_nativeBreakpoints.set(*breakpointId, type); - } else if (type == domNativeBreakpointType) { - if (!m_domAgent) + double lineNumber; + if (!condition->getNumber("lineNumber", &lineNumber)) return; - double nodeIdNumber; - if (!condition->getNumber("nodeId", &nodeIdNumber)) + String javaScriptCondition; + if (!condition->getString("condition", &javaScriptCondition)) return; - double domBreakpointTypeNumber; - if (!condition->getNumber("type", &domBreakpointTypeNumber)) + if (m_debuggerAgent) + m_debuggerAgent->setStickyBreakpoint(url, static_cast<unsigned>(lineNumber), javaScriptCondition, enabled); + } else if (type == xhrBreakpointType) { + if (!enabled) return; - long nodeId = (long) nodeIdNumber; - long domBreakpointType = (long) domBreakpointTypeNumber; - *breakpointId = m_domAgent->setDOMBreakpoint(nodeId, domBreakpointType); - if (!breakpointId->isEmpty()) - m_nativeBreakpoints.set(*breakpointId, type); + String url; + if (condition->getString("url", &url)) + setXHRBreakpoint(url); } } -void InspectorController::removeNativeBreakpoint(const String& breakpointId) +void InspectorController::setEventListenerBreakpoint(const String& eventName) { - String type = m_nativeBreakpoints.take(breakpointId); - if (type == xhrNativeBreakpointType) - m_XHRBreakpoints.remove(breakpointId); - else if (type == eventListenerNativeBreakpointType) - m_eventListenerBreakpoints.remove(breakpointId); - else if (type == domNativeBreakpointType) { - if (m_domAgent) - m_domAgent->removeDOMBreakpoint(breakpointId); - } + m_eventListenerBreakpoints.add(eventName); } -String InspectorController::findEventListenerBreakpoint(const String& eventName) +void InspectorController::removeEventListenerBreakpoint(const String& eventName) { - return m_eventListenerBreakpoints.contains(eventName) ? eventName : ""; + m_eventListenerBreakpoints.remove(eventName); } -String InspectorController::findXHRBreakpoint(const String& url) +bool InspectorController::hasEventListenerBreakpoint(const String& eventName) { - for (HashMap<String, String>::iterator it = m_XHRBreakpoints.begin(); it != m_XHRBreakpoints.end(); ++it) { - if (url.contains(it->second)) - return it->first; - } - return ""; + return m_eventListenerBreakpoints.contains(eventName); } -void InspectorController::clearNativeBreakpoints() +void InspectorController::setXHRBreakpoint(const String& url) { - m_nativeBreakpoints.clear(); - m_eventListenerBreakpoints.clear(); - m_XHRBreakpoints.clear(); - m_lastBreakpointId = 0; + if (url.isEmpty()) + m_hasXHRBreakpointWithEmptyURL = true; + else + m_XHRBreakpoints.add(url); +} + +void InspectorController::removeXHRBreakpoint(const String& url) +{ + if (url.isEmpty()) + m_hasXHRBreakpointWithEmptyURL = false; + else + m_XHRBreakpoints.remove(url); } + +bool InspectorController::hasXHRBreakpoint(const String& url, String* breakpointURL) +{ + if (m_hasXHRBreakpointWithEmptyURL) { + *breakpointURL = ""; + return true; + } + for (HashSet<String>::iterator it = m_XHRBreakpoints.begin(); it != m_XHRBreakpoints.end(); ++it) { + if (url.contains(*it)) { + *breakpointURL = *it; + return true; + } + } + return false; +} + #endif void InspectorController::evaluateForTestInFrontend(long callId, const String& script) @@ -1496,26 +1526,6 @@ void InspectorController::didEvaluateForTestInFrontend(long callId, const String function.call(); } -#if ENABLE(JAVASCRIPT_DEBUGGER) -String InspectorController::breakpointsSettingKey() -{ - DEFINE_STATIC_LOCAL(String, keyPrefix, ("breakpoints:")); - return keyPrefix + InspectorDebuggerAgent::md5Base16(m_inspectedPage->mainFrame()->loader()->url().string()); -} - -PassRefPtr<InspectorValue> InspectorController::loadBreakpoints() -{ - String jsonString; - m_client->populateSetting(breakpointsSettingKey(), &jsonString); - return InspectorValue::parseJSON(jsonString); -} - -void InspectorController::saveBreakpoints(PassRefPtr<InspectorObject> breakpoints) -{ - m_client->storeSetting(breakpointsSettingKey(), breakpoints->toJSONString()); -} -#endif - static Path quadToPath(const FloatQuad& quad) { Path quadPath; @@ -1538,21 +1548,18 @@ static void drawOutlinedQuad(GraphicsContext& context, const FloatQuad& quad, co // of outline (because inflating a quad is hard) { context.save(); - context.addPath(quadPath); context.clipOut(quadPath); - context.addPath(quadPath); context.setStrokeThickness(outlineThickness); context.setStrokeColor(outlineColor, ColorSpaceDeviceRGB); - context.strokePath(); + context.strokePath(quadPath); context.restore(); } // Now do the fill - context.addPath(quadPath); context.setFillColor(fillColor, ColorSpaceDeviceRGB); - context.fillPath(); + context.fillPath(quadPath); } static void drawOutlinedQuadWithClip(GraphicsContext& context, const FloatQuad& quad, const FloatQuad& clipQuad, const Color& fillColor) @@ -1764,19 +1771,20 @@ void InspectorController::drawElementTitle(GraphicsContext& context, const IntRe void InspectorController::openInInspectedWindow(const String& url) { - ResourceRequest request; - FrameLoadRequest frameRequest(request, "_blank"); - bool created; Frame* mainFrame = m_inspectedPage->mainFrame(); + + FrameLoadRequest request(mainFrame->document()->securityOrigin(), ResourceRequest(), "_blank"); + + bool created; WindowFeatures windowFeatures; - Frame* newFrame = WebCore::createWindow(mainFrame, mainFrame, frameRequest, windowFeatures, created); + Frame* newFrame = WebCore::createWindow(mainFrame, mainFrame, request, windowFeatures, created); if (!newFrame) return; UserGestureIndicator indicator(DefinitelyProcessingUserGesture); newFrame->loader()->setOpener(mainFrame); newFrame->page()->setOpenedByDOM(); - newFrame->loader()->changeLocation(newFrame->loader()->completeURL(url), "", false, false); + newFrame->loader()->changeLocation(mainFrame->document()->securityOrigin(), newFrame->loader()->completeURL(url), "", false, false); } void InspectorController::count(const String& title, unsigned lineNumber, const String& sourceID) @@ -1858,6 +1866,18 @@ void InspectorController::reloadPage() m_inspectedPage->mainFrame()->navigationScheduler()->scheduleRefresh(); } +void InspectorController::setExtraHeaders(PassRefPtr<InspectorObject> headers) +{ + m_extraHeaders = adoptPtr(new HTTPHeaderMap()); + InspectorObject::const_iterator end = headers->end(); + for (InspectorObject::const_iterator it = headers->begin(); it != end; ++it) { + String value; + if (!it->second->asString(&value)) + continue; + m_extraHeaders->add(it->first, value); + } +} + } // namespace WebCore #endif // ENABLE(INSPECTOR) |