Index: webkit/glue/resource_fetcher_unittest.cc |
=================================================================== |
--- webkit/glue/resource_fetcher_unittest.cc (revision 71961) |
+++ webkit/glue/resource_fetcher_unittest.cc (working copy) |
@@ -46,8 +46,8 @@ |
return ::NewCallback(this, &FetcherDelegate::OnURLFetchComplete); |
} |
- void OnURLFetchComplete(const WebURLResponse& response, |
- const std::string& data) { |
+ virtual void OnURLFetchComplete(const WebURLResponse& response, |
+ const std::string& data) { |
response_ = response; |
data_ = data; |
completed_ = true; |
@@ -223,4 +223,38 @@ |
EXPECT_TRUE(delegate->time_elapsed_ms() < kMaxWaitTimeMs); |
} |
+class EvilFetcherDelegate : public FetcherDelegate { |
+ public: |
+ void SetFetcher(ResourceFetcher* fetcher) { |
+ fetcher_.reset(fetcher); |
+ } |
+ |
+ void OnURLFetchComplete(const WebURLResponse& response, |
+ const std::string& data) { |
+ // Destroy the ResourceFetcher here. We are testing that upon returning |
+ // to the ResourceFetcher that it does not crash. |
+ fetcher_.reset(); |
+ FetcherDelegate::OnURLFetchComplete(response, data); |
+ } |
+ |
+ private: |
+ scoped_ptr<ResourceFetcher> fetcher_; |
+}; |
+ |
+TEST_F(ResourceFetcherTests, ResourceFetcherDeletedInCallback) { |
+ ASSERT_TRUE(test_server_.Start()); |
+ |
+ WebFrame* frame = test_shell_->webView()->mainFrame(); |
+ |
+ // Grab a page that takes at least 1 sec to respond, but set the fetcher to |
+ // timeout in 0 sec. |
+ GURL url(test_server_.GetURL("slow?1")); |
+ scoped_ptr<EvilFetcherDelegate> delegate(new EvilFetcherDelegate); |
+ scoped_ptr<ResourceFetcher> fetcher(new ResourceFetcherWithTimeout( |
+ url, frame, 0, delegate->NewCallback())); |
+ delegate->SetFetcher(fetcher.release()); |
+ |
+ delegate->WaitForResponse(); |
+} |
+ |
} // namespace |