public void DomContentChanged_ChangeContentOfTextInputWithKeyPressAndMoveToSecondInput_DomContentChangedShouldFire() { string html = "<input id=\"one\" type=\"text\" value=\"hello\" /><input id=\"two\" type=\"text\" value=\"world\" />"; _browser.TestLoadHtml(html); // Place browser on a form and show it. This is need to make the gecko accept the key press. Form f = new Form(); f.Controls.Add(_browser); _browser.Visible = true; f.Show(); // Focus first input box _browser.Document.GetHtmlElementById("one").Focus(); GeckoRange range = _browser.Document.CreateRange(); range.SelectNode(_browser.Document.GetHtmlElementById("one")); _browser.Window.Selection.AddRange(range); // record if DomContentChanged event happened. bool contentChangedEventReceived = false; _browser.DomContentChanged += (sender, e) => contentChangedEventReceived = true; // Modify first input by sending a keypress. // This could be refactored but at least it shows how to invoke a keypress using nsITextInputProcessor var instance = Xpcom.CreateInstance <nsITextInputProcessor>("@mozilla.org/text-input-processor;1"); using (var context = new AutoJSContext(_browser.Window)) { var result = context.EvaluateScript( @"new KeyboardEvent('', { key: 'a', code: 'KeyA', keyCode: KeyboardEvent.DOM_VK_A });"); instance.BeginInputTransaction((mozIDOMWindow)_browser.Document.DefaultView.DomWindow, new TestCallback()); nsString.Set(instance.SetPendingCompositionString, "hi"); instance.Keyup((nsIDOMEvent)result.ToComObject(context.ContextPointer), 0, 1); result = context.EvaluateScript( @"new KeyboardEvent('', { key: 'Enter', code: 'Enter' });"); instance.FlushPendingComposition(null, 0, 2); instance.CommitComposition((nsIDOMEvent)result.ToComObject(context.ContextPointer), 0, 2); } // DomContentChanged Event should fire when we move we move to next element. _browser.Document.GetHtmlElementById("two").Focus(); range.SelectNode(_browser.Document.GetHtmlElementById("two")); _browser.Window.Selection.RemoveAllRanges(); _browser.Window.Selection.AddRange(range); Assert.IsTrue(contentChangedEventReceived); }
public void DomContentChanged_ChangeContentOfTextInputWithKeyPressAndMoveToSecondInput_DomContentChangedShouldFire() { string html = "<input id=\"one\" type=\"text\" value=\"hello\" /><input id=\"two\" type=\"text\" value=\"world\" />"; LoadHtml(html); // Place browser on a form and show it. This is need to make the gecko accept the key press. Form f = new Form(); f.Controls.Add(browser); browser.Visible = true; f.Show(); // Focus first input box browser.Document.GetElementById("one").Focus(); GeckoRange range = browser.Document.CreateRange(); range.SelectNode(browser.Document.GetElementById("one")); browser.Window.Selection.AddRange(range); // record if DomContentChanged event happened. bool contentChangedEventReceived = false; browser.DomContentChanged += (sender, e) => contentChangedEventReceived = true; // Modify first input by sending a keypress. // TODO: create wrapper for nsIDOMWindowUtils nsIDOMWindowUtils utils = Xpcom.QueryInterface <nsIDOMWindowUtils>(browser.Window.DomWindow); using (nsAString type = new nsAString("keypress")) { utils.SendKeyEvent(type, 0, 102, 0, false); } // DomContentChanged Event should fire when we move we move to next element. browser.Document.GetElementById("two").Focus(); range.SelectNode(browser.Document.GetElementById("two")); browser.Window.Selection.RemoveAllRanges(); browser.Window.Selection.AddRange(range); Assert.IsTrue(contentChangedEventReceived); }
/// <summary> /// Get the Individual rectangles that make up a selection. /// </summary> public static Rectangle[] GetClientRects( GeckoRange range ) { nsIDOMClientRectList rects = range.DomRange.GetClientRects(); return WinFormsConverter.WrapDomClientRectList( rects ); }
/// <summary> /// Get Rectange which surrounds entire selection. /// </summary> /// <param name="selection"></param> /// <returns></returns> public static Rectangle GetBoundingClientRect( GeckoRange range ) { nsIDOMClientRect domRect = range.DomRange.GetBoundingClientRect(); if ( domRect == null ) return Rectangle.Empty; return WinFormsConverter.WrapDomClientRect( domRect ); }