void nsSubDocumentFrame::HideViewer() { if (mFrameLoader && mDidCreateDoc) { // Get the content viewer through the docshell, but don't call // GetDocShell() since we don't want to create one if we don't // have one. nsCOMPtr<nsIDocShell> docShell; mFrameLoader->GetDocShell(getter_AddRefs(docShell)); if (docShell) { nsCOMPtr<nsIContentViewer> content_viewer; docShell->GetContentViewer(getter_AddRefs(content_viewer)); if (content_viewer) { // Mark the content viewer as non-sticky so that the presentation // can safely go away when this frame is destroyed. content_viewer->SetSticky(PR_FALSE); } nsCOMPtr<nsIBaseWindow> baseWin = do_QueryInterface(docShell); NS_ASSERTION(baseWin, "Docshell must be an nsIBaseWindow"); // Now reverse the steps we took in ShowDocShell(). But don't call // Destroy(); that will be handled by destroying our frame loader, if // needed. // Hide the content viewer now that the frame is going away... baseWin->SetVisibility(PR_FALSE); // Clear out the parentWidget, since it might be about to die with us baseWin->SetParentWidget(nsnull); } } }
// XXX this should be called ObtainDocShell or something like that, // to indicate that it could have side effects NS_IMETHODIMP nsSubDocumentFrame::GetDocShell(nsIDocShell **aDocShell) { *aDocShell = nsnull; nsIContent* content = GetContent(); if (!content) { // Hmm, no content in this frame // that's odd, not much to be done here then. return NS_OK; } if (!mFrameLoader) { nsCOMPtr<nsIFrameLoaderOwner> loaderOwner = do_QueryInterface(content); if (loaderOwner) { loaderOwner->GetFrameLoader(getter_AddRefs(mFrameLoader)); } NS_ENSURE_STATE(mFrameLoader); } return mFrameLoader->GetDocShell(aDocShell); }
void APZEventState::ProcessAPZStateChange(const nsCOMPtr<nsIDocument>& aDocument, ViewID aViewId, APZStateChange aChange, int aArg) { switch (aChange) { case APZStateChange::TransformBegin: { nsIScrollableFrame* sf = nsLayoutUtils::FindScrollableFrameFor(aViewId); if (sf) { sf->SetTransformingByAPZ(true); } nsIScrollbarMediator* scrollbarMediator = do_QueryFrame(sf); if (scrollbarMediator) { scrollbarMediator->ScrollbarActivityStarted(); } if (aDocument && mActiveAPZTransforms == 0) { nsCOMPtr<nsIDocShell> docshell(aDocument->GetDocShell()); if (docshell && sf) { nsDocShell* nsdocshell = static_cast<nsDocShell*>(docshell.get()); nsdocshell->NotifyAsyncPanZoomStarted(); } } mActiveAPZTransforms++; break; } case APZStateChange::TransformEnd: { mActiveAPZTransforms--; nsIScrollableFrame* sf = nsLayoutUtils::FindScrollableFrameFor(aViewId); if (sf) { sf->SetTransformingByAPZ(false); } nsIScrollbarMediator* scrollbarMediator = do_QueryFrame(sf); if (scrollbarMediator) { scrollbarMediator->ScrollbarActivityStopped(); } if (aDocument && mActiveAPZTransforms == 0) { nsCOMPtr<nsIDocShell> docshell(aDocument->GetDocShell()); if (docshell && sf) { nsDocShell* nsdocshell = static_cast<nsDocShell*>(docshell.get()); nsdocshell->NotifyAsyncPanZoomStopped(); } } break; } case APZStateChange::StartTouch: { mActiveElementManager->HandleTouchStart(aArg); break; } case APZStateChange::StartPanning: { mActiveElementManager->HandlePanStart(); break; } case APZStateChange::EndTouch: { mEndTouchIsClick = aArg; mActiveElementManager->HandleTouchEnd(); break; } default: // APZStateChange has a 'sentinel' value, and the compiler complains // if an enumerator is not handled and there is no 'default' case. break; } }
NS_IMETHODIMP nsSubDocumentFrame::AttributeChanged(PRInt32 aNameSpaceID, nsIAtom* aAttribute, PRInt32 aModType) { if (aNameSpaceID != kNameSpaceID_None) { return NS_OK; } // If the noResize attribute changes, dis/allow frame to be resized if (aAttribute == nsGkAtoms::noresize) { // Note that we're not doing content type checks, but that's ok -- if // they'd fail we will just end up with a null framesetFrame. if (mContent->GetParent()->Tag() == nsGkAtoms::frameset) { nsIFrame* parentFrame = GetParent(); if (parentFrame) { // There is no interface for nsHTMLFramesetFrame so QI'ing to // concrete class, yay! nsHTMLFramesetFrame* framesetFrame = do_QueryFrame(parentFrame); if (framesetFrame) { framesetFrame->RecalculateBorderResize(); } } } } else if (aAttribute == nsGkAtoms::type) { if (!mFrameLoader) return NS_OK; if (!mContent->IsNodeOfType(nsINode::eXUL)) { return NS_OK; } // Note: This logic duplicates a lot of logic in // nsFrameLoader::EnsureDocShell. We should fix that. // Notify our enclosing chrome that our type has changed. We only do this // if our parent is chrome, since in all other cases we're random content // subframes and the treeowner shouldn't worry about us. nsCOMPtr<nsIDocShell> docShell; mFrameLoader->GetDocShell(getter_AddRefs(docShell)); nsCOMPtr<nsIDocShellTreeItem> docShellAsItem(do_QueryInterface(docShell)); if (!docShellAsItem) { return NS_OK; } nsCOMPtr<nsIDocShellTreeItem> parentItem; docShellAsItem->GetParent(getter_AddRefs(parentItem)); if (!parentItem) { return NS_OK; } PRInt32 parentType; parentItem->GetItemType(&parentType); if (parentType != nsIDocShellTreeItem::typeChrome) { return NS_OK; } nsCOMPtr<nsIDocShellTreeOwner> parentTreeOwner; parentItem->GetTreeOwner(getter_AddRefs(parentTreeOwner)); if (parentTreeOwner) { nsAutoString value; mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::type, value); PRBool is_primary = value.LowerCaseEqualsLiteral("content-primary"); #ifdef MOZ_XUL // when a content panel is no longer primary, hide any open popups it may have if (!is_primary) { nsXULPopupManager* pm = nsXULPopupManager::GetInstance(); if (pm) pm->HidePopupsInDocShell(docShellAsItem); } #endif parentTreeOwner->ContentShellRemoved(docShellAsItem); if (value.LowerCaseEqualsLiteral("content") || StringBeginsWith(value, NS_LITERAL_STRING("content-"), nsCaseInsensitiveStringComparator())) { PRBool is_targetable = is_primary || value.LowerCaseEqualsLiteral("content-targetable"); parentTreeOwner->ContentShellAdded(docShellAsItem, is_primary, is_targetable, value); } } } return NS_OK; }
NS_IMETHODIMP nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (!IsVisibleForPainting(aBuilder)) return NS_OK; if (aBuilder->IsForEventDelivery() && GetStyleVisibility()->mPointerEvents == NS_STYLE_POINTER_EVENTS_NONE) return NS_OK; nsresult rv = DisplayBorderBackgroundOutline(aBuilder, aLists); NS_ENSURE_SUCCESS(rv, rv); if (!mInnerView) return NS_OK; nsIView* subdocView = mInnerView->GetFirstChild(); if (!subdocView) return NS_OK; nsCOMPtr<nsIPresShell> presShell; nsIFrame* f = static_cast<nsIFrame*>(subdocView->GetClientData()); if (f) { presShell = f->PresContext()->PresShell(); } else { // If we don't have a frame we use this roundabout way to get the pres shell. if (!mFrameLoader) return NS_OK; nsCOMPtr<nsIDocShell> docShell; mFrameLoader->GetDocShell(getter_AddRefs(docShell)); if (!docShell) return NS_OK; docShell->GetPresShell(getter_AddRefs(presShell)); if (!presShell) return NS_OK; } PRBool suppressed = PR_TRUE; presShell->IsPaintingSuppressed(&suppressed); nsDisplayList childItems; nsRect dirty; if (f) { dirty = aDirtyRect - f->GetOffsetTo(this); aBuilder->EnterPresShell(f, dirty); } // Get the bounds of subdocView relative to the reference frame. nsRect shellBounds = subdocView->GetBounds() + mInnerView->GetPosition() + GetOffsetTo(aBuilder->ReferenceFrame()); if (!aBuilder->IsForEventDelivery()) { // Add the canvas background color. nsCOMPtr<nsIPresShell_MOZILLA_1_9_2> presShell192 = do_QueryInterface(presShell); if (presShell192) { rv = presShell192->AddCanvasBackgroundColorItem2( *aBuilder, childItems, f ? f : this, &shellBounds, NS_RGBA(0,0,0,0), PR_TRUE); } } if (f && NS_SUCCEEDED(rv)) { rv = f->BuildDisplayListForStackingContext(aBuilder, dirty, &childItems); } if (NS_SUCCEEDED(rv)) { // Clip children to the child root frame's rectangle rv = aLists.Content()->AppendNewToTop( new (aBuilder) nsDisplayClip(this, this, &childItems, shellBounds)); } // delete childItems in case of OOM childItems.DeleteAll(); if (f) { aBuilder->LeavePresShell(f, dirty); } return rv; }