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