1e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block/*
2e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * Copyright (C) 2010 Apple Inc. All rights reserved.
3e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * Copyright (C) 2010 Google Inc. All rights reserved.
4e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *
5e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * Redistribution and use in source and binary forms, with or without
6e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * modification, are permitted provided that the following conditions
7e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * are met:
8e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *
9e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * 1.  Redistributions of source code must retain the above copyright
10e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *     notice, this list of conditions and the following disclaimer.
11e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * 2.  Redistributions in binary form must reproduce the above copyright
12e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *     notice, this list of conditions and the following disclaimer in the
13e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *     documentation and/or other materials provided with the distribution.
14e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *     its contributors may be used to endorse or promote products derived
16e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *     from this software without specific prior written permission.
17e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block *
18e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block */
29e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
30e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#ifndef InspectorProfilerAgent_h
31e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#define InspectorProfilerAgent_h
32e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#if ENABLE(JAVASCRIPT_DEBUGGER) && ENABLE(INSPECTOR)
34e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "InspectorFrontend.h"
36e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "PlatformString.h"
37e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include <wtf/Forward.h>
38e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include <wtf/HashMap.h>
39e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include <wtf/Noncopyable.h>
40e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include <wtf/PassOwnPtr.h>
41e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
42e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blocknamespace WebCore {
43e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
44e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockclass InspectorArray;
4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass InspectorConsoleAgent;
46e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockclass InspectorFrontend;
47e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockclass InspectorObject;
482bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass InspectorState;
4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass InstrumentingAgents;
5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass Page;
515ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenclass ScriptHeapSnapshot;
52e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockclass ScriptProfile;
53e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochtypedef String ErrorString;
5581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
56ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass InspectorProfilerAgent {
57ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    WTF_MAKE_NONCOPYABLE(InspectorProfilerAgent); WTF_MAKE_FAST_ALLOCATED;
58e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockpublic:
592bde8e466a4451c7319e3a072d118917957d6554Steve Block    static PassOwnPtr<InspectorProfilerAgent> create(InstrumentingAgents*, InspectorConsoleAgent*, Page*, InspectorState*);
60e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    virtual ~InspectorProfilerAgent();
61e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
62e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void addProfile(PassRefPtr<ScriptProfile> prpProfile, unsigned lineNumber, const String& sourceURL);
63e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void addProfileFinishedMessageToConsole(PassRefPtr<ScriptProfile>, unsigned lineNumber, const String& sourceURL);
64e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void addStartProfilingMessageToConsole(const String& title, unsigned lineNumber, const String& sourceURL);
652bde8e466a4451c7319e3a072d118917957d6554Steve Block    void collectGarbage(ErrorString*);
6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void clearProfiles(ErrorString*) { resetState(); }
672bde8e466a4451c7319e3a072d118917957d6554Steve Block    void resetState();
682bde8e466a4451c7319e3a072d118917957d6554Steve Block
692bde8e466a4451c7319e3a072d118917957d6554Steve Block    void enable(ErrorString*);
702bde8e466a4451c7319e3a072d118917957d6554Steve Block    void disable(ErrorString*);
712bde8e466a4451c7319e3a072d118917957d6554Steve Block    void isEnabled(ErrorString*, bool* result) { *result = enabled(); }
722bde8e466a4451c7319e3a072d118917957d6554Steve Block    void start(ErrorString*) { startUserInitiatedProfiling(); }
732bde8e466a4451c7319e3a072d118917957d6554Steve Block    void stop(ErrorString*) { stopUserInitiatedProfiling(); }
742bde8e466a4451c7319e3a072d118917957d6554Steve Block
75e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void disable();
76e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void enable(bool skipRecompile);
77e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    bool enabled() { return m_enabled; }
78e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    String getCurrentUserInitiatedProfileName(bool incrementProfileNumber = false);
7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void getProfileHeaders(ErrorString* error, RefPtr<InspectorArray>* headers);
8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void getProfile(ErrorString* error, const String& type, unsigned uid, RefPtr<InspectorObject>* profileObject);
81e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    bool isRecordingUserInitiatedProfile() { return m_recordingUserInitiatedProfile; }
8281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void removeProfile(ErrorString* error, const String& type, unsigned uid);
832bde8e466a4451c7319e3a072d118917957d6554Steve Block
842bde8e466a4451c7319e3a072d118917957d6554Steve Block    void setFrontend(InspectorFrontend*);
852bde8e466a4451c7319e3a072d118917957d6554Steve Block    void clearFrontend();
862bde8e466a4451c7319e3a072d118917957d6554Steve Block    void restore();
872bde8e466a4451c7319e3a072d118917957d6554Steve Block
88e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void startUserInitiatedProfiling();
8928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void stopUserInitiatedProfiling(bool ignoreProfile = false);
9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void takeHeapSnapshot(ErrorString* error, bool detailed);
91e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    void toggleRecordButton(bool isProfiling);
92e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
93e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockprivate:
94e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    typedef HashMap<unsigned int, RefPtr<ScriptProfile> > ProfilesMap;
955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    typedef HashMap<unsigned int, RefPtr<ScriptHeapSnapshot> > HeapSnapshotsMap;
96e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
972bde8e466a4451c7319e3a072d118917957d6554Steve Block    void resetFrontendProfiles();
982bde8e466a4451c7319e3a072d118917957d6554Steve Block    void restoreEnablement();
992bde8e466a4451c7319e3a072d118917957d6554Steve Block
1002bde8e466a4451c7319e3a072d118917957d6554Steve Block    InspectorProfilerAgent(InstrumentingAgents*, InspectorConsoleAgent*, Page*, InspectorState*);
101e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    PassRefPtr<InspectorObject> createProfileHeader(const ScriptProfile& profile);
1025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    PassRefPtr<InspectorObject> createSnapshotHeader(const ScriptHeapSnapshot& snapshot);
103e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
10481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    InstrumentingAgents* m_instrumentingAgents;
10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    InspectorConsoleAgent* m_consoleAgent;
10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    Page* m_inspectedPage;
1072bde8e466a4451c7319e3a072d118917957d6554Steve Block    InspectorState* m_inspectorState;
10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    InspectorFrontend::Profiler* m_frontend;
109e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    bool m_enabled;
110e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    bool m_recordingUserInitiatedProfile;
111e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    int m_currentUserInitiatedProfileNumber;
112e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    unsigned m_nextUserInitiatedProfileNumber;
1135ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    unsigned m_nextUserInitiatedHeapSnapshotNumber;
114e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    ProfilesMap m_profiles;
1155ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    HeapSnapshotsMap m_snapshots;
116e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block};
117e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
118e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block} // namespace WebCore
119e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
1204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#endif // ENABLE(JAVASCRIPT_DEBUGGER) && ENABLE(INSPECTOR)
121e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
122e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif // !defined(InspectorProfilerAgent_h)
123