WebCore:
authorsullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 31 Oct 2006 23:03:24 +0000 (23:03 +0000)
committersullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 31 Oct 2006 23:03:24 +0000 (23:03 +0000)
        Reviewed by Beth and Adam

        Support for displaying tooltips for bad grammar. Currently this always displays the same tooltip;
        next I'll make it use a string that's relevant for a specific grammar error.

        * WebCore.exp:
        export symbol for spellingToolTip function

        * rendering/HitTestResult.h:
        * rendering/HitTestResult.cpp:
        (WebCore::HitTestResult::spellingToolTip):
        new function, returns the string to be used in a tool tip that describes the questionable grammar

        * rendering/InlineTextBox.h:
        * rendering/InlineTextBox.cpp:
        (WebCore::InlineTextBox::paintSpellingOrGrammarMarker):
        now takes a style and font, needed to compute the rect representing the range containing
        questionable grammar. Computes the rect and associates it with the marker.
        (WebCore::InlineTextBox::paintDocumentMarkers):
        Pass in the style and font now needed by paintSpellingOrGrammarMarker

WebKit:

        Reviewed by Beth and Adam

        Display a tooltip when hovering over marked bad grammar.

        * Misc/WebElementDictionary.m:
        (+[WebElementDictionary initializeLookupTable]):
        support spelling tool tip
        (-[WebElementDictionary _spellingToolTip]):
        new method, calls through to HitTestResult

        * WebView/WebHTMLView.m:
        (-[WebHTMLView _updateMouseoverWithEvent:]):
        Check for a spelling tool tip; if found, prefer it over the other possible tool tips.
        Check for empty strings instead of just nil strings being, since values from
        WebElementDictionary are empty strings.

        * WebView/WebViewPrivate.h:
        declare new string constant WebElementSpellingToolTipKey
        * WebView/WebView.mm:
        define new string constant WebElementSpellingToolTipKey

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@17501 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/WebCore.exp
WebCore/rendering/HitTestResult.cpp
WebCore/rendering/HitTestResult.h
WebCore/rendering/InlineTextBox.cpp
WebCore/rendering/InlineTextBox.h
WebKit/ChangeLog
WebKit/Misc/WebElementDictionary.m
WebKit/WebView/WebHTMLView.m
WebKit/WebView/WebView.mm
WebKit/WebView/WebViewPrivate.h

index 2c59c84dec496ddc23818034e542c54cf33cc9b6..40155fcf4457c21e93f1d31c3c5d4c22b8fffda8 100644 (file)
@@ -1,3 +1,26 @@
+2006-10-31  John Sullivan  <sullivan@apple.com>
+
+        Reviewed by Beth and Adam
+
+        Support for displaying tooltips for bad grammar. Currently this always displays the same tooltip; 
+        next I'll make it use a string that's relevant for a specific grammar error.
+
+        * WebCore.exp:
+        export symbol for spellingToolTip function
+        
+        * rendering/HitTestResult.h:
+        * rendering/HitTestResult.cpp:
+        (WebCore::HitTestResult::spellingToolTip):
+        new function, returns the string to be used in a tool tip that describes the questionable grammar
+        
+        * rendering/InlineTextBox.h:
+        * rendering/InlineTextBox.cpp:
+        (WebCore::InlineTextBox::paintSpellingOrGrammarMarker):
+        now takes a style and font, needed to compute the rect representing the range containing
+        questionable grammar. Computes the rect and associates it with the marker.
+        (WebCore::InlineTextBox::paintDocumentMarkers):
+        Pass in the style and font now needed by paintSpellingOrGrammarMarker
+
 2006-10-31  Adele Peterson  <adele@apple.com>
 
         Removed commented out variable from last checkin.
index 6e2a9cd4699ebe9750904c899cba5855a38fe8d9..36022898a252badc23510bd57c0c19d12d02adb1 100644 (file)
@@ -294,6 +294,7 @@ __ZNK7WebCore12AtomicString16deprecatedStringEv
 __ZNK7WebCore12RenderObject25backslashAsCurrencySymbolEv
 __ZNK7WebCore13HitTestResult10isSelectedEv
 __ZNK7WebCore13HitTestResult11boundingBoxEv
