// Copyright 2020 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. #include "extensions/renderer/dom_hooks_delegate.h" #include #include "extensions/renderer/bindings/api_signature.h" #include "extensions/renderer/dispatcher.h" #include "extensions/renderer/script_context.h" #include "third_party/blink/public/web/web_element.h" namespace extensions { DOMHooksDelegate::DOMHooksDelegate() = default; DOMHooksDelegate::~DOMHooksDelegate() = default; APIBindingHooks::RequestResult DOMHooksDelegate::HandleRequest( const std::string& method_name, const APISignature* signature, v8::Local context, std::vector>* arguments, const APITypeReferenceMap& refs) { using RequestResult = APIBindingHooks::RequestResult; v8::Isolate* isolate = context->GetIsolate(); v8::TryCatch try_catch(isolate); APISignature::V8ParseResult parse_result = signature->ParseArgumentsToV8(context, *arguments, refs); if (!parse_result.succeeded()) { if (try_catch.HasCaught()) { try_catch.ReThrow(); return RequestResult(RequestResult::THROWN); } return RequestResult(RequestResult::INVALID_INVOCATION); } ScriptContext* script_context = ScriptContextSet::GetContextByV8Context(context); DCHECK(script_context); APIBindingHooks::RequestResult result( APIBindingHooks::RequestResult::HANDLED); if (method_name == "dom.openOrClosedShadowRoot") { DCHECK(parse_result.arguments.has_value()); result.return_value = OpenOrClosedShadowRoot(script_context, *parse_result.arguments); } else { NOTREACHED(); } return result; } v8::Local DOMHooksDelegate::OpenOrClosedShadowRoot( ScriptContext* script_context, const std::vector>& parsed_arguments) { DCHECK(script_context->extension()); DCHECK(parsed_arguments[0]->IsObject()); blink::WebElement element = blink::WebElement::FromV8Value(parsed_arguments[0]); if (element.IsNull()) return v8::Null(script_context->isolate()); blink::WebNode shadow_root = element.OpenOrClosedShadowRoot(); if (shadow_root.IsNull()) return v8::Null(script_context->isolate()); return shadow_root.ToV8Value(script_context->v8_context()->Global(), script_context->isolate()); } } // namespace extensions