<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[24810] trunk/WebCore</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/24810">24810</a></dd>
<dt>Author</dt> <dd>thatcher</dd>
<dt>Date</dt> <dd>2007-08-01 17:35:29 -0700 (Wed, 01 Aug 2007)</dd>
</dl>
<h3>Log Message</h3>
<pre> Reviewed by Justin.
<rdar://problem/5376156> Mail crash in DeleteButtonController::hide() when dropping selected image on DIV's border
Add the container element back so the selection can not touch the deletion UI nodes. The container
has style to prevent user selection, user drag and user modification.
* editing/DeleteButtonController.cpp:
(WebCore::DeleteButtonController::show): Make the container node, and append the button and outline elements.
(WebCore::DeleteButtonController::hide): Remove the container elements and null out the other nodes.
* editing/DeleteButtonController.h:</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkWebCoreChangeLog">trunk/WebCore/ChangeLog</a></li>
<li><a href="#trunkWebCoreeditingDeleteButtonControllercpp">trunk/WebCore/editing/DeleteButtonController.cpp</a></li>
<li><a href="#trunkWebCoreeditingDeleteButtonControllerh">trunk/WebCore/editing/DeleteButtonController.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/ChangeLog (24809 => 24810)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/ChangeLog        2007-08-02 00:30:08 UTC (rev 24809)
+++ trunk/WebCore/ChangeLog        2007-08-02 00:35:29 UTC (rev 24810)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2007-08-01 Timothy Hatcher <timothy@apple.com>
+
+ Reviewed by Justin.
+
+ <rdar://problem/5376156> Mail crash in DeleteButtonController::hide() when dropping selected image on DIV's border
+
+ Add the container element back so the selection can not touch the deletion UI nodes. The container
+ has style to prevent user selection, user drag and user modification.
+
+ * editing/DeleteButtonController.cpp:
+ (WebCore::DeleteButtonController::show): Make the container node, and append the button and outline elements.
+ (WebCore::DeleteButtonController::hide): Remove the container elements and null out the other nodes.
+ * editing/DeleteButtonController.h:
+
</ins><span class="cx"> 2007-08-01 Steve Falkenburg <sfalken@apple.com>
</span><span class="cx">
</span><span class="cx"> Build mod: Fix sln to match configs in vcproj.
</span></span></pre></div>
<a id="trunkWebCoreeditingDeleteButtonControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/editing/DeleteButtonController.cpp (24809 => 24810)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/editing/DeleteButtonController.cpp        2007-08-02 00:30:08 UTC (rev 24809)
+++ trunk/WebCore/editing/DeleteButtonController.cpp        2007-08-02 00:35:29 UTC (rev 24810)
</span><span class="lines">@@ -161,13 +161,29 @@
</span><span class="cx">
</span><span class="cx"> m_target = element;
</span><span class="cx">
</span><ins>+ m_containerElement = new HTMLDivElement(m_target->document());
+ m_containerElement->setId(containerElementIdentifier);
+
+ CSSMutableStyleDeclaration* style = m_containerElement->getInlineStyleDecl();
+ style->setProperty(CSS_PROP__WEBKIT_USER_DRAG, CSS_VAL_NONE);
+ style->setProperty(CSS_PROP__WEBKIT_USER_SELECT, CSS_VAL_NONE);
+ style->setProperty(CSS_PROP__WEBKIT_USER_MODIFY, CSS_VAL_NONE);
+
+ ExceptionCode ec = 0;
+ m_target->appendChild(m_containerElement.get(), ec);
+ ASSERT(ec == 0);
+ if (ec) {
+ hide();
+ return;
+ }
+
</ins><span class="cx"> m_outlineElement = new HTMLDivElement(m_target->document());
</span><span class="cx"> m_outlineElement->setId(outlineElementIdentifier);
</span><span class="cx">
</span><span class="cx"> const int borderWidth = 4;
</span><span class="cx"> const int borderRadius = 6;
</span><span class="cx">
</span><del>- CSSMutableStyleDeclaration* style = m_outlineElement->getInlineStyleDecl();
</del><ins>+ style = m_outlineElement->getInlineStyleDecl();
</ins><span class="cx"> style->setProperty(CSS_PROP_POSITION, CSS_VAL_ABSOLUTE);
</span><span class="cx"> style->setProperty(CSS_PROP_CURSOR, CSS_VAL_DEFAULT);
</span><span class="cx"> style->setProperty(CSS_PROP__WEBKIT_USER_DRAG, CSS_VAL_NONE);
</span><span class="lines">@@ -181,8 +197,7 @@
</span><span class="cx"> style->setProperty(CSS_PROP_BORDER, String::number(borderWidth) + "px solid rgba(0, 0, 0, 0.6)");
</span><span class="cx"> style->setProperty(CSS_PROP__WEBKIT_BORDER_RADIUS, String::number(borderRadius) + "px");
</span><span class="cx">
</span><del>- ExceptionCode ec = 0;
- m_target->appendChild(m_outlineElement.get(), ec);
</del><ins>+ m_containerElement->appendChild(m_outlineElement.get(), ec);
</ins><span class="cx"> ASSERT(ec == 0);
</span><span class="cx"> if (ec) {
</span><span class="cx"> hide();
</span><span class="lines">@@ -210,7 +225,7 @@
</span><span class="cx">
</span><span class="cx"> m_buttonElement->setCachedImage(new CachedImage(Image::loadPlatformResource("deleteButton")));
</span><span class="cx">
</span><del>- m_target->appendChild(m_buttonElement.get(), ec);
</del><ins>+ m_containerElement->appendChild(m_buttonElement.get(), ec);
</ins><span class="cx"> ASSERT(ec == 0);
</span><span class="cx"> if (ec) {
</span><span class="cx"> hide();
</span><span class="lines">@@ -232,24 +247,24 @@
</span><span class="cx">
</span><span class="cx"> void DeleteButtonController::hide()
</span><span class="cx"> {
</span><ins>+ m_outlineElement = 0;
+ m_buttonElement = 0;
+
</ins><span class="cx"> ExceptionCode ec = 0;
</span><del>- if (m_outlineElement)
- m_outlineElement->parentNode()->removeChild(m_outlineElement.get(), ec);
</del><ins>+ if (m_containerElement && m_containerElement->parentNode())
+ m_containerElement->parentNode()->removeChild(m_containerElement.get(), ec);
+ m_containerElement = 0;
</ins><span class="cx">
</span><del>- if (m_buttonElement)
- m_buttonElement->parentNode()->removeChild(m_buttonElement.get(), ec);
</del><ins>+ if (m_target) {
+ if (m_wasStaticPositioned)
+ m_target->getInlineStyleDecl()->setProperty(CSS_PROP_POSITION, CSS_VAL_STATIC);
+ if (m_wasAutoZIndex)
+ m_target->getInlineStyleDecl()->setProperty(CSS_PROP_Z_INDEX, CSS_VAL_AUTO);
+ }
</ins><span class="cx">
</span><del>- if (m_target && m_wasStaticPositioned)
- m_target->getInlineStyleDecl()->setProperty(CSS_PROP_POSITION, CSS_VAL_STATIC);
-
- if (m_target && m_wasAutoZIndex)
- m_target->getInlineStyleDecl()->setProperty(CSS_PROP_Z_INDEX, CSS_VAL_AUTO);
-
</del><span class="cx"> m_wasStaticPositioned = false;
</span><span class="cx"> m_wasAutoZIndex = false;
</span><span class="cx"> m_target = 0;
</span><del>- m_outlineElement = 0;
- m_buttonElement = 0;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void DeleteButtonController::enable()
</span></span></pre></div>
<a id="trunkWebCoreeditingDeleteButtonControllerh"></a>
<div class="modfile"><h4>Modified: trunk/WebCore/editing/DeleteButtonController.h (24809 => 24810)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebCore/editing/DeleteButtonController.h        2007-08-02 00:30:08 UTC (rev 24809)
+++ trunk/WebCore/editing/DeleteButtonController.h        2007-08-02 00:35:29 UTC (rev 24810)
</span><span class="lines">@@ -60,6 +60,7 @@
</span><span class="cx"> private:
</span><span class="cx"> Frame* m_frame;
</span><span class="cx"> RefPtr<HTMLElement> m_target;
</span><ins>+ RefPtr<HTMLElement> m_containerElement;
</ins><span class="cx"> RefPtr<HTMLElement> m_outlineElement;
</span><span class="cx"> RefPtr<DeleteButton> m_buttonElement;
</span><span class="cx"> bool m_wasStaticPositioned;
</span></span></pre>
</div>
</div>
</body>
</html>