1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef FOUNDATION_ACE_FRAMEWORKS_BRIDGE_COMMON_DOM_DOM_NODE_H 17 #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_COMMON_DOM_DOM_NODE_H 18 19 #include <string> 20 #include <unordered_map> 21 22 #include "base/geometry/transform_util.h" 23 #include "base/json/json_util.h" 24 #include "base/memory/ace_type.h" 25 #include "base/utils/macros.h" 26 #include "core/animation/animation_util.h" 27 #include "core/animation/keyframe_animation.h" 28 #include "core/animation/property_animation.h" 29 #include "core/components/box/box_component.h" 30 #include "core/components/common/properties/shadow.h" 31 #include "core/components/declaration/common/declaration_creator_manager.h" 32 #include "core/components/display/display_component.h" 33 #include "core/components/flex/flex_component.h" 34 #include "core/components/flex/flex_item_component.h" 35 #include "core/components/focusable/focusable_component.h" 36 #include "core/components/gesture_listener/gesture_listener_component.h" 37 #include "core/components/list/list_component.h" 38 #include "core/components/mouse_listener/mouse_listener_component.h" 39 #include "core/components/page_transition/page_transition_component.h" 40 #include "core/components/positioned/positioned_component.h" 41 #include "core/components/shared_transition/shared_transition_component.h" 42 #include "core/components/stack/stack_component.h" 43 #include "core/components/swiper/swiper_component.h" 44 #include "core/components/theme/theme_utils.h" 45 #include "core/components/touch_listener/touch_listener_component.h" 46 #include "core/components/transform/transform_component.h" 47 #include "core/components/transition/transition_component.h" 48 #include "core/components/tween/tween_component.h" 49 #include "core/pipeline/pipeline_context.h" 50 #include "frameworks/bridge/common/dom/dom_type.h" 51 #include "frameworks/bridge/common/utils/transform_convertor.h" 52 #include "frameworks/core/animation/animatable_data.h" 53 54 #ifndef WEARABLE_PRODUCT 55 #include "core/components/multimodal/multimodal_component.h" 56 #endif 57 58 namespace OHOS::Ace::Framework { 59 60 // If no insertion location is specified, new child will be added to the end of children list by default. 61 inline constexpr int32_t DEFAULT_ITEM_INDEX = -1; 62 63 class ACE_EXPORT DOMNode : public virtual AceType { 64 DECLARE_ACE_TYPE(DOMNode, AceType); 65 66 public: 67 DOMNode(NodeId nodeId, const std::string& nodeName); 68 ~DOMNode() override; 69 70 void SetAnimationStyle(const std::vector<std::unordered_map<std::string, std::string>>& animationKeyframes); 71 bool ParseAnimationStyle(const std::vector<std::unordered_map<std::string, std::string>>& animationKeyframes); 72 void SetSharedTransitionStyle(const std::vector<std::unordered_map<std::string, std::string>>& animationKeyframes); 73 bool ParseTransitionPropertyStyle(const std::string& transitionProperty); 74 bool ParseTransitionNameStyle(const std::string& transitionName); 75 void CreateDeclaration(const std::string& tag); 76 void TweenOptionSetKeyframes(TweenOption& tweenOption); 77 void SetCustomAnimationStyleUpdate(bool enable); 78 void AddNode(const RefPtr<DOMNode>& node, int32_t slot = DEFAULT_ITEM_INDEX); 79 void RemoveNode(const RefPtr<DOMNode>& node); 80 virtual void Mount(int32_t slot); 81 void GenerateComponentNode(); OnPageLoadFinish()82 virtual void OnPageLoadFinish() {} 83 84 virtual void SetShowAttr(const std::string& showValue); 85 GetScrollComponent()86 virtual const RefPtr<ScrollComponent>& GetScrollComponent() const 87 { 88 return scrollComponent_; 89 } 90 91 void MarkNeedUpdate(); 92 SetTweenComponent(const RefPtr<TweenComponent> & tweenComponent)93 void SetTweenComponent(const RefPtr<TweenComponent>& tweenComponent) 94 { 95 tweenComponent_ = tweenComponent; 96 if (!displayComponent_) { 97 displayComponent_ = AceType::MakeRefPtr<DisplayComponent>(rootComponent_->GetChild()); 98 } 99 if (!transformComponent_) { 100 transformComponent_ = AceType::MakeRefPtr<TransformComponent>(); 101 } 102 } 103 GetTweenComponent()104 RefPtr<TweenComponent> GetTweenComponent() const 105 { 106 return tweenComponent_; 107 } 108 GetChildList()109 const std::list<RefPtr<DOMNode>>& GetChildList() const 110 { 111 return children_; 112 } 113 GetDeclaration()114 const RefPtr<Declaration>& GetDeclaration() const 115 { 116 return declaration_; 117 } 118 GetRootComponent()119 const RefPtr<ComposedComponent>& GetRootComponent() const 120 { 121 return rootComponent_; 122 } 123 GetBoxComponent()124 const RefPtr<BoxComponent>& GetBoxComponent() const 125 { 126 return boxComponent_; 127 } 128 GetDisplayComponent()129 const RefPtr<DisplayComponent>& GetDisplayComponent() const 130 { 131 return displayComponent_; 132 } 133 GetTouchListenerComponent()134 const RefPtr<TouchListenerComponent>& GetTouchListenerComponent() const 135 { 136 return touchEventComponent_; 137 } 138 GetMouseListenerComponent()139 const RefPtr<MouseListenerComponent>& GetMouseListenerComponent() const 140 { 141 return mouseEventComponent_; 142 } 143 GetGestureListenerComponent()144 const RefPtr<GestureListenerComponent>& GetGestureListenerComponent() const 145 { 146 return gestureEventComponent_; 147 } 148 GetFocusableComponent()149 const RefPtr<FocusableComponent>& GetFocusableComponent() const 150 { 151 return focusableEventComponent_; 152 } 153 GetTransformComponent()154 const RefPtr<TransformComponent>& GetTransformComponent() const 155 { 156 return transformComponent_; 157 } 158 SetShareId(const std::string & shareId)159 void SetShareId(const std::string& shareId) 160 { 161 shareId_ = shareId; 162 if (declaration_) { 163 declaration_->SetShareId(shareId); 164 } 165 } 166 GetShareId()167 const std::string& GetShareId() const 168 { 169 return shareId_; 170 } 171 172 const RefPtr<PageTransitionComponent>& BuildTransitionComponent(); 173 174 // Ensure DOMPopup can response onClick event even without defining it. SetOnClick(const EventMarker & eventMarker)175 void SetOnClick(const EventMarker& eventMarker) 176 { 177 ACE_DCHECK(gestureEventComponent_); 178 gestureEventComponent_->SetOnClickId(eventMarker); 179 } 180 SetOnDoubleClick(const EventMarker & eventMarker)181 void SetOnDoubleClick(const EventMarker& eventMarker) 182 { 183 ACE_DCHECK(gestureEventComponent_); 184 gestureEventComponent_->SetOnDoubleClickId(eventMarker); 185 } 186 SetOnDragStart(const EventMarker & eventMarker)187 void SetOnDragStart(const EventMarker& eventMarker) 188 { 189 gestureEventComponent_->SetOnFreeDragStartId(eventMarker); 190 } 191 SetOnDrag(const EventMarker & eventMarker)192 void SetOnDrag(const EventMarker& eventMarker) 193 { 194 gestureEventComponent_->SetOnFreeDragUpdateId(eventMarker); 195 } 196 SetOnDragEnd(const EventMarker & eventMarker)197 void SetOnDragEnd(const EventMarker& eventMarker) 198 { 199 gestureEventComponent_->SetOnFreeDragEndId(eventMarker); 200 } 201 SetOnLongPress(const EventMarker & eventMarker)202 void SetOnLongPress(const EventMarker& eventMarker) 203 { 204 ACE_DCHECK(gestureEventComponent_); 205 gestureEventComponent_->SetOnLongPressId(eventMarker); 206 } 207 SetOnPinchStart(const EventMarker & eventMarker)208 void SetOnPinchStart(const EventMarker& eventMarker) 209 { 210 gestureEventComponent_->SetOnPinchStartId(eventMarker); 211 } 212 SetOnPinchUpdate(const EventMarker & eventMarker)213 void SetOnPinchUpdate(const EventMarker& eventMarker) 214 { 215 gestureEventComponent_->SetOnPinchUpdateId(eventMarker); 216 } 217 SetOnPinchEnd(const EventMarker & eventMarker)218 void SetOnPinchEnd(const EventMarker& eventMarker) 219 { 220 gestureEventComponent_->SetOnPinchEndId(eventMarker); 221 } 222 SetOnPinchCancel(const EventMarker & eventMarker)223 void SetOnPinchCancel(const EventMarker& eventMarker) 224 { 225 gestureEventComponent_->SetOnPinchCancelId(eventMarker); 226 } 227 SetIsRootNode(bool isRootNode)228 void SetIsRootNode(bool isRootNode) 229 { 230 isRootNode_ = isRootNode; 231 } 232 IsRootNode()233 bool IsRootNode() const 234 { 235 return isRootNode_; 236 } 237 SetIsTransition(bool isTransition)238 void SetIsTransition(bool isTransition) 239 { 240 isTransition_ = isTransition; 241 } 242 GetIsTransition()243 bool GetIsTransition() const 244 { 245 return isTransition_; 246 } 247 248 void SetOnFocusClick(const EventMarker& eventMarker); 249 250 bool IsNodeDisabled() const; 251 SetIsEnter(bool isEnter)252 void SetIsEnter(bool isEnter) 253 { 254 isEnter_ = isEnter; 255 } 256 GetIsEnter()257 bool GetIsEnter() const 258 { 259 return isEnter_; 260 } 261 GetNodeId()262 NodeId GetNodeId() const 263 { 264 return nodeId_; 265 } 266 GetNodeIdForEvent()267 std::string GetNodeIdForEvent() const 268 { 269 return isRootNode_ ? DOM_DEFAULT_ROOT_NODE_ID : std::to_string(GetNodeId()); 270 } 271 GetTag()272 const std::string& GetTag() const 273 { 274 return tag_; 275 } 276 SetProxyNode(bool isProxy)277 void SetProxyNode(bool isProxy) 278 { 279 isProxy_ = isProxy; 280 } 281 IsProxy()282 bool IsProxy() const 283 { 284 return isProxy_; 285 } 286 IsShow()287 bool IsShow() const 288 { 289 double opacity = 1.0; 290 if (declaration_) { 291 auto& opacityStyle = 292 static_cast<CommonOpacityStyle&>(declaration_->GetStyle(StyleTag::COMMON_OPACITY_STYLE)); 293 if (opacityStyle.IsValid()) { 294 opacity = opacityStyle.opacity; 295 } 296 } 297 return visible_ == VisibleType::VISIBLE && !NearZero(opacity); 298 } 299 GetBackGroundColor()300 Color GetBackGroundColor() const 301 { 302 Color color = Color::TRANSPARENT; 303 if (declaration_ && isTransitionColor_) { 304 auto& style = 305 static_cast<CommonBackgroundStyle&>(declaration_->GetStyle(StyleTag::COMMON_BACKGROUND_STYLE)); 306 if (style.IsValid()) { 307 color = style.backgroundColor; 308 } 309 } 310 return color; 311 } 312 GetOpacity()313 double GetOpacity() const 314 { 315 double opacity = 1.0; 316 if (declaration_) { 317 auto& style = static_cast<CommonOpacityStyle&>(declaration_->GetStyle(StyleTag::COMMON_OPACITY_STYLE)); 318 if (style.IsValid()) { 319 opacity = style.opacity; 320 } 321 } 322 return opacity; 323 } 324 GetParentId()325 NodeId GetParentId() const 326 { 327 return parentId_; 328 } 329 GetParentNode()330 RefPtr<DOMNode> GetParentNode() const 331 { 332 return parentNode_.Upgrade(); 333 } 334 335 bool IsTabbarSubNode() const; 336 SetParentNode(const RefPtr<DOMNode> & parentNode)337 void SetParentNode(const RefPtr<DOMNode>& parentNode) 338 { 339 if (!parentNode) { 340 return; 341 } 342 parentNode_ = parentNode; 343 parentId_ = parentNode->GetNodeId(); 344 parentTag_ = parentNode->GetTag(); 345 346 if (tag_ == DOM_NODE_TAG_SVG || parentNode->HasSvgTag()) { 347 hasSvgTag_ = true; 348 } 349 } 350 GetPageId()351 int32_t GetPageId() const 352 { 353 return pageId_; 354 } SetPageId(int32_t pageId)355 void SetPageId(int32_t pageId) 356 { 357 pageId_ = pageId; 358 } 359 360 // Subclasses need to implement this interface to return their specialized components, which will be added to the 361 // last node of the component tree. 362 virtual RefPtr<Component> GetSpecializedComponent() = 0; 363 SetPipelineContext(const WeakPtr<PipelineContext> & pipelineContext)364 void SetPipelineContext(const WeakPtr<PipelineContext>& pipelineContext) 365 { 366 pipelineContext_ = pipelineContext; 367 } 368 GetPipelineContext()369 const WeakPtr<PipelineContext>& GetPipelineContext() const 370 { 371 return pipelineContext_; 372 } 373 374 // Initialize node theme style when created. InitializeStyle()375 virtual void InitializeStyle() {} 376 377 void OnActive(bool isActive); 378 HasPseudo()379 bool HasPseudo() const 380 { 381 return (cachedPseudoType_ != STATE_NORMAL); 382 } 383 HasDisabledPseudo()384 bool HasDisabledPseudo() const 385 { 386 return ((cachedPseudoType_ & STATE_DISABLED) > 0); 387 } 388 HasCheckedPseudo()389 bool HasCheckedPseudo() const 390 { 391 return ((cachedPseudoType_ & STATE_CHECKED) > 0); 392 } 393 HasFocusPseudo()394 bool HasFocusPseudo() const 395 { 396 return ((cachedPseudoType_ & STATE_FOCUS) > 0); 397 } 398 HasActivePseudo()399 bool HasActivePseudo() const 400 { 401 return ((cachedPseudoType_ & STATE_ACTIVE) > 0); 402 } 403 HasSvgTag()404 bool HasSvgTag() 405 { 406 return hasSvgTag_; 407 } 408 409 /* 410 * Parse color from string content and reference for id/attr, including format: 411 * #rrggbb, #aarrggbb, "@id001", "@attr_sys_color". 412 */ 413 Color ParseColor(const std::string& value, uint32_t maskAlpha = COLOR_ALPHA_MASK) const; 414 415 /* 416 * Parse double from string content and reference for id/attr, including format: 417 * 100.01, "@id001", "@attr_sys_alpha". 418 */ 419 double ParseDouble(const std::string& value) const; 420 421 /* 422 * Parse dimension from string content and reference for id/attr, including format: 423 * 10px, "@id001", "@attr_sys_dimension, expression". 424 */ 425 CalcDimension ParseDimension(const std::string& value) const; 426 427 /* 428 * Parse line height from string content and reference for id/attr, including format: 429 * 1.5, "@id001", "@attr_sys_line_height". 430 */ 431 Dimension ParseLineHeight(const std::string& value) const; 432 433 /* 434 * Parse font family list from string content and reference for id/attr, including format: 435 * sans-serif, "@id001", "@attr_sys_font_family". 436 */ 437 std::vector<std::string> ParseFontFamilies(const std::string& value) const; 438 439 /* 440 * Parse dimension list from string content and reference for id/attr, including format: 441 * 10px, "@id001", "@attr_sys_dimension". 442 */ 443 std::vector<Dimension> ParsePreferFontSizes(const std::string& value) const; 444 445 /* 446 * Parse image src from string content and reference for id/attr, including format: 447 * "@app.media.customized_image", "@sys.media.123". 448 */ 449 std::string ParseImageSrc(const std::string& imgSrc) const; 450 GetThemeManager()451 RefPtr<ThemeManager> GetThemeManager() const 452 { 453 auto context = pipelineContext_.Upgrade(); 454 if (!context) { 455 return nullptr; 456 } 457 return context->GetThemeManager(); 458 } 459 460 template<typename T> GetTheme()461 RefPtr<T> GetTheme() const 462 { 463 auto context = pipelineContext_.Upgrade(); 464 if (!context) { 465 return nullptr; 466 } 467 auto themeManager = context->GetThemeManager(); 468 if (!themeManager) { 469 return nullptr; 470 } 471 return themeManager->GetTheme<T>(); 472 } 473 474 virtual void UpdateStyleWithChildren(); 475 IsCustomComponent()476 bool IsCustomComponent() const 477 { 478 return isCustomComponent_; 479 } 480 SetIsCustomComponent(bool isCustomComponent)481 void SetIsCustomComponent(bool isCustomComponent) 482 { 483 isCustomComponent_ = isCustomComponent; 484 } 485 HasBorderRadiusStyle()486 bool HasBorderRadiusStyle() const 487 { 488 return declaration_ ? declaration_->HasBorderRadiusStyle() : false; 489 } 490 HasOverflowStyle()491 bool HasOverflowStyle() const 492 { 493 return declaration_ ? declaration_->HasOverflowStyle() : false; 494 } 495 IsBoxWrap()496 bool IsBoxWrap() const 497 { 498 return boxWrap_; 499 } 500 SetBoxWrap(bool boxWrap)501 void SetBoxWrap(bool boxWrap) 502 { 503 boxWrap_ = boxWrap; 504 } 505 506 void AdjustParamInLiteMode(); 507 AdjustSpecialParamInLiteMode()508 virtual void AdjustSpecialParamInLiteMode() {} 509 510 virtual void SetAttr(const std::vector<std::pair<std::string, std::string>>& attrs); 511 virtual void SetStyle(const std::vector<std::pair<std::string, std::string>>& styles); 512 virtual void AddEvent(int32_t pageId, const std::vector<std::string>& events); 513 virtual void CallMethod(const std::string& method, const std::string& args); 514 virtual void OnRequestFocus(bool shouldFocus); 515 virtual void OnScrollBy(double dx, double dy, bool isSmooth); 516 517 bool SetCurrentStyle(const std::pair<std::string, std::string>& style); 518 IsRightToLeft()519 bool IsRightToLeft() const 520 { 521 return declaration_ ? declaration_->IsRightToLeft() : false; 522 } 523 SetHeight(const CalcDimension & height)524 void SetHeight(const CalcDimension& height) 525 { 526 if (declaration_) { 527 auto& sizeStyle = declaration_->MaybeResetStyle<CommonSizeStyle>(StyleTag::COMMON_SIZE_STYLE); 528 if (sizeStyle.IsValid()) { 529 sizeStyle.height = height; 530 } 531 } 532 } 533 SetWidth(const CalcDimension & width)534 void SetWidth(const CalcDimension& width) 535 { 536 if (declaration_) { 537 auto& sizeStyle = declaration_->MaybeResetStyle<CommonSizeStyle>(StyleTag::COMMON_SIZE_STYLE); 538 if (sizeStyle.IsValid()) { 539 sizeStyle.width = width; 540 } 541 } 542 } 543 GetHeight()544 virtual Dimension GetHeight() const 545 { 546 Dimension height = Dimension(-1.0, DimensionUnit::PX); 547 if (declaration_) { 548 auto& sizeStyle = static_cast<CommonSizeStyle&>(declaration_->GetStyle(StyleTag::COMMON_SIZE_STYLE)); 549 if (sizeStyle.IsValid()) { 550 height = sizeStyle.height; 551 } 552 } 553 return height; 554 } 555 GetCalcHeight()556 virtual CalcDimension GetCalcHeight() const 557 { 558 CalcDimension height = Dimension(-1.0, DimensionUnit::PX); 559 if (declaration_) { 560 auto& sizeStyle = static_cast<CommonSizeStyle&>(declaration_->GetStyle(StyleTag::COMMON_SIZE_STYLE)); 561 if (sizeStyle.IsValid()) { 562 height = sizeStyle.height; 563 } 564 } 565 return height; 566 } 567 GetWidth()568 virtual Dimension GetWidth() const 569 { 570 Dimension width = Dimension(-1.0, DimensionUnit::PX); 571 if (declaration_) { 572 auto& sizeStyle = static_cast<CommonSizeStyle&>(declaration_->GetStyle(StyleTag::COMMON_SIZE_STYLE)); 573 if (sizeStyle.IsValid()) { 574 width = sizeStyle.width; 575 } 576 } 577 return width; 578 } 579 GetCalcWidth()580 virtual CalcDimension GetCalcWidth() const 581 { 582 CalcDimension width = Dimension(-1.0, DimensionUnit::PX); 583 if (declaration_) { 584 auto& sizeStyle = static_cast<CommonSizeStyle&>(declaration_->GetStyle(StyleTag::COMMON_SIZE_STYLE)); 585 if (sizeStyle.IsValid()) { 586 width = sizeStyle.width; 587 } 588 } 589 return width; 590 } 591 GetDisplay()592 DisplayType GetDisplay() const 593 { 594 DisplayType display = DisplayType::NO_SETTING; 595 if (declaration_) { 596 auto& displayStyle = 597 static_cast<CommonDisplayStyle&>(declaration_->GetStyle(StyleTag::COMMON_DISPLAY_STYLE)); 598 if (displayStyle.IsValid()) { 599 display = displayStyle.display; 600 } 601 } 602 return display; 603 } 604 SetDisplay(DisplayType type)605 void SetDisplay(DisplayType type) 606 { 607 if (declaration_) { 608 auto& displayStyle = declaration_->MaybeResetStyle<CommonDisplayStyle>(StyleTag::COMMON_DISPLAY_STYLE); 609 if (displayStyle.IsValid()) { 610 displayStyle.display = type; 611 } 612 } 613 } 614 GetPosition()615 PositionType GetPosition() const 616 { 617 PositionType position = PositionType::PTRELATIVE; 618 if (declaration_) { 619 auto& positionStyle = 620 static_cast<CommonPositionStyle&>(declaration_->GetStyle(StyleTag::COMMON_POSITION_STYLE)); 621 if (positionStyle.IsValid()) { 622 position = positionStyle.position; 623 } 624 } 625 return position; 626 } 627 GetImageFill()628 std::optional<Color> GetImageFill() const 629 { 630 std::optional<Color> imageFill = std::nullopt; 631 if (declaration_) { 632 auto& imageStyle = static_cast<CommonImageStyle&>(declaration_->GetStyle(StyleTag::COMMON_IMAGE_STYLE)); 633 if (imageStyle.IsValid()) { 634 imageFill = imageStyle.imageFill; 635 } 636 } 637 return imageFill; 638 } 639 GetDirtyNodeId()640 virtual NodeId GetDirtyNodeId() const 641 { 642 return nodeId_; 643 } 644 645 protected: OnMounted(const RefPtr<DOMNode> & parentNode)646 virtual void OnMounted(const RefPtr<DOMNode>& parentNode) {} OnChildNodeAdded(const RefPtr<DOMNode> & child,int32_t slot)647 virtual void OnChildNodeAdded(const RefPtr<DOMNode>& child, int32_t slot) {} OnChildNodeRemoved(const RefPtr<DOMNode> & child)648 virtual void OnChildNodeRemoved(const RefPtr<DOMNode>& child) {} OnSetStyleFinished()649 virtual void OnSetStyleFinished() {} 650 // Confirm declaration is exist before call GetClickId and GetLongPressId. GetClickId()651 virtual const EventMarker& GetClickId() 652 { 653 static EventMarker defaultMarker; 654 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 655 return gestureEvent.IsValid() ? gestureEvent.click.eventMarker : defaultMarker; 656 }; GetDoubleClickId()657 virtual const EventMarker& GetDoubleClickId() 658 { 659 static EventMarker defaultMarker; 660 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 661 return gestureEvent.IsValid() ? gestureEvent.doubleClick.eventMarker : defaultMarker; 662 }; GetDragStartId()663 const EventMarker& GetDragStartId() 664 { 665 static EventMarker defaultMarker; 666 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 667 return gestureEvent.IsValid() ? gestureEvent.dragStart.eventMarker : defaultMarker; 668 }; GetDragId()669 const EventMarker& GetDragId() 670 { 671 static EventMarker defaultMarker; 672 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 673 return gestureEvent.IsValid() ? gestureEvent.drag.eventMarker : defaultMarker; 674 }; GetDragEndId()675 const EventMarker& GetDragEndId() 676 { 677 static EventMarker defaultMarker; 678 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 679 return gestureEvent.IsValid() ? gestureEvent.dragEnd.eventMarker : defaultMarker; 680 }; GetDragEnterId()681 const EventMarker& GetDragEnterId() 682 { 683 static EventMarker defaultMarker; 684 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 685 return gestureEvent.IsValid() ? gestureEvent.dragEnter.eventMarker : defaultMarker; 686 }; GetDragOverId()687 const EventMarker& GetDragOverId() 688 { 689 static EventMarker defaultMarker; 690 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 691 return gestureEvent.IsValid() ? gestureEvent.dragOver.eventMarker : defaultMarker; 692 }; GetDragLeaveId()693 const EventMarker& GetDragLeaveId() 694 { 695 static EventMarker defaultMarker; 696 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 697 return gestureEvent.IsValid() ? gestureEvent.dragLeave.eventMarker : defaultMarker; 698 }; GetDragDropId()699 const EventMarker& GetDragDropId() 700 { 701 static EventMarker defaultMarker; 702 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 703 return gestureEvent.IsValid() ? gestureEvent.dragDrop.eventMarker : defaultMarker; 704 }; GetLongPressId()705 virtual const EventMarker& GetLongPressId() 706 { 707 static EventMarker defaultMarker; 708 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 709 return gestureEvent.IsValid() ? gestureEvent.longPress.eventMarker : defaultMarker; 710 }; GetPinchStartId()711 const EventMarker& GetPinchStartId() 712 { 713 static EventMarker defaultMarker; 714 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 715 return gestureEvent.IsValid() ? gestureEvent.pinchStart.eventMarker : defaultMarker; 716 }; GetPinchUpdateId()717 const EventMarker& GetPinchUpdateId() 718 { 719 static EventMarker defaultMarker; 720 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 721 return gestureEvent.IsValid() ? gestureEvent.pinchUpdate.eventMarker : defaultMarker; 722 }; GetPinchEndId()723 const EventMarker& GetPinchEndId() 724 { 725 static EventMarker defaultMarker; 726 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 727 return gestureEvent.IsValid() ? gestureEvent.pinchEnd.eventMarker : defaultMarker; 728 }; GetPinchCancelId()729 const EventMarker& GetPinchCancelId() 730 { 731 static EventMarker defaultMarker; 732 auto& gestureEvent = static_cast<CommonGestureEvent&>(declaration_->GetEvent(EventTag::COMMON_GESTURE_EVENT)); 733 return gestureEvent.IsValid() ? gestureEvent.pinchCancel.eventMarker : defaultMarker; 734 }; 735 GetSwipeId(uint32_t action,uint32_t stage)736 EventMarker& GetSwipeId(uint32_t action, uint32_t stage) 737 { 738 static EventMarker defaultMarker; 739 if (!declaration_) { 740 return defaultMarker; 741 } 742 auto& swipeEvent = declaration_->MaybeResetEvent<CommonSwipeEvent>(EventTag::COMMON_SWIPE_EVENT); 743 if (!swipeEvent.IsValid()) { 744 return defaultMarker; 745 } 746 if (action == EventAction::ON && stage == EventStage::CAPTURE) { 747 return swipeEvent.captureSwipe.eventMarker; 748 } else if (action == EventAction::CATCH && stage == EventStage::BUBBLE) { 749 return swipeEvent.catchBubbleSwipe.eventMarker; 750 } else if (action == EventAction::ON && stage == EventStage::BUBBLE) { 751 return swipeEvent.swipe.eventMarker; 752 } 753 return defaultMarker; 754 } 755 756 // Confirm declaration exist and support raw event before call GetTouchId. GetTouchId(uint32_t action,uint32_t stage,uint32_t type)757 EventMarker& GetTouchId(uint32_t action, uint32_t stage, uint32_t type) 758 { 759 static EventMarker defaultMarker; 760 if (!declaration_) { 761 return defaultMarker; 762 } 763 764 auto& rawEvent = declaration_->MaybeResetEvent<CommonRawEvent>(EventTag::COMMON_RAW_EVENT); 765 if (!rawEvent.IsValid()) { 766 return defaultMarker; 767 } 768 if (action == EventAction::ON && stage == EventStage::CAPTURE && type == EventType::TOUCH_CANCEL) { 769 return rawEvent.captureTouchCancel.eventMarker; 770 } else if (action == EventAction::ON && stage == EventStage::CAPTURE && type == EventType::TOUCH_UP) { 771 return rawEvent.captureTouchEnd.eventMarker; 772 } else if (action == EventAction::ON && stage == EventStage::CAPTURE && type == EventType::TOUCH_MOVE) { 773 return rawEvent.captureTouchMove.eventMarker; 774 } else if (action == EventAction::ON && stage == EventStage::CAPTURE && type == EventType::TOUCH_DOWN) { 775 return rawEvent.captureTouchStart.eventMarker; 776 } else if (action == EventAction::CATCH && stage == EventStage::BUBBLE && type == EventType::TOUCH_CANCEL) { 777 return rawEvent.catchBubbleTouchCancel.eventMarker; 778 } else if (action == EventAction::CATCH && stage == EventStage::BUBBLE && type == EventType::TOUCH_UP) { 779 return rawEvent.catchBubbleTouchEnd.eventMarker; 780 } else if (action == EventAction::CATCH && stage == EventStage::BUBBLE && type == EventType::TOUCH_MOVE) { 781 return rawEvent.catchBubbleTouchMove.eventMarker; 782 } else if (action == EventAction::CATCH && stage == EventStage::BUBBLE && type == EventType::TOUCH_DOWN) { 783 return rawEvent.catchBubbleTouchStart.eventMarker; 784 } else if (action == EventAction::CATCH && stage == EventStage::CAPTURE && type == EventType::TOUCH_CANCEL) { 785 return rawEvent.catchCaptureTouchCancel.eventMarker; 786 } else if (action == EventAction::CATCH && stage == EventStage::CAPTURE && type == EventType::TOUCH_UP) { 787 return rawEvent.catchCaptureTouchEnd.eventMarker; 788 } else if (action == EventAction::CATCH && stage == EventStage::CAPTURE && type == EventType::TOUCH_MOVE) { 789 return rawEvent.catchCaptureTouchMove.eventMarker; 790 } else if (action == EventAction::CATCH && stage == EventStage::CAPTURE && type == EventType::TOUCH_DOWN) { 791 return rawEvent.catchCaptureTouchStart.eventMarker; 792 } else if (action == EventAction::ON && stage == EventStage::BUBBLE && type == EventType::TOUCH_CANCEL) { 793 return rawEvent.touchCancel.eventMarker; 794 } else if (action == EventAction::ON && stage == EventStage::BUBBLE && type == EventType::TOUCH_UP) { 795 return rawEvent.touchEnd.eventMarker; 796 } else if (action == EventAction::ON && stage == EventStage::BUBBLE && type == EventType::TOUCH_MOVE) { 797 return rawEvent.touchMove.eventMarker; 798 } else if (action == EventAction::ON && stage == EventStage::BUBBLE && type == EventType::TOUCH_DOWN) { 799 return rawEvent.touchStart.eventMarker; 800 } 801 return defaultMarker; 802 } 803 804 // Subclasses need to implement this interface to composit specialized component into common components. 805 virtual RefPtr<Component> CompositeSpecializedComponent(const std::vector<RefPtr<SingleChild>>& components); 806 807 // Subclasses need to override this interface to update component with declaration. UpdateSpecializedComponentWithDeclaration()808 virtual void UpdateSpecializedComponentWithDeclaration() {} 809 810 // Subclasses need to override this interface to implement the dynamic creation of subclass specialized components. PrepareSpecializedComponent()811 virtual void PrepareSpecializedComponent() {} 812 813 virtual void CompositeComponents(); 814 815 virtual void UpdateBoxSize(const CalcDimension& width, const CalcDimension& height); 816 virtual void UpdateBoxPadding(const Edge& padding); 817 virtual void UpdateBoxBorder(const Border& border); 818 virtual void UpdatePropAnimations(const PropAnimationMap& animations); 819 virtual void UpdatePositionAnimations(const RefPtr<Component> component); 820 821 // Subclasses need to override this interface to implement reset initialization style before any frontend style set. ResetInitializedStyle()822 virtual void ResetInitializedStyle() {} 823 IsLeafNode()824 virtual bool IsLeafNode() const 825 { 826 return false; 827 } 828 829 void PrepareScrollComponent(); 830 GetLastCommonParent()831 RefPtr<SingleChild> GetLastCommonParent() 832 { 833 if (sharedTransitionComponent_) { 834 return sharedTransitionComponent_; 835 } 836 return boxComponent_; 837 } 838 SetAlignment(const Alignment & align)839 void SetAlignment(const Alignment& align) 840 { 841 ACE_DCHECK(boxComponent_); 842 boxComponent_->SetAlignment(align); 843 } 844 845 void OnChecked(bool isChecked); 846 847 // Each subclass needs to override this function to obtain the properties. If it returns true, it means that the 848 // property has been consumed. If it returns false, it means it is handed over to the parent class. SetSpecializedAttr(const std::pair<std::string,std::string> & attr)849 virtual bool SetSpecializedAttr(const std::pair<std::string, std::string>& attr) 850 { 851 return false; 852 } 853 854 // Each subclass needs to override this function to obtain the style. If it returns true, it means that the 855 // style has been consumed. If it returns false, it means it is handed over to the parent class. SetSpecializedStyle(const std::pair<std::string,std::string> & style)856 virtual bool SetSpecializedStyle(const std::pair<std::string, std::string>& style) 857 { 858 return false; 859 } 860 861 // Each subclass needs to override this function to obtain the event. If it returns true, it means that the 862 // event has been consumed. If it returns false, it means it is handed over to the parent class. AddSpecializedEvent(int32_t pageId,const std::string & event)863 virtual bool AddSpecializedEvent(int32_t pageId, const std::string& event) 864 { 865 return false; 866 } 867 CallSpecializedMethod(const std::string & method,const std::string & args)868 virtual void CallSpecializedMethod(const std::string& method, const std::string& args) {} 869 870 // When the multi-mode input subscript is set to auto, need to determine whether the current component has the 871 // ability to support the subscript. IsSubscriptEnable()872 virtual bool IsSubscriptEnable() const 873 { 874 if (declaration_) { 875 declaration_->SetIsSubscriptEnable(false); 876 } 877 return false; 878 } 879 880 WeakPtr<DOMNode> parentNode_; 881 NodeId parentId_ = -1; 882 bool isRootNode_ = false; 883 std::string parentTag_; 884 std::list<RefPtr<DOMNode>> children_; 885 // for pseudo class 886 std::vector<std::pair<std::string, std::string>> attributesCache_; 887 std::unordered_map<int32_t, std::unordered_map<std::string, std::string>> pseudoClassStyleMap_; 888 RefPtr<ComposedComponent> rootComponent_; 889 RefPtr<BoxComponent> boxComponent_; 890 RefPtr<ScrollComponent> scrollComponent_; 891 RefPtr<FlexItemComponent> flexItemComponent_; 892 RefPtr<TransformComponent> transformComponent_; 893 WeakPtr<PipelineContext> pipelineContext_; 894 RefPtr<Declaration> declaration_; 895 bool isCustomComponent_ = false; 896 bool boxWrap_ = false; 897 898 private: 899 static void SetTransform(const std::string& value, DOMNode& node); 900 static void AddKeyframe( 901 double time, const std::string& typeValue, RefPtr<KeyframeAnimation<float>>& transformKeyframes); 902 static void AddKeyframe(double time, double typeValue, RefPtr<KeyframeAnimation<float>>& transformKeyframes); 903 std::string GetTransformJsonValue(const std::string& value); 904 std::string GetTransformType(const std::unique_ptr<JsonValue>& transformJson); 905 std::string GetTransformTypeValue(const std::unique_ptr<JsonValue>& transformJson); 906 907 void CreatePropertyAnimation(const std::string& property); 908 RefPtr<KeyframeAnimation<float>> SetPropertyFloatAnimationKeyframe(float begin, float end); 909 RefPtr<KeyframeAnimation<Color>> SetPropertyColorAnimationKeyframe(const Color& begin, const Color& end); 910 void TransitionOptionSetKeyframes(TweenOption& tweenOption); 911 void SetDisplayStyle(); 912 913 void SetDisplayType(); 914 void UpdateFlexItemComponent(); 915 void UpdateUiComponents(); 916 void UpdateBoxComponent(); 917 void UpdateDisplayComponent(); 918 void UpdateTweenComponent(); 919 void UpdateTouchEventComponent(); 920 void UpdateGestureEventComponent(); 921 void UpdateMouseEventComponent(); 922 void UpdateFocusableEventComponents(); 923 void UpdatePositionComponent(); 924 void UpdatePositionProps(); 925 void UpdateTweenPosition(const RefPtr<TweenComponent> tweenComponent); 926 #ifndef WEARABLE_PRODUCT 927 void UpdateMultimodalComponent(); 928 #endif 929 930 void CachePseudoClassStyle(const std::pair<std::string, std::string>& pseudoClassStyle); 931 void UpdatePseudoStyle(bool isBackendChange); 932 void PrepareTouchEvent(EventMarker& eventMarker, uint32_t type); 933 void PrepareFocusableEventId(); 934 void PrepareMouseHoverEvent(); 935 void UpdatePseudoStyleByStatus(int32_t status, bool isBackendChange); 936 void ResetDefaultStyles(); 937 uint32_t CalculatePseudoStatus() const; 938 void SetAttrInternal(const std::vector<std::pair<std::string, std::string>>& attrs); 939 940 // for state update callbacks 941 void OnFocus(bool isFocus); 942 void OnHover(bool isHover); 943 944 RefPtr<ThemeConstants> GetThemeConstants() const; 945 946 template<typename T> ParseThemeReference(const std::string & value,std::function<T ()> && noRefFunc,std::function<T (uint32_t refId)> && idRefFunc,const T & errorValue)947 T ParseThemeReference(const std::string& value, std::function<T()>&& noRefFunc, 948 std::function<T(uint32_t refId)>&& idRefFunc, const T& errorValue) const 949 { 950 const auto& parseResult = ThemeUtils::ParseThemeIdReference(value, GetThemeConstants()); 951 if (!parseResult.parseSuccess) { 952 return noRefFunc(); 953 } 954 auto themeConstants = GetThemeConstants(); 955 if (!themeConstants) { 956 return errorValue; 957 } 958 // Refer to a theme id resource. 959 if (parseResult.isIdRef) { 960 return idRefFunc(parseResult.id); 961 } 962 // Refer to a theme attribute. 963 auto themeStyle = themeConstants->GetThemeStyle(); 964 if (!themeStyle) { 965 return errorValue; 966 } 967 return themeStyle->GetAttr<T>(parseResult.refAttr, errorValue); 968 } 969 970 bool isTransition_ = false; 971 bool isEnter_ = false; 972 bool isProxy_ = false; 973 bool animationStyleUpdated_ = false; 974 bool customAnimationStyleUpdated_ = false; 975 bool hasSvgTag_ = false; 976 VisibleType visible_ = VisibleType::VISIBLE; 977 978 int32_t pageId_ = -1; 979 NodeId nodeId_ = -1; 980 std::string tag_; 981 982 RefPtr<DisplayComponent> displayComponent_; 983 RefPtr<TouchListenerComponent> touchEventComponent_; 984 RefPtr<GestureListenerComponent> gestureEventComponent_; 985 RefPtr<FocusableComponent> focusableEventComponent_; 986 RefPtr<MouseListenerComponent> mouseEventComponent_; 987 RefPtr<PositionedComponent> positionComponent_; 988 RefPtr<SharedTransitionComponent> sharedTransitionComponent_; 989 RefPtr<TweenComponent> tweenComponent_; 990 RefPtr<TransitionComponent> propTransitionComponent_; 991 RefPtr<PageTransitionComponent> transitionComponent_; 992 993 PropAnimationMap propAnimations_; 994 AnimationUtil animationUtil_; 995 RefPtr<KeyframeAnimation<float>> propertyWidthAnimation_; 996 RefPtr<KeyframeAnimation<float>> propertyHeightAnimation_; 997 RefPtr<KeyframeAnimation<Color>> propertyColorAnimation_; 998 std::string animationName_; 999 bool isActive_ = false; 1000 bool isFocus_ = false; 1001 uint32_t cachedPseudoType_ = STATE_NORMAL; 1002 1003 TweenOption propTransitionOption_; 1004 std::string transitionPropertyName_ = "all"; 1005 std::string transitionTimeFunction_ = "ease"; 1006 int32_t transitionDuration_ = 0; 1007 int32_t transitionDelay_ = 0; 1008 bool isTransitionNameUpdateFirst_ = true; 1009 bool isTransitionDurationUpdateFirst_ = true; 1010 bool transitionStyleUpdated_ = false; 1011 bool isTransitionColor_ = false; 1012 1013 // for shared transition 1014 std::string shareId_; 1015 #ifndef WEARABLE_PRODUCT 1016 // for multi modal input. 1017 RefPtr<MultimodalComponent> multimodalComponent_; 1018 #endif 1019 }; 1020 1021 } // namespace OHOS::Ace::Framework 1022 1023 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_COMMON_DOM_DOM_NODE_H 1024