Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rollup of PRs in the queue #5519

Closed
wants to merge 6 commits into from
Closed
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Prev

Basic element.focus and blur methods

Fixes #5462.
  • Loading branch information
mbrubeck authored and Manishearth committed Apr 4, 2015
commit 299257e23a84cd863b5a77430bff728370929c86
@@ -10,21 +10,21 @@ use dom::bindings::codegen::Bindings::HTMLElementBinding::HTMLElementMethods;
use dom::bindings::codegen::Bindings::HTMLInputElementBinding::HTMLInputElementMethods;
use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods;
use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLFrameSetElementDerived};
use dom::bindings::codegen::InheritTypes::{EventTargetCast, HTMLInputElementCast};
use dom::bindings::codegen::InheritTypes::{EventTargetCast, HTMLInputElementCast, NodeCast};
use dom::bindings::codegen::InheritTypes::{HTMLElementDerived, HTMLBodyElementDerived};
use dom::bindings::js::{JSRef, Temporary, MutNullableJS};
use dom::bindings::error::ErrorResult;
use dom::bindings::error::Error::Syntax;
use dom::bindings::utils::Reflectable;
use dom::cssstyledeclaration::{CSSStyleDeclaration, CSSModificationAccess};
use dom::document::Document;
use dom::document::{Document, DocumentHelpers};
use dom::domstringmap::DOMStringMap;
use dom::element::{Element, ElementTypeId, ActivationElementHelpers, AttributeHandlers};
use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId};
use dom::htmlinputelement::HTMLInputElement;
use dom::htmlmediaelement::HTMLMediaElementTypeId;
use dom::htmltablecellelement::HTMLTableCellElementTypeId;
use dom::node::{Node, NodeTypeId, window_from_node};
use dom::node::{Node, NodeHelpers, NodeTypeId, document_from_node, window_from_node};
use dom::virtualmethods::VirtualMethods;
use dom::window::WindowHelpers;

@@ -135,6 +135,32 @@ impl<'a> HTMLElementMethods for JSRef<'a, HTMLElement> {
// https://www.w3.org/Bugs/Public/show_bug.cgi?id=27430 ?
element.as_maybe_activatable().map(|a| a.synthetic_click_activation(false, false, false, false));
}

// https://html.spec.whatwg.org/multipage/interaction.html#dom-focus
fn Focus(self) {
// TODO: Mark the element as locked for focus and run the focusing steps.
// https://html.spec.whatwg.org/multipage/interaction.html#focusing-steps
let element: JSRef<Element> = ElementCast::from_ref(self);
let document = document_from_node(self).root();
let document = document.r();
document.begin_focus_transaction();
document.request_focus(element);
document.commit_focus_transaction();
}

// https://html.spec.whatwg.org/multipage/interaction.html#dom-blur
fn Blur(self) {
// TODO: Run the unfocusing steps.
let node: JSRef<Node> = NodeCast::from_ref(self);
if !node.get_focus_state() {
return;
}
// https://html.spec.whatwg.org/multipage/interaction.html#unfocusing-steps
let document = document_from_node(self).root();
document.r().begin_focus_transaction();
// If `request_focus` is not called, focus will be set to None.
document.r().commit_focus_transaction();
}
}

// https://html.spec.whatwg.org/#attr-data-*
@@ -25,8 +25,8 @@ interface HTMLElement : Element {
attribute boolean hidden;
void click();
// attribute long tabIndex;
//void focus();
//void blur();
void focus();
void blur();
// attribute DOMString accessKey;
//readonly attribute DOMString accessKeyLabel;
// attribute boolean draggable;
@@ -10,10 +10,9 @@
is_not(document.activeElement, null, "test_1.1, document.activeElement");
is(document.activeElement, document.body, "test_1.2, document.activeElement");

//TODO: uncomment following lines when focus() method will be available
//document.getElementById('foo').focus();
document.getElementById('foo').focus();
is_not(document.activeElement, null, "test_2.1, document.activeElement");
//is(document.activeElement, document.getElementById("foo"), "test_2.2, document.activeElement");
is(document.activeElement, document.getElementById("foo"), "test_2.2, document.activeElement");
</script>
</body>
</html>
@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="harness.js"></script>
</head>
<body>
<input id="a">
<input id="b">
<script>
var a = document.getElementById("a");
var b = document.getElementById("b");

is(document.activeElement, document.body);
a.focus();
is(document.activeElement, a);
b.focus();
is(document.activeElement, b);
a.blur();
is(document.activeElement, b);
b.blur();
is(document.activeElement, document.body);
</script>
</body>
</html>
@@ -20,10 +20,3 @@

[A disabled <input[type=radio\]> should not be focusable]
expected: FAIL

[A disabled <a> should be focusable]
expected: FAIL

[A disabled <span> should be focusable]
expected: FAIL

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.