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