diff options
Diffstat (limited to 'chrome/common/chrome_plugin_api.h')
-rw-r--r-- | chrome/common/chrome_plugin_api.h | 507 |
1 files changed, 507 insertions, 0 deletions
diff --git a/chrome/common/chrome_plugin_api.h b/chrome/common/chrome_plugin_api.h new file mode 100644 index 0000000..1dd08727 --- /dev/null +++ b/chrome/common/chrome_plugin_api.h @@ -0,0 +1,507 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// 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 5 +#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, +} 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); + +// Informs the plugin of raw data having been sent from another process. +typedef void (STDCALL *CPP_OnMessageFunc)(void *data, uint32 data_len); + +// 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; +} 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; +} 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__ |