| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2008, 2009, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2004, 2008, 2009, 2010 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 #include "core/layout/api/LayoutViewItem.h" | 36 #include "core/layout/api/LayoutViewItem.h" |
| 37 #include "core/page/Page.h" | 37 #include "core/page/Page.h" |
| 38 #include "core/paint/PaintLayer.h" | 38 #include "core/paint/PaintLayer.h" |
| 39 #include "public/platform/WebTraceLocation.h" | 39 #include "public/platform/WebTraceLocation.h" |
| 40 | 40 |
| 41 namespace blink { | 41 namespace blink { |
| 42 | 42 |
| 43 FrameCaret::FrameCaret(LocalFrame* frame, const SelectionEditor& selectionEditor
) | 43 FrameCaret::FrameCaret(LocalFrame* frame, const SelectionEditor& selectionEditor
) |
| 44 : m_selectionEditor(&selectionEditor) | 44 : m_selectionEditor(&selectionEditor) |
| 45 , m_frame(frame) | 45 , m_frame(frame) |
| 46 , m_caretVisibility(CaretVisibility::Hidden) |
| 46 , m_previousCaretVisibility(CaretVisibility::Hidden) | 47 , m_previousCaretVisibility(CaretVisibility::Hidden) |
| 47 , m_caretBlinkTimer(this, &FrameCaret::caretBlinkTimerFired) | 48 , m_caretBlinkTimer(this, &FrameCaret::caretBlinkTimerFired) |
| 48 , m_caretRectDirty(true) | 49 , m_caretRectDirty(true) |
| 49 , m_shouldPaintCaret(true) | 50 , m_shouldPaintCaret(true) |
| 50 , m_isCaretBlinkingSuspended(false) | 51 , m_isCaretBlinkingSuspended(false) |
| 51 , m_shouldShowBlockCursor(false) | 52 , m_shouldShowBlockCursor(false) |
| 52 { | 53 { |
| 53 DCHECK(frame); | 54 DCHECK(frame); |
| 54 } | 55 } |
| 55 | 56 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 | 113 |
| 113 if (double blinkInterval = LayoutTheme::theme().caretBlinkInterval()) | 114 if (double blinkInterval = LayoutTheme::theme().caretBlinkInterval()) |
| 114 m_caretBlinkTimer.startRepeating(blinkInterval, BLINK_FROM_HERE); | 115 m_caretBlinkTimer.startRepeating(blinkInterval, BLINK_FROM_HERE); |
| 115 | 116 |
| 116 m_shouldPaintCaret = true; | 117 m_shouldPaintCaret = true; |
| 117 setCaretRectNeedsUpdate(); | 118 setCaretRectNeedsUpdate(); |
| 118 } | 119 } |
| 119 | 120 |
| 120 void FrameCaret::setCaretVisibility(CaretVisibility visibility) | 121 void FrameCaret::setCaretVisibility(CaretVisibility visibility) |
| 121 { | 122 { |
| 122 if (getCaretVisibility() == visibility) | 123 if (m_caretVisibility == visibility) |
| 123 return; | 124 return; |
| 124 | 125 |
| 125 CaretBase::setCaretVisibility(visibility); | 126 m_caretVisibility = visibility; |
| 126 | 127 |
| 127 updateAppearance(); | 128 updateAppearance(); |
| 128 } | 129 } |
| 129 | 130 |
| 130 void FrameCaret::setCaretRectNeedsUpdate() | 131 void FrameCaret::setCaretRectNeedsUpdate() |
| 131 { | 132 { |
| 132 if (m_caretRectDirty) | 133 if (m_caretRectDirty) |
| 133 return; | 134 return; |
| 134 m_caretRectDirty = true; | 135 m_caretRectDirty = true; |
| 135 | 136 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 162 // It's possible for the timer to be inactive even though we want to | 163 // It's possible for the timer to be inactive even though we want to |
| 163 // invalidate the caret. For example, when running as a layout test the | 164 // invalidate the caret. For example, when running as a layout test the |
| 164 // caret blink interval could be zero and thus |m_caretBlinkTimer| will | 165 // caret blink interval could be zero and thus |m_caretBlinkTimer| will |
| 165 // never be started. We provide |forceInvalidation| for use by paint | 166 // never be started. We provide |forceInvalidation| for use by paint |
| 166 // invalidation internals where we need to invalidate the caret regardless | 167 // invalidation internals where we need to invalidate the caret regardless |
| 167 // of timer state. | 168 // of timer state. |
| 168 if (!forceInvalidation | 169 if (!forceInvalidation |
| 169 && !m_caretBlinkTimer.isActive() | 170 && !m_caretBlinkTimer.isActive() |
| 170 && newNode == m_previousCaretNode | 171 && newNode == m_previousCaretNode |
| 171 && newRect == m_previousCaretRect | 172 && newRect == m_previousCaretRect |
| 172 && getCaretVisibility() == m_previousCaretVisibility) | 173 && m_caretVisibility == m_previousCaretVisibility) |
| 173 return; | 174 return; |
| 174 | 175 |
| 175 LayoutViewItem view = m_frame->document()->layoutViewItem(); | 176 LayoutViewItem view = m_frame->document()->layoutViewItem(); |
| 176 if (m_previousCaretNode && (shouldRepaintCaret(*m_previousCaretNode) || shou
ldRepaintCaret(view))) | 177 if (m_previousCaretNode && (shouldRepaintCaret(*m_previousCaretNode) || shou
ldRepaintCaret(view))) |
| 177 invalidateLocalCaretRect(m_previousCaretNode.get(), m_previousCaretRect)
; | 178 invalidateLocalCaretRect(m_previousCaretNode.get(), m_previousCaretRect)
; |
| 178 if (newNode && (shouldRepaintCaret(*newNode) || shouldRepaintCaret(view))) | 179 if (newNode && (shouldRepaintCaret(*newNode) || shouldRepaintCaret(view))) |
| 179 invalidateLocalCaretRect(newNode, newRect); | 180 invalidateLocalCaretRect(newNode, newRect); |
| 180 m_previousCaretNode = newNode; | 181 m_previousCaretNode = newNode; |
| 181 m_previousCaretRect = newRect; | 182 m_previousCaretRect = newRect; |
| 182 m_previousCaretVisibility = getCaretVisibility(); | 183 m_previousCaretVisibility = m_caretVisibility; |
| 183 } | 184 } |
| 184 | 185 |
| 185 IntRect FrameCaret::absoluteCaretBounds() | 186 IntRect FrameCaret::absoluteCaretBounds() |
| 186 { | 187 { |
| 187 DCHECK_NE(m_frame->document()->lifecycle().state(), DocumentLifecycle::InPai
ntInvalidation); | 188 DCHECK_NE(m_frame->document()->lifecycle().state(), DocumentLifecycle::InPai
ntInvalidation); |
| 188 DCHECK(!m_frame->document()->needsLayoutTreeUpdate()); | 189 DCHECK(!m_frame->document()->needsLayoutTreeUpdate()); |
| 189 DocumentLifecycle::DisallowTransitionScope disallowTransition(m_frame->docum
ent()->lifecycle()); | 190 DocumentLifecycle::DisallowTransitionScope disallowTransition(m_frame->docum
ent()->lifecycle()); |
| 190 | 191 |
| 191 if (!isActive()) { | 192 if (!isActive()) { |
| 192 clearCaretRect(); | 193 clearCaretRect(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 207 { | 208 { |
| 208 m_shouldShowBlockCursor = shouldShowBlockCursor; | 209 m_shouldShowBlockCursor = shouldShowBlockCursor; |
| 209 | 210 |
| 210 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); | 211 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); |
| 211 | 212 |
| 212 updateAppearance(); | 213 updateAppearance(); |
| 213 } | 214 } |
| 214 | 215 |
| 215 void FrameCaret::paintCaret(GraphicsContext& context, const LayoutPoint& paintOf
fset) | 216 void FrameCaret::paintCaret(GraphicsContext& context, const LayoutPoint& paintOf
fset) |
| 216 { | 217 { |
| 218 if (m_caretVisibility == CaretVisibility::Hidden) |
| 219 return; |
| 220 |
| 217 if (!(isActive() && m_shouldPaintCaret)) | 221 if (!(isActive() && m_shouldPaintCaret)) |
| 218 return; | 222 return; |
| 219 | 223 |
| 220 updateCaretRect(caretPosition()); | 224 updateCaretRect(caretPosition()); |
| 221 CaretBase::paintCaret(caretPosition().position().anchorNode(), context, pain
tOffset, DisplayItem::kCaret); | 225 CaretBase::paintCaret(caretPosition().position().anchorNode(), context, pain
tOffset, DisplayItem::kCaret); |
| 222 } | 226 } |
| 223 | 227 |
| 224 void FrameCaret::dataWillChange(const CharacterData& node) | 228 void FrameCaret::dataWillChange(const CharacterData& node) |
| 225 { | 229 { |
| 226 if (node == m_previousCaretNode) { | 230 if (node == m_previousCaretNode) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 243 } | 247 } |
| 244 | 248 |
| 245 void FrameCaret::documentDetached() | 249 void FrameCaret::documentDetached() |
| 246 { | 250 { |
| 247 m_caretBlinkTimer.stop(); | 251 m_caretBlinkTimer.stop(); |
| 248 m_previousCaretNode.clear(); | 252 m_previousCaretNode.clear(); |
| 249 } | 253 } |
| 250 | 254 |
| 251 bool FrameCaret::shouldBlinkCaret() const | 255 bool FrameCaret::shouldBlinkCaret() const |
| 252 { | 256 { |
| 253 if (!caretIsVisible() || !isActive()) | 257 if (m_caretVisibility != CaretVisibility::Visible || !isActive()) |
| 254 return false; | 258 return false; |
| 255 | 259 |
| 256 if (m_frame->settings() && m_frame->settings()->caretBrowsingEnabled()) | 260 if (m_frame->settings() && m_frame->settings()->caretBrowsingEnabled()) |
| 257 return false; | 261 return false; |
| 258 | 262 |
| 259 Element* root = rootEditableElementOf(caretPosition().position()); | 263 Element* root = rootEditableElementOf(caretPosition().position()); |
| 260 if (!root) | 264 if (!root) |
| 261 return false; | 265 return false; |
| 262 | 266 |
| 263 Element* focusedElement = root->document().focusedElement(); | 267 Element* focusedElement = root->document().focusedElement(); |
| 264 if (!focusedElement) | 268 if (!focusedElement) |
| 265 return false; | 269 return false; |
| 266 | 270 |
| 267 return focusedElement->isShadowIncludingInclusiveAncestorOf(caretPosition().
position().anchorNode()); | 271 return focusedElement->isShadowIncludingInclusiveAncestorOf(caretPosition().
position().anchorNode()); |
| 268 } | 272 } |
| 269 | 273 |
| 270 void FrameCaret::caretBlinkTimerFired(TimerBase*) | 274 void FrameCaret::caretBlinkTimerFired(TimerBase*) |
| 271 { | 275 { |
| 272 DCHECK(caretIsVisible()); | 276 DCHECK_EQ(m_caretVisibility, CaretVisibility::Visible); |
| 273 if (isCaretBlinkingSuspended() && m_shouldPaintCaret) | 277 if (isCaretBlinkingSuspended() && m_shouldPaintCaret) |
| 274 return; | 278 return; |
| 275 m_shouldPaintCaret = !m_shouldPaintCaret; | 279 m_shouldPaintCaret = !m_shouldPaintCaret; |
| 276 setCaretRectNeedsUpdate(); | 280 setCaretRectNeedsUpdate(); |
| 277 } | 281 } |
| 278 | 282 |
| 279 } // nemaspace blink | 283 } // nemaspace blink |
| OLD | NEW |