Merge "Fix badcast in event::isGestureEvent" into klp-dev
diff --git a/Source/core/dom/ContainerNode.cpp b/Source/core/dom/ContainerNode.cpp
index 8b33eca..5d409c5 100644
--- a/Source/core/dom/ContainerNode.cpp
+++ b/Source/core/dom/ContainerNode.cpp
@@ -431,8 +431,6 @@
NodeVector children;
getChildNodes(container, children);
- container->document()->nodeChildrenWillBeRemoved(container);
-
ChildListMutationScope mutation(container);
for (NodeVector::const_iterator it = children.begin(); it != children.end(); it++) {
Node* child = it->get();
@@ -575,6 +573,8 @@
document()->removeFocusedElementOfSubtree(this, true);
}
+ document()->nodeChildrenWillBeRemoved(this);
+
NodeVector removedChildren;
{
WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates;
diff --git a/Source/core/dom/Range.cpp b/Source/core/dom/Range.cpp
index 8d1ad9d..64034db 100644
--- a/Source/core/dom/Range.cpp
+++ b/Source/core/dom/Range.cpp
@@ -1034,9 +1034,15 @@
if (collapsed)
m_end.setToBeforeChild(newText.get());
} else {
- RefPtr<Node> lastChild;
- if (collapsed)
- lastChild = (newNodeType == Node::DOCUMENT_FRAGMENT_NODE) ? newNode->lastChild() : newNode;
+ RefPtr<Node> lastChild = (newNodeType == Node::DOCUMENT_FRAGMENT_NODE) ? newNode->lastChild() : newNode;
+ if (lastChild && lastChild == m_start.childBefore()) {
+ // The insertion will do nothing, but we need to extend the range to include
+ // the inserted nodes.
+ Node* firstChild = (newNodeType == Node::DOCUMENT_FRAGMENT_NODE) ? newNode->firstChild() : newNode.get();
+ ASSERT(firstChild);
+ m_start.setToBeforeChild(firstChild);
+ return;
+ }
int startOffset = m_start.offset();
container = m_start.container();
diff --git a/Source/core/svg/properties/SVGPropertyTearOff.h b/Source/core/svg/properties/SVGPropertyTearOff.h
index 0d3b45c..a78bdea 100644
--- a/Source/core/svg/properties/SVGPropertyTearOff.h
+++ b/Source/core/svg/properties/SVGPropertyTearOff.h
@@ -56,8 +56,10 @@
void setValue(PropertyType& value)
{
- if (m_valueIsCopy)
+ if (m_valueIsCopy) {
+ detachChildren();
delete m_value;
+ }
m_valueIsCopy = false;
m_value = &value;
}
diff --git a/Source/web/WebPluginContainerImpl.cpp b/Source/web/WebPluginContainerImpl.cpp
index e242410..beaf7dd 100644
--- a/Source/web/WebPluginContainerImpl.cpp
+++ b/Source/web/WebPluginContainerImpl.cpp
@@ -192,7 +192,7 @@
handleWheelEvent(static_cast<WheelEvent*>(event));
else if (event->isKeyboardEvent())
handleKeyboardEvent(toKeyboardEvent(event));
- else if (eventNames().isTouchEventType(event->type()))
+ else if (event->isTouchEvent())
handleTouchEvent(static_cast<TouchEvent*>(event));
else if (event->isGestureEvent())
handleGestureEvent(toGestureEvent(event));
diff --git a/Source/wtf/PartitionAlloc.h b/Source/wtf/PartitionAlloc.h
index a66ba61..9847430 100644
--- a/Source/wtf/PartitionAlloc.h
+++ b/Source/wtf/PartitionAlloc.h
@@ -80,6 +80,7 @@
// - No specific protection against corruption of page header metadata.
#include "wtf/Assertions.h"
+#include "wtf/CPU.h"
#include "wtf/FastMalloc.h"
#include "wtf/SpinLock.h"
@@ -87,8 +88,17 @@
namespace WTF {
-// Allocation granularity of sizeof(void*) bytes.
-static const size_t kAllocationGranularity = sizeof(void*);
+#if CPU(MIPS)
+ // Allocation granularity of sizeof(double) bytes.
+ typedef double align_t;
+ #define WTF_ALIGN(n) __attribute__((__aligned__(n)))
+#else
+ // Allocation granularity of sizeof(void*) bytes.
+ typedef void * align_t;
+ #define WTF_ALIGN(n)
+#endif
+
+static const size_t kAllocationGranularity = sizeof(align_t);
static const size_t kAllocationGranularityMask = kAllocationGranularity - 1;
static const size_t kBucketShift = (kAllocationGranularity == 8) ? 3 : 2;
// Supports allocations up to 4088 (one bucket is used for metadata).
@@ -121,19 +131,19 @@
PartitionFreelistEntry* freelistHead;
PartitionPageHeader* next;
PartitionPageHeader* prev;
-};
+} WTF_ALIGN(sizeof(align_t));
struct PartitionFreepagelistEntry {
PartitionPageHeader* page;
PartitionFreepagelistEntry* next;
-};
+} WTF_ALIGN(sizeof(align_t));
struct PartitionBucket {
PartitionRoot* root;
PartitionPageHeader* currPage;
PartitionFreepagelistEntry* freePages;
size_t numFullPages;
-};
+} WTF_ALIGN(sizeof(align_t));
struct PartitionRoot {
int lock;
@@ -189,11 +199,19 @@
return partitionAllocSlowPath(bucket);
}
+ALWAYS_INLINE size_t partitionAllocRoundup(size_t size)
+{
+ return (size + kAllocationGranularityMask) & ~kAllocationGranularityMask;
+}
+
ALWAYS_INLINE void* partitionAlloc(PartitionRoot* root, size_t size)
{
#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
return malloc(size);
#else
+#if CPU(MIPS)
+ size = partitionAllocRoundup(size);
+#endif
size_t index = size >> kBucketShift;
ASSERT(index < kNumBuckets);
ASSERT(size == index << kBucketShift);
@@ -234,18 +252,13 @@
#endif
}
-ALWAYS_INLINE size_t partitionAllocRoundup(size_t size)
-{
- return (size + kAllocationGranularityMask) & ~kAllocationGranularityMask;
-}
-
ALWAYS_INLINE void* partitionAllocGeneric(PartitionRoot* root, size_t size)
{
#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
return malloc(size);
#else
+ size = partitionAllocRoundup(size);
if (LIKELY(size <= kMaxAllocation)) {
- size = partitionAllocRoundup(size);
spinLockLock(&root->lock);
void* ret = partitionAlloc(root, size);
spinLockUnlock(&root->lock);