Reviewed by Maciej.
authorvicki <vicki@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Apr 2005 22:37:18 +0000 (22:37 +0000)
committervicki <vicki@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Apr 2005 22:37:18 +0000 (22:37 +0000)
- fixed <rdar://problem/3760895> Request for including an implementation of the elementFromPoint function

        * khtml/dom/dom_doc.cpp:
        (DOM::Document::elementFromPoint):
        * khtml/dom/dom_doc.h:
        * khtml/ecma/kjs_dom.cpp:
        (DOMDocumentProtoFunc::tryCall):
        * khtml/ecma/kjs_dom.h:
        (KJS::DOMDocument::):
        * khtml/ecma/kjs_dom.lut.h:
        (KJS::):
        * khtml/xml/dom_docimpl.cpp:
        (DocumentImpl::elementFromPoint):
        * khtml/xml/dom_docimpl.h:

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/dom/dom_doc.cpp
WebCore/khtml/dom/dom_doc.h
WebCore/khtml/ecma/kjs_dom.cpp
WebCore/khtml/ecma/kjs_dom.h
WebCore/khtml/ecma/kjs_dom.lut.h
WebCore/khtml/xml/dom_docimpl.cpp
WebCore/khtml/xml/dom_docimpl.h

index f4b67fd7168760d5682b1c830a5a1b22aee0a43a..0601fe5e3d60a922d56ee8bb5313d8507c089c2c 100644 (file)
@@ -1,3 +1,22 @@
+2005-04-12  Vicki Murley  <vicki@apple.com>
+
+        Reviewed by Maciej. 
+
+       - fixed <rdar://problem/3760895> Request for including an implementation of the elementFromPoint function
+        * khtml/dom/dom_doc.cpp:
+        (DOM::Document::elementFromPoint):
+        * khtml/dom/dom_doc.h:
+        * khtml/ecma/kjs_dom.cpp:
+        (DOMDocumentProtoFunc::tryCall):
+        * khtml/ecma/kjs_dom.h:
+        (KJS::DOMDocument::):
+        * khtml/ecma/kjs_dom.lut.h:
+        (KJS::):
+        * khtml/xml/dom_docimpl.cpp:
+        (DocumentImpl::elementFromPoint):
+        * khtml/xml/dom_docimpl.h:
+
 2005-04-12  David Hyatt  <hyatt@apple.com>
 
        Beginning of work to support the Acid2 CSS test put forward by the Web Standards Project.  Fix
index f32cf072980479094879a92613340ad1bef13145..d6cd49ed9378632c7d14e9d9aaf7b16e2c090690 100644 (file)
@@ -329,6 +329,12 @@ Element Document::getElementById( const DOMString &elementId ) const
     return 0;
 }
 
