Reviewed by Darin.
authoradele <adele@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 25 Oct 2004 18:26:01 +0000 (18:26 +0000)
committeradele <adele@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 25 Oct 2004 18:26:01 +0000 (18:26 +0000)
        Fix for <rdar://problem/3619890> Feature request: designMode

        This change implements the designMode property of a document.  This is an IE property that is also supported by Mozilla.
        This will enable more JS editing compatibility.

        * khtml/ecma/kjs_html.cpp:
        (KJS::HTMLDocument::tryGet): added case for designMode
        (KJS::HTMLDocument::putValue): added case for designMode
        * khtml/ecma/kjs_html.lut.h: (KJS::): regenerated
        * khtml/khtml_part.cpp: (KHTMLPart::isContentEditable): Now returns designMode value
        * khtml/xml/dom_docimpl.cpp:
        (DocumentImpl::DocumentImpl): initialize m_designMode member variable
        (DocumentImpl::setDesignMode): added function to assign m_designMode value
        (DocumentImpl::getDesignMode): return m_designMode value
        (DocumentImpl::inDesignMode): if designMode is inherited, this will find the appropriate parent document designMode and return that value.
            Otherwise, it will just return the m_designMode value.
        (DocumentImpl::parentDocument):
        * khtml/xml/dom_docimpl.h: (DOM::DocumentImpl::): added InheritedBool enum, prototypes, and m_designMode member variable.
        * kwq/KWQKHTMLPart.mm: (KWQKHTMLPart::isContentEditable): added check for isContentEditable function in KHTMLPart

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/ecma/kjs_html.cpp
WebCore/khtml/ecma/kjs_html.lut.h
WebCore/khtml/khtml_part.cpp
WebCore/khtml/xml/dom_docimpl.cpp
WebCore/khtml/xml/dom_docimpl.h
WebCore/kwq/KWQKHTMLPart.mm

index c96aa015ba75f065bc0abad286cf0372ad293b78..1298aad380e4128b6fb3f6c54dc1e03d83d30732 100644 (file)
@@ -1,3 +1,27 @@
+2004-10-25  Adele Amchan  <adele@apple.com>
+
+        Reviewed by Darin.
+        Fix for <rdar://problem/3619890> Feature request: designMode        
+
+        This change implements the designMode property of a document.  This is an IE property that is also supported by Mozilla.  
+        This will enable more JS editing compatibility.
+
+        * khtml/ecma/kjs_html.cpp:
+        (KJS::HTMLDocument::tryGet): added case for designMode
+        (KJS::HTMLDocument::putValue): added case for designMode
+        * khtml/ecma/kjs_html.lut.h: (KJS::): regenerated
+        * khtml/khtml_part.cpp: (KHTMLPart::isContentEditable): Now returns designMode value
+        * khtml/xml/dom_docimpl.cpp:
+        (DocumentImpl::DocumentImpl): initialize m_designMode member variable
+        (DocumentImpl::setDesignMode): added function to assign m_designMode value
+        (DocumentImpl::getDesignMode): return m_designMode value
+        (DocumentImpl::inDesignMode): if designMode is inherited, this will find the appropriate parent document designMode and return that value. 
+            Otherwise, it will just return the m_designMode value.
+        (DocumentImpl::parentDocument):
+        * khtml/xml/dom_docimpl.h: (DOM::DocumentImpl::): added InheritedBool enum, prototypes, and m_designMode member variable.
+        * kwq/KWQKHTMLPart.mm: (KWQKHTMLPart::isContentEditable): added check for isContentEditable function in KHTMLPart
+
 2004-10-22  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Hyatt
index 6945c72aa748fd84ec1bedb7f946904dd5dcc7bd..62fb269ba0eac40e3fa485f003d737b840df543e 100644 (file)
@@ -65,6 +65,8 @@
 
 using namespace KJS;
 
+using DOM::DocumentImpl;
+using DOM::DOMString;
 using DOM::HTMLFrameElementImpl;
 using DOM::HTMLIFrameElementImpl;
 
@@ -174,6 +176,7 @@ const ClassInfo KJS::HTMLDocument::info =
   height               HTMLDocument::Height            DontDelete|ReadOnly
   width                        HTMLDocument::Width             DontDelete|ReadOnly
   dir                  HTMLDocument::Dir               DontDelete
+  designMode            HTMLDocument::DesignMode        DontDelete
 #potentially obsolete array properties
 # layers
 # plugins
@@ -291,6 +294,13 @@ Value KJS::HTMLDocument::tryGet(ExecState *exec, const Identifier &propertyName)
       return Number(view ? view->contentsWidth() : 0);
     case Dir:
       return String(body.dir());
+    case DesignMode:
+    {
+      DocumentImpl *docimpl = static_cast<DocumentImpl *>(doc.handle());
+      if (!docimpl)
+        return Undefined();
+      return String(docimpl->inDesignMode() ? "on" : "off");  
+    }
     }
   }
 
@@ -448,6 +458,22 @@ void KJS::HTMLDocument::putValue(ExecState *exec, int token, const Value& value,
   case Dir:
     body.setDir(value.toString(exec).string());
     break;
+  case DesignMode:
+    {
+      DocumentImpl *docimpl = static_cast<DocumentImpl *>(doc.handle());
+      if (!docimpl)
+        break;
+      DOMString modeString = value.toString(exec).string();
+      DocumentImpl::InheritedBool mode;
+      if (!strcasecmp(modeString, "on"))
+        mode = DocumentImpl::on;
+      else if (!strcasecmp(modeString, "off"))
+        mode = DocumentImpl::off;
+      else
+        mode = DocumentImpl::inherit;
+      docimpl->setDesignMode(mode);
+     }
+    break;
   default:
     kdWarning() << "HTMLDocument::putValue unhandled token " << token << endl;
   }
