summaryrefslogtreecommitdiffstats
path: root/chrome/common/chrome_plugin_api.h
blob: e5230cd30fad961cf06c279f135ee24f9d9b500c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// This header specifies the Chrome Plugin API.  It is based heavily on NPAPI.
// The key difference is that Chrome plugins can be loaded for the lifetime
// of the browser, and are not tied to a specific web page.
//
// NOTE: This API is not final and may change or go away at any point.
//
// All strings in the API are UTF8-encoded unless otherwise noted.

#ifndef CHROME_COMMON_CHROME_PLUGIN_API_H__
#define CHROME_COMMON_CHROME_PLUGIN_API_H__

#include "base/basictypes.h"

#ifndef STDCALL
#ifdef WIN32
#define STDCALL __stdcall
#else
#define STDCALL
#endif // WIN32
#endif // STDCALL

#ifdef __cplusplus
extern "C" {
#endif

// The current version of the API, used by the 'version' field of CPPluginFuncs
// and CPBrowserFuncs.
#define CP_MAJOR_VERSION 0
#define CP_MINOR_VERSION 11
#define CP_VERSION       ((CP_MAJOR_VERSION << 8) | (CP_MINOR_VERSION))

#define CP_GET_MAJOR_VERSION(version) ((version & 0xff00) >> 8)
#define CP_GET_MINOR_VERSION(version) (version & 0x00ff)

typedef unsigned char CPBool;

// Chrome plugins can be loaded into different process types.
typedef enum {
  CP_PROCESS_BROWSER = 0,
  CP_PROCESS_PLUGIN,
  CP_PROCESS_RENDERER,
} CPProcessType;

// Return codes.  Error values are negative.
typedef enum {
  // No error
  CPERR_SUCCESS = 0,

  // (network) An asynchronous IO operation is not complete
  CPERR_IO_PENDING = -1,

  // Generic failure
  CPERR_FAILURE = -2,

  // The API versions used by plugin and host are incompatible
  CPERR_INVALID_VERSION = -3,

  // The operation was cancelled
  CPERR_CANCELLED = -4,

  // An invalid parameter was passed
  CPERR_INVALID_PARAMETER = -5,
} CPError;

// Types of response info metadata to query using CPP_GetResponseInfo.
typedef enum {
  // HTTP status code.
  CPRESPONSEINFO_HTTP_STATUS = 0,

  // Raw headers from the server, including the status line.  Headers should
  // be delimited by "\0", and end with "\0\0" (a blank line).
  CPRESPONSEINFO_HTTP_RAW_HEADERS = 1,
} CPResponseInfoType;

// An identifier for the plugin used by the browser.
typedef struct _CPID_t {
  int unused;
} CPID_t;
typedef struct _CPID_t* CPID;

// An identifier that encapsulates the browsing context needed by various APIs.
// This includes information about what tab a request was made from, and what
// profile is active.  Note that this ID is global to all processes, so it can
// be passed from one process to another.  The value 0 is reserved for an
// undefined context.
typedef uint32 CPBrowsingContext;

// Types of context info to query using CPB_GetBrowsingContextInfo.
typedef enum {
  // The data directory for the profile associated with this context as a
  // pointer to a null-terminated string.  The plugin can save persistent data
  // to this directory.  The returned pointer should be freed using CPB_Free.
  CPBROWSINGCONTEXT_DATA_DIR_PTR = 0,

  // The locale language code used for the browser UI.  The returned pointer
  // should be freed using CPB_Free.
  CPBROWSINGCONTEXT_UI_LOCALE_PTR = 1,
} CPBrowsingContextInfoType;

// A network request object.
typedef struct _CPRequest {
  void* pdata;  // plugin private data
  const char* url;  // the URL being requested
  const char* method;  // the request method as an uppercase string (ex: "GET")
  CPBrowsingContext context;  // context in which this request was made
} CPRequest;

typedef enum {
  CPREQUESTLOAD_NORMAL = 0,

  // This is "normal reload", meaning an if-none-match/if-modified-since query
  CPREQUESTLOAD_VALIDATE_CACHE = 1 << 0,

  // This is "shift-reload", meaning a "pragma: no-cache" end-to-end fetch
  CPREQUESTLOAD_BYPASS_CACHE = 1 << 1,

  // This is a back/forward style navigation where the cached content should
  // be preferred over any protocol specific cache validation.
  CPREQUESTLOAD_PREFERRING_CACHE = 1 << 2,

  // This is a navigation that will fail if it cannot serve the requested
  // resource from the cache (or some equivalent local store).
  CPREQUESTLOAD_ONLY_FROM_CACHE = 1 << 3,

  // This is a navigation that will not use the cache at all.  It does not
  // impact the HTTP request headers.
  CPREQUESTLOAD_DISABLE_CACHE = 1 << 4,

  // This navigation should not be intercepted by plugins.
  CPREQUESTLOAD_DISABLE_INTERCEPT = 1 << 5,

  // This request should be loaded synchronously.  What this means is that
  // CPR_StartRequest and CPR_Read will never return CPERR_IO_PENDING - they
  // will block until a response is available, and return success or failure.
  CPREQUESTLOAD_SYNCHRONOUS = 1 << 20,
} CPRequestLoadFlags;

//
// Functions provided by plugin to host.
//

// Called when the browser is unloading the plugin.
typedef CPError (STDCALL *CPP_ShutdownFunc)(void);

// Returns true if the plugin is interested in handling this request.
typedef CPBool (STDCALL *CPP_ShouldInterceptRequestFunc)(CPRequest* request);

// Called when an HTML dialog was closed.  json_retval is the JSON string
// containing the return value sent back by the dialog (using Chrome's
// JavaScript DOM bindings).
typedef void (STDCALL *CPP_HtmlDialogClosedFunc)(
    void* plugin_context, const char* json_retval);

// Asks the plugin to handle the given command.  'command_data' is command-
// specific data used for some builtin commands: see gears_api.h for
// possible types.  It is only valid for the duration of this call.
typedef CPError (STDCALL *CPP_HandleCommandFunc)(
    CPBrowsingContext context, int command, void* command_data);

//
// Functions provided by host to plugin.
//

// Asks the host to handle the given command.  'command_data' is
// command-specific data used for some builtin commands: see gears_api.h for
// possible types.  It is only valid for the duration of this call.
typedef CPError (STDCALL *CPB_HandleCommandFunc)(
    CPID id, CPBrowsingContext context, int command, void* command_data);

// Asks the browser to enable/disable request interception for this plugin for
// the given schemes.  'schemes' is an array of strings containing the scheme
// names the plugin wishes to handle; case is ignored.  If 'schemes' is NULL or
// empty, request interception is disabled for this plugin.  Multiple calls to
// this function will add to the existing set of enabled schemes. The browser
// should call the plugin's CPP_ShouldInterceptRequestFunc for any network
// requests it makes that match a given scheme.  The browser may choose not to
// allow the plugin to intercept certain protocols.
typedef void (STDCALL *CPB_EnableRequestInterceptFunc)(
    CPID id, const char** schemes, uint32 num_schemes);

// Asks the browser to create a request object for the given method/url.
// Returns CPERR_SUCCESS and puts the new object into the 'request' field on
// success, or an error code on failure.  The plugin must call CPR_EndRequest
// to clean up the request object when it is done with it.
typedef CPError (STDCALL *CPB_CreateRequestFunc)(
    CPID id, CPBrowsingContext context, const char* method, const char* url,
    CPRequest** request);

// Queries the browser's cookie store for cookies set for the given URL.
// Sets 'cookies' to an allocated string containing the cookies as
// semicolon-delimited "name=value" pairs on success, NULL on failure.
// The memory should be freed using CPB_Free when done.
typedef CPError (STDCALL *CPB_GetCookiesFunc)(
    CPID id, CPBrowsingContext context, const char* url, char** cookies);

// Allocates memory for the given size using the browser's allocator.  Call
// CPB_Free when done.
typedef void* (STDCALL *CPB_AllocFunc)(uint32 size);

// Frees a pointer allocated by CPB_Alloc.
typedef void (STDCALL *CPB_FreeFunc)(void* memory);


// Sets a flag that influences when the plugin process created to host
// the plugin is shutdown. Generally, the plugin process is terminated
// when no more plugin instances exist, this is the default behavior.
// If keep_alive is non-zero, the process will not be terminated when
// the instance count goes to zero. Note: a non-zero keep_alive value
// does not prevent the plugin process from being terminated upon
// overall browser shutdown.
typedef void (STDCALL *CPB_SetKeepProcessAliveFunc)(CPID id,
                                                    CPBool keep_alive);

// Asks the browser to show an HTML dialog to the user.  The dialog contents
// should be loaded from the given URL.  The 'json_arguments' is a JSON string
// that the dialog can fetch using Chrome's JavaScript DOM bindings.  This call
// will block until the dialog is closed.  On success, 'json_retval' will
// contain the JSON string sent back by the dialog (using Chrome's JavaScript
// DOM bindings), and CPERR_SUCCESS is returned.  'json_retval' should be freed
// using CPB_Free when done.
typedef CPError (STDCALL *CPB_ShowHtmlDialogModalFunc)(
    CPID id, CPBrowsingContext context, const char* url, int width, int height,
    const char* json_arguments, char** json_retval);

// Similar to CPB_ShowHtmlDialogModalFunc, but does not block.  When the dialog
// is closed, CPP_HtmlDialogClosed is called with the JSON return value and the
// given 'plugin_context', which may be used by the plugin to associate other
// data with the dialog.
typedef CPError (STDCALL *CPB_ShowHtmlDialogFunc)(
    CPID id, CPBrowsingContext context, const char* url, int width, int height,
    const char* json_arguments, void* plugin_context);

// Get the browsing context associated with the given NPAPI instance.
typedef CPBrowsingContext (STDCALL *CPB_GetBrowsingContextFromNPPFunc)(
    struct _NPP* npp);

// Queries for some meta data associated with the given browsing context.  See
// CPBrowsingContextInfoType for possible queries.  If buf_size is too small to
// contain the entire data, the return value will indicate the size required.
// Otherwise, the return value is a CPError or CPERR_SUCCESS.
typedef int (STDCALL *CPB_GetBrowsingContextInfoFunc)(
    CPID id, CPBrowsingContext context, CPBrowsingContextInfoType type,
    void* buf, uint32 buf_size);

// Given an URL string, returns the string of command-line arguments that should
// be passed to start the browser at the given URL.  'arguments' should be freed
// using CPB_Free when done.
typedef CPError (STDCALL *CPB_GetCommandLineArgumentsFunc)(
    CPID id, CPBrowsingContext context, const char* url, char** arguments);

// Asks the browser to let the plugin handle the given UI command.  When the
// command is invoked, the browser will call CPP_HandleCommand.  'command'
// should be an integer identifier.  Currently only builtin commands are
// supported, but in the future we may want to let plugins add custom menu
// commands with their own descriptions.
typedef CPError (STDCALL *CPB_AddUICommandFunc)(CPID id, int command);

//
// Functions related to making network requests.
// Both the host and plugin will implement their own versions of these.
//

// Starts the request.  Returns CPERR_SUCCESS if the request could be started
// immediately, at which point the response info is available to be read.
// Returns CPERR_IO_PENDING if an asynchronous operation was started, and the
// caller should wait for CPRR_StartCompleted to be called before reading the
// response info.  Returns an error code on failure.
typedef CPError (STDCALL *CPR_StartRequestFunc)(CPRequest* request);

// Stops or cancels the request.  The caller should not access the request
// object after this call.  If an asynchronous IO operation is pending, the
// operation is aborted and the caller will not receive a callback for it.
typedef void (STDCALL *CPR_EndRequestFunc)(CPRequest* request, CPError reason);

// Sets the additional request headers to append to the standard headers that
// would normally be made with this request.  Headers should be \r\n-delimited,
// with no terminating \r\n.  Extra headers are not checked against the standard
// headers for duplicates. Must be called before CPRR_StartCompletedFunc.
// Plugins should avoid setting the following headers: User-Agent,
// Content-Length.
typedef void (STDCALL *CPR_SetExtraRequestHeadersFunc)(CPRequest* request,
                                                       const char* headers);

// Sets the load flags for this request. 'flags' is a bitwise-OR of
// CPRequestLoadFlags.  Must be called before CPRR_StartCompletedFunc.
typedef void (STDCALL *CPR_SetRequestLoadFlagsFunc)(CPRequest* request,
                                                    uint32 flags);

// Appends binary data to the request body of a POST or PUT request.  The caller
// should set the "Content-Type" header to the appropriate mime type using
// CPR_SetExtraRequestHeadersFunc.  This can be called multiple times to append
// a sequence of data segments to upload.  Must be called before
// CPR_StartRequestFunc.
typedef void (STDCALL *CPR_AppendDataToUploadFunc)(
    CPRequest* request, const char* bytes, int bytes_len);

// Appends the contents of a file to the request body of a POST or PUT request.
// 'offset' and 'length' can be used to append a subset of the file. Pass zero
// for 'length' and 'offset' to upload the entire file. 'offset'
// indicates where the data to upload begins in the file. 'length' indicates
// how much of the file to upload. A 'length' of zero is interpretted as to
// end-of-file. If 'length' and 'offset' indicate a range beyond end of file,
// the amount sent is clipped at eof.
// See CPR_AppendDataToUploadFunc for additional usage information.
// (added in v0.4)
typedef CPError (STDCALL *CPR_AppendFileToUploadFunc)(
    CPRequest* request, const char* filepath, uint64 offset, uint64 length);

// Queries for some response meta data.  See CPResponseInfoType for possible
// queries.  If buf_size is too small to contain the entire data, the return
// value will indicate the size required.  Otherwise, the return value is a
// CPError or CPERR_SUCCESS.
typedef int (STDCALL *CPR_GetResponseInfoFunc)(
    CPRequest* request, CPResponseInfoType type,
    void* buf, uint32 buf_size);

// Attempts to read a request's response data.  The number of bytes read is
// returned; 0 indicates an EOF.  CPERR_IO_PENDING is returned if an
// asynchronous operation was started, and CPRR_ReadCompletedFunc will be called
// when it completes; 'buf' must be available until the operation completes.
// Returns an error code on failure.
typedef int (STDCALL *CPR_ReadFunc)(
    CPRequest* request, void* buf, uint32 buf_size);

//
// Functions related to serving network requests.
// Both the host and plugin will implement their own versions of these.
//

// Called upon a server-initiated redirect.  The request will still hold the
// original URL, and 'new_url' will be the redirect destination.
typedef void (STDCALL *CPRR_ReceivedRedirectFunc)(CPRequest* request,
                                                  const char* new_url);

// Called when an asynchronous CPR_StartRequest call has completed, once all
// redirects are followed.  On success, 'result' holds CPERR_SUCCESS and the
// response info is available to be read via CPR_GetResponseInfo.  On error,
// 'result' holds the error code.
typedef void (STDCALL *CPRR_StartCompletedFunc)(CPRequest* request,
                                                CPError result);

// Called when an asynchronous CPR_Read call has completed.  On success,
// 'bytes_read' will hold the number of bytes read into the buffer that was
// passed to CPR_Read; 0 indicates an EOF, and the request object will be
// destroyed after the call completes.  On failure, 'bytes_read' holds the error
// code.
typedef void (STDCALL *CPRR_ReadCompletedFunc)(CPRequest* request,
                                               int bytes_read);

// Called as upload progress is being made for async POST requests.
// (added in v0.5)
typedef void (STDCALL *CPRR_UploadProgressFunc)(CPRequest* request,
                                                uint64 position,
                                                uint64 size);

//
// Functions to support the sending and receipt of messages between processes.
//

// Returns true if the plugin process is running
typedef CPBool (STDCALL *CPB_IsPluginProcessRunningFunc)(CPID id);

// Returns the type of the current process.
typedef CPProcessType (STDCALL *CPB_GetProcessTypeFunc)(CPID id);

// Asks the browser to send raw data to the other process hosting an instance of
// this plugin. If needed, the plugin process will be started prior to sending
// the message.
typedef CPError (STDCALL *CPB_SendMessageFunc)(CPID id,
                                               const void *data,
                                               uint32 data_len);

// Asks the browser to send raw data to the other process hosting an instance of
// this plugin. This function only works from the plugin or renderer process.
// This function blocks until the message is processed.  The memory should be
// freed using CPB_Free when done.
typedef CPError (STDCALL *CPB_SendSyncMessageFunc)(CPID id,
                                                   const void *data,
                                                   uint32 data_len,
                                                   void **retval,
                                                   uint32 *retval_len);

// This function asynchronously calls the provided function on the plugin
// thread.  user_data is passed as the argument to the function.
typedef CPError (STDCALL *CPB_PluginThreadAsyncCallFunc)(CPID id,
                                                         void (*func)(void *),
                                                         void *user_data);

// This function creates an open file dialog.  The process is granted access
// to any files that are selected.  |multiple_files| determines if more than
// one file can be selected.
typedef CPError (STDCALL *CPB_OpenFileDialogFunc)(CPID id,
                                                  CPBrowsingContext context,
                                                  bool multiple_files,
                                                  const char *title,
                                                  const char *filter,
                                                  void *user_data);

// Informs the plugin of raw data having been sent from another process.
typedef void (STDCALL *CPP_OnMessageFunc)(void *data, uint32 data_len);

// Informs the plugin of raw data having been sent from another process.
typedef void (STDCALL *CPP_OnSyncMessageFunc)(void *data, uint32 data_len,
                                              void **retval,
                                              uint32 *retval_len);

// Informs the plugin that the file dialog has completed, and contains the
// results.
typedef void (STDCALL *CPP_OnFileDialogResultFunc)(void *data,
                                                   const char **files,
                                                   uint32 files_len);

// Asks the browser to verify that NPObject* 'event' is the current drag event
// the browser is dispatching, and extract drag data from the event if so.  On
// success, returns the drag 'identity' (an up-counter that the browser chrome
// increases each time a user drag enters a renderer tab), the drag 'event_id'
// and the 'drag_type' being a utf8 encoded string with values "Files", "Text"
// or "URL".  If 'add_data' is true, also return the 'drag_data', again a utf8
// encoded string with the data for the drag type.  For drag type "Files", the
// data is a backspace delimited list of file paths.
//
// The call fails with a CPError if 'event' is an invalid drag event, and sets
// the 'identity' and 'event_id' to 0.  Note: on success, non-NULL 'drag_type'
// and 'drag_data' should be freed with CPB_Free() when done.
typedef CPError (STDCALL *CPB_GetDragDataFunc)(
    CPID id, CPBrowsingContext context, struct NPObject* event, bool add_data,
    int32* identity, int32* event_id, char** drag_type, char** drag_data);

// Asks the browser to verify that NPObject* 'event' is the current drag event
// the browser is dispatching and show the requested drop 'effect' if so.  The
// browser displays drop effects during dragenter and dragover events, to give
// user visible feedback (with a drag cursor, typically) to indicate whether a
// subsequent drop event will succeed or not.  The implementation supports the
// so-called "copy" and "none" effects.  When 'effect' is non-zero, the "copy"
// effect is shown.  Otherwise, the "none" effect is shown, which prevents the
// subsequent drop event from succeeding.  Returns CPError on failure, meaning
// the 'event' is an invalid drag event.
//
// Note: 'effect' is int to allow for new effects in future.  For example, the
// HTML5-defined drop effects "move" and "link".
typedef CPError (STDCALL *CPB_SetDropEffectFunc)(
    CPID id, CPBrowsingContext context, struct NPObject* event, int effect);

// For drag type "Files", the drag data returned by CPB_GetDragDataFunc() is a
// backspace delimited list of file paths.  Use this routine to pass that data
// to the browser process to verify that the renderer has permission to access
// the files.  Returns CPERR_SUCCESS if access is allowed.
typedef CPError (STDCALL *CPB_AllowFileDropFunc)(
    CPID id, CPBrowsingContext context, const char* file_drag_data);

// Function table for issuing requests using via the other side's network stack.
// For the plugin, this functions deal with issuing requests through the
// browser.  For the browser, these functions deal with allowing the plugin to
// intercept requests.
typedef struct _CPRequestFuncs {
  uint16 size;
  CPR_SetExtraRequestHeadersFunc set_extra_request_headers;
  CPR_SetRequestLoadFlagsFunc set_request_load_flags;
  CPR_AppendDataToUploadFunc append_data_to_upload;
  CPR_StartRequestFunc start_request;
  CPR_EndRequestFunc end_request;
  CPR_GetResponseInfoFunc get_response_info;
  CPR_ReadFunc read;
  CPR_AppendFileToUploadFunc append_file_to_upload;
} CPRequestFuncs;

// Function table for handling requests issued by the other side.  For the
// plugin, these deal with serving requests that the plugin has intercepted. For
// the browser, these deal with serving requests that the plugin has issued
// through us.
typedef struct _CPResponseFuncs {
  uint16 size;
  CPRR_ReceivedRedirectFunc received_redirect;
  CPRR_StartCompletedFunc start_completed;
  CPRR_ReadCompletedFunc read_completed;
  CPRR_UploadProgressFunc upload_progress;
} CPResponseFuncs;

// Function table of CPP functions (functions provided by plugin to host). This
// structure is filled in by the plugin in the CP_Initialize call, except for
// the 'size' field, which is set by the browser.  The version fields should be
// set to those that the plugin was compiled using.
typedef struct _CPPluginFuncs {
  uint16 size;
  uint16 version;
  CPRequestFuncs* request_funcs;
  CPResponseFuncs* response_funcs;
  CPP_ShutdownFunc shutdown;
  CPP_ShouldInterceptRequestFunc should_intercept_request;
  CPP_OnMessageFunc on_message;
  CPP_HtmlDialogClosedFunc html_dialog_closed;
  CPP_HandleCommandFunc handle_command;
  CPP_OnSyncMessageFunc on_sync_message;
  CPP_OnFileDialogResultFunc on_file_dialog_result;
} CPPluginFuncs;

// Function table CPB functions (functions provided by host to plugin).
// This structure is filled in by the browser and provided to the plugin.  The
// plugin will likely want to save a copy of this structure to make calls
// back to the browser.
typedef struct _CPBrowserFuncs {
  uint16 size;
  uint16 version;
  CPRequestFuncs* request_funcs;
  CPResponseFuncs* response_funcs;
  CPB_EnableRequestInterceptFunc enable_request_intercept;
  CPB_CreateRequestFunc create_request;
  CPB_GetCookiesFunc get_cookies;
  CPB_AllocFunc alloc;
  CPB_FreeFunc free;
  CPB_SetKeepProcessAliveFunc set_keep_process_alive;
  CPB_ShowHtmlDialogModalFunc show_html_dialog_modal;
  CPB_ShowHtmlDialogFunc show_html_dialog;
  CPB_IsPluginProcessRunningFunc is_plugin_process_running;
  CPB_GetProcessTypeFunc get_process_type;
  CPB_SendMessageFunc send_message;
  CPB_GetBrowsingContextFromNPPFunc get_browsing_context_from_npp;
  CPB_GetBrowsingContextInfoFunc get_browsing_context_info;
  CPB_GetCommandLineArgumentsFunc get_command_line_arguments;
  CPB_AddUICommandFunc add_ui_command;
  CPB_HandleCommandFunc handle_command;
  CPB_SendSyncMessageFunc send_sync_message;
  CPB_PluginThreadAsyncCallFunc plugin_thread_async_call;
  CPB_OpenFileDialogFunc open_file_dialog;
  CPB_GetDragDataFunc get_drag_data;
  CPB_SetDropEffectFunc set_drop_effect;
  CPB_AllowFileDropFunc allow_file_drop;
} CPBrowserFuncs;


//
// DLL exports
//

// This export is optional.
// Prior to calling CP_Initialize, the browser may negotiate with the plugin
// regarding which version of the CPAPI to utilize. 'min_version' is the
// lowest version of the interface supported by the browser, 'max_version' is
// the highest supported version. The plugin can specify which version within
// the range should be used. This version will be reflected in the version field
// of the CPBrowserFuncs struct passed to CP_Initialize. If this function
// returns an error code, CP_Initialize will not be called. If function is not
// exported by the chrome plugin module, CP_Initiailize will be called with
// a version of the host's choosing.
typedef CPError (STDCALL *CP_VersionNegotiateFunc)(
  uint16 min_version, uint16 max_version, uint16 *selected_version);

// 'bfuncs' are the browser functions provided to the plugin. 'id' is the
// plugin identifier that the plugin should use when calling browser functions.
// The plugin should initialize 'pfuncs' with pointers to its own functions,
// or return an error code.
// All functions and entry points should be called on the same thread.  The
// plugin should not attempt to call a browser function from a thread other
// than the one CP_InitializeFunc is called from.
typedef CPError (STDCALL *CP_InitializeFunc)(
    CPID id, const CPBrowserFuncs* bfuncs, CPPluginFuncs* pfuncs);

#ifdef __cplusplus
} // extern "C"
#endif

#endif  // CHROME_COMMON_CHROME_PLUGIN_API_H_