| /* | 
 |  * Copyright (C) 2012 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: | 
 |  * | 
 |  *     * Redistributions of source code must retain the above copyright | 
 |  * notice, this list of conditions and the following disclaimer. | 
 |  *     * 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. | 
 |  *     * Neither the name of Google Inc. 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 THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT | 
 |  * OWNER OR 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. | 
 |  */ | 
 |  | 
 | #ifndef V8_INSPECTOR_INJECTED_SCRIPT_H_ | 
 | #define V8_INSPECTOR_INJECTED_SCRIPT_H_ | 
 |  | 
 | #include <memory> | 
 | #include <unordered_map> | 
 | #include <unordered_set> | 
 |  | 
 | #include "src/base/macros.h" | 
 | #include "src/inspector/inspected-context.h" | 
 | #include "src/inspector/protocol/Forward.h" | 
 | #include "src/inspector/protocol/Runtime.h" | 
 | #include "src/inspector/v8-console.h" | 
 | #include "src/inspector/v8-debugger.h" | 
 |  | 
 | #include "include/v8.h" | 
 |  | 
 | namespace v8_inspector { | 
 |  | 
 | class RemoteObjectId; | 
 | class V8InspectorImpl; | 
 | class V8InspectorSessionImpl; | 
 | class ValueMirror; | 
 | enum class WrapMode; | 
 |  | 
 | using protocol::Maybe; | 
 | using protocol::Response; | 
 |  | 
 | class EvaluateCallback { | 
 |  public: | 
 |   virtual void sendSuccess( | 
 |       std::unique_ptr<protocol::Runtime::RemoteObject> result, | 
 |       protocol::Maybe<protocol::Runtime::ExceptionDetails> | 
 |           exceptionDetails) = 0; | 
 |   virtual void sendFailure(const protocol::DispatchResponse& response) = 0; | 
 |   virtual ~EvaluateCallback() = default; | 
 | }; | 
 |  | 
 | class InjectedScript final { | 
 |  public: | 
 |   InjectedScript(InspectedContext*, int sessionId); | 
 |   ~InjectedScript(); | 
 |  | 
 |   InspectedContext* context() const { return m_context; } | 
 |  | 
 |   Response getProperties( | 
 |       v8::Local<v8::Object>, const String16& groupName, bool ownProperties, | 
 |       bool accessorPropertiesOnly, WrapMode wrapMode, | 
 |       std::unique_ptr<protocol::Array<protocol::Runtime::PropertyDescriptor>>* | 
 |           result, | 
 |       Maybe<protocol::Runtime::ExceptionDetails>*); | 
 |  | 
 |   Response getInternalAndPrivateProperties( | 
 |       v8::Local<v8::Value>, const String16& groupName, | 
 |       std::unique_ptr< | 
 |           protocol::Array<protocol::Runtime::InternalPropertyDescriptor>>* | 
 |           internalProperties, | 
 |       std::unique_ptr< | 
 |           protocol::Array<protocol::Runtime::PrivatePropertyDescriptor>>* | 
 |           privateProperties); | 
 |  | 
 |   void releaseObject(const String16& objectId); | 
 |  | 
 |   Response wrapObject(v8::Local<v8::Value>, const String16& groupName, | 
 |                       WrapMode wrapMode, | 
 |                       std::unique_ptr<protocol::Runtime::RemoteObject>* result); | 
 |   Response wrapObject(v8::Local<v8::Value>, const String16& groupName, | 
 |                       WrapMode wrapMode, | 
 |                       v8::MaybeLocal<v8::Value> customPreviewConfig, | 
 |                       int maxCustomPreviewDepth, | 
 |                       std::unique_ptr<protocol::Runtime::RemoteObject>* result); | 
 |   Response wrapObjectMirror( | 
 |       const ValueMirror& mirror, const String16& groupName, WrapMode wrapMode, | 
 |       v8::MaybeLocal<v8::Value> customPreviewConfig, int maxCustomPreviewDepth, | 
 |       std::unique_ptr<protocol::Runtime::RemoteObject>* result); | 
 |   std::unique_ptr<protocol::Runtime::RemoteObject> wrapTable( | 
 |       v8::Local<v8::Object> table, v8::MaybeLocal<v8::Array> columns); | 
 |  | 
 |   void addPromiseCallback(V8InspectorSessionImpl* session, | 
 |                           v8::MaybeLocal<v8::Value> value, | 
 |                           const String16& objectGroup, WrapMode wrapMode, | 
 |                           bool replMode, | 
 |                           std::unique_ptr<EvaluateCallback> callback); | 
 |  | 
 |   Response findObject(const RemoteObjectId&, v8::Local<v8::Value>*) const; | 
 |   String16 objectGroupName(const RemoteObjectId&) const; | 
 |   void releaseObjectGroup(const String16&); | 
 |   void setCustomObjectFormatterEnabled(bool); | 
 |   Response resolveCallArgument(protocol::Runtime::CallArgument*, | 
 |                                v8::Local<v8::Value>* result); | 
 |  | 
 |   Response createExceptionDetails( | 
 |       const v8::TryCatch&, const String16& groupName, | 
 |       Maybe<protocol::Runtime::ExceptionDetails>* result); | 
 |   Response createExceptionDetails( | 
 |       v8::Local<v8::Message> message, v8::Local<v8::Value> exception, | 
 |       const String16& groupName, | 
 |       Maybe<protocol::Runtime::ExceptionDetails>* result); | 
 |  | 
 |   Response wrapEvaluateResult( | 
 |       v8::MaybeLocal<v8::Value> maybeResultValue, const v8::TryCatch&, | 
 |       const String16& objectGroup, WrapMode wrapMode, | 
 |       std::unique_ptr<protocol::Runtime::RemoteObject>* result, | 
 |       Maybe<protocol::Runtime::ExceptionDetails>*); | 
 |   v8::Local<v8::Value> lastEvaluationResult() const; | 
 |   void setLastEvaluationResult(v8::Local<v8::Value> result); | 
 |  | 
 |   class Scope { | 
 |    public: | 
 |     Response initialize(); | 
 |     void installCommandLineAPI(); | 
 |     void ignoreExceptionsAndMuteConsole(); | 
 |     void pretendUserGesture(); | 
 |     void allowCodeGenerationFromStrings(); | 
 |     v8::Local<v8::Context> context() const { return m_context; } | 
 |     InjectedScript* injectedScript() const { return m_injectedScript; } | 
 |     const v8::TryCatch& tryCatch() const { return m_tryCatch; } | 
 |     V8InspectorImpl* inspector() const { return m_inspector; } | 
 |  | 
 |    protected: | 
 |     explicit Scope(V8InspectorSessionImpl*); | 
 |     virtual ~Scope(); | 
 |     virtual Response findInjectedScript(V8InspectorSessionImpl*) = 0; | 
 |  | 
 |     V8InspectorImpl* m_inspector; | 
 |     InjectedScript* m_injectedScript; | 
 |  | 
 |    private: | 
 |     void cleanup(); | 
 |     v8::debug::ExceptionBreakState setPauseOnExceptionsState( | 
 |         v8::debug::ExceptionBreakState); | 
 |  | 
 |     v8::HandleScope m_handleScope; | 
 |     v8::TryCatch m_tryCatch; | 
 |     v8::Local<v8::Context> m_context; | 
 |     std::unique_ptr<V8Console::CommandLineAPIScope> m_commandLineAPIScope; | 
 |     bool m_ignoreExceptionsAndMuteConsole; | 
 |     v8::debug::ExceptionBreakState m_previousPauseOnExceptionsState; | 
 |     bool m_userGesture; | 
 |     bool m_allowEval; | 
 |     int m_contextGroupId; | 
 |     int m_sessionId; | 
 |   }; | 
 |  | 
 |   class ContextScope : public Scope { | 
 |    public: | 
 |     ContextScope(V8InspectorSessionImpl*, int executionContextId); | 
 |     ~ContextScope() override; | 
 |  | 
 |    private: | 
 |     Response findInjectedScript(V8InspectorSessionImpl*) override; | 
 |     int m_executionContextId; | 
 |  | 
 |     DISALLOW_COPY_AND_ASSIGN(ContextScope); | 
 |   }; | 
 |  | 
 |   class ObjectScope : public Scope { | 
 |    public: | 
 |     ObjectScope(V8InspectorSessionImpl*, const String16& remoteObjectId); | 
 |     ~ObjectScope() override; | 
 |     const String16& objectGroupName() const { return m_objectGroupName; } | 
 |     v8::Local<v8::Value> object() const { return m_object; } | 
 |  | 
 |    private: | 
 |     Response findInjectedScript(V8InspectorSessionImpl*) override; | 
 |     String16 m_remoteObjectId; | 
 |     String16 m_objectGroupName; | 
 |     v8::Local<v8::Value> m_object; | 
 |  | 
 |     DISALLOW_COPY_AND_ASSIGN(ObjectScope); | 
 |   }; | 
 |  | 
 |   class CallFrameScope : public Scope { | 
 |    public: | 
 |     CallFrameScope(V8InspectorSessionImpl*, const String16& remoteCallFrameId); | 
 |     ~CallFrameScope() override; | 
 |     size_t frameOrdinal() const { return m_frameOrdinal; } | 
 |  | 
 |    private: | 
 |     Response findInjectedScript(V8InspectorSessionImpl*) override; | 
 |     String16 m_remoteCallFrameId; | 
 |     size_t m_frameOrdinal; | 
 |  | 
 |     DISALLOW_COPY_AND_ASSIGN(CallFrameScope); | 
 |   }; | 
 |   String16 bindObject(v8::Local<v8::Value>, const String16& groupName); | 
 |  | 
 |  private: | 
 |   v8::Local<v8::Object> commandLineAPI(); | 
 |   void unbindObject(int id); | 
 |  | 
 |   static Response bindRemoteObjectIfNeeded( | 
 |       int sessionId, v8::Local<v8::Context> context, v8::Local<v8::Value>, | 
 |       const String16& groupName, protocol::Runtime::RemoteObject* remoteObject); | 
 |  | 
 |   class ProtocolPromiseHandler; | 
 |   void discardEvaluateCallbacks(); | 
 |   std::unique_ptr<EvaluateCallback> takeEvaluateCallback( | 
 |       EvaluateCallback* callback); | 
 |   Response addExceptionToDetails( | 
 |       v8::Local<v8::Value> exception, | 
 |       protocol::Runtime::ExceptionDetails* exceptionDetails, | 
 |       const String16& objectGroup); | 
 |  | 
 |   InspectedContext* m_context; | 
 |   int m_sessionId; | 
 |   v8::Global<v8::Value> m_lastEvaluationResult; | 
 |   v8::Global<v8::Object> m_commandLineAPI; | 
 |   int m_lastBoundObjectId = 1; | 
 |   std::unordered_map<int, v8::Global<v8::Value>> m_idToWrappedObject; | 
 |   std::unordered_map<int, String16> m_idToObjectGroupName; | 
 |   std::unordered_map<String16, std::vector<int>> m_nameToObjectGroup; | 
 |   std::unordered_set<EvaluateCallback*> m_evaluateCallbacks; | 
 |   bool m_customPreviewEnabled = false; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(InjectedScript); | 
 | }; | 
 |  | 
 | }  // namespace v8_inspector | 
 |  | 
 | #endif  // V8_INSPECTOR_INJECTED_SCRIPT_H_ |