/* * Copyright (C) 2013, 2015 Apple Inc. All Rights Reserved. * Copyright (C) 2011 The Chromium Authors. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 InspectorBackendDispatcher_h #define InspectorBackendDispatcher_h #include "InspectorFrontendRouter.h" #include "InspectorProtocolTypes.h" #include #include #include namespace Inspector { class BackendDispatcher; typedef String ErrorString; class JS_EXPORT_PRIVATE SupplementalBackendDispatcher : public RefCounted { public: SupplementalBackendDispatcher(BackendDispatcher&); virtual ~SupplementalBackendDispatcher(); virtual void dispatch(long requestId, const String& method, Ref&& message) = 0; protected: Ref m_backendDispatcher; }; class JS_EXPORT_PRIVATE BackendDispatcher : public RefCounted { public: static Ref create(Ref&&); class JS_EXPORT_PRIVATE CallbackBase : public RefCounted { public: CallbackBase(Ref&&, long requestId); bool isActive() const; void disable() { m_alreadySent = true; } void sendSuccess(RefPtr&&); void sendFailure(const ErrorString&); private: Ref m_backendDispatcher; long m_requestId; bool m_alreadySent { false }; }; bool isActive() const; bool hasProtocolErrors() const { return m_protocolErrors.size() > 0; } enum CommonErrorCode { ParseError = 0, InvalidRequest, MethodNotFound, InvalidParams, InternalError, ServerError }; void registerDispatcherForDomain(const String& domain, SupplementalBackendDispatcher*); void dispatch(const String& message); void sendResponse(long requestId, RefPtr&& result); void sendPendingErrors(); void reportProtocolError(CommonErrorCode, const String& errorMessage); void reportProtocolError(Optional relatedRequestId, CommonErrorCode, const String& errorMessage); template WTF_HIDDEN_DECLARATION T getPropertyValue(InspectorObject*, const String& name, bool* out_optionalValueFound, T defaultValue, std::function, const char* typeName); int getInteger(InspectorObject*, const String& name, bool* valueFound); double getDouble(InspectorObject*, const String& name, bool* valueFound); String getString(InspectorObject*, const String& name, bool* valueFound); bool getBoolean(InspectorObject*, const String& name, bool* valueFound); RefPtr getValue(InspectorObject*, const String& name, bool* valueFound); RefPtr getObject(InspectorObject*, const String& name, bool* valueFound); RefPtr getArray(InspectorObject*, const String& name, bool* valueFound); private: BackendDispatcher(Ref&&); Ref m_frontendRouter; HashMap m_dispatchers; // Protocol errors reported for the top-level request being processed. // If processing a request triggers async responses, then any related errors will // be attributed to the top-level request, but generate separate error messages. Vector> m_protocolErrors; // For synchronously handled requests, avoid plumbing requestId through every // call that could potentially fail with a protocol error. Optional m_currentRequestId { Nullopt }; }; } // namespace Inspector #endif // !defined(InspectorBackendDispatcher_h)