+Element Document::elementFromPoint( const int _x, const int _y ) const
+{
+    if(!impl) return 0;
+    return ((DocumentImpl *)impl)->elementFromPoint( _x, _y );
+}
+
 NodeList Document::getElementsByTagName( const DOMString &tagName )
 {
     if (!impl) return 0;
index 2394bb8b88fb24b988f09bec6ef1be358551cc55..43132304448cc91c5fb986b4af933952bab964ff 100644 (file)
@@ -485,6 +485,8 @@ public:
      *
      */
     Element getElementById ( const DOMString &elementId ) const;
+    
+    Element elementFromPoint ( const int _x, const int _y ) const;
 
     /**
      * No Exceptions.
index fd2033ef173ece05296b9f46121025c90eb3d5fb..4c5f041aa13de281ff8ad8675cd8c48ea37e1283 100644 (file)
@@ -786,6 +786,7 @@ void DOMAttr::putValue(ExecState *exec, int token, const Value& value, int /*att
   createProcessingInstruction DOMDocument::CreateProcessingInstruction DontDelete|Function 1
   createAttribute DOMDocument::CreateAttribute                 DontDelete|Function 1
   createEntityReference DOMDocument::CreateEntityReference     DontDelete|Function 1
+  elementFromPoint     DOMDocument::ElementFromPoint           DontDelete|Function 1
   getElementsByTagName  DOMDocument::GetElementsByTagName      DontDelete|Function 1
   importNode           DOMDocument::ImportNode                 DontDelete|Function 2
   createElementNS      DOMDocument::CreateElementNS            DontDelete|Function 2
@@ -935,6 +936,8 @@ Value DOMDocumentProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List
     return getDOMNode(exec,doc.createAttribute(s));
   case DOMDocument::CreateEntityReference:
     return getDOMNode(exec,doc.createEntityReference(args[0].toString(exec).string()));
+  case DOMDocument::ElementFromPoint:
+    return getDOMNode(exec,doc.elementFromPoint((int)args[0].toNumber(exec), (int)args[1].toNumber(exec)));
   case DOMDocument::GetElementsByTagName:
     return getDOMNodeList(exec,doc.getElementsByTagName(s));
   case DOMDocument::ImportNode: // DOM2
index 343c67e382669c7e778690bc120bfc1f27cedb6a..bfd56a114ec2e350308ae8b995520ec84121d2f2 100644 (file)
@@ -125,7 +125,7 @@ namespace KJS {
            CreateEntityReference, GetElementsByTagName, ImportNode, CreateElementNS,
            CreateAttributeNS, GetElementsByTagNameNS, GetElementById,
            CreateRange, CreateNodeIterator, CreateTreeWalker, DefaultView,
-           CreateEvent, StyleSheets, PreferredStylesheetSet, 
+           CreateEvent, ElementFromPoint, StyleSheets, PreferredStylesheetSet, 
            SelectedStylesheetSet, GetOverrideStyle, ReadyState, 
            ExecCommand, QueryCommandEnabled, QueryCommandIndeterm, QueryCommandState, 
            QueryCommandSupported, QueryCommandValue };
index 8dcc4d5da53cdf96dcd0081875023e03fc7f1745..c3bc928e6c23986c0e06b0119ea5902f77ebcdd4 100644 (file)
@@ -145,24 +145,24 @@ namespace KJS {
 const struct HashEntry DOMDocumentProtoTableEntries[] = {
    { 0, 0, 0, 0, 0 },
    { "createEntityReference", DOMDocument::CreateEntityReference, DontDelete|Function, 1, 0 },
-   { "getElementById", DOMDocument::GetElementById, DontDelete|Function, 1, &DOMDocumentProtoTableEntries[34] },
+   { "getElementById", DOMDocument::GetElementById, DontDelete|Function, 1, &DOMDocumentProtoTableEntries[35] },
    { 0, 0, 0, 0, 0 },
-   { "getElementsByTagName", DOMDocument::GetElementsByTagName, DontDelete|Function, 1, &DOMDocumentProtoTableEntries[31] },
+   { "getElementsByTagName", DOMDocument::GetElementsByTagName, DontDelete|Function, 1, &DOMDocumentProtoTableEntries[32] },
    { "queryCommandIndeterm", DOMDocument::QueryCommandIndeterm, DontDelete|Function, 1, 0 },
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { "createElement", DOMDocument::CreateElement, DontDelete|Function, 1, 0 },
-   { "queryCommandEnabled", DOMDocument::QueryCommandEnabled, DontDelete|Function, 1, &DOMDocumentProtoTableEntries[35] },
+   { "queryCommandEnabled", DOMDocument::QueryCommandEnabled, DontDelete|Function, 1, &DOMDocumentProtoTableEntries[36] },
    { "createAttribute", DOMDocument::CreateAttribute, DontDelete|Function, 1, 0 },
    { "createEvent", DOMDocument::CreateEvent, DontDelete|Function, 1, 0 },
    { 0, 0, 0, 0, 0 },
-   { "importNode", DOMDocument::ImportNode, DontDelete|Function, 2, &DOMDocumentProtoTableEntries[33] },
+   { "importNode", DOMDocument::ImportNode, DontDelete|Function, 2, &DOMDocumentProtoTableEntries[34] },
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 },
    { "createDocumentFragment", DOMDocument::CreateDocumentFragment, DontDelete|Function, 1, &DOMDocumentProtoTableEntries[29] },
-   { "createTextNode", DOMDocument::CreateTextNode, DontDelete|Function, 1, &DOMDocumentProtoTableEntries[32] },
-   { "createRange", DOMDocument::CreateRange, DontDelete|Function, 0, 0 },
+   { "createTextNode", DOMDocument::CreateTextNode, DontDelete|Function, 1, &DOMDocumentProtoTableEntries[33] },
+   { "elementFromPoint", DOMDocument::ElementFromPoint, DontDelete|Function, 1, &DOMDocumentProtoTableEntries[31] },
    { "createCDATASection", DOMDocument::CreateCDATASection, DontDelete|Function, 1, &DOMDocumentProtoTableEntries[30] },
    { 0, 0, 0, 0, 0 },
    { "execCommand", DOMDocument::ExecCommand, DontDelete|Function, 3, 0 },
@@ -174,6 +174,7 @@ const struct HashEntry DOMDocumentProtoTableEntries[] = {
    { "getOverrideStyle", DOMDocument::GetOverrideStyle, DontDelete|Function, 2, 0 },
    { "createComment", DOMDocument::CreateComment, DontDelete|Function, 1, 0 },
    { "getElementsByTagNameNS", DOMDocument::GetElementsByTagNameNS, DontDelete|Function, 2, 0 },
+   { "createRange", DOMDocument::CreateRange, DontDelete|Function, 0, 0 },
    { "createNodeIterator", DOMDocument::CreateNodeIterator, DontDelete|Function, 3, 0 },
    { "createTreeWalker", DOMDocument::CreateTreeWalker, DontDelete|Function, 4, 0 },
    { "queryCommandState", DOMDocument::QueryCommandState, DontDelete|Function, 1, 0 },
@@ -181,7 +182,7 @@ const struct HashEntry DOMDocumentProtoTableEntries[] = {
    { "queryCommandValue", DOMDocument::QueryCommandValue, DontDelete|Function, 1, 0 }
 };
 
-const struct HashTable DOMDocumentProtoTable = { 2, 36, DOMDocumentProtoTableEntries, 29 };
+const struct HashTable DOMDocumentProtoTable = { 2, 37, DOMDocumentProtoTableEntries, 29 };
 
 } // namespace
 
index 792f609e5a81c0e7d5b3cc951dac96579c71aa6a..a938591e1fde5a279336fabd28f10e0ac17afa02 100644 (file)
@@ -631,6 +631,20 @@ ElementImpl *DocumentImpl::getElementById( const DOMString &elementId ) const
     return m_elementsById.find(elementId.string());
 }
 
+ElementImpl *DocumentImpl::elementFromPoint( const int _x, const int _y ) const
+{
+    if (!m_render) return 0;
+    
+    RenderObject::NodeInfo nodeInfo(true, true);
+    m_render->layer()->hitTest(nodeInfo, _x, _y); 
+    NodeImpl* n = nodeInfo.innerNode();
+
+    while ( n && !n->isElementNode() ) {
+        n = n->parentNode();
+    }
+    
+    return static_cast<ElementImpl*>(n);
+}
 
 void DocumentImpl::addElementById(const DOMString &elementId, ElementImpl *element)
 {
index 67173c71a99d36c08a8423466068af8ab9ff1094..33f9887c9a080f30f9e6ea07ca7f6bdf861bcd85 100644 (file)
@@ -197,6 +197,7 @@ public:
     NodeImpl *importNode( NodeImpl *importedNode, bool deep, int &exceptioncode );
     virtual ElementImpl *createElementNS ( const DOMString &_namespaceURI, const DOMString &_qualifiedName, int &exceptioncode );
     ElementImpl *getElementById ( const DOMString &elementId ) const;
+    ElementImpl *elementFromPoint ( const int _x, const int _y ) const;
 
     // Actually part of HTMLDocument, but used for giving XML documents a window title as well
     DOMString title() const { return m_title; }