Bug 1463908 - Lazily instatiate the tooltip text provider. r=bz draft
authorFelipe Gomes <felipc@gmail.com>
Wed, 30 May 2018 19:57:59 -0300
changeset 801862 1ce19a494a054b63a0eb63788761246bc0aafeaf
parent 800491 a466172aed4bc2afc21169b749b8068a4b98c93f
push id111767
push userfelipc@gmail.com
push dateWed, 30 May 2018 22:58:24 +0000
reviewersbz
bugs1463908
milestone62.0a1
Bug 1463908 - Lazily instatiate the tooltip text provider. r=bz MozReview-Commit-ID: Jj0BPiMOywc
docshell/base/nsDocShellTreeOwner.cpp
docshell/base/nsDocShellTreeOwner.h
--- 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