1a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "chrome/browser/content_settings/permission_queue_controller.h" 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/synchronization/waitable_event.h" 8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/content_settings/core/common/content_settings_types.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/permission_request_id.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_render_process_host.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 19558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// PermissionQueueControllerTests --------------------------------------------- 20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class PermissionQueueControllerTests : public ChromeRenderViewHostTestHarness { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PermissionQueueControllerTests() {} 24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual ~PermissionQueueControllerTests() {} 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 26a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch PermissionRequestID RequestID(int bridge_id) { 27a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PermissionRequestID( 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) web_contents()->GetRenderProcessHost()->GetID(), 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) web_contents()->GetRenderViewHost()->GetRoutingID(), 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bridge_id, 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL()); 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch private: 35558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // ChromeRenderViewHostTestHarness: 36558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void SetUp() OVERRIDE { 37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ChromeRenderViewHostTestHarness::SetUp(); 38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch InfoBarService::CreateForWebContents(web_contents()); 39558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DISALLOW_COPY_AND_ASSIGN(PermissionQueueControllerTests); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// ObservationCountingQueueController ----------------------------------------- 46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 47a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass ObservationCountingQueueController : public PermissionQueueController { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ObservationCountingQueueController(Profile* profile); 50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual ~ObservationCountingQueueController(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int call_count() const { return call_count_; } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int call_count_; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // PermissionQueueController: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ObservationCountingQueueController); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ObservationCountingQueueController::ObservationCountingQueueController( 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile) 67a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch : PermissionQueueController(profile, CONTENT_SETTINGS_TYPE_GEOLOCATION), 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) call_count_(0) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochObservationCountingQueueController::~ObservationCountingQueueController() { 72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 73558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ObservationCountingQueueController::Observe( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 78558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK_EQ(chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, type); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++call_count_; 80a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch PermissionQueueController::Observe(type, source, details); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Actual tests --------------------------------------------------------------- 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(PermissionQueueControllerTests, OneObservationPerInfoBarCancelled) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When an infobar is cancelled, the infobar helper sends a notification to 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the controller. If the controller has another infobar queued, it should 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // maintain its registration for notifications with the helper, but on the 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // last infobar cancellation it should unregister for notifications. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // What we don't want is for the controller to unregister and then re-register 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for notifications, which can lead to getting notified multiple times. This 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test checks that in the case where the controller should remain registered 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for notifications, it gets notified exactly once." 96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ObservationCountingQueueController queue_controller(profile()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url("http://www.example.com/geolocation"); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<void(bool)> callback; 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) queue_controller.CreateInfoBarRequest( 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RequestID(0), url, url, callback); 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) queue_controller.CreateInfoBarRequest( 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RequestID(1), url, url, callback); 103558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch queue_controller.CancelInfoBarRequest(RequestID(0)); 104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(1, queue_controller.call_count()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 107116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(PermissionQueueControllerTests, FailOnBadPattern) { 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ObservationCountingQueueController queue_controller(profile()); 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL url("chrome://settings"); 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Callback<void(bool)> callback; 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch queue_controller.CreateInfoBarRequest( 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RequestID(0), url, url, callback); 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch queue_controller.CancelInfoBarRequest(RequestID(0)); 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0, queue_controller.call_count()); 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 116