// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "sky/engine/testing/platform/platform_impl.h" #include #include "base/rand_util.h" #include "base/stl_util.h" #include "base/synchronization/waitable_event.h" #include "base/time/time.h" #include "net/base/data_url.h" #include "net/base/mime_util.h" #include "net/base/net_errors.h" namespace sky { PlatformImpl::PlatformImpl() : main_loop_(base::MessageLoop::current()), shared_timer_func_(NULL), shared_timer_fire_time_(0.0), shared_timer_fire_time_was_set_while_suspended_(false), shared_timer_suspended_(0) { } PlatformImpl::~PlatformImpl() { } blink::WebString PlatformImpl::defaultLocale() { return blink::WebString::fromUTF8("en-US"); } double PlatformImpl::currentTime() { return base::Time::Now().ToDoubleT(); } double PlatformImpl::monotonicallyIncreasingTime() { return base::TimeTicks::Now().ToInternalValue() / static_cast(base::Time::kMicrosecondsPerSecond); } void PlatformImpl::setSharedTimerFiredFunction(void (*func)()) { shared_timer_func_ = func; } void PlatformImpl::setSharedTimerFireInterval( double interval_seconds) { shared_timer_fire_time_ = interval_seconds + monotonicallyIncreasingTime(); if (shared_timer_suspended_) { shared_timer_fire_time_was_set_while_suspended_ = true; return; } // By converting between double and int64 representation, we run the risk // of losing precision due to rounding errors. Performing computations in // microseconds reduces this risk somewhat. But there still is the potential // of us computing a fire time for the timer that is shorter than what we // need. // As the event loop will check event deadlines prior to actually firing // them, there is a risk of needlessly rescheduling events and of // needlessly looping if sleep times are too short even by small amounts. // This results in measurable performance degradation unless we use ceil() to // always round up the sleep times. int64 interval = static_cast( ceil(interval_seconds * base::Time::kMillisecondsPerSecond) * base::Time::kMicrosecondsPerMillisecond); if (interval < 0) interval = 0; shared_timer_.Stop(); shared_timer_.Start(FROM_HERE, base::TimeDelta::FromMicroseconds(interval), this, &PlatformImpl::DoTimeout); } void PlatformImpl::stopSharedTimer() { shared_timer_.Stop(); } blink::WebUnitTestSupport* PlatformImpl::unitTestSupport() { return &unit_test_support_; } const unsigned char* PlatformImpl::getTraceCategoryEnabledFlag( const char* category_name) { static const unsigned char buf[] = "*"; return buf; } } // namespace sky