private void WaitForInitalization()
        {
            var wait      = WrappedDriver.Wait(TimeSpan.FromSeconds(10));
            var timeoutMS = wait.Timeout.TotalMilliseconds;
            var pollingMS = wait.PollingInterval.TotalMilliseconds;

            var script =
                AddTinyMCEUtilities(String.Empty) +
                "var el = {args}[0];" +
                "var editor = tinyMCEUtilities.getEditor(el);" +
                "tinyMCEUtilities.waitForInitialization(editor," +
                $"{timeoutMS}," +
                $"{pollingMS}," +
                "{resolve}," +
                "{reject});";

            script = JavaScript.RemoveComments(script);
            script = JavaScript.Clean(script);

            var waiter = new PromiseBody(WrappedDriver)
            {
                Arguments = new[] { new JavaScriptValue(WrappedElement) },
                Script    = script
            };

            // Condense the script.
            waiter.Format();

            waiter.Execute(WrappedDriver.JavaScriptExecutor());
            wait.Until(d => waiter.Finished);
            waiter.Wait(TimeSpan.FromSeconds(10));
        }
        /// <summary>
        /// Since kendo events aren't compatible with native js events use this
        /// method to listen for kendo events.
        /// </summary>
        /// <param name="eventName">Name of the event to listen for.</param>
        protected virtual PromiseBody GetPromiseForKendoEvent(
            string eventName)
        {
            var script =
                "var callback = {resolve};" +
                "var $el = $({args}[0]);" +
                "var dropdown = $el.data().kendoDropDownList;" +
                "var unbindCallback = function () {" +
                $"dropdown.unbind('{eventName}', unbindCallback);" +
                "callback();" +
                "};" +
                $"dropdown.bind('{eventName}', unbindCallback);";

            var promise = new PromiseBody(WrappedDriver)
            {
                Arguments = new JavaScriptValue[]
                {
                    new JavaScriptValue(WrappedElement)
                },
                Script = script
            };

            promise.Execute(WrappedDriver.JavaScriptExecutor());

            return(promise);
        }
        private void UpdateIntegrationMode()
        {
            if (TinyMCEContainerElement.FindElements(By.TagName("iframe")).Any())
            {
                // Only classic mode uses iframes.
                IntegrationMode = IntegrationMode.Classic;
            }
            else
            {
                // Could be either classic or distraction free.
                var script =
                    "var el = arguments[0];" +
                    "var editor = tinyMCEUtilities.getEditor(el);" +
                    "if (editor == null) {" +
                    "return false;" +
                    "} else {" +
                    "return editor.getParam('theme') === 'inlite';" +
                    "}";

                script = AddTinyMCEUtilities(script);

                var isDistractionFreeMode = (bool)WrappedDriver
                                            .JavaScriptExecutor()
                                            .ExecuteScript(script, WrappedElement);

                IntegrationMode = isDistractionFreeMode
                    ? IntegrationMode.DistractionFree
                    : IntegrationMode.Inline;
            }
        }
Beispiel #4
0
        /// <summary>
        /// Waits for the <c>dataName</c> to be defined on the
        /// $(WrappedElement).data() object. Assumes that <c>WrappedElement</c>
        /// has been assigned to.
        /// </summary>
        /// <param name="dataName">
        /// Name of the property on the data object.
        /// </param>
        /// <param name="timeout">The timeout.</param>
        protected virtual void WaitForInitialization(string dataName,
                                                     TimeSpan timeout)
        {
            var js = WrappedDriver.JavaScriptExecutor();

            var script =
                $"var el = arguments[0];" +
                $"return '{dataName}' in $(el).data();";

            WrappedDriver.Wait(timeout)
            .Until(d => (bool)js.ExecuteScript(script, WrappedElement));
        }
        /// <summary>
        /// Gets the content of the editor. This calls the
        /// tinyMCE.Editor.getContent().
        /// </summary>
        /// <returns></returns>
        public virtual string GetContent()
        {
            var script =
                AddTinyMCEUtilities() +
                "var el = arguments[0];" +
                "var editor = tinyMCEUtilities.getEditor(el);" +
                "return editor == null ? null : editor.getContent();";

            script = JavaScript.RemoveComments(script);
            script = JavaScript.Clean(script);

            return((string)WrappedDriver.JavaScriptExecutor()
                   .ExecuteScript(script, WrappedElement));
        }
        /// <summary>
        /// Sets the cursor position (the point {0,0} will be the top left
        /// corner).
        /// </summary>
        /// <param name="point">The point.</param>
        public virtual void SetCursorPosition(Point point)
        {
            var script =
                AddTinyMCEUtilities() +
                $"var el = arguments[0];" +
                $"var editor = tinyMCEUtilities.getEditor(el);" +
                $"tinyMCEUtilities.setCaretPosition(editor, {point.X}, {point.Y});" +
                // This is to scroll the line into view.
                $"editor.execCommand('mceInsertContent', false, '');";

            WrappedDriver
            .JavaScriptExecutor()
            .ExecuteScript(script, WrappedElement);
        }
