103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file.
403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "extensions/renderer/guest_view/guest_view_internal_custom_bindings.h"
603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <string>
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/bind.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/renderer/render_view.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/renderer/v8_value_converter.h"
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "extensions/common/extension.h"
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "extensions/common/extension_messages.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/renderer/guest_view/guest_view_container.h"
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "extensions/renderer/script_context.h"
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "v8/include/v8.h"
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using content::V8ValueConverter;
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace extensions {
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)GuestViewInternalCustomBindings::GuestViewInternalCustomBindings(
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ScriptContext* context)
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : ObjectBackedNativeHandler(context) {
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RouteFunction("AttachGuest",
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                base::Bind(&GuestViewInternalCustomBindings::AttachGuest,
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                           base::Unretained(this)));
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void GuestViewInternalCustomBindings::AttachGuest(
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const v8::FunctionCallbackInfo<v8::Value>& args) {
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Allow for an optional callback parameter.
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(args.Length() >= 3 && args.Length() <= 4);
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Element Instance ID.
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(args[0]->IsInt32());
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Guest Instance ID.
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(args[1]->IsInt32());
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Attach Parameters.
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(args[2]->IsObject());
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Optional Callback Function.
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(args.Length() < 4 || args[3]->IsFunction());
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int element_instance_id = args[0]->Int32Value();
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // An element instance ID uniquely identifies a GuestViewContainer within
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // a RenderView.
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GuestViewContainer* guest_view_container =
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GuestViewContainer::FromID(context()->GetRenderView()->GetRoutingID(),
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 element_instance_id);
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(fsamuel): Should we be reporting an error if the element instance ID
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // is invalid?
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!guest_view_container)
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  int guest_instance_id = args[1]->Int32Value();
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> params;
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  {
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create());
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_ptr<base::Value> params_as_value(
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        converter->FromV8Value(args[2], context()->v8_context()));
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    CHECK(params_as_value->IsType(base::Value::TYPE_DICTIONARY));
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    params.reset(
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        static_cast<base::DictionaryValue*>(params_as_value.release()));
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  guest_view_container->AttachGuest(
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      element_instance_id,
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      guest_instance_id,
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      params.Pass(),
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      args.Length() == 4 ? args[3].As<v8::Function>() :
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          v8::Handle<v8::Function>(),
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      args.GetIsolate());
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  args.GetReturnValue().Set(v8::Boolean::New(context()->isolate(), true));
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace extensions
79