static nsIWidget* GetMainWidget(nsPIDOMWindowInner* aWindow) { // get the native window for this instance nsCOMPtr<nsIBaseWindow> baseWindow (do_QueryInterface(aWindow->GetDocShell())); NS_ENSURE_TRUE(baseWindow, nullptr); nsCOMPtr<nsIWidget> mainWidget; baseWindow->GetMainWidget(getter_AddRefs(mainWidget)); return mainWidget; }
NS_IMETHODIMP WindowCreator::CreateChromeWindow2(nsIWebBrowserChrome *parent, PRUint32 chromeFlags, PRUint32 contextFlags, nsIURI *uri, PRBool *cancel, nsIWebBrowserChrome **_retval) { nsresult rv = NS_OK; PRBool hasNewWindowListener = PR_FALSE; NativeBrowserControl *newNativeBrowserControl = nsnull; jint newNativeBCPtr = -1; JNIEnv *env = (JNIEnv *) JNU_GetEnv(gVm, JNI_VERSION); rv = mNativeBCPtr->GetNewWindowListenerAttached(&hasNewWindowListener); if (NS_FAILED(rv) || !hasNewWindowListener) { return rv; } nsCOMPtr<nsIWebBrowser> webBrowser; parent->GetWebBrowser(getter_AddRefs(webBrowser)); nsCOMPtr<nsIBaseWindow> baseWindow(do_QueryInterface(webBrowser)); if (nsnull != baseWindow) { jobject eventRegistration = nsnull; rv = mNativeBCPtr->mEventListener->GetEventRegistration(&eventRegistration); if (NS_FAILED(rv) || !eventRegistration) { return rv; } PR_LOG(prLogModuleInfo, PR_LOG_DEBUG, ("WindowCreater::CreateChromeWindow2: About to call back to Java to get new native window.\n")); // send this event to allow the user to create the new BrowserControl newNativeBCPtr = util_SendEventToJava(nsnull, eventRegistration, NEW_WINDOW_LISTENER_CLASSNAME, chromeFlags, nsnull); newNativeBrowserControl = (NativeBrowserControl *) newNativeBCPtr; PR_LOG(prLogModuleInfo, PR_LOG_DEBUG, ("WindowCreater::CreateChromeWindow2: nativeBrowserControl: %p new nsIWebBrowserChrome: %p.\n", newNativeBrowserControl, newNativeBrowserControl->mWindow)); PR_ASSERT(nsnull != newNativeBrowserControl); nsCOMPtr<nsIWebBrowserChrome> webChrome(newNativeBrowserControl->mWindow); *_retval = webChrome; NS_IF_ADDREF(*_retval); } return NS_OK; }
PRBool nsSubDocumentFrame::ReflowFinished() { nsCOMPtr<nsIDocShell> docShell; GetDocShell(getter_AddRefs(docShell)); nsCOMPtr<nsIBaseWindow> baseWindow(do_QueryInterface(docShell)); // resize the sub document if (baseWindow) { PRInt32 x = 0; PRInt32 y = 0; nsWeakFrame weakFrame(this); nsPresContext* presContext = PresContext(); baseWindow->GetPositionAndSize(&x, &y, nsnull, nsnull); if (!weakFrame.IsAlive()) { // GetPositionAndSize() killed us return PR_FALSE; } // GetPositionAndSize might have resized us. So now is the time to // get our size. mPostedReflowCallback = PR_FALSE; nsSize innerSize(GetSize()); if (IsInline()) { nsMargin usedBorderPadding = GetUsedBorderAndPadding(); // Sadly, XUL smacks the frame size without changing the used // border and padding, so we can't trust those. Subtracting // them might make things negative. innerSize.width -= usedBorderPadding.LeftRight(); innerSize.width = PR_MAX(innerSize.width, 0); innerSize.height -= usedBorderPadding.TopBottom(); innerSize.height = PR_MAX(innerSize.height, 0); } PRInt32 cx = presContext->AppUnitsToDevPixels(innerSize.width); PRInt32 cy = presContext->AppUnitsToDevPixels(innerSize.height); baseWindow->SetPositionAndSize(x, y, cx, cy, PR_FALSE); } else { // Make sure that we can post a reflow callback in the future. mPostedReflowCallback = PR_FALSE; } return PR_FALSE; }
/* void init (in nsIDOMWindow win); */ NS_IMETHODIMP nsWindowUtil::Init(nsIDOMWindow *win) { nsresult rv; mDOMWindow = win; nsCOMPtr<nsIDocShell> docShell; rv = GetDocShell(getter_AddRefs(docShell)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIBaseWindow> baseWindow(do_QueryInterface(docShell, &rv)); NS_ENSURE_SUCCESS(rv, rv); nativeWindow theNativeWindow; rv = baseWindow->GetParentNativeWindow( &theNativeWindow ); NS_ENSURE_SUCCESS(rv, rv); mWnd = reinterpret_cast<HWND>(theNativeWindow); NS_ENSURE_TRUE(mWnd, NS_ERROR_UNEXPECTED); return NS_OK; }
nsresult nsSubDocumentFrame::ShowDocShell() { nsCOMPtr<nsIDocShell> docShell; nsresult rv = GetDocShell(getter_AddRefs(docShell)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIPresShell> presShell; docShell->GetPresShell(getter_AddRefs(presShell)); if (presShell) { // The docshell is already showing, nothing left to do... NS_ASSERTION(mInnerView, "What's going on?"); return NS_OK; } // pass along marginwidth, marginheight, scrolling so sub document // can use it nsIntSize margin = GetMarginAttributes(); docShell->SetMarginWidth(margin.width); docShell->SetMarginHeight(margin.height); // Current and initial scrolling is set so that all succeeding docs // will use the scrolling value set here, regardless if scrolling is // set by viewing a particular document (e.g. XUL turns off scrolling) nsCOMPtr<nsIScrollable> sc(do_QueryInterface(docShell)); if (sc) { const nsStyleDisplay *disp = GetStyleDisplay(); sc->SetDefaultScrollbarPreferences(nsIScrollable::ScrollOrientation_X, ConvertOverflow(disp->mOverflowX)); sc->SetDefaultScrollbarPreferences(nsIScrollable::ScrollOrientation_Y, ConvertOverflow(disp->mOverflowY)); } PRInt32 itemType = nsIDocShellTreeItem::typeContent; nsCOMPtr<nsIDocShellTreeItem> treeItem(do_QueryInterface(docShell)); if (treeItem) { treeItem->GetItemType(&itemType); } nsContentType contentType; if (itemType == nsIDocShellTreeItem::typeChrome) { contentType = eContentTypeUI; } else { nsCOMPtr<nsIDocShellTreeItem> sameTypeParent; treeItem->GetSameTypeParent(getter_AddRefs(sameTypeParent)); contentType = sameTypeParent ? eContentTypeContentFrame : eContentTypeContent; } rv = CreateViewAndWidget(contentType); if (NS_FAILED(rv)) { return rv; } nsCOMPtr<nsIBaseWindow> baseWindow(do_QueryInterface(docShell)); if (baseWindow) { baseWindow->InitWindow(nsnull, mInnerView->GetWidget(), 0, 0, 10, 10); // This is kinda whacky, this "Create()" call doesn't really // create anything, one starts to wonder why this was named // "Create"... baseWindow->Create(); baseWindow->SetVisibility(PR_TRUE); } // Trigger editor re-initialization if midas is turned on in the // sub-document. This shouldn't be necessary, but given the way our // editor works, it is. See // https://bugzilla.mozilla.org/show_bug.cgi?id=284245 docShell->GetPresShell(getter_AddRefs(presShell)); if (presShell) { nsCOMPtr<nsIDOMNSHTMLDocument> doc = do_QueryInterface(presShell->GetDocument()); if (doc) { nsAutoString designMode; doc->GetDesignMode(designMode); if (designMode.EqualsLiteral("on")) { doc->SetDesignMode(NS_LITERAL_STRING("off")); doc->SetDesignMode(NS_LITERAL_STRING("on")); } } } return NS_OK; }
NS_IMETHODIMP nsNativeAppSupportMac::ReOpen() { PRBool haveUncollapsed = PR_FALSE; PRBool haveOpenWindows = PR_FALSE; PRBool done = PR_FALSE; nsCOMPtr<nsIWindowMediator> wm(do_GetService(NS_WINDOWMEDIATOR_CONTRACTID)); if (!wm) { return NS_ERROR_FAILURE; } else { nsCOMPtr<nsISimpleEnumerator> windowList; wm->GetXULWindowEnumerator(nsnull, getter_AddRefs(windowList)); PRBool more; windowList->HasMoreElements(&more); while (more) { nsCOMPtr<nsISupports> nextWindow = nsnull; windowList->GetNext(getter_AddRefs(nextWindow)); nsCOMPtr<nsIBaseWindow> baseWindow(do_QueryInterface(nextWindow)); if (!baseWindow) { windowList->HasMoreElements(&more); continue; } else { haveOpenWindows = PR_TRUE; } nsCOMPtr<nsIWidget> widget = nsnull; baseWindow->GetMainWidget(getter_AddRefs(widget)); if (!widget) { windowList->HasMoreElements(&more); continue; } WindowRef windowRef = (WindowRef)widget->GetNativeData(NS_NATIVE_DISPLAY); if (!::IsWindowCollapsed(windowRef)) { haveUncollapsed = PR_TRUE; break; //have un-minimized windows, nothing to do } windowList->HasMoreElements(&more); } // end while if (!haveUncollapsed) { //uncollapse the most recenty used window nsCOMPtr<nsIDOMWindowInternal> mru = nsnull; wm->GetMostRecentWindow(nsnull, getter_AddRefs(mru)); if (mru) { WindowRef mruRef = nil; GetNativeWindowPointerFromDOMWindow(mru, &mruRef); if (mruRef) { ::CollapseWindow(mruRef, FALSE); ::SelectWindow(mruRef); done = PR_TRUE; } } } // end if have uncollapsed if (!haveOpenWindows && !done) { NS_WARNING("trying to open new window"); //use the bootstrap helpers to make the right kind(s) of window open nsresult rv = PR_FALSE; nsCOMPtr<nsIAppStartup> appStartup(do_GetService(NS_APPSTARTUP_CONTRACTID)); if (appStartup) { PRBool openedAWindow = PR_FALSE; appStartup->CreateStartupState(nsIAppShellService::SIZE_TO_CONTENT, nsIAppShellService::SIZE_TO_CONTENT, &openedAWindow); } } } // got window mediator return NS_OK; }