OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 14 matching lines...) Expand all Loading... |
25 | 25 |
26 #include "core/html/HTMLDialogElement.h" | 26 #include "core/html/HTMLDialogElement.h" |
27 | 27 |
28 #include "bindings/core/v8/ExceptionState.h" | 28 #include "bindings/core/v8/ExceptionState.h" |
29 #include "core/dom/AXObjectCache.h" | 29 #include "core/dom/AXObjectCache.h" |
30 #include "core/dom/ExceptionCode.h" | 30 #include "core/dom/ExceptionCode.h" |
31 #include "core/dom/NodeTraversal.h" | 31 #include "core/dom/NodeTraversal.h" |
32 #include "core/events/Event.h" | 32 #include "core/events/Event.h" |
33 #include "core/frame/FrameView.h" | 33 #include "core/frame/FrameView.h" |
34 #include "core/frame/UseCounter.h" | 34 #include "core/frame/UseCounter.h" |
| 35 #include "core/html/DialogShowParams.h" |
35 #include "core/html/HTMLFormControlElement.h" | 36 #include "core/html/HTMLFormControlElement.h" |
36 #include "core/style/ComputedStyle.h" | 37 #include "core/style/ComputedStyle.h" |
37 | 38 |
38 namespace blink { | 39 namespace blink { |
39 | 40 |
40 using namespace HTMLNames; | 41 using namespace HTMLNames; |
41 | 42 |
42 // This function chooses the focused element when show() or showModal() is | 43 // This function chooses the focused element when show() or showModal() is |
43 // invoked, as described in their spec. | 44 // invoked, as described in their spec. |
44 static void setFocusForDialog(HTMLDialogElement* dialog) { | 45 static void setFocusForDialog(HTMLDialogElement* dialog) { |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 if (m_centeringMode == NeedsCentering) | 132 if (m_centeringMode == NeedsCentering) |
132 setNotCentered(); | 133 setNotCentered(); |
133 } | 134 } |
134 | 135 |
135 void HTMLDialogElement::scheduleCloseEvent() { | 136 void HTMLDialogElement::scheduleCloseEvent() { |
136 Event* event = Event::create(EventTypeNames::close); | 137 Event* event = Event::create(EventTypeNames::close); |
137 event->setTarget(this); | 138 event->setTarget(this); |
138 document().enqueueAnimationFrameEvent(event); | 139 document().enqueueAnimationFrameEvent(event); |
139 } | 140 } |
140 | 141 |
141 void HTMLDialogElement::show() { | 142 void HTMLDialogElement::show(const DialogShowParams& showParams) { |
142 if (fastHasAttribute(openAttr)) | 143 if (fastHasAttribute(openAttr)) |
143 return; | 144 return; |
144 setBooleanAttribute(openAttr, true); | 145 setBooleanAttribute(openAttr, true); |
145 | 146 |
| 147 if (showParams.skipInitialFocus()) |
| 148 return; |
| 149 |
146 // The layout must be updated here because setFocusForDialog calls | 150 // The layout must be updated here because setFocusForDialog calls |
147 // Element::isFocusable, which requires an up-to-date layout. | 151 // Element::isFocusable, which requires an up-to-date layout. |
148 document().updateStyleAndLayoutIgnorePendingStylesheets(); | 152 document().updateStyleAndLayoutIgnorePendingStylesheets(); |
149 | |
150 setFocusForDialog(this); | 153 setFocusForDialog(this); |
151 } | 154 } |
152 | 155 |
153 void HTMLDialogElement::showModal(ExceptionState& exceptionState) { | 156 void HTMLDialogElement::showModal(const DialogShowParams& showParams, |
| 157 ExceptionState& exceptionState) { |
154 if (fastHasAttribute(openAttr)) { | 158 if (fastHasAttribute(openAttr)) { |
155 exceptionState.throwDOMException(InvalidStateError, | 159 exceptionState.throwDOMException(InvalidStateError, |
156 "The element already has an 'open' " | 160 "The element already has an 'open' " |
157 "attribute, and therefore cannot be " | 161 "attribute, and therefore cannot be " |
158 "opened modally."); | 162 "opened modally."); |
159 return; | 163 return; |
160 } | 164 } |
161 if (!isConnected()) { | 165 if (!isConnected()) { |
162 exceptionState.throwDOMException(InvalidStateError, | 166 exceptionState.throwDOMException(InvalidStateError, |
163 "The element is not in a Document."); | 167 "The element is not in a Document."); |
164 return; | 168 return; |
165 } | 169 } |
166 | 170 |
167 document().addToTopLayer(this); | 171 document().addToTopLayer(this); |
168 setBooleanAttribute(openAttr, true); | 172 setBooleanAttribute(openAttr, true); |
169 | 173 |
170 // Throw away the AX cache first, so the subsequent steps don't have a chance | 174 // Throw away the AX cache first, so the subsequent steps don't have a chance |
171 // of queuing up AX events on objects that would be invalidated when the cache | 175 // of queuing up AX events on objects that would be invalidated when the cache |
172 // is thrown away. | 176 // is thrown away. |
173 inertSubtreesChanged(document()); | 177 inertSubtreesChanged(document()); |
174 | 178 |
175 forceLayoutForCentering(); | 179 forceLayoutForCentering(); |
| 180 |
| 181 if (showParams.skipInitialFocus()) |
| 182 return; |
| 183 |
176 setFocusForDialog(this); | 184 setFocusForDialog(this); |
177 } | 185 } |
178 | 186 |
179 void HTMLDialogElement::removedFrom(ContainerNode* insertionPoint) { | 187 void HTMLDialogElement::removedFrom(ContainerNode* insertionPoint) { |
180 HTMLElement::removedFrom(insertionPoint); | 188 HTMLElement::removedFrom(insertionPoint); |
181 setNotCentered(); | 189 setNotCentered(); |
182 // FIXME: We should call inertSubtreesChanged() here. | 190 // FIXME: We should call inertSubtreesChanged() here. |
183 } | 191 } |
184 | 192 |
185 void HTMLDialogElement::setCentered(LayoutUnit centeredPosition) { | 193 void HTMLDialogElement::setCentered(LayoutUnit centeredPosition) { |
(...skipping 20 matching lines...) Expand all Loading... |
206 void HTMLDialogElement::defaultEventHandler(Event* event) { | 214 void HTMLDialogElement::defaultEventHandler(Event* event) { |
207 if (event->type() == EventTypeNames::cancel) { | 215 if (event->type() == EventTypeNames::cancel) { |
208 closeDialog(); | 216 closeDialog(); |
209 event->setDefaultHandled(); | 217 event->setDefaultHandled(); |
210 return; | 218 return; |
211 } | 219 } |
212 HTMLElement::defaultEventHandler(event); | 220 HTMLElement::defaultEventHandler(event); |
213 } | 221 } |
214 | 222 |
215 } // namespace blink | 223 } // namespace blink |
OLD | NEW |