14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/debug/unittest_only_benchmark.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/values.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/debug/unittest_only_benchmark_impl.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace cc { 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)UnittestOnlyBenchmark::UnittestOnlyBenchmark(scoped_ptr<base::Value> value, 158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const DoneCallback& callback) 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : MicroBenchmark(callback), 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) create_impl_benchmark_(false), 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_ptr_factory_(this) { 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!value) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::DictionaryValue* settings = NULL; 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) value->GetAsDictionary(&settings); 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!settings) 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (settings->HasKey("run_benchmark_impl")) 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) settings->GetBoolean("run_benchmark_impl", &create_impl_benchmark_); 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)UnittestOnlyBenchmark::~UnittestOnlyBenchmark() { 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_ptr_factory_.InvalidateWeakPtrs(); 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void UnittestOnlyBenchmark::DidUpdateLayers(LayerTreeHost* host) { 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) NotifyDone(scoped_ptr<base::Value>()); 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool UnittestOnlyBenchmark::ProcessMessage(scoped_ptr<base::Value> value) { 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::DictionaryValue* message = NULL; 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) value->GetAsDictionary(&message); 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool can_handle; 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (message->HasKey("can_handle")) { 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) message->GetBoolean("can_handle", &can_handle); 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (can_handle) 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void UnittestOnlyBenchmark::RecordImplResults(scoped_ptr<base::Value> results) { 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NotifyDone(results.Pass()); 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)scoped_ptr<MicroBenchmarkImpl> UnittestOnlyBenchmark::CreateBenchmarkImpl( 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<base::MessageLoopProxy> origin_loop) { 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!create_impl_benchmark_) 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return make_scoped_ptr<MicroBenchmarkImpl>(NULL); 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return scoped_ptr<MicroBenchmarkImpl>(new UnittestOnlyBenchmarkImpl( 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) origin_loop, 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NULL, 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&UnittestOnlyBenchmark::RecordImplResults, 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_ptr_factory_.GetWeakPtr()))); 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace cc 68