index 2694ec1cdd0ee4c3292c276913cd35a8eb6700ff..dce45662dc129d18ed958af7833be3febf9d4e8d 100644 (file)
@@ -41,11 +41,12 @@ const struct HashEntry HTMLDocumentTableEntries[] = {
    { "fgColor", HTMLDocument::FgColor, DontDelete, 0, 0 },
    { "linkColor", HTMLDocument::LinkColor, DontDelete, 0, 0 },
    { "vlinkColor", HTMLDocument::VlinkColor, DontDelete, 0, 0 },
-   { "height", HTMLDocument::Height, DontDelete|ReadOnly, 0, 0 },
-   { "width", HTMLDocument::Width, DontDelete|ReadOnly, 0, 0 }
+   { "height", HTMLDocument::Height, DontDelete|ReadOnly, 0, &HTMLDocumentTableEntries[40] },
+   { "width", HTMLDocument::Width, DontDelete|ReadOnly, 0, 0 },
+   { "designMode", HTMLDocument::DesignMode, DontDelete, 0, 0 }
 };
 
-const struct HashTable HTMLDocumentTable = { 2, 40, HTMLDocumentTableEntries, 30 };
+const struct HashTable HTMLDocumentTable = { 2, 41, HTMLDocumentTableEntries, 30 };
 
 } // namespace
 
index 439e626aa51aba0566c4b9229d8e20399f3725be..fd70a44e9140cfd55f467ca504ad117b75322b52 100644 (file)
@@ -4964,7 +4964,9 @@ bool KHTMLPart::shouldEndEditing(const Range &range) const
 
 bool KHTMLPart::isContentEditable() const 
 {
-    return false;
+    if (!d->m_doc)
+        return false;
+    return d->m_doc->inDesignMode();
 }
 
 EditCommandPtr KHTMLPart::lastEditCommand()
index 1c0ad21f5832ec1c3709a808cd2af1b6965f787f..220960630c82e9e119b552bea84016c304c3ca48 100644 (file)
@@ -267,9 +267,13 @@ DocumentImpl::DocumentImpl(DOMImplementationImpl *_implementation, KHTMLView *v)
 #endif
 #if APPLE_CHANGES
     , m_finishedParsing(this, SIGNAL(finishedParsing()))
-    , m_inPageCache(false), m_savedRenderer(0)
-    , m_passwordFields(0), m_secureForms(0)
-    , m_decoder(0), m_createRenderers(true)
+    , m_inPageCache(false)
+    , m_savedRenderer(0)
+    , m_passwordFields(0)
+    , m_secureForms(0)
+    , m_decoder(0)
+    , m_createRenderers(true)
+    , m_designMode(inherit)
     , m_hasDashboardRegions(false)
     , m_dashboardRegionsDirty(false)
 #endif
@@ -3142,6 +3146,36 @@ void DocumentImpl::setTransformSourceDocument(DocumentImpl* doc)
         doc->ref();
 }
 
+void DocumentImpl::setDesignMode(InheritedBool value)
+{
+    m_designMode = value;
+}
+
+DocumentImpl::InheritedBool DocumentImpl::getDesignMode() const
+{
+    return m_designMode;
+}
+
+bool DocumentImpl::inDesignMode()
+{
+    for (DocumentImpl* d = this; d; d = d->parentDocument()) {
+        if (d->m_designMode != inherit)
+            return d->m_designMode;      
+    }
+    return false;
+}
+
+DocumentImpl *DocumentImpl::parentDocument() const
+{
+    KHTMLPart *childPart = part();
+    if (!childPart)
+        return 0;
+    KHTMLPart *parent = childPart->parentPart();
+    if (!parent)
+        return 0;
+    return parent->xmlDocImpl();
+}
+
 #endif
 
 // ----------------------------------------------------------------------------
index 7103d96dd8f70630550b26c572b9870ce19dbc9b..c721eb0a0f14917c05a942ab9c0e6d21248076cf 100644 (file)
@@ -556,6 +556,20 @@ public:
     void removeAllMarkers();
     void shiftMarkers(NodeImpl *node, ulong startOffset, long delta);
     QValueList<DocumentMarker> markersForNode(NodeImpl *node);
+    
+   /**
+    * designMode support
+   */
+    enum InheritedBool {
+        off=false,
+        on=true,
+        inherit
+    };
+    
+    void setDesignMode(InheritedBool value);
+    InheritedBool getDesignMode() const;
+    bool inDesignMode();
+    DocumentImpl *parentDocument() const;
 
 #ifdef KHTML_XSLT
     void applyXSLTransform(ProcessingInstructionImpl* pi);
@@ -737,6 +751,8 @@ private:
  
     bool m_createRenderers;
     
+    InheritedBool m_designMode;
+    
     QValueList<khtml::DashboardRegionValue> m_dashboardRegions;
     bool m_hasDashboardRegions;
     bool m_dashboardRegionsDirty;
index e8a0209121abff535a51ae275e407b8589f056e3..9ec7ca550b58d40dc2f643e854375a59f6c07824 100644 (file)
@@ -4074,7 +4074,7 @@ void KWQKHTMLPart::respondToChangedContents()
 
 bool KWQKHTMLPart::isContentEditable() const
 {
-    return [_bridge isEditable];
+    return KHTMLPart::isContentEditable() || [_bridge isEditable];
 }
 
 bool KWQKHTMLPart::shouldBeginEditing(const Range &range) const