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