blob: 255f1d8fc5b3ebdcd1b30ac54a110b20a35f69b5 [file] [log] [blame]
/*
* Copyright (C) 2009 Apple Inc. All rights reserved.
* Copyright (C) 2009 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "InspectorFrontend.h"
#include "ConsoleMessage.h"
#include "Frame.h"
#include "InspectorController.h" // TODO(pfeldman): Extract SpecialPanels to remove include.
#include "InspectorJSONObject.h"
#include "Node.h"
#include "ScriptFunctionCall.h"
#include "ScriptObject.h"
#include "ScriptObjectQuarantine.h"
#include "ScriptState.h"
#include "ScriptString.h"
#include <wtf/OwnPtr.h>
#if ENABLE(JAVASCRIPT_DEBUGGER)
#include <parser/SourceCode.h>
#include <runtime/JSValue.h>
#include <runtime/UString.h>
#endif
namespace WebCore {
InspectorFrontend::InspectorFrontend(ScriptState* scriptState, ScriptObject webInspector)
: m_scriptState(scriptState)
, m_webInspector(webInspector)
{
}
InspectorFrontend::~InspectorFrontend()
{
m_webInspector = ScriptObject();
}
InspectorJSONObject InspectorFrontend::newInspectorJSONObject() {
return InspectorJSONObject::createNew(m_scriptState);
}
void InspectorFrontend::addMessageToConsole(const InspectorJSONObject& messageObj, const Vector<ScriptString>& frames, const Vector<ScriptValue> wrappedArguments, const String& message)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("addMessageToConsole"));
function->appendArgument(messageObj.scriptObject());
if (!frames.isEmpty()) {
for (unsigned i = 0; i < frames.size(); ++i)
function->appendArgument(frames[i]);
} else if (!wrappedArguments.isEmpty()) {
for (unsigned i = 0; i < wrappedArguments.size(); ++i)
function->appendArgument(wrappedArguments[i]);
} else
function->appendArgument(message);
function->call();
}
bool InspectorFrontend::addResource(long long identifier, const InspectorJSONObject& resourceObj)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("addResource"));
function->appendArgument(identifier);
function->appendArgument(resourceObj.scriptObject());
bool hadException = false;
function->call(hadException);
return !hadException;
}
bool InspectorFrontend::updateResource(long long identifier, const InspectorJSONObject& resourceObj)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("updateResource"));
function->appendArgument(identifier);
function->appendArgument(resourceObj.scriptObject());
bool hadException = false;
function->call(hadException);
return !hadException;
}
void InspectorFrontend::removeResource(long long identifier)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("removeResource"));
function->appendArgument(identifier);
function->call();
}
void InspectorFrontend::updateFocusedNode(Node* node)
{
ScriptObject quarantinedNode;
if (!getQuarantinedScriptObject(node, quarantinedNode))
return;
OwnPtr<ScriptFunctionCall> function(newFunctionCall("updateFocusedNode"));
function->appendArgument(quarantinedNode);
function->call();
}
void InspectorFrontend::setAttachedWindow(bool attached)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("setAttachedWindow"));
function->appendArgument(attached);
function->call();
}
void InspectorFrontend::inspectedWindowScriptObjectCleared(Frame* frame)
{
ScriptObject domWindow;
if (!getQuarantinedScriptObject(frame->domWindow(), domWindow))
return;
OwnPtr<ScriptFunctionCall> function(newFunctionCall("inspectedWindowCleared"));
function->appendArgument(domWindow);
function->call();
}
void InspectorFrontend::showPanel(int panel)
{
const char* showFunctionName;
switch (panel) {
case InspectorController::ConsolePanel:
showFunctionName = "showConsole";
break;
case InspectorController::DatabasesPanel:
showFunctionName = "showDatabasesPanel";
break;
case InspectorController::ElementsPanel:
showFunctionName = "showElementsPanel";
break;
case InspectorController::ProfilesPanel:
showFunctionName = "showProfilesPanel";
break;
case InspectorController::ResourcesPanel:
showFunctionName = "showResourcesPanel";
break;
case InspectorController::ScriptsPanel:
showFunctionName = "showScriptsPanel";
break;
default:
ASSERT_NOT_REACHED();
showFunctionName = 0;
}
if (showFunctionName)
callSimpleFunction(showFunctionName);
}
void InspectorFrontend::populateInterface()
{
callSimpleFunction("populateInterface");
}
void InspectorFrontend::reset()
{
callSimpleFunction("reset");
}
void InspectorFrontend::resourceTrackingWasEnabled()
{
callSimpleFunction("resourceTrackingWasEnabled");
}
void InspectorFrontend::resourceTrackingWasDisabled()
{
callSimpleFunction("resourceTrackingWasDisabled");
}
#if ENABLE(JAVASCRIPT_DEBUGGER)
void InspectorFrontend::attachDebuggerWhenShown()
{
callSimpleFunction("attachDebuggerWhenShown");
}
void InspectorFrontend::debuggerWasEnabled()
{
callSimpleFunction("debuggerWasEnabled");
}
void InspectorFrontend::debuggerWasDisabled()
{
callSimpleFunction("debuggerWasDisabled");
}
void InspectorFrontend::profilerWasEnabled()
{
callSimpleFunction("profilerWasEnabled");
}
void InspectorFrontend::profilerWasDisabled()
{
callSimpleFunction("profilerWasDisabled");
}
void InspectorFrontend::parsedScriptSource(const JSC::SourceCode& source)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("parsedScriptSource"));
function->appendArgument(JSC::UString(JSC::UString::from(source.provider()->asID())));
function->appendArgument(source.provider()->url());
function->appendArgument(JSC::UString(source.data(), source.length()));
function->appendArgument(source.firstLine());
function->call();
}
void InspectorFrontend::failedToParseScriptSource(const JSC::SourceCode& source, int errorLine, const JSC::UString& errorMessage)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("failedToParseScriptSource"));
function->appendArgument(source.provider()->url());
function->appendArgument(JSC::UString(source.data(), source.length()));
function->appendArgument(source.firstLine());
function->appendArgument(errorLine);
function->appendArgument(errorMessage);
function->call();
}
void InspectorFrontend::addProfile(const JSC::JSValue& profile)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("addProfile"));
function->appendArgument(profile);
function->call();
}
void InspectorFrontend::setRecordingProfile(bool isProfiling)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("setRecordingProfile"));
function->appendArgument(isProfiling);
function->call();
}
void InspectorFrontend::pausedScript()
{
callSimpleFunction("pausedScript");
}
void InspectorFrontend::resumedScript()
{
callSimpleFunction("resumedScript");
}
#endif
#if ENABLE(DATABASE)
bool InspectorFrontend::addDatabase(const InspectorJSONObject& dbObject)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("addDatabase"));
function->appendArgument(dbObject.scriptObject());
bool hadException = false;
function->call(hadException);
return !hadException;
}
#endif
#if ENABLE(DOM_STORAGE)
bool InspectorFrontend::addDOMStorage(const InspectorJSONObject& domStorageObj)
{
OwnPtr<ScriptFunctionCall> function(newFunctionCall("addDOMStorage"));
function->appendArgument(domStorageObj.scriptObject());
bool hadException = false;
function->call(hadException);
return !hadException;
}
#endif
PassOwnPtr<ScriptFunctionCall> InspectorFrontend::newFunctionCall(const String& functionName)
{
ScriptFunctionCall* function = new ScriptFunctionCall(m_scriptState, m_webInspector, "dispatch");
function->appendArgument(functionName);
return function;
}
void InspectorFrontend::callSimpleFunction(const String& functionName)
{
ScriptFunctionCall function(m_scriptState, m_webInspector, "dispatch");
function.appendArgument(functionName);
function.call();
}
} // namespace WebCore