1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* 2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (c) 2010, Google Inc. All rights reserved. 3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Redistribution and use in source and binary forms, with or without 5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modification, are permitted provided that the following conditions are 6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * met: 7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * * Redistributions of source code must retain the above copyright 9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * notice, this list of conditions and the following disclaimer. 10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * * Redistributions in binary form must reproduce the above 11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * copyright notice, this list of conditions and the following disclaimer 12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * in the documentation and/or other materials provided with the 13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * distribution. 14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * * Neither the name of Google Inc. nor the names of its 15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * contributors may be used to endorse or promote products derived from 16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * this software without specific prior written permission. 17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */ 30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h" 32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "JavaScriptCallFrame.h" 33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(JAVASCRIPT_DEBUGGER) 35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "V8Binding.h" 37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebCore { 39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJavaScriptCallFrame::JavaScriptCallFrame(v8::Handle<v8::Context> debuggerContext, v8::Handle<v8::Object> callFrame) 41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block : m_debuggerContext(debuggerContext) 42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_callFrame(callFrame) 43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJavaScriptCallFrame::~JavaScriptCallFrame() 47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJavaScriptCallFrame* JavaScriptCallFrame::caller() 51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_caller) { 53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::HandleScope handleScope; 54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Context::Scope contextScope(m_debuggerContext.get()); 55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Handle<v8::Value> callerFrame = m_callFrame.get()->Get(v8String("caller")); 56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!callerFrame->IsObject()) 57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_caller = JavaScriptCallFrame::create(m_debuggerContext.get(), v8::Handle<v8::Object>::Cast(callerFrame)); 59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_caller.get(); 61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint JavaScriptCallFrame::sourceID() const 64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::HandleScope handleScope; 66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Context::Scope contextScope(m_debuggerContext.get()); 67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Handle<v8::Value> result = m_callFrame.get()->Get(v8String("sourceID")); 68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (result->IsInt32()) 69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return result->Int32Value(); 70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint JavaScriptCallFrame::line() const 74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::HandleScope handleScope; 76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Context::Scope contextScope(m_debuggerContext.get()); 77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Handle<v8::Value> result = m_callFrame.get()->Get(v8String("line")); 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (result->IsInt32()) 79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return result->Int32Value(); 80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return 0; 81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 83ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochint JavaScriptCallFrame::column() const 84ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 85ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch v8::HandleScope handleScope; 86ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch v8::Context::Scope contextScope(m_debuggerContext.get()); 87ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch v8::Handle<v8::Value> result = m_callFrame.get()->Get(v8String("column")); 88ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (result->IsInt32()) 89ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return result->Int32Value(); 90ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return 0; 91ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 92ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockString JavaScriptCallFrame::functionName() const 94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::HandleScope handleScope; 96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Context::Scope contextScope(m_debuggerContext.get()); 97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Handle<v8::Value> result = m_callFrame.get()->Get(v8String("functionName")); 9806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return toWebCoreStringWithNullOrUndefinedCheck(result); 99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockv8::Handle<v8::Value> JavaScriptCallFrame::scopeChain() const 102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Handle<v8::Array> scopeChain = v8::Handle<v8::Array>::Cast(m_callFrame.get()->Get(v8String("scopeChain"))); 104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Handle<v8::Array> result = v8::Array::New(scopeChain->Length()); 105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block for (uint32_t i = 0; i < scopeChain->Length(); i++) 106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block result->Set(i, scopeChain->Get(i)); 107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return result; 108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint JavaScriptCallFrame::scopeType(int scopeIndex) const 111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Handle<v8::Array> scopeType = v8::Handle<v8::Array>::Cast(m_callFrame.get()->Get(v8String("scopeType"))); 113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return scopeType->Get(scopeIndex)->Int32Value(); 114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockv8::Handle<v8::Value> JavaScriptCallFrame::thisObject() const 117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_callFrame.get()->Get(v8String("thisObject")); 119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockv8::Handle<v8::Value> JavaScriptCallFrame::evaluate(const String& expression) 122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Handle<v8::Function> evalFunction = v8::Handle<v8::Function>::Cast(m_callFrame.get()->Get(v8String("evaluate"))); 124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Handle<v8::Value> argv[] = { v8String(expression) }; 125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return evalFunction->Call(m_callFrame.get(), 1, argv); 126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} // namespace WebCore 129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif // ENABLE(JAVASCRIPT_DEBUGGER) 131