I think it'd be very helpful to just copy & paste it here: http://dev.chromium.org/developers/design-documents/plugin-architecture
On Thu, Mar 12, 2009 at 3:38 PM, Evan Martin <e...@chromium.org> wrote: > > John graciously explained all this to me so I thought I'd write what I > know before I forget. Amanda/John, please correct me where I'm wrong! > > Windowless plugins are designed to run directly within the rendering > pipeline. When WebKit wants to draw a region of the screen involving > the plugin it calls into the plugin code, handing it a drawing > context. Windowless plugins are often used in situations where the > plugin is expected to be transparent over the page -- it's up to the > plugin drawing code to decide how it munges the bit of the page it's > given. > > To take windowless plugins out of process, you still need to > incorporate their rendering in the (synchronous) rendering pass done > by WebKit. A naively slow option is to clip out the region that the > plugin will draw on then synchronously ship that over to the plugin > process and let it draw. This can then be sped up with some shared > memory. > > However, rendering speed is then at the mercy of the plugin process > (imagine a page with 30 transparent plugins -- we'd need 30 round > trips to the plugin process). So instead we have windowless plugins > asynchronously paint, much like how our existing page rendering is > asynchronous with respect to the screen. The renderer has effectively > a backing store of what the plugin's rendered area looks like and uses > this image when drawing, and the plugin is free to asynchronously send > over new updates representing changes to the rendered area. > > All of this is complicated a bit by "transparent" plugins. The plugin > process needs to know what pixels it wants to draw over. So it also > keeps a cache of what the renderer last sent it as the page background > behind the plugin, then lets the plugin repeatedly draw over that. > > So, in all, here are the buffers involved for the region drawn by a > windowless plugin: > > Renderer process > - backing store of what the plugin last rendered as > - shared memory with the plugin for receiving updates ("transport DIB") > - copy of the page background behind the plugin (described below) > > Plugin process > - copy of the page background behind the plugin, used as the source > material when drawing > - shared memory with the renderer for sending updates ("transport DIB") > > Why does the renderer keep a copy of the page background? Because if > the page background changes, we need to synchronously get the plugin > to redraw over the new background it will appear to lag. We can tell > that the background changed by comparing the newly-rendered background > against our copy of what the plugin thinks the background. Since the > plugin and renderer processes are asynchronous with respect to one > another, they need separate copies. > > All of this sounds heinously slow, and it is, but it means there are > no glitches when drawing, just burned CPU. > > On Linux we have the extra twist that the plugin expects to draw on an > X Drawable, not a memory buffer. However, in the local X server case > it seems to me we can make the transport DIB live in shared memory > (much like it does in our fast drawing path in the renderer->browser > communication). Implementing this is another story. :) > > > > --~--~---------~--~----~------------~-------~--~----~ Chromium Developers mailing list: chromium-dev@googlegroups.com View archives, change email options, or unsubscribe: http://groups.google.com/group/chromium-dev -~----------~----~----~----~------~----~------~--~---