1 // Copyright 2020 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 "chrome/browser/webshare/win/fake_data_transfer_manager_interop.h"
6
7 #include "base/callback.h"
8 #include "base/callback_helpers.h"
9 #include "base/task/post_task.h"
10 #include "chrome/browser/webshare/win/fake_data_transfer_manager.h"
11 #include "content/public/browser/browser_task_traits.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace webshare {
15
16 // static
IsSupportedEnvironment()17 bool FakeDataTransferManagerInterop::IsSupportedEnvironment() {
18 return FakeDataTransferManager::IsSupportedEnvironment();
19 }
20
21 FakeDataTransferManagerInterop::FakeDataTransferManagerInterop() = default;
22
~FakeDataTransferManagerInterop()23 FakeDataTransferManagerInterop::~FakeDataTransferManagerInterop() {
24 // Though it is legal for consuming code to hold on to a DataTransferManager
25 // after releasing all references to the DataTransferManagerInterop, in a
26 // test environment the DataTransferManagerInterop is only expected to be
27 // torn down as part of the test cleanup, at which point the
28 // DataTransferManager references should also have been cleaned up.
29 for (auto& manager : managers_)
30 EXPECT_EQ(0u, manager.second.Reset());
31 }
32
33 IFACEMETHODIMP
GetForWindow(HWND app_window,REFIID riid,void ** data_transfer_manager)34 FakeDataTransferManagerInterop::GetForWindow(HWND app_window,
35 REFIID riid,
36 void** data_transfer_manager) {
37 auto it = managers_.find(app_window);
38 if (it != managers_.end()) {
39 *data_transfer_manager = it->second.Get();
40 it->second->AddRef();
41 } else {
42 auto mock = Microsoft::WRL::Make<FakeDataTransferManager>();
43 managers_.insert({app_window, mock});
44 *data_transfer_manager = mock.Get();
45 mock->AddRef();
46 }
47 return S_OK;
48 }
49
ShowShareUIForWindow(HWND app_window)50 IFACEMETHODIMP FakeDataTransferManagerInterop::ShowShareUIForWindow(
51 HWND app_window) {
52 auto it = managers_.find(app_window);
53 if (it == managers_.end()) {
54 ADD_FAILURE() << "ShowShareUIForWindow called for HWND with no "
55 "DataTransferManager (or DataRequested handler) defined.";
56 return E_FAIL;
57 }
58 switch (show_share_ui_for_window_behavior_) {
59 case ShowShareUIForWindowBehavior::FailImmediately:
60 return E_FAIL;
61 case ShowShareUIForWindowBehavior::InvokeEventSynchronously:
62 std::move(it->second->GetDataRequestedInvoker()).Run();
63 return S_OK;
64 case ShowShareUIForWindowBehavior::InvokeEventSynchronouslyAndReturnFailure:
65 std::move(it->second->GetDataRequestedInvoker()).Run();
66 return E_FAIL;
67 case ShowShareUIForWindowBehavior::ScheduleEvent:
68 EXPECT_TRUE(base::PostTask(FROM_HERE, {content::BrowserThread::UI},
69 it->second->GetDataRequestedInvoker()));
70 return S_OK;
71 case ShowShareUIForWindowBehavior::SucceedWithoutAction:
72 return S_OK;
73 }
74 NOTREACHED();
75 return E_UNEXPECTED;
76 }
77
GetDataRequestedInvoker(HWND app_window)78 base::OnceClosure FakeDataTransferManagerInterop::GetDataRequestedInvoker(
79 HWND app_window) {
80 auto it = managers_.find(app_window);
81 if (it == managers_.end()) {
82 ADD_FAILURE() << "GetDataRequestedInvoker called when no DataRequested "
83 "event handler has been registered";
84 return base::DoNothing();
85 }
86 return it->second->GetDataRequestedInvoker();
87 }
88
HasDataRequestedListener(HWND app_window)89 bool FakeDataTransferManagerInterop::HasDataRequestedListener(HWND app_window) {
90 auto it = managers_.find(app_window);
91 if (it == managers_.end())
92 return false;
93 return it->second->HasDataRequestedListener();
94 }
95
SetShowShareUIForWindowBehavior(ShowShareUIForWindowBehavior behavior)96 void FakeDataTransferManagerInterop::SetShowShareUIForWindowBehavior(
97 ShowShareUIForWindowBehavior behavior) {
98 show_share_ui_for_window_behavior_ = behavior;
99 }
100
101 } // namespace webshare
102