/* * 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 "Node.h" #include "ScriptFunctionCall.h" #include "ScriptObject.h" #include "ScriptObjectQuarantine.h" #include "ScriptState.h" #include "ScriptString.h" #include #if ENABLE(JAVASCRIPT_DEBUGGER) #include #include #include #endif namespace WebCore { InspectorFrontend::InspectorFrontend(ScriptState* scriptState, ScriptObject webInspector) : m_scriptState(scriptState) , m_webInspector(webInspector) { } InspectorFrontend::~InspectorFrontend() { m_webInspector = ScriptObject(); } ScriptArray InspectorFrontend::newScriptArray() { return ScriptArray::createNew(m_scriptState); } ScriptObject InspectorFrontend::newScriptObject() { return ScriptObject::createNew(m_scriptState); } void InspectorFrontend::addMessageToConsole(const ScriptObject& messageObj, const Vector& frames, const Vector wrappedArguments, const String& message) { OwnPtr function(newFunctionCall("addMessageToConsole")); function->appendArgument(messageObj); 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 ScriptObject& resourceObj) { OwnPtr function(newFunctionCall("addResource")); function->appendArgument(identifier); function->appendArgument(resourceObj); bool hadException = false; function->call(hadException); return !hadException; } bool InspectorFrontend::updateResource(long long identifier, const ScriptObject& resourceObj) { OwnPtr function(newFunctionCall("updateResource")); function->appendArgument(identifier); function->appendArgument(resourceObj); bool hadException = false; function->call(hadException); return !hadException; } void InspectorFrontend::removeResource(long long identifier) { OwnPtr function(newFunctionCall("removeResource")); function->appendArgument(identifier); function->call(); } void InspectorFrontend::updateFocusedNode(Node* node) { ScriptObject quarantinedNode; if (!getQuarantinedScriptObject(node, quarantinedNode)) return; OwnPtr function(newFunctionCall("updateFocusedNode")); function->appendArgument(quarantinedNode); function->call(); } void InspectorFrontend::setAttachedWindow(bool attached) { OwnPtr function(newFunctionCall("setAttachedWindow")); function->appendArgument(attached); function->call(); } void InspectorFrontend::inspectedWindowScriptObjectCleared(Frame* frame) { ScriptObject domWindow; if (!getQuarantinedScriptObject(frame->domWindow(), domWindow)) return; OwnPtr 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 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 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 function(newFunctionCall("addProfile")); function->appendArgument(profile); function->call(); } void InspectorFrontend::setRecordingProfile(bool isProfiling) { OwnPtr 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 ScriptObject& dbObject) { OwnPtr function(newFunctionCall("addDatabase")); function->appendArgument(dbObject); bool hadException = false; function->call(hadException); return !hadException; } #endif #if ENABLE(DOM_STORAGE) bool InspectorFrontend::addDOMStorage(const ScriptObject& domStorageObj) { OwnPtr function(newFunctionCall("addDOMStorage")); function->appendArgument(domStorageObj); bool hadException = false; function->call(hadException); return !hadException; } #endif void InspectorFrontend::setDocumentElement(const ScriptObject& root) { OwnPtr function(newFunctionCall("setDocumentElement")); function->appendArgument(root); function->call(); } void InspectorFrontend::setChildNodes(int parentId, const ScriptArray& nodes) { OwnPtr function(newFunctionCall("setChildNodes")); function->appendArgument(parentId); function->appendArgument(nodes); function->call(); } void InspectorFrontend::hasChildrenUpdated(int id, bool newValue) { OwnPtr function(newFunctionCall("hasChildrenUpdated")); function->appendArgument(id); function->appendArgument(newValue); function->call(); } void InspectorFrontend::childNodeInserted(int parentId, int prevId, const ScriptObject& node) { OwnPtr function(newFunctionCall("childNodeInserted")); function->appendArgument(parentId); function->appendArgument(prevId); function->appendArgument(node); function->call(); } void InspectorFrontend::childNodeRemoved(int parentId, int id) { OwnPtr function(newFunctionCall("childNodeRemoved")); function->appendArgument(parentId); function->appendArgument(id); function->call(); } void InspectorFrontend::attributesUpdated(int id, const ScriptArray& attributes) { OwnPtr function(newFunctionCall("attributesUpdated")); function->appendArgument(id); function->appendArgument(attributes); function->call(); } void InspectorFrontend::didGetChildNodes(int callId) { OwnPtr function(newFunctionCall("didGetChildNodes")); function->appendArgument(callId); function->call(); } void InspectorFrontend::didApplyDomChange(int callId, bool success) { OwnPtr function(newFunctionCall("didApplyDomChange")); function->appendArgument(callId); function->appendArgument(success); function->call(); } PassOwnPtr 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