text: // Copyright 2018 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef EXTENSIONS_RENDERER_BINDINGS_API_RESPONSE_VALIDATOR_H_
  #define EXTENSIONS_RENDERER_BINDINGS_API_RESPONSE_VALIDATOR_H_
  
  #include <string>
  #include <vector>
  
  #include "base/callback.h"
  #include "base/macros.h"
  #include "v8/include/v8.h"
  
  namespace extensions {
  class APITypeReferenceMap;
  
  // A class to validate the responses to API calls sent by the browser. This
  // helps ensure that the browser returns values that match the expected schema
  // (which corresponds to the public documentation).
  class APIResponseValidator {
   public:
    // Allow overriding the default failure behavior.
    class TestHandler {
     public:
      using HandlerMethod =
          base::RepeatingCallback<void(const std::string&, const std::string&)>;
  
      explicit TestHandler(HandlerMethod method);
  
      TestHandler(const TestHandler&) = delete;
      TestHandler& operator=(const TestHandler&) = delete;
  
      ~TestHandler();
  
     private:
      HandlerMethod method_;
    };
  
    // The origin of the callback passed to the response.
    enum class CallbackType {
      // NOTE(devlin): There's deliberately not a kNoCallback value here, since
      // ValidateResponse() is only invoked if there was some callback provided.
      // This is important, since some API implementations can adjust behavior
      // based on whether a callback is provided.
  
      // The callback was directly provided by the author script.
      kCallerProvided,
      // The callback was provided by the API, such as through custom bindings.
      kAPIProvided,
    };
  
    explicit APIResponseValidator(const APITypeReferenceMap* type_refs);
  
    APIResponseValidator(const APIResponseValidator&) = delete;
    APIResponseValidator& operator=(const APIResponseValidator&) = delete;
  
    ~APIResponseValidator();
  
    // Validates a response against the expected schema. By default, this will
    // NOTREACHED() in cases of validation failure.
    void ValidateResponse(
        v8::Local<v8::Context> context,
        const std::string& method_name,
        const std::vector<v8::Local<v8::Value>> response_arguments,
        const std::string& api_error,
        CallbackType callback_type);
  
   private:
    // The type reference map; guaranteed to outlive this object.
    const APITypeReferenceMap* type_refs_;
  };
  
  }  // namespace extensions
  
  #endif  // EXTENSIONS_RENDERER_BINDINGS_API_RESPONSE_VALIDATOR_H_
  