blob: 1184b27ea09329535696ed439c40632d15c14c47 [file] [log] [blame]
// Copyright 2015 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/media/midi_permission_context.h"
#include "base/bind.h"
#include "base/macros.h"
#include "build/build_config.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/permissions/permission_request_id.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/testing_profile.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/mock_render_process_host.h"
#include "content/public/test/web_contents_tester.h"
#include "testing/gtest/include/gtest/gtest.h"
#if defined(OS_ANDROID)
#include "chrome/browser/infobars/infobar_service.h"
#else
#include "chrome/browser/ui/website_settings/permission_bubble_manager.h"
#endif
namespace {
class TestPermissionContext : public MidiPermissionContext {
public:
explicit TestPermissionContext(Profile* profile)
: MidiPermissionContext(profile),
permission_set_(false),
permission_granted_(false),
tab_context_updated_(false) {}
~TestPermissionContext() override {}
bool permission_granted() {
return permission_granted_;
}
bool permission_set() {
return permission_set_;
}
bool tab_context_updated() {
return tab_context_updated_;
}
void TrackPermissionDecision(ContentSetting content_setting) {
permission_set_ = true;
permission_granted_ = content_setting == CONTENT_SETTING_ALLOW;
}
protected:
void UpdateTabContext(const PermissionRequestID& id,
const GURL& requesting_origin,
bool allowed) override {
tab_context_updated_ = true;
}
private:
bool permission_set_;
bool permission_granted_;
bool tab_context_updated_;
};
} // anonymous namespace
class MidiPermissionContextTests : public ChromeRenderViewHostTestHarness {
protected:
MidiPermissionContextTests() = default;
private:
// ChromeRenderViewHostTestHarness:
void SetUp() override {
ChromeRenderViewHostTestHarness::SetUp();
#if defined(OS_ANDROID)
InfoBarService::CreateForWebContents(web_contents());
#else
PermissionBubbleManager::CreateForWebContents(web_contents());
#endif
}
DISALLOW_COPY_AND_ASSIGN(MidiPermissionContextTests);
};
// Web MIDI permission should be denied for insecure origin.
TEST_F(MidiPermissionContextTests, TestInsecureRequestingUrl) {
TestPermissionContext permission_context(profile());
GURL url("http://www.example.com");
content::WebContentsTester::For(web_contents())->NavigateAndCommit(url);
const PermissionRequestID id(
web_contents()->GetRenderProcessHost()->GetID(),
web_contents()->GetMainFrame()->GetRoutingID(),
-1);
permission_context.RequestPermission(
web_contents(), id, url,
base::Bind(&TestPermissionContext::TrackPermissionDecision,
base::Unretained(&permission_context)));
EXPECT_TRUE(permission_context.permission_set());
EXPECT_FALSE(permission_context.permission_granted());
EXPECT_TRUE(permission_context.tab_context_updated());
ContentSetting setting =
HostContentSettingsMapFactory::GetForProfile(profile())
->GetContentSetting(url.GetOrigin(),
url.GetOrigin(),
CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
std::string());
EXPECT_EQ(CONTENT_SETTING_ASK, setting);
}
// Web MIDI permission status should be denied for insecure origin.
TEST_F(MidiPermissionContextTests, TestInsecureQueryingUrl) {
TestPermissionContext permission_context(profile());
GURL insecure_url("http://www.example.com");
GURL secure_url("https://www.example.com");
// Check that there is no saved content settings.
EXPECT_EQ(CONTENT_SETTING_ASK,
HostContentSettingsMapFactory::GetForProfile(profile())
->GetContentSetting(insecure_url.GetOrigin(),
insecure_url.GetOrigin(),
CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
std::string()));
EXPECT_EQ(CONTENT_SETTING_ASK,
HostContentSettingsMapFactory::GetForProfile(profile())
->GetContentSetting(secure_url.GetOrigin(),
insecure_url.GetOrigin(),
CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
std::string()));
EXPECT_EQ(CONTENT_SETTING_ASK,
HostContentSettingsMapFactory::GetForProfile(profile())
->GetContentSetting(insecure_url.GetOrigin(),
secure_url.GetOrigin(),
CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
std::string()));
EXPECT_EQ(CONTENT_SETTING_BLOCK, permission_context.GetPermissionStatus(
insecure_url, insecure_url));
EXPECT_EQ(CONTENT_SETTING_BLOCK, permission_context.GetPermissionStatus(
insecure_url, secure_url));
}