summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/chrome_content_browser_client.cc5
-rw-r--r--chrome/browser/signin/principals_message_filter.cc48
-rw-r--r--chrome/browser/signin/principals_message_filter.h38
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/chrome_renderer.gypi2
-rw-r--r--chrome/common/render_messages.h12
-rw-r--r--chrome/renderer/chrome_content_renderer_client.cc6
-rw-r--r--chrome/renderer/principals_extension_bindings.cc128
-rw-r--r--chrome/renderer/principals_extension_bindings.h23
9 files changed, 264 insertions, 0 deletions
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index e6295a4..b75078e 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -70,6 +70,7 @@
#include "chrome/browser/search/instant_service_factory.h"
#include "chrome/browser/search/search.h"
#include "chrome/browser/search_engines/search_provider_install_state_message_filter.h"
+#include "chrome/browser/signin/principals_message_filter.h"
#include "chrome/browser/speech/chrome_speech_recognition_manager_delegate.h"
#include "chrome/browser/speech/tts_message_filter.h"
#include "chrome/browser/ssl/ssl_add_certificate.h"
@@ -936,6 +937,10 @@ void ChromeContentBrowserClient::RenderProcessHostCreated(
#if defined(OS_ANDROID)
host->AddFilter(new EncryptedMediaMessageFilterAndroid());
#endif
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kNewProfileManagement)) {
+ host->AddFilter(new PrincipalsMessageFilter(id));
+ }
host->Send(new ChromeViewMsg_SetIsIncognitoProcess(
profile->IsOffTheRecord()));
diff --git a/chrome/browser/signin/principals_message_filter.cc b/chrome/browser/signin/principals_message_filter.cc
new file mode 100644
index 0000000..a2f76f2
--- /dev/null
+++ b/chrome/browser/signin/principals_message_filter.cc
@@ -0,0 +1,48 @@
+// Copyright 2013 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/browser/signin/principals_message_filter.h"
+
+#include "chrome/common/render_messages.h"
+#include "content/public/browser/browser_thread.h"
+
+PrincipalsMessageFilter::PrincipalsMessageFilter(int render_process_id)
+ : render_process_id_(render_process_id) {}
+
+PrincipalsMessageFilter::~PrincipalsMessageFilter(){}
+
+void PrincipalsMessageFilter::OverrideThreadForMessage(
+ const IPC::Message& message,
+ content::BrowserThread::ID* thread) {
+ // GetManagedAccounts message is synchronous, it must be handled in the IO
+ // thread, so no need to change thread, otherwise switch to UI thread
+ if (message.type() == ChromeViewHostMsg_ShowBrowserAccountManagementUI::ID)
+ *thread = content::BrowserThread::UI;
+}
+
+bool PrincipalsMessageFilter::OnMessageReceived(const IPC::Message& message,
+ bool* message_was_ok) {
+ bool handled = true;
+ IPC_BEGIN_MESSAGE_MAP_EX(PrincipalsMessageFilter, message, *message_was_ok)
+ IPC_MESSAGE_HANDLER(
+ ChromeViewHostMsg_GetManagedAccounts, OnMsgGetManagedAccounts)
+ IPC_MESSAGE_HANDLER(
+ ChromeViewHostMsg_ShowBrowserAccountManagementUI,
+ OnMsgShowBrowserAccountManagementUI)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+ return handled;
+}
+
+
+
+void PrincipalsMessageFilter::OnMsgShowBrowserAccountManagementUI(){
+ // TODO(guohui)
+}
+
+void PrincipalsMessageFilter::OnMsgGetManagedAccounts(
+ const GURL& url, std::vector<std::string>* managed_accounts) {
+ // TODO(guohui)
+}
+
diff --git a/chrome/browser/signin/principals_message_filter.h b/chrome/browser/signin/principals_message_filter.h
new file mode 100644
index 0000000..156a9a9
--- /dev/null
+++ b/chrome/browser/signin/principals_message_filter.h
@@ -0,0 +1,38 @@
+// Copyright 2013 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.
+
+#ifndef CHROME_BROWSER_SIGNIN_PRINCIPALS_MESSAGE_FILTER_H_
+#define CHROME_BROWSER_SIGNIN_PRINCIPALS_MESSAGE_FILTER_H_
+
+#include "content/public/browser/browser_message_filter.h"
+
+class GURL;
+class Profile;
+
+// A message filter implementation that receives messages for browser account
+// management from the renderer.
+class PrincipalsMessageFilter : public content::BrowserMessageFilter {
+ public:
+ explicit PrincipalsMessageFilter(int render_process_id);
+
+ // content::BrowserMessageFilter implementation.
+ virtual void OverrideThreadForMessage(
+ const IPC::Message& message,
+ content::BrowserThread::ID* thread) OVERRIDE;
+ virtual bool OnMessageReceived(const IPC::Message& message,
+ bool* message_was_ok) OVERRIDE;
+
+ private:
+ virtual ~PrincipalsMessageFilter();
+
+ void OnMsgShowBrowserAccountManagementUI();
+ void OnMsgGetManagedAccounts(const GURL& url,
+ std::vector<std::string>* managed_accounts);
+
+ int render_process_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(PrincipalsMessageFilter);
+};
+
+#endif // CHROME_BROWSER_SIGNIN_PRINCIPALS_MESSAGE_FILTER_H_
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 639e858..2aa60ad 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -2037,6 +2037,8 @@
'browser/signin/google_auto_login_helper.h',
'browser/signin/local_auth.cc',
'browser/signin/local_auth.h',
+ 'browser/signin/principals_message_filter.cc',
+ 'browser/signin/principals_message_filter.h',
'browser/signin/profile_oauth2_token_service.cc',
'browser/signin/profile_oauth2_token_service.h',
'browser/signin/profile_oauth2_token_service_factory.cc',
diff --git a/chrome/chrome_renderer.gypi b/chrome/chrome_renderer.gypi
index 0411c70..546b284 100644
--- a/chrome/chrome_renderer.gypi
+++ b/chrome/chrome_renderer.gypi
@@ -180,6 +180,8 @@
'renderer/net_benchmarking_extension.h',
'renderer/playback_extension.cc',
'renderer/playback_extension.h',
+ 'renderer/principals_extension_bindings.cc',
+ 'renderer/principals_extension_bindings.h',
'renderer/resource_bundle_source_map.cc',
'renderer/resource_bundle_source_map.h',
'renderer/resources/extensions/app_custom_bindings.js',
diff --git a/chrome/common/render_messages.h b/chrome/common/render_messages.h
index 8b6167e..6b03d4d 100644
--- a/chrome/common/render_messages.h
+++ b/chrome/common/render_messages.h
@@ -409,6 +409,18 @@ IPC_MESSAGE_ROUTED1(ChromeViewMsg_RetrieveWebappInformation,
GURL /* expected_url */)
#endif // defined(OS_ANDROID)
+// chrome.principals messages ------------------------------------------------
+
+// Message sent from the renderer to the browser to get the list of browser
+// managed accounts for the given origin.
+IPC_SYNC_MESSAGE_CONTROL1_1(ChromeViewHostMsg_GetManagedAccounts,
+ GURL /* current URL */,
+ std::vector<std::string> /* managed accounts */)
+
+// Message sent from the renderer to the browser to show the browser account
+// management UI.
+IPC_MESSAGE_CONTROL0(ChromeViewHostMsg_ShowBrowserAccountManagementUI)
+
// JavaScript related messages -----------------------------------------------
// Notify the JavaScript engine in the render to change its parameters
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index c81bf5d..8abba76 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -53,6 +53,7 @@
#include "chrome/renderer/prerender/prerender_helper.h"
#include "chrome/renderer/prerender/prerender_media_load_deferrer.h"
#include "chrome/renderer/prerender/prerenderer_client.h"
+#include "chrome/renderer/principals_extension_bindings.h"
#include "chrome/renderer/printing/print_web_view_helper.h"
#include "chrome/renderer/safe_browsing/malware_dom_details.h"
#include "chrome/renderer/safe_browsing/phishing_classifier_delegate.h"
@@ -283,6 +284,11 @@ void ChromeContentRendererClient::RenderThreadStarted() {
thread->RegisterExtension(extensions_v8::PlaybackExtension::Get());
}
+ // TODO(guohui): needs to forward the new-profile-management switch to
+ // renderer processes.
+ if (command_line->HasSwitch(switches::kNewProfileManagement))
+ thread->RegisterExtension(extensions_v8::PrincipalsExtension::Get());
+
// chrome:, chrome-search:, chrome-devtools:, and chrome-internal: pages
// should not be accessible by normal content, and should also be unable to
// script anything but themselves (to help limit the damage that a corrupt
diff --git a/chrome/renderer/principals_extension_bindings.cc b/chrome/renderer/principals_extension_bindings.cc
new file mode 100644
index 0000000..8b6bdef
--- /dev/null
+++ b/chrome/renderer/principals_extension_bindings.cc
@@ -0,0 +1,128 @@
+// Copyright 2013 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/principals_extension_bindings.h"
+
+#include "chrome/common/render_messages.h"
+#include "content/public/renderer/render_view.h"
+#include "third_party/WebKit/public/web/WebDocument.h"
+#include "third_party/WebKit/public/web/WebFrame.h"
+#include "third_party/WebKit/public/web/WebView.h"
+#include "v8/include/v8.h"
+
+using blink::WebFrame;
+using blink::WebView;
+using content::RenderView;
+
+namespace {
+
+class PrincipalsExtensionWrapper : public v8::Extension {
+ public:
+ PrincipalsExtensionWrapper();
+
+ private:
+ // v8::Extension overrides.
+ virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate(
+ v8::Isolate* isolate,
+ v8::Handle<v8::String> name) OVERRIDE;
+
+ static RenderView* GetRenderView();
+
+ static void GetManagedAccounts(
+ const v8::FunctionCallbackInfo<v8::Value>& args);
+ static void ShowBrowserAccountManagementUI(
+ const v8::FunctionCallbackInfo<v8::Value>& args);
+
+ DISALLOW_COPY_AND_ASSIGN(PrincipalsExtensionWrapper);
+};
+
+const char* kPrincipalsExtensionName = "v8/Principals";
+const char* kPrincipalsExtensionCode =
+ "var chrome;"
+ "if (!chrome)"
+ " chrome = {};"
+ "if (!chrome.principals)"
+ " chrome.principals = {};"
+ "chrome.principals.getManagedAccounts = function() {"
+ " native function NativeGetManagedAccounts();"
+ " return NativeGetManagedAccounts();"
+ "};"
+ "chrome.principals.showBrowserAccountManagementUI = function() {"
+ " native function ShowBrowserAccountManagementUI();"
+ " ShowBrowserAccountManagementUI();"
+ "};";
+
+PrincipalsExtensionWrapper::PrincipalsExtensionWrapper() : v8::Extension(
+ kPrincipalsExtensionName, kPrincipalsExtensionCode) {}
+
+v8::Handle<v8::FunctionTemplate>
+ PrincipalsExtensionWrapper::GetNativeFunctionTemplate(
+ v8::Isolate* isolate, v8::Handle<v8::String> name) {
+ if (name->Equals(v8::String::NewFromUtf8(
+ isolate, "NativeGetManagedAccounts"))) {
+ return v8::FunctionTemplate::New(GetManagedAccounts);
+ } else if (name->Equals(v8::String::NewFromUtf8(
+ isolate, "ShowBrowserAccountManagementUI"))) {
+ return v8::FunctionTemplate::New(ShowBrowserAccountManagementUI);
+ }
+ return v8::Handle<v8::FunctionTemplate>();
+}
+
+void PrincipalsExtensionWrapper::GetManagedAccounts(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ RenderView* render_view = GetRenderView();
+ if (!render_view) {
+ args.GetReturnValue().SetNull();
+ return;
+ }
+
+ std::vector<std::string> accounts;
+ render_view->Send(new ChromeViewHostMsg_GetManagedAccounts(
+ WebFrame::frameForCurrentContext()->document().url(),
+ &accounts));
+
+ v8::Isolate* isolate = args.GetIsolate();
+ v8::Local<v8::Array> v8_result = v8::Array::New(isolate);
+ int v8_index = 0;
+ for (std::vector<std::string>::const_iterator it = accounts.begin();
+ it != accounts.end(); ++it) {
+ v8_result->Set(v8::Integer::New(isolate, v8_index++),
+ v8::String::NewFromUtf8(isolate, it->c_str(),
+ v8::String::kNormalString, it->length()));
+ }
+ args.GetReturnValue().Set(v8_result);
+}
+
+void PrincipalsExtensionWrapper::ShowBrowserAccountManagementUI(
+ const v8::FunctionCallbackInfo<v8::Value>& args) {
+ // TODO(guohui): need to figure out how to prevent abuse.
+ RenderView* render_view = GetRenderView();
+ if (!render_view) return;
+
+ render_view->Send(new ChromeViewHostMsg_ShowBrowserAccountManagementUI());
+}
+
+RenderView* PrincipalsExtensionWrapper::GetRenderView() {
+ WebFrame* webframe = WebFrame::frameForCurrentContext();
+ DCHECK(webframe) << "There should be an active frame since we just got "
+ "a native function called.";
+ if (!webframe)
+ return NULL;
+
+ WebView* webview = webframe->view();
+ if (!webview) // can happen during closing
+ return NULL;
+
+ return RenderView::FromWebView(webview);
+}
+
+} // namespace
+
+namespace extensions_v8 {
+
+v8::Extension* PrincipalsExtension::Get() {
+ return new PrincipalsExtensionWrapper();
+}
+
+} // namespace extensions_v8
diff --git a/chrome/renderer/principals_extension_bindings.h b/chrome/renderer/principals_extension_bindings.h
new file mode 100644
index 0000000..0884896
--- /dev/null
+++ b/chrome/renderer/principals_extension_bindings.h
@@ -0,0 +1,23 @@
+// Copyright 2013 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.
+
+// A v8 extension to expose Chrome account management functions.
+
+#ifndef CHROME_RENDERER_PRINCIPALS_EXTENSION_BINDINGS_H_
+#define CHROME_RENDERER_PRINCIPALS_EXTENSION_BINDINGS_H_
+
+namespace v8 {
+class Extension;
+}
+
+namespace extensions_v8 {
+
+class PrincipalsExtension {
+ public:
+ static v8::Extension* Get();
+};
+
+} // namespace extensions_v8
+
+#endif // CHROME_RENDERER_PRINCIPALS_EXTENSION_BINDINGS_H_