Changeset 185778 in webkit
- Timestamp:
- Jun 19, 2015, 4:40:32 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
page/mac/ServicesOverlayController.h (modified) (5 diffs)
-
page/mac/ServicesOverlayController.mm (modified) (18 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r185777 r185778 1 2015-06-19 Tim Horton <timothy_horton@apple.com> 2 3 Selection services cannot be invoked when force click is enabled 4 https://bugs.webkit.org/show_bug.cgi?id=146166 5 <rdar://problem/21468362> 6 7 Reviewed by Darin Adler. 8 9 * page/mac/ServicesOverlayController.h: 10 Turn Highlight::Type into something we can use for dirty flags. 11 12 * page/mac/ServicesOverlayController.mm: 13 (WebCore::ServicesOverlayController::Highlight::createForSelection): 14 (WebCore::ServicesOverlayController::Highlight::createForTelephoneNumber): 15 (WebCore::ServicesOverlayController::ServicesOverlayController): 16 (WebCore::ServicesOverlayController::selectionRectsDidChange): 17 (WebCore::ServicesOverlayController::selectedTelephoneNumberRangesChanged): 18 (WebCore::ServicesOverlayController::invalidateHighlightsOfType): 19 (WebCore::ServicesOverlayController::buildPotentialHighlightsIfNeeded): 20 (WebCore::ServicesOverlayController::remainingTimeUntilHighlightShouldBeShown): 21 (WebCore::ServicesOverlayController::buildPhoneNumberHighlights): 22 (WebCore::ServicesOverlayController::buildSelectionHighlight): 23 (WebCore::ServicesOverlayController::findTelephoneNumberHighlightContainingSelectionHighlight): 24 (WebCore::ServicesOverlayController::determineActiveHighlight): 25 (WebCore::ServicesOverlayController::didScrollFrame): 26 (WebCore::ServicesOverlayController::handleClick): 27 Coalesce highlight rebuilding so that things (like TextIndicator creation) 28 that change the selection and then reset it immediately don't cause us 29 to lose the active highlight. 30 31 This also means that if the selection changes multiple times in a runloop 32 (easily possible from script), we won't waste a lot of time rebuilding highlights. 33 34 (WebCore::ServicesOverlayController::didRebuildPotentialHighlights): 35 Merged into buildPotentialHighlightsIfNeeded. 36 1 37 2015-06-19 Matt Baker <mattbaker@apple.com> 2 38 -
trunk/Source/WebCore/page/mac/ServicesOverlayController.h
r184066 r185778 68 68 GraphicsLayer* layer() const { return m_graphicsLayer.get(); } 69 69 70 enum class Type{71 TelephoneNumber ,72 Selection 70 enum { 71 TelephoneNumberType = 1 << 0, 72 SelectionType = 1 << 1, 73 73 }; 74 typedef uint8_t Type; 74 75 Type type() const { return m_type; } 75 76 … … 109 110 void drawHighlight(Highlight&, GraphicsContext&); 110 111 112 void invalidateHighlightsOfType(Highlight::Type); 113 void buildPotentialHighlightsIfNeeded(); 114 111 115 void replaceHighlightsOfTypePreservingEquivalentHighlights(HashSet<RefPtr<Highlight>>&, Highlight::Type); 112 116 void removeAllPotentialHighlightsOfType(Highlight::Type); 113 117 void buildPhoneNumberHighlights(); 114 118 void buildSelectionHighlight(); 115 void didRebuildPotentialHighlights();116 119 117 120 void determineActiveHighlight(bool& mouseIsOverButton); … … 138 141 139 142 MainFrame& m_mainFrame; 140 PageOverlay* m_servicesOverlay ;143 PageOverlay* m_servicesOverlay { nullptr }; 141 144 142 145 RefPtr<Highlight> m_activeHighlight; … … 149 152 // FIXME: These should move onto Highlight. 150 153 Vector<LayoutRect> m_currentSelectionRects; 151 bool m_isTextOnly; 154 bool m_isTextOnly { false }; 155 156 Highlight::Type m_dirtyHighlightTypes { 0 }; 152 157 153 158 std::chrono::steady_clock::time_point m_lastSelectionChangeTime; … … 159 164 160 165 Timer m_determineActiveHighlightTimer; 166 Timer m_buildHighlightsTimer; 161 167 }; 162 168 -
trunk/Source/WebCore/page/mac/ServicesOverlayController.mm
r184066 r185778 58 58 Ref<ServicesOverlayController::Highlight> ServicesOverlayController::Highlight::createForSelection(ServicesOverlayController& controller, RetainPtr<DDHighlightRef> ddHighlight, PassRefPtr<Range> range) 59 59 { 60 return adoptRef(*new Highlight(controller, Type::Selection, ddHighlight, range));60 return adoptRef(*new Highlight(controller, Highlight::SelectionType, ddHighlight, range)); 61 61 } 62 62 63 63 Ref<ServicesOverlayController::Highlight> ServicesOverlayController::Highlight::createForTelephoneNumber(ServicesOverlayController& controller, RetainPtr<DDHighlightRef> ddHighlight, PassRefPtr<Range> range) 64 64 { 65 return adoptRef(*new Highlight(controller, Type::TelephoneNumber, ddHighlight, range));65 return adoptRef(*new Highlight(controller, Highlight::TelephoneNumberType, ddHighlight, range)); 66 66 } 67 67 … … 205 205 ServicesOverlayController::ServicesOverlayController(MainFrame& mainFrame) 206 206 : m_mainFrame(mainFrame) 207 , m_servicesOverlay(nullptr)208 , m_isTextOnly(false)209 207 , m_determineActiveHighlightTimer(*this, &ServicesOverlayController::determineActiveHighlightTimerFired) 208 , m_buildHighlightsTimer(*this, &ServicesOverlayController::buildPotentialHighlightsIfNeeded) 210 209 { 211 210 } … … 380 379 381 380 LOG(Services, "ServicesOverlayController - Selection rects changed - Now have %lu\n", rects.size()); 382 383 buildSelectionHighlight(); 381 invalidateHighlightsOfType(Highlight::SelectionType); 384 382 #else 385 383 UNUSED_PARAM(rects); … … 393 391 #if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED > 1090 394 392 LOG(Services, "ServicesOverlayController - Telephone number ranges changed\n"); 395 buildPhoneNumberHighlights();393 invalidateHighlightsOfType(Highlight::TelephoneNumberType); 396 394 #endif 395 } 396 397 void ServicesOverlayController::invalidateHighlightsOfType(Highlight::Type type) 398 { 399 if (!m_mainFrame.settings().serviceControlsEnabled()) 400 return; 401 402 m_dirtyHighlightTypes |= type; 403 m_buildHighlightsTimer.startOneShot(0); 404 } 405 406 void ServicesOverlayController::buildPotentialHighlightsIfNeeded() 407 { 408 if (!m_dirtyHighlightTypes) 409 return; 410 411 if (m_dirtyHighlightTypes & Highlight::TelephoneNumberType) 412 buildPhoneNumberHighlights(); 413 414 if (m_dirtyHighlightTypes & Highlight::SelectionType) 415 buildSelectionHighlight(); 416 417 m_dirtyHighlightTypes = 0; 418 419 if (m_potentialHighlights.isEmpty()) { 420 if (m_servicesOverlay) 421 m_mainFrame.pageOverlayController().uninstallPageOverlay(m_servicesOverlay, PageOverlay::FadeMode::DoNotFade); 422 return; 423 } 424 425 if (telephoneNumberRangesForFocusedFrame().isEmpty() && !hasRelevantSelectionServices()) 426 return; 427 428 createOverlayIfNeeded(); 429 430 bool mouseIsOverButton; 431 determineActiveHighlight(mouseIsOverButton); 397 432 } 398 433 … … 420 455 // by virtue of being expanded to include the entire telephone number. However, we will still avoid highlighting 421 456 // telephone numbers while the mouse is down. 422 if (highlight->type() == Highlight::T ype::TelephoneNumber)457 if (highlight->type() == Highlight::TelephoneNumberType) 423 458 return mousePressed ? minimumTimeUntilHighlightShouldBeShown : 0_ms; 424 459 … … 466 501 void ServicesOverlayController::buildPhoneNumberHighlights() 467 502 { 468 if (!m_mainFrame.settings().serviceControlsEnabled())469 return;470 471 503 Vector<RefPtr<Range>> phoneNumberRanges; 472 504 for (Frame* frame = &m_mainFrame; frame; frame = frame->tree().traverseNext()) … … 474 506 475 507 if (phoneNumberRanges.isEmpty()) { 476 removeAllPotentialHighlightsOfType(Highlight::Type::TelephoneNumber); 477 didRebuildPotentialHighlights(); 508 removeAllPotentialHighlightsOfType(Highlight::TelephoneNumberType); 478 509 return; 479 510 } … … 506 537 } 507 538 508 replaceHighlightsOfTypePreservingEquivalentHighlights(newPotentialHighlights, Highlight::Type::TelephoneNumber); 509 510 didRebuildPotentialHighlights(); 539 replaceHighlightsOfTypePreservingEquivalentHighlights(newPotentialHighlights, Highlight::TelephoneNumberType); 511 540 } 512 541 513 542 void ServicesOverlayController::buildSelectionHighlight() 514 543 { 515 if (!m_mainFrame.settings().serviceControlsEnabled())516 return;517 518 544 if (m_currentSelectionRects.isEmpty()) { 519 removeAllPotentialHighlightsOfType(Highlight::Type::Selection); 520 didRebuildPotentialHighlights(); 545 removeAllPotentialHighlightsOfType(Highlight::SelectionType); 521 546 return; 522 547 } … … 556 581 } 557 582 558 replaceHighlightsOfTypePreservingEquivalentHighlights(newPotentialHighlights, Highlight::Type::Selection); 559 560 didRebuildPotentialHighlights(); 583 replaceHighlightsOfTypePreservingEquivalentHighlights(newPotentialHighlights, Highlight::SelectionType); 561 584 } 562 585 … … 596 619 } 597 620 598 void ServicesOverlayController::didRebuildPotentialHighlights()599 {600 if (m_potentialHighlights.isEmpty()) {601 if (m_servicesOverlay)602 m_mainFrame.pageOverlayController().uninstallPageOverlay(m_servicesOverlay, PageOverlay::FadeMode::DoNotFade);603 return;604 }605 606 if (telephoneNumberRangesForFocusedFrame().isEmpty() && !hasRelevantSelectionServices())607 return;608 609 createOverlayIfNeeded();610 611 bool mouseIsOverButton;612 determineActiveHighlight(mouseIsOverButton);613 }614 615 621 void ServicesOverlayController::createOverlayIfNeeded() 616 622 { … … 651 657 ServicesOverlayController::Highlight* ServicesOverlayController::findTelephoneNumberHighlightContainingSelectionHighlight(Highlight& selectionHighlight) 652 658 { 653 if (selectionHighlight.type() != Highlight:: Type::Selection)659 if (selectionHighlight.type() != Highlight::SelectionType) 654 660 return nullptr; 655 661 … … 667 673 668 674 for (auto& highlight : m_potentialHighlights) { 669 if (highlight->type() != Highlight::T ype::TelephoneNumber)675 if (highlight->type() != Highlight::TelephoneNumberType) 670 676 continue; 671 677 … … 679 685 void ServicesOverlayController::determineActiveHighlight(bool& mouseIsOverActiveHighlightButton) 680 686 { 687 buildPotentialHighlightsIfNeeded(); 688 681 689 mouseIsOverActiveHighlightButton = false; 682 690 … … 684 692 685 693 for (auto& highlight : m_potentialHighlights) { 686 if (highlight->type() == Highlight:: Type::Selection) {694 if (highlight->type() == Highlight::SelectionType) { 687 695 // If we've already found a new active highlight, and it's 688 696 // a telephone number highlight, prefer that over this selection highlight. 689 if (newActiveHighlight && newActiveHighlight->type() == Highlight::T ype::TelephoneNumber)697 if (newActiveHighlight && newActiveHighlight->type() == Highlight::TelephoneNumberType) 690 698 continue; 691 699 … … 706 714 // If our new active highlight is a selection highlight that is completely contained 707 715 // by one of the phone number highlights, we'll make the phone number highlight active even if it's not hovered. 708 if (newActiveHighlight && newActiveHighlight->type() == Highlight:: Type::Selection) {716 if (newActiveHighlight && newActiveHighlight->type() == Highlight::SelectionType) { 709 717 if (Highlight* containedTelephoneNumberHighlight = findTelephoneNumberHighlightContainingSelectionHighlight(*newActiveHighlight)) { 710 718 newActiveHighlight = containedTelephoneNumberHighlight; … … 802 810 return; 803 811 804 buildPhoneNumberHighlights(); 805 buildSelectionHighlight(); 812 invalidateHighlightsOfType(Highlight::TelephoneNumberType); 813 invalidateHighlightsOfType(Highlight::SelectionType); 814 buildPotentialHighlightsIfNeeded(); 806 815 807 816 bool mouseIsOverActiveHighlightButton; … … 821 830 IntPoint windowPoint = frameView->contentsToWindow(clickPoint); 822 831 823 if (highlight.type() == Highlight:: Type::Selection) {832 if (highlight.type() == Highlight::SelectionType) { 824 833 auto telephoneNumberRanges = telephoneNumberRangesForFocusedFrame(); 825 834 Vector<String> selectedTelephoneNumbers; … … 829 838 830 839 page->chrome().client().handleSelectionServiceClick(page->focusController().focusedOrMainFrame().selection(), selectedTelephoneNumbers, windowPoint); 831 } else if (highlight.type() == Highlight::T ype::TelephoneNumber)840 } else if (highlight.type() == Highlight::TelephoneNumberType) 832 841 page->chrome().client().handleTelephoneNumberClick(highlight.range()->text(), windowPoint); 833 842 }
Note:
See TracChangeset
for help on using the changeset viewer.