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