1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "extensions/renderer/document_custom_bindings.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <string>
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "extensions/renderer/script_context.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "v8/include/v8.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace extensions {
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDocumentCustomBindings::DocumentCustomBindings(ScriptContext* context)
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : ObjectBackedNativeHandler(context) {
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RouteFunction("RegisterElement",
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                base::Bind(&DocumentCustomBindings::RegisterElement,
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           base::Unretained(this)));
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Attach an event name to an object.
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid DocumentCustomBindings::RegisterElement(
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const v8::FunctionCallbackInfo<v8::Value>& args) {
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (args.Length() != 2 || !args[0]->IsString() || !args[1]->IsObject()) {
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    NOTREACHED();
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string element_name(*v8::String::Utf8Value(args[0]));
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  v8::Local<v8::Object> options = args[1]->ToObject();
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  blink::WebExceptionCode ec = 0;
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  blink::WebDocument document = context()->web_frame()->document();
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  v8::Handle<v8::Value> constructor = document.registerEmbedderCustomElement(
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      blink::WebString::fromUTF8(element_name), options, ec);
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  args.GetReturnValue().Set(constructor);
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace extensions
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch