15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NATIVE_CLIENT_TESTS_PPAPI_TEST_LIB_TESTABLE_CALLBACK_H 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NATIVE_CLIENT_TESTS_PPAPI_TEST_LIB_TESTABLE_CALLBACK_H 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_completion_callback.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_instance.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_stdint.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: if you use you TestableCallback you will need to enable 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// testing interfaces in PPAPIBrowserTester(), e.g. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "--enable-pepper-testing", c.f. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tests/ppapi_browser/ppb_graphics2d/nacl.scons 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Example Usage: 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void TestProgressSimple() { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TestableCallback callback(pp_instance(), true); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ... 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rv = PPBURLLoader()->Open(loader, request, callback.GetCallback()); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// EXPECT(rv == PP_OK_COMPLETIONPENDING); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rv = callback.WaitForResult(); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// EXPECT(rv == PP_OK); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ... 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestableCallback { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestableCallback(PP_Instance instance, bool force_async); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the callback to be passed to an asynchronous PPAPI call 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_CompletionCallback GetCallback(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits for the callback to be called and returns the 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result. Returns immediately if the callback was previously called 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and the result wasn't returned (i.e. each result value received 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by the callback is returned by WaitForResult() once and only 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // once). 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t WaitForResult(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasRun() const { return run_count_ != 0; } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make instance runnable again. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run_count_ = 0; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) have_result_ = false; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t Result() const { return result_; } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Handler(void* user_data, int32_t result); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool have_result_; // is a result available? 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t result_; // value of the result 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool force_async_; // force callback to be always called 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool post_quit_task_; // has cleanup beem performed 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned run_count_; // number of times the callback has been called 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance_; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NATIVE_CLIENT_TESTS_PPAPI_TEST_LIB_TESTABLE_CALLBACK_H 66