Beispiel #7
0
        /// <summary>
        /// Gets all availble tags that can be created via autocomplete.
        /// </summary>
        /// <returns></returns>
        public virtual IEnumerable <string> GetAllAutoCompleteOptions()
        {
            var js = new JavaScript
            {
                Script =
                    "var $el = $(arguments[0]);" +
                    "return $el.data().options.autocomplete.source;",
                Arguments = new[] { new JavaScriptValue(WrappedElement) }
            };

            var result = js.Execute(WrappedDriver.JavaScriptExecutor());

            return(result.ToStringArray());
        }
Beispiel #8
0
        /// <summary>
        /// Gets the data object.
        /// </summary>
        /// <returns></returns>
        protected JObject GetData()
        {
            var script =
                Resources.jsonFormatterCallback +
                "var el = arguments[0];" +
                "var dataObj = $(el).data().datepicker;" +
                "return JSON.stringify(dataObj, jsonFormatter);";

            var dataStr = (string)WrappedDriver
                          .JavaScriptExecutor()
                          .ExecuteScript(script, WrappedElement);

            return(JObject.Parse(dataStr));
        }
        /// <summary>
        /// If overriding don't forget to call base.Load() or make sure to
        /// assign the WrappedElement.
        /// </summary>
        /// <returns></returns>
        public override ILoadableComponent Load()
        {
            base.Load();
            InputContainerElement = WrappedElement.GetParentElement();

            // Locate the generated calendar modal element.
            var script = new JavaScript
            {
                Script =
                    "var $el = $(arguments[0]);" +
                    "return $el.data().kendoDatePicker.dateView.div[0]",
                Arguments = new[] { new JavaScriptValue(WrappedElement) }
            };

            ModalContainerElement = script
                                    .Execute(WrappedDriver.JavaScriptExecutor())
                                    .ToWebElement();

            return(this);
        }
        /// <summary>
        /// Hightlights the range.
        /// </summary>
        /// <param name="startPoint">The start.</param>
        /// <param name="endPoint">The end.</param>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentOutOfRangeException">
        /// Thrown if the start point is before the end point.
        /// </exception>
        public virtual void HightlightRange(Point startPoint, Point endPoint)
        {
            // Validate arguments.
            if (startPoint == null)
            {
                throw new ArgumentNullException(nameof(startPoint));
            }
            else if (endPoint == null)
            {
                throw new ArgumentNullException(nameof(endPoint));
            }

            if (startPoint.Y > endPoint.Y)
            {
                throw new ArgumentOutOfRangeException(nameof(startPoint));
            }
            else if (startPoint.Y == endPoint.Y && startPoint.X > endPoint.X)
            {
                throw new ArgumentOutOfRangeException(nameof(endPoint));
            }

            // This is to set the start point & end point into view. Both
            // points are used to (if possible) get both points into view.
            SetCursorPosition(startPoint);
            SetCursorPosition(endPoint);

            var script =
                AddTinyMCEUtilities() +
                $"var el = arguments[0];" +
                $"var editor = tinyMCEUtilities.getEditor(el);" +
                $"tinyMCEUtilities.highlight(editor," +
                $"{startPoint.X}," +
                $"{startPoint.Y}," +
                $"{endPoint.X}," +
                $"{endPoint.Y});";

            WrappedDriver
            .JavaScriptExecutor()
            .ExecuteScript(script, WrappedElement);
        }
        /// <summary>
        /// Gets the cursor position.
        /// </summary>
        /// <returns></returns>
        public virtual Point GetCursorPosition()
        {
            var script =
                AddTinyMCEUtilities() +
                "var el = arguments[0];" +
                "var ed = tinyMCEUtilities.getEditor(el);" +
                "console.log(ed);" +
                "return JSON.stringify(tinyMCEUtilities.getCaretPosition(ed))";

            script = JavaScript.RemoveComments(script);
            script = JavaScript.Clean(script);

            var result = (string)WrappedDriver
                         .JavaScriptExecutor()
                         .ExecuteScript(script, WrappedElement);

            var jsObj = JObject.Parse(result);

            var point = new Point(
                jsObj["x"].ToObject <int>(),
                jsObj["y"].ToObject <int>());

            return(point);
        }
        /// <summary>
        /// If overriding don't forget to call base.Load() or make sure to
        /// assign the WrappedElement.
        /// </summary>
        /// <returns></returns>
        /// <exception cref="NoSuchElementException"></exception>
        public override ILoadableComponent Load()
        {
            base.Load();

            WaitForInitalization();

            var script = new JavaScript
            {
                Arguments = new[] { new JavaScriptValue(WrappedElement) },
                IsAsync   = false,
                Script    = JavaScript.Clean(
                    JavaScript.RemoveComments(
                        AddTinyMCEUtilities() +
                        "var el = arguments[0];" +
                        "var editor = tinyMCEUtilities.getEditor(el);" +
                        "return editor == null ? null : editor.getContainer();"))
            };

            TinyMCEContainerElement = script.Execute(
                WrappedDriver.JavaScriptExecutor())
                                      .ToWebElement();

            if (TinyMCEContainerElement == null)
            {
                throw new NoSuchElementException();
            }

            UpdateIntegrationMode();

            if (IntegrationMode == IntegrationMode.Classic)
            {
                iframeElement = new IFrameElement(
                    TinyMCEContainerElement
                    .FindElement(By.TagName("iframe"))
                    .UnWrapEventFiringWebElement(),
                    WrappedDriver);
            }

            // Menu.
            if (TinyMCEContainerElement.FindElements(menuComponentSelector).Any())
            {
                Menu = pageObjectFactory.PrepareComponent(
                    new MenuComponent(menuComponentSelector,
                                      pageObjectFactory,
                                      WrappedDriver));
            }
            else
            {
                Menu = null;
            }

            // Toolbar.
            if (TinyMCEContainerElement.FindElements(toolbarComponentSelector).Any())
            {
                Toolbar = pageObjectFactory.PrepareComponent(
                    new ToolbarComponent(
                        toolbarComponentSelector,
                        pageObjectFactory,
                        WrappedDriver));
            }
            else
            {
                Toolbar = null;
            }

            // Status bar.
            if (TinyMCEContainerElement.FindElements(statusbarComponentSelector).Any())
            {
                Statusbar = pageObjectFactory.PrepareComponent(
                    new StatusbarComponent(statusbarComponentSelector,
                                           pageObjectFactory,
                                           WrappedDriver));
            }
            else
            {
                Statusbar = null;
            }

            return(this);
        }
