NS_IMETHODIMP nsTypeAheadFind::IsRangeVisible(nsIDOMRange *aRange, bool aMustBeInViewPort, bool *aResult) { // Jump through hoops to extract the docShell from the range. nsCOMPtr<nsIDOMNode> node; aRange->GetStartContainer(getter_AddRefs(node)); nsCOMPtr<nsIDOMDocument> document; node->GetOwnerDocument(getter_AddRefs(document)); nsCOMPtr<nsIDOMWindow> window; document->GetDefaultView(getter_AddRefs(window)); nsCOMPtr<nsIWebNavigation> navNav (do_GetInterface(window)); nsCOMPtr<nsIDocShell> docShell (do_GetInterface(navNav)); // Set up the arguments needed to check if a range is visible. nsCOMPtr<nsIPresShell> presShell (docShell->GetPresShell()); nsRefPtr<nsPresContext> presContext = presShell->GetPresContext(); nsCOMPtr<nsIDOMRange> startPointRange = new nsRange(presShell->GetDocument()); *aResult = IsRangeVisible(presShell, presContext, aRange, aMustBeInViewPort, false, getter_AddRefs(startPointRange), nullptr); return NS_OK; }
NS_IMETHODIMP GetTopWindow(nsIDOMWindow* aWin, nsIDOMWindow **aDOMWindow) { nsCOMPtr<nsIDOMWindow> window; nsCOMPtr<nsIWebNavigation> navNav(do_GetInterface(aWin)); nsCOMPtr<nsIDocShellTreeItem> navItem(do_QueryInterface(navNav)); NS_ENSURE_TRUE(navItem, NS_ERROR_FAILURE); nsCOMPtr<nsIDocShellTreeItem> rootItem; navItem->GetRootTreeItem(getter_AddRefs(rootItem)); nsCOMPtr<nsIDOMWindow> rootWin(do_GetInterface(rootItem)); NS_ENSURE_TRUE(rootWin, NS_ERROR_FAILURE); rootWin->GetTop(getter_AddRefs(window)); *aDOMWindow = window.forget().take(); return NS_OK; }
nsresult XRemoteService::OpenURL(nsCString &aArgument, nsIDOMWindow *aParent, PRBool aOpenBrowser) { // the eventual toplevel target of the load nsCOMPtr<nsIDOMWindowInternal> finalWindow = do_QueryInterface(aParent); // see if there's a new-window or new-tab argument on the end nsCString lastArgument; PRBool newWindow = PR_FALSE, newTab = PR_FALSE; PRUint32 index = 0; FindLastInList(aArgument, lastArgument, &index); newTab = lastArgument.LowerCaseEqualsLiteral("new-tab"); if (newTab || lastArgument.LowerCaseEqualsLiteral("new-window")) { aArgument.Truncate(index); // only open new windows if it's OK to do so if (!newTab && aOpenBrowser) newWindow = PR_TRUE; // recheck for a possible noraise argument since it might have // been before the new-window argument FindLastInList(aArgument, lastArgument, &index); if (lastArgument.LowerCaseEqualsLiteral("noraise")) aArgument.Truncate(index); } nsCOMPtr<nsIBrowserDOMWindow> bwin; // If it's OK to open a new browser window and a new window flag // wasn't passed in then try to find a current window. If that's // not found then go ahead and open a new window. // If we're trying to open a new tab, we'll fall back to opening // a new window if there's no browser window open, so look for it // here. if (aOpenBrowser && (!newWindow || newTab)) { nsCOMPtr<nsIDOMWindowInternal> lastUsedWindow; FindWindow(NS_LITERAL_STRING("navigator:browser").get(), getter_AddRefs(lastUsedWindow)); if (lastUsedWindow) { finalWindow = lastUsedWindow; nsCOMPtr<nsIWebNavigation> navNav(do_GetInterface(finalWindow)); nsCOMPtr<nsIDocShellTreeItem> navItem(do_QueryInterface(navNav)); if (navItem) { nsCOMPtr<nsIDocShellTreeItem> rootItem; navItem->GetRootTreeItem(getter_AddRefs(rootItem)); nsCOMPtr<nsIDOMWindow> rootWin(do_GetInterface(rootItem)); nsCOMPtr<nsIDOMChromeWindow> chromeWin(do_QueryInterface(rootWin)); if (chromeWin) chromeWin->GetBrowserDOMWindow(getter_AddRefs(bwin)); } } if (!finalWindow || !bwin) newWindow = PR_TRUE; } // check if we can handle this type of URL if (!MayOpenURL(aArgument)) return NS_ERROR_ABORT; nsresult rv = NS_OK; // try to fixup the argument passed in nsString url; url.AssignWithConversion(aArgument.get()); nsCOMPtr<nsIURI> uri; NS_NewURI(getter_AddRefs(uri), url); if (newWindow) { nsXPIDLCString urlString; GetBrowserLocation(getter_Copies(urlString)); if (!urlString) return NS_ERROR_FAILURE; nsCOMPtr<nsISupportsString> arg; arg = do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID); if (!arg) return NS_ERROR_FAILURE; // save the url into the string object arg->SetData(url); nsCOMPtr<nsIDOMWindow> window; rv = OpenChromeWindow(finalWindow, urlString, "chrome,all,dialog=no", arg, getter_AddRefs(window)); } // if no new window flag was set but there's no parent then we have // to pass everything off to the uri loader else if (!finalWindow) { nsCOMPtr<nsIURILoader> loader; loader = do_GetService(NS_URI_LOADER_CONTRACTID); if (!loader) return NS_ERROR_FAILURE; XRemoteContentListener *listener; listener = new XRemoteContentListener(); if (!listener) return NS_ERROR_FAILURE; // we own it NS_ADDREF(listener); nsCOMPtr<nsISupports> listenerRef; listenerRef = do_QueryInterface(static_cast<nsIURIContentListener *> (listener)); // now the listenerref is the only reference NS_RELEASE(listener); // double-check our uri object if (!uri) return NS_ERROR_FAILURE; // open a channel nsCOMPtr<nsIChannel> channel; rv = NS_NewChannel(getter_AddRefs(channel), uri); if (NS_FAILED(rv)) return NS_ERROR_FAILURE; // load it rv = loader->OpenURI(channel, PR_TRUE, listener); } else if (newTab && aOpenBrowser) { if (bwin && uri) { nsCOMPtr<nsIDOMWindow> container; rv = bwin->OpenURI(uri, 0, nsIBrowserDOMWindow::OPEN_NEWTAB, nsIBrowserDOMWindow::OPEN_EXTERNAL, getter_AddRefs(container)); } else { NS_ERROR("failed to open remote URL in new tab"); return NS_ERROR_FAILURE; } } else if (bwin && uri) { // unspecified new browser URL; use prefs nsCOMPtr<nsIDOMWindow> container; rv = bwin->OpenURI(uri, 0, nsIBrowserDOMWindow::OPEN_DEFAULTWINDOW, nsIBrowserDOMWindow::OPEN_EXTERNAL, getter_AddRefs(container)); if (NS_SUCCEEDED(rv)) return NS_OK; } else { // non-browser URLs // find the primary content shell for the window that we've been // asked to load into. nsCOMPtr<nsPIDOMWindow> win(do_QueryInterface(finalWindow)); if (!win) { NS_WARNING("Failed to get script object for browser instance"); return NS_ERROR_FAILURE; } nsCOMPtr<nsIDocShell> docShell = win->GetDocShell(); if (!docShell) { NS_WARNING("Failed to get docshell object for browser instance"); return NS_ERROR_FAILURE; } nsCOMPtr<nsIDocShellTreeItem> item(do_QueryInterface(docShell)); if (!item) { NS_WARNING("failed to get doc shell tree item for browser instance"); return NS_ERROR_FAILURE; } nsCOMPtr<nsIDocShellTreeOwner> treeOwner; item->GetTreeOwner(getter_AddRefs(treeOwner)); if (!treeOwner) { NS_WARNING("failed to get tree owner"); return NS_ERROR_FAILURE; } nsCOMPtr<nsIDocShellTreeItem> primaryContent; treeOwner->GetPrimaryContentShell(getter_AddRefs(primaryContent)); docShell = do_QueryInterface(primaryContent); if (!docShell) { NS_WARNING("failed to get docshell from primary content item"); return NS_ERROR_FAILURE; } nsCOMPtr<nsIWebNavigation> webNav; webNav = do_GetInterface(docShell); if (!webNav) { NS_WARNING("failed to get web nav from inner docshell"); return NS_ERROR_FAILURE; } rv = webNav->LoadURI(url.get(), nsIWebNavigation::LOAD_FLAGS_NONE, nsnull, nsnull, nsnull); } return rv; }