| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. | 2  * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. | 
| 3  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 3  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 
| 4  * | 4  * | 
| 5  * Redistribution and use in source and binary forms, with or without | 5  * Redistribution and use in source and binary forms, with or without | 
| 6  * modification, are permitted provided that the following conditions | 6  * modification, are permitted provided that the following conditions | 
| 7  * are met: | 7  * are met: | 
| 8  * 1. Redistributions of source code must retain the above copyright | 8  * 1. Redistributions of source code must retain the above copyright | 
| 9  *    notice, this list of conditions and the following disclaimer. | 9  *    notice, this list of conditions and the following disclaimer. | 
| 10  * 2. Redistributions in binary form must reproduce the above copyright | 10  * 2. Redistributions in binary form must reproduce the above copyright | 
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 247 bool Editor::canDeleteRange(Range* range) const | 247 bool Editor::canDeleteRange(Range* range) const | 
| 248 { | 248 { | 
| 249     Node* startContainer = range->startContainer(); | 249     Node* startContainer = range->startContainer(); | 
| 250     Node* endContainer = range->endContainer(); | 250     Node* endContainer = range->endContainer(); | 
| 251     if (!startContainer || !endContainer) | 251     if (!startContainer || !endContainer) | 
| 252         return false; | 252         return false; | 
| 253 | 253 | 
| 254     if (!startContainer->rendererIsEditable() || !endContainer->rendererIsEditab
      le()) | 254     if (!startContainer->rendererIsEditable() || !endContainer->rendererIsEditab
      le()) | 
| 255         return false; | 255         return false; | 
| 256 | 256 | 
| 257     if (range->collapsed(IGNORE_EXCEPTION_STATE)) { | 257     if (range->collapsed(IGNORE_EXCEPTION)) { | 
| 258         VisiblePosition start(range->startPosition(), DOWNSTREAM); | 258         VisiblePosition start(range->startPosition(), DOWNSTREAM); | 
| 259         VisiblePosition previous = start.previous(); | 259         VisiblePosition previous = start.previous(); | 
| 260         // FIXME: We sometimes allow deletions at the start of editable roots, l
      ike when the caret is in an empty list item. | 260         // FIXME: We sometimes allow deletions at the start of editable roots, l
      ike when the caret is in an empty list item. | 
| 261         if (previous.isNull() || previous.deepEquivalent().deprecatedNode()->roo
      tEditableElement() != startContainer->rootEditableElement()) | 261         if (previous.isNull() || previous.deepEquivalent().deprecatedNode()->roo
      tEditableElement() != startContainer->rootEditableElement()) | 
| 262             return false; | 262             return false; | 
| 263     } | 263     } | 
| 264     return true; | 264     return true; | 
| 265 } | 265 } | 
| 266 | 266 | 
| 267 bool Editor::smartInsertDeleteEnabled() | 267 bool Editor::smartInsertDeleteEnabled() | 
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 328         return; | 328         return; | 
| 329 | 329 | 
| 330     applyCommand(DeleteSelectionCommand::create(m_frame->document(), smartDelete
      )); | 330     applyCommand(DeleteSelectionCommand::create(m_frame->document(), smartDelete
      )); | 
| 331 } | 331 } | 
| 332 | 332 | 
| 333 void Editor::pasteAsPlainText(const String& pastingText, bool smartReplace) | 333 void Editor::pasteAsPlainText(const String& pastingText, bool smartReplace) | 
| 334 { | 334 { | 
| 335     Node* target = findEventTargetFromSelection(); | 335     Node* target = findEventTargetFromSelection(); | 
| 336     if (!target) | 336     if (!target) | 
| 337         return; | 337         return; | 
| 338     target->dispatchEvent(TextEvent::createForPlainTextPaste(m_frame->domWindow(
      ), pastingText, smartReplace), IGNORE_EXCEPTION_STATE); | 338     target->dispatchEvent(TextEvent::createForPlainTextPaste(m_frame->domWindow(
      ), pastingText, smartReplace), IGNORE_EXCEPTION); | 
| 339 } | 339 } | 
| 340 | 340 | 
| 341 void Editor::pasteAsFragment(PassRefPtr<DocumentFragment> pastingFragment, bool 
      smartReplace, bool matchStyle) | 341 void Editor::pasteAsFragment(PassRefPtr<DocumentFragment> pastingFragment, bool 
      smartReplace, bool matchStyle) | 
