summaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorleon.han <leon.han@intel.com>2016-03-24 08:39:48 -0700
committerCommit bot <commit-bot@chromium.org>2016-03-24 15:41:21 +0000
commit461e50f1d3aaca5a6f8383a8bcbd1ab35a02dea1 (patch)
treef0848fe2b0282df20f78266f727bc3ebe7c54120 /components
parent9d9191dd528d80fda342e0c911d97f61e24d89ab (diff)
downloadchromium_src-461e50f1d3aaca5a6f8383a8bcbd1ab35a02dea1.zip
chromium_src-461e50f1d3aaca5a6f8383a8bcbd1ab35a02dea1.tar.gz
chromium_src-461e50f1d3aaca5a6f8383a8bcbd1ab35a02dea1.tar.bz2
Fix possible IPC ordering issue caused by WebCache mojofication.
Because web_cache::mojom::WebCache::ClearCache(true) call request is transmitted via different OS pipe with Navigation event, maybe cause different IPC ordering with before, this CL is to fix it. BUG=594644 Review URL: https://codereview.chromium.org/1806563004 Cr-Commit-Position: refs/heads/master@{#383065}
Diffstat (limited to 'components')
-rw-r--r--components/web_cache/renderer/web_cache_render_process_observer.cc33
-rw-r--r--components/web_cache/renderer/web_cache_render_process_observer.h12
2 files changed, 36 insertions, 9 deletions
diff --git a/components/web_cache/renderer/web_cache_render_process_observer.cc b/components/web_cache/renderer/web_cache_render_process_observer.cc
index acf11c1..a1f1425 100644
--- a/components/web_cache/renderer/web_cache_render_process_observer.cc
+++ b/components/web_cache/renderer/web_cache_render_process_observer.cc
@@ -15,7 +15,7 @@
namespace web_cache {
WebCacheRenderProcessObserver::WebCacheRenderProcessObserver()
- : clear_cache_pending_(false) {
+ : clear_cache_state_(kInit) {
content::ServiceRegistry* service_registry =
content::RenderThread::Get()->GetServiceRegistry();
service_registry->AddService(base::Bind(
@@ -31,9 +31,16 @@ void WebCacheRenderProcessObserver::BindRequest(
}
void WebCacheRenderProcessObserver::ExecutePendingClearCache() {
- if (clear_cache_pending_) {
- clear_cache_pending_ = false;
- blink::WebCache::clear();
+ switch (clear_cache_state_) {
+ case kInit:
+ clear_cache_state_ = kNavigate_Pending;
+ break;
+ case kNavigate_Pending:
+ break;
+ case kClearCache_Pending:
+ blink::WebCache::clear();
+ clear_cache_state_ = kInit;
+ break;
}
}
@@ -50,10 +57,22 @@ void WebCacheRenderProcessObserver::SetCacheCapacities(
}
void WebCacheRenderProcessObserver::ClearCache(bool on_navigation) {
- if (on_navigation)
- clear_cache_pending_ = true;
- else
+ if (!on_navigation) {
blink::WebCache::clear();
+ return;
+ }
+
+ switch (clear_cache_state_) {
+ case kInit:
+ clear_cache_state_ = kClearCache_Pending;
+ break;
+ case kNavigate_Pending:
+ blink::WebCache::clear();
+ clear_cache_state_ = kInit;
+ break;
+ case kClearCache_Pending:
+ break;
+ }
}
} // namespace web_cache
diff --git a/components/web_cache/renderer/web_cache_render_process_observer.h b/components/web_cache/renderer/web_cache_render_process_observer.h
index aee3eac..a43f539 100644
--- a/components/web_cache/renderer/web_cache_render_process_observer.h
+++ b/components/web_cache/renderer/web_cache_render_process_observer.h
@@ -28,6 +28,12 @@ class WebCacheRenderProcessObserver : public mojom::WebCache {
void ExecutePendingClearCache();
private:
+ enum State {
+ kInit,
+ kNavigate_Pending,
+ kClearCache_Pending,
+ };
+
// mojom::WebCache methods:
void SetCacheCapacities(uint64_t min_dead_capacity,
uint64_t max_dead_capacity,
@@ -36,8 +42,10 @@ class WebCacheRenderProcessObserver : public mojom::WebCache {
// navigation event.
void ClearCache(bool on_navigation) override;
- // If true, the web cache shall be cleared before the next navigation event.
- bool clear_cache_pending_;
+ // Records status regarding the sequence of navigation event and
+ // ClearCache(true) call, to ensure delayed 'clear cache' command always
+ // get executed on navigation.
+ State clear_cache_state_;
mojo::BindingSet<mojom::WebCache> bindings_;