diff options
-rw-r--r-- | chrome/browser/prefs/browser_prefs.cc | 2 | ||||
-rw-r--r-- | chrome/browser/remoting/firewall_traversal_tab_helper.cc | 90 | ||||
-rw-r--r-- | chrome/browser/remoting/firewall_traversal_tab_helper.h | 47 | ||||
-rw-r--r-- | chrome/browser/remoting/firewall_traversal_tab_helper_unittest.cc | 52 | ||||
-rw-r--r-- | chrome/browser/ui/browser.cc | 6 | ||||
-rw-r--r-- | chrome/browser/ui/tab_contents/tab_contents_wrapper.cc | 3 | ||||
-rw-r--r-- | chrome/browser/ui/tab_contents/tab_contents_wrapper.h | 2 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 1 | ||||
-rw-r--r-- | content/common/view_messages.h | 13 | ||||
-rw-r--r-- | content/renderer/render_view.cc | 12 | ||||
-rw-r--r-- | content/renderer/render_view.h | 7 |
12 files changed, 229 insertions, 8 deletions
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index bbb23f6..dab9d8a 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc @@ -43,6 +43,7 @@ #include "chrome/browser/profiles/profile_impl.h" #include "chrome/browser/profiles/profile_info_cache.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/remoting/firewall_traversal_tab_helper.h" #include "chrome/browser/renderer_host/web_cache_manager.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" #include "chrome/browser/search_engines/template_url_service.h" @@ -177,6 +178,7 @@ void RegisterUserPrefs(PrefService* user_prefs) { InstantController::RegisterUserPrefs(user_prefs); NetPrefObserver::RegisterPrefs(user_prefs); ProtocolHandlerRegistry::RegisterPrefs(user_prefs); + FirewallTraversalTabHelper::RegisterUserPrefs(user_prefs); } void MigrateBrowserPrefs(PrefService* user_prefs, PrefService* local_state) { diff --git a/chrome/browser/remoting/firewall_traversal_tab_helper.cc b/chrome/browser/remoting/firewall_traversal_tab_helper.cc new file mode 100644 index 0000000..73c044b --- /dev/null +++ b/chrome/browser/remoting/firewall_traversal_tab_helper.cc @@ -0,0 +1,90 @@ +// Copyright (c) 2011 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/remoting/firewall_traversal_tab_helper.h" + +#include "base/stringprintf.h" +#include "base/json/json_writer.h" +#include "base/values.h" +#include "chrome/browser/prefs/pref_service.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/common/chrome_notification_types.h" +#include "chrome/common/pref_names.h" +#include "content/browser/renderer_host/render_view_host.h" +#include "content/common/notification_service.h" +#include "content/common/view_messages.h" +#include "ipc/ipc_message_macros.h" + +FirewallTraversalTabHelper::FirewallTraversalTabHelper( + TabContents* tab_contents) + : TabContentsObserver(tab_contents) { + // Register for notifications about all interested prefs change. + PrefService* prefs = profile()->GetPrefs(); + pref_change_registrar_.Init(prefs); + if (prefs) { + pref_change_registrar_.Add(prefs::kRemoteAccessClientFirewallTraversal, + this); + // kRemoteAccessHostFirewallTraversal intentionally not added because + // the host plugin is going to track it itself. + } +} + +FirewallTraversalTabHelper::~FirewallTraversalTabHelper() { + // We don't want any notifications while we're running our destructor. + pref_change_registrar_.RemoveAll(); +} + +// static +void FirewallTraversalTabHelper::RegisterUserPrefs(PrefService* prefs) { + prefs->RegisterBooleanPref(prefs::kRemoteAccessClientFirewallTraversal, + true, + PrefService::UNSYNCABLE_PREF); + prefs->RegisterBooleanPref(prefs::kRemoteAccessHostFirewallTraversal, + true, + PrefService::UNSYNCABLE_PREF); +} + +void FirewallTraversalTabHelper::Observe(int type, + const NotificationSource& source, + const NotificationDetails& details) { + switch (type) { + case chrome::NOTIFICATION_PREF_CHANGED: { + std::string* pref_name_in = Details<std::string>(details).ptr(); + DCHECK(Source<PrefService>(source).ptr() == profile()->GetPrefs()); + if (*pref_name_in == prefs::kRemoteAccessClientFirewallTraversal) { + UpdateFirewallTraversalState(); + } else { + NOTREACHED() << "unexpected pref change notification" << *pref_name_in; + } + break; + } + default: + NOTREACHED(); + } +} + +void FirewallTraversalTabHelper::UpdateFirewallTraversalState() { + const char* pref_name = prefs::kRemoteAccessClientFirewallTraversal; + bool enabled = profile()->GetPrefs()->GetBoolean(pref_name); + + DictionaryValue value; + value.SetBoolean(pref_name, enabled); + std::string policy; + base::JSONWriter::Write(&value, false, &policy); + Send(new ViewMsg_UpdateRemoteAccessClientFirewallTraversal(routing_id(), + policy)); +} + +bool FirewallTraversalTabHelper::OnMessageReceived(const IPC::Message& msg) { + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(FirewallTraversalTabHelper, msg) + IPC_MESSAGE_HANDLER(ViewHostMsg_RequestRemoteAccessClientFirewallTraversal, + UpdateFirewallTraversalState) + + // Have the super handle all other messages. + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + + return handled; +} diff --git a/chrome/browser/remoting/firewall_traversal_tab_helper.h b/chrome/browser/remoting/firewall_traversal_tab_helper.h new file mode 100644 index 0000000..7c975cc --- /dev/null +++ b/chrome/browser/remoting/firewall_traversal_tab_helper.h @@ -0,0 +1,47 @@ +// Copyright (c) 2011 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_REMOTING_FIREWALL_TRAVERSAL_TAB_HELPER_H_ +#define CHROME_BROWSER_REMOTING_FIREWALL_TRAVERSAL_TAB_HELPER_H_ +#pragma once + +#include "chrome/browser/prefs/pref_change_registrar.h" +#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" +#include "content/common/notification_observer.h" +#include "ipc/ipc_channel.h" + +class Profile; + +// Per-tab class to manage the firewall traversal policies for +// the remoting plugin. +// TODO(dmaclach): Replace this with a more generic mechanism for +// plugins to access preferences. http://crbug.com/90543 +class FirewallTraversalTabHelper : public NotificationObserver, + public TabContentsObserver { + public: + explicit FirewallTraversalTabHelper(TabContents* tab_contents); + virtual ~FirewallTraversalTabHelper(); + + static void RegisterUserPrefs(PrefService* prefs); + + // NotificationObserver overrides: + virtual void Observe(int type, + const NotificationSource& source, + const NotificationDetails& details) OVERRIDE; + + // IPC::Channel::Listener overrides: + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; + + private: + Profile* profile() const { return tab_contents()->profile(); } + + void UpdateFirewallTraversalState(); + + // Registers and unregisters us for notifications. + PrefChangeRegistrar pref_change_registrar_; + + DISALLOW_COPY_AND_ASSIGN(FirewallTraversalTabHelper); +}; + +#endif // CHROME_BROWSER_REMOTING_FIREWALL_TRAVERSAL_TAB_HELPER_H_ diff --git a/chrome/browser/remoting/firewall_traversal_tab_helper_unittest.cc b/chrome/browser/remoting/firewall_traversal_tab_helper_unittest.cc new file mode 100644 index 0000000..eba2432 --- /dev/null +++ b/chrome/browser/remoting/firewall_traversal_tab_helper_unittest.cc @@ -0,0 +1,52 @@ +// Copyright (c) 2011 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/remoting/firewall_traversal_tab_helper.h" + +#include "chrome/browser/prefs/pref_service.h" +#include "content/browser/renderer_host/mock_render_process_host.h" +#include "chrome/browser/ui/tab_contents/test_tab_contents_wrapper.h" +#include "chrome/common/chrome_notification_types.h" +#include "chrome/common/pref_names.h" +#include "chrome/test/testing_profile.h" +#include "content/browser/browser_thread.h" +#include "content/browser/tab_contents/test_tab_contents.h" +#include "content/common/notification_service.h" +#include "content/common/view_messages.h" +#include "ipc/ipc_message.h" + +class FirewallTraversalTabHelperTest : public TabContentsWrapperTestHarness { + public: + FirewallTraversalTabHelperTest() + : browser_thread_(BrowserThread::UI, &message_loop_) {} + virtual ~FirewallTraversalTabHelperTest() {} + + private: + BrowserThread browser_thread_; +}; + +// Test receiving message. +TEST_F(FirewallTraversalTabHelperTest, TestBasicMessage) { + IPC::TestSink& sink = process()->sink(); + sink.ClearMessages(); + IPC::Message msg(MSG_ROUTING_NONE, + ViewHostMsg_RequestRemoteAccessClientFirewallTraversal::ID, + IPC::Message::PRIORITY_NORMAL); + ASSERT_TRUE(active_rvh()->TestOnMessageReceived(msg)); + const IPC::Message* expect_msg = sink.GetUniqueMessageMatching( + ViewMsg_UpdateRemoteAccessClientFirewallTraversal::ID); + ASSERT_TRUE(expect_msg); +} + +// Test changing preference. +TEST_F(FirewallTraversalTabHelperTest, TestPrefChange) { + IPC::TestSink& sink = process()->sink(); + sink.ClearMessages(); + contents_wrapper()->profile()->GetPrefs()->SetBoolean( + prefs::kRemoteAccessClientFirewallTraversal, + false); + const IPC::Message* expect_msg = sink.GetUniqueMessageMatching( + ViewMsg_UpdateRemoteAccessClientFirewallTraversal::ID); + ASSERT_TRUE(expect_msg); +} diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 7ff973d..225cb62 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc @@ -2237,12 +2237,6 @@ void Browser::RegisterUserPrefs(PrefService* prefs) { prefs->RegisterBooleanPref(prefs::kEnableBookmarkBar, true, PrefService::UNSYNCABLE_PREF); - prefs->RegisterBooleanPref(prefs::kRemoteAccessClientFirewallTraversal, - true, - PrefService::UNSYNCABLE_PREF); - prefs->RegisterBooleanPref(prefs::kRemoteAccessHostFirewallTraversal, - true, - PrefService::UNSYNCABLE_PREF); prefs->RegisterStringPref(prefs::kCloudPrintEmail, std::string(), PrefService::UNSYNCABLE_PREF); diff --git a/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc b/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc index 14c8c21..651aa09 100644 --- a/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc +++ b/chrome/browser/ui/tab_contents/tab_contents_wrapper.cc @@ -30,6 +30,7 @@ #include "chrome/browser/prerender/prerender_observer.h" #include "chrome/browser/printing/print_preview_message_handler.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/remoting/firewall_traversal_tab_helper.h" #include "chrome/browser/renderer_host/web_cache_manager.h" #include "chrome/browser/renderer_preferences_util.h" #include "chrome/browser/sessions/restore_tab_helper.h" @@ -127,6 +128,8 @@ TabContentsWrapper::TabContentsWrapper(TabContents* contents) extension_tab_helper_.reset(new ExtensionTabHelper(this)); favicon_tab_helper_.reset(new FaviconTabHelper(contents)); find_tab_helper_.reset(new FindTabHelper(contents)); + firewall_traversal_tab_helper_.reset( + new FirewallTraversalTabHelper(contents)); history_tab_helper_.reset(new HistoryTabHelper(contents)); restore_tab_helper_.reset(new RestoreTabHelper(this)); password_manager_delegate_.reset(new PasswordManagerDelegateImpl(this)); diff --git a/chrome/browser/ui/tab_contents/tab_contents_wrapper.h b/chrome/browser/ui/tab_contents/tab_contents_wrapper.h index 1605755..24fa53c 100644 --- a/chrome/browser/ui/tab_contents/tab_contents_wrapper.h +++ b/chrome/browser/ui/tab_contents/tab_contents_wrapper.h @@ -39,6 +39,7 @@ class ExternalProtocolObserver; class FaviconTabHelper; class FileSelectObserver; class FindTabHelper; +class FirewallTraversalTabHelper; class InfoBarDelegate; class HistoryTabHelper; class NavigationController; @@ -300,6 +301,7 @@ class TabContentsWrapper : public TabContentsObserver, scoped_ptr<ExtensionTabHelper> extension_tab_helper_; scoped_ptr<FaviconTabHelper> favicon_tab_helper_; scoped_ptr<FindTabHelper> find_tab_helper_; + scoped_ptr<FirewallTraversalTabHelper> firewall_traversal_tab_helper_; scoped_ptr<HistoryTabHelper> history_tab_helper_; scoped_ptr<RestoreTabHelper> restore_tab_helper_; diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 8329c1e..8a1200c 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -1813,6 +1813,8 @@ 'browser/profiles/profile_manager.cc', 'browser/profiles/profile_manager.h', 'browser/remove_rows_table_model.h', + 'browser/remoting/firewall_traversal_tab_helper.cc', + 'browser/remoting/firewall_traversal_tab_helper.h', 'browser/renderer_host/accelerated_plugin_view_mac.h', 'browser/renderer_host/accelerated_plugin_view_mac.mm', 'browser/renderer_host/accelerated_surface_container_touch.cc', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 8c45f72..2a47e6b 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1589,6 +1589,7 @@ 'browser/profiles/profile_dependency_manager_unittest.cc', 'browser/profiles/profile_info_cache_unittest.cc', 'browser/profiles/profile_manager_unittest.cc', + 'browser/remoting/firewall_traversal_tab_helper_unittest.cc', 'browser/renderer_host/accelerated_plugin_view_mac_unittest.mm', 'browser/renderer_host/gtk_key_bindings_handler_unittest.cc', 'browser/renderer_host/render_widget_host_view_mac_unittest.mm', diff --git a/content/common/view_messages.h b/content/common/view_messages.h index 2ecbaa4..9afc29a 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h @@ -1244,6 +1244,13 @@ IPC_MESSAGE_ROUTED3(ViewMsg_GetSerializedHtmlDataForCurrentPageWithLocalLinks, std::vector<FilePath> /* paths of local copy */, FilePath /* local directory path */) +// Sends updated information about the client firewall traversal policy. +// |traversal_data| is a json string containing policy information. +// Sent due to a policy change or in response to a +// ViewHostMsg_RequestRemoteAccessClientFirewallTraversal message. +IPC_MESSAGE_ROUTED1(ViewMsg_UpdateRemoteAccessClientFirewallTraversal, + std::string /* traversal_data */) + // These three messages are sent to the parent RenderViewHost to display the // page/widget that was created by // CreateWindow/CreateWidget/CreateFullscreenWidget. routing_id @@ -2003,3 +2010,9 @@ IPC_MESSAGE_ROUTED3(ViewHostMsg_SendSerializedHtmlData, GURL /* frame's url */, std::string /* data buffer */, int32 /* complete status */) + +// Request updated information about the client firewall traversal policy. +// Will result in a ViewMsg_UpdateRemoteAccessClientFirewallTraversal message +// being sent back. +IPC_MESSAGE_ROUTED0(ViewHostMsg_RequestRemoteAccessClientFirewallTraversal) + diff --git a/content/renderer/render_view.cc b/content/renderer/render_view.cc index fedaf13..6d698d9 100644 --- a/content/renderer/render_view.cc +++ b/content/renderer/render_view.cc @@ -698,7 +698,8 @@ bool RenderView::OnMessageReceived(const IPC::Message& message) { #if defined(OS_MACOSX) IPC_MESSAGE_HANDLER(ViewMsg_SetInLiveResize, OnSetInLiveResize) #endif - + IPC_MESSAGE_HANDLER(ViewMsg_UpdateRemoteAccessClientFirewallTraversal, + OnUpdateRemoteAccessClientFirewallTraversal) // Have the super handle all other messages. IPC_MESSAGE_UNHANDLED(handled = RenderWidget::OnMessageReceived(message)) IPC_END_MESSAGE_MAP() @@ -3484,6 +3485,11 @@ void RenderView::OnUpdateWebPreferences(const WebPreferences& prefs) { webkit_preferences_.Apply(webview()); } +void RenderView::OnUpdateRemoteAccessClientFirewallTraversal( + const std::string& policy) { + pepper_delegate_.PublishPolicy(policy); +} + void RenderView::OnSetAltErrorPageURL(const GURL& url) { alternate_error_page_url_ = url; } @@ -4098,6 +4104,10 @@ void RenderView::PpapiPluginFocusChanged() { UpdateInputMethod(); } +void RenderView::RequestRemoteAccessClientFirewallTraversal() { + Send(new ViewHostMsg_RequestRemoteAccessClientFirewallTraversal(routing_id_)); +} + void RenderView::OnImeSetComposition( const string16& text, const std::vector<WebKit::WebCompositionUnderline>& underlines, diff --git a/content/renderer/render_view.h b/content/renderer/render_view.h index e933053..16501b8 100644 --- a/content/renderer/render_view.h +++ b/content/renderer/render_view.h @@ -171,7 +171,7 @@ class RenderView : public RenderWidget, public WebKit::WebViewClient, public WebKit::WebFrameClient, public WebKit::WebPageSerializerClient, - public webkit::npapi::WebPluginPageDelegate, + public webkit::npapi::WebPluginPageDelegate, public base::SupportsWeakPtr<RenderView> { public: // Creates a new RenderView. The parent_hwnd specifies a HWND to use as the @@ -310,6 +310,9 @@ class RenderView : public RenderWidget, // Informs the render view that a PPAPI plugin has gained or lost focus. void PpapiPluginFocusChanged(); + // Request updated policy regarding firewall NAT traversal being enabled. + void RequestRemoteAccessClientFirewallTraversal(); + #if defined(OS_MACOSX) // Informs the render view that the given plugin has gained or lost focus. void PluginFocusChanged(bool focused, int plugin_id); @@ -837,6 +840,8 @@ class RenderView : public RenderWidget, void OnUndo(); void OnUpdateTargetURLAck(); void OnUpdateWebPreferences(const WebPreferences& prefs); + void OnUpdateRemoteAccessClientFirewallTraversal(const std::string& policy); + #if defined(OS_MACOSX) void OnWindowFrameChanged(const gfx::Rect& window_frame, const gfx::Rect& view_frame); |