blob: af67734ad92f9e096125e6f26b3810f6785420ae [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
#include <memory>
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "chrome/browser/media/media_access_handler.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/mediastream/media_stream_request.h"
using testing::_;
namespace {
class MockMediaAccessHandler : public MediaAccessHandler {
public:
explicit MockMediaAccessHandler(
const blink::mojom::MediaStreamType supported_type)
: supported_type_(supported_type) {}
bool SupportsStreamType(content::WebContents* web_contents,
const blink::mojom::MediaStreamType type,
const extensions::Extension* extension) override {
return supported_type_ == type;
}
MOCK_METHOD4(CheckMediaAccessPermission,
bool(content::RenderFrameHost* render_frame_host,
const GURL& security_origin,
blink::mojom::MediaStreamType type,
const extensions::Extension* extension));
MOCK_METHOD4(HandleRequest,
void(content::WebContents* web_contents,
const content::MediaStreamRequest& request,
content::MediaResponseCallback callback,
const extensions::Extension* extension));
MOCK_METHOD4(UpdateVideoScreenCaptureStatus,
void(int render_process_id,
int render_frame_id,
int page_request_id,
bool is_secure));
const blink::mojom::MediaStreamType supported_type_;
};
} // namespace
class MediaCaptureDevicesDispatcherTest
: public ChromeRenderViewHostTestHarness {
public:
MediaCaptureDevicesDispatcherTest() = default;
~MediaCaptureDevicesDispatcherTest() override = default;
void SetUp() override {
ChromeRenderViewHostTestHarness::SetUp();
dispatcher_ = MediaCaptureDevicesDispatcher::GetInstance();
}
std::vector<std::unique_ptr<MediaAccessHandler>>& media_access_handlers() {
return dispatcher_->media_access_handlers_;
}
void UpdateVideoScreenCaptureStatus(
const blink::mojom::MediaStreamType type) {
dispatcher_->UpdateVideoScreenCaptureStatus(0, 0, 0, type, false);
}
protected:
raw_ptr<MediaCaptureDevicesDispatcher> dispatcher_;
};
TEST_F(MediaCaptureDevicesDispatcherTest,
DISABLED_LoopsAllMediaAccessHandlers) {
media_access_handlers().clear();
// Add two handlers.
auto stream_type1 = blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE;
auto mock1 = std::make_unique<MockMediaAccessHandler>(stream_type1);
MockMediaAccessHandler* handler1 = mock1.get();
media_access_handlers().push_back(std::move(mock1));
auto stream_type2 = blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE;
auto mock2 = std::make_unique<MockMediaAccessHandler>(stream_type2);
MockMediaAccessHandler* handler2 = mock2.get();
media_access_handlers().push_back(std::move(mock2));
// Expect both to be called.
EXPECT_CALL(*handler1, UpdateVideoScreenCaptureStatus(_, _, _, _));
UpdateVideoScreenCaptureStatus(stream_type1);
EXPECT_CALL(*handler2, UpdateVideoScreenCaptureStatus(_, _, _, _));
UpdateVideoScreenCaptureStatus(stream_type2);
}