Bug 1463908 - Lazily instatiate the tooltip text provider. r=bz
MozReview-Commit-ID: Jj0BPiMOywc
--- a/docshell/base/nsDocShellTreeOwner.cpp
+++ b/docshell/base/nsDocShellTreeOwner.cpp
@@ -1038,26 +1038,35 @@ ChromeTooltipListener::ChromeTooltipList
, mTooltipListenerInstalled(false)
, mMouseClientX(0)
, mMouseClientY(0)
, mMouseScreenX(0)
, mMouseScreenY(0)
, mShowingTooltip(false)
, mTooltipShownOnce(false)
{
- mTooltipTextProvider = do_GetService(NS_TOOLTIPTEXTPROVIDER_CONTRACTID);
- if (!mTooltipTextProvider) {
- mTooltipTextProvider = do_GetService(NS_DEFAULTTOOLTIPTEXTPROVIDER_CONTRACTID);
- }
}
ChromeTooltipListener::~ChromeTooltipListener()
{
}
+nsITooltipTextProvider*
+ChromeTooltipListener::GetTooltipTextProvider() {
+ if (!mTooltipTextProvider) {
+ mTooltipTextProvider = do_GetService(NS_TOOLTIPTEXTPROVIDER_CONTRACTID);
+ }
+
+ if (!mTooltipTextProvider) {
+ mTooltipTextProvider = do_GetService(NS_DEFAULTTOOLTIPTEXTPROVIDER_CONTRACTID);
+ }
+
+ return mTooltipTextProvider;
+}
+
// Hook up things to the chrome like context menus and tooltips, if the chrome
// has implemented the right interfaces.
NS_IMETHODIMP
ChromeTooltipListener::AddChromeListeners()
{
if (!mEventTarget) {
GetDOMEventTarget(mWebBrowser, getter_AddRefs(mEventTarget));
}
@@ -1337,22 +1346,22 @@ ChromeTooltipListener::sTooltipCallback(
if (!widget) {
// release tooltip target if there is one, NO MATTER WHAT
self->mPossibleTooltipNode = nullptr;
return;
}
// if there is text associated with the node, show the tip and fire
// off a timer to auto-hide it.
-
- if (self->mTooltipTextProvider) {
+ nsITooltipTextProvider* tooltipProvider = self->GetTooltipTextProvider();
+ if (tooltipProvider) {
nsString tooltipText;
nsString directionText;
bool textFound = false;
- self->mTooltipTextProvider->GetNodeText(
+ tooltipProvider->GetNodeText(
self->mPossibleTooltipNode, getter_Copies(tooltipText),
getter_Copies(directionText), &textFound);
if (textFound) {
LayoutDeviceIntPoint screenDot = widget->WidgetToScreenOffset();
double scaleFactor = 1.0;
if (shell->GetPresContext()) {
nsDeviceContext* dc = shell->GetPresContext()->DeviceContext();
--- a/docshell/base/nsDocShellTreeOwner.h
+++ b/docshell/base/nsDocShellTreeOwner.h
@@ -160,16 +160,17 @@ private:
NS_IMETHOD AddTooltipListener();
NS_IMETHOD RemoveTooltipListener();
NS_IMETHOD ShowTooltip(int32_t aInXCoords, int32_t aInYCoords,
const nsAString& aInTipText,
const nsAString& aDirText);
NS_IMETHOD HideTooltip();
+ nsITooltipTextProvider* GetTooltipTextProvider();
nsWebBrowser* mWebBrowser;
nsCOMPtr<mozilla::dom::EventTarget> mEventTarget;
nsCOMPtr<nsITooltipTextProvider> mTooltipTextProvider;
// This must be a strong ref in order to make sure we can hide the tooltip if
// the window goes away while we're displaying one. If we don't hold a strong
// ref, the chrome might have been disposed of before we get a chance to tell