| OLD | NEW | 
| (Empty) |  | 
 |    1 // Copyright 2016 The Chromium Authors. All rights reserved. | 
 |    2 // Use of this source code is governed by a BSD-style license that can be | 
 |    3 // found in the LICENSE file. | 
 |    4  | 
 |    5 #include "android_webview/browser/aw_permission_manager.h" | 
 |    6  | 
 |    7 #include <list> | 
 |    8 #include <memory> | 
 |    9  | 
 |   10 #include "android_webview/browser/aw_browser_permission_request_delegate.h" | 
 |   11 #include "base/bind.h" | 
 |   12 #include "base/bind_helpers.h" | 
 |   13 #include "base/memory/ptr_util.h" | 
 |   14 #include "content/public/browser/permission_manager.h" | 
 |   15 #include "content/public/browser/permission_type.h" | 
 |   16 #include "testing/gtest/include/gtest/gtest.h" | 
 |   17 #include "url/gurl.h" | 
 |   18  | 
 |   19 using base::MakeUnique; | 
 |   20 using blink::mojom::PermissionStatus; | 
 |   21 using content::PermissionType; | 
 |   22  | 
 |   23 namespace android_webview { | 
 |   24  | 
 |   25 namespace { | 
 |   26  | 
 |   27 int kNoPendingOperation = -1; | 
 |   28  | 
 |   29 int kRenderProcessIDForTesting = 8; | 
 |   30 int kRenderFrameIDForTesting = 19; | 
 |   31 const char kEmbeddingOrigin[] = "https://www.google.com"; | 
 |   32 const char kRequestingOrigin1[] = "https://www.google.com"; | 
 |   33 const char kRequestingOrigin2[] = "https://www.chromium.org"; | 
 |   34  | 
 |   35 class AwBrowserPermissionRequestDelegateForTesting | 
 |   36     : public AwBrowserPermissionRequestDelegate { | 
 |   37  public: | 
 |   38   void EnqueueResponse(const std::string& origin, | 
 |   39                        PermissionType type, | 
 |   40                        bool grant) { | 
 |   41     for (auto it = request_.begin(); it != request_.end(); ++it) { | 
 |   42       if ((*it)->type != type || (*it)->origin != GURL(origin)) | 
 |   43         continue; | 
 |   44       const base::Callback<void(bool)> callback = (*it)->callback; | 
 |   45       request_.erase(it); | 
 |   46       callback.Run(grant); | 
 |   47       return; | 
 |   48     } | 
 |   49     response_.push_back(MakeUnique<Response>(origin, type, grant)); | 
 |   50   } | 
 |   51  | 
 |   52   // AwBrowserPermissionRequestDelegate: | 
 |   53   void RequestProtectedMediaIdentifierPermission( | 
 |   54       const GURL& origin, | 
 |   55       const base::Callback<void(bool)>& callback) override {} | 
 |   56  | 
 |   57   void CancelProtectedMediaIdentifierPermissionRequests( | 
 |   58       const GURL& origin) override {} | 
 |   59  | 
 |   60   void RequestGeolocationPermission( | 
 |   61       const GURL& origin, | 
 |   62       const base::Callback<void(bool)>& callback) override { | 
 |   63     RequestPermission(origin, PermissionType::GEOLOCATION, callback); | 
 |   64   } | 
 |   65  | 
 |   66   void CancelGeolocationPermissionRequests(const GURL& origin) override { | 
 |   67     CancelPermission(origin, PermissionType::GEOLOCATION); | 
 |   68   } | 
 |   69  | 
 |   70   void RequestMIDISysexPermission( | 
 |   71       const GURL& origin, | 
 |   72       const base::Callback<void(bool)>& callback) override { | 
 |   73     RequestPermission(origin, PermissionType::MIDI_SYSEX, callback); | 
 |   74   } | 
 |   75  | 
 |   76   void CancelMIDISysexPermissionRequests(const GURL& origin) override { | 
 |   77     CancelPermission(origin, PermissionType::MIDI_SYSEX); | 
 |   78   } | 
 |   79  | 
 |   80  private: | 
 |   81   void RequestPermission(const GURL& origin, | 
 |   82                          PermissionType type, | 
 |   83                          const base::Callback<void(bool)>& callback) { | 
 |   84     for (auto it = response_.begin(); it != response_.end(); ++it) { | 
 |   85       if ((*it)->type != type || (*it)->origin != origin) | 
 |   86         continue; | 
 |   87       bool grant = (*it)->grant; | 
 |   88       response_.erase(it); | 
 |   89       callback.Run(grant); | 
 |   90       return; | 
 |   91     } | 
 |   92     request_.push_back(MakeUnique<Request>(origin, type, callback)); | 
 |   93   } | 
 |   94  | 
 |   95   void CancelPermission(const GURL& origin, PermissionType type) { | 
 |   96     for (auto it = request_.begin(); it != request_.end(); ++it) { | 
 |   97       if ((*it)->type != type || (*it)->origin != origin) | 
 |   98         continue; | 
 |   99       request_.erase(it); | 
 |  100       return; | 
 |  101     } | 
 |  102     NOTREACHED(); | 
 |  103   } | 
 |  104  | 
 |  105  private: | 
 |  106   struct Request { | 
 |  107     GURL origin; | 
 |  108     PermissionType type; | 
 |  109     base::Callback<void(bool)> callback; | 
 |  110  | 
 |  111     Request(const GURL& origin, | 
 |  112             PermissionType type, | 
 |  113             const base::Callback<void(bool)>& callback) | 
 |  114         : origin(origin), type(type), callback(callback) {} | 
 |  115   }; | 
 |  116  | 
 |  117   struct Response { | 
 |  118     GURL origin; | 
 |  119     PermissionType type; | 
 |  120     bool grant; | 
 |  121  | 
 |  122     Response(const std::string& origin, PermissionType type, bool grant) | 
 |  123         : origin(GURL(origin)), type(type), grant(grant) {} | 
 |  124  | 
 |  125   }; | 
 |  126  | 
 |  127   std::list<std::unique_ptr<Response>> response_; | 
 |  128   std::list<std::unique_ptr<Request>> request_; | 
 |  129 }; | 
 |  130  | 
 |  131 class AwPermissionManagerForTesting : public AwPermissionManager { | 
 |  132  public: | 
 |  133   ~AwPermissionManagerForTesting() override { | 
 |  134     // Call CancelPermissionRequests() from here so that it calls virtual | 
 |  135     // methods correctly. | 
 |  136     CancelPermissionRequests(); | 
 |  137   } | 
 |  138  | 
 |  139   void EnqueuePermissionResponse(const std::string& origin, | 
 |  140                                  PermissionType type, | 
 |  141                                  bool grant) { | 
 |  142     delegate()->EnqueueResponse(origin, type, grant); | 
 |  143   } | 
 |  144  | 
 |  145  private: | 
 |  146   AwBrowserPermissionRequestDelegateForTesting* delegate() { | 
 |  147     if (!delegate_) | 
 |  148       delegate_.reset(new AwBrowserPermissionRequestDelegateForTesting); | 
 |  149     return delegate_.get(); | 
 |  150   } | 
 |  151  | 
 |  152   // AwPermissionManager: | 
 |  153   int GetRenderProcessID(content::RenderFrameHost* render_frame_host) override { | 
 |  154     return kRenderProcessIDForTesting; | 
 |  155   } | 
 |  156  | 
 |  157   int GetRenderFrameID(content::RenderFrameHost* render_frame_host) override { | 
 |  158     return kRenderFrameIDForTesting; | 
 |  159   } | 
 |  160  | 
 |  161   GURL LastCommittedOrigin( | 
 |  162       content::RenderFrameHost* render_frame_host) override { | 
 |  163     return GURL(kEmbeddingOrigin); | 
 |  164   } | 
 |  165  | 
 |  166   AwBrowserPermissionRequestDelegate* GetDelegate( | 
 |  167       int render_process_id, | 
 |  168       int render_frame_id) override { | 
 |  169     CHECK_EQ(kRenderProcessIDForTesting, render_process_id); | 
 |  170     CHECK_EQ(kRenderFrameIDForTesting, render_frame_id); | 
 |  171     return delegate(); | 
 |  172   } | 
 |  173  | 
 |  174   std::unique_ptr<AwBrowserPermissionRequestDelegateForTesting> delegate_; | 
 |  175 }; | 
 |  176  | 
 |  177 class AwPermissionManagerTest : public testing::Test { | 
 |  178  public: | 
 |  179   AwPermissionManagerTest() | 
 |  180       : render_frame_host(nullptr) {} | 
 |  181  | 
 |  182   void PermissionRequestResponse(int id, const PermissionStatus status) { | 
 |  183     resolved_permission_status.push_back(status); | 
 |  184     resolved_permission_request_id.push_back(id); | 
 |  185   } | 
 |  186  | 
 |  187   void PermissionsRequestResponse(int id, | 
 |  188                                   const std::vector<PermissionStatus>& status) { | 
 |  189     resolved_permission_status.insert(resolved_permission_status.end(), | 
 |  190                                       status.begin(), status.end()); | 
 |  191     for (size_t i = 0; i < status.size(); ++i) | 
 |  192       resolved_permission_request_id.push_back(id); | 
 |  193   } | 
 |  194  | 
 |  195  protected: | 
 |  196   void SetUp() override { manager.reset(new AwPermissionManagerForTesting); } | 
 |  197   void TearDown() override { manager.reset(); } | 
 |  198  | 
 |  199   void EnqueuePermissionResponse(const std::string& origin, | 
 |  200                                  PermissionType type, | 
 |  201                                  bool grant) { | 
 |  202     CHECK(manager); | 
 |  203     manager->EnqueuePermissionResponse(origin, type, grant); | 
 |  204   } | 
 |  205  | 
 |  206   std::unique_ptr<AwPermissionManagerForTesting> manager; | 
 |  207  | 
 |  208   // Use nullptr for testing. AwPermissionManagerForTesting override all methods | 
 |  209   // that touch RenderFrameHost to work with nullptr. | 
 |  210   content::RenderFrameHost* render_frame_host; | 
 |  211  | 
 |  212   std::vector<PermissionStatus> resolved_permission_status; | 
 |  213   std::vector<int> resolved_permission_request_id; | 
 |  214 }; | 
 |  215  | 
 |  216 // The most simple test, PermissionType::MIDI is hard-coded to be granted. | 
 |  217 TEST_F(AwPermissionManagerTest, MIDIPermissionIsGrantedSynchronously) { | 
 |  218   int request_id = manager->RequestPermission( | 
 |  219       PermissionType::MIDI, render_frame_host, GURL(kRequestingOrigin1), true, | 
 |  220       base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  221                  base::Unretained(this), 0)); | 
 |  222   EXPECT_EQ(kNoPendingOperation, request_id); | 
 |  223   ASSERT_EQ(1u, resolved_permission_status.size()); | 
 |  224   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | 
 |  225 } | 
 |  226  | 
 |  227 // Test the case a delegate is called, and it resolves the permission | 
 |  228 // synchronously. | 
 |  229 TEST_F(AwPermissionManagerTest, SinglePermissionRequestIsGrantedSynchronously) { | 
 |  230   // Permission should be granted in this scenario. | 
 |  231   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  232                                      PermissionType::GEOLOCATION, true); | 
 |  233   int request_id = manager->RequestPermission( | 
 |  234       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | 
 |  235       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  236                        base::Unretained(this), 0)); | 
 |  237   EXPECT_EQ(kNoPendingOperation, request_id); | 
 |  238   ASSERT_EQ(1u, resolved_permission_status.size()); | 
 |  239   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | 
 |  240  | 
 |  241   // Permission should not be granted in this scenario. | 
 |  242   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  243                                      PermissionType::GEOLOCATION, false); | 
 |  244   request_id = manager->RequestPermission( | 
 |  245       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | 
 |  246       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  247                        base::Unretained(this), 0)); | 
 |  248   EXPECT_EQ(kNoPendingOperation, request_id); | 
 |  249   ASSERT_EQ(2u, resolved_permission_status.size()); | 
 |  250   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[1]); | 
 |  251 } | 
 |  252  | 
 |  253 // Test the case a delegate is called, and it resolves the permission | 
 |  254 // asynchronously. | 
 |  255 TEST_F(AwPermissionManagerTest, | 
 |  256        SinglePermissionRequestIsGrantedAsynchronously) { | 
 |  257   int request_id = manager->RequestPermission( | 
 |  258       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | 
 |  259       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  260                        base::Unretained(this), 0)); | 
 |  261   EXPECT_NE(kNoPendingOperation, request_id); | 
 |  262   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  263  | 
 |  264   // This will resolve the permission. | 
 |  265   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  266                                      PermissionType::GEOLOCATION, true); | 
 |  267  | 
 |  268   ASSERT_EQ(1u, resolved_permission_status.size()); | 
 |  269   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | 
 |  270 } | 
 |  271  | 
 |  272 // Test the case a delegate is called, and the manager is deleted before the | 
 |  273 // delegate callback is invoked. | 
 |  274 TEST_F(AwPermissionManagerTest, ManagerIsDeletedWhileDelegateProcesses) { | 
 |  275   int request_id = manager->RequestPermission( | 
 |  276       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | 
 |  277       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  278                        base::Unretained(this), 0)); | 
 |  279  | 
 |  280   EXPECT_NE(kNoPendingOperation, request_id); | 
 |  281   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  282  | 
 |  283   // Delete the manager. | 
 |  284   manager.reset(); | 
 |  285  | 
 |  286   // All requests are cancelled internally. | 
 |  287   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  288 } | 
 |  289  | 
 |  290 // Test the case multiple permissions are requested for the same origin, and the | 
 |  291 // second permission is also resolved when the first permission is resolved. | 
 |  292 TEST_F(AwPermissionManagerTest, | 
 |  293        MultiplePermissionRequestsAreGrantedTogether) { | 
 |  294   int request_1 = manager->RequestPermission( | 
 |  295       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | 
 |  296       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  297                        base::Unretained(this), 1)); | 
 |  298   EXPECT_NE(kNoPendingOperation, request_1); | 
 |  299  | 
 |  300   int request_2 = manager->RequestPermission( | 
 |  301       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | 
 |  302       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  303                        base::Unretained(this), 2)); | 
 |  304   EXPECT_NE(kNoPendingOperation, request_2); | 
 |  305  | 
 |  306   EXPECT_NE(request_1, request_2); | 
 |  307   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  308  | 
 |  309   // This will resolve the permission. | 
 |  310   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  311                                      PermissionType::GEOLOCATION, true); | 
 |  312  | 
 |  313   ASSERT_EQ(2u, resolved_permission_status.size()); | 
 |  314   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | 
 |  315   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[1]); | 
 |  316 } | 
 |  317  | 
 |  318 // Test the case multiple permissions are requested for different origins, and | 
 |  319 // each permission is resolved respectively in the requested order. | 
 |  320 TEST_F(AwPermissionManagerTest, | 
 |  321        MultiplePermissionRequestsAreGrantedRespectively) { | 
 |  322   int request_1 = manager->RequestPermission( | 
 |  323       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | 
 |  324       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  325                        base::Unretained(this), 1)); | 
 |  326   EXPECT_NE(kNoPendingOperation, request_1); | 
 |  327  | 
 |  328   int request_2 = manager->RequestPermission( | 
 |  329       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin2), | 
 |  330       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  331                        base::Unretained(this), 2)); | 
 |  332   EXPECT_NE(kNoPendingOperation, request_2); | 
 |  333  | 
 |  334   EXPECT_NE(request_1, request_2); | 
 |  335   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  336  | 
 |  337   // This will resolve the first request. | 
 |  338   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  339                                      PermissionType::GEOLOCATION, true); | 
 |  340  | 
 |  341   ASSERT_EQ(1u, resolved_permission_status.size()); | 
 |  342   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | 
 |  343   EXPECT_EQ(1, resolved_permission_request_id[0]); | 
 |  344  | 
 |  345   // This will resolve the second request. | 
 |  346   manager->EnqueuePermissionResponse(kRequestingOrigin2, | 
 |  347                                      PermissionType::GEOLOCATION, false); | 
 |  348   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[1]); | 
 |  349   EXPECT_EQ(2, resolved_permission_request_id[1]); | 
 |  350 } | 
 |  351  | 
 |  352 // Test the case multiple permissions are requested through single | 
 |  353 // RequestPermissions call, then resolved synchronously. | 
 |  354 TEST_F(AwPermissionManagerTest, | 
 |  355        SinglePermissionsRequestIsGrantedSynchronously) { | 
 |  356   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  357                                      PermissionType::MIDI_SYSEX, false); | 
 |  358  | 
 |  359   std::vector<PermissionType> permissions = {PermissionType::MIDI, | 
 |  360                                              PermissionType::MIDI_SYSEX}; | 
 |  361  | 
 |  362   int request_id = manager->RequestPermissions( | 
 |  363       permissions, | 
 |  364       render_frame_host, GURL(kRequestingOrigin1), | 
 |  365       true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  366                        base::Unretained(this), 0)); | 
 |  367   EXPECT_EQ(kNoPendingOperation, request_id); | 
 |  368  | 
 |  369   ASSERT_EQ(2u, resolved_permission_status.size()); | 
 |  370   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | 
 |  371   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[1]); | 
 |  372 } | 
 |  373  | 
 |  374 // Test the case multiple permissions are requested through single | 
 |  375 // RequestPermissions call, then one is resolved synchronously, the other is | 
 |  376 // resolved asynchronously. | 
 |  377 TEST_F(AwPermissionManagerTest, | 
 |  378        SinglePermissionsRequestIsGrantedAsynchronously) { | 
 |  379   std::vector<PermissionType> permissions = {PermissionType::MIDI, | 
 |  380                                              PermissionType::MIDI_SYSEX}; | 
 |  381  | 
 |  382   int request_id = manager->RequestPermissions( | 
 |  383       permissions, | 
 |  384       render_frame_host, GURL(kRequestingOrigin1), | 
 |  385       true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  386                        base::Unretained(this), 0)); | 
 |  387   EXPECT_NE(kNoPendingOperation, request_id); | 
 |  388  | 
 |  389   // PermissionType::MIDI is resolved synchronously, but all permissions result | 
 |  390   // are notified together when all permissions are resolved. | 
 |  391   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  392  | 
 |  393   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  394                                      PermissionType::MIDI_SYSEX, false); | 
 |  395  | 
 |  396   ASSERT_EQ(2u, resolved_permission_status.size()); | 
 |  397   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | 
 |  398   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[1]); | 
 |  399 } | 
 |  400  | 
 |  401 // Test the case multiple permissions are requested multiple times as follow. | 
 |  402 //  1. Permission A and B are requested. | 
 |  403 //  2. Permission A is resolved. | 
 |  404 //  3. Permission A is requested for the same origin before the B is resolved. | 
 |  405 TEST_F(AwPermissionManagerTest, ComplicatedRequestScenario1) { | 
 |  406   // In the first case, the permission A is a type that does not call an | 
 |  407   // internal delegate method. | 
 |  408   std::vector<PermissionType> permissions_1 = {PermissionType::MIDI, | 
 |  409                                                PermissionType::MIDI_SYSEX}; | 
 |  410  | 
 |  411   int request_1 = manager->RequestPermissions( | 
 |  412       permissions_1, | 
 |  413       render_frame_host, GURL(kRequestingOrigin1), | 
 |  414       true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  415                        base::Unretained(this), 1)); | 
 |  416   EXPECT_NE(kNoPendingOperation, request_1); | 
 |  417   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  418  | 
 |  419   int request_2 = manager->RequestPermission( | 
 |  420       PermissionType::MIDI, render_frame_host, GURL(kRequestingOrigin1), true, | 
 |  421       base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  422                  base::Unretained(this), 2)); | 
 |  423   EXPECT_EQ(kNoPendingOperation, request_2); | 
 |  424   ASSERT_EQ(1u, resolved_permission_status.size()); | 
 |  425   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | 
 |  426   EXPECT_EQ(2, resolved_permission_request_id[0]); | 
 |  427  | 
 |  428   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  429                                      PermissionType::MIDI_SYSEX, true); | 
 |  430  | 
 |  431   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  432   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[1]); | 
 |  433   EXPECT_EQ(1, resolved_permission_request_id[1]); | 
 |  434   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[2]); | 
 |  435   EXPECT_EQ(1, resolved_permission_request_id[2]); | 
 |  436  | 
 |  437   // In the second case, the permission A is a type that calls an internal | 
 |  438   // delegate method. | 
 |  439   std::vector<PermissionType> permissions_2 = {PermissionType::GEOLOCATION, | 
 |  440                                                PermissionType::MIDI_SYSEX}; | 
 |  441  | 
 |  442   int request_3 = manager->RequestPermissions( | 
 |  443       permissions_2, | 
 |  444       render_frame_host, GURL(kRequestingOrigin1), | 
 |  445       true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  446                        base::Unretained(this), 3)); | 
 |  447   EXPECT_NE(kNoPendingOperation, request_3); | 
 |  448   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  449  | 
 |  450   // The permission A is resolved, but the first request isn't finished. | 
 |  451   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  452                                      PermissionType::GEOLOCATION, false); | 
 |  453   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  454  | 
 |  455   int request_4 = manager->RequestPermission( | 
 |  456       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | 
 |  457       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  458                        base::Unretained(this), 4)); | 
 |  459   // The second request is finished first by using the resolved result for the | 
 |  460   // first request. | 
 |  461   EXPECT_EQ(kNoPendingOperation, request_4); | 
 |  462   ASSERT_EQ(4u, resolved_permission_status.size()); | 
 |  463   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[3]); | 
 |  464   EXPECT_EQ(4, resolved_permission_request_id[3]); | 
 |  465  | 
 |  466   // Then the first request is finished. | 
 |  467   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  468                                      PermissionType::MIDI_SYSEX, true); | 
 |  469  | 
 |  470   ASSERT_EQ(6u, resolved_permission_status.size()); | 
 |  471   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[4]); | 
 |  472   EXPECT_EQ(3, resolved_permission_request_id[4]); | 
 |  473   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[5]); | 
 |  474   EXPECT_EQ(3, resolved_permission_request_id[5]); | 
 |  475 } | 
 |  476  | 
 |  477 // Test the case multiple permissions are requested multiple times as follow. | 
 |  478 //  1. Permission A and B are requested. | 
 |  479 //  2. Permission A is resolved. | 
 |  480 //  3. Permission A is requested for a different origin before the B is | 
 |  481 //     resolved. | 
 |  482 TEST_F(AwPermissionManagerTest, ComplicatedRequestScenario2) { | 
 |  483   // In the first case, the permission A is a type that does not call an | 
 |  484   // internal delegate method. | 
 |  485   std::vector<PermissionType> permissions_1 = {PermissionType::MIDI, | 
 |  486                                                PermissionType::MIDI_SYSEX}; | 
 |  487  | 
 |  488   int request_1 = manager->RequestPermissions( | 
 |  489       permissions_1, | 
 |  490       render_frame_host, GURL(kRequestingOrigin1), | 
 |  491       true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  492                        base::Unretained(this), 1)); | 
 |  493   EXPECT_NE(kNoPendingOperation, request_1); | 
 |  494   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  495  | 
 |  496   int request_2 = manager->RequestPermission( | 
 |  497       PermissionType::MIDI, render_frame_host, GURL(kRequestingOrigin2), true, | 
 |  498       base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  499                  base::Unretained(this), 2)); | 
 |  500   EXPECT_EQ(kNoPendingOperation, request_2); | 
 |  501   ASSERT_EQ(1u, resolved_permission_status.size()); | 
 |  502   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | 
 |  503   EXPECT_EQ(2, resolved_permission_request_id[0]); | 
 |  504  | 
 |  505   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  506                                      PermissionType::MIDI_SYSEX, true); | 
 |  507  | 
 |  508   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  509   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[1]); | 
 |  510   EXPECT_EQ(1, resolved_permission_request_id[1]); | 
 |  511   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[2]); | 
 |  512   EXPECT_EQ(1, resolved_permission_request_id[2]); | 
 |  513  | 
 |  514   // In the second case, the permission A is a type that calls an internal | 
 |  515   // delegate method. | 
 |  516   std::vector<PermissionType> permissions_2 = {PermissionType::GEOLOCATION, | 
 |  517                                                PermissionType::MIDI_SYSEX}; | 
 |  518  | 
 |  519   int request_3 = manager->RequestPermissions( | 
 |  520       permissions_2, | 
 |  521       render_frame_host, GURL(kRequestingOrigin1), | 
 |  522       true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  523                        base::Unretained(this), 3)); | 
 |  524   EXPECT_NE(kNoPendingOperation, request_3); | 
 |  525   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  526  | 
 |  527   // The permission A is resolved, but the first request isn't finished. | 
 |  528   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  529                                      PermissionType::GEOLOCATION, false); | 
 |  530   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  531  | 
 |  532   // The second request could be resolved synchronously even if the first | 
 |  533   // request isn't finished. | 
 |  534   manager->EnqueuePermissionResponse(kRequestingOrigin2, | 
 |  535                                      PermissionType::GEOLOCATION, true); | 
 |  536   int request_4 = manager->RequestPermission( | 
 |  537       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin2), | 
 |  538       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  539                        base::Unretained(this), 4)); | 
 |  540   EXPECT_EQ(kNoPendingOperation, request_4); | 
 |  541   ASSERT_EQ(4u, resolved_permission_status.size()); | 
 |  542   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[3]); | 
 |  543   EXPECT_EQ(4, resolved_permission_request_id[3]); | 
 |  544  | 
 |  545   // The first request is finished. | 
 |  546   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  547                                      PermissionType::MIDI_SYSEX, true); | 
 |  548  | 
 |  549   ASSERT_EQ(6u, resolved_permission_status.size()); | 
 |  550   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[4]); | 
 |  551   EXPECT_EQ(3, resolved_permission_request_id[4]); | 
 |  552   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[5]); | 
 |  553   EXPECT_EQ(3, resolved_permission_request_id[5]); | 
 |  554 } | 
 |  555  | 
 |  556 // Test the case multiple permissions are requested multiple times as follow. | 
 |  557 //  1. Permission A and B are requested. | 
 |  558 //  2. Permission B is resolved. | 
 |  559 //  3. Permission A is requested for the same origin before the A is resolved. | 
 |  560 TEST_F(AwPermissionManagerTest, ComplicatedRequestScenario3) { | 
 |  561   // In the first case, the permission A is a type that does not call an | 
 |  562   // internal delegate method. | 
 |  563   std::vector<PermissionType> permissions_1 = {PermissionType::MIDI, | 
 |  564                                                PermissionType::MIDI_SYSEX}; | 
 |  565  | 
 |  566   int request_1 = manager->RequestPermissions( | 
 |  567       permissions_1, | 
 |  568       render_frame_host, GURL(kRequestingOrigin1), | 
 |  569       true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  570                        base::Unretained(this), 1)); | 
 |  571   EXPECT_NE(kNoPendingOperation, request_1); | 
 |  572   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  573  | 
 |  574   int request_2 = manager->RequestPermission( | 
 |  575       PermissionType::MIDI_SYSEX, render_frame_host, GURL(kRequestingOrigin1), | 
 |  576       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  577                        base::Unretained(this), 2)); | 
 |  578   EXPECT_NE(kNoPendingOperation, request_2); | 
 |  579   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  580  | 
 |  581   // Resolving the first request results in both requests finished. | 
 |  582   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  583                                      PermissionType::MIDI_SYSEX, false); | 
 |  584   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  585   // Note: The result order in the same requiest is ensured, but each results | 
 |  586   // for a request can be swapped because the manager use IDMap to resolve | 
 |  587   // matched requests. | 
 |  588   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[1]); | 
 |  589   EXPECT_EQ(1, resolved_permission_request_id[1]); | 
 |  590   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[2]); | 
 |  591   EXPECT_EQ(1, resolved_permission_request_id[2]); | 
 |  592   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[0]); | 
 |  593   EXPECT_EQ(2, resolved_permission_request_id[0]); | 
 |  594  | 
 |  595   // In the second case, the permission A is a type that calls an internal | 
 |  596   // delegate method. | 
 |  597   std::vector<PermissionType> permissions_2 = {PermissionType::GEOLOCATION, | 
 |  598                                                PermissionType::MIDI_SYSEX}; | 
 |  599  | 
 |  600   int request_3 = manager->RequestPermissions( | 
 |  601       permissions_2, | 
 |  602       render_frame_host, GURL(kRequestingOrigin1), | 
 |  603       true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  604                        base::Unretained(this), 3)); | 
 |  605   EXPECT_NE(kNoPendingOperation, request_3); | 
 |  606   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  607  | 
 |  608   // The permission B is resolved, but the first request isn't finished. | 
 |  609   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  610                                      PermissionType::GEOLOCATION, false); | 
 |  611   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  612  | 
 |  613   int request_4 = manager->RequestPermission( | 
 |  614       PermissionType::MIDI_SYSEX, render_frame_host, GURL(kRequestingOrigin1), | 
 |  615       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  616                        base::Unretained(this), 4)); | 
 |  617   EXPECT_NE(kNoPendingOperation, request_4); | 
 |  618   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  619  | 
 |  620   // Resolving the first request results in both requests finished. | 
 |  621   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  622                                      PermissionType::MIDI_SYSEX, true); | 
 |  623   ASSERT_EQ(6u, resolved_permission_status.size()); | 
 |  624   // Order can be swapped. See Note in ComplicatedRequestScenario1. | 
 |  625   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[4]); | 
 |  626   EXPECT_EQ(3, resolved_permission_request_id[4]); | 
 |  627   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[5]); | 
 |  628   EXPECT_EQ(3, resolved_permission_request_id[5]); | 
 |  629   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[3]); | 
 |  630   EXPECT_EQ(4, resolved_permission_request_id[3]); | 
 |  631 } | 
 |  632  | 
 |  633 // Test the case multiple permissions are requested multiple times as follow. | 
 |  634 //  1. Permission A and B are requested. | 
 |  635 //  2. Permission B is resolved. | 
 |  636 //  3. Permission A is requested for a different origin before the A is | 
 |  637 //     resolved. | 
 |  638 TEST_F(AwPermissionManagerTest, ComplicatedRequestScenario4) { | 
 |  639   // In the first case, the permission A is a type that does not call an | 
 |  640   // internal delegate method. | 
 |  641   std::vector<PermissionType> permissions_1 = {PermissionType::MIDI, | 
 |  642                                                PermissionType::MIDI_SYSEX}; | 
 |  643  | 
 |  644   int request_1 = manager->RequestPermissions( | 
 |  645       permissions_1, | 
 |  646       render_frame_host, GURL(kRequestingOrigin1), | 
 |  647       true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  648                        base::Unretained(this), 1)); | 
 |  649   EXPECT_NE(kNoPendingOperation, request_1); | 
 |  650   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  651  | 
 |  652   int request_2 = manager->RequestPermission( | 
 |  653       PermissionType::MIDI_SYSEX, render_frame_host, GURL(kRequestingOrigin2), | 
 |  654       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  655                        base::Unretained(this), 2)); | 
 |  656   EXPECT_NE(kNoPendingOperation, request_2); | 
 |  657   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  658  | 
 |  659   // The second request could be resolved synchronously even if the first | 
 |  660   // request isn't finished. | 
 |  661   manager->EnqueuePermissionResponse(kRequestingOrigin2, | 
 |  662                                      PermissionType::MIDI_SYSEX, true); | 
 |  663   ASSERT_EQ(1u, resolved_permission_status.size()); | 
 |  664   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | 
 |  665   EXPECT_EQ(2, resolved_permission_request_id[0]); | 
 |  666  | 
 |  667   // The first request is finished. | 
 |  668   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  669                                      PermissionType::MIDI_SYSEX, false); | 
 |  670   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  671   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[1]); | 
 |  672   EXPECT_EQ(1, resolved_permission_request_id[1]); | 
 |  673   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[2]); | 
 |  674   EXPECT_EQ(1, resolved_permission_request_id[2]); | 
 |  675  | 
 |  676   // In the second case, the permission A is a type that calls an internal | 
 |  677   // delegate method. | 
 |  678   std::vector<PermissionType> permissions_2 = {PermissionType::GEOLOCATION, | 
 |  679                                                PermissionType::MIDI_SYSEX}; | 
 |  680  | 
 |  681   int request_3 = manager->RequestPermissions( | 
 |  682       permissions_2, | 
 |  683       render_frame_host, GURL(kRequestingOrigin1), | 
 |  684       true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  685                        base::Unretained(this), 3)); | 
 |  686   EXPECT_NE(kNoPendingOperation, request_3); | 
 |  687   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  688  | 
 |  689   // The permission B is resolved, but the first request isn't finished. | 
 |  690   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  691                                      PermissionType::GEOLOCATION, false); | 
 |  692   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  693  | 
 |  694   int request_4 = manager->RequestPermission( | 
 |  695       PermissionType::MIDI_SYSEX, render_frame_host, GURL(kRequestingOrigin2), | 
 |  696       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  697                        base::Unretained(this), 4)); | 
 |  698   EXPECT_NE(kNoPendingOperation, request_4); | 
 |  699   ASSERT_EQ(3u, resolved_permission_status.size()); | 
 |  700  | 
 |  701   // The second request could be resolved synchronously even if the first | 
 |  702   // request isn't finished. | 
 |  703   manager->EnqueuePermissionResponse(kRequestingOrigin2, | 
 |  704                                      PermissionType::MIDI_SYSEX, false); | 
 |  705   ASSERT_EQ(4u, resolved_permission_status.size()); | 
 |  706   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[3]); | 
 |  707   EXPECT_EQ(4, resolved_permission_request_id[3]); | 
 |  708  | 
 |  709   // Resolving the first request results in resuming the second request. | 
 |  710   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  711                                      PermissionType::MIDI_SYSEX, false); | 
 |  712   ASSERT_EQ(6u, resolved_permission_status.size()); | 
 |  713   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[4]); | 
 |  714   EXPECT_EQ(3, resolved_permission_request_id[4]); | 
 |  715   EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[5]); | 
 |  716   EXPECT_EQ(3, resolved_permission_request_id[5]); | 
 |  717 } | 
 |  718  | 
 |  719 // Test the case CancelPermissionRequest is called for an invalid request. | 
 |  720 TEST_F(AwPermissionManagerTest, InvalidRequestIsCancelled) { | 
 |  721   manager->CancelPermissionRequest(0); | 
 |  722 } | 
 |  723  | 
 |  724 // Test the case a delegate is called, and cancelled. | 
 |  725 TEST_F(AwPermissionManagerTest, SinglePermissionRequestIsCancelled) { | 
 |  726   int request_id = manager->RequestPermission( | 
 |  727       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | 
 |  728       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  729                        base::Unretained(this), 0)); | 
 |  730   EXPECT_NE(kNoPendingOperation, request_id); | 
 |  731   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  732  | 
 |  733   manager->CancelPermissionRequest(request_id); | 
 |  734   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  735  | 
 |  736   // This should not resolve the permission. | 
 |  737   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  738                                      PermissionType::GEOLOCATION, true); | 
 |  739   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  740 } | 
 |  741  | 
 |  742 // Test the case multiple permissions are requested through single call, and | 
 |  743 // cancelled. | 
 |  744 TEST_F(AwPermissionManagerTest, SinglePermissionsRequestIsCancelled) { | 
 |  745   std::vector<PermissionType> permissions_1 = {PermissionType::MIDI, | 
 |  746                                                PermissionType::MIDI_SYSEX}; | 
 |  747  | 
 |  748   int request_id = manager->RequestPermissions( | 
 |  749       permissions_1, render_frame_host, GURL(kRequestingOrigin1), true, | 
 |  750       base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  751                  base::Unretained(this), 0)); | 
 |  752   EXPECT_NE(kNoPendingOperation, request_id); | 
 |  753   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  754  | 
 |  755   manager->CancelPermissionRequest(request_id); | 
 |  756   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  757  | 
 |  758   std::vector<PermissionType> permissions_2 = {PermissionType::GEOLOCATION, | 
 |  759                                                PermissionType::MIDI_SYSEX}; | 
 |  760  | 
 |  761   request_id = manager->RequestPermissions( | 
 |  762       permissions_2, render_frame_host, GURL(kRequestingOrigin1), true, | 
 |  763       base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  764                  base::Unretained(this), 0)); | 
 |  765   EXPECT_NE(kNoPendingOperation, request_id); | 
 |  766   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  767  | 
 |  768   manager->CancelPermissionRequest(request_id); | 
 |  769   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  770  | 
 |  771   // This should not resolve the permission. | 
 |  772   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  773                                      PermissionType::GEOLOCATION, true); | 
 |  774   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  775                                      PermissionType::MIDI_SYSEX, true); | 
 |  776   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  777 } | 
 |  778  | 
 |  779 // Test the case multiple permissions are requested, and cancelled as follow. | 
 |  780 //  1. Permission A is requested. | 
 |  781 //  2. Permission A is requested for the same origin again. | 
 |  782 //  3. The first request is cancelled. | 
 |  783 TEST_F(AwPermissionManagerTest, ComplicatedCancelScenario1) { | 
 |  784   int request_1 = manager->RequestPermission( | 
 |  785       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | 
 |  786       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  787                        base::Unretained(this), 1)); | 
 |  788   EXPECT_NE(kNoPendingOperation, request_1); | 
 |  789   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  790  | 
 |  791   int request_2 = manager->RequestPermission( | 
 |  792       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | 
 |  793       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  794                        base::Unretained(this), 2)); | 
 |  795   EXPECT_NE(kNoPendingOperation, request_2); | 
 |  796   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  797  | 
 |  798   EXPECT_NE(request_1, request_2); | 
 |  799  | 
 |  800   manager->CancelPermissionRequest(request_1); | 
 |  801   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  802  | 
 |  803   // This should resolve the second request. | 
 |  804   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  805                                      PermissionType::GEOLOCATION, true); | 
 |  806   EXPECT_EQ(1u, resolved_permission_status.size()); | 
 |  807   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | 
 |  808   EXPECT_EQ(2, resolved_permission_request_id[0]); | 
 |  809 } | 
 |  810  | 
 |  811 // Test the case multiple permissions are requested, and cancelled as follow. | 
 |  812 //  1. Permission A is requested. | 
 |  813 //  2. Permission A is requested for a different origin. | 
 |  814 //  3. The first request is cancelled. | 
 |  815 TEST_F(AwPermissionManagerTest, ComplicatedCancelScenario2) { | 
 |  816   int request_1 = manager->RequestPermission( | 
 |  817       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | 
 |  818       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  819                        base::Unretained(this), 1)); | 
 |  820   EXPECT_NE(kNoPendingOperation, request_1); | 
 |  821   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  822  | 
 |  823   int request_2 = manager->RequestPermission( | 
 |  824       PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin2), | 
 |  825       true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | 
 |  826                        base::Unretained(this), 2)); | 
 |  827   EXPECT_NE(kNoPendingOperation, request_2); | 
 |  828   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  829  | 
 |  830   EXPECT_NE(request_1, request_2); | 
 |  831  | 
 |  832   manager->CancelPermissionRequest(request_1); | 
 |  833   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  834  | 
 |  835   // This should not resolve the first request. | 
 |  836   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  837                                      PermissionType::GEOLOCATION, true); | 
 |  838   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  839  | 
 |  840   // This should resolve the second request. | 
 |  841   manager->EnqueuePermissionResponse(kRequestingOrigin2, | 
 |  842                                      PermissionType::GEOLOCATION, true); | 
 |  843   EXPECT_EQ(1u, resolved_permission_status.size()); | 
 |  844   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | 
 |  845   EXPECT_EQ(2, resolved_permission_request_id[0]); | 
 |  846 } | 
 |  847  | 
 |  848 // Test the case multiple permissions are requested, and cancelled as follow. | 
 |  849 //  1. Permission A and B are requested. | 
 |  850 //  2. Permission A and B are requested for a different origin. | 
 |  851 //  3. Permission A for the second request is resolved. | 
 |  852 //  4. The second request is cancelled. | 
 |  853 TEST_F(AwPermissionManagerTest, ComplicatedCancelScenario3) { | 
 |  854   std::vector<PermissionType> permissions = {PermissionType::GEOLOCATION, | 
 |  855                                              PermissionType::MIDI_SYSEX}; | 
 |  856  | 
 |  857   int request_1 = manager->RequestPermissions( | 
 |  858       permissions, render_frame_host, GURL(kRequestingOrigin1), true, | 
 |  859       base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  860                  base::Unretained(this), 1)); | 
 |  861   EXPECT_NE(kNoPendingOperation, request_1); | 
 |  862   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  863  | 
 |  864   int request_2 = manager->RequestPermissions( | 
 |  865       permissions, render_frame_host, GURL(kRequestingOrigin2), true, | 
 |  866       base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | 
 |  867                  base::Unretained(this), 2)); | 
 |  868   EXPECT_NE(kNoPendingOperation, request_2); | 
 |  869   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  870  | 
 |  871   EXPECT_NE(request_1, request_2); | 
 |  872  | 
 |  873   manager->EnqueuePermissionResponse(kRequestingOrigin2, | 
 |  874                                      PermissionType::GEOLOCATION, true); | 
 |  875  | 
 |  876   manager->CancelPermissionRequest(request_1); | 
 |  877   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  878  | 
 |  879   // This should not resolve the first request. | 
 |  880   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  881                                      PermissionType::GEOLOCATION, true); | 
 |  882   manager->EnqueuePermissionResponse(kRequestingOrigin1, | 
 |  883                                      PermissionType::MIDI_SYSEX, true); | 
 |  884   EXPECT_EQ(0u, resolved_permission_status.size()); | 
 |  885  | 
 |  886   // This should resolve the second request. | 
 |  887   manager->EnqueuePermissionResponse(kRequestingOrigin2, | 
 |  888                                      PermissionType::MIDI_SYSEX, true); | 
 |  889   EXPECT_EQ(2u, resolved_permission_status.size()); | 
 |  890   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | 
 |  891   EXPECT_EQ(2, resolved_permission_request_id[0]); | 
 |  892   EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[1]); | 
 |  893   EXPECT_EQ(2, resolved_permission_request_id[1]); | 
 |  894 } | 
 |  895  | 
 |  896 }  // namespace | 
 |  897  | 
 |  898 }  // namespace android_webview | 
| OLD | NEW |