1/* 2 * Copyright (c) 2011 Google Inc. All rights reserved. 3 * Copyright (c) 2013 Apple Inc. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * * Redistributions in binary form must reproduce the above 12 * copyright notice, this list of conditions and the following disclaimer 13 * in the documentation and/or other materials provided with the 14 * distribution. 15 * * Neither the name of Google Inc. nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#include "config.h" 33#include "WorkerScriptDebugServer.h" 34 35#if ENABLE(INSPECTOR) 36 37#include "JSDOMBinding.h" 38#include "Timer.h" 39#include "WorkerDebuggerAgent.h" 40#include "WorkerGlobalScope.h" 41#include "WorkerRunLoop.h" 42#include "WorkerThread.h" 43#include <runtime/VM.h> 44#include <wtf/PassOwnPtr.h> 45 46using namespace Inspector; 47 48namespace WebCore { 49 50WorkerScriptDebugServer::WorkerScriptDebugServer(WorkerGlobalScope* context, const String& mode) 51 : ScriptDebugServer(true) 52 , m_workerGlobalScope(context) 53 , m_debuggerTaskMode(mode) 54{ 55} 56 57void WorkerScriptDebugServer::addListener(ScriptDebugListener* listener) 58{ 59 if (!listener) 60 return; 61 62 bool wasEmpty = m_listeners.isEmpty(); 63 m_listeners.add(listener); 64 65 if (wasEmpty) { 66 m_workerGlobalScope->script()->attachDebugger(this); 67 recompileAllJSFunctions(); 68 } 69} 70 71void WorkerScriptDebugServer::removeListener(ScriptDebugListener* listener, bool skipRecompile) 72{ 73 if (!listener) 74 return; 75 76 m_listeners.remove(listener); 77 78 if (m_listeners.isEmpty()) { 79 m_workerGlobalScope->script()->detachDebugger(this); 80 if (!skipRecompile) 81 recompileAllJSFunctions(); 82 } 83} 84 85void WorkerScriptDebugServer::recompileAllJSFunctions() 86{ 87 JSC::VM& vm = m_workerGlobalScope->script()->vm(); 88 89 JSC::JSLockHolder lock(vm); 90 JSC::Debugger::recompileAllJSFunctions(&vm); 91} 92 93void WorkerScriptDebugServer::runEventLoopWhilePaused() 94{ 95 TimerBase::fireTimersInNestedEventLoop(); 96 97 MessageQueueWaitResult result; 98 do { 99 result = m_workerGlobalScope->thread().runLoop().runInMode(m_workerGlobalScope, m_debuggerTaskMode); 100 // Keep waiting until execution is resumed. 101 } while (result != MessageQueueTerminated && !m_doneProcessingDebuggerEvents); 102} 103 104void WorkerScriptDebugServer::reportException(JSC::ExecState* exec, JSC::JSValue exception) const 105{ 106 WebCore::reportException(exec, exception); 107} 108 109void WorkerScriptDebugServer::interruptAndRunTask(PassOwnPtr<ScriptDebugServer::Task>) 110{ 111} 112 113} // namespace WebCore 114 115#endif // ENABLE(INSPECTOR) 116