1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <string> 6 7#include "ppapi/cpp/instance.h" 8#include "ppapi/cpp/module.h" 9#include "ppapi/cpp/var.h" 10#include "ppapi/utility/completion_callback_factory.h" 11 12#ifdef WIN32 13#undef PostMessage 14// Allow 'this' in initializer list 15#pragma warning(disable : 4355) 16#endif 17 18/// The Instance class. One of these exists for each instance of your NaCl 19/// module on the web page. The browser will ask the Module object to create 20/// a new Instance for each occurrence of the <embed> tag that has these 21/// attributes: 22/// type="application/x-nacl" 23/// src="file_histogram.nmf" 24class CoreInstance : public pp::Instance { 25 public: 26 /// The constructor creates the plugin-side instance. 27 /// @param[in] instance the handle to the browser-side plugin instance. 28 explicit CoreInstance(PP_Instance instance) 29 : pp::Instance(instance), callback_factory_(this) {} 30 31 private: 32 /// Handler for messages coming in from the browser via postMessage(). The 33 /// @a var_message will contain the requested delay time. 34 /// 35 /// @param[in] var_message The message posted by the browser. 36 virtual void HandleMessage(const pp::Var& var_message) { 37 int32_t delay = var_message.AsInt(); 38 if (delay) { 39 // If a delay is requested, issue a callback after delay ms. 40 last_receive_time_ = pp::Module::Get()->core()->GetTimeTicks(); 41 pp::Module::Get()->core()->CallOnMainThread( 42 delay, callback_factory_.NewCallback(&CoreInstance::DelayedPost), 0); 43 } else { 44 // If no delay is requested, reply immediately with zero time elapsed. 45 pp::Var msg(0); 46 PostMessage(msg); 47 } 48 } 49 50 void DelayedPost(int32_t) { 51 // Send the time elapsed until the callbacked fired. 52 pp::Var msg(pp::Module::Get()->core()->GetTimeTicks() - last_receive_time_); 53 PostMessage(msg); 54 } 55 56 private: 57 pp::CompletionCallbackFactory<CoreInstance> callback_factory_; 58 PP_TimeTicks last_receive_time_; 59}; 60 61class CoreModule : public pp::Module { 62 public: 63 CoreModule() : pp::Module() {} 64 virtual ~CoreModule() {} 65 66 virtual pp::Instance* CreateInstance(PP_Instance instance) { 67 return new CoreInstance(instance); 68 } 69}; 70 71namespace pp { 72Module* CreateModule() { return new CoreModule(); } 73} // namespace pp 74