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