summaryrefslogtreecommitdiffstats
path: root/WebCore/inspector/InspectorController.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/inspector/InspectorController.cpp')
-rw-r--r--WebCore/inspector/InspectorController.cpp248
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)