NS_IMETHODIMP nsScrollbarsProp::GetVisible(PRBool *aVisible) { *aVisible = PR_TRUE; // one assumes nsCOMPtr<nsIDOMWindow> domwin(do_QueryReferent(mDOMWindowWeakref)); if (domwin) { // dom window not deleted nsCOMPtr<nsIScrollable> scroller = do_QueryInterface(mDOMWindow->GetDocShell()); if (scroller) { PRInt32 prefValue; scroller->GetDefaultScrollbarPreferences( nsIScrollable::ScrollOrientation_Y, &prefValue); if (prefValue == nsIScrollable::Scrollbar_Never) // try the other way scroller->GetDefaultScrollbarPreferences( nsIScrollable::ScrollOrientation_X, &prefValue); if (prefValue == nsIScrollable::Scrollbar_Never) *aVisible = PR_FALSE; } } return NS_OK; }
static JSBool IsValFrame(JSObject *obj, jsval v, XPCWrappedNative *wn) { // Fast path for the common case. if (STOBJ_GET_CLASS(obj)->name[0] != 'W') { return JS_FALSE; } nsCOMPtr<nsIDOMWindow> domwin(do_QueryWrappedNative(wn)); if (!domwin) { return JS_FALSE; } nsCOMPtr<nsIDOMWindowCollection> col; domwin->GetFrames(getter_AddRefs(col)); if (!col) { return JS_FALSE; } if (JSVAL_IS_INT(v)) { col->Item(JSVAL_TO_INT(v), getter_AddRefs(domwin)); } else { nsAutoString str(reinterpret_cast<PRUnichar *> (JS_GetStringChars(JSVAL_TO_STRING(v)))); col->NamedItem(str, getter_AddRefs(domwin)); } return domwin != nsnull; }
NS_IMETHODIMP nsScrollbarsProp::SetVisible(PRBool aVisible) { PRBool enabled = PR_FALSE; nsCOMPtr<nsIScriptSecurityManager> securityManager(do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID)); if (securityManager) securityManager->IsCapabilityEnabled("UniversalBrowserWrite", &enabled); if (!enabled) return NS_OK; /* Scrollbars, unlike the other barprops, implement visibility directly rather than handing off to the superclass (and from there to the chrome window) because scrollbar visibility uniquely applies only to the window making the change (arguably. it does now, anyway.) and because embedding apps have no interface for implementing this themselves, and therefore the implementation must be internal. */ nsCOMPtr<nsIDOMWindow> domwin(do_QueryReferent(mDOMWindowWeakref)); if (domwin) { // dom window must still exist. use away. nsCOMPtr<nsIScrollable> scroller = do_QueryInterface(mDOMWindow->GetDocShell()); if (scroller) { PRInt32 prefValue; if (aVisible) { prefValue = nsIScrollable::Scrollbar_Auto; } else { prefValue = nsIScrollable::Scrollbar_Never; } scroller->SetDefaultScrollbarPreferences( nsIScrollable::ScrollOrientation_Y, prefValue); scroller->SetDefaultScrollbarPreferences( nsIScrollable::ScrollOrientation_X, prefValue); } } /* Notably absent is the part where we notify the chrome window using GetBrowserChrome()->SetChromeFlags(). Given the possibility of multiple DOM windows (multiple top-level windows, even) within a single chrome window, the historical concept of a single "has scrollbars" flag in the chrome is inapplicable, and we can't tell at this level whether we represent the particular DOM window that makes this decision for the chrome. So only this object (and its corresponding DOM window) knows whether scrollbars are visible. The corresponding chrome window will need to ask (one of) its DOM window(s) when it needs to know about scrollbar visibility, rather than caching its own copy of that information. */ return NS_OK; }
already_AddRefed<nsIWebBrowserChrome> nsBarProp::GetBrowserChrome() { // Check that the window is still alive. nsCOMPtr<nsIDOMWindow> domwin(do_QueryReferent(mDOMWindowWeakref)); if (!domwin) return nsnull; nsIWebBrowserChrome *browserChrome = nsnull; mDOMWindow->GetWebBrowserChrome(&browserChrome); return browserChrome; }