blob: 816e23ea0183bf4ef36e9428b0ae1e6205c407ea [file] [log] [blame]
// Copyright 2014 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/runtime_custom_bindings.h"
#include <stdint.h>
#include <memory>
#include "base/bind.h"
#include "base/values.h"
#include "content/public/renderer/render_frame.h"
#include "content/public/renderer/v8_value_converter.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_messages.h"
#include "extensions/common/manifest.h"
#include "extensions/renderer/extension_frame_helper.h"
#include "extensions/renderer/script_context.h"
namespace extensions {
RuntimeCustomBindings::RuntimeCustomBindings(ScriptContext* context)
: ObjectBackedNativeHandler(context) {}
RuntimeCustomBindings::~RuntimeCustomBindings() {}
void RuntimeCustomBindings::AddRoutes() {
RouteHandlerFunction(
"GetManifest",
base::Bind(&RuntimeCustomBindings::GetManifest, base::Unretained(this)));
RouteHandlerFunction("GetExtensionViews",
base::Bind(&RuntimeCustomBindings::GetExtensionViews,
base::Unretained(this)));
}
void RuntimeCustomBindings::GetManifest(
const v8::FunctionCallbackInfo<v8::Value>& args) {
CHECK(context()->extension());
args.GetReturnValue().Set(content::V8ValueConverter::Create()->ToV8Value(
context()->extension()->manifest()->value(), context()->v8_context()));
}
void RuntimeCustomBindings::GetExtensionViews(
const v8::FunctionCallbackInfo<v8::Value>& args) {
CHECK_EQ(args.Length(), 3);
CHECK(args[0]->IsInt32());
CHECK(args[1]->IsInt32());
CHECK(args[2]->IsString());
// |browser_window_id| == extension_misc::kUnknownWindowId means getting
// all views for the current extension.
int browser_window_id = args[0].As<v8::Int32>()->Value();
int tab_id = args[1].As<v8::Int32>()->Value();
std::string view_type_string =
base::ToUpperASCII(*v8::String::Utf8Value(args.GetIsolate(), args[2]));
// |view_type| == VIEW_TYPE_INVALID means getting any type of
// views.
ViewType view_type = VIEW_TYPE_INVALID;
bool parsed_view_type = GetViewTypeFromString(view_type_string, &view_type);
if (!parsed_view_type)
CHECK_EQ("ALL", view_type_string);
const std::string& extension_id = context()->GetExtensionID();
if (extension_id.empty())
return;
// We ignore iframes here. (Returning subframes can cause broken behavior by
// treating an app window's iframe as its main frame, and maybe other
// nastiness).
// TODO(devlin): Why wouldn't we just account for that? It seems like there
// can be reasons to want to access just a frame - especially with isolated
// extension frames in web pages.
v8::Local<v8::Array> v8_views = ExtensionFrameHelper::GetV8MainFrames(
context()->v8_context(), extension_id, browser_window_id, tab_id,
view_type);
args.GetReturnValue().Set(v8_views);
}
} // namespace extensions