Beispiel #13
0
        /// <summary>
        /// Gets the options.
        /// </summary>
        /// <returns></returns>
        protected JObject GetOptions()
        {
            var script =
                Resources.jsonFormatterCallback +
                "var optNames = [" +
                "altField," +
                "altFormat," +
                "appendText," +
                "autoSize," +
                "beforeShow," +
                "beforeShowDay," +
                "buttonImage," +
                "buttonImageOnly," +
                "buttonText," +
                "calculateWeek," +
                "changeMonth," +
                "changeYear," +
                "closeText," +
                "constrainInput," +
                "currentText," +
                "dateFormat," +
                "dayNames," +
                "dayNamesMin," +
                "dayNamesShort," +
                "defaultDate," +
                "duration," +
                "firstDay," +
                "gotoCurrent," +
                "hideIfNoPrevNext," +
                "isRTL," +
                "maxDate," +
                "minDate," +
                "monthNames," +
                "monthNamesShort," +
                "navigationAsDateFormat," +
                "nextText," +
                "numberOfMonths," +
                "onChangeMonthYear," +
                "onClose," +
                "onSelect," +
                "prevText," +
                "selectOtherMonths," +
                "shortYearCutoff," +
                "showAnim," +
                "showButtonPanel," +
                "showCurrentAtPos," +
                "showMonthAfterYear," +
                "showOn," +
                "showOptions," +
                "showOtherMonths," +
                "showWeek," +
                "stepMonths," +
                "weekHeader," +
                "yearRange," +
                "yearSuffix" +
                "];" +
                "var el = arguments[0];" +
                "var opt = { };" +
                "for (var i = 0; i < optNames.length; i++ {" +
                "var optName = optNames[i];" +
                "var val = $(el).data().datapicker('option', optNames[i]); " +
                "opt[optName] = val;" +
                "}" +
                "return JSON.stringify(opt, jsonFormatter);";

            var optionsStr = (string)WrappedDriver
                             .JavaScriptExecutor()
                             .ExecuteScript(script, WrappedElement);

            return(JObject.Parse(optionsStr));
        }