diff options
Diffstat (limited to 'Source/WebKit/chromium/src/WebPluginContainerImpl.cpp')
-rw-r--r-- | Source/WebKit/chromium/src/WebPluginContainerImpl.cpp | 147 |
1 files changed, 11 insertions, 136 deletions
diff --git a/Source/WebKit/chromium/src/WebPluginContainerImpl.cpp b/Source/WebKit/chromium/src/WebPluginContainerImpl.cpp index 5f62077..bb1b083 100644 --- a/Source/WebKit/chromium/src/WebPluginContainerImpl.cpp +++ b/Source/WebKit/chromium/src/WebPluginContainerImpl.cpp @@ -63,12 +63,14 @@ #include "HTMLFormElement.h" #include "HTMLNames.h" #include "HTMLPlugInElement.h" +#include "IFrameShimSupport.h" #include "KeyboardCodes.h" #include "KeyboardEvent.h" #include "MouseEvent.h" #include "Page.h" #include "RenderBox.h" #include "ScrollView.h" +#include "UserGestureIndicator.h" #include "WheelEvent.h" #if WEBKIT_USING_SKIA @@ -127,14 +129,12 @@ void WebPluginContainerImpl::invalidateRect(const IntRect& rect) if (!parent()) return; - IntRect damageRect = convertToContainingWindow(rect); + RenderBox* renderer = toRenderBox(m_element->renderer()); - // Get our clip rect and intersect with it to ensure we don't invalidate - // too much. - IntRect clipRect = parent()->windowClipRect(); - damageRect.intersect(clipRect); - - parent()->hostWindow()->invalidateContentsAndWindow(damageRect, false /*immediate*/); + IntRect dirtyRect = rect; + dirtyRect.move(renderer->borderLeft() + renderer->paddingLeft(), + renderer->borderTop() + renderer->paddingTop()); + renderer->repaintRectangle(dirtyRect); } void WebPluginContainerImpl::setFocus(bool focused) @@ -368,6 +368,9 @@ void WebPluginContainerImpl::loadFrameRequest( FrameLoadRequest frameRequest(frame->document()->securityOrigin(), request.toResourceRequest(), target); + UserGestureIndicator gestureIndicator(request.hasUserGesture() ? + DefinitelyProcessingUserGesture : DefinitelyNotProcessingUserGesture); + frame->loader()->loadFrameRequest( frameRequest, false, // lock history @@ -552,7 +555,7 @@ void WebPluginContainerImpl::calculateGeometry(const IntRect& frameRect, clipRect = windowClipRect(); clipRect.move(-windowRect.x(), -windowRect.y()); - windowCutOutRects(frameRect, cutOutRects); + getPluginOcclusions(m_element, this->parent(), frameRect, cutOutRects); // Convert to the plugin position. for (size_t i = 0; i < cutOutRects.size(); i++) cutOutRects[i].move(-frameRect.x(), -frameRect.y()); @@ -577,132 +580,4 @@ WebCore::IntRect WebPluginContainerImpl::windowClipRect() const return clipRect; } -static void getObjectStack(const RenderObject* ro, - Vector<const RenderObject*>* roStack) -{ - roStack->clear(); - while (ro) { - roStack->append(ro); - ro = ro->parent(); - } -} - -// Returns true if stack1 is at or above stack2 -static bool checkStackOnTop( - const Vector<const RenderObject*>& iframeZstack, - const Vector<const RenderObject*>& pluginZstack) -{ - for (size_t i1 = 0, i2 = 0; - i1 < iframeZstack.size() && i2 < pluginZstack.size(); - i1++, i2++) { - // The root is at the end of these stacks. We want to iterate - // root-downwards so we index backwards from the end. - const RenderObject* ro1 = iframeZstack[iframeZstack.size() - 1 - i1]; - const RenderObject* ro2 = pluginZstack[pluginZstack.size() - 1 - i2]; - - if (ro1 != ro2) { - // When we find nodes in the stack that are not the same, then - // we've found the nodes just below the lowest comment ancestor. - // Determine which should be on top. - - // See if z-index determines an order. - if (ro1->style() && ro2->style()) { - int z1 = ro1->style()->zIndex(); - int z2 = ro2->style()->zIndex(); - if (z1 > z2) - return true; - if (z1 < z2) - return false; - } - - // If the plugin does not have an explicit z-index it stacks behind the iframe. - // This is for maintaining compatibility with IE. - if (ro2->style()->position() == StaticPosition) { - // The 0'th elements of these RenderObject arrays represent the plugin node and - // the iframe. - const RenderObject* pluginRenderObject = pluginZstack[0]; - const RenderObject* iframeRenderObject = iframeZstack[0]; - - if (pluginRenderObject->style() && iframeRenderObject->style()) { - if (pluginRenderObject->style()->zIndex() > iframeRenderObject->style()->zIndex()) - return false; - } - return true; - } - - // Inspect the document order. Later order means higher - // stacking. - const RenderObject* parent = ro1->parent(); - if (!parent) - return false; - ASSERT(parent == ro2->parent()); - - for (const RenderObject* ro = parent->firstChild(); ro; ro = ro->nextSibling()) { - if (ro == ro1) - return false; - if (ro == ro2) - return true; - } - ASSERT(false); // We should have seen ro1 and ro2 by now. - return false; - } - } - return true; -} - -// Return a set of rectangles that should not be overdrawn by the -// plugin ("cutouts"). This helps implement the "iframe shim" -// technique of overlaying a windowed plugin with content from the -// page. In a nutshell, iframe elements should occlude plugins when -// they occur higher in the stacking order. -void WebPluginContainerImpl::windowCutOutRects(const IntRect& frameRect, - Vector<IntRect>& cutOutRects) -{ - RenderObject* pluginNode = m_element->renderer(); - ASSERT(pluginNode); - if (!pluginNode->style()) - return; - Vector<const RenderObject*> pluginZstack; - Vector<const RenderObject*> iframeZstack; - getObjectStack(pluginNode, &pluginZstack); - - // Get the parent widget - Widget* parentWidget = this->parent(); - if (!parentWidget->isFrameView()) - return; - - FrameView* parentFrameView = static_cast<FrameView*>(parentWidget); - - const HashSet<RefPtr<Widget> >* children = parentFrameView->children(); - for (HashSet<RefPtr<Widget> >::const_iterator it = children->begin(); it != children->end(); ++it) { - // We only care about FrameView's because iframes show up as FrameViews. - if (!(*it)->isFrameView()) - continue; - - const FrameView* frameView = - static_cast<const FrameView*>((*it).get()); - // Check to make sure we can get both the element and the RenderObject - // for this FrameView, if we can't just move on to the next object. - if (!frameView->frame() || !frameView->frame()->ownerElement() - || !frameView->frame()->ownerElement()->renderer()) - continue; - - HTMLElement* element = frameView->frame()->ownerElement(); - RenderObject* iframeRenderer = element->renderer(); - - if (element->hasTagName(HTMLNames::iframeTag) - && iframeRenderer->absoluteBoundingBoxRect().intersects(frameRect) - && (!iframeRenderer->style() || iframeRenderer->style()->visibility() == VISIBLE)) { - getObjectStack(iframeRenderer, &iframeZstack); - if (checkStackOnTop(iframeZstack, pluginZstack)) { - IntPoint point = - roundedIntPoint(iframeRenderer->localToAbsolute()); - RenderBox* rbox = toRenderBox(iframeRenderer); - IntSize size(rbox->width(), rbox->height()); - cutOutRects.append(IntRect(point, size)); - } - } - } -} - } // namespace WebKit |