Index: ppapi/proxy/ppb_flash_proxy.cc |
diff --git a/ppapi/proxy/ppb_flash_proxy.cc b/ppapi/proxy/ppb_flash_proxy.cc |
index 6a5a9052589bda9d06808db5fb23a7ea02c64e8b..096e1d769cdd34936ef9190f7ab1482aee781ec3 100644 |
--- a/ppapi/proxy/ppb_flash_proxy.cc |
+++ b/ppapi/proxy/ppb_flash_proxy.cc |
@@ -4,6 +4,8 @@ |
#include "ppapi/proxy/ppb_flash_proxy.h" |
+#include <math.h> |
+ |
#include <limits> |
#include "base/logging.h" |
@@ -47,6 +49,11 @@ namespace proxy { |
namespace { |
+// Returns true if |t1| and |t2| are times in the same minute. |
+bool InSameMinute(PP_Time t1, PP_Time t2) { |
+ return floor(t1 / 60.0) == floor(t2 / 60.0); |
+} |
+ |
IPC::PlatformFileForTransit PlatformFileToPlatformFileForTransit( |
Dispatcher* dispatcher, |
int32_t* error, |
@@ -231,7 +238,8 @@ void PPB_Flash_Proxy::QuitMessageLoop(PP_Instance instance) { |
double PPB_Flash_Proxy::GetLocalTimeZoneOffset(PP_Instance instance, |
PP_Time t) { |
- static double s_local_offset = 0.0; |
+ static double s_cached_t = 0.0; |
+ static double s_cached_local_offset = 0.0; |
static int64 s_last_updated = std::numeric_limits<int64>::min(); |
// Cache the local offset for ten seconds, since it's slow on XP and Linux. |
@@ -240,9 +248,13 @@ double PPB_Flash_Proxy::GetLocalTimeZoneOffset(PP_Instance instance, |
base::TimeTicks expiration = |
base::TimeTicks::FromInternalValue(s_last_updated) + |
base::TimeDelta::FromSeconds(kMaxCachedLocalOffsetAgeInSeconds); |
- if (now < expiration) |
- return s_local_offset; |
+ // Use cached offset if cache hasn't expired and |t| is in the same minute as |
+ // the time for the cached offset (assume offsets change on minute |
+ // boundaries). |
+ if (now < expiration && InSameMinute(t, s_cached_t)) |
+ return s_cached_local_offset; |
+ s_cached_t = t; |
s_last_updated = now.ToInternalValue(); |
// TODO(shess): Figure out why OSX needs the access, the sandbox |
// warmup should handle it. http://crbug.com/149006 |
@@ -251,7 +263,7 @@ double PPB_Flash_Proxy::GetLocalTimeZoneOffset(PP_Instance instance, |
// by the sandbox. It would be better to go directly to the browser process |
// for this message rather than proxy it through some instance in a renderer. |
dispatcher()->Send(new PpapiHostMsg_PPBFlash_GetLocalTimeZoneOffset( |
- API_ID_PPB_FLASH, instance, t, &s_local_offset)); |
+ API_ID_PPB_FLASH, instance, t, &s_cached_local_offset)); |
#else |
base::Time cur = PPTimeToTime(t); |
base::Time::Exploded exploded = { 0 }; |
@@ -261,13 +273,13 @@ double PPB_Flash_Proxy::GetLocalTimeZoneOffset(PP_Instance instance, |
if (exploded.HasValidValues() && utc_exploded.HasValidValues()) { |
base::Time adj_time = base::Time::FromUTCExploded(exploded); |
base::Time cur = base::Time::FromUTCExploded(utc_exploded); |
- s_local_offset = (adj_time - cur).InSecondsF(); |
+ s_cached_local_offset = (adj_time - cur).InSecondsF(); |
} else { |
- s_local_offset = 0.0; |
+ s_cached_local_offset = 0.0; |
} |
#endif |
- return s_local_offset; |
+ return s_cached_local_offset; |
} |
PP_Bool PPB_Flash_Proxy::IsRectTopmost(PP_Instance instance, |