| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/plugins/flash_temporary_permission_tracker.h" |
| #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| #include "chrome/test/base/testing_profile.h" |
| #include "content/public/browser/render_frame_host.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/test/navigation_simulator.h" |
| #include "content/public/test/test_renderer_host.h" |
| #include "content/public/test/web_contents_tester.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "url/gurl.h" |
| |
| namespace { |
| |
| const char* kOrigin1 = "https://google.com"; |
| const char* kOrigin2 = "https://maps.google.com"; |
| const char* kOrigin3 = "https://example.com"; |
| |
| } // namespace |
| |
| class FlashTemporaryPermissionTrackerTest |
| : public ChromeRenderViewHostTestHarness { |
| public: |
| void SetUp() override { |
| ChromeRenderViewHostTestHarness::SetUp(); |
| tracker_ = new FlashTemporaryPermissionTracker(profile()); |
| } |
| |
| protected: |
| FlashTemporaryPermissionTracker* tracker() { return tracker_.get(); } |
| |
| content::RenderFrameHost* GetMainRFH(const char* origin) { |
| return content::NavigationSimulator::NavigateAndCommitFromDocument( |
| GURL(origin), web_contents()->GetMainFrame()); |
| } |
| |
| content::RenderFrameHost* AddChildRFH(content::RenderFrameHost* parent, |
| const char* origin) { |
| content::RenderFrameHost* subframe = |
| content::RenderFrameHostTester::For(parent)->AppendChild(""); |
| return content::NavigationSimulator::NavigateAndCommitFromDocument( |
| GURL(origin), subframe); |
| } |
| |
| private: |
| scoped_refptr<FlashTemporaryPermissionTracker> tracker_; |
| }; |
| |
| TEST_F(FlashTemporaryPermissionTrackerTest, GrantSurvivesReloads) { |
| GetMainRFH(kOrigin1); |
| |
| // Flash shouldn't be enabled initially. |
| EXPECT_FALSE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| tracker()->FlashEnabledForWebContents(web_contents()); |
| |
| // Flash should be enabled now. |
| EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| |
| // Refresh the page. |
| Reload(); |
| // Flash should still be enabled after a single refresh. |
| EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| |
| // Refresh again. |
| Reload(); |
| // Flash should still be enabled. |
| EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| } |
| |
| TEST_F(FlashTemporaryPermissionTrackerTest, GrantSurvivesNavigations) { |
| content::RenderFrameHost* rfh = GetMainRFH(kOrigin1); |
| |
| tracker()->FlashEnabledForWebContents(web_contents()); |
| Reload(); |
| EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| |
| // Navigate to another origin. Flash should still be enabled. |
| content::NavigationSimulator::NavigateAndCommitFromDocument(GURL(kOrigin2), |
| rfh); |
| EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| } |
| |
| TEST_F(FlashTemporaryPermissionTrackerTest, |
| GrantSurvivesChildFrameNavigations) { |
| content::RenderFrameHost* rfh = GetMainRFH(kOrigin1); |
| content::RenderFrameHost* child = AddChildRFH(rfh, kOrigin2); |
| |
| tracker()->FlashEnabledForWebContents(web_contents()); |
| Reload(); |
| EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| |
| // Navigate the child frame. Flash should still be enabled after this. |
| content::NavigationSimulator::NavigateAndCommitFromDocument(GURL(kOrigin3), |
| child); |
| EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| } |
| |
| TEST_F(FlashTemporaryPermissionTrackerTest, |
| GrantRevokedWhenWebContentsDestroyed) { |
| GetMainRFH(kOrigin1); |
| EXPECT_FALSE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| |
| std::unique_ptr<content::WebContents> temporary_web_contents( |
| CreateTestWebContents()); |
| content::WebContentsTester::For(temporary_web_contents.get()) |
| ->NavigateAndCommit(GURL(kOrigin1)); |
| |
| tracker()->FlashEnabledForWebContents(temporary_web_contents.get()); |
| EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| |
| temporary_web_contents.reset(); |
| EXPECT_FALSE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| } |
| |
| TEST_F(FlashTemporaryPermissionTrackerTest, |
| GrantRevokedOnLastGrantingWebContentsDestruction) { |
| EXPECT_FALSE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| |
| std::unique_ptr<content::WebContents> temporary_web_contents( |
| CreateTestWebContents()); |
| content::WebContentsTester::For(temporary_web_contents.get()) |
| ->NavigateAndCommit(GURL(kOrigin1)); |
| |
| tracker()->FlashEnabledForWebContents(temporary_web_contents.get()); |
| EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| |
| // Make a second WebContents that also grants Flash permission on the origin. |
| std::unique_ptr<content::WebContents> second_web_contents( |
| CreateTestWebContents()); |
| content::WebContentsTester::For(second_web_contents.get()) |
| ->NavigateAndCommit(GURL(kOrigin1)); |
| tracker()->FlashEnabledForWebContents(second_web_contents.get()); |
| EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| |
| // Now destroying the original WebContents should no longer revoke the grant. |
| temporary_web_contents.reset(); |
| EXPECT_TRUE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| |
| // And destroying the second WebContents should revoke the grant. |
| second_web_contents.reset(); |
| EXPECT_FALSE(tracker()->IsFlashEnabled(GURL(kOrigin1))); |
| } |