diff options
-rw-r--r-- | chrome/browser/chrome_content_browser_client.cc | 5 | ||||
-rw-r--r-- | chrome/browser/signin/principals_message_filter.cc | 48 | ||||
-rw-r--r-- | chrome/browser/signin/principals_message_filter.h | 38 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | chrome/chrome_renderer.gypi | 2 | ||||
-rw-r--r-- | chrome/common/render_messages.h | 12 | ||||
-rw-r--r-- | chrome/renderer/chrome_content_renderer_client.cc | 6 | ||||
-rw-r--r-- | chrome/renderer/principals_extension_bindings.cc | 128 | ||||
-rw-r--r-- | chrome/renderer/principals_extension_bindings.h | 23 |
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_ |