|  | // Copyright 2017 The Chromium Authors | 
|  | // 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_BINDING_UTIL_H_ | 
|  | #define EXTENSIONS_RENDERER_BINDINGS_API_BINDING_UTIL_H_ | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  |  | 
|  | #include "base/auto_reset.h" | 
|  | #include "base/functional/callback.h" | 
|  | #include "base/memory/raw_ptr.h" | 
|  | #include "v8/include/v8.h" | 
|  |  | 
|  | namespace extensions { | 
|  | namespace binding { | 
|  |  | 
|  | class ContextInvalidationData; | 
|  |  | 
|  | // Returns true if the given `context` is considered valid. Contexts can be | 
|  | // invalidated if various objects or scripts hold onto references after when | 
|  | // blink releases the context, but we don't want to handle interactions past | 
|  | // this point. Additionally, simply checking if gin::PerContextData exists is | 
|  | // insufficient, because gin::PerContextData is released after the notifications | 
|  | // for releasing the script context, and author script can run between those | 
|  | // points. See https://crbug.com/772071. | 
|  | bool IsContextValid(v8::Local<v8::Context> context); | 
|  |  | 
|  | // Same as above, but throws an exception in the `context` if it is invalid. | 
|  | bool IsContextValidOrThrowError(v8::Local<v8::Context> context); | 
|  |  | 
|  | // Marks the given `context` as invalid. | 
|  | void InvalidateContext(v8::Local<v8::Context> context); | 
|  |  | 
|  | // A helper class to watch for context invalidation. If the context is | 
|  | // invalidated before this object is destroyed, the passed in closure will be | 
|  | // called. | 
|  | class ContextInvalidationListener { | 
|  | public: | 
|  | ContextInvalidationListener(v8::Local<v8::Context> context, | 
|  | base::OnceClosure on_invalidated); | 
|  |  | 
|  | ContextInvalidationListener(const ContextInvalidationListener&) = delete; | 
|  | ContextInvalidationListener& operator=(const ContextInvalidationListener&) = | 
|  | delete; | 
|  |  | 
|  | ~ContextInvalidationListener(); | 
|  |  | 
|  | void OnInvalidated(); | 
|  |  | 
|  | private: | 
|  | base::OnceClosure on_invalidated_; | 
|  |  | 
|  | raw_ptr<ContextInvalidationData> context_invalidation_data_ = nullptr; | 
|  | }; | 
|  |  | 
|  | // Returns the string version of the current platform, one of "chromeos", | 
|  | // "linux", "win", or "mac". | 
|  | std::string GetPlatformString(); | 
|  |  | 
|  | // Returns true if response validation is enabled, and the bindings system | 
|  | // should check the values returned by the browser against the expected results | 
|  | // defined in the schemas. By default, this is corresponds to whether DCHECK is | 
|  | // enabled. | 
|  | bool IsResponseValidationEnabled(); | 
|  |  | 
|  | // Override response validation for testing purposes. | 
|  | std::unique_ptr<base::AutoReset<bool>> SetResponseValidationEnabledForTesting( | 
|  | bool is_enabled); | 
|  |  | 
|  | }  // namespace binding | 
|  | }  // namespace extensions | 
|  |  | 
|  | #endif  // EXTENSIONS_RENDERER_BINDINGS_API_BINDING_UTIL_H_ |