15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Copyright (c) 2012 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)
6b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)/** @file debugging.c
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This example, is a modified version of hello world.  It will start a second
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * thread and cause that thread to crash via a NULL dereference.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_module.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_var.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_core.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_instance.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_messaging.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_var.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_instance.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_messaging.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <pthread.h>
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "error_handling/error_handling.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPB_Messaging* ppb_messaging_interface = NULL;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPB_Var* ppb_var_interface = NULL;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPB_Core* ppb_core_interface = NULL;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pthread_t g_NexeThread;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pthread_t g_PPAPIThread;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Instance g_Instance;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)volatile int g_CrashTime = 0;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PostMessage(const char* str);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void layer5(int x, int y) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (g_CrashTime) {
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *(volatile int*)x = y;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void layer4(int x) { layer5(x, 1); }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void layer3(int a, int b, int c) { layer4(a + b + c); }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void layer2(int i, int j) { layer3(i, j, 7); }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void layer1(int s, int t) {
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int* junk = (int*)alloca(sizeof(int) * 1234);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  junk[0] = s + 5;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layer2(junk[0], t + 1);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void* NexeMain(void* data) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PostMessage("Running Boom thread.");
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (1) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    layer1(2, 9);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Creates new string PP_Var from C string. The resulting object will be a
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * refcounted string object. It will be AddRef()ed for the caller. When the
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * caller is done with it, it should be Release()d.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] str C string to be converted to PP_Var
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return PP_Var containing string.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static struct PP_Var CStrToVar(const char* str) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppb_var_interface != NULL) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ppb_var_interface->VarFromUtf8(str, strlen(str));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_MakeUndefined();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void PostCompletionCallback(void* user_data, int32_t result) {
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* str = (const char*)user_data;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ppb_messaging_interface->PostMessage(g_Instance, CStrToVar(str));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  free(user_data);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PostMessage(const char* str) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct PP_CompletionCallback cb;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (NULL == str)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (NULL == ppb_messaging_interface)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (0 == g_Instance)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (strncmp(str, "ERR:", 4)) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stderr, "%s\n", str);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fflush(stderr);
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(stdout, "%s\n", str);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fflush(stdout);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If on Main Pepper thread, then call interface directly. */
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pthread_self() == g_PPAPIThread) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppb_messaging_interface->PostMessage(g_Instance, CStrToVar(str));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Otherwise use call on main thread. */
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cb = PP_MakeCompletionCallback(PostCompletionCallback, strdup(str));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppb_core_interface->CallOnMainThread(0, cb, 0);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DumpJson(const char* json) {
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  char* out = (char*)malloc(strlen(json) + 5);
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  strcpy(out, "TRC: ");
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  strcat(out, json);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PostMessage(out);
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  free(out);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called when the NaCl module is instantiated on the web page. The identifier
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the new instance will be passed in as the first argument (this value is
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * generated by the browser and is an opaque handle).  This is called for each
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * instantiation of the NaCl module, which is each time the <embed> tag for
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this module is encountered.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If this function reports a failure (by returning @a PP_FALSE), the NaCl
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * module will be deleted and DidDestroy will be called.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] instance The identifier of the new instance representing this
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     NaCl module.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] argc The number of arguments contained in @a argn and @a argv.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] argn An array of argument names.  These argument names are
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     supplied in the <embed> tag, for example:
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *       <embed id="nacl_module" dimensions="2">
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     will produce two arguments, one named "id" and one named "dimensions".
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] argv An array of argument values.  These are the values of the
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     arguments listed in the <embed> tag.  In the above example, there will
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     be two elements in this array, "nacl_module" and "2".  The indices of
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     these values match the indices of the corresponding names in @a argn.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return @a PP_TRUE on success.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PP_Bool Instance_DidCreate(PP_Instance instance,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  uint32_t argc,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const char* argn[],
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const char* argv[]) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_Instance = instance;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_PPAPIThread = pthread_self();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PostMessage("LOG: DidCreate");
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /* Request exception callbacks with JSON. */
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EHRequestExceptionsJson(DumpJson);
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /* Report back if the request was honored. */
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!EHHanderInstalled()) {
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostMessage("LOG: Stack traces not available, so don't expect them.\n");
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PostMessage("LOG: Stack traces are on.");
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pthread_create(&g_NexeThread, NULL, NexeMain, NULL);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_TRUE;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called when the NaCl module is destroyed. This will always be called,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * even if DidCreate returned failure. This routine should deallocate any data
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * associated with the instance.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] instance The identifier of the instance representing this NaCl
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     module.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void Instance_DidDestroy(PP_Instance instance) {}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called when the position, the size, or the clip rect of the element in the
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * browser that corresponds to this NaCl module has changed.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] instance The identifier of the instance representing this NaCl
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     module.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] position The location on the page of this NaCl module. This is
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     relative to the top left corner of the viewport, which changes as the
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     page is scrolled.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] clip The visible region of the NaCl module. This is relative to
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     the top left of the plugin's coordinate system (not the page).  If the
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     plugin is invisible, @a clip will be (0, 0, 0, 0).
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void Instance_DidChangeView(PP_Instance instance,
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   PP_Resource view_resource) {}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Notification that the given NaCl module has gained or lost focus.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Having focus means that keyboard events will be sent to the NaCl module
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * represented by @a instance. A NaCl module's default condition is that it
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * will not have focus.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note: clicks on NaCl modules will give focus only if you handle the
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * click event. You signal if you handled it by returning @a true from
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * HandleInputEvent. Otherwise the browser will bubble the event and give
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * focus to the element on the page that actually did end up consuming it.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If you're not getting focus, check to make sure you're returning true from
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the mouse click in HandleInputEvent.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] instance The identifier of the instance representing this NaCl
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     module.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] has_focus Indicates whether this NaCl module gained or lost
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     event focus.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static void Instance_DidChangeFocus(PP_Instance instance, PP_Bool has_focus) {}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handler that gets called after a full-frame module is instantiated based on
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * registered MIME types.  This function is not called on NaCl modules.  This
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function is essentially a place-holder for the required function pointer in
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the PPP_Instance structure.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] instance The identifier of the instance representing this NaCl
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     module.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] url_loader A PP_Resource an open PPB_URLLoader instance.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return PP_FALSE.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PP_Bool Instance_HandleDocumentLoad(PP_Instance instance,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           PP_Resource url_loader) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* NaCl modules do not need to handle the document load function. */
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_FALSE;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handles message from JavaScript.
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Any message from JS is a request to cause the main thread to crash.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void Messaging_HandleMessage(PP_Instance instance,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    struct PP_Var message) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PostMessage("LOG: Got BOOM");
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_CrashTime = 1;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Entry points for the module.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Initialize needed interfaces: PPB_Core, PPB_Messaging and PPB_Var.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] a_module_id module ID
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] get_browser pointer to PPB_GetInterface
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return PP_OK on success, any other value on failure.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_EXPORT int32_t PPP_InitializeModule(PP_Module a_module_id,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       PPB_GetInterface get_browser) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppb_messaging_interface =
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (PPB_Messaging*)(get_browser(PPB_MESSAGING_INTERFACE));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppb_var_interface = (PPB_Var*)(get_browser(PPB_VAR_INTERFACE));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppb_core_interface = (PPB_Core*)(get_browser(PPB_CORE_INTERFACE));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_OK;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns an interface pointer for the interface of the given name, or NULL
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if the interface is not supported.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param[in] interface_name name of the interface
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return pointer to the interface
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_EXPORT const void* PPP_GetInterface(const char* interface_name) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static PPP_Instance instance_interface = {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &Instance_DidCreate,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &Instance_DidDestroy,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &Instance_DidChangeView,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &Instance_DidChangeFocus,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &Instance_HandleDocumentLoad,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return &instance_interface;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (strcmp(interface_name, PPP_MESSAGING_INTERFACE) == 0) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static PPP_Messaging messaging_interface = {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &Messaging_HandleMessage,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return &messaging_interface;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called before the plugin module is unloaded.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_EXPORT void PPP_ShutdownModule() {}
285