| 342 { | 342 { | 
| 343     Node* target = findEventTargetFromSelection(); | 343     Node* target = findEventTargetFromSelection(); | 
| 344     if (!target) | 344     if (!target) | 
| 345         return; | 345         return; | 
| 346     target->dispatchEvent(TextEvent::createForFragmentPaste(m_frame->domWindow()
      , pastingFragment, smartReplace, matchStyle), IGNORE_EXCEPTION_STATE); | 346     target->dispatchEvent(TextEvent::createForFragmentPaste(m_frame->domWindow()
      , pastingFragment, smartReplace, matchStyle), IGNORE_EXCEPTION); | 
| 347 } | 347 } | 
| 348 | 348 | 
| 349 void Editor::pasteAsPlainTextBypassingDHTML() | 349 void Editor::pasteAsPlainTextBypassingDHTML() | 
| 350 { | 350 { | 
| 351     pasteAsPlainTextWithPasteboard(Pasteboard::generalPasteboard()); | 351     pasteAsPlainTextWithPasteboard(Pasteboard::generalPasteboard()); | 
| 352 } | 352 } | 
| 353 | 353 | 
| 354 void Editor::pasteAsPlainTextWithPasteboard(Pasteboard* pasteboard) | 354 void Editor::pasteAsPlainTextWithPasteboard(Pasteboard* pasteboard) | 
| 355 { | 355 { | 
| 356     String text = pasteboard->plainText(m_frame); | 356     String text = pasteboard->plainText(m_frame); | 
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 418 | 418 | 
| 419 PassRefPtr<Range> Editor::selectedRange() | 419 PassRefPtr<Range> Editor::selectedRange() | 
| 420 { | 420 { | 
| 421     if (!m_frame) | 421     if (!m_frame) | 
| 422         return 0; | 422         return 0; | 
| 423     return m_frame->selection()->toNormalizedRange(); | 423     return m_frame->selection()->toNormalizedRange(); | 
| 424 } | 424 } | 
| 425 | 425 | 
| 426 bool Editor::shouldDeleteRange(Range* range) const | 426 bool Editor::shouldDeleteRange(Range* range) const | 
| 427 { | 427 { | 
| 428     if (!range || range->collapsed(IGNORE_EXCEPTION_STATE)) | 428     if (!range || range->collapsed(IGNORE_EXCEPTION)) | 
| 429         return false; | 429         return false; | 
| 430 | 430 | 
| 431     if (!canDeleteRange(range)) | 431     if (!canDeleteRange(range)) | 
| 432         return false; | 432         return false; | 
| 433 | 433 | 
| 434     return client() && client()->shouldDeleteRange(range); | 434     return client() && client()->shouldDeleteRange(range); | 
| 435 } | 435 } | 
| 436 | 436 | 
| 437 bool Editor::tryDHTMLCopy() | 437 bool Editor::tryDHTMLCopy() | 
| 438 { | 438 { | 
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 594 // the event handler NOT setting the return value to false | 594 // the event handler NOT setting the return value to false | 
| 595 bool Editor::dispatchCPPEvent(const AtomicString &eventType, ClipboardAccessPoli
      cy policy) | 595 bool Editor::dispatchCPPEvent(const AtomicString &eventType, ClipboardAccessPoli
      cy policy) | 
| 596 { | 596 { | 
| 597     Node* target = findEventTargetFromSelection(); | 597     Node* target = findEventTargetFromSelection(); | 
| 598     if (!target) | 598     if (!target) | 
| 599         return true; | 599         return true; | 
| 600 | 600 | 
| 601     RefPtr<Clipboard> clipboard = newGeneralClipboard(policy, m_frame); | 601     RefPtr<Clipboard> clipboard = newGeneralClipboard(policy, m_frame); | 
| 602 | 602 | 
| 603     RefPtr<Event> evt = ClipboardEvent::create(eventType, true, true, clipboard)
      ; | 603     RefPtr<Event> evt = ClipboardEvent::create(eventType, true, true, clipboard)
      ; | 
| 604     target->dispatchEvent(evt, IGNORE_EXCEPTION_STATE); | 604     target->dispatchEvent(evt, IGNORE_EXCEPTION); | 
| 605     bool noDefaultProcessing = evt->defaultPrevented(); | 605     bool noDefaultProcessing = evt->defaultPrevented(); | 
| 606     if (noDefaultProcessing && policy == ClipboardWritable) { | 606     if (noDefaultProcessing && policy == ClipboardWritable) { | 
| 607         Pasteboard* pasteboard = Pasteboard::generalPasteboard(); | 607         Pasteboard* pasteboard = Pasteboard::generalPasteboard(); | 
| 608         pasteboard->clear(); | 608         pasteboard->clear(); | 
| 609         pasteboard->writeClipboard(clipboard.get()); | 609         pasteboard->writeClipboard(clipboard.get()); | 
| 610     } | 610     } | 
| 611 | 611 | 
| 612     // invalidate clipboard here for security | 612     // invalidate clipboard here for security | 
| 613     clipboard->setAccessPolicy(ClipboardNumb); | 613     clipboard->setAccessPolicy(ClipboardNumb); | 
| 614 | 614 | 
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 713 } | 713 } | 
| 714 | 714 | 
| 715 void Editor::outdent() | 715 void Editor::outdent() | 
| 716 { | 716 { | 
| 717     applyCommand(IndentOutdentCommand::create(m_frame->document(), IndentOutdent
      Command::Outdent)); | 717     applyCommand(IndentOutdentCommand::create(m_frame->document(), IndentOutdent
      Command::Outdent)); | 
| 718 } | 718 } | 
| 719 | 719 | 
| 720 static void dispatchEditableContentChangedEvents(PassRefPtr<Element> startRoot, 
      PassRefPtr<Element> endRoot) | 720 static void dispatchEditableContentChangedEvents(PassRefPtr<Element> startRoot, 
      PassRefPtr<Element> endRoot) | 
| 721 { | 721 { | 
| 722     if (startRoot) | 722     if (startRoot) | 
| 723         startRoot->dispatchEvent(Event::create(eventNames().webkitEditableConten
      tChangedEvent, false, false), IGNORE_EXCEPTION_STATE); | 723         startRoot->dispatchEvent(Event::create(eventNames().webkitEditableConten
      tChangedEvent, false, false), IGNORE_EXCEPTION); | 
| 724     if (endRoot && endRoot != startRoot) | 724     if (endRoot && endRoot != startRoot) | 
| 725         endRoot->dispatchEvent(Event::create(eventNames().webkitEditableContentC
      hangedEvent, false, false), IGNORE_EXCEPTION_STATE); | 725         endRoot->dispatchEvent(Event::create(eventNames().webkitEditableContentC
      hangedEvent, false, false), IGNORE_EXCEPTION); | 
| 726 } | 726 } | 
| 727 | 727 | 
| 728 void Editor::appliedEditing(PassRefPtr<CompositeEditCommand> cmd) | 728 void Editor::appliedEditing(PassRefPtr<CompositeEditCommand> cmd) | 
| 729 { | 729 { | 
| 730     m_frame->document()->updateLayout(); | 730     m_frame->document()->updateLayout(); | 
| 731 | 731 | 
| 732     EditCommandComposition* composition = cmd->composition(); | 732     EditCommandComposition* composition = cmd->composition(); | 
| 733     ASSERT(composition); | 733     ASSERT(composition); | 
| 734     VisibleSelection newSelection(cmd->endingSelection()); | 734     VisibleSelection newSelection(cmd->endingSelection()); | 
| 735 | 735 | 
| (...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1189     if (m_frame->selection()->isNone()) { | 1189     if (m_frame->selection()->isNone()) { | 
| 1190         setIgnoreCompositionSelectionChange(false); | 1190         setIgnoreCompositionSelectionChange(false); | 
| 1191         return; | 1191         return; | 
| 1192     } | 1192     } | 
| 1193 | 1193 | 
| 1194     // Dispatch a compositionend event to the focused node. | 1194     // Dispatch a compositionend event to the focused node. | 
| 1195     // We should send this event before sending a TextEvent as written in Sectio
      n 6.2.2 and 6.2.3 of | 1195     // We should send this event before sending a TextEvent as written in Sectio
      n 6.2.2 and 6.2.3 of | 
| 1196     // the DOM Event specification. | 1196     // the DOM Event specification. | 
| 1197     if (Element* target = m_frame->document()->focusedElement()) { | 1197     if (Element* target = m_frame->document()->focusedElement()) { | 
| 1198         RefPtr<CompositionEvent> event = CompositionEvent::create(eventNames().c
      ompositionendEvent, m_frame->domWindow(), text); | 1198         RefPtr<CompositionEvent> event = CompositionEvent::create(eventNames().c
      ompositionendEvent, m_frame->domWindow(), text); | 
| 1199         target->dispatchEvent(event, IGNORE_EXCEPTION_STATE); | 1199         target->dispatchEvent(event, IGNORE_EXCEPTION); | 
| 1200     } | 1200     } | 
| 1201 | 1201 | 
| 1202     // If text is empty, then delete the old composition here.  If text is non-e
      mpty, InsertTextCommand::input | 1202     // If text is empty, then delete the old composition here.  If text is non-e
      mpty, InsertTextCommand::input | 
| 1203     // will delete the old composition with an optimized replace operation. | 1203     // will delete the old composition with an optimized replace operation. | 
| 1204     if (text.isEmpty() && mode != CancelComposition) | 1204     if (text.isEmpty() && mode != CancelComposition) | 
| 1205         TypingCommand::deleteSelection(m_frame->document(), 0); | 1205         TypingCommand::deleteSelection(m_frame->document(), 0); | 
| 1206 | 1206 | 
| 1207     m_compositionNode = 0; | 1207     m_compositionNode = 0; | 
| 1208     m_customCompositionUnderlines.clear(); | 1208     m_customCompositionUnderlines.clear(); | 
| 1209 | 1209 | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1259                 target->dispatchEvent(CompositionEvent::create(eventNames().comp
      ositionstartEvent, m_frame->domWindow(), selectedText())); | 1259                 target->dispatchEvent(CompositionEvent::create(eventNames().comp
      ositionstartEvent, m_frame->domWindow(), selectedText())); | 
| 1260                 event = CompositionEvent::create(eventNames().compositionupdateE
      vent, m_frame->domWindow(), text); | 1260                 event = CompositionEvent::create(eventNames().compositionupdateE
      vent, m_frame->domWindow(), text); | 
| 1261             } | 1261             } | 
| 1262         } else { | 1262         } else { | 
| 1263             if (!text.isEmpty()) | 1263             if (!text.isEmpty()) | 
| 1264                 event = CompositionEvent::create(eventNames().compositionupdateE
      vent, m_frame->domWindow(), text); | 1264                 event = CompositionEvent::create(eventNames().compositionupdateE
      vent, m_frame->domWindow(), text); | 
| 1265             else | 1265             else | 
| 1266                 event = CompositionEvent::create(eventNames().compositionendEven
      t, m_frame->domWindow(), text); | 1266                 event = CompositionEvent::create(eventNames().compositionendEven
      t, m_frame->domWindow(), text); | 
| 1267         } | 1267         } | 
| 1268         if (event.get()) | 1268         if (event.get()) | 
| 1269             target->dispatchEvent(event, IGNORE_EXCEPTION_STATE); | 1269             target->dispatchEvent(event, IGNORE_EXCEPTION); | 
| 1270     } | 1270     } | 
| 1271 | 1271 | 
| 1272     // If text is empty, then delete the old composition here.  If text is non-e
      mpty, InsertTextCommand::input | 1272     // If text is empty, then delete the old composition here.  If text is non-e
      mpty, InsertTextCommand::input | 
| 1273     // will delete the old composition with an optimized replace operation. | 1273     // will delete the old composition with an optimized replace operation. | 
| 1274     if (text.isEmpty()) | 1274     if (text.isEmpty()) | 
| 1275         TypingCommand::deleteSelection(m_frame->document(), TypingCommand::Preve
      ntSpellChecking); | 1275         TypingCommand::deleteSelection(m_frame->document(), TypingCommand::Preve
      ntSpellChecking); | 
| 1276 | 1276 | 
| 1277     m_compositionNode = 0; | 1277     m_compositionNode = 0; | 
| 1278     m_customCompositionUnderlines.clear(); | 1278     m_customCompositionUnderlines.clear(); | 
| 1279 | 1279 | 
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1349         // selection is editable. | 1349         // selection is editable. | 
| 1350         // This can happen in Mail for a mix of non-editable and editable conten
      t (like Stationary), | 1350         // This can happen in Mail for a mix of non-editable and editable conten
      t (like Stationary), | 
| 1351         // when spell checking the whole document before sending the message. | 1351         // when spell checking the whole document before sending the message. | 
| 1352         // In that case the document might not be editable, but there are editab
      le pockets that need to be spell checked. | 1352         // In that case the document might not be editable, but there are editab
      le pockets that need to be spell checked. | 
| 1353 | 1353 | 
| 1354         position = firstEditablePositionAfterPositionInRoot(position, frame()->d
      ocument()->documentElement()).deepEquivalent(); | 1354         position = firstEditablePositionAfterPositionInRoot(position, frame()->d
      ocument()->documentElement()).deepEquivalent(); | 
| 1355         if (position.isNull()) | 1355         if (position.isNull()) | 
| 1356             return; | 1356             return; | 
| 1357 | 1357 | 
| 1358         Position rangeCompliantPosition = position.parentAnchoredEquivalent(); | 1358         Position rangeCompliantPosition = position.parentAnchoredEquivalent(); | 
| 1359         spellingSearchRange->setStart(rangeCompliantPosition.deprecatedNode(), r
      angeCompliantPosition.deprecatedEditingOffset(), IGNORE_EXCEPTION_STATE); | 1359         spellingSearchRange->setStart(rangeCompliantPosition.deprecatedNode(), r
      angeCompliantPosition.deprecatedEditingOffset(), IGNORE_EXCEPTION); | 
| 1360         startedWithSelection = false; // won't need to wrap | 1360         startedWithSelection = false; // won't need to wrap | 
| 1361     } | 1361     } | 
| 1362 | 1362 | 
| 1363     // topNode defines the whole range we want to operate on | 1363     // topNode defines the whole range we want to operate on | 
| 1364     Node* topNode = highestEditableRoot(position); | 1364     Node* topNode = highestEditableRoot(position); | 
| 1365     // FIXME: lastOffsetForEditing() is wrong here if editingIgnoresContent(high
      estEditableRoot()) returns true (e.g. a <table>) | 1365     // FIXME: lastOffsetForEditing() is wrong here if editingIgnoresContent(high
      estEditableRoot()) returns true (e.g. a <table>) | 
