190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/signin/chrome_signin_client.h"
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/signin/chrome_signin_client_factory.h"
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/test/base/testing_profile_manager.h"
11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/test/mock_render_process_host.h"
13a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension_builder.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace extensions {
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace {
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class BrowserPermissionsPolicyDelegateTest : public testing::Test {
24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch protected:
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void SetUp() {
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    profile_manager_.reset(
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ASSERT_TRUE(profile_manager_->SetUp());
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    profile_ = profile_manager_->CreateTestingProfile("test");
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void TearDown() {
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Need to delete profile here before the UI thread is destroyed.
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    profile_manager_->DeleteTestingProfile("test");
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    profile_manager_.reset();
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected:
37a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<TestingProfileManager> profile_manager_;
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TestingProfile* profile_;
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if !defined(OS_CHROMEOS)
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)scoped_refptr<const Extension> CreateTestExtension(const std::string& id) {
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return ExtensionBuilder()
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .SetManifest(DictionaryBuilder()
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          .Set("name", "Extension with ID " + id)
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          .Set("version", "1.0")
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          .Set("manifest_version", 2)
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          .Set("permissions", ListBuilder().Append("<all_urls>")))
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .SetID(id)
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      .Build();
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#if !defined(OS_CHROMEOS)
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Tests that CanExecuteScriptOnPage returns false for the signin process,
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// all else being equal.
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(BrowserPermissionsPolicyDelegateTest, CanExecuteScriptOnPage) {
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GURL kSigninUrl(
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "https://accounts.google.com/ServiceLogin?service=chromiumsync");
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(SigninManager::IsWebBasedSigninFlowURL(kSigninUrl));
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::MockRenderProcessHost signin_process(profile_);
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::MockRenderProcessHost normal_process(profile_);
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SigninClient* signin_client =
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ChromeSigninClientFactory::GetForProfile(profile_);
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(signin_client);
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  signin_client->SetSigninProcess(signin_process.GetID());
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<const Extension> extension(CreateTestExtension("a"));
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string error;
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The same call should succeed with a normal process, but fail with a signin
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // process.
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const PermissionsData* permissions_data = extension->permissions_data();
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(permissions_data->CanAccessPage(extension.get(),
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                              kSigninUrl,
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                              kSigninUrl,
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                              -1,  // no tab id.
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                              normal_process.GetID(),
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                              &error))
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      << error;
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(permissions_data->CanAccessPage(extension.get(),
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                               kSigninUrl,
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                               kSigninUrl,
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                               -1,  // no tab id.
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                               signin_process.GetID(),
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                               &error))
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      << error;
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace extensions
96