gecko-dev/accessible
Aaron Klotz b836337e81 Bug 1303060: Changes to a11y to enable the serving of a COM handler; r=tbsaunde
MozReview-Commit-ID: GTQF3x1pBtX

A general outline of the COM handler (a.k.a. the "smart proxy"):

COM handlers are pieces of code that are loaded by the COM runtime along with
a proxy and are layered above that proxy. This enables the COM handler to
interpose itself between the caller and the proxy, thus providing the
opportunity for the handler to manipulate an interface's method calls before
those calls reach the proxy.

Handlers are regular COM components that live in DLLs and are declared in the
Windows registry. In order to allow for the specifying of a handler (and an
optional payload to be sent with the proxy), the mscom library allows its
clients to specify an implementation of the IHandlerProvider interface.

IHandlerProvider consists of 5 functions:

* GetHandler returns the CLSID of the component that should be loaded into
  the COM client's process. If GetHandler returns a failure code, then no
  handler is loaded.
* GetHandlerPayloadSize and WriteHandlerPayload are for obtaining the payload
  data. These calls are made on a background thread but need to do their work
  on the main thread. We declare the payload struct in IDL. MIDL generates two
  functions, IA2Payload_Encode and IA2Payload_Decode, which are used by
  mscom::StructToStream to read and write that struct to and from buffers.
* The a11y payload struct also includes an interface, IGeckoBackChannel, that
  allows the handler to communicate directly with Gecko. IGeckoBackChannel
  currently provides two methods: one to allow the handler to request fresh
  cache information, and the other to provide Gecko with its IHandlerControl
  interface.
* MarshalAs accepts an IID that specifies the interface that is about to be
  proxied. We may want to send a more sophisticated proxy than the one that
  is requested. The desired IID is returned by this function. In the case of
  a11y interfaces, we should always return IAccessible2_3 if we are asked for
  one of its parent interfaces. This allows us to eliminate round trips to
  resolve more sophisticated interfaces later on.
* NewInstance, which is needed to ensure that all descendent proxies are also
  imbued with the same handler code.

The main focus of this patch is as follows:

1. Provide an implementation of the IHandlerProvider interface;
2. Populate the handler payload (ie, the cache) with data;
3. Modify CreateHolderFromAccessible to specify the HandlerPayload object;
4. Receive the IHandlerControl interface from the handler DLL and move it
   into the chrome process.

Some more information about IHandlerControl:

There is one IHandlerControl per handler DLL instance. It is the interface that
we call in Gecko when we need to dispatch an event to the handler. In order to
ensure that events are dispatched in the correct order, we need to dispatch
those events from the chrome main thread so that they occur in sequential order
with calls to NotifyWinEvent.

--HG--
extra : rebase_source : acb44dead7cc5488424720e1bf58862b7b30374f
2017-04-04 15:23:55 -06:00
..
aom Bug 1331434 - Part 4: Return early after throwing in AccessibleNode::Get, r=surkov 2017-03-07 19:06:48 -05:00
atk Bug 1344615: Remove nsXPCOMStrings.{h,cpp} r=bsmedberg 2017-03-06 17:52:54 +13:00
base Bug 1352802 - Typo fixes around 'accessible'. r=MattN 2017-04-03 09:47:00 -07:00
generic Bug 1349160 - Dismissing Print dialogue crashes Firefox, r=yzen 2017-04-03 15:21:05 -04:00
html Bug 752823 - Turn nsHTMLLiAccessible::mBullet into raw pointer. r=surkov 2017-01-02 20:41:50 +01:00
interfaces Bug 1346967: Generate metadata for all three ISimpleDOM interfaces via a single combined run of MIDL; r=tbsaunde 2017-03-13 16:39:28 -06:00
ipc Bug 1303060: Changes to a11y to enable the serving of a COM handler; r=tbsaunde 2017-04-04 15:23:55 -06:00
jsat Bug 1352802 - Typo fixes around 'accessible'. r=MattN 2017-04-03 09:47:00 -07:00
mac bug 1338755 - make RemoteChildDoc() return a DocAccessibleParent* r=yzen 2017-02-17 09:06:26 -05:00
other
tests Bug 1352802 - Typo fixes around 'accessible'. r=MattN 2017-04-03 09:47:00 -07:00
windows Bug 1303060: Changes to a11y to enable the serving of a COM handler; r=tbsaunde 2017-04-04 15:23:55 -06:00
xpcom Bug 1336637 - Support relation methods in xpc on windows. r=tbsaunde 2017-02-10 17:27:33 -08:00
xul Bug 1321384 - add debuggin assert for Accessible::RemoveChild, r=yzen 2017-03-09 14:55:54 -05:00
.eslintrc.js Bug 1251003 - Change .eslintrc files to .eslintrc.js to avoid obsolete config file format. r=mossop 2016-10-18 08:38:10 +01:00
moz.build Bug 1328356 - add BUG_COMPONENT to accessible/* files. r=davidb 2017-01-06 11:33:44 -05:00