| 1366     spellingSearchRange->setEnd(topNode, lastOffsetForEditing(topNode), IGNORE_E
      XCEPTION_STATE); | 1366     spellingSearchRange->setEnd(topNode, lastOffsetForEditing(topNode), IGNORE_E
      XCEPTION); | 
| 1367 | 1367 | 
| 1368     // If spellingSearchRange starts in the middle of a word, advance to the nex
      t word so we start checking | 1368     // If spellingSearchRange starts in the middle of a word, advance to the nex
      t word so we start checking | 
| 1369     // at a word boundary. Going back by one char and then forward by a word doe
      s the trick. | 1369     // at a word boundary. Going back by one char and then forward by a word doe
      s the trick. | 
| 1370     if (startedWithSelection) { | 1370     if (startedWithSelection) { | 
| 1371         VisiblePosition oneBeforeStart = startVisiblePosition(spellingSearchRang
      e.get(), DOWNSTREAM).previous(); | 1371         VisiblePosition oneBeforeStart = startVisiblePosition(spellingSearchRang
      e.get(), DOWNSTREAM).previous(); | 
| 1372         if (oneBeforeStart.isNotNull()) | 1372         if (oneBeforeStart.isNotNull()) | 
| 1373             setStart(spellingSearchRange.get(), endOfWord(oneBeforeStart)); | 1373             setStart(spellingSearchRange.get(), endOfWord(oneBeforeStart)); | 
| 1374         // else we were already at the start of the editable node | 1374         // else we were already at the start of the editable node | 
| 1375     } | 1375     } | 
| 1376 | 1376 | 
| 1377     if (spellingSearchRange->collapsed(IGNORE_EXCEPTION_STATE)) | 1377     if (spellingSearchRange->collapsed(IGNORE_EXCEPTION)) | 
| 1378         return; // nothing to search in | 1378         return; // nothing to search in | 
| 1379 | 1379 | 
| 1380     // Get the spell checker if it is available | 1380     // Get the spell checker if it is available | 
| 1381     if (!client()) | 1381     if (!client()) | 
| 1382         return; | 1382         return; | 
| 1383 | 1383 | 
| 1384     // We go to the end of our first range instead of the start of it, just to b
      e sure | 1384     // We go to the end of our first range instead of the start of it, just to b
      e sure | 
