dom_hooks_delegate.cc 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright 2020 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/dom_hooks_delegate.h"
  5. #include <memory>
  6. #include "extensions/renderer/bindings/api_signature.h"
  7. #include "extensions/renderer/dispatcher.h"
  8. #include "extensions/renderer/script_context.h"
  9. #include "third_party/blink/public/web/web_element.h"
  10. #include "v8/include/v8-exception.h"
  11. #include "v8/include/v8-primitive.h"
  12. namespace extensions {
  13. DOMHooksDelegate::DOMHooksDelegate() = default;
  14. DOMHooksDelegate::~DOMHooksDelegate() = default;
  15. APIBindingHooks::RequestResult DOMHooksDelegate::HandleRequest(
  16. const std::string& method_name,
  17. const APISignature* signature,
  18. v8::Local<v8::Context> context,
  19. std::vector<v8::Local<v8::Value>>* arguments,
  20. const APITypeReferenceMap& refs) {
  21. using RequestResult = APIBindingHooks::RequestResult;
  22. v8::Isolate* isolate = context->GetIsolate();
  23. v8::TryCatch try_catch(isolate);
  24. APISignature::V8ParseResult parse_result =
  25. signature->ParseArgumentsToV8(context, *arguments, refs);
  26. if (!parse_result.succeeded()) {
  27. if (try_catch.HasCaught()) {
  28. try_catch.ReThrow();
  29. return RequestResult(RequestResult::THROWN);
  30. }
  31. return RequestResult(RequestResult::INVALID_INVOCATION);
  32. }
  33. ScriptContext* script_context =
  34. ScriptContextSet::GetContextByV8Context(context);
  35. DCHECK(script_context);
  36. APIBindingHooks::RequestResult result(
  37. APIBindingHooks::RequestResult::HANDLED);
  38. if (method_name == "dom.openOrClosedShadowRoot") {
  39. DCHECK(parse_result.arguments.has_value());
  40. result.return_value =
  41. OpenOrClosedShadowRoot(script_context, *parse_result.arguments);
  42. } else {
  43. NOTREACHED();
  44. }
  45. return result;
  46. }
  47. v8::Local<v8::Value> DOMHooksDelegate::OpenOrClosedShadowRoot(
  48. ScriptContext* script_context,
  49. const std::vector<v8::Local<v8::Value>>& parsed_arguments) {
  50. DCHECK(script_context->extension());
  51. DCHECK(parsed_arguments[0]->IsObject());
  52. blink::WebElement element =
  53. blink::WebElement::FromV8Value(parsed_arguments[0]);
  54. if (element.IsNull())
  55. return v8::Null(script_context->isolate());
  56. blink::WebNode shadow_root = element.OpenOrClosedShadowRoot();
  57. if (shadow_root.IsNull())
  58. return v8::Null(script_context->isolate());
  59. return shadow_root.ToV8Value(script_context->v8_context()->Global(),
  60. script_context->isolate());
  61. }
  62. } // namespace extensions