| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/command_line.h" | 5 #include "base/command_line.h" |
| 6 #include "base/files/file_path.h" | 6 #include "base/files/file_path.h" |
| 7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
| 8 #include "base/test/histogram_tester.h" | 8 #include "base/test/histogram_tester.h" |
| 9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
| 10 #include "content/browser/frame_host/cross_site_transferring_request.h" | 10 #include "content/browser/frame_host/cross_site_transferring_request.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 | 44 |
| 45 namespace content { | 45 namespace content { |
| 46 namespace { | 46 namespace { |
| 47 | 47 |
| 48 class RenderFrameHostManagerTestWebUIControllerFactory | 48 class RenderFrameHostManagerTestWebUIControllerFactory |
| 49 : public WebUIControllerFactory { | 49 : public WebUIControllerFactory { |
| 50 public: | 50 public: |
| 51 RenderFrameHostManagerTestWebUIControllerFactory() | 51 RenderFrameHostManagerTestWebUIControllerFactory() |
| 52 : should_create_webui_(false) { | 52 : should_create_webui_(false) { |
| 53 } | 53 } |
| 54 virtual ~RenderFrameHostManagerTestWebUIControllerFactory() {} | 54 ~RenderFrameHostManagerTestWebUIControllerFactory() override {} |
| 55 | 55 |
| 56 void set_should_create_webui(bool should_create_webui) { | 56 void set_should_create_webui(bool should_create_webui) { |
| 57 should_create_webui_ = should_create_webui; | 57 should_create_webui_ = should_create_webui; |
| 58 } | 58 } |
| 59 | 59 |
| 60 // WebUIFactory implementation. | 60 // WebUIFactory implementation. |
| 61 virtual WebUIController* CreateWebUIControllerForURL( | 61 WebUIController* CreateWebUIControllerForURL(WebUI* web_ui, |
| 62 WebUI* web_ui, const GURL& url) const override { | 62 const GURL& url) const override { |
| 63 if (!(should_create_webui_ && HasWebUIScheme(url))) | 63 if (!(should_create_webui_ && HasWebUIScheme(url))) |
| 64 return NULL; | 64 return NULL; |
| 65 return new WebUIController(web_ui); | 65 return new WebUIController(web_ui); |
| 66 } | 66 } |
| 67 | 67 |
| 68 virtual WebUI::TypeID GetWebUIType(BrowserContext* browser_context, | 68 WebUI::TypeID GetWebUIType(BrowserContext* browser_context, |
| 69 const GURL& url) const override { | 69 const GURL& url) const override { |
| 70 return WebUI::kNoWebUI; | 70 return WebUI::kNoWebUI; |
| 71 } | 71 } |
| 72 | 72 |
| 73 virtual bool UseWebUIForURL(BrowserContext* browser_context, | 73 bool UseWebUIForURL(BrowserContext* browser_context, |
| 74 const GURL& url) const override { |
| 75 return HasWebUIScheme(url); |
| 76 } |
| 77 |
| 78 bool UseWebUIBindingsForURL(BrowserContext* browser_context, |
| 74 const GURL& url) const override { | 79 const GURL& url) const override { |
| 75 return HasWebUIScheme(url); | 80 return HasWebUIScheme(url); |
| 76 } | 81 } |
| 77 | 82 |
| 78 virtual bool UseWebUIBindingsForURL(BrowserContext* browser_context, | |
| 79 const GURL& url) const override { | |
| 80 return HasWebUIScheme(url); | |
| 81 } | |
| 82 | |
| 83 private: | 83 private: |
| 84 bool should_create_webui_; | 84 bool should_create_webui_; |
| 85 | 85 |
| 86 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostManagerTestWebUIControllerFactory); | 86 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostManagerTestWebUIControllerFactory); |
| 87 }; | 87 }; |
| 88 | 88 |
| 89 class BeforeUnloadFiredWebContentsDelegate : public WebContentsDelegate { | 89 class BeforeUnloadFiredWebContentsDelegate : public WebContentsDelegate { |
| 90 public: | 90 public: |
| 91 BeforeUnloadFiredWebContentsDelegate() {} | 91 BeforeUnloadFiredWebContentsDelegate() {} |
| 92 virtual ~BeforeUnloadFiredWebContentsDelegate() {} | 92 ~BeforeUnloadFiredWebContentsDelegate() override {} |
| 93 | 93 |
| 94 virtual void BeforeUnloadFired(WebContents* web_contents, | 94 void BeforeUnloadFired(WebContents* web_contents, |
| 95 bool proceed, | 95 bool proceed, |
| 96 bool* proceed_to_fire_unload) override { | 96 bool* proceed_to_fire_unload) override { |
| 97 *proceed_to_fire_unload = proceed; | 97 *proceed_to_fire_unload = proceed; |
| 98 } | 98 } |
| 99 | 99 |
| 100 private: | 100 private: |
| 101 DISALLOW_COPY_AND_ASSIGN(BeforeUnloadFiredWebContentsDelegate); | 101 DISALLOW_COPY_AND_ASSIGN(BeforeUnloadFiredWebContentsDelegate); |
| 102 }; | 102 }; |
| 103 | 103 |
| 104 class CloseWebContentsDelegate : public WebContentsDelegate { | 104 class CloseWebContentsDelegate : public WebContentsDelegate { |
| 105 public: | 105 public: |
| 106 CloseWebContentsDelegate() : close_called_(false) {} | 106 CloseWebContentsDelegate() : close_called_(false) {} |
| 107 virtual ~CloseWebContentsDelegate() {} | 107 ~CloseWebContentsDelegate() override {} |
| 108 | 108 |
| 109 virtual void CloseContents(WebContents* web_contents) override { | 109 void CloseContents(WebContents* web_contents) override { |
| 110 close_called_ = true; | 110 close_called_ = true; |
| 111 } | 111 } |
| 112 | 112 |
| 113 bool is_closed() { return close_called_; } | 113 bool is_closed() { return close_called_; } |
| 114 | 114 |
| 115 private: | 115 private: |
| 116 DISALLOW_COPY_AND_ASSIGN(CloseWebContentsDelegate); | 116 DISALLOW_COPY_AND_ASSIGN(CloseWebContentsDelegate); |
| 117 | 117 |
| 118 bool close_called_; | 118 bool close_called_; |
| 119 }; | 119 }; |
| 120 | 120 |
| 121 // This observer keeps track of the last deleted RenderViewHost to avoid | 121 // This observer keeps track of the last deleted RenderViewHost to avoid |
| 122 // accessing it and causing use-after-free condition. | 122 // accessing it and causing use-after-free condition. |
| 123 class RenderViewHostDeletedObserver : public WebContentsObserver { | 123 class RenderViewHostDeletedObserver : public WebContentsObserver { |
| 124 public: | 124 public: |
| 125 RenderViewHostDeletedObserver(RenderViewHost* rvh) | 125 RenderViewHostDeletedObserver(RenderViewHost* rvh) |
| 126 : WebContentsObserver(WebContents::FromRenderViewHost(rvh)), | 126 : WebContentsObserver(WebContents::FromRenderViewHost(rvh)), |
| 127 process_id_(rvh->GetProcess()->GetID()), | 127 process_id_(rvh->GetProcess()->GetID()), |
| 128 routing_id_(rvh->GetRoutingID()), | 128 routing_id_(rvh->GetRoutingID()), |
| 129 deleted_(false) { | 129 deleted_(false) { |
| 130 } | 130 } |
| 131 | 131 |
| 132 virtual void RenderViewDeleted(RenderViewHost* render_view_host) override { | 132 void RenderViewDeleted(RenderViewHost* render_view_host) override { |
| 133 if (render_view_host->GetProcess()->GetID() == process_id_ && | 133 if (render_view_host->GetProcess()->GetID() == process_id_ && |
| 134 render_view_host->GetRoutingID() == routing_id_) { | 134 render_view_host->GetRoutingID() == routing_id_) { |
| 135 deleted_ = true; | 135 deleted_ = true; |
| 136 } | 136 } |
| 137 } | 137 } |
| 138 | 138 |
| 139 bool deleted() { | 139 bool deleted() { |
| 140 return deleted_; | 140 return deleted_; |
| 141 } | 141 } |
| 142 | 142 |
| 143 private: | 143 private: |
| 144 int process_id_; | 144 int process_id_; |
| 145 int routing_id_; | 145 int routing_id_; |
| 146 bool deleted_; | 146 bool deleted_; |
| 147 | 147 |
| 148 DISALLOW_COPY_AND_ASSIGN(RenderViewHostDeletedObserver); | 148 DISALLOW_COPY_AND_ASSIGN(RenderViewHostDeletedObserver); |
| 149 }; | 149 }; |
| 150 | 150 |
| 151 // This observer keeps track of the last created RenderFrameHost to allow tests | 151 // This observer keeps track of the last created RenderFrameHost to allow tests |
| 152 // to ensure that no RenderFrameHost objects are created when not expected. | 152 // to ensure that no RenderFrameHost objects are created when not expected. |
| 153 class RenderFrameHostCreatedObserver : public WebContentsObserver { | 153 class RenderFrameHostCreatedObserver : public WebContentsObserver { |
| 154 public: | 154 public: |
| 155 RenderFrameHostCreatedObserver(WebContents* web_contents) | 155 RenderFrameHostCreatedObserver(WebContents* web_contents) |
| 156 : WebContentsObserver(web_contents), | 156 : WebContentsObserver(web_contents), |
| 157 created_(false) { | 157 created_(false) { |
| 158 } | 158 } |
| 159 | 159 |
| 160 virtual void RenderFrameCreated(RenderFrameHost* render_frame_host) override { | 160 void RenderFrameCreated(RenderFrameHost* render_frame_host) override { |
| 161 created_ = true; | 161 created_ = true; |
| 162 } | 162 } |
| 163 | 163 |
| 164 bool created() { | 164 bool created() { |
| 165 return created_; | 165 return created_; |
| 166 } | 166 } |
| 167 | 167 |
| 168 private: | 168 private: |
| 169 bool created_; | 169 bool created_; |
| 170 | 170 |
| 171 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostCreatedObserver); | 171 DISALLOW_COPY_AND_ASSIGN(RenderFrameHostCreatedObserver); |
| 172 }; | 172 }; |
| 173 | 173 |
| 174 // This observer keeps track of the last deleted RenderFrameHost to avoid | 174 // This observer keeps track of the last deleted RenderFrameHost to avoid |
| 175 // accessing it and causing use-after-free condition. | 175 // accessing it and causing use-after-free condition. |
| 176 class RenderFrameHostDeletedObserver : public WebContentsObserver { | 176 class RenderFrameHostDeletedObserver : public WebContentsObserver { |
| 177 public: | 177 public: |
| 178 RenderFrameHostDeletedObserver(RenderFrameHost* rfh) | 178 RenderFrameHostDeletedObserver(RenderFrameHost* rfh) |
| 179 : WebContentsObserver(WebContents::FromRenderFrameHost(rfh)), | 179 : WebContentsObserver(WebContents::FromRenderFrameHost(rfh)), |
| 180 process_id_(rfh->GetProcess()->GetID()), | 180 process_id_(rfh->GetProcess()->GetID()), |
| 181 routing_id_(rfh->GetRoutingID()), | 181 routing_id_(rfh->GetRoutingID()), |
| 182 deleted_(false) { | 182 deleted_(false) { |
| 183 } | 183 } |
| 184 | 184 |
| 185 virtual void RenderFrameDeleted(RenderFrameHost* render_frame_host) override { | 185 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override { |
| 186 if (render_frame_host->GetProcess()->GetID() == process_id_ && | 186 if (render_frame_host->GetProcess()->GetID() == process_id_ && |
| 187 render_frame_host->GetRoutingID() == routing_id_) { | 187 render_frame_host->GetRoutingID() == routing_id_) { |
| 188 deleted_ = true; | 188 deleted_ = true; |
| 189 } | 189 } |
| 190 } | 190 } |
| 191 | 191 |
| 192 bool deleted() { | 192 bool deleted() { |
| 193 return deleted_; | 193 return deleted_; |
| 194 } | 194 } |
| 195 | 195 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 206 // update events, which the FilterMessagesWhileSwappedOut test simulates being | 206 // update events, which the FilterMessagesWhileSwappedOut test simulates being |
| 207 // sent. The test is successful if the event is not observed. | 207 // sent. The test is successful if the event is not observed. |
| 208 // See http://crbug.com/351815 | 208 // See http://crbug.com/351815 |
| 209 class PluginFaviconMessageObserver : public WebContentsObserver { | 209 class PluginFaviconMessageObserver : public WebContentsObserver { |
| 210 public: | 210 public: |
| 211 PluginFaviconMessageObserver(WebContents* web_contents) | 211 PluginFaviconMessageObserver(WebContents* web_contents) |
| 212 : WebContentsObserver(web_contents), | 212 : WebContentsObserver(web_contents), |
| 213 plugin_crashed_(false), | 213 plugin_crashed_(false), |
| 214 favicon_received_(false) { } | 214 favicon_received_(false) { } |
| 215 | 215 |
| 216 virtual void PluginCrashed(const base::FilePath& plugin_path, | 216 void PluginCrashed(const base::FilePath& plugin_path, |
| 217 base::ProcessId plugin_pid) override { | 217 base::ProcessId plugin_pid) override { |
| 218 plugin_crashed_ = true; | 218 plugin_crashed_ = true; |
| 219 } | 219 } |
| 220 | 220 |
| 221 virtual void DidUpdateFaviconURL( | 221 void DidUpdateFaviconURL(const std::vector<FaviconURL>& candidates) override { |
| 222 const std::vector<FaviconURL>& candidates) override { | |
| 223 favicon_received_ = true; | 222 favicon_received_ = true; |
| 224 } | 223 } |
| 225 | 224 |
| 226 bool plugin_crashed() { | 225 bool plugin_crashed() { |
| 227 return plugin_crashed_; | 226 return plugin_crashed_; |
| 228 } | 227 } |
| 229 | 228 |
| 230 bool favicon_received() { | 229 bool favicon_received() { |
| 231 return favicon_received_; | 230 return favicon_received_; |
| 232 } | 231 } |
| 233 | 232 |
| 234 private: | 233 private: |
| 235 bool plugin_crashed_; | 234 bool plugin_crashed_; |
| 236 bool favicon_received_; | 235 bool favicon_received_; |
| 237 | 236 |
| 238 DISALLOW_COPY_AND_ASSIGN(PluginFaviconMessageObserver); | 237 DISALLOW_COPY_AND_ASSIGN(PluginFaviconMessageObserver); |
| 239 }; | 238 }; |
| 240 | 239 |
| 241 // Ensures that RenderFrameDeleted and RenderFrameCreated are called in a | 240 // Ensures that RenderFrameDeleted and RenderFrameCreated are called in a |
| 242 // consistent manner. | 241 // consistent manner. |
| 243 class FrameLifetimeConsistencyChecker : public WebContentsObserver { | 242 class FrameLifetimeConsistencyChecker : public WebContentsObserver { |
| 244 public: | 243 public: |
| 245 explicit FrameLifetimeConsistencyChecker(WebContentsImpl* web_contents) | 244 explicit FrameLifetimeConsistencyChecker(WebContentsImpl* web_contents) |
| 246 : WebContentsObserver(web_contents) { | 245 : WebContentsObserver(web_contents) { |
| 247 RenderViewCreated(web_contents->GetRenderViewHost()); | 246 RenderViewCreated(web_contents->GetRenderViewHost()); |
| 248 RenderFrameCreated(web_contents->GetMainFrame()); | 247 RenderFrameCreated(web_contents->GetMainFrame()); |
| 249 } | 248 } |
| 250 | 249 |
| 251 virtual void RenderFrameCreated(RenderFrameHost* render_frame_host) override { | 250 void RenderFrameCreated(RenderFrameHost* render_frame_host) override { |
| 252 std::pair<int, int> routing_pair = | 251 std::pair<int, int> routing_pair = |
| 253 std::make_pair(render_frame_host->GetProcess()->GetID(), | 252 std::make_pair(render_frame_host->GetProcess()->GetID(), |
| 254 render_frame_host->GetRoutingID()); | 253 render_frame_host->GetRoutingID()); |
| 255 bool was_live_already = !live_routes_.insert(routing_pair).second; | 254 bool was_live_already = !live_routes_.insert(routing_pair).second; |
| 256 bool was_used_before = deleted_routes_.count(routing_pair) != 0; | 255 bool was_used_before = deleted_routes_.count(routing_pair) != 0; |
| 257 | 256 |
| 258 if (was_live_already) { | 257 if (was_live_already) { |
| 259 FAIL() << "RenderFrameCreated called more than once for routing pair: " | 258 FAIL() << "RenderFrameCreated called more than once for routing pair: " |
| 260 << Format(render_frame_host); | 259 << Format(render_frame_host); |
| 261 } else if (was_used_before) { | 260 } else if (was_used_before) { |
| 262 FAIL() << "RenderFrameCreated called for routing pair " | 261 FAIL() << "RenderFrameCreated called for routing pair " |
| 263 << Format(render_frame_host) << " that was previously deleted."; | 262 << Format(render_frame_host) << " that was previously deleted."; |
| 264 } | 263 } |
| 265 } | 264 } |
| 266 | 265 |
| 267 virtual void RenderFrameDeleted(RenderFrameHost* render_frame_host) override { | 266 void RenderFrameDeleted(RenderFrameHost* render_frame_host) override { |
| 268 std::pair<int, int> routing_pair = | 267 std::pair<int, int> routing_pair = |
| 269 std::make_pair(render_frame_host->GetProcess()->GetID(), | 268 std::make_pair(render_frame_host->GetProcess()->GetID(), |
| 270 render_frame_host->GetRoutingID()); | 269 render_frame_host->GetRoutingID()); |
| 271 bool was_live = live_routes_.erase(routing_pair); | 270 bool was_live = live_routes_.erase(routing_pair); |
| 272 bool was_dead_already = !deleted_routes_.insert(routing_pair).second; | 271 bool was_dead_already = !deleted_routes_.insert(routing_pair).second; |
| 273 | 272 |
| 274 if (was_dead_already) { | 273 if (was_dead_already) { |
| 275 FAIL() << "RenderFrameDeleted called more than once for routing pair " | 274 FAIL() << "RenderFrameDeleted called more than once for routing pair " |
| 276 << Format(render_frame_host); | 275 << Format(render_frame_host); |
| 277 } else if (!was_live) { | 276 } else if (!was_live) { |
| (...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 743 // next test cases to detect the bug mentioned at | 742 // next test cases to detect the bug mentioned at |
| 744 // http://crbug.com/259859. | 743 // http://crbug.com/259859. |
| 745 class RenderViewHostDestroyer : public WebContentsObserver { | 744 class RenderViewHostDestroyer : public WebContentsObserver { |
| 746 public: | 745 public: |
| 747 RenderViewHostDestroyer(RenderViewHost* render_view_host, | 746 RenderViewHostDestroyer(RenderViewHost* render_view_host, |
| 748 WebContents* web_contents) | 747 WebContents* web_contents) |
| 749 : WebContentsObserver(WebContents::FromRenderViewHost(render_view_host)), | 748 : WebContentsObserver(WebContents::FromRenderViewHost(render_view_host)), |
| 750 render_view_host_(render_view_host), | 749 render_view_host_(render_view_host), |
| 751 web_contents_(web_contents) {} | 750 web_contents_(web_contents) {} |
| 752 | 751 |
| 753 virtual void RenderViewDeleted( | 752 void RenderViewDeleted(RenderViewHost* render_view_host) override { |
| 754 RenderViewHost* render_view_host) override { | |
| 755 if (render_view_host == render_view_host_) | 753 if (render_view_host == render_view_host_) |
| 756 delete web_contents_; | 754 delete web_contents_; |
| 757 } | 755 } |
| 758 | 756 |
| 759 private: | 757 private: |
| 760 RenderViewHost* render_view_host_; | 758 RenderViewHost* render_view_host_; |
| 761 WebContents* web_contents_; | 759 WebContents* web_contents_; |
| 762 | 760 |
| 763 DISALLOW_COPY_AND_ASSIGN(RenderViewHostDestroyer); | 761 DISALLOW_COPY_AND_ASSIGN(RenderViewHostDestroyer); |
| 764 }; | 762 }; |
| (...skipping 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1798 pending_rfh->GetSiteInstance()->increment_active_frame_count(); | 1796 pending_rfh->GetSiteInstance()->increment_active_frame_count(); |
| 1799 | 1797 |
| 1800 contents()->GetMainFrame()->OnMessageReceived( | 1798 contents()->GetMainFrame()->OnMessageReceived( |
| 1801 FrameHostMsg_BeforeUnload_ACK(0, false, now, now)); | 1799 FrameHostMsg_BeforeUnload_ACK(0, false, now, now)); |
| 1802 EXPECT_FALSE(contents()->cross_navigation_pending()); | 1800 EXPECT_FALSE(contents()->cross_navigation_pending()); |
| 1803 EXPECT_FALSE(rfh_deleted_observer.deleted()); | 1801 EXPECT_FALSE(rfh_deleted_observer.deleted()); |
| 1804 } | 1802 } |
| 1805 } | 1803 } |
| 1806 | 1804 |
| 1807 } // namespace content | 1805 } // namespace content |
| OLD | NEW |