| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "extensions/browser/browser_frame_context_data.h" |
| |
| #include <memory> |
| #include "base/memory/scoped_refptr.h" |
| #include "content/public/browser/site_instance.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/test/web_contents_tester.h" |
| #include "extensions/browser/extensions_test.h" |
| #include "url/origin.h" |
| #include "url/url_constants.h" |
| |
| namespace extensions { |
| |
| namespace { |
| const std::string kGoogleUrl = "https://google.com"; |
| } |
| |
| class BrowserFrameContextDataTest : public ExtensionsTest { |
| public: |
| BrowserFrameContextDataTest() = default; |
| ~BrowserFrameContextDataTest() override = default; |
| |
| BrowserFrameContextDataTest(const BrowserFrameContextDataTest&) = delete; |
| BrowserFrameContextDataTest& operator=(const BrowserFrameContextDataTest&) = |
| delete; |
| |
| protected: |
| void SetUp() override { |
| ExtensionsTest::SetUp(); |
| |
| // Set up the opener WebContents. |
| scoped_refptr<content::SiteInstance> site_instance = |
| content::SiteInstance::CreateForURL(browser_context(), google_url_); |
| opener_web_contents_ = content::WebContentsTester::CreateTestWebContents( |
| browser_context(), site_instance); |
| SetLastCommittedUrlAndOrigin(opener_web_contents_.get(), google_url_); |
| |
| // Set up the child WebContents. |
| web_contents_ = content::WebContentsTester::CreateTestWebContents( |
| browser_context(), site_instance); |
| auto* web_contents_tester = |
| content::WebContentsTester::For(web_contents_.get()); |
| web_contents_tester->SetOpener(opener_web_contents_.get()); |
| SetLastCommittedUrlAndOrigin(web_contents_.get(), google_url_); |
| } |
| |
| void TearDown() override { |
| web_contents_.reset(); |
| opener_web_contents_.reset(); |
| ExtensionsTest::TearDown(); |
| } |
| |
| content::RenderFrameHost* GetRenderFrameHost( |
| content::WebContents* web_contents) { |
| return web_contents->GetPrimaryMainFrame(); |
| } |
| |
| void SetLastCommittedUrlAndOrigin(content::WebContents* web_contents, |
| const GURL& url) { |
| auto* web_contents_tester = content::WebContentsTester::For(web_contents); |
| web_contents_tester->NavigateAndCommit(url); |
| } |
| |
| content::WebContents* web_contents() { return web_contents_.get(); } |
| content::WebContents* opener_web_contents() { |
| return opener_web_contents_.get(); |
| } |
| |
| std::unique_ptr<content::WebContents> opener_web_contents_; |
| std::unique_ptr<content::WebContents> web_contents_; |
| |
| const GURL google_url_ = GURL(kGoogleUrl); |
| }; |
| |
| TEST_F(BrowserFrameContextDataTest, Clone) { |
| auto data = std::make_unique<BrowserFrameContextData>( |
| GetRenderFrameHost(opener_web_contents())); |
| std::unique_ptr<FrameContextData> cloned_data = data->CloneFrameContextData(); |
| |
| EXPECT_EQ(data->GetLocalParentOrOpener(), |
| cloned_data->GetLocalParentOrOpener()); |
| EXPECT_EQ(data->GetUrl(), cloned_data->GetUrl()); |
| EXPECT_EQ(data->GetOrigin(), cloned_data->GetOrigin()); |
| EXPECT_EQ(data->GetId(), cloned_data->GetId()); |
| } |
| |
| TEST_F(BrowserFrameContextDataTest, GetLocalParentOrOpener) { |
| auto data = std::make_unique<BrowserFrameContextData>( |
| GetRenderFrameHost(opener_web_contents())); |
| { |
| std::unique_ptr<ContextData> local_parent_or_opener = |
| data->GetLocalParentOrOpener(); |
| |
| // GetLocalParentOrOpener() should return a nullptr because the WebContents |
| // doesn't have a parent or opener. |
| EXPECT_FALSE(local_parent_or_opener); |
| } |
| |
| auto child_data = std::make_unique<BrowserFrameContextData>( |
| GetRenderFrameHost(web_contents())); |
| { |
| std::unique_ptr<ContextData> local_parent_or_opener = |
| child_data->GetLocalParentOrOpener(); |
| |
| // GetLocalParentOrOpener() should not return a nullptr because the |
| // WebContents does have an opener set. |
| EXPECT_TRUE(local_parent_or_opener); |
| } |
| } |
| |
| TEST_F(BrowserFrameContextDataTest, UrlAndOriginGetters) { |
| { |
| auto data = std::make_unique<BrowserFrameContextData>( |
| GetRenderFrameHost(opener_web_contents())); |
| |
| EXPECT_EQ(data->GetUrl(), google_url_); |
| EXPECT_EQ(data->GetOrigin(), url::Origin::Create(google_url_)); |
| } |
| |
| // Create a WebContents without navigating it to test the default return |
| // values of GetUrl() and GetOrigin() when the URL is empty. |
| { |
| auto site_instance = content::SiteInstance::Create(browser_context()); |
| auto web_contents = content::WebContentsTester::CreateTestWebContents( |
| browser_context(), site_instance); |
| auto data = std::make_unique<BrowserFrameContextData>( |
| GetRenderFrameHost(web_contents.get())); |
| EXPECT_EQ(data->GetUrl(), GURL(url::kAboutBlankURL)); |
| EXPECT_EQ(data->GetOrigin().GetURL(), GURL()); |
| } |
| } |
| |
| } // namespace extensions |