summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/prefs/browser_prefs.cc2
-rw-r--r--chrome/browser/remoting/firewall_traversal_tab_helper.cc90
-rw-r--r--chrome/browser/remoting/firewall_traversal_tab_helper.h47
-rw-r--r--chrome/browser/remoting/firewall_traversal_tab_helper_unittest.cc52
-rw-r--r--chrome/browser/ui/browser.cc6
-rw-r--r--chrome/browser/ui/tab_contents/tab_contents_wrapper.cc3
-rw-r--r--chrome/browser/ui/tab_contents/tab_contents_wrapper.h2
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--content/common/view_messages.h13
-rw-r--r--content/renderer/render_view.cc12
-rw-r--r--content/renderer/render_view.h7
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);