summaryrefslogtreecommitdiffstats
path: root/chrome/browser/remoting
diff options
context:
space:
mode:
authordmaclach@chromium.org <dmaclach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-30 19:13:04 +0000
committerdmaclach@chromium.org <dmaclach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-30 19:13:04 +0000
commit08bb1e7204b84f029d78db6871497bac5597e3a6 (patch)
treeef5fc030570a71fc03fecc2e46f5976fe0d8f01c /chrome/browser/remoting
parent48c3d8ee3b7d2e0df0c601a1a2453595cc23314a (diff)
downloadchromium_src-08bb1e7204b84f029d78db6871497bac5597e3a6.zip
chromium_src-08bb1e7204b84f029d78db6871497bac5597e3a6.tar.gz
chromium_src-08bb1e7204b84f029d78db6871497bac5597e3a6.tar.bz2
Connect up firewall control preferences with PPAPI.
This is a temporary measure to get the control required for Chromoting in M14. We will be rearchitecting this in the future (http://code.google.com/p/chromium/issues/detail?id=90543) BUG=NONE TEST=NONE Review URL: http://codereview.chromium.org/7465064 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@94844 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/remoting')
-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
3 files changed, 189 insertions, 0 deletions
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);
+}