| 1385     // we don't get foiled by any word boundary problems at the start.  It means
       we might | 1385     // we don't get foiled by any word boundary problems at the start.  It means
       we might | 
| 1386     // do a tiny bit more searching. | 1386     // do a tiny bit more searching. | 
| 1387     Node* searchEndNodeAfterWrap = spellingSearchRange->endContainer(); | 1387     Node* searchEndNodeAfterWrap = spellingSearchRange->endContainer(); | 
| 1388     int searchEndOffsetAfterWrap = spellingSearchRange->endOffset(); | 1388     int searchEndOffsetAfterWrap = spellingSearchRange->endOffset(); | 
| 1389 | 1389 | 
| 1390     int misspellingOffset = 0; | 1390     int misspellingOffset = 0; | 
| 1391     GrammarDetail grammarDetail; | 1391     GrammarDetail grammarDetail; | 
| 1392     int grammarPhraseOffset = 0; | 1392     int grammarPhraseOffset = 0; | 
| 1393     RefPtr<Range> grammarSearchRange; | 1393     RefPtr<Range> grammarSearchRange; | 
| 1394     String badGrammarPhrase; | 1394     String badGrammarPhrase; | 
| 1395     String misspelledWord; | 1395     String misspelledWord; | 
| 1396 | 1396 | 
| 1397     bool isSpelling = true; | 1397     bool isSpelling = true; | 
| 1398     int foundOffset = 0; | 1398     int foundOffset = 0; | 
| 1399     String foundItem; | 1399     String foundItem; | 
| 1400     RefPtr<Range> firstMisspellingRange; | 1400     RefPtr<Range> firstMisspellingRange; | 
| 1401     if (unifiedTextCheckerEnabled()) { | 1401     if (unifiedTextCheckerEnabled()) { | 
| 1402         grammarSearchRange = spellingSearchRange->cloneRange(IGNORE_EXCEPTION_ST
      ATE); | 1402         grammarSearchRange = spellingSearchRange->cloneRange(IGNORE_EXCEPTION); | 
| 1403         foundItem = TextCheckingHelper(client(), spellingSearchRange).findFirstM
      isspellingOrBadGrammar(isGrammarCheckingEnabled(), isSpelling, foundOffset, gram
      marDetail); | 1403         foundItem = TextCheckingHelper(client(), spellingSearchRange).findFirstM
      isspellingOrBadGrammar(isGrammarCheckingEnabled(), isSpelling, foundOffset, gram
      marDetail); | 
| 1404         if (isSpelling) { | 1404         if (isSpelling) { | 
| 1405             misspelledWord = foundItem; | 1405             misspelledWord = foundItem; | 
| 1406             misspellingOffset = foundOffset; | 1406             misspellingOffset = foundOffset; | 
| 1407         } else { | 1407         } else { | 
| 1408             badGrammarPhrase = foundItem; | 1408             badGrammarPhrase = foundItem; | 
| 1409             grammarPhraseOffset = foundOffset; | 1409             grammarPhraseOffset = foundOffset; | 
| 1410         } | 1410         } | 
| 1411     } else { | 1411     } else { | 
| 1412         misspelledWord = TextCheckingHelper(client(), spellingSearchRange).findF
      irstMisspelling(misspellingOffset, false, firstMisspellingRange); | 1412         misspelledWord = TextCheckingHelper(client(), spellingSearchRange).findF
      irstMisspelling(misspellingOffset, false, firstMisspellingRange); | 
| 1413         grammarSearchRange = spellingSearchRange->cloneRange(IGNORE_EXCEPTION_ST
      ATE); | 1413         grammarSearchRange = spellingSearchRange->cloneRange(IGNORE_EXCEPTION); | 
| 1414         if (!misspelledWord.isEmpty()) { | 1414         if (!misspelledWord.isEmpty()) { | 
| 1415             // Stop looking at start of next misspelled word | 1415             // Stop looking at start of next misspelled word | 
| 1416             CharacterIterator chars(grammarSearchRange.get()); | 1416             CharacterIterator chars(grammarSearchRange.get()); | 
| 1417             chars.advance(misspellingOffset); | 1417             chars.advance(misspellingOffset); | 
| 1418             grammarSearchRange->setEnd(chars.range()->startContainer(), chars.ra
      nge()->startOffset(), IGNORE_EXCEPTION_STATE); | 1418             grammarSearchRange->setEnd(chars.range()->startContainer(), chars.ra
      nge()->startOffset(), IGNORE_EXCEPTION); | 
| 1419         } | 1419         } | 
| 1420 | 1420 | 
| 1421         if (isGrammarCheckingEnabled()) | 1421         if (isGrammarCheckingEnabled()) | 
| 1422             badGrammarPhrase = TextCheckingHelper(client(), grammarSearchRange).
      findFirstBadGrammar(grammarDetail, grammarPhraseOffset, false); | 1422             badGrammarPhrase = TextCheckingHelper(client(), grammarSearchRange).
      findFirstBadGrammar(grammarDetail, grammarPhraseOffset, false); | 
| 1423     } | 1423     } | 
| 1424 | 1424 | 
| 1425     // If we found neither bad grammar nor a misspelled word, wrap and try again
       (but don't bother if we started at the beginning of the | 1425     // If we found neither bad grammar nor a misspelled word, wrap and try again
       (but don't bother if we started at the beginning of the | 
| 1426     // block rather than at a selection). | 1426     // block rather than at a selection). | 
| 1427     if (startedWithSelection && !misspelledWord && !badGrammarPhrase) { | 1427     if (startedWithSelection && !misspelledWord && !badGrammarPhrase) { | 
| 1428         spellingSearchRange->setStart(topNode, 0, IGNORE_EXCEPTION_STATE); | 1428         spellingSearchRange->setStart(topNode, 0, IGNORE_EXCEPTION); | 
| 1429         // going until the end of the very first chunk we tested is far enough | 1429         // going until the end of the very first chunk we tested is far enough | 
| 1430         spellingSearchRange->setEnd(searchEndNodeAfterWrap, searchEndOffsetAfter
      Wrap, IGNORE_EXCEPTION_STATE); | 1430         spellingSearchRange->setEnd(searchEndNodeAfterWrap, searchEndOffsetAfter
      Wrap, IGNORE_EXCEPTION); | 
| 1431 | 1431 | 
| 1432         if (unifiedTextCheckerEnabled()) { | 1432         if (unifiedTextCheckerEnabled()) { | 
| 1433             grammarSearchRange = spellingSearchRange->cloneRange(IGNORE_EXCEPTIO
      N_STATE); | 1433             grammarSearchRange = spellingSearchRange->cloneRange(IGNORE_EXCEPTIO
      N); | 
| 1434             foundItem = TextCheckingHelper(client(), spellingSearchRange).findFi
      rstMisspellingOrBadGrammar(isGrammarCheckingEnabled(), isSpelling, foundOffset, 
      grammarDetail); | 1434             foundItem = TextCheckingHelper(client(), spellingSearchRange).findFi
      rstMisspellingOrBadGrammar(isGrammarCheckingEnabled(), isSpelling, foundOffset, 
      grammarDetail); | 
| 1435             if (isSpelling) { | 1435             if (isSpelling) { | 
| 1436                 misspelledWord = foundItem; | 1436                 misspelledWord = foundItem; | 
| 1437                 misspellingOffset = foundOffset; | 1437                 misspellingOffset = foundOffset; | 
| 1438             } else { | 1438             } else { | 
| 1439                 badGrammarPhrase = foundItem; | 1439                 badGrammarPhrase = foundItem; | 
| 1440                 grammarPhraseOffset = foundOffset; | 1440                 grammarPhraseOffset = foundOffset; | 
| 1441             } | 1441             } | 
| 1442         } else { | 1442         } else { | 
| 1443             misspelledWord = TextCheckingHelper(client(), spellingSearchRange).f
      indFirstMisspelling(misspellingOffset, false, firstMisspellingRange); | 1443             misspelledWord = TextCheckingHelper(client(), spellingSearchRange).f
      indFirstMisspelling(misspellingOffset, false, firstMisspellingRange); | 
| 1444             grammarSearchRange = spellingSearchRange->cloneRange(IGNORE_EXCEPTIO
      N_STATE); | 1444             grammarSearchRange = spellingSearchRange->cloneRange(IGNORE_EXCEPTIO
      N); | 
| 1445             if (!misspelledWord.isEmpty()) { | 1445             if (!misspelledWord.isEmpty()) { | 
| 1446                 // Stop looking at start of next misspelled word | 1446                 // Stop looking at start of next misspelled word | 
| 1447                 CharacterIterator chars(grammarSearchRange.get()); | 1447                 CharacterIterator chars(grammarSearchRange.get()); | 
| 1448                 chars.advance(misspellingOffset); | 1448                 chars.advance(misspellingOffset); | 
| 1449                 grammarSearchRange->setEnd(chars.range()->startContainer(), char
      s.range()->startOffset(), IGNORE_EXCEPTION_STATE); | 1449                 grammarSearchRange->setEnd(chars.range()->startContainer(), char
      s.range()->startOffset(), IGNORE_EXCEPTION); | 
| 1450             } | 1450             } | 
| 1451 | 1451 | 
| 1452             if (isGrammarCheckingEnabled()) | 1452             if (isGrammarCheckingEnabled()) | 
| 1453                 badGrammarPhrase = TextCheckingHelper(client(), grammarSearchRan
      ge).findFirstBadGrammar(grammarDetail, grammarPhraseOffset, false); | 1453                 badGrammarPhrase = TextCheckingHelper(client(), grammarSearchRan
      ge).findFirstBadGrammar(grammarDetail, grammarPhraseOffset, false); | 
| 1454         } | 1454         } | 
| 1455     } | 1455     } | 
| 1456 | 1456 | 
| 1457     if (!badGrammarPhrase.isEmpty()) { | 1457     if (!badGrammarPhrase.isEmpty()) { | 
| 1458         // We found bad grammar. Since we only searched for bad grammar up to th
      e first misspelled word, the bad grammar | 1458         // We found bad grammar. Since we only searched for bad grammar up to th
      e first misspelled word, the bad grammar | 
| 1459         // takes precedence and we ignore any potential misspelled word. Select 
      the grammar detail, update the spelling | 1459         // takes precedence and we ignore any potential misspelled word. Select 
      the grammar detail, update the spelling | 
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1717     int selectionOffset = 0; | 1717     int selectionOffset = 0; | 
| 1718     int ambiguousBoundaryOffset = -1; | 1718     int ambiguousBoundaryOffset = -1; | 
| 1719     bool selectionChanged = false; | 1719     bool selectionChanged = false; | 
| 1720     bool restoreSelectionAfterChange = false; | 1720     bool restoreSelectionAfterChange = false; | 
| 1721     bool adjustSelectionForParagraphBoundaries = false; | 1721     bool adjustSelectionForParagraphBoundaries = false; | 
| 1722 | 1722 | 
| 1723     if (shouldMarkSpelling) { | 1723     if (shouldMarkSpelling) { | 
| 1724         if (m_frame->selection()->selectionType() == VisibleSelection::CaretSele
      ction) { | 1724         if (m_frame->selection()->selectionType() == VisibleSelection::CaretSele
      ction) { | 
| 1725             // Attempt to save the caret position so we can restore it later if 
      needed | 1725             // Attempt to save the caret position so we can restore it later if 
      needed | 
| 1726             Position caretPosition = m_frame->selection()->end(); | 1726             Position caretPosition = m_frame->selection()->end(); | 
| 1727             selectionOffset = paragraph.offsetTo(caretPosition, ASSERT_NO_EXCEPT
      ION_STATE); | 1727             selectionOffset = paragraph.offsetTo(caretPosition, ASSERT_NO_EXCEPT
      ION); | 
| 1728             restoreSelectionAfterChange = true; | 1728             restoreSelectionAfterChange = true; | 
| 1729             if (selectionOffset > 0 && (static_cast<unsigned>(selectionOffset) >
       paragraph.text().length() || paragraph.textCharAt(selectionOffset - 1) == newli
      neCharacter)) | 1729             if (selectionOffset > 0 && (static_cast<unsigned>(selectionOffset) >
       paragraph.text().length() || paragraph.textCharAt(selectionOffset - 1) == newli
      neCharacter)) | 
| 1730                 adjustSelectionForParagraphBoundaries = true; | 1730                 adjustSelectionForParagraphBoundaries = true; | 
| 1731             if (selectionOffset > 0 && static_cast<unsigned>(selectionOffset) <=
       paragraph.text().length() && isAmbiguousBoundaryCharacter(paragraph.textCharAt(
      selectionOffset - 1))) | 1731             if (selectionOffset > 0 && static_cast<unsigned>(selectionOffset) <=
       paragraph.text().length() && isAmbiguousBoundaryCharacter(paragraph.textCharAt(
      selectionOffset - 1))) | 
| 1732                 ambiguousBoundaryOffset = selectionOffset - 1; | 1732                 ambiguousBoundaryOffset = selectionOffset - 1; | 
| 1733         } | 1733         } | 
| 1734     } | 1734     } | 
| 1735 | 1735 | 
| 1736     for (unsigned i = 0; i < results.size(); i++) { | 1736     for (unsigned i = 0; i < results.size(); i++) { | 
| 1737         int spellingRangeEndOffset = paragraph.checkingEnd(); | 1737         int spellingRangeEndOffset = paragraph.checkingEnd(); | 
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2139 void Editor::applyEditingStyleToElement(Element* element) const | 2139 void Editor::applyEditingStyleToElement(Element* element) const | 
| 2140 { | 2140 { | 
| 2141     if (!element) | 2141     if (!element) | 
| 2142         return; | 2142         return; | 
| 2143     ASSERT(element->isStyledElement()); | 2143     ASSERT(element->isStyledElement()); | 
| 2144     if (!element->isStyledElement()) | 2144     if (!element->isStyledElement()) | 
| 2145         return; | 2145         return; | 
| 2146 | 2146 | 
| 2147     // Mutate using the CSSOM wrapper so we get the same event behavior as a scr
      ipt. | 2147     // Mutate using the CSSOM wrapper so we get the same event behavior as a scr
      ipt. | 
| 2148     CSSStyleDeclaration* style = element->style(); | 2148     CSSStyleDeclaration* style = element->style(); | 
| 2149     style->setPropertyInternal(CSSPropertyWordWrap, "break-word", false, IGNORE_
      EXCEPTION_STATE); | 2149     style->setPropertyInternal(CSSPropertyWordWrap, "break-word", false, IGNORE_
      EXCEPTION); | 
| 2150     style->setPropertyInternal(CSSPropertyWebkitLineBreak, "after-white-space", 
      false, IGNORE_EXCEPTION_STATE); | 2150     style->setPropertyInternal(CSSPropertyWebkitLineBreak, "after-white-space", 
      false, IGNORE_EXCEPTION); | 
| 2151 } | 2151 } | 
| 2152 | 2152 | 
| 2153 // Searches from the beginning of the document if nothing is selected. | 2153 // Searches from the beginning of the document if nothing is selected. | 
| 2154 bool Editor::findString(const String& target, bool forward, bool caseFlag, bool 
      wrapFlag, bool startInSelection) | 2154 bool Editor::findString(const String& target, bool forward, bool caseFlag, bool 
      wrapFlag, bool startInSelection) | 
| 2155 { | 2155 { | 
| 2156     FindOptions options = (forward ? 0 : Backwards) | (caseFlag ? 0 : CaseInsens
      itive) | (wrapFlag ? WrapAround : 0) | (startInSelection ? StartInSelection : 0)
      ; | 2156     FindOptions options = (forward ? 0 : Backwards) | (caseFlag ? 0 : CaseInsens
      itive) | (wrapFlag ? WrapAround : 0) | (startInSelection ? StartInSelection : 0)
      ; | 
| 2157     return findString(target, options); | 2157     return findString(target, options); | 
| 2158 } | 2158 } | 
| 2159 | 2159 | 
| 2160 bool Editor::findString(const String& target, FindOptions options) | 2160 bool Editor::findString(const String& target, FindOptions options) | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2224             if (forward) | 2224             if (forward) | 
| 2225                 searchRange->setEnd(shadowTreeRoot.get(), shadowTreeRoot->childN
      odeCount()); | 2225                 searchRange->setEnd(shadowTreeRoot.get(), shadowTreeRoot->childN
      odeCount()); | 
| 2226             else | 2226             else | 
| 2227                 searchRange->setStart(shadowTreeRoot.get(), 0); | 2227                 searchRange->setStart(shadowTreeRoot.get(), 0); | 
| 2228         } | 2228         } | 
| 2229 | 2229 | 
| 2230         resultRange = findPlainText(searchRange.get(), target, options); | 2230         resultRange = findPlainText(searchRange.get(), target, options); | 
| 2231     } | 2231     } | 
| 2232 | 2232 | 
| 2233     // If nothing was found in the shadow tree, search in main content following
       the shadow tree. | 2233     // If nothing was found in the shadow tree, search in main content following
       the shadow tree. | 
| 2234     if (resultRange->collapsed(ASSERT_NO_EXCEPTION_STATE) && shadowTreeRoot) { | 2234     if (resultRange->collapsed(ASSERT_NO_EXCEPTION) && shadowTreeRoot) { | 
| 2235         searchRange = rangeOfContents(m_frame->document()); | 2235         searchRange = rangeOfContents(m_frame->document()); | 
| 2236         if (forward) | 2236         if (forward) | 
| 2237             searchRange->setStartAfter(shadowTreeRoot->shadowHost()); | 2237             searchRange->setStartAfter(shadowTreeRoot->shadowHost()); | 
| 2238         else | 2238         else | 
| 2239             searchRange->setEndBefore(shadowTreeRoot->shadowHost()); | 2239             searchRange->setEndBefore(shadowTreeRoot->shadowHost()); | 
| 2240 | 2240 | 
| 2241         resultRange = findPlainText(searchRange.get(), target, options); | 2241         resultRange = findPlainText(searchRange.get(), target, options); | 
| 2242     } | 2242     } | 
| 2243 | 2243 | 
| 2244     // If we didn't find anything and we're wrapping, search again in the entire
       document (this will | 2244     // If we didn't find anything and we're wrapping, search again in the entire
       document (this will | 
| 2245     // redundantly re-search the area already searched in some cases). | 2245     // redundantly re-search the area already searched in some cases). | 
| 2246     if (resultRange->collapsed(ASSERT_NO_EXCEPTION_STATE) && options & WrapAroun
      d) { | 2246     if (resultRange->collapsed(ASSERT_NO_EXCEPTION) && options & WrapAround) { | 
| 2247         searchRange = rangeOfContents(m_frame->document()); | 2247         searchRange = rangeOfContents(m_frame->document()); | 
| 2248         resultRange = findPlainText(searchRange.get(), target, options); | 2248         resultRange = findPlainText(searchRange.get(), target, options); | 
| 2249         // We used to return false here if we ended up with the same range that 
      we started with | 2249         // We used to return false here if we ended up with the same range that 
      we started with | 
| 2250         // (e.g., the reference range was already the only instance of this text
      ). But we decided that | 2250         // (e.g., the reference range was already the only instance of this text
      ). But we decided that | 
| 2251         // this should be a success case instead, so we'll just fall through in 
      that case. | 2251         // this should be a success case instead, so we'll just fall through in 
      that case. | 
| 2252     } | 2252     } | 
| 2253 | 2253 | 
| 2254     return resultRange->collapsed(ASSERT_NO_EXCEPTION_STATE) ? 0 : resultRange.r
      elease(); | 2254     return resultRange->collapsed(ASSERT_NO_EXCEPTION) ? 0 : resultRange.release
      (); | 
| 2255 } | 2255 } | 
| 2256 | 2256 | 
| 2257 void Editor::setMarkedTextMatchesAreHighlighted(bool flag) | 2257 void Editor::setMarkedTextMatchesAreHighlighted(bool flag) | 
| 2258 { | 2258 { | 
| 2259     if (flag == m_areMarkedTextMatchesHighlighted) | 2259     if (flag == m_areMarkedTextMatchesHighlighted) | 
| 2260         return; | 2260         return; | 
| 2261 | 2261 | 
| 2262     m_areMarkedTextMatchesHighlighted = flag; | 2262     m_areMarkedTextMatchesHighlighted = flag; | 
| 2263     m_frame->document()->markers()->repaintMarkers(DocumentMarker::TextMatch); | 2263     m_frame->document()->markers()->repaintMarkers(DocumentMarker::TextMatch); | 
| 2264 } | 2264 } | 
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2378     return WebCore::unifiedTextCheckerEnabled(m_frame); | 2378     return WebCore::unifiedTextCheckerEnabled(m_frame); | 
| 2379 } | 2379 } | 
| 2380 | 2380 | 
| 2381 void Editor::toggleOverwriteModeEnabled() | 2381 void Editor::toggleOverwriteModeEnabled() | 
| 2382 { | 2382 { | 
| 2383     m_overwriteModeEnabled = !m_overwriteModeEnabled; | 2383     m_overwriteModeEnabled = !m_overwriteModeEnabled; | 
| 2384     frame()->selection()->setShouldShowBlockCursor(m_overwriteModeEnabled); | 2384     frame()->selection()->setShouldShowBlockCursor(m_overwriteModeEnabled); | 
| 2385 }; | 2385 }; | 
| 2386 | 2386 | 
| 2387 } // namespace WebCore | 2387 } // namespace WebCore | 
| OLD | NEW | 
|---|