| Index: content/browser/site_per_process_browsertest.cc
|
| diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
|
| index 4df5541088be69f740e0b277e455188b88b5db3d..b7c1f8a047cb06dc8e0973ae0ee04d169321eb8d 100644
|
| --- a/content/browser/site_per_process_browsertest.cc
|
| +++ b/content/browser/site_per_process_browsertest.cc
|
| @@ -305,6 +305,49 @@ class SwapoutACKMessageFilter : public BrowserMessageFilter {
|
| DISALLOW_COPY_AND_ASSIGN(SwapoutACKMessageFilter);
|
| };
|
|
|
| +class RenderWidgetHostVisibilityObserver {
|
| + public:
|
| + explicit RenderWidgetHostVisibilityObserver(RenderWidgetHostImpl* rwhi,
|
| + bool expected_visibility_state)
|
| + : render_widget_host_(rwhi),
|
| + expected_visibility_state_(expected_visibility_state),
|
| + weak_ptr_factory_(this) {}
|
| +
|
| + std::string toString(bool value) { return value ? "TRUE" : "FALSE"; }
|
| +
|
| + void WaitUntilSatisfied() {
|
| + if (expected_visibility_state_ ^ render_widget_host_->is_hidden())
|
| + return;
|
| + message_loop_runner_ = new MessageLoopRunner;
|
| + BrowserThread::PostDelayedTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&RenderWidgetHostVisibilityObserver::CheckVisibility,
|
| + weak_ptr_factory_.GetWeakPtr()),
|
| + base::TimeDelta::FromMilliseconds(1));
|
| + message_loop_runner_->Run();
|
| + }
|
| +
|
| + private:
|
| + void CheckVisibility() {
|
| + if (expected_visibility_state_ ^ render_widget_host_->is_hidden())
|
| + message_loop_runner_->Quit();
|
| + else
|
| + BrowserThread::PostDelayedTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&RenderWidgetHostVisibilityObserver::CheckVisibility,
|
| + weak_ptr_factory_.GetWeakPtr()),
|
| + base::TimeDelta::FromMilliseconds(1));
|
| + }
|
| +
|
| + RenderWidgetHostImpl* render_widget_host_;
|
| + bool expected_visibility_state_;
|
| + scoped_refptr<MessageLoopRunner> message_loop_runner_;
|
| +
|
| + base::WeakPtrFactory<RenderWidgetHostVisibilityObserver> weak_ptr_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostVisibilityObserver);
|
| +};
|
| +
|
| } // namespace
|
|
|
| //
|
| @@ -3911,4 +3954,31 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, OpenerSetLocation) {
|
| EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), cross_url);
|
| }
|
|
|
| +IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, VisibilityChanged) {
|
| + GURL main_url(
|
| + embedded_test_server()->GetURL("a.com", "/page_with_iframe.html"));
|
| + EXPECT_TRUE(NavigateToURL(shell(), main_url));
|
| + EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), main_url);
|
| +
|
| + GURL cross_site_url =
|
| + embedded_test_server()->GetURL("oopif.com", "/title1.html");
|
| +
|
| + FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
|
| + ->GetFrameTree()
|
| + ->root();
|
| +
|
| + TestNavigationObserver observer(shell()->web_contents());
|
| +
|
| + NavigateFrameToURL(root->child_at(0), cross_site_url);
|
| + EXPECT_EQ(cross_site_url, observer.last_navigation_url());
|
| + EXPECT_TRUE(observer.last_navigation_succeeded());
|
| +
|
| + std::string script =
|
| + "document.querySelector('iframe').style.visibility = 'hidden';";
|
| + RenderWidgetHostVisibilityObserver visibility_observer(
|
| + root->child_at(0)->current_frame_host()->GetRenderWidgetHost(), false);
|
| + EXPECT_TRUE(ExecuteScript(shell()->web_contents(), script));
|
| + visibility_observer.WaitUntilSatisfied();
|
| +}
|
| +
|
| } // namespace content
|
|
|