+__ZNK7WebCore13HitTestResult15spellingToolTipEv
 __ZNK7WebCore13HitTestResult11targetFrameEv
 __ZNK7WebCore13HitTestResult5titleEv
 __ZNK7WebCore14DocumentLoader10isStoppingEv
index d904fd7893ac5c924deb4c027f9604e72e014661..154a84b924b00ae6d30183ad62e81da70f467b61 100644 (file)
@@ -116,6 +116,21 @@ bool HitTestResult::isSelected() const
     return frame->selectionController()->contains(m_point);
 }
 
+String HitTestResult::spellingToolTip() const
+{
+    // Return the tool tip string associated with this point
+    // FIXME: At the moment this returns the same hardwired string for all bad grammar rects. This needs to
+    // instead return an instance-specific string that was stashed away when the bad grammar was discovered.
+    // Checking it in now just to modularize the work a little.
+    Vector<IntRect> rects = m_innerNonSharedNode->document()->renderedRectsForMarkers(DocumentMarker::Grammar);
+    unsigned count = rects.size();
+    for (unsigned index = 0; index < count; ++index)
+        if (rects[index].contains(m_point))
+            return "Questionable grammar!";
+
+    return String();
+}
+
 String HitTestResult::title() const
 {
     // Find the title in the nearest enclosing DOM node.
index 30b65e65e5466afbf8770c67e3f69a5b4b42a8f5..4f2bc71abbe6d7f0f23e46d15752cf5a1bb9d1b2 100644 (file)
@@ -56,6 +56,7 @@ public:
     Frame* targetFrame() const;
     IntRect boundingBox() const;
     bool isSelected() const;
+    String spellingToolTip() const;
     String title() const;
 
 private:
index 1b67b49fbc216537c504f50565eb453f665a077b..4be0f7db3af1c1787eb895fb23417c29e3739e21 100644 (file)
@@ -531,7 +531,7 @@ void InlineTextBox::paintDecoration(GraphicsContext *pt, int _tx, int _ty, int d
     }
 }
 
-void InlineTextBox::paintSpellingOrGrammarMarker(GraphicsContext* pt, int _tx, int _ty, DocumentMarker marker, bool grammar)
+void InlineTextBox::paintSpellingOrGrammarMarker(GraphicsContext* pt, int _tx, int _ty, DocumentMarker marker, RenderStyle* style, const Font* f, bool grammar)
 {
     _tx += m_x;
     _ty += m_y;
@@ -561,6 +561,19 @@ void InlineTextBox::paintSpellingOrGrammarMarker(GraphicsContext* pt, int _tx, i
         width = static_cast<RenderText*>(m_object)->width(paintStart, paintEnd - paintStart, textPos() + start, m_firstLine);
     }
     
+    // Store rendered rects for bad grammar markers, so we can hit-test against it elsewhere in order to
+    // display a toolTip. We don't do this for misspelling markers.
+    if (grammar) {
+        int y = root()->selectionTop();
+        IntPoint startPoint = IntPoint(m_x + _tx, y + _ty);
+        TextStyle textStyle = TextStyle(textObject()->tabWidth(), textPos(), m_toAdd, m_reversed, m_dirOverride || style->visuallyOrdered());
+        int startPosition = max(marker.startOffset - m_start, (unsigned)0);
+        int endPosition = min(marker.endOffset - m_start, (unsigned)m_len);    
+        TextRun run = TextRun(textObject()->string(), m_start, m_len, startPosition, endPosition);
+        IntRect markerRect = enclosingIntRect(f->selectionRectForText(run, textStyle, startPoint, root()->selectionHeight()));
+        object()->document()->setRenderedRectForMarker(object()->node(), marker, markerRect);
+    }
+    
     // IMPORTANT: The misspelling underline is not considered when calculating the text bounds, so we have to
     // make sure to fit within those bounds.  This means the top pixel(s) of the underline will overlap the
     // bottom pixel(s) of the glyphs in smaller font sizes.  The alternatives are to increase the line spacing (bad!!)
@@ -648,10 +661,10 @@ void InlineTextBox::paintDocumentMarkers(GraphicsContext* pt, int _tx, int _ty,
         // marker intersects this run.  Paint it.
         switch (marker.type) {
             case DocumentMarker::Spelling:
-                paintSpellingOrGrammarMarker(pt, _tx, _ty, marker, false);
+                paintSpellingOrGrammarMarker(pt, _tx, _ty, marker, style, f, false);
                 break;
             case DocumentMarker::Grammar:
-                paintSpellingOrGrammarMarker(pt, _tx, _ty, marker, true);
+                paintSpellingOrGrammarMarker(pt, _tx, _ty, marker, style, f, true);
                 break;
             case DocumentMarker::TextMatch:
                 paintTextMatchMarker(pt, _tx, _ty, marker, style, f);
index 238dd403ecd5e4573d64cb4004b16d04b3e7bd33..d68b220b1afbcb0dd004d571d2f76a86539c03d2 100644 (file)
@@ -110,7 +110,7 @@ public:
     void paintSelection(GraphicsContext*, int tx, int ty, RenderStyle*, const Font*);
     void paintMarkedTextBackground(GraphicsContext*, int tx, int ty, RenderStyle*, const Font*, int startPos, int endPos);
     void paintDocumentMarkers(GraphicsContext*, int tx, int ty, RenderStyle*, const Font*, bool background);
-    void paintSpellingOrGrammarMarker(GraphicsContext*, int tx, int ty, DocumentMarker, bool grammar);
+    void paintSpellingOrGrammarMarker(GraphicsContext*, int tx, int ty, DocumentMarker, RenderStyle*, const Font*, bool grammar);
     void paintTextMatchMarker(GraphicsContext*, int tx, int ty, DocumentMarker, RenderStyle*, const Font*);
     void paintMarkedTextUnderline(GraphicsContext*, int tx, int ty, const MarkedTextUnderline&);
 #if PLATFORM(MAC)
index 68cb0a0ff0736f5c0a1bc3973d9435f6920afe27..1df22949b67f76967fecfcfee4fc64b0a7e522ec 100644 (file)
@@ -1,3 +1,26 @@
+2006-10-31  John Sullivan  <sullivan@apple.com>
+
+        Reviewed by Beth and Adam
+        
+        Display a tooltip when hovering over marked bad grammar.
+
+        * Misc/WebElementDictionary.m:
+        (+[WebElementDictionary initializeLookupTable]):
+        support spelling tool tip
+        (-[WebElementDictionary _spellingToolTip]):
+        new method, calls through to HitTestResult
+        
+        * WebView/WebHTMLView.m:
+        (-[WebHTMLView _updateMouseoverWithEvent:]):
+        Check for a spelling tool tip; if found, prefer it over the other possible tool tips.
+        Check for empty strings instead of just nil strings being, since values from 
+        WebElementDictionary are empty strings.
+        
+        * WebView/WebViewPrivate.h:
+        declare new string constant WebElementSpellingToolTipKey
+        * WebView/WebView.mm:
+        define new string constant WebElementSpellingToolTipKey
+        
 2006-10-31  Beth Dakin  <bdakin@apple.com>
 
         Reviewed by Maciej.
index 5320c0c4441b4a2151d875b14cd3069610094cdd..e80115afdf01212261b4c263dfb853a469e70a13 100644 (file)
@@ -85,6 +85,7 @@ static void cacheValueForKey(const void *key, const void *value, void *self)
     addLookupKey(WebElementImageRectKey, @selector(_imageRect), WebElementSelf);
     addLookupKey(WebElementImageURLKey, @selector(absoluteImageURL), WebElementInnerNonSharedNode);
     addLookupKey(WebElementIsSelectedKey, @selector(_isSelected), WebElementSelf);
+    addLookupKey(WebElementSpellingToolTipKey, @selector(_spellingToolTip), WebElementSelf);
     addLookupKey(WebElementTitleKey, @selector(_title), WebElementSelf);
     addLookupKey(WebElementLinkURLKey, @selector(absoluteLinkURL), WebElementURLElement);
     addLookupKey(WebElementLinkTargetFrameKey, @selector(_targetWebFrame), WebElementSelf);
@@ -196,6 +197,11 @@ static void cacheValueForKey(const void *key, const void *value, void *self)
     return kit(webCoreFrame);
 }
 
+- (NSString *)_spellingToolTip
+{
+    return _result->spellingToolTip();
+}
+
 - (NSString *)_title
 {
     return _result->title();
index 151b66cf5f2556b2eee295c8536ca5582eda033f..e159d24aab241d981a92ebc033915887830896ba 100644 (file)
@@ -1216,18 +1216,29 @@ static WebHTMLView *lastHitView = nil;
         [[view _webView] _mouseDidMoveOverElement:element modifierFlags:[event modifierFlags]];
 
         // Set a tool tip; it won't show up right away but will if the user pauses.
-        NSString *newToolTip = nil;
-        if (_private->showsURLsInToolTips) {
+
+        // First priority is a potential toolTip representing a spelling or grammar error
+        NSString *newToolTip = [element objectForKey:WebElementSpellingToolTipKey];
+        
+        // Next priority is a toolTip from a URL beneath the mouse (if preference is set to show those).
+        if ([newToolTip length] == 0 && _private->showsURLsInToolTips) {
             DOMHTMLElement *domElement = [element objectForKey:WebElementDOMNodeKey];
+            
+            // Get tooltip representing form action, if relevant
             if ([domElement isKindOfClass:[DOMHTMLInputElement class]]) {
                 if ([[(DOMHTMLInputElement *)domElement type] isEqualToString:@"submit"])
                     newToolTip = [[(DOMHTMLInputElement *) domElement form] action];
             }
-            if (newToolTip == nil)
+            
+            // Get tooltip representing link's URL
+            if ([newToolTip length] == 0)
                 newToolTip = [[element objectForKey:WebElementLinkURLKey] _web_userVisibleString];
         }
-        if (newToolTip == nil)
+        
+        // Lastly we'll consider a tooltip for element with "title" attribute
+        if ([newToolTip length] == 0)
             newToolTip = [element objectForKey:WebElementTitleKey];
+        
         [view _setToolTip:newToolTip];
 
         [view release];
index 150c86cd5e5d276e7a55967f50e4a98bfb5b6266..38eeeedfce515589f27899bac56d792ae51ca8e5 100644 (file)
@@ -334,11 +334,12 @@ NSString *WebElementImageAltStringKey =     @"WebElementImageAltString";
 NSString *WebElementImageRectKey =          @"WebElementImageRect";
 NSString *WebElementImageURLKey =           @"WebElementImageURL";
 NSString *WebElementIsSelectedKey =         @"WebElementIsSelected";
-NSString *WebElementTitleKey =              @"WebElementTitle";
-NSString *WebElementLinkURLKey =            @"WebElementLinkURL";
-NSString *WebElementLinkTargetFrameKey =    @"WebElementTargetFrame";
 NSString *WebElementLinkLabelKey =          @"WebElementLinkLabel";
+NSString *WebElementLinkTargetFrameKey =    @"WebElementTargetFrame";
 NSString *WebElementLinkTitleKey =          @"WebElementLinkTitle";
+NSString *WebElementLinkURLKey =            @"WebElementLinkURL";
+NSString *WebElementSpellingToolTipKey =    @"WebElementSpellingToolTip";
+NSString *WebElementTitleKey =              @"WebElementTitle";
 
 NSString *WebViewProgressStartedNotification =          @"WebProgressStartedNotification";
 NSString *WebViewProgressEstimateChangedNotification =  @"WebProgressEstimateChangedNotification";
index 771e49165ed31c5dffe97a90178e0dbe261b5595..57eb7af2415e60f32df978ac2a74e6dc07138dee 100644 (file)
@@ -80,7 +80,9 @@ extern NSString *_WebMainFrameTitleKey;
 extern NSString *_WebMainFrameURLKey;
 extern NSString *_WebMainFrameDocumentKey;
 
-extern NSString *WebElementTitleKey;   // NSString of the title of the element (pending public, used by Safari)
+// pending public WebElementDictionary keys
+extern NSString *WebElementTitleKey;             // NSString of the title of the element (used by Safari)
+extern NSString *WebElementSpellingToolTipKey;   // NSString of a tooltip representing misspelling or bad grammar (used internally)
 
 typedef enum {
     WebDashboardBehaviorAlwaysSendMouseEventsToAllWindows,