diff options
author | dmaclach@chromium.org <dmaclach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-30 19:13:04 +0000 |
---|---|---|
committer | dmaclach@chromium.org <dmaclach@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-30 19:13:04 +0000 |
commit | 08bb1e7204b84f029d78db6871497bac5597e3a6 (patch) | |
tree | ef5fc030570a71fc03fecc2e46f5976fe0d8f01c /chrome/browser/remoting | |
parent | 48c3d8ee3b7d2e0df0c601a1a2453595cc23314a (diff) | |
download | chromium_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')
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); +} |