js_runner.cc 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "extensions/renderer/bindings/js_runner.h"
  5. #include "base/supports_user_data.h"
  6. #include "gin/per_context_data.h"
  7. namespace extensions {
  8. namespace {
  9. constexpr char kExtensionJSRunnerPerContextKey[] = "extension_js_runner";
  10. struct JSRunnerPerContextData : public base::SupportsUserData::Data {
  11. explicit JSRunnerPerContextData(std::unique_ptr<JSRunner> js_runner)
  12. : js_runner(std::move(js_runner)) {}
  13. ~JSRunnerPerContextData() override {}
  14. std::unique_ptr<JSRunner> js_runner;
  15. };
  16. JSRunner* g_instance_for_testing = nullptr;
  17. } // namespace
  18. // static
  19. JSRunner* JSRunner::Get(v8::Local<v8::Context> context) {
  20. if (g_instance_for_testing)
  21. return g_instance_for_testing;
  22. gin::PerContextData* per_context_data = gin::PerContextData::From(context);
  23. if (!per_context_data)
  24. return nullptr;
  25. auto* data = static_cast<JSRunnerPerContextData*>(
  26. per_context_data->GetUserData(kExtensionJSRunnerPerContextKey));
  27. if (!data)
  28. return nullptr;
  29. return data->js_runner.get();
  30. }
  31. void JSRunner::SetInstanceForContext(v8::Local<v8::Context> context,
  32. std::unique_ptr<JSRunner> js_runner) {
  33. gin::PerContextData* per_context_data = gin::PerContextData::From(context);
  34. // We should never try to set an instance for a context that's being torn
  35. // down.
  36. CHECK(per_context_data);
  37. // We should never have an existing instance for this context.
  38. DCHECK(!per_context_data->GetUserData(kExtensionJSRunnerPerContextKey));
  39. per_context_data->SetUserData(
  40. kExtensionJSRunnerPerContextKey,
  41. std::make_unique<JSRunnerPerContextData>(std::move(js_runner)));
  42. }
  43. void JSRunner::ClearInstanceForContext(v8::Local<v8::Context> context) {
  44. gin::PerContextData* per_context_data = gin::PerContextData::From(context);
  45. // We should never try to clear an instance for a context that's being torn
  46. // down.
  47. CHECK(per_context_data);
  48. // We should always have an existing instance for this context.
  49. DCHECK(per_context_data->GetUserData(kExtensionJSRunnerPerContextKey));
  50. per_context_data->SetUserData(kExtensionJSRunnerPerContextKey, nullptr);
  51. }
  52. void JSRunner::SetInstanceForTesting(JSRunner* js_runner) {
  53. g_instance_for_testing = js_runner;
  54. }
  55. JSRunner* JSRunner::GetInstanceForTesting() {
  56. return g_instance_for_testing;
  57. }
  58. void JSRunner::RunJSFunction(v8::Local<v8::Function> function,
  59. v8::Local<v8::Context> context,
  60. int argc,
  61. v8::Local<v8::Value> argv[]) {
  62. RunJSFunction(function, context, argc, argv, ResultCallback());
  63. }
  64. } // namespace extensions