summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/extensions/guest_view_internal_custom_bindings.cc
blob: 4cc0d4dd31174d821dd9fccd998989699f5ad804 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// 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 "chrome/renderer/extensions/guest_view_internal_custom_bindings.h"

#include <string>

#include "base/bind.h"
#include "chrome/common/extensions/chrome_extension_messages.h"
#include "content/public/renderer/render_frame.h"
#include "content/public/renderer/render_view.h"
#include "content/public/renderer/v8_value_converter.h"
#include "extensions/common/extension.h"
#include "extensions/renderer/script_context.h"
#include "v8/include/v8.h"

using content::V8ValueConverter;

namespace extensions {

GuestViewInternalCustomBindings::GuestViewInternalCustomBindings(
    ScriptContext* context)
    : ObjectBackedNativeHandler(context) {
  RouteFunction("AttachGuest",
                base::Bind(&GuestViewInternalCustomBindings::AttachGuest,
                           base::Unretained(this)));
}

void GuestViewInternalCustomBindings::AttachGuest(
    const v8::FunctionCallbackInfo<v8::Value>& args) {
  CHECK(args.Length() == 3 && args[0]->IsInt32() && args[1]->IsInt32() &&
      args[2]->IsObject());

  content::RenderFrame* render_frame = context()->GetRenderFrame();
  if (!render_frame)
    return;

  int element_instance_id = args[0]->Int32Value();
  int guest_instance_id = args[1]->Int32Value();

  scoped_ptr<base::DictionaryValue> params;
  {
    scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create());
    scoped_ptr<base::Value> params_as_value(
        converter->FromV8Value(args[2], context()->v8_context()));
    CHECK(params_as_value->IsType(base::Value::TYPE_DICTIONARY));
    params.reset(
        static_cast<base::DictionaryValue*>(params_as_value.release()));
  }

  // Step 1, send the attach params to chrome/.
  render_frame->Send(new ChromeExtensionHostMsg_AttachGuest(
      render_frame->GetRenderView()->GetRoutingID(),
      element_instance_id,
      guest_instance_id,
      *params));

  // Step 2, attach plugin through content/.
  render_frame->AttachGuest(element_instance_id);

  args.GetReturnValue().Set(v8::Boolean::New(context()->isolate(), true));
}

}  // namespace extensions