OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> | 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> |
3 * 1999 Lars Knoll <knoll@kde.org> | 3 * 1999 Lars Knoll <knoll@kde.org> |
4 * 1999 Antti Koivisto <koivisto@kde.org> | 4 * 1999 Antti Koivisto <koivisto@kde.org> |
5 * 2000 Simon Hausmann <hausmann@kde.org> | 5 * 2000 Simon Hausmann <hausmann@kde.org> |
6 * 2000 Stefan Schimanski <1Stein@gmx.de> | 6 * 2000 Stefan Schimanski <1Stein@gmx.de> |
7 * 2001 George Staikos <staikos@kde.org> | 7 * 2001 George Staikos <staikos@kde.org> |
8 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. | 8 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. |
9 * Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com> | 9 * Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com> |
10 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 10 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
(...skipping 1029 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1040 for (const Frame* frame = this; frame; frame = frame->tree()->traverseNext()
) { | 1040 for (const Frame* frame = this; frame; frame = frame->tree()->traverseNext()
) { |
1041 if (frame->document()) | 1041 if (frame->document()) |
1042 count += frame->document()->touchEventHandlerCount(); | 1042 count += frame->document()->touchEventHandlerCount(); |
1043 } | 1043 } |
1044 | 1044 |
1045 m_page->chrome()->client()->numTouchEventHandlersChanged(count); | 1045 m_page->chrome()->client()->numTouchEventHandlersChanged(count); |
1046 } | 1046 } |
1047 | 1047 |
1048 #if !PLATFORM(MAC) && !PLATFORM(WIN) | 1048 #if !PLATFORM(MAC) && !PLATFORM(WIN) |
1049 struct ScopedFramePaintingState { | 1049 struct ScopedFramePaintingState { |
1050 ScopedFramePaintingState(Frame* theFrame, RenderObject* theRenderer) | 1050 ScopedFramePaintingState(Frame* frame, Node* node) |
1051 : frame(theFrame) | 1051 : frame(frame) |
1052 , renderer(theRenderer) | 1052 , node(node) |
1053 , paintBehavior(frame->view()->paintBehavior()) | 1053 , paintBehavior(frame->view()->paintBehavior()) |
1054 , backgroundColor(frame->view()->baseBackgroundColor()) | 1054 , backgroundColor(frame->view()->baseBackgroundColor()) |
1055 { | 1055 { |
| 1056 ASSERT(!node || node->renderer()); |
| 1057 if (node) |
| 1058 node->renderer()->updateDragState(true); |
1056 } | 1059 } |
1057 | 1060 |
1058 ~ScopedFramePaintingState() | 1061 ~ScopedFramePaintingState() |
1059 { | 1062 { |
1060 if (renderer) | 1063 if (node && node->renderer()) |
1061 renderer->updateDragState(false); | 1064 node->renderer()->updateDragState(false); |
1062 frame->view()->setPaintBehavior(paintBehavior); | 1065 frame->view()->setPaintBehavior(paintBehavior); |
1063 frame->view()->setBaseBackgroundColor(backgroundColor); | 1066 frame->view()->setBaseBackgroundColor(backgroundColor); |
1064 frame->view()->setNodeToDraw(0); | 1067 frame->view()->setNodeToDraw(0); |
1065 } | 1068 } |
1066 | 1069 |
1067 Frame* frame; | 1070 Frame* frame; |
1068 RenderObject* renderer; | 1071 Node* node; |
1069 PaintBehavior paintBehavior; | 1072 PaintBehavior paintBehavior; |
1070 Color backgroundColor; | 1073 Color backgroundColor; |
1071 }; | 1074 }; |
1072 | 1075 |
1073 DragImageRef Frame::nodeImage(Node* node) | 1076 DragImageRef Frame::nodeImage(Node* node) |
1074 { | 1077 { |
1075 RenderObject* renderer = node->renderer(); | 1078 if (!node->renderer()) |
1076 if (!renderer) | |
1077 return 0; | 1079 return 0; |
1078 | 1080 |
1079 const ScopedFramePaintingState state(this, renderer); | 1081 const ScopedFramePaintingState state(this, node); |
1080 | 1082 |
1081 renderer->updateDragState(true); | |
1082 m_view->setPaintBehavior(state.paintBehavior | PaintBehaviorFlattenCompositi
ngLayers); | 1083 m_view->setPaintBehavior(state.paintBehavior | PaintBehaviorFlattenCompositi
ngLayers); |
1083 | 1084 |
1084 // When generating the drag image for an element, ignore the document backgr
ound. | 1085 // When generating the drag image for an element, ignore the document backgr
ound. |
1085 m_view->setBaseBackgroundColor(colorWithOverrideAlpha(Color::white, 1.0)); | 1086 m_view->setBaseBackgroundColor(colorWithOverrideAlpha(Color::white, 1.0)); |
1086 m_doc->updateLayout(); | 1087 m_doc->updateLayout(); |
1087 m_view->setNodeToDraw(node); // Enable special sub-tree drawing mode. | 1088 m_view->setNodeToDraw(node); // Enable special sub-tree drawing mode. |
1088 | 1089 |
| 1090 // Document::updateLayout may have blown away the original RenderObject. |
| 1091 RenderObject* renderer = node->renderer(); |
| 1092 if (!renderer) |
| 1093 return 0; |
| 1094 |
1089 LayoutRect topLevelRect; | 1095 LayoutRect topLevelRect; |
1090 IntRect paintingRect = pixelSnappedIntRect(renderer->paintingRootRect(topLev
elRect)); | 1096 IntRect paintingRect = pixelSnappedIntRect(renderer->paintingRootRect(topLev
elRect)); |
1091 | 1097 |
1092 OwnPtr<ImageBuffer> buffer(ImageBuffer::create(paintingRect.size(), 1, Color
SpaceDeviceRGB)); | 1098 OwnPtr<ImageBuffer> buffer(ImageBuffer::create(paintingRect.size(), 1, Color
SpaceDeviceRGB)); |
1093 if (!buffer) | 1099 if (!buffer) |
1094 return 0; | 1100 return 0; |
1095 buffer->context()->translate(-paintingRect.x(), -paintingRect.y()); | 1101 buffer->context()->translate(-paintingRect.x(), -paintingRect.y()); |
1096 buffer->context()->clip(FloatRect(0, 0, paintingRect.maxX(), paintingRect.ma
xY())); | 1102 buffer->context()->clip(FloatRect(0, 0, paintingRect.maxX(), paintingRect.ma
xY())); |
1097 | 1103 |
1098 m_view->paintContents(buffer->context(), paintingRect); | 1104 m_view->paintContents(buffer->context(), paintingRect); |
(...skipping 21 matching lines...) Expand all Loading... |
1120 | 1126 |
1121 m_view->paintContents(buffer->context(), paintingRect); | 1127 m_view->paintContents(buffer->context(), paintingRect); |
1122 | 1128 |
1123 RefPtr<Image> image = buffer->copyImage(); | 1129 RefPtr<Image> image = buffer->copyImage(); |
1124 return createDragImageFromImage(image.get()); | 1130 return createDragImageFromImage(image.get()); |
1125 } | 1131 } |
1126 | 1132 |
1127 #endif | 1133 #endif |
1128 | 1134 |
1129 } // namespace WebCore | 1135 } // namespace WebCore |
OLD | NEW |