| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/permissions/android/bluetooth_scanning_prompt_android.h" |
| |
| #include <string> |
| |
| #include "base/test/bind.h" |
| #include "base/test/mock_callback.h" |
| #include "components/permissions/android/bluetooth_scanning_prompt_android_delegate.h" |
| #include "components/security_state/core/security_state.h" |
| #include "content/public/browser/bluetooth_scanning_prompt.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/test/navigation_simulator.h" |
| #include "content/public/test/test_renderer_host.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/android/window_android.h" |
| |
| namespace permissions { |
| |
| namespace { |
| |
| using BluetoothScanningPromptAndroidTest = content::RenderViewHostTestHarness; |
| using testing::_; |
| |
| class FakeBluetoothChooserAndroidDelegate |
| : public BluetoothScanningPromptAndroidDelegate { |
| base::android::ScopedJavaLocalRef<jobject> GetJavaObject() override { |
| return base::android::ScopedJavaLocalRef<jobject>(); |
| } |
| security_state::SecurityLevel GetSecurityLevel( |
| content::WebContents* web_contents) override { |
| return security_state::NONE; |
| } |
| }; |
| |
| TEST_F(BluetoothScanningPromptAndroidTest, FrameTree) { |
| NavigateAndCommit(GURL("https://main-frame.com")); |
| content::RenderFrameHost* subframe = |
| content::NavigationSimulator::NavigateAndCommitFromDocument( |
| GURL("https://sub-frame.com"), |
| content::RenderFrameHostTester::For(main_rfh()) |
| ->AppendChild("subframe")); |
| |
| content::WebContents* web_contents = |
| content::WebContents::FromRenderFrameHost(main_rfh()); |
| std::unique_ptr<ui::WindowAndroid::ScopedWindowAndroidForTesting> window = |
| ui::WindowAndroid::CreateForTesting(); |
| window.get()->get()->AddChild(web_contents->GetNativeView()); |
| |
| base::MockCallback<BluetoothScanningPromptAndroid::CreateJavaDialogCallback> |
| mock_callback; |
| auto origin_predicate = |
| [&](const base::android::JavaRef<jstring>& java_string) { |
| return base::android::ConvertJavaStringToUTF16( |
| base::android::AttachCurrentThread(), java_string) == |
| u"https://main-frame.com"; |
| }; |
| EXPECT_CALL( |
| mock_callback, |
| Run(/*env=*/_, /*window_android=*/_, testing::Truly(origin_predicate), |
| /*security_level=*/_, /*delegate=*/_, |
| /*native_bluetooth_scanning_prompt_dialog_ptr=*/_)); |
| |
| BluetoothScanningPromptAndroid::CreateForTesting( |
| subframe, |
| base::BindLambdaForTesting( |
| [](content::BluetoothScanningPrompt::Event evt) {}), |
| std::make_unique<FakeBluetoothChooserAndroidDelegate>(), |
| mock_callback.Get()); |
| } |
| |
| } // namespace |
| |
| } // namespace permissions |