OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2014 Google Inc. All rights reserved. | 2 * Copyright (C) 2014 Google 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 are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * 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 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 layer_tree_view_(nullptr), | 111 layer_tree_view_(nullptr), |
112 root_layer_(nullptr), | 112 root_layer_(nullptr), |
113 root_graphics_layer_(nullptr), | 113 root_graphics_layer_(nullptr), |
114 is_accelerated_compositing_active_(false), | 114 is_accelerated_compositing_active_(false), |
115 layer_tree_view_closed_(false), | 115 layer_tree_view_closed_(false), |
116 suppress_next_keypress_event_(false), | 116 suppress_next_keypress_event_(false), |
117 background_color_override_enabled_(false), | 117 background_color_override_enabled_(false), |
118 background_color_override_(Color::kTransparent), | 118 background_color_override_(Color::kTransparent), |
119 base_background_color_override_enabled_(false), | 119 base_background_color_override_enabled_(false), |
120 base_background_color_override_(Color::kTransparent), | 120 base_background_color_override_(Color::kTransparent), |
121 ime_accept_events_(true), | |
122 self_keep_alive_(this) { | 121 self_keep_alive_(this) { |
123 DCHECK(local_root_->GetFrame()->IsLocalRoot()); | 122 DCHECK(local_root_->GetFrame()->IsLocalRoot()); |
124 InitializeLayerTreeView(); | 123 InitializeLayerTreeView(); |
125 local_root_->SetFrameWidget(this); | 124 local_root_->SetFrameWidget(this); |
126 | 125 |
127 if (local_root->Parent()) | 126 if (local_root->Parent()) |
128 SetBackgroundColorOverride(Color::kTransparent); | 127 SetBackgroundColorOverride(Color::kTransparent); |
129 } | 128 } |
130 | 129 |
131 WebFrameWidgetImpl::~WebFrameWidgetImpl() {} | 130 WebFrameWidgetImpl::~WebFrameWidgetImpl() {} |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 UpdateBaseBackgroundColor(); | 453 UpdateBaseBackgroundColor(); |
455 } | 454 } |
456 | 455 |
457 void WebFrameWidgetImpl::UpdateBaseBackgroundColor() { | 456 void WebFrameWidgetImpl::UpdateBaseBackgroundColor() { |
458 local_root_->GetFrameView()->SetBaseBackgroundColor(BaseBackgroundColor()); | 457 local_root_->GetFrameView()->SetBaseBackgroundColor(BaseBackgroundColor()); |
459 } | 458 } |
460 | 459 |
461 WebInputMethodController* | 460 WebInputMethodController* |
462 WebFrameWidgetImpl::GetActiveWebInputMethodController() const { | 461 WebFrameWidgetImpl::GetActiveWebInputMethodController() const { |
463 WebLocalFrameBase* local_frame = | 462 WebLocalFrameBase* local_frame = |
464 WebLocalFrameBase::FromFrame(FocusedLocalFrameInWidget()); | 463 WebLocalFrameBase::FromFrame(FocusedLocalFrame()); |
465 return local_frame ? local_frame->GetInputMethodController() : nullptr; | 464 return local_frame ? local_frame->GetInputMethodController() : nullptr; |
466 } | 465 } |
467 | 466 |
468 void WebFrameWidgetImpl::ScheduleAnimation() { | 467 void WebFrameWidgetImpl::ScheduleAnimation() { |
469 if (layer_tree_view_) { | 468 if (layer_tree_view_) { |
470 layer_tree_view_->SetNeedsBeginFrame(); | 469 layer_tree_view_->SetNeedsBeginFrame(); |
471 return; | 470 return; |
472 } | 471 } |
473 DCHECK(client_); | 472 DCHECK(client_); |
474 client_->ScheduleAnimation(); | 473 client_->ScheduleAnimation(); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 // instead. Note that this has the side effect of moving the | 530 // instead. Note that this has the side effect of moving the |
532 // caret back to the beginning of the text. | 531 // caret back to the beginning of the text. |
533 Position position(element, 0); | 532 Position position(element, 0); |
534 focused_frame->Selection().SetSelection( | 533 focused_frame->Selection().SetSelection( |
535 SelectionInDOMTree::Builder().Collapse(position).Build()); | 534 SelectionInDOMTree::Builder().Collapse(position).Build()); |
536 } | 535 } |
537 } | 536 } |
538 } | 537 } |
539 ime_accept_events_ = true; | 538 ime_accept_events_ = true; |
540 } else { | 539 } else { |
541 LocalFrame* focused_frame = FocusedLocalFrameInWidget(); | 540 LocalFrame* focused_frame = FocusedLocalFrame(); |
542 if (focused_frame) { | 541 if (focused_frame) { |
543 // Finish an ongoing composition to delete the composition node. | 542 // Finish an ongoing composition to delete the composition node. |
544 if (focused_frame->GetInputMethodController().HasComposition()) { | 543 if (focused_frame->GetInputMethodController().HasComposition()) { |
545 // TODO(editing-dev): The use of | 544 // TODO(editing-dev): The use of |
546 // updateStyleAndLayoutIgnorePendingStylesheets needs to be audited. | 545 // updateStyleAndLayoutIgnorePendingStylesheets needs to be audited. |
547 // See http://crbug.com/590369 for more details. | 546 // See http://crbug.com/590369 for more details. |
548 focused_frame->GetDocument() | 547 focused_frame->GetDocument() |
549 ->UpdateStyleAndLayoutIgnorePendingStylesheets(); | 548 ->UpdateStyleAndLayoutIgnorePendingStylesheets(); |
550 | 549 |
551 focused_frame->GetInputMethodController().FinishComposingText( | 550 focused_frame->GetInputMethodController().FinishComposingText( |
552 InputMethodController::kKeepSelection); | 551 InputMethodController::kKeepSelection); |
553 } | 552 } |
554 ime_accept_events_ = false; | 553 ime_accept_events_ = false; |
555 } | 554 } |
556 } | 555 } |
557 } | 556 } |
558 | 557 |
559 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This | 558 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This |
560 // code needs to be refactored (http://crbug.com/629721). | 559 // code needs to be refactored (http://crbug.com/629721). |
561 WebRange WebFrameWidgetImpl::CompositionRange() { | 560 WebRange WebFrameWidgetImpl::CompositionRange() { |
562 LocalFrame* focused = FocusedLocalFrameAvailableForIme(); | 561 if (!ime_accept_events_) |
| 562 return WebRange(); |
| 563 |
| 564 LocalFrame* focused = FocusedLocalFrame(); |
563 if (!focused) | 565 if (!focused) |
564 return WebRange(); | 566 return WebRange(); |
565 | 567 |
566 const EphemeralRange range = | 568 const EphemeralRange range = |
567 focused->GetInputMethodController().CompositionEphemeralRange(); | 569 focused->GetInputMethodController().CompositionEphemeralRange(); |
568 if (range.IsNull()) | 570 if (range.IsNull()) |
569 return WebRange(); | 571 return WebRange(); |
570 | 572 |
571 Element* editable = | 573 Element* editable = |
572 focused->Selection().RootEditableElementOrDocumentElement(); | 574 focused->Selection().RootEditableElementOrDocumentElement(); |
(...skipping 12 matching lines...) Expand all Loading... |
585 if (!local_root_->GetFrameView()) | 587 if (!local_root_->GetFrameView()) |
586 return base_background_color_; | 588 return base_background_color_; |
587 LocalFrameView* view = local_root_->GetFrameView(); | 589 LocalFrameView* view = local_root_->GetFrameView(); |
588 return view->DocumentBackgroundColor().Rgb(); | 590 return view->DocumentBackgroundColor().Rgb(); |
589 } | 591 } |
590 | 592 |
591 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This | 593 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This |
592 // code needs to be refactored (http://crbug.com/629721). | 594 // code needs to be refactored (http://crbug.com/629721). |
593 bool WebFrameWidgetImpl::SelectionBounds(WebRect& anchor, | 595 bool WebFrameWidgetImpl::SelectionBounds(WebRect& anchor, |
594 WebRect& focus) const { | 596 WebRect& focus) const { |
595 const LocalFrame* local_frame = FocusedLocalFrameInWidget(); | 597 const LocalFrame* local_frame = FocusedLocalFrame(); |
596 if (!local_frame) | 598 if (!local_frame) |
597 return false; | 599 return false; |
598 | 600 |
599 FrameSelection& selection = local_frame->Selection(); | 601 FrameSelection& selection = local_frame->Selection(); |
600 if (!selection.IsAvailable() || selection.GetSelectionInDOMTree().IsNone()) | 602 if (!selection.IsAvailable() || selection.GetSelectionInDOMTree().IsNone()) |
601 return false; | 603 return false; |
602 | 604 |
603 // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets | 605 // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets |
604 // needs to be audited. See http://crbug.com/590369 for more details. | 606 // needs to be audited. See http://crbug.com/590369 for more details. |
605 local_frame->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets(); | 607 local_frame->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets(); |
(...skipping 28 matching lines...) Expand all Loading... |
634 | 636 |
635 if (!selection.ComputeVisibleSelectionInDOMTree().IsBaseFirst()) | 637 if (!selection.ComputeVisibleSelectionInDOMTree().IsBaseFirst()) |
636 std::swap(anchor, focus); | 638 std::swap(anchor, focus); |
637 return true; | 639 return true; |
638 } | 640 } |
639 | 641 |
640 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This | 642 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This |
641 // code needs to be refactored (http://crbug.com/629721). | 643 // code needs to be refactored (http://crbug.com/629721). |
642 bool WebFrameWidgetImpl::SelectionTextDirection(WebTextDirection& start, | 644 bool WebFrameWidgetImpl::SelectionTextDirection(WebTextDirection& start, |
643 WebTextDirection& end) const { | 645 WebTextDirection& end) const { |
644 const LocalFrame* frame = FocusedLocalFrameInWidget(); | 646 const LocalFrame* frame = FocusedLocalFrame(); |
645 if (!frame) | 647 if (!frame) |
646 return false; | 648 return false; |
647 | 649 |
648 FrameSelection& selection = frame->Selection(); | 650 FrameSelection& selection = frame->Selection(); |
649 if (!selection.IsAvailable()) | 651 if (!selection.IsAvailable()) |
650 return false; | 652 return false; |
651 | 653 |
652 // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets | 654 // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets |
653 // needs to be audited. See http://crbug.com/590369 for more details. | 655 // needs to be audited. See http://crbug.com/590369 for more details. |
654 frame->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets(); | 656 frame->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets(); |
655 | 657 |
656 if (selection.ComputeVisibleSelectionInDOMTree() | 658 if (selection.ComputeVisibleSelectionInDOMTree() |
657 .ToNormalizedEphemeralRange() | 659 .ToNormalizedEphemeralRange() |
658 .IsNull()) | 660 .IsNull()) |
659 return false; | 661 return false; |
660 start = ToWebTextDirection(PrimaryDirectionOf( | 662 start = ToWebTextDirection(PrimaryDirectionOf( |
661 *selection.ComputeVisibleSelectionInDOMTree().Start().AnchorNode())); | 663 *selection.ComputeVisibleSelectionInDOMTree().Start().AnchorNode())); |
662 end = ToWebTextDirection(PrimaryDirectionOf( | 664 end = ToWebTextDirection(PrimaryDirectionOf( |
663 *selection.ComputeVisibleSelectionInDOMTree().End().AnchorNode())); | 665 *selection.ComputeVisibleSelectionInDOMTree().End().AnchorNode())); |
664 return true; | 666 return true; |
665 } | 667 } |
666 | 668 |
667 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This | 669 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This |
668 // code needs to be refactored (http://crbug.com/629721). | 670 // code needs to be refactored (http://crbug.com/629721). |
669 bool WebFrameWidgetImpl::IsSelectionAnchorFirst() const { | 671 bool WebFrameWidgetImpl::IsSelectionAnchorFirst() const { |
670 if (const LocalFrame* frame = FocusedLocalFrameInWidget()) { | 672 if (const LocalFrame* frame = FocusedLocalFrame()) { |
671 FrameSelection& selection = frame->Selection(); | 673 FrameSelection& selection = frame->Selection(); |
672 return selection.IsAvailable() && | 674 return selection.IsAvailable() && |
673 selection.ComputeVisibleSelectionInDOMTreeDeprecated().IsBaseFirst(); | 675 selection.ComputeVisibleSelectionInDOMTreeDeprecated().IsBaseFirst(); |
674 } | 676 } |
675 return false; | 677 return false; |
676 } | 678 } |
677 | 679 |
678 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This | 680 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This |
679 // code needs to be refactored (http://crbug.com/629721). | 681 // code needs to be refactored (http://crbug.com/629721). |
680 WebRange WebFrameWidgetImpl::CaretOrSelectionRange() { | 682 WebRange WebFrameWidgetImpl::CaretOrSelectionRange() { |
681 LocalFrame* focused = FocusedLocalFrameInWidget(); | 683 LocalFrame* focused = FocusedLocalFrame(); |
682 if (!focused) | 684 if (!focused) |
683 return WebRange(); | 685 return WebRange(); |
684 | 686 |
685 // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets | 687 // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets |
686 // needs to be audited. See http://crbug.com/590369 for more details. | 688 // needs to be audited. See http://crbug.com/590369 for more details. |
687 focused->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets(); | 689 focused->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets(); |
688 | 690 |
689 return focused->GetInputMethodController().GetSelectionOffsets(); | 691 return focused->GetInputMethodController().GetSelectionOffsets(); |
690 } | 692 } |
691 | 693 |
692 void WebFrameWidgetImpl::SetTextDirection(WebTextDirection direction) { | 694 void WebFrameWidgetImpl::SetTextDirection(WebTextDirection direction) { |
693 // The Editor::setBaseWritingDirection() function checks if we can change | 695 // The Editor::setBaseWritingDirection() function checks if we can change |
694 // the text direction of the selected node and updates its DOM "dir" | 696 // the text direction of the selected node and updates its DOM "dir" |
695 // attribute and its CSS "direction" property. | 697 // attribute and its CSS "direction" property. |
696 // So, we just call the function as Safari does. | 698 // So, we just call the function as Safari does. |
697 const LocalFrame* focused = FocusedLocalFrameInWidget(); | 699 const LocalFrame* focused = FocusedLocalFrame(); |
698 if (!focused) | 700 if (!focused) |
699 return; | 701 return; |
700 | 702 |
701 Editor& editor = focused->GetEditor(); | 703 Editor& editor = focused->GetEditor(); |
702 if (!editor.CanEdit()) | 704 if (!editor.CanEdit()) |
703 return; | 705 return; |
704 | 706 |
705 switch (direction) { | 707 switch (direction) { |
706 case kWebTextDirectionDefault: | 708 case kWebTextDirectionDefault: |
707 editor.SetBaseWritingDirection(NaturalWritingDirection); | 709 editor.SetBaseWritingDirection(NaturalWritingDirection); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
739 } | 741 } |
740 | 742 |
741 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This | 743 // TODO(ekaramad):This method is almost duplicated in WebViewImpl as well. This |
742 // code needs to be refactored (http://crbug.com/629721). | 744 // code needs to be refactored (http://crbug.com/629721). |
743 bool WebFrameWidgetImpl::GetCompositionCharacterBounds( | 745 bool WebFrameWidgetImpl::GetCompositionCharacterBounds( |
744 WebVector<WebRect>& bounds) { | 746 WebVector<WebRect>& bounds) { |
745 WebRange range = CompositionRange(); | 747 WebRange range = CompositionRange(); |
746 if (range.IsEmpty()) | 748 if (range.IsEmpty()) |
747 return false; | 749 return false; |
748 | 750 |
749 LocalFrame* frame = FocusedLocalFrameInWidget(); | 751 LocalFrame* frame = FocusedLocalFrame(); |
750 if (!frame) | 752 if (!frame) |
751 return false; | 753 return false; |
752 | 754 |
753 WebLocalFrameBase* web_local_frame = WebLocalFrameBase::FromFrame(frame); | 755 WebLocalFrameBase* web_local_frame = WebLocalFrameBase::FromFrame(frame); |
754 size_t character_count = range.length(); | 756 size_t character_count = range.length(); |
755 size_t offset = range.StartOffset(); | 757 size_t offset = range.StartOffset(); |
756 WebVector<WebRect> result(character_count); | 758 WebVector<WebRect> result(character_count); |
757 WebRect webrect; | 759 WebRect webrect; |
758 for (size_t i = 0; i < character_count; ++i) { | 760 for (size_t i = 0; i < character_count; ++i) { |
759 if (!web_local_frame->FirstRectForCharacterRange(offset + i, 1, webrect)) { | 761 if (!web_local_frame->FirstRectForCharacterRange(offset + i, 1, webrect)) { |
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1186 const IntPoint& pos_in_root_frame) { | 1188 const IntPoint& pos_in_root_frame) { |
1187 IntPoint doc_point( | 1189 IntPoint doc_point( |
1188 local_root_->GetFrame()->View()->RootFrameToContents(pos_in_root_frame)); | 1190 local_root_->GetFrame()->View()->RootFrameToContents(pos_in_root_frame)); |
1189 HitTestResult result = | 1191 HitTestResult result = |
1190 local_root_->GetFrame()->GetEventHandler().HitTestResultAtPoint( | 1192 local_root_->GetFrame()->GetEventHandler().HitTestResultAtPoint( |
1191 doc_point, HitTestRequest::kReadOnly | HitTestRequest::kActive); | 1193 doc_point, HitTestRequest::kReadOnly | HitTestRequest::kActive); |
1192 result.SetToShadowHostIfInRestrictedShadowRoot(); | 1194 result.SetToShadowHostIfInRestrictedShadowRoot(); |
1193 return result; | 1195 return result; |
1194 } | 1196 } |
1195 | 1197 |
1196 LocalFrame* WebFrameWidgetImpl::FocusedLocalFrameInWidget() const { | |
1197 LocalFrame* frame = GetPage()->GetFocusController().FocusedFrame(); | |
1198 return (frame && frame->LocalFrameRoot() == local_root_->GetFrame()) | |
1199 ? frame | |
1200 : nullptr; | |
1201 } | |
1202 | |
1203 LocalFrame* WebFrameWidgetImpl::FocusedLocalFrameAvailableForIme() const { | |
1204 if (!ime_accept_events_) | |
1205 return nullptr; | |
1206 return FocusedLocalFrameInWidget(); | |
1207 } | |
1208 | |
1209 } // namespace blink | 1198 } // namespace blink |
OLD | NEW |