Changeset 13070 in webkit


Ignore:
Timestamp:
Mar 1, 2006 9:49:47 AM (18 years ago)
Author:
thatcher
Message:

WebCore:

Reviewed by Darin.


http://bugzilla.opendarwin.org/show_bug.cgi?id=7450
elementAtPoint is expensive and should return a smart dictionary

Support for WebKit. This removes the old elementAtPoint: on the bridge.
WebKit now uses the bridge method getInnerNonSharedNode:innerNode:URLElement:atPoint:

  • WebCore.exp: removes the WebCore* dictionary keys
  • bindings/objc/DOM.mm: (-[DOMElement image]): new method to get an NSImage if the element has an image renderer
  • bindings/objc/DOMHTML.mm: (-[DOMHTMLElement titleDisplayString]): new method that returns the title after doing the backslash as currency symbol conversion (-[DOMHTMLInputElement altDisplayString]): ditto for alt (-[DOMHTMLImageElement altDisplayString]): ditto (-[DOMHTMLAppletElement altDisplayString]): ditto (-[DOMHTMLAreaElement altDisplayString]): ditto (-[DOMHTMLAnchorElement absoluteLinkURL]): new method to get the absolute NSURL (-[DOMHTMLAreaElement absoluteLinkURL]): ditto (-[DOMHTMLLinkElement absoluteLinkURL]): ditto (-[DOMHTMLInputElement absoluteImageURL]): new method to get the absolute image location as an NSURL (-[DOMHTMLImageElement absoluteImageURL]): ditto (-[DOMHTMLObjectElement absoluteImageURL]): ditto
  • bindings/objc/DOMPrivate.h:
  • bridge/mac/WebCoreFrameBridge.h:
  • bridge/mac/WebCoreFrameBridge.mm: (-[WebCoreFrameBridge getInnerNonSharedNode:innerNode:URLElement:atPoint:]): (-[WebCoreFrameBridge isPointInsideSelection:]):
  • dom/DocumentImpl.cpp: (WebCore::DocumentImpl::prepareMouseEvent): (WebCore::DocumentImpl::backslashAsCurrencySymbol):
  • dom/DocumentImpl.h:
  • rendering/render_layer.cpp: (WebCore::RenderLayer::hitTest):
  • rendering/render_object.h: (WebCore::RenderObject::NodeInfo::URLElement): (WebCore::RenderObject::NodeInfo::setURLElement):

WebKit:

Reviewed by Darin.

http://bugzilla.opendarwin.org/show_bug.cgi?id=7450
elementAtPoint is expensive and should return a smart dictionary


elementAtPoint for WebHTMLView now returns a WebElementDictionary,
when objectForKey is called it will lookup in the DOM, cache and return the value

  • Misc/WebElementDictionary.h: Added.
  • Misc/WebElementDictionary.m: Added. (addLookupKey): (cacheValueForKey): (+[WebElementDictionary initializeLookupTable]): (-[WebElementDictionary initWithInnerNonSharedNode:innerNode:URLElement:andPoint:]): (-[WebElementDictionary dealloc]): (-[WebElementDictionary _fillCache]): (-[WebElementDictionary count]): (-[WebElementDictionary keyEnumerator]): (-[WebElementDictionary objectForKey:]): (-[WebElementDictionary _domNode]): (-[WebElementDictionary _webFrame]): (-[WebElementDictionary _targetWebFrame]): (-[WebElementDictionary _title]): (-[WebElementDictionary _imageRect]): (-[WebElementDictionary _isSelected]):
  • Misc/WebNSViewExtras.m: (-[NSView _web_dragImage:element:rect:event:pasteboard:source:offset:]):
  • WebKit.xcodeproj/project.pbxproj:
  • WebView/WebHTMLView.m: (-[WebHTMLView _updateMouseoverWithEvent:]): (-[WebHTMLView _startDraggingImage:at:operation:event:sourceIsDHTML:DHTMLWroteData:]): (-[NSArray elementAtPoint:]):
  • WebView/WebView.m:
  • WebView/WebViewPrivate.h:
Location:
trunk
Files:
2 added
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r13069 r13070  
     12006-03-01  Timothy Hatcher  <timothy@apple.com>
     2
     3        Reviewed by Darin.
     4       
     5        http://bugzilla.opendarwin.org/show_bug.cgi?id=7450
     6        elementAtPoint is expensive and should return a smart dictionary
     7
     8        Support for WebKit. This removes the old elementAtPoint: on the bridge.
     9        WebKit now uses the bridge method getInnerNonSharedNode:innerNode:URLElement:atPoint:
     10
     11        * WebCore.exp: removes the WebCore* dictionary keys
     12        * bindings/objc/DOM.mm:
     13        (-[DOMElement image]): new method to get an NSImage if the element has an image renderer
     14        * bindings/objc/DOMHTML.mm:
     15        (-[DOMHTMLElement titleDisplayString]): new method that returns the title after doing the backslash as currency symbol conversion
     16        (-[DOMHTMLInputElement altDisplayString]): ditto for alt
     17        (-[DOMHTMLImageElement altDisplayString]): ditto
     18        (-[DOMHTMLAppletElement altDisplayString]): ditto
     19        (-[DOMHTMLAreaElement altDisplayString]): ditto
     20        (-[DOMHTMLAnchorElement absoluteLinkURL]): new method to get the absolute NSURL
     21        (-[DOMHTMLAreaElement absoluteLinkURL]): ditto
     22        (-[DOMHTMLLinkElement absoluteLinkURL]): ditto
     23        (-[DOMHTMLInputElement absoluteImageURL]): new method to get the absolute image location as an NSURL
     24        (-[DOMHTMLImageElement absoluteImageURL]): ditto
     25        (-[DOMHTMLObjectElement absoluteImageURL]): ditto
     26        * bindings/objc/DOMPrivate.h:
     27        * bridge/mac/WebCoreFrameBridge.h:
     28        * bridge/mac/WebCoreFrameBridge.mm:
     29        (-[WebCoreFrameBridge getInnerNonSharedNode:innerNode:URLElement:atPoint:]):
     30        (-[WebCoreFrameBridge isPointInsideSelection:]):
     31        * dom/DocumentImpl.cpp:
     32        (WebCore::DocumentImpl::prepareMouseEvent):
     33        (WebCore::DocumentImpl::backslashAsCurrencySymbol):
     34        * dom/DocumentImpl.h:
     35        * rendering/render_layer.cpp:
     36        (WebCore::RenderLayer::hitTest):
     37        * rendering/render_object.h:
     38        (WebCore::RenderObject::NodeInfo::URLElement):
     39        (WebCore::RenderObject::NodeInfo::setURLElement):
     40
    1412006-03-01  Mitz Pettel  <opendarwin.org@mitzpettel.com>
    242
  • trunk/WebCore/WebCore.exp

    r13062 r13070  
    120120.objc_class_name_WebCoreViewFactory
    121121.objc_class_name_WebDashboardRegion
    122 _WebCoreElementDOMNodeKey
    123 _WebCoreElementFrameKey
    124 _WebCoreElementImageAltStringKey
    125 _WebCoreElementImageRectKey
    126 _WebCoreElementImageURLKey
    127 _WebCoreElementIsSelectedKey
    128 _WebCoreElementLinkLabelKey
    129 _WebCoreElementLinkTargetFrameKey
    130 _WebCoreElementLinkTitleKey
    131 _WebCoreElementLinkURLKey
    132 _WebCoreElementTitleKey
    133122_WebCoreInitializeEmptyTextGeometry
    134123_WebCoreInitializeEmptyTextStyle
  • trunk/WebCore/bindings/objc/DOM.mm

    r13063 r13070  
    14521452@implementation DOMElement (DOMElementExtensions)
    14531453
    1454 - (void)focus
    1455 {
    1456     [self _elementImpl]->focus();
    1457 }
    1458 
    1459 - (void)blur
    1460 {
    1461     [self _elementImpl]->blur();
    1462 }
    1463 
    1464 - (void)scrollIntoView:(BOOL)alignTop
    1465 {
    1466     [self _elementImpl]->scrollIntoView(alignTop);
    1467 }
    1468 
    1469 - (void)scrollIntoViewIfNeeded:(BOOL)centerIfNeeded
    1470 {
    1471     [self _elementImpl]->scrollIntoViewIfNeeded(centerIfNeeded);
    1472 }
    1473 
    1474 @end
    1475 
    1476 @implementation DOMElement (WebCoreInternal)
    1477 
    1478 + (DOMElement *)_elementWithImpl:(ElementImpl *)impl
    1479 {
    1480     return static_cast<DOMElement *>([DOMNode _nodeWithImpl:impl]);
    1481 }
    1482 
    1483 - (ElementImpl *)_elementImpl
    1484 {
    1485     return static_cast<ElementImpl *>(DOM_cast<NodeImpl *>(_internal));
    1486 }
    1487 
    1488 @end
    1489 
    1490 @implementation DOMElement (WebPrivate)
    1491 
    1492 - (NSFont *)_font
    1493 {
    1494     RenderObject *renderer = [self _elementImpl]->renderer();
    1495     if (renderer) {
    1496         return renderer->style()->font().getNSFont();
    1497     }
    1498     return nil;
    1499 }
    1500 
    1501 - (NSImage*)_image
    1502 {
    1503     RenderObject *renderer = [self _elementImpl]->renderer();
     1454- (NSImage*)image
     1455{
     1456    RenderObject* renderer = [self _elementImpl]->renderer();
    15041457    if (renderer && renderer->isImage()) {
    15051458        RenderImage* img = static_cast<RenderImage*>(renderer);
    15061459        if (img->cachedImage() && !img->cachedImage()->isErrorImage())
    15071460            return img->cachedImage()->image()->getNSImage();
     1461    }
     1462    return nil;
     1463}
     1464
     1465- (void)focus
     1466{
     1467    [self _elementImpl]->focus();
     1468}
     1469
     1470- (void)blur
     1471{
     1472    [self _elementImpl]->blur();
     1473}
     1474
     1475- (void)scrollIntoView:(BOOL)alignTop
     1476{
     1477    [self _elementImpl]->scrollIntoView(alignTop);
     1478}
     1479
     1480- (void)scrollIntoViewIfNeeded:(BOOL)centerIfNeeded
     1481{
     1482    [self _elementImpl]->scrollIntoViewIfNeeded(centerIfNeeded);
     1483}
     1484
     1485@end
     1486
     1487@implementation DOMElement (WebCoreInternal)
     1488
     1489+ (DOMElement *)_elementWithImpl:(ElementImpl *)impl
     1490{
     1491    return static_cast<DOMElement *>([DOMNode _nodeWithImpl:impl]);
     1492}
     1493
     1494- (ElementImpl *)_elementImpl
     1495{
     1496    return static_cast<ElementImpl *>(DOM_cast<NodeImpl *>(_internal));
     1497}
     1498
     1499@end
     1500
     1501@implementation DOMElement (WebPrivate)
     1502
     1503- (NSFont *)_font
     1504{
     1505    RenderObject *renderer = [self _elementImpl]->renderer();
     1506    if (renderer) {
     1507        return renderer->style()->font().getNSFont();
    15081508    }
    15091509    return nil;
  • trunk/WebCore/bindings/objc/DOMHTML.mm

    r12953 r13070  
    5959#import "DOMExtensions.h"
    6060#import "DOMInternal.h"
     61#import "DOMPrivate.h"
    6162#import "DOMHTMLInternal.h"
    6263#import <kxmlcore/Assertions.h>
     
    260261}
    261262
     263- (NSString *)titleDisplayString
     264{
     265    return [self _HTMLElementImpl]->title().replace('\\', [self _elementImpl]->getDocument()->backslashAsCurrencySymbol());
     266}
     267
    262268- (void)setTitle:(NSString *)title
    263269{
     
    581587}
    582588
     589- (NSURL *)absoluteLinkURL
     590{
     591    return [self _getURLAttribute:@"href"];
     592}
     593
    583594- (NSString *)href
    584595{
     
    12811292}
    12821293
     1294- (NSString *)altDisplayString
     1295{
     1296    return [self _inputElementImpl]->alt().replace('\\', [self _elementImpl]->getDocument()->backslashAsCurrencySymbol());
     1297}
     1298
    12831299- (void)setAlt:(NSString *)alt
    12841300{
     
    13441360{
    13451361    [self _inputElementImpl]->setSize(size);
     1362}
     1363
     1364- (NSURL *)absoluteImageURL
     1365{
     1366    if (![self _inputElementImpl]->renderer() || ![self _inputElementImpl]->renderer()->isImage())
     1367        return nil;
     1368    return [self _getURLAttribute:@"src"];
    13461369}
    13471370
     
    21662189}
    21672190
     2191- (NSURL *)absoluteLinkURL
     2192{
     2193    return [self _getURLAttribute:@"href"];
     2194}
     2195
    21682196- (NSString *)href
    21692197{
     
    23032331}
    23042332
     2333- (NSString *)altDisplayString
     2334{
     2335    String alt = [self _imageElementImpl]->getAttribute(altAttr);
     2336    return alt.replace('\\', [self _elementImpl]->getDocument()->backslashAsCurrencySymbol());
     2337}
     2338
    23052339- (void)setAlt:(NSString *)alt
    23062340{
     
    23602394}
    23612395
     2396- (NSURL *)absoluteImageURL
     2397{
     2398    return [self _getURLAttribute:@"src"];
     2399}
     2400
    23622401- (NSString *)src
    23632402{
     
    24762515}
    24772516
     2517- (NSURL *)absoluteImageURL
     2518{
     2519    if (![self _objectElementImpl]->renderer() || ![self _objectElementImpl]->renderer()->isImage())
     2520        return nil;
     2521    return [self _getURLAttribute:@"data"];
     2522}
     2523
    24782524- (NSString *)data
    24792525{
     
    26672713}
    26682714
     2715- (NSString *)altDisplayString
     2716{
     2717    String alt = [self _appletElementImpl]->getAttribute(altAttr);
     2718    return alt.replace('\\', [self _elementImpl]->getDocument()->backslashAsCurrencySymbol());
     2719}
     2720
    26692721- (void)setAlt:(NSString *)alt
    26702722{
     
    28132865}
    28142866
     2867- (NSString *)altDisplayString
     2868{
     2869    String alt = [self _areaElementImpl]->getAttribute(altAttr);
     2870    return alt.replace('\\', [self _elementImpl]->getDocument()->backslashAsCurrencySymbol());
     2871}
     2872
    28152873- (void)setAlt:(NSString *)alt
    28162874{
     
    28262884{
    28272885    [self _areaElementImpl]->setAttribute(coordsAttr, coords);
     2886}
     2887
     2888- (NSURL *)absoluteLinkURL
     2889{
     2890    return [self _getURLAttribute:@"href"];
    28282891}
    28292892
  • trunk/WebCore/bindings/objc/DOMPrivate.h

    r12808 r13070  
    4040@interface DOMElement (WebPrivate)
    4141- (NSFont *)_font;
    42 - (NSImage *)_image;
    4342- (NSData *)_imageTIFFRepresentation;
    4443- (NSURL *)_getURLAttribute:(NSString *)name;
     
    7776@end
    7877
    79 // BEGIN PENDING PUBLIC WEB INSPECTOR APIS
    80 // These APIs are for the Web Inspector, and they will be made public eventually.
     78// BEGIN PENDING PUBLIC APIS
     79// These APIs will be made public eventually.
    8180@interface DOMAttr (DOMAttrExtensions)
    8281- (DOMCSSStyleDeclaration *)style;
     
    108107
    109108@interface DOMElement (DOMElementExtensions)
     109- (NSImage *)image;
    110110- (void)focus;
    111111- (void)blur;
     
    113113- (void)scrollIntoViewIfNeeded:(BOOL)centerIfNeeded;
    114114@end
     115
     116@interface DOMHTMLElement (DOMHTMLElementPendingPublic)
     117- (NSString *)titleDisplayString;
     118@end
     119
     120@interface DOMHTMLInputElement (DOMHTMLInputElementPendingPublic)
     121- (NSString *)altDisplayString;
     122- (NSURL *)absoluteImageURL;
     123@end
     124
     125@interface DOMHTMLImageElement (DOMHTMLImageElementPendingPublic)
     126- (NSString *)altDisplayString;
     127- (NSURL *)absoluteImageURL;
     128@end
     129
     130@interface DOMHTMLObjectElement (DOMHTMLObjectElementPendingPublic)
     131- (NSURL *)absoluteImageURL;
     132@end
     133
     134@interface DOMHTMLAnchorElement (DOMHTMLAnchorElementPendingPublic)
     135- (NSURL *)absoluteLinkURL;
     136@end
     137
     138@interface DOMHTMLAreaElement (DOMHTMLAreaElementPendingPublic)
     139- (NSURL *)absoluteLinkURL;
     140@end
     141
     142@interface DOMHTMLLinkElement (DOMHTMLLinkElementPendingPublic)
     143- (NSURL *)absoluteLinkURL;
     144@end
     145
    115146// END
    116147
  • trunk/WebCore/bridge/mac/WebCoreFrameBridge.h

    r12898 r13070  
    6969@protocol WebCoreFileButton;
    7070@protocol WebCoreFileButtonDelegate;
    71 
    72 extern NSString *WebCoreElementDOMNodeKey;
    73 extern NSString *WebCoreElementFrameKey;
    74 extern NSString *WebCoreElementImageAltStringKey;
    75 extern NSString *WebCoreElementImageRectKey;
    76 extern NSString *WebCoreElementImageURLKey;
    77 extern NSString *WebCoreElementIsSelectedKey;
    78 extern NSString *WebCoreElementLinkURLKey;
    79 extern NSString *WebCoreElementLinkTargetFrameKey;
    80 extern NSString *WebCoreElementLinkLabelKey;
    81 extern NSString *WebCoreElementLinkTitleKey;
    82 extern NSString *WebCoreElementTitleKey;
    8371
    8472extern NSString *WebCorePageCacheStateKey;
     
    303291- (NSString *)renderTreeAsExternalRepresentation;
    304292
    305 - (NSDictionary *)elementAtPoint:(NSPoint)point;
     293- (void)getInnerNonSharedNode:(DOMNode **)innerNonSharedNode innerNode:(DOMNode **)innerNode URLElement:(DOMElement **)URLElement atPoint:(NSPoint)point;
     294- (BOOL)isPointInsideSelection:(NSPoint)point;
     295
    306296- (NSURL *)URLWithAttributeString:(NSString *)string;
    307297
  • trunk/WebCore/bridge/mac/WebCoreFrameBridge.mm

    r13067 r13070  
    124124using WebCore::RenderObject;
    125125
    126 NSString *WebCoreElementDOMNodeKey =            @"WebElementDOMNode";
    127 NSString *WebCoreElementFrameKey =              @"WebElementFrame";
    128 NSString *WebCoreElementImageAltStringKey =     @"WebElementImageAltString";
    129 NSString *WebCoreElementImageRectKey =          @"WebElementImageRect";
    130 NSString *WebCoreElementImageURLKey =           @"WebElementImageURL";
    131 NSString *WebCoreElementIsSelectedKey =         @"WebElementIsSelected";
    132 NSString *WebCoreElementLinkURLKey =            @"WebElementLinkURL";
    133 NSString *WebCoreElementLinkTargetFrameKey =    @"WebElementTargetFrame";
    134 NSString *WebCoreElementLinkLabelKey =          @"WebElementLinkLabel";
    135 NSString *WebCoreElementLinkTitleKey =          @"WebElementLinkTitle";
    136 NSString *WebCoreElementNameKey =               @"WebElementName";
    137 NSString *WebCoreElementTitleKey =              @"WebCoreElementTitle"; // not in WebKit API for now, could be in API some day
    138 
    139126NSString *WebCorePageCacheStateKey =            @"WebCorePageCacheState";
    140127
     
    12771264}
    12781265
    1279 - (NSDictionary *)elementAtPoint:(NSPoint)point
     1266- (void)getInnerNonSharedNode:(DOMNode **)innerNonSharedNode innerNode:(DOMNode **)innerNode URLElement:(DOMElement **)URLElement atPoint:(NSPoint)point
    12801267{
    12811268    RenderObject *renderer = m_frame->renderer();
    1282     if (!renderer)
    1283         return nil;
    1284    
     1269    if (!renderer) {
     1270        *innerNonSharedNode = nil;
     1271        *innerNode = nil;
     1272        *URLElement = nil;
     1273        return;
     1274    }
     1275
    12851276    RenderObject::NodeInfo nodeInfo = [self nodeInfoAtPoint:point];
    1286    
    1287     NSMutableDictionary *element = [NSMutableDictionary dictionary];
    1288     [element setObject:[NSNumber numberWithBool:m_frame->isPointInsideSelection((int)point.x, (int)point.y)]
    1289                 forKey:WebCoreElementIsSelectedKey];
    1290 
    1291     // Find the title in the nearest enclosing DOM node.
    1292     // For <area> tags in image maps, walk the tree for the <area>, not the <img> using it.
    1293     for (NodeImpl *titleNode = nodeInfo.innerNode(); titleNode; titleNode = titleNode->parentNode()) {
    1294         if (titleNode->isElementNode()) {
    1295             const AtomicString& title = static_cast<ElementImpl *>(titleNode)->getAttribute(titleAttr);
    1296             if (!title.isNull()) {
    1297                 // We found a node with a title.
    1298                 QString titleText = title.qstring();
    1299                 titleText.replace(QChar('\\'), m_frame->backslashAsCurrencySymbol());
    1300                 [element setObject:titleText.getNSString() forKey:WebCoreElementTitleKey];
    1301                 break;
    1302             }
    1303         }
    1304     }
    1305 
    1306     NodeImpl *URLNode = nodeInfo.URLElement();
    1307     if (URLNode) {
    1308         ElementImpl *e = static_cast<ElementImpl *>(URLNode);
    1309         DocumentImpl *doc = e->getDocument();
    1310         ASSERT(doc);
    1311        
    1312         const AtomicString& title = e->getAttribute(titleAttr);
    1313         if (!title.isEmpty()) {
    1314             QString titleText = title.qstring();
    1315             titleText.replace(QChar('\\'), m_frame->backslashAsCurrencySymbol());
    1316             [element setObject:titleText.getNSString() forKey:WebCoreElementLinkTitleKey];
    1317         }
    1318        
    1319         const AtomicString& link = e->getAttribute(hrefAttr);
    1320         if (!link.isNull()) {
    1321             QString t = plainText(rangeOfContents(e).get());
    1322             if (!t.isEmpty()) {
    1323                 [element setObject:t.getNSString() forKey:WebCoreElementLinkLabelKey];
    1324             }
    1325             QString URLString = parseURL(link).qstring();
    1326             [element setObject:doc->completeURL(URLString).getNSString() forKey:WebCoreElementLinkURLKey];
    1327         }
    1328        
    1329         DOMString target = e->getAttribute(targetAttr);
    1330         if (target.isEmpty() && doc) { // FIXME: Take out this doc check when we're not just before a release.
    1331             target = doc->baseTarget();
    1332         }
    1333         if (!target.isEmpty()) {
    1334             [element setObject:target.qstring().getNSString() forKey:WebCoreElementLinkTargetFrameKey];
    1335         }
    1336     }
    1337 
    1338     NodeImpl *node = nodeInfo.innerNonSharedNode();
    1339     if (node) {
    1340         [element setObject:[DOMNode _nodeWithImpl:node] forKey:WebCoreElementDOMNodeKey];
    1341    
    1342         // Only return image information if there is an image.
    1343         if (node->renderer() && node->renderer()->isImage()) {
    1344             RenderImage *r = static_cast<RenderImage *>(node->renderer());
    1345             int x, y;
    1346             if (r->absolutePosition(x, y)) {
    1347                 NSValue *rect = [NSValue valueWithRect:NSMakeRect(x, y, r->contentWidth(), r->contentHeight())];
    1348                 [element setObject:rect forKey:WebCoreElementImageRectKey];
    1349             }
    1350 
    1351             ElementImpl *i = static_cast<ElementImpl*>(node);
    1352    
    1353             // FIXME: Code copied from RenderImage::updateFromElement; should share.
    1354             DOMString attr;
    1355             if (i->hasTagName(objectTag)) {
    1356                 attr = i->getAttribute(dataAttr);
    1357             } else {
    1358                 attr = i->getAttribute(srcAttr);
    1359             }
    1360             if (!attr.isEmpty()) {
    1361                 QString URLString = parseURL(attr).qstring();
    1362                 [element setObject:i->getDocument()->completeURL(URLString).getNSString() forKey:WebCoreElementImageURLKey];
    1363             }
    1364            
    1365             // FIXME: Code copied from RenderImage::updateFromElement; should share.
    1366             DOMString alt;
    1367             if (i->hasTagName(inputTag))
    1368                 alt = static_cast<HTMLInputElementImpl *>(i)->altText();
    1369             else if (i->hasTagName(imgTag))
    1370                 alt = static_cast<HTMLImageElementImpl *>(i)->altText();
    1371             if (!alt.isNull()) {
    1372                 QString altText = alt.qstring();
    1373                 altText.replace(QChar('\\'), m_frame->backslashAsCurrencySymbol());
    1374                 [element setObject:altText.getNSString() forKey:WebCoreElementImageAltStringKey];
    1375             }
    1376         }
    1377     }
    1378    
    1379     return element;
     1277    *innerNonSharedNode = [DOMNode _nodeWithImpl:nodeInfo.innerNonSharedNode()];
     1278    *innerNode = [DOMNode _nodeWithImpl:nodeInfo.innerNode()];
     1279    *URLElement = [DOMElement _elementWithImpl:nodeInfo.URLElement()];
     1280}
     1281
     1282- (BOOL)isPointInsideSelection:(NSPoint)point
     1283{
     1284    return m_frame->isPointInsideSelection((int)point.x, (int)point.y);
    13801285}
    13811286
  • trunk/WebCore/dom/DocumentImpl.cpp

    r13063 r13070  
    2828#include "CDATASectionImpl.h"
    2929#include "CommentImpl.h"
     30#include "decoder.h"
    3031#include "DOMImplementationImpl.h"
    3132#include "DocLoader.h"
     
    16451646    String target;
    16461647    if (renderInfo.URLElement()) {
    1647         assert(renderInfo.URLElement()->isElementNode());
    1648         ElementImpl* e = static_cast<ElementImpl*>(renderInfo.URLElement());
     1648        ElementImpl* e = renderInfo.URLElement();
    16491649        href = parseURL(e->getAttribute(hrefAttr));
    16501650        if (!href.isNull())
     
    24932493}
    24942494
     2495QChar DocumentImpl::backslashAsCurrencySymbol() const
     2496{
     2497    if (!m_decoder)
     2498        return '\\';
     2499    return m_decoder->encoding().backslashAsCurrencySymbol();
     2500}
     2501
    24952502QString DocumentImpl::completeURL(const QString &URL)
    24962503{
  • trunk/WebCore/dom/DocumentImpl.h

    r12954 r13070  
    677677    Decoder* decoder() const { return m_decoder.get(); }
    678678
     679    QChar backslashAsCurrencySymbol() const;
     680
    679681#if __APPLE__
    680682    void setDashboardRegionsDirty(bool f) { m_dashboardRegionsDirty = f; }
  • trunk/WebCore/rendering/render_layer.cpp

    r13067 r13070  
    11211121    while (node) {
    11221122        if (node->isLink() && !info.URLElement())
    1123             info.setURLElement(node);
     1123            info.setURLElement(static_cast<ElementImpl*>(node));
    11241124        node = node->parentNode();
    11251125    }
  • trunk/WebCore/rendering/render_object.h

    r13067 r13070  
    489489        NodeImpl* innerNode() const { return m_innerNode; }
    490490        NodeImpl* innerNonSharedNode() const { return m_innerNonSharedNode; }
    491         NodeImpl* URLElement() const { return m_innerURLElement; }
     491        ElementImpl* URLElement() const { return m_innerURLElement; }
    492492        bool readonly() const { return m_readonly; }
    493493        bool active() const { return m_active; }
     
    496496        void setInnerNode(NodeImpl* n) { m_innerNode = n; }
    497497        void setInnerNonSharedNode(NodeImpl* n) { m_innerNonSharedNode = n; }
    498         void setURLElement(NodeImpl* n) { m_innerURLElement = n; }
     498        void setURLElement(ElementImpl* n) { m_innerURLElement = n; }
    499499
    500500    private:
    501501        NodeImpl* m_innerNode;
    502502        NodeImpl* m_innerNonSharedNode;
    503         NodeImpl* m_innerURLElement;
     503        ElementImpl* m_innerURLElement;
    504504        bool m_readonly;
    505505        bool m_active;
  • trunk/WebKit/ChangeLog

    r13062 r13070  
     12006-03-01  Timothy Hatcher  <timothy@apple.com>
     2
     3        Reviewed by Darin.
     4
     5        http://bugzilla.opendarwin.org/show_bug.cgi?id=7450
     6        elementAtPoint is expensive and should return a smart dictionary
     7       
     8        elementAtPoint for WebHTMLView now returns a WebElementDictionary,
     9        when objectForKey is called it will lookup in the DOM, cache and return the value
     10
     11        * Misc/WebElementDictionary.h: Added.
     12        * Misc/WebElementDictionary.m: Added.
     13        (addLookupKey):
     14        (cacheValueForKey):
     15        (+[WebElementDictionary initializeLookupTable]):
     16        (-[WebElementDictionary initWithInnerNonSharedNode:innerNode:URLElement:andPoint:]):
     17        (-[WebElementDictionary dealloc]):
     18        (-[WebElementDictionary _fillCache]):
     19        (-[WebElementDictionary count]):
     20        (-[WebElementDictionary keyEnumerator]):
     21        (-[WebElementDictionary objectForKey:]):
     22        (-[WebElementDictionary _domNode]):
     23        (-[WebElementDictionary _webFrame]):
     24        (-[WebElementDictionary _targetWebFrame]):
     25        (-[WebElementDictionary _title]):
     26        (-[WebElementDictionary _imageRect]):
     27        (-[WebElementDictionary _isSelected]):
     28        * Misc/WebNSViewExtras.m:
     29        (-[NSView _web_dragImage:element:rect:event:pasteboard:source:offset:]):
     30        * WebKit.xcodeproj/project.pbxproj:
     31        * WebView/WebHTMLView.m:
     32        (-[WebHTMLView _updateMouseoverWithEvent:]):
     33        (-[WebHTMLView _startDraggingImage:at:operation:event:sourceIsDHTML:DHTMLWroteData:]):
     34        (-[NSArray elementAtPoint:]):
     35        * WebView/WebView.m:
     36        * WebView/WebViewPrivate.h:
     37
    1382006-02-28  Darin Adler  <darin@apple.com>
    239
  • trunk/WebKit/Misc/WebNSViewExtras.m

    r12526 r13070  
    178178    NSPoint origin;
    179179
    180     NSImage *image = (wir != nil) ? [wir image] : [element _image];
     180    NSImage *image = (wir != nil) ? [wir image] : [element image];
    181181    if (image != nil && [image size].height * [image size].width <= WebMaxOriginalImageArea) {
    182182        NSSize originalSize = rect.size;
  • trunk/WebKit/WebKit.xcodeproj/project.pbxproj

    r12770 r13070  
    296296                9398112F0824BF01008DF038 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 830E81E005853AC000AD0891 /* Security.framework */; };
    297297                ABDDF20D08EB0DDC001E1241 /* WebDownloadInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = ABDDF20C08EB0DDC001E1241 /* WebDownloadInternal.h */; };
     298                DD89682009AA87240097E7F0 /* WebElementDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = DD89681E09AA87240097E7F0 /* WebElementDictionary.h */; };
     299                DD89682109AA87240097E7F0 /* WebElementDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = DD89681F09AA87240097E7F0 /* WebElementDictionary.m */; };
    298300                ED6BE2E7088C32B50044DEDC /* WebNSAttributedStringExtras.h in Headers */ = {isa = PBXBuildFile; fileRef = ED6BE2E5088C32B50044DEDC /* WebNSAttributedStringExtras.h */; };
    299301                ED6BE2E8088C32B50044DEDC /* WebNSAttributedStringExtras.m in Sources */ = {isa = PBXBuildFile; fileRef = ED6BE2E6088C32B50044DEDC /* WebNSAttributedStringExtras.m */; };
     
    554556                BEE52D4A0473032500CA289C /* WebKitSystemBits.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebKitSystemBits.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
    555557                BEE52D4B0473032500CA289C /* WebKitSystemBits.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = WebKitSystemBits.m; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
     558                DD89681E09AA87240097E7F0 /* WebElementDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebElementDictionary.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
     559                DD89681F09AA87240097E7F0 /* WebElementDictionary.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = WebElementDictionary.m; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
    556560                ED21B9810528F7AA003299AC /* WebDocumentInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebDocumentInternal.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
    557561                ED2B2474033A2DA800C1A526 /* WebNSPasteboardExtras.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebNSPasteboardExtras.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
     
    802806                                6578F5DE045F817400000128 /* WebDownload.h */,
    803807                                6578F5DF045F817400000128 /* WebDownload.m */,
     808                                DD89681E09AA87240097E7F0 /* WebElementDictionary.h */,
     809                                DD89681F09AA87240097E7F0 /* WebElementDictionary.m */,
    804810                        );
    805811                        path = Misc;
     
    13131319                                651951E209974178003DFC65 /* WebLoader.h in Headers */,
    13141320                                6550B7C7099EFAE90090D781 /* WebArchiver.h in Headers */,
     1321                                DD89682009AA87240097E7F0 /* WebElementDictionary.h in Headers */,
    13151322                        );
    13161323                        runOnlyForDeploymentPostprocessing = 0;
     
    18431850                                65C7F42D0979DE640022E453 /* WebPageBridge.m in Sources */,
    18441851                                6550B7C8099EFAE90090D781 /* WebArchiver.m in Sources */,
     1852                                DD89682109AA87240097E7F0 /* WebElementDictionary.m in Sources */,
    18451853                        );
    18461854                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/WebKit/WebView/WebHTMLView.m

    r13055 r13070  
    4444#import <WebKit/WebDOMOperationsPrivate.h>
    4545#import <WebKit/WebEditingDelegate.h>
     46#import <WebKit/WebElementDictionary.h>
    4647#import <WebKit/WebFramePrivate.h>
    4748#import <WebKit/WebFrameInternal.h>
     
    10521053            }
    10531054            if (newToolTip == nil)
    1054                 newToolTip = [[element objectForKey:WebCoreElementLinkURLKey] _web_userVisibleString];
     1055                newToolTip = [[element objectForKey:WebElementLinkURLKey] _web_userVisibleString];
    10551056        }
    10561057        if (newToolTip == nil)
    1057             newToolTip = [element objectForKey:WebCoreElementTitleKey];
     1058            newToolTip = [element objectForKey:WebElementTitleKey];
    10581059        [view _setToolTip:newToolTip];
    10591060
     
    11951196    // note per kwebster, the offset arg below is always ignored in positioning the image
    11961197    DOMHTMLElement *imageElement = [element objectForKey:WebElementDOMNodeKey];
    1197     if (imageURL != nil && [imageElement _image] != nil && (_private->dragSourceActionMask & WebDragSourceActionImage)) {
     1198    if (imageURL != nil && [imageElement image] != nil && (_private->dragSourceActionMask & WebDragSourceActionImage)) {
    11981199        id source = self;
    11991200        if (!dhtmlWroteData) {
     
    28662867- (NSDictionary *)elementAtPoint:(NSPoint)point
    28672868{
    2868     NSDictionary *elementInfoWC = [[self _bridge] elementAtPoint:point];
    2869     NSMutableDictionary *elementInfo = [elementInfoWC mutableCopy];
    2870    
    2871     // Convert URL strings to NSURLs.
    2872     [elementInfo _web_setObjectIfNotNil:[NSURL _web_URLWithDataAsString:[elementInfoWC objectForKey:WebElementLinkURLKey]] forKey:WebElementLinkURLKey];
    2873     [elementInfo _web_setObjectIfNotNil:[NSURL _web_URLWithDataAsString:[elementInfoWC objectForKey:WebElementImageURLKey]] forKey:WebElementImageURLKey];
    2874     if ([elementInfoWC objectForKey:WebElementImageURLKey])
    2875         [elementInfo _web_setObjectIfNotNil:[[elementInfoWC objectForKey:WebElementDOMNodeKey] _image] forKey:WebElementImageKey];
    2876 
    2877     WebFrameView *webFrameView = [self _web_parentWebFrameView];
    2878     ASSERT(webFrameView);
    2879     WebFrame *webFrame = [webFrameView webFrame];
    2880    
    2881     if (webFrame) {
    2882         NSString *frameName = [elementInfoWC objectForKey:WebElementLinkTargetFrameKey];
    2883         if ([frameName length] == 0) {
    2884             [elementInfo setObject:webFrame forKey:WebElementLinkTargetFrameKey];
    2885         } else {
    2886             WebFrame *wf = [webFrame findFrameNamed:frameName];
    2887             if (wf != nil)
    2888                 [elementInfo setObject:wf forKey:WebElementLinkTargetFrameKey];
    2889             else
    2890                 [elementInfo removeObjectForKey:WebElementLinkTargetFrameKey];
    2891         }
    2892        
    2893         [elementInfo setObject:webFrame forKey:WebElementFrameKey];
    2894     }
    2895    
    2896     return [elementInfo autorelease];
     2869    DOMNode *innerNode = nil;
     2870    DOMNode *innerNonSharedNode = nil;
     2871    DOMElement *URLElement = nil;
     2872    [[self _bridge] getInnerNonSharedNode:&innerNonSharedNode innerNode:&innerNode URLElement:&URLElement atPoint:point];
     2873    return [[[WebElementDictionary alloc] initWithInnerNonSharedNode:innerNonSharedNode innerNode:innerNode URLElement:URLElement andPoint:point] autorelease];
    28972874}
    28982875
  • trunk/WebKit/WebView/WebView.m

    r12898 r13070  
    310310NSString *WebElementImageURLKey =           @"WebElementImageURL";
    311311NSString *WebElementIsSelectedKey =         @"WebElementIsSelected";
     312NSString *WebElementTitleKey =              @"WebElementTitle";
    312313NSString *WebElementLinkURLKey =            @"WebElementLinkURL";
    313314NSString *WebElementLinkTargetFrameKey =    @"WebElementTargetFrame";
  • trunk/WebKit/WebView/WebViewPrivate.h

    r12793 r13070  
    6666extern NSString *_WebMainFrameURLKey;
    6767
     68extern NSString *WebElementTitleKey;   // NSString of the title of the element (pending public, used by Safari)
     69
    6870typedef enum {
    6971    WebDashboardBehaviorAlwaysSendMouseEventsToAllWindows,
Note: See TracChangeset for help on using the changeset viewer.