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)#ifndef CONTENT_SHELL_BINDING_HELPERS_H_
603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#define CONTENT_SHELL_BINDING_HELPERS_H_
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <string>
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <vector>
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "gin/handle.h"
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "gin/wrappable.h"
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h"
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "third_party/WebKit/public/web/WebKit.h"
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace content {
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)template<class WrappedClass>
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void InstallAsWindowProperties(WrappedClass* wrapped,
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                               blink::WebFrame* frame,
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                               const std::vector<std::string>& names) {
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  v8::Isolate* isolate = blink::mainThreadIsolate();
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  v8::HandleScope handle_scope(isolate);
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  v8::Handle<v8::Context> context = frame->mainWorldScriptContext();
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (context.IsEmpty())
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  v8::Context::Scope context_scope(context);
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gin::Handle<WrappedClass> bindings = gin::CreateHandle(isolate, wrapped);
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (bindings.IsEmpty())
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  v8::Handle<v8::Object> global = context->Global();
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  v8::Handle<v8::Value> v8_bindings = bindings.ToV8();
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  for (size_t i = 0; i < names.size(); ++i)
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    global->Set(gin::StringToV8(isolate, names[i].c_str()), v8_bindings);
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace content
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif  // CONTENT_SHELL_BINDING_HELPERS_DISPATCHER_H_
43