mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2010 Apple Inc. All rights reserved. |
| 3 | * Copyright (C) 2010 Google 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 |
| 7 | * are met: |
| 8 | * |
| 9 | * 1. Redistributions of source code must retain the above copyright |
| 10 | * notice, this list of conditions and the following disclaimer. |
| 11 | * 2. Redistributions in binary form must reproduce the above copyright |
| 12 | * notice, this list of conditions and the following disclaimer in the |
| 13 | * documentation and/or other materials provided with the distribution. |
| 14 | * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of |
| 15 | * its contributors may be used to endorse or promote products derived |
| 16 | * from this software without specific prior written permission. |
| 17 | * |
| 18 | * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY |
| 19 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| 20 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| 21 | * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
| 22 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| 23 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| 24 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| 25 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 26 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 27 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 28 | */ |
| 29 | |
| 30 | #include "config.h" |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 31 | |
abecsi@webkit.org | 6234000 | 2010-11-24 14:38:47 +0000 | [diff] [blame] | 32 | #if ENABLE(JAVASCRIPT_DEBUGGER) && ENABLE(INSPECTOR) |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 33 | |
yurys@chromium.org | 83110c8 | 2012-03-15 16:44:09 +0000 | [diff] [blame] | 34 | #include "InspectorProfilerAgent.h" |
| 35 | |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 36 | #include "Console.h" |
mkwst@chromium.org | 236e898 | 2012-12-11 16:10:06 +0000 | [diff] [blame] | 37 | #include "ConsoleAPITypes.h" |
| 38 | #include "ConsoleTypes.h" |
yurys@chromium.org | a1270f8 | 2012-02-08 15:51:53 +0000 | [diff] [blame] | 39 | #include "InjectedScript.h" |
loislo@chromium.org | f59b030 | 2012-02-16 14:23:51 +0000 | [diff] [blame] | 40 | #include "InjectedScriptHost.h" |
yurys@chromium.org | 7382e72 | 2011-01-14 14:57:21 +0000 | [diff] [blame] | 41 | #include "InspectorConsoleAgent.h" |
loislo@chromium.org | b3d4ff4 | 2010-08-24 12:26:55 +0000 | [diff] [blame] | 42 | #include "InspectorFrontend.h" |
yurys@chromium.org | 0928fb9 | 2011-03-12 07:21:34 +0000 | [diff] [blame] | 43 | #include "InspectorState.h" |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 44 | #include "InspectorValues.h" |
yurys@chromium.org | 29626f8 | 2011-03-04 15:15:45 +0000 | [diff] [blame] | 45 | #include "InstrumentingAgents.h" |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 46 | #include "KURL.h" |
| 47 | #include "Page.h" |
yurys@chromium.org | 7f1e51a | 2011-03-30 15:26:22 +0000 | [diff] [blame] | 48 | #include "PageScriptDebugServer.h" |
mnaganov@chromium.org | 06106af | 2010-08-26 18:27:24 +0000 | [diff] [blame] | 49 | #include "ScriptHeapSnapshot.h" |
yurys@chromium.org | a1270f8 | 2012-02-08 15:51:53 +0000 | [diff] [blame] | 50 | #include "ScriptObject.h" |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 51 | #include "ScriptProfile.h" |
| 52 | #include "ScriptProfiler.h" |
commit-queue@webkit.org | 77a038f | 2012-09-25 01:05:43 +0000 | [diff] [blame] | 53 | #include "WorkerScriptDebugServer.h" |
caseq@chromium.org | 5249d11 | 2012-12-18 11:43:35 +0000 | [diff] [blame] | 54 | #include <wtf/CurrentTime.h> |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 55 | #include <wtf/OwnPtr.h> |
zimmermann@webkit.org | bbfe2a5 | 2010-10-14 19:48:45 +0000 | [diff] [blame] | 56 | #include <wtf/text/StringConcatenate.h> |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 57 | |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 58 | namespace WebCore { |
| 59 | |
yurys@chromium.org | 0928fb9 | 2011-03-12 07:21:34 +0000 | [diff] [blame] | 60 | namespace ProfilerAgentState { |
| 61 | static const char userInitiatedProfiling[] = "userInitiatedProfiling"; |
| 62 | static const char profilerEnabled[] = "profilerEnabled"; |
yurys@chromium.org | 9b845a1 | 2013-02-20 12:15:51 +0000 | [diff] [blame] | 63 | static const char profileHeadersRequested[] = "profileHeadersRequested"; |
yurys@chromium.org | 0928fb9 | 2011-03-12 07:21:34 +0000 | [diff] [blame] | 64 | } |
| 65 | |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 66 | static const char* const UserInitiatedProfileName = "org.webkit.profiles.user-initiated"; |
| 67 | static const char* const CPUProfileType = "CPU"; |
mnaganov@chromium.org | 06106af | 2010-08-26 18:27:24 +0000 | [diff] [blame] | 68 | static const char* const HeapProfileType = "HEAP"; |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 69 | |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 70 | |
| 71 | class PageProfilerAgent : public InspectorProfilerAgent { |
| 72 | public: |
apavlov@chromium.org | c7e1433 | 2012-12-25 09:00:28 +0000 | [diff] [blame] | 73 | PageProfilerAgent(InstrumentingAgents* instrumentingAgents, InspectorConsoleAgent* consoleAgent, Page* inspectedPage, InspectorCompositeState* state, InjectedScriptManager* injectedScriptManager) |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 74 | : InspectorProfilerAgent(instrumentingAgents, consoleAgent, state, injectedScriptManager), m_inspectedPage(inspectedPage) { } |
| 75 | virtual ~PageProfilerAgent() { } |
| 76 | |
| 77 | private: |
commit-queue@webkit.org | 77a038f | 2012-09-25 01:05:43 +0000 | [diff] [blame] | 78 | virtual void recompileScript() |
| 79 | { |
| 80 | PageScriptDebugServer::shared().recompileAllJSFunctionsSoon(); |
| 81 | } |
| 82 | |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 83 | virtual void startProfiling(const String& title) |
| 84 | { |
| 85 | ScriptProfiler::startForPage(m_inspectedPage, title); |
| 86 | } |
| 87 | |
| 88 | virtual PassRefPtr<ScriptProfile> stopProfiling(const String& title) |
| 89 | { |
| 90 | return ScriptProfiler::stopForPage(m_inspectedPage, title); |
| 91 | } |
| 92 | |
| 93 | Page* m_inspectedPage; |
| 94 | }; |
| 95 | |
apavlov@chromium.org | c7e1433 | 2012-12-25 09:00:28 +0000 | [diff] [blame] | 96 | PassOwnPtr<InspectorProfilerAgent> InspectorProfilerAgent::create(InstrumentingAgents* instrumentingAgents, InspectorConsoleAgent* consoleAgent, Page* inspectedPage, InspectorCompositeState* inspectorState, InjectedScriptManager* injectedScriptManager) |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 97 | { |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 98 | return adoptPtr(new PageProfilerAgent(instrumentingAgents, consoleAgent, inspectedPage, inspectorState, injectedScriptManager)); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 99 | } |
| 100 | |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 101 | #if ENABLE(WORKERS) |
| 102 | class WorkerProfilerAgent : public InspectorProfilerAgent { |
| 103 | public: |
ch.dumez@sisa.samsung.com | 14792a6 | 2013-06-27 06:21:54 +0000 | [diff] [blame] | 104 | WorkerProfilerAgent(InstrumentingAgents* instrumentingAgents, InspectorConsoleAgent* consoleAgent, WorkerGlobalScope* workerGlobalScope, InspectorCompositeState* state, InjectedScriptManager* injectedScriptManager) |
| 105 | : InspectorProfilerAgent(instrumentingAgents, consoleAgent, state, injectedScriptManager), m_workerGlobalScope(workerGlobalScope) { } |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 106 | virtual ~WorkerProfilerAgent() { } |
| 107 | |
| 108 | private: |
commit-queue@webkit.org | 77a038f | 2012-09-25 01:05:43 +0000 | [diff] [blame] | 109 | virtual void recompileScript() { } |
| 110 | |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 111 | virtual void startProfiling(const String& title) |
| 112 | { |
ch.dumez@sisa.samsung.com | 14792a6 | 2013-06-27 06:21:54 +0000 | [diff] [blame] | 113 | ScriptProfiler::startForWorkerGlobalScope(m_workerGlobalScope, title); |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 114 | } |
| 115 | |
| 116 | virtual PassRefPtr<ScriptProfile> stopProfiling(const String& title) |
| 117 | { |
ch.dumez@sisa.samsung.com | 14792a6 | 2013-06-27 06:21:54 +0000 | [diff] [blame] | 118 | return ScriptProfiler::stopForWorkerGlobalScope(m_workerGlobalScope, title); |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 119 | } |
| 120 | |
ch.dumez@sisa.samsung.com | 14792a6 | 2013-06-27 06:21:54 +0000 | [diff] [blame] | 121 | WorkerGlobalScope* m_workerGlobalScope; |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 122 | }; |
| 123 | |
ch.dumez@sisa.samsung.com | 14792a6 | 2013-06-27 06:21:54 +0000 | [diff] [blame] | 124 | PassOwnPtr<InspectorProfilerAgent> InspectorProfilerAgent::create(InstrumentingAgents* instrumentingAgents, InspectorConsoleAgent* consoleAgent, WorkerGlobalScope* workerGlobalScope, InspectorCompositeState* inspectorState, InjectedScriptManager* injectedScriptManager) |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 125 | { |
ch.dumez@sisa.samsung.com | 14792a6 | 2013-06-27 06:21:54 +0000 | [diff] [blame] | 126 | return adoptPtr(new WorkerProfilerAgent(instrumentingAgents, consoleAgent, workerGlobalScope, inspectorState, injectedScriptManager)); |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 127 | } |
| 128 | #endif |
| 129 | |
apavlov@chromium.org | c7e1433 | 2012-12-25 09:00:28 +0000 | [diff] [blame] | 130 | InspectorProfilerAgent::InspectorProfilerAgent(InstrumentingAgents* instrumentingAgents, InspectorConsoleAgent* consoleAgent, InspectorCompositeState* inspectorState, InjectedScriptManager* injectedScriptManager) |
pfeldman@chromium.org | 2f44edb | 2011-11-29 14:43:10 +0000 | [diff] [blame] | 131 | : InspectorBaseAgent<InspectorProfilerAgent>("Profiler", instrumentingAgents, inspectorState) |
yurys@chromium.org | 29626f8 | 2011-03-04 15:15:45 +0000 | [diff] [blame] | 132 | , m_consoleAgent(consoleAgent) |
mnaganov@chromium.org | 90b24e8 | 2011-10-17 13:21:12 +0000 | [diff] [blame] | 133 | , m_injectedScriptManager(injectedScriptManager) |
loislo@chromium.org | b3d4ff4 | 2010-08-24 12:26:55 +0000 | [diff] [blame] | 134 | , m_frontend(0) |
yurys@chromium.org | 591972a | 2011-01-27 14:03:18 +0000 | [diff] [blame] | 135 | , m_enabled(false) |
caseq@chromium.org | 5249d11 | 2012-12-18 11:43:35 +0000 | [diff] [blame] | 136 | , m_recordingCPUProfile(false) |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 137 | , m_currentUserInitiatedProfileNumber(-1) |
| 138 | , m_nextUserInitiatedProfileNumber(1) |
mnaganov@chromium.org | 06106af | 2010-08-26 18:27:24 +0000 | [diff] [blame] | 139 | , m_nextUserInitiatedHeapSnapshotNumber(1) |
caseq@chromium.org | 5249d11 | 2012-12-18 11:43:35 +0000 | [diff] [blame] | 140 | , m_profileNameIdleTimeMap(ScriptProfiler::currentProfileNameIdleTimeMap()) |
| 141 | , m_previousTaskEndTime(0.0) |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 142 | { |
yurys@chromium.org | 29626f8 | 2011-03-04 15:15:45 +0000 | [diff] [blame] | 143 | m_instrumentingAgents->setInspectorProfilerAgent(this); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 144 | } |
| 145 | |
| 146 | InspectorProfilerAgent::~InspectorProfilerAgent() |
| 147 | { |
yurys@chromium.org | 29626f8 | 2011-03-04 15:15:45 +0000 | [diff] [blame] | 148 | m_instrumentingAgents->setInspectorProfilerAgent(0); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 149 | } |
| 150 | |
joepeck@webkit.org | 379c8a1 | 2013-04-25 18:31:05 +0000 | [diff] [blame] | 151 | void InspectorProfilerAgent::addProfile(PassRefPtr<ScriptProfile> prpProfile, unsigned lineNumber, unsigned columnNumber, const String& sourceURL) |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 152 | { |
| 153 | RefPtr<ScriptProfile> profile = prpProfile; |
| 154 | m_profiles.add(profile->uid(), profile); |
yurys@chromium.org | 9b845a1 | 2013-02-20 12:15:51 +0000 | [diff] [blame] | 155 | if (m_frontend && m_state->getBoolean(ProfilerAgentState::profileHeadersRequested)) |
loislo@chromium.org | b3d4ff4 | 2010-08-24 12:26:55 +0000 | [diff] [blame] | 156 | m_frontend->addProfileHeader(createProfileHeader(*profile)); |
joepeck@webkit.org | 379c8a1 | 2013-04-25 18:31:05 +0000 | [diff] [blame] | 157 | addProfileFinishedMessageToConsole(profile, lineNumber, columnNumber, sourceURL); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 158 | } |
| 159 | |
joepeck@webkit.org | 379c8a1 | 2013-04-25 18:31:05 +0000 | [diff] [blame] | 160 | void InspectorProfilerAgent::addProfileFinishedMessageToConsole(PassRefPtr<ScriptProfile> prpProfile, unsigned lineNumber, unsigned columnNumber, const String& sourceURL) |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 161 | { |
mnaganov@chromium.org | 83d221f | 2011-01-21 14:41:54 +0000 | [diff] [blame] | 162 | if (!m_frontend) |
| 163 | return; |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 164 | RefPtr<ScriptProfile> profile = prpProfile; |
eustas@chromium.org | ea9efbb | 2013-02-21 11:39:17 +0000 | [diff] [blame] | 165 | String message = makeString(profile->title(), '#', String::number(profile->uid())); |
joepeck@webkit.org | 379c8a1 | 2013-04-25 18:31:05 +0000 | [diff] [blame] | 166 | m_consoleAgent->addMessageToConsole(ConsoleAPIMessageSource, ProfileEndMessageType, DebugMessageLevel, message, sourceURL, lineNumber, columnNumber); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 167 | } |
| 168 | |
joepeck@webkit.org | 379c8a1 | 2013-04-25 18:31:05 +0000 | [diff] [blame] | 169 | void InspectorProfilerAgent::addStartProfilingMessageToConsole(const String& title, unsigned lineNumber, unsigned columnNumber, const String& sourceURL) |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 170 | { |
mnaganov@chromium.org | 83d221f | 2011-01-21 14:41:54 +0000 | [diff] [blame] | 171 | if (!m_frontend) |
| 172 | return; |
joepeck@webkit.org | 379c8a1 | 2013-04-25 18:31:05 +0000 | [diff] [blame] | 173 | m_consoleAgent->addMessageToConsole(ConsoleAPIMessageSource, ProfileMessageType, DebugMessageLevel, title, sourceURL, lineNumber, columnNumber); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 174 | } |
| 175 | |
pfeldman@chromium.org | b35e687 | 2011-03-10 16:36:53 +0000 | [diff] [blame] | 176 | void InspectorProfilerAgent::collectGarbage(WebCore::ErrorString*) |
| 177 | { |
| 178 | ScriptProfiler::collectGarbage(); |
| 179 | } |
| 180 | |
loislo@chromium.org | ed5533c | 2012-05-05 06:52:38 +0000 | [diff] [blame] | 181 | PassRefPtr<TypeBuilder::Profiler::ProfileHeader> InspectorProfilerAgent::createProfileHeader(const ScriptProfile& profile) |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 182 | { |
loislo@chromium.org | ed5533c | 2012-05-05 06:52:38 +0000 | [diff] [blame] | 183 | return TypeBuilder::Profiler::ProfileHeader::create() |
| 184 | .setTypeId(TypeBuilder::Profiler::ProfileHeader::TypeId::CPU) |
| 185 | .setUid(profile.uid()) |
| 186 | .setTitle(profile.title()) |
| 187 | .release(); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 188 | } |
| 189 | |
loislo@chromium.org | ed5533c | 2012-05-05 06:52:38 +0000 | [diff] [blame] | 190 | PassRefPtr<TypeBuilder::Profiler::ProfileHeader> InspectorProfilerAgent::createSnapshotHeader(const ScriptHeapSnapshot& snapshot) |
mnaganov@chromium.org | 06106af | 2010-08-26 18:27:24 +0000 | [diff] [blame] | 191 | { |
loislo@chromium.org | ed5533c | 2012-05-05 06:52:38 +0000 | [diff] [blame] | 192 | RefPtr<TypeBuilder::Profiler::ProfileHeader> header = TypeBuilder::Profiler::ProfileHeader::create() |
| 193 | .setTypeId(TypeBuilder::Profiler::ProfileHeader::TypeId::HEAP) |
| 194 | .setUid(snapshot.uid()) |
| 195 | .setTitle(snapshot.title()); |
| 196 | header->setMaxJSObjectId(snapshot.maxSnapshotJSObjectId()); |
| 197 | return header.release(); |
mnaganov@chromium.org | 06106af | 2010-08-26 18:27:24 +0000 | [diff] [blame] | 198 | } |
| 199 | |
pfeldman@chromium.org | f988d46 | 2011-12-01 11:33:10 +0000 | [diff] [blame] | 200 | void InspectorProfilerAgent::causesRecompilation(ErrorString*, bool* result) |
| 201 | { |
| 202 | *result = ScriptProfiler::causesRecompilation(); |
| 203 | } |
| 204 | |
| 205 | void InspectorProfilerAgent::isSampling(ErrorString*, bool* result) |
| 206 | { |
| 207 | *result = ScriptProfiler::isSampling(); |
| 208 | } |
| 209 | |
| 210 | void InspectorProfilerAgent::hasHeapProfiler(ErrorString*, bool* result) |
| 211 | { |
| 212 | *result = ScriptProfiler::hasHeapProfiler(); |
| 213 | } |
| 214 | |
yurys@chromium.org | 0928fb9 | 2011-03-12 07:21:34 +0000 | [diff] [blame] | 215 | void InspectorProfilerAgent::enable(ErrorString*) |
| 216 | { |
| 217 | if (enabled()) |
| 218 | return; |
pfeldman@chromium.org | ccc8cd93 | 2011-11-28 14:41:48 +0000 | [diff] [blame] | 219 | m_state->setBoolean(ProfilerAgentState::profilerEnabled, true); |
yurys@chromium.org | 0928fb9 | 2011-03-12 07:21:34 +0000 | [diff] [blame] | 220 | enable(false); |
| 221 | } |
| 222 | |
| 223 | void InspectorProfilerAgent::disable(ErrorString*) |
| 224 | { |
pfeldman@chromium.org | ccc8cd93 | 2011-11-28 14:41:48 +0000 | [diff] [blame] | 225 | m_state->setBoolean(ProfilerAgentState::profilerEnabled, false); |
yurys@chromium.org | 0928fb9 | 2011-03-12 07:21:34 +0000 | [diff] [blame] | 226 | disable(); |
| 227 | } |
| 228 | |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 229 | void InspectorProfilerAgent::disable() |
| 230 | { |
| 231 | if (!m_enabled) |
| 232 | return; |
| 233 | m_enabled = false; |
yurys@chromium.org | 9b845a1 | 2013-02-20 12:15:51 +0000 | [diff] [blame] | 234 | m_state->setBoolean(ProfilerAgentState::profileHeadersRequested, false); |
commit-queue@webkit.org | 77a038f | 2012-09-25 01:05:43 +0000 | [diff] [blame] | 235 | recompileScript(); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 236 | } |
| 237 | |
| 238 | void InspectorProfilerAgent::enable(bool skipRecompile) |
| 239 | { |
| 240 | if (m_enabled) |
| 241 | return; |
| 242 | m_enabled = true; |
| 243 | if (!skipRecompile) |
commit-queue@webkit.org | 77a038f | 2012-09-25 01:05:43 +0000 | [diff] [blame] | 244 | recompileScript(); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 245 | } |
| 246 | |
| 247 | String InspectorProfilerAgent::getCurrentUserInitiatedProfileName(bool incrementProfileNumber) |
| 248 | { |
| 249 | if (incrementProfileNumber) |
| 250 | m_currentUserInitiatedProfileNumber = m_nextUserInitiatedProfileNumber++; |
| 251 | |
zimmermann@webkit.org | bbfe2a5 | 2010-10-14 19:48:45 +0000 | [diff] [blame] | 252 | return makeString(UserInitiatedProfileName, '.', String::number(m_currentUserInitiatedProfileNumber)); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 253 | } |
| 254 | |
loislo@chromium.org | ed5533c | 2012-05-05 06:52:38 +0000 | [diff] [blame] | 255 | void InspectorProfilerAgent::getProfileHeaders(ErrorString*, RefPtr<TypeBuilder::Array<TypeBuilder::Profiler::ProfileHeader> >& headers) |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 256 | { |
yurys@chromium.org | 9b845a1 | 2013-02-20 12:15:51 +0000 | [diff] [blame] | 257 | m_state->setBoolean(ProfilerAgentState::profileHeadersRequested, true); |
loislo@chromium.org | ed5533c | 2012-05-05 06:52:38 +0000 | [diff] [blame] | 258 | headers = TypeBuilder::Array<TypeBuilder::Profiler::ProfileHeader>::create(); |
commit-queue@webkit.org | 178f8e0 | 2012-04-05 13:25:04 +0000 | [diff] [blame] | 259 | |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 260 | ProfilesMap::iterator profilesEnd = m_profiles.end(); |
| 261 | for (ProfilesMap::iterator it = m_profiles.begin(); it != profilesEnd; ++it) |
benjamin@webkit.org | ee55405 | 2012-10-07 23:12:07 +0000 | [diff] [blame] | 262 | headers->addItem(createProfileHeader(*it->value)); |
mnaganov@chromium.org | 06106af | 2010-08-26 18:27:24 +0000 | [diff] [blame] | 263 | HeapSnapshotsMap::iterator snapshotsEnd = m_snapshots.end(); |
| 264 | for (HeapSnapshotsMap::iterator it = m_snapshots.begin(); it != snapshotsEnd; ++it) |
benjamin@webkit.org | ee55405 | 2012-10-07 23:12:07 +0000 | [diff] [blame] | 265 | headers->addItem(createSnapshotHeader(*it->value)); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 266 | } |
| 267 | |
mnaganov@chromium.org | af7ad7a | 2010-11-29 23:37:08 +0000 | [diff] [blame] | 268 | namespace { |
| 269 | |
| 270 | class OutputStream : public ScriptHeapSnapshot::OutputStream { |
| 271 | public: |
pfeldman@chromium.org | 7e420b5 | 2011-03-21 07:54:32 +0000 | [diff] [blame] | 272 | OutputStream(InspectorFrontend::Profiler* frontend, unsigned uid) |
mnaganov@chromium.org | af7ad7a | 2010-11-29 23:37:08 +0000 | [diff] [blame] | 273 | : m_frontend(frontend), m_uid(uid) { } |
| 274 | void Write(const String& chunk) { m_frontend->addHeapSnapshotChunk(m_uid, chunk); } |
| 275 | void Close() { m_frontend->finishHeapSnapshot(m_uid); } |
| 276 | private: |
yurys@chromium.org | 3fb1663 | 2011-03-03 05:43:34 +0000 | [diff] [blame] | 277 | InspectorFrontend::Profiler* m_frontend; |
pfeldman@chromium.org | 7e420b5 | 2011-03-21 07:54:32 +0000 | [diff] [blame] | 278 | int m_uid; |
mnaganov@chromium.org | af7ad7a | 2010-11-29 23:37:08 +0000 | [diff] [blame] | 279 | }; |
| 280 | |
| 281 | } // namespace |
| 282 | |
commit-queue@webkit.org | 24efed3 | 2013-01-17 18:50:59 +0000 | [diff] [blame] | 283 | void InspectorProfilerAgent::getCPUProfile(ErrorString* errorString, int rawUid, RefPtr<TypeBuilder::Profiler::CPUProfile>& profileObject) |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 284 | { |
yurys@chromium.org | c22f745 | 2012-02-06 07:39:40 +0000 | [diff] [blame] | 285 | unsigned uid = static_cast<unsigned>(rawUid); |
commit-queue@webkit.org | 24efed3 | 2013-01-17 18:50:59 +0000 | [diff] [blame] | 286 | ProfilesMap::iterator it = m_profiles.find(uid); |
| 287 | if (it == m_profiles.end()) { |
| 288 | *errorString = "Profile wasn't found"; |
| 289 | return; |
| 290 | } |
| 291 | profileObject = TypeBuilder::Profiler::CPUProfile::create(); |
| 292 | profileObject->setHead(it->value->buildInspectorObjectForHead()); |
commit-queue@webkit.org | 24efed3 | 2013-01-17 18:50:59 +0000 | [diff] [blame] | 293 | profileObject->setIdleTime(it->value->idleTime()); |
| 294 | } |
| 295 | |
| 296 | void InspectorProfilerAgent::getHeapSnapshot(ErrorString* errorString, int rawUid) |
| 297 | { |
| 298 | unsigned uid = static_cast<unsigned>(rawUid); |
| 299 | HeapSnapshotsMap::iterator it = m_snapshots.find(uid); |
| 300 | if (it == m_snapshots.end()) { |
| 301 | *errorString = "Profile wasn't found"; |
| 302 | return; |
| 303 | } |
| 304 | RefPtr<ScriptHeapSnapshot> snapshot = it->value; |
| 305 | if (m_frontend) { |
| 306 | OutputStream stream(m_frontend, uid); |
| 307 | snapshot->writeJSON(&stream); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 308 | } |
| 309 | } |
| 310 | |
yurys@chromium.org | c22f745 | 2012-02-06 07:39:40 +0000 | [diff] [blame] | 311 | void InspectorProfilerAgent::removeProfile(ErrorString*, const String& type, int rawUid) |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 312 | { |
yurys@chromium.org | c22f745 | 2012-02-06 07:39:40 +0000 | [diff] [blame] | 313 | unsigned uid = static_cast<unsigned>(rawUid); |
mnaganov@chromium.org | 06106af | 2010-08-26 18:27:24 +0000 | [diff] [blame] | 314 | if (type == CPUProfileType) { |
| 315 | if (m_profiles.contains(uid)) |
| 316 | m_profiles.remove(uid); |
| 317 | } else if (type == HeapProfileType) { |
| 318 | if (m_snapshots.contains(uid)) |
| 319 | m_snapshots.remove(uid); |
| 320 | } |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 321 | } |
| 322 | |
| 323 | void InspectorProfilerAgent::resetState() |
| 324 | { |
pfeldman@chromium.org | 6a1f952 | 2011-11-22 09:52:10 +0000 | [diff] [blame] | 325 | stop(); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 326 | m_profiles.clear(); |
mnaganov@chromium.org | 06106af | 2010-08-26 18:27:24 +0000 | [diff] [blame] | 327 | m_snapshots.clear(); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 328 | m_currentUserInitiatedProfileNumber = 1; |
| 329 | m_nextUserInitiatedProfileNumber = 1; |
mnaganov@chromium.org | 06106af | 2010-08-26 18:27:24 +0000 | [diff] [blame] | 330 | m_nextUserInitiatedHeapSnapshotNumber = 1; |
mnaganov@chromium.org | 57fe9f7 | 2011-01-20 16:21:35 +0000 | [diff] [blame] | 331 | resetFrontendProfiles(); |
loislo@chromium.org | f59b030 | 2012-02-16 14:23:51 +0000 | [diff] [blame] | 332 | m_injectedScriptManager->injectedScriptHost()->clearInspectedObjects(); |
mnaganov@chromium.org | 57fe9f7 | 2011-01-20 16:21:35 +0000 | [diff] [blame] | 333 | } |
| 334 | |
| 335 | void InspectorProfilerAgent::resetFrontendProfiles() |
| 336 | { |
yurys@chromium.org | 9b845a1 | 2013-02-20 12:15:51 +0000 | [diff] [blame] | 337 | if (!m_frontend) |
| 338 | return; |
| 339 | if (!m_state->getBoolean(ProfilerAgentState::profileHeadersRequested)) |
| 340 | return; |
| 341 | if (m_profiles.isEmpty() && m_snapshots.isEmpty()) |
loislo@chromium.org | 2c950cf | 2010-12-13 15:35:42 +0000 | [diff] [blame] | 342 | m_frontend->resetProfiles(); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 343 | } |
| 344 | |
yurys@chromium.org | 0928fb9 | 2011-03-12 07:21:34 +0000 | [diff] [blame] | 345 | void InspectorProfilerAgent::setFrontend(InspectorFrontend* frontend) |
| 346 | { |
| 347 | m_frontend = frontend->profiler(); |
yurys@chromium.org | 0928fb9 | 2011-03-12 07:21:34 +0000 | [diff] [blame] | 348 | } |
| 349 | |
| 350 | void InspectorProfilerAgent::clearFrontend() |
| 351 | { |
| 352 | m_frontend = 0; |
pfeldman@chromium.org | 6a1f952 | 2011-11-22 09:52:10 +0000 | [diff] [blame] | 353 | stop(); |
commit-queue@webkit.org | 50a5915 | 2012-01-13 17:43:17 +0000 | [diff] [blame] | 354 | ErrorString error; |
| 355 | disable(&error); |
yurys@chromium.org | 0928fb9 | 2011-03-12 07:21:34 +0000 | [diff] [blame] | 356 | } |
| 357 | |
| 358 | void InspectorProfilerAgent::restore() |
| 359 | { |
pfeldman@chromium.org | ccc8cd93 | 2011-11-28 14:41:48 +0000 | [diff] [blame] | 360 | // Need to restore enablement state here as in setFrontend m_state wasn't loaded yet. |
yurys@chromium.org | 0928fb9 | 2011-03-12 07:21:34 +0000 | [diff] [blame] | 361 | restoreEnablement(); |
yurys@chromium.org | 0928fb9 | 2011-03-12 07:21:34 +0000 | [diff] [blame] | 362 | resetFrontendProfiles(); |
pfeldman@chromium.org | ccc8cd93 | 2011-11-28 14:41:48 +0000 | [diff] [blame] | 363 | if (m_state->getBoolean(ProfilerAgentState::userInitiatedProfiling)) |
pfeldman@chromium.org | 6a1f952 | 2011-11-22 09:52:10 +0000 | [diff] [blame] | 364 | start(); |
yurys@chromium.org | 0928fb9 | 2011-03-12 07:21:34 +0000 | [diff] [blame] | 365 | } |
| 366 | |
| 367 | void InspectorProfilerAgent::restoreEnablement() |
| 368 | { |
pfeldman@chromium.org | ccc8cd93 | 2011-11-28 14:41:48 +0000 | [diff] [blame] | 369 | if (m_state->getBoolean(ProfilerAgentState::profilerEnabled)) { |
yurys@chromium.org | 0928fb9 | 2011-03-12 07:21:34 +0000 | [diff] [blame] | 370 | ErrorString error; |
| 371 | enable(&error); |
| 372 | } |
| 373 | } |
| 374 | |
pfeldman@chromium.org | 6a1f952 | 2011-11-22 09:52:10 +0000 | [diff] [blame] | 375 | void InspectorProfilerAgent::start(ErrorString*) |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 376 | { |
caseq@chromium.org | 5249d11 | 2012-12-18 11:43:35 +0000 | [diff] [blame] | 377 | if (m_recordingCPUProfile) |
mnaganov@chromium.org | ccce402 | 2010-11-08 13:38:46 +0000 | [diff] [blame] | 378 | return; |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 379 | if (!enabled()) { |
yurys@chromium.org | 591972a | 2011-01-27 14:03:18 +0000 | [diff] [blame] | 380 | enable(true); |
yurys@chromium.org | 7f1e51a | 2011-03-30 15:26:22 +0000 | [diff] [blame] | 381 | PageScriptDebugServer::shared().recompileAllJSFunctions(0); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 382 | } |
caseq@chromium.org | 5249d11 | 2012-12-18 11:43:35 +0000 | [diff] [blame] | 383 | m_recordingCPUProfile = true; |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 384 | String title = getCurrentUserInitiatedProfileName(true); |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 385 | startProfiling(title); |
joepeck@webkit.org | 379c8a1 | 2013-04-25 18:31:05 +0000 | [diff] [blame] | 386 | addStartProfilingMessageToConsole(title, 0, 0, String()); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 387 | toggleRecordButton(true); |
pfeldman@chromium.org | ccc8cd93 | 2011-11-28 14:41:48 +0000 | [diff] [blame] | 388 | m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, true); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 389 | } |
| 390 | |
pfeldman@chromium.org | 6a1f952 | 2011-11-22 09:52:10 +0000 | [diff] [blame] | 391 | void InspectorProfilerAgent::stop(ErrorString*) |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 392 | { |
caseq@chromium.org | 5249d11 | 2012-12-18 11:43:35 +0000 | [diff] [blame] | 393 | if (!m_recordingCPUProfile) |
mnaganov@chromium.org | ccce402 | 2010-11-08 13:38:46 +0000 | [diff] [blame] | 394 | return; |
caseq@chromium.org | 5249d11 | 2012-12-18 11:43:35 +0000 | [diff] [blame] | 395 | m_recordingCPUProfile = false; |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 396 | String title = getCurrentUserInitiatedProfileName(); |
yurys@chromium.org | f58fc04 | 2012-02-29 15:42:10 +0000 | [diff] [blame] | 397 | RefPtr<ScriptProfile> profile = stopProfiling(title); |
pfeldman@chromium.org | 6a1f952 | 2011-11-22 09:52:10 +0000 | [diff] [blame] | 398 | if (profile) |
joepeck@webkit.org | 379c8a1 | 2013-04-25 18:31:05 +0000 | [diff] [blame] | 399 | addProfile(profile, 0, 0, String()); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 400 | toggleRecordButton(false); |
pfeldman@chromium.org | ccc8cd93 | 2011-11-28 14:41:48 +0000 | [diff] [blame] | 401 | m_state->setBoolean(ProfilerAgentState::userInitiatedProfiling, false); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 402 | } |
| 403 | |
mnaganov@chromium.org | 8d2d9a4 | 2011-01-25 17:11:06 +0000 | [diff] [blame] | 404 | namespace { |
| 405 | |
| 406 | class HeapSnapshotProgress: public ScriptProfiler::HeapSnapshotProgress { |
| 407 | public: |
yurys@chromium.org | 3fb1663 | 2011-03-03 05:43:34 +0000 | [diff] [blame] | 408 | explicit HeapSnapshotProgress(InspectorFrontend::Profiler* frontend) |
mnaganov@chromium.org | 8d2d9a4 | 2011-01-25 17:11:06 +0000 | [diff] [blame] | 409 | : m_frontend(frontend) { } |
| 410 | void Start(int totalWork) |
| 411 | { |
| 412 | m_totalWork = totalWork; |
| 413 | } |
| 414 | void Worked(int workDone) |
| 415 | { |
| 416 | if (m_frontend) |
| 417 | m_frontend->reportHeapSnapshotProgress(workDone, m_totalWork); |
| 418 | } |
| 419 | void Done() { } |
| 420 | bool isCanceled() { return false; } |
| 421 | private: |
yurys@chromium.org | 3fb1663 | 2011-03-03 05:43:34 +0000 | [diff] [blame] | 422 | InspectorFrontend::Profiler* m_frontend; |
mnaganov@chromium.org | 8d2d9a4 | 2011-01-25 17:11:06 +0000 | [diff] [blame] | 423 | int m_totalWork; |
| 424 | }; |
| 425 | |
| 426 | }; |
| 427 | |
yurys@chromium.org | fb86ee8 | 2013-01-31 08:45:50 +0000 | [diff] [blame] | 428 | void InspectorProfilerAgent::takeHeapSnapshot(ErrorString*, const bool* reportProgress) |
mnaganov@chromium.org | 06106af | 2010-08-26 18:27:24 +0000 | [diff] [blame] | 429 | { |
zimmermann@webkit.org | bbfe2a5 | 2010-10-14 19:48:45 +0000 | [diff] [blame] | 430 | String title = makeString(UserInitiatedProfileName, '.', String::number(m_nextUserInitiatedHeapSnapshotNumber)); |
| 431 | ++m_nextUserInitiatedHeapSnapshotNumber; |
| 432 | |
yurys@chromium.org | fb86ee8 | 2013-01-31 08:45:50 +0000 | [diff] [blame] | 433 | HeapSnapshotProgress progress(reportProgress && *reportProgress ? m_frontend : 0); |
mnaganov@chromium.org | aa5ba81 | 2011-06-21 19:52:51 +0000 | [diff] [blame] | 434 | RefPtr<ScriptHeapSnapshot> snapshot = ScriptProfiler::takeHeapSnapshot(title, &progress); |
mnaganov@chromium.org | 06106af | 2010-08-26 18:27:24 +0000 | [diff] [blame] | 435 | if (snapshot) { |
| 436 | m_snapshots.add(snapshot->uid(), snapshot); |
| 437 | if (m_frontend) |
| 438 | m_frontend->addProfileHeader(createSnapshotHeader(*snapshot)); |
| 439 | } |
| 440 | } |
| 441 | |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 442 | void InspectorProfilerAgent::toggleRecordButton(bool isProfiling) |
| 443 | { |
loislo@chromium.org | b3d4ff4 | 2010-08-24 12:26:55 +0000 | [diff] [blame] | 444 | if (m_frontend) |
| 445 | m_frontend->setRecordingProfile(isProfiling); |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 446 | } |
| 447 | |
yurys@chromium.org | 503c0f8 | 2012-05-11 15:05:42 +0000 | [diff] [blame] | 448 | void InspectorProfilerAgent::getObjectByHeapObjectId(ErrorString* error, const String& heapSnapshotObjectId, const String* objectGroup, RefPtr<TypeBuilder::Runtime::RemoteObject>& result) |
mnaganov@chromium.org | 90b24e8 | 2011-10-17 13:21:12 +0000 | [diff] [blame] | 449 | { |
yurys@chromium.org | 503c0f8 | 2012-05-11 15:05:42 +0000 | [diff] [blame] | 450 | bool ok; |
| 451 | unsigned id = heapSnapshotObjectId.toUInt(&ok); |
| 452 | if (!ok) { |
| 453 | *error = "Invalid heap snapshot object id"; |
| 454 | return; |
| 455 | } |
yurys@chromium.org | a1270f8 | 2012-02-08 15:51:53 +0000 | [diff] [blame] | 456 | ScriptObject heapObject = ScriptProfiler::objectByHeapObjectId(id); |
| 457 | if (heapObject.hasNoValue()) { |
yurys@chromium.org | 6ec28e2 | 2012-04-02 12:13:08 +0000 | [diff] [blame] | 458 | *error = "Object is not available"; |
yurys@chromium.org | a1270f8 | 2012-02-08 15:51:53 +0000 | [diff] [blame] | 459 | return; |
| 460 | } |
| 461 | InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(heapObject.scriptState()); |
| 462 | if (injectedScript.hasNoValue()) { |
yurys@chromium.org | 6ec28e2 | 2012-04-02 12:13:08 +0000 | [diff] [blame] | 463 | *error = "Object is not available. Inspected context is gone"; |
yurys@chromium.org | a1270f8 | 2012-02-08 15:51:53 +0000 | [diff] [blame] | 464 | return; |
| 465 | } |
| 466 | result = injectedScript.wrapObject(heapObject, objectGroup ? *objectGroup : ""); |
| 467 | if (!result) |
yurys@chromium.org | 6ec28e2 | 2012-04-02 12:13:08 +0000 | [diff] [blame] | 468 | *error = "Failed to wrap object"; |
mnaganov@chromium.org | 90b24e8 | 2011-10-17 13:21:12 +0000 | [diff] [blame] | 469 | } |
| 470 | |
yurys@chromium.org | 503c0f8 | 2012-05-11 15:05:42 +0000 | [diff] [blame] | 471 | void InspectorProfilerAgent::getHeapObjectId(ErrorString* errorString, const String& objectId, String* heapSnapshotObjectId) |
| 472 | { |
| 473 | InjectedScript injectedScript = m_injectedScriptManager->injectedScriptForObjectId(objectId); |
| 474 | if (injectedScript.hasNoValue()) { |
| 475 | *errorString = "Inspected context has gone"; |
| 476 | return; |
| 477 | } |
| 478 | ScriptValue value = injectedScript.findObjectById(objectId); |
| 479 | if (value.hasNoValue() || value.isUndefined()) { |
| 480 | *errorString = "Object with given id not found"; |
| 481 | return; |
| 482 | } |
| 483 | unsigned id = ScriptProfiler::getHeapObjectId(value); |
| 484 | *heapSnapshotObjectId = String::number(id); |
| 485 | } |
| 486 | |
caseq@chromium.org | 5249d11 | 2012-12-18 11:43:35 +0000 | [diff] [blame] | 487 | void InspectorProfilerAgent::willProcessTask() |
| 488 | { |
| 489 | if (!m_profileNameIdleTimeMap || !m_profileNameIdleTimeMap->size()) |
| 490 | return; |
| 491 | if (!m_previousTaskEndTime) |
| 492 | return; |
| 493 | |
commit-queue@webkit.org | a5f446a | 2013-08-16 19:33:59 +0000 | [diff] [blame^] | 494 | double idleTime = monotonicallyIncreasingTime() - m_previousTaskEndTime; |
caseq@chromium.org | 5249d11 | 2012-12-18 11:43:35 +0000 | [diff] [blame] | 495 | m_previousTaskEndTime = 0.0; |
| 496 | ProfileNameIdleTimeMap::iterator end = m_profileNameIdleTimeMap->end(); |
| 497 | for (ProfileNameIdleTimeMap::iterator it = m_profileNameIdleTimeMap->begin(); it != end; ++it) |
| 498 | it->value += idleTime; |
| 499 | } |
| 500 | |
| 501 | void InspectorProfilerAgent::didProcessTask() |
| 502 | { |
| 503 | if (!m_profileNameIdleTimeMap || !m_profileNameIdleTimeMap->size()) |
| 504 | return; |
commit-queue@webkit.org | a5f446a | 2013-08-16 19:33:59 +0000 | [diff] [blame^] | 505 | m_previousTaskEndTime = monotonicallyIncreasingTime(); |
caseq@chromium.org | 5249d11 | 2012-12-18 11:43:35 +0000 | [diff] [blame] | 506 | } |
| 507 | |
mnaganov@chromium.org | 00743c3 | 2010-08-23 09:35:21 +0000 | [diff] [blame] | 508 | } // namespace WebCore |
| 509 | |
abecsi@webkit.org | 6234000 | 2010-11-24 14:38:47 +0000 | [diff] [blame] | 510 | #endif // ENABLE(JAVASCRIPT_DEBUGGER) && ENABLE(INSPECTOR) |