blob: bd6f9ba4d3dcaee5aba3c2a2def6776fd282b5e6 [file] [log] [blame]
// Copyright 2019 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 "chromecast/renderer/queryable_data_bindings.h"
#include "base/bind_helpers.h"
#include "base/logging.h"
#include "chromecast/common/queryable_data.h"
#include "content/public/renderer/render_frame.h"
#include "content/public/renderer/v8_value_converter.h"
#include "services/service_manager/public/cpp/interface_provider.h"
#include "third_party/blink/public/web/blink.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "v8/include/v8.h"
namespace chromecast {
namespace {
const char kQueryPlatformValueMethodName[] = "queryPlatformValue";
} // namespace
QueryableDataBindings::QueryableDataBindings(content::RenderFrame* frame)
: CastBinding(frame),
queryable_data_store_(std::make_unique<QueryableDataStore>(
base::ThreadTaskRunnerHandle::Get())) {
registry_.AddInterface<shell::mojom::QueryableDataStore>(
base::BindRepeating(&QueryableDataStore::BindQueryableDataStoreRequest,
base::Unretained(queryable_data_store_.get())));
}
QueryableDataBindings::~QueryableDataBindings() {}
void QueryableDataBindings::Install(v8::Local<v8::Object> cast_platform,
v8::Isolate* isolate) {
VLOG(1) << "Installing QueryableDataBindings";
InstallBinding(isolate, cast_platform, kQueryPlatformValueMethodName,
&QueryableDataBindings::QueryPlatformValue,
base::Unretained(this));
}
void QueryableDataBindings::OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
registry_.TryBindInterface(interface_name, interface_pipe);
}
v8::Local<v8::Value> QueryableDataBindings::QueryPlatformValue(
const std::string& query_key) {
VLOG(1) << __FUNCTION__ << ": " << query_key;
v8::Isolate* isolate = blink::MainThreadIsolate();
const base::Value* query_value = QueryableData::Query(query_key);
if (!query_value)
return v8::Local<v8::Value>(v8::Undefined(isolate));
return content::V8ValueConverter::Create()->ToV8Value(
query_value, render_frame()->GetWebFrame()->MainWorldScriptContext());
}
} // namespace chromecast