packages feed

webdriver-precore-0.2.0.0: test/BiDi/Demos/InputEventDemos.hs

module BiDi.Demos.InputEventDemos where

import BiDi.Actions (BiDiActions (..))
import BiDi.DemoUtils
import Data.Maybe (fromJust)
import IOUtils (DemoActions (..))
import TestData (uploadUrl)
import WebDriverPreCore.BiDi.Protocol
import Prelude hiding (log, putStrLn)

-- Helper function to create default pointer common properties
defaultPointerProps :: PointerCommonProperties
defaultPointerProps =
  MkPointerCommonProperties
    { width = Nothing,
      height = Nothing,
      pressure = Nothing,
      tangentialPressure = Nothing,
      twist = Nothing,
      altitudeAngle = Nothing,
      azimuthAngle = Nothing
    }

{- 
Input Events - Implementation Status:

1. input.fileDialogOpened :: ✓ inputEventFileDialogOpened (parsing works)
   Firefox/geckodriver closes WebSocket connection when file dialog opens in headless mode,
   causing ConnectionClosed exception. Events are received and parsed correctly before disconnect.
   See bugs: 1855044, 1855045

The demos below work for event parsing but Firefox crashes in headless mode when file dialog opens.
-}



-- >>> runDemo inputEventFileDialogOpened
inputEventFileDialogOpened :: BiDiDemo
inputEventFileDialogOpened =
  demo "Input Events - File Dialog Opened (Single File)" action
  where
    action :: DemoActions -> BiDiActions -> IO ()
    action utils@MkDemoActions {..} bidi@MkBiDiActions {..} = do
      logTxt "Subscribe to FileDialogOpened event"
      (fileDialogEventFired, waitFileDialogEventFired) <- timeLimitLog InputFileDialogOpened
      subscribeInputFileDialogOpened fileDialogEventFired

      (manyFileDialogEventFired, waitManyFileDialogEventFired) <- timeLimitLogMany InputFileDialogOpened
      subscribeMany [InputFileDialogOpened] manyFileDialogEventFired

      bc <- newWindowContext utils bidi
      logTxt "Navigating to upload page"
      url <- uploadUrl
      browsingContextNavigate $ MkNavigate bc url Nothing

      logTxt "Locating single file upload input"
      uploadInput <-
        browsingContextLocateNodes $
          MkLocateNodes
            { context = bc,
              locator = CSS {value = "#singleUpload"},
              maxNodeCount = Nothing,
              serializationOptions = Nothing,
              startNodes = Nothing
            }
      logShow "Upload input element" uploadInput

      let MkLocateNodesResult nodes = uploadInput
          uploadInputId :: SharedId
          uploadInputId = case nodes of
            [input] -> fromJust input.sharedId
            _ -> error "Failed to locate single file upload input"

      logTxt "Clicking on file upload input to open file dialog"
      inputPerformActions $
        MkPerformActions
          { context = bc,
            actions =
              [ PointerSourceActions $
                  MkPointerSourceActions
                    { pointerId = "mouse1",
                      pointer = Just $ MkPointer {pointerType = Just MousePointer},
                      pointerActions =
                        [ PointerMove
                            { x = 0,
                              y = 0,
                              duration = Nothing,
                              origin =
                                Just $
                                  ElementOrigin $
                                    MkSharedReference
                                      { sharedId = uploadInputId,
                                        handle = Nothing,
                                        extensions = Nothing
                                      },
                              pointerCommonProperties = defaultPointerProps
                            },
                          PointerDown
                            { button = 0,
                              pointerCommonProperties = defaultPointerProps
                            },
                          PointerUp
                            { button = 0
                            }
                        ]
                    }
              ]
          }

      logTxt "Waiting for file dialog opened events..."
      sequence_
        [ waitFileDialogEventFired,
          waitManyFileDialogEventFired
        ]