Home | History | Annotate | Download | only in renderer
      1 // Copyright 2013 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 "chrome/renderer/principals_extension_bindings.h"
      6 
      7 #include "chrome/common/render_messages.h"
      8 #include "content/public/renderer/render_view.h"
      9 #include "third_party/WebKit/public/web/WebDocument.h"
     10 #include "third_party/WebKit/public/web/WebLocalFrame.h"
     11 #include "third_party/WebKit/public/web/WebView.h"
     12 #include "v8/include/v8.h"
     13 
     14 using blink::WebLocalFrame;
     15 using blink::WebView;
     16 using content::RenderView;
     17 
     18 namespace {
     19 
     20 class PrincipalsExtensionWrapper : public v8::Extension {
     21  public:
     22   PrincipalsExtensionWrapper();
     23 
     24  private:
     25   // v8::Extension overrides.
     26   virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate(
     27       v8::Isolate* isolate,
     28       v8::Handle<v8::String> name) OVERRIDE;
     29 
     30   static RenderView* GetRenderView();
     31 
     32   static void GetManagedAccounts(
     33       const v8::FunctionCallbackInfo<v8::Value>& args);
     34   static void ShowBrowserAccountManagementUI(
     35       const v8::FunctionCallbackInfo<v8::Value>& args);
     36 
     37   DISALLOW_COPY_AND_ASSIGN(PrincipalsExtensionWrapper);
     38 };
     39 
     40 const char* kPrincipalsExtensionName = "v8/Principals";
     41 const char* kPrincipalsExtensionCode =
     42     "var chrome;"
     43     "if (!chrome)"
     44     "  chrome = {};"
     45     "if (!chrome.principals)"
     46     "  chrome.principals = {};"
     47     "chrome.principals.getManagedAccounts = function() {"
     48     "  native function NativeGetManagedAccounts();"
     49     "  return NativeGetManagedAccounts();"
     50     "};"
     51     "chrome.principals.showBrowserAccountManagementUI = function() {"
     52     "  native function ShowBrowserAccountManagementUI();"
     53     "  ShowBrowserAccountManagementUI();"
     54     "};";
     55 
     56 PrincipalsExtensionWrapper::PrincipalsExtensionWrapper() : v8::Extension(
     57     kPrincipalsExtensionName, kPrincipalsExtensionCode) {}
     58 
     59 v8::Handle<v8::FunctionTemplate>
     60     PrincipalsExtensionWrapper::GetNativeFunctionTemplate(
     61         v8::Isolate* isolate, v8::Handle<v8::String> name) {
     62   if (name->Equals(v8::String::NewFromUtf8(
     63       isolate, "NativeGetManagedAccounts"))) {
     64     return v8::FunctionTemplate::New(isolate, GetManagedAccounts);
     65   } else if (name->Equals(v8::String::NewFromUtf8(
     66       isolate, "ShowBrowserAccountManagementUI"))) {
     67     return v8::FunctionTemplate::New(isolate, ShowBrowserAccountManagementUI);
     68   }
     69   return v8::Handle<v8::FunctionTemplate>();
     70 }
     71 
     72 void PrincipalsExtensionWrapper::GetManagedAccounts(
     73     const v8::FunctionCallbackInfo<v8::Value>& args) {
     74   RenderView* render_view = GetRenderView();
     75   if (!render_view) {
     76     args.GetReturnValue().SetNull();
     77     return;
     78   }
     79 
     80   std::vector<std::string> accounts;
     81   render_view->Send(new ChromeViewHostMsg_GetManagedAccounts(
     82       WebLocalFrame::frameForCurrentContext()->document().url(),
     83       &accounts));
     84 
     85   v8::Isolate* isolate = args.GetIsolate();
     86   v8::Local<v8::Array> v8_result = v8::Array::New(isolate);
     87   int v8_index = 0;
     88   for (std::vector<std::string>::const_iterator it = accounts.begin();
     89        it != accounts.end(); ++it) {
     90     v8_result->Set(v8::Integer::New(isolate, v8_index++),
     91         v8::String::NewFromUtf8(isolate, it->c_str(),
     92                                 v8::String::kNormalString, it->length()));
     93   }
     94   args.GetReturnValue().Set(v8_result);
     95 }
     96 
     97 void PrincipalsExtensionWrapper::ShowBrowserAccountManagementUI(
     98     const v8::FunctionCallbackInfo<v8::Value>& args) {
     99   // TODO(guohui): need to figure out how to prevent abuse.
    100   RenderView* render_view = GetRenderView();
    101   if (!render_view) return;
    102 
    103   render_view->Send(new ChromeViewHostMsg_ShowBrowserAccountManagementUI());
    104 }
    105 
    106 RenderView* PrincipalsExtensionWrapper::GetRenderView() {
    107   WebLocalFrame* webframe = WebLocalFrame::frameForCurrentContext();
    108   DCHECK(webframe) << "There should be an active frame since we just got "
    109       "a native function called.";
    110   if (!webframe)
    111     return NULL;
    112 
    113   WebView* webview = webframe->view();
    114   if (!webview)  // can happen during closing
    115     return NULL;
    116 
    117   return RenderView::FromWebView(webview);
    118 }
    119 
    120 }  // namespace
    121 
    122 namespace extensions_v8 {
    123 
    124 v8::Extension* PrincipalsExtension::Get() {
    125   return new PrincipalsExtensionWrapper();
    126 }
    127 
    128 }  // namespace extensions_v8
    129