diff options
author | lfg <lfg@chromium.org> | 2015-07-16 14:12:23 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-07-16 21:14:27 +0000 |
commit | 8857145b2711bc3350e670cb42a2e19b0c251663 (patch) | |
tree | 3034c78fd651111c982f5ac04e8642ec3a9c54c3 /content/public/test | |
parent | a91a911b75f527aee567dffa8eb0574cf8facf58 (diff) | |
download | chromium_src-8857145b2711bc3350e670cb42a2e19b0c251663.zip chromium_src-8857145b2711bc3350e670cb42a2e19b0c251663.tar.gz chromium_src-8857145b2711bc3350e670cb42a2e19b0c251663.tar.bz2 |
Fix accessibility with out-of-process iframes.
This patch changes the accessibility tree to attach to lookup the RemoteFrame instead of the RenderFrameImpl (which should not exist).
This is a reland of https://codereview.chromium.org/1155993003/.
BUG=490831
Review URL: https://codereview.chromium.org/1228493004
Cr-Commit-Position: refs/heads/master@{#339121}
Diffstat (limited to 'content/public/test')
-rw-r--r-- | content/public/test/browser_test_utils.cc | 35 | ||||
-rw-r--r-- | content/public/test/browser_test_utils.h | 22 |
2 files changed, 57 insertions, 0 deletions
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc index bbae7f8..8d380a5 100644 --- a/content/public/test/browser_test_utils.cc +++ b/content/public/test/browser_test_utils.cc @@ -1009,4 +1009,39 @@ void FrameWatcher::WaitFrames(int frames_to_wait) { run_loop.Run(); } +RenderFrameDeletedObserver::RenderFrameDeletedObserver( + RenderFrameHost* rfh) + : WebContentsObserver(WebContents::FromRenderFrameHost(rfh)), + process_id_(rfh->GetProcess()->GetID()), + routing_id_(rfh->GetRoutingID()), + deleted_(false) { +} + +RenderFrameDeletedObserver::~RenderFrameDeletedObserver() { +} + +void RenderFrameDeletedObserver::RenderFrameDeleted( + RenderFrameHost* render_frame_host) { + if (render_frame_host->GetProcess()->GetID() == process_id_ && + render_frame_host->GetRoutingID() == routing_id_) { + deleted_ = true; + + if (runner_.get()) + runner_->Quit(); + } +} + +bool RenderFrameDeletedObserver::deleted() { + return deleted_; +} + +void RenderFrameDeletedObserver::WaitUntilDeleted() { + if (deleted_) + return; + + runner_.reset(new base::RunLoop()); + runner_->Run(); + runner_.reset(); +} + } // namespace content diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h index 72bbd02..bd5cddc 100644 --- a/content/public/test/browser_test_utils.h +++ b/content/public/test/browser_test_utils.h @@ -432,6 +432,28 @@ class FrameWatcher : public BrowserMessageFilter { DISALLOW_COPY_AND_ASSIGN(FrameWatcher); }; +// This observer keeps track of the last deleted RenderFrame to avoid +// accessing it and causing use-after-free condition. +class RenderFrameDeletedObserver : public WebContentsObserver { + public: + RenderFrameDeletedObserver(RenderFrameHost* rfh); + ~RenderFrameDeletedObserver() override; + + // Overridden WebContentsObserver methods. + void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; + + void WaitUntilDeleted(); + bool deleted(); + + private: + int process_id_; + int routing_id_; + bool deleted_; + scoped_ptr<base::RunLoop> runner_; + + DISALLOW_COPY_AND_ASSIGN(RenderFrameDeletedObserver); +}; + } // namespace content #endif // CONTENT_PUBLIC_TEST_BROWSER_TEST_UTILS_H_ |