| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2013 Apple Inc. All rights reserved. | 3 * Copyright (C) 2013 Apple Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * | 8 * |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 25 */ | 25 */ |
| 26 | 26 |
| 27 #include "config.h" | 27 #include "config.h" |
| 28 #include "Internals.h" | 28 #include "Internals.h" |
| 29 | 29 |
| 30 #include <v8.h> | 30 #include <v8.h> |
| 31 #include "HTMLNames.h" | |
| 32 #include "InspectorFrontendClientLocal.h" | 31 #include "InspectorFrontendClientLocal.h" |
| 33 #include "InternalProfilers.h" | 32 #include "InternalProfilers.h" |
| 34 #include "InternalRuntimeFlags.h" | 33 #include "InternalRuntimeFlags.h" |
| 35 #include "InternalSettings.h" | 34 #include "InternalSettings.h" |
| 36 #include "LayerRect.h" | 35 #include "LayerRect.h" |
| 37 #include "LayerRectList.h" | 36 #include "LayerRectList.h" |
| 38 #include "MallocStatistics.h" | 37 #include "MallocStatistics.h" |
| 39 #include "MockPagePopupDriver.h" | 38 #include "MockPagePopupDriver.h" |
| 40 #include "RuntimeEnabledFeatures.h" | 39 #include "RuntimeEnabledFeatures.h" |
| 41 #include "TypeConversions.h" | 40 #include "TypeConversions.h" |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 return element1->renderStyle() == element2->renderStyle(); | 370 return element1->renderStyle() == element2->renderStyle(); |
| 372 } | 371 } |
| 373 | 372 |
| 374 bool Internals::isValidContentSelect(Element* insertionPoint, ExceptionState& ex
ceptionState) | 373 bool Internals::isValidContentSelect(Element* insertionPoint, ExceptionState& ex
ceptionState) |
| 375 { | 374 { |
| 376 if (!insertionPoint || !insertionPoint->isInsertionPoint()) { | 375 if (!insertionPoint || !insertionPoint->isInsertionPoint()) { |
| 377 exceptionState.throwDOMException(InvalidAccessError, "The insertion poin
t provided is invalid."); | 376 exceptionState.throwDOMException(InvalidAccessError, "The insertion poin
t provided is invalid."); |
| 378 return false; | 377 return false; |
| 379 } | 378 } |
| 380 | 379 |
| 381 return insertionPoint->hasTagName(contentTag) && toHTMLContentElement(insert
ionPoint)->isSelectValid(); | 380 return isHTMLContentElement(*insertionPoint) && toHTMLContentElement(*insert
ionPoint).isSelectValid(); |
| 382 } | 381 } |
| 383 | 382 |
| 384 Node* Internals::treeScopeRootNode(Node* node, ExceptionState& exceptionState) | 383 Node* Internals::treeScopeRootNode(Node* node, ExceptionState& exceptionState) |
| 385 { | 384 { |
| 386 if (!node) { | 385 if (!node) { |
| 387 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Node")); | 386 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Node")); |
| 388 return 0; | 387 return 0; |
| 389 } | 388 } |
| 390 | 389 |
| 391 return &node->treeScope().rootNode(); | 390 return &node->treeScope().rootNode(); |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 696 if (element && isHTMLTextFormControlElement(*element)) { | 695 if (element && isHTMLTextFormControlElement(*element)) { |
| 697 if (toHTMLTextFormControlElement(element)->placeholderShouldBeVisible()) | 696 if (toHTMLTextFormControlElement(element)->placeholderShouldBeVisible()) |
| 698 return toHTMLTextFormControlElement(element)->placeholderElement()->
textContent(); | 697 return toHTMLTextFormControlElement(element)->placeholderElement()->
textContent(); |
| 699 } | 698 } |
| 700 | 699 |
| 701 return String(); | 700 return String(); |
| 702 } | 701 } |
| 703 | 702 |
| 704 void Internals::selectColorInColorChooser(Element* element, const String& colorV
alue) | 703 void Internals::selectColorInColorChooser(Element* element, const String& colorV
alue) |
| 705 { | 704 { |
| 706 if (!element->hasTagName(inputTag)) | 705 ASSERT(element); |
| 706 if (!isHTMLInputElement(*element)) |
| 707 return; | 707 return; |
| 708 Color color; | 708 Color color; |
| 709 if (!color.setFromString(colorValue)) | 709 if (!color.setFromString(colorValue)) |
| 710 return; | 710 return; |
| 711 toHTMLInputElement(element)->selectColorInColorChooser(color); | 711 toHTMLInputElement(*element).selectColorInColorChooser(color); |
| 712 } | 712 } |
| 713 | 713 |
| 714 bool Internals::hasAutofocusRequest(Document* document) | 714 bool Internals::hasAutofocusRequest(Document* document) |
| 715 { | 715 { |
| 716 if (!document) | 716 if (!document) |
| 717 document = contextDocument(); | 717 document = contextDocument(); |
| 718 return document->autofocusElement(); | 718 return document->autofocusElement(); |
| 719 } | 719 } |
| 720 | 720 |
| 721 bool Internals::hasAutofocusRequest() | 721 bool Internals::hasAutofocusRequest() |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 964 return builder.toString(); | 964 return builder.toString(); |
| 965 } | 965 } |
| 966 | 966 |
| 967 bool Internals::wasLastChangeUserEdit(Element* textField, ExceptionState& except
ionState) | 967 bool Internals::wasLastChangeUserEdit(Element* textField, ExceptionState& except
ionState) |
| 968 { | 968 { |
| 969 if (!textField) { | 969 if (!textField) { |
| 970 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Element")); | 970 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Element")); |
| 971 return false; | 971 return false; |
| 972 } | 972 } |
| 973 | 973 |
| 974 if (textField->hasTagName(inputTag)) | 974 if (isHTMLInputElement(*textField)) |
| 975 return toHTMLInputElement(textField)->lastChangeWasUserEdit(); | 975 return toHTMLInputElement(*textField).lastChangeWasUserEdit(); |
| 976 | 976 |
| 977 if (textField->hasTagName(textareaTag)) | 977 if (isHTMLTextAreaElement(*textField)) |
| 978 return toHTMLTextAreaElement(textField)->lastChangeWasUserEdit(); | 978 return toHTMLTextAreaElement(*textField).lastChangeWasUserEdit(); |
| 979 | 979 |
| 980 exceptionState.throwDOMException(InvalidNodeTypeError, "The element provided
is not a TEXTAREA."); | 980 exceptionState.throwDOMException(InvalidNodeTypeError, "The element provided
is not a TEXTAREA."); |
| 981 return false; | 981 return false; |
| 982 } | 982 } |
| 983 | 983 |
| 984 bool Internals::elementShouldAutoComplete(Element* element, ExceptionState& exce
ptionState) | 984 bool Internals::elementShouldAutoComplete(Element* element, ExceptionState& exce
ptionState) |
| 985 { | 985 { |
| 986 if (!element) { | 986 if (!element) { |
| 987 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Element")); | 987 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Element")); |
| 988 return false; | 988 return false; |
| 989 } | 989 } |
| 990 | 990 |
| 991 if (element->hasTagName(inputTag)) | 991 if (isHTMLInputElement(*element)) |
| 992 return toHTMLInputElement(element)->shouldAutocomplete(); | 992 return toHTMLInputElement(*element).shouldAutocomplete(); |
| 993 | 993 |
| 994 exceptionState.throwDOMException(InvalidNodeTypeError, "The element provided
is not an INPUT."); | 994 exceptionState.throwDOMException(InvalidNodeTypeError, "The element provided
is not an INPUT."); |
| 995 return false; | 995 return false; |
| 996 } | 996 } |
| 997 | 997 |
| 998 String Internals::suggestedValue(Element* element, ExceptionState& exceptionStat
e) | 998 String Internals::suggestedValue(Element* element, ExceptionState& exceptionStat
e) |
| 999 { | 999 { |
| 1000 if (!element) { | 1000 if (!element) { |
| 1001 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Element")); | 1001 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Element")); |
| 1002 return String(); | 1002 return String(); |
| 1003 } | 1003 } |
| 1004 | 1004 |
| 1005 if (!element->isFormControlElement()) { | 1005 if (!element->isFormControlElement()) { |
| 1006 exceptionState.throwDOMException(InvalidNodeTypeError, "The element prov
ided is not a form control element."); | 1006 exceptionState.throwDOMException(InvalidNodeTypeError, "The element prov
ided is not a form control element."); |
| 1007 return String(); | 1007 return String(); |
| 1008 } | 1008 } |
| 1009 | 1009 |
| 1010 String suggestedValue; | 1010 String suggestedValue; |
| 1011 if (element->hasTagName(inputTag)) | 1011 if (isHTMLInputElement(*element)) |
| 1012 suggestedValue = toHTMLInputElement(element)->suggestedValue(); | 1012 suggestedValue = toHTMLInputElement(*element).suggestedValue(); |
| 1013 | 1013 |
| 1014 if (element->hasTagName(textareaTag)) | 1014 if (isHTMLTextAreaElement(*element)) |
| 1015 suggestedValue = toHTMLTextAreaElement(element)->suggestedValue(); | 1015 suggestedValue = toHTMLTextAreaElement(*element).suggestedValue(); |
| 1016 return suggestedValue; | 1016 return suggestedValue; |
| 1017 } | 1017 } |
| 1018 | 1018 |
| 1019 void Internals::setSuggestedValue(Element* element, const String& value, Excepti
onState& exceptionState) | 1019 void Internals::setSuggestedValue(Element* element, const String& value, Excepti
onState& exceptionState) |
| 1020 { | 1020 { |
| 1021 if (!element) { | 1021 if (!element) { |
| 1022 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Element")); | 1022 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Element")); |
| 1023 return; | 1023 return; |
| 1024 } | 1024 } |
| 1025 | 1025 |
| 1026 if (!element->isFormControlElement()) { | 1026 if (!element->isFormControlElement()) { |
| 1027 exceptionState.throwDOMException(InvalidNodeTypeError, "The element prov
ided is not a form control element."); | 1027 exceptionState.throwDOMException(InvalidNodeTypeError, "The element prov
ided is not a form control element."); |
| 1028 return; | 1028 return; |
| 1029 } | 1029 } |
| 1030 | 1030 |
| 1031 if (element->hasTagName(inputTag)) | 1031 if (isHTMLInputElement(*element)) |
| 1032 toHTMLInputElement(element)->setSuggestedValue(value); | 1032 toHTMLInputElement(*element).setSuggestedValue(value); |
| 1033 | 1033 |
| 1034 if (element->hasTagName(textareaTag)) | 1034 if (isHTMLTextAreaElement(*element)) |
| 1035 toHTMLTextAreaElement(element)->setSuggestedValue(value); | 1035 toHTMLTextAreaElement(*element).setSuggestedValue(value); |
| 1036 } | 1036 } |
| 1037 | 1037 |
| 1038 void Internals::setEditingValue(Element* element, const String& value, Exception
State& exceptionState) | 1038 void Internals::setEditingValue(Element* element, const String& value, Exception
State& exceptionState) |
| 1039 { | 1039 { |
| 1040 if (!element) { | 1040 if (!element) { |
| 1041 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Element")); | 1041 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Element")); |
| 1042 return; | 1042 return; |
| 1043 } | 1043 } |
| 1044 | 1044 |
| 1045 if (!element->hasTagName(inputTag)) { | 1045 if (!isHTMLInputElement(*element)) { |
| 1046 exceptionState.throwDOMException(InvalidNodeTypeError, "The element prov
ided is not an INPUT."); | 1046 exceptionState.throwDOMException(InvalidNodeTypeError, "The element prov
ided is not an INPUT."); |
| 1047 return; | 1047 return; |
| 1048 } | 1048 } |
| 1049 | 1049 |
| 1050 toHTMLInputElement(element)->setEditingValue(value); | 1050 toHTMLInputElement(*element).setEditingValue(value); |
| 1051 } | 1051 } |
| 1052 | 1052 |
| 1053 void Internals::setAutofilled(Element* element, bool enabled, ExceptionState& ex
ceptionState) | 1053 void Internals::setAutofilled(Element* element, bool enabled, ExceptionState& ex
ceptionState) |
| 1054 { | 1054 { |
| 1055 if (!element->isFormControlElement()) { | 1055 if (!element->isFormControlElement()) { |
| 1056 exceptionState.throwDOMException(InvalidNodeTypeError, "The element prov
ided is not a form control element."); | 1056 exceptionState.throwDOMException(InvalidNodeTypeError, "The element prov
ided is not a form control element."); |
| 1057 return; | 1057 return; |
| 1058 } | 1058 } |
| 1059 toHTMLFormControlElement(element)->setAutofilled(enabled); | 1059 toHTMLFormControlElement(element)->setAutofilled(enabled); |
| 1060 } | 1060 } |
| (...skipping 1034 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2095 updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(0, exceptionState)
; | 2095 updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(0, exceptionState)
; |
| 2096 } | 2096 } |
| 2097 | 2097 |
| 2098 void Internals::updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(Node*
node, ExceptionState& exceptionState) | 2098 void Internals::updateLayoutIgnorePendingStylesheetsAndRunPostLayoutTasks(Node*
node, ExceptionState& exceptionState) |
| 2099 { | 2099 { |
| 2100 Document* document; | 2100 Document* document; |
| 2101 if (!node) { | 2101 if (!node) { |
| 2102 document = contextDocument(); | 2102 document = contextDocument(); |
| 2103 } else if (node->isDocumentNode()) { | 2103 } else if (node->isDocumentNode()) { |
| 2104 document = toDocument(node); | 2104 document = toDocument(node); |
| 2105 } else if (node->hasTagName(HTMLNames::iframeTag)) { | 2105 } else if (isHTMLIFrameElement(*node)) { |
| 2106 document = toHTMLIFrameElement(node)->contentDocument(); | 2106 document = toHTMLIFrameElement(*node).contentDocument(); |
| 2107 } else { | 2107 } else { |
| 2108 exceptionState.throwTypeError("The node provided is neither a document n
or an IFrame."); | 2108 exceptionState.throwTypeError("The node provided is neither a document n
or an IFrame."); |
| 2109 return; | 2109 return; |
| 2110 } | 2110 } |
| 2111 document->updateLayoutIgnorePendingStylesheets(Document::RunPostLayoutTasksS
ynchronously); | 2111 document->updateLayoutIgnorePendingStylesheets(Document::RunPostLayoutTasksS
ynchronously); |
| 2112 } | 2112 } |
| 2113 | 2113 |
| 2114 PassRefPtr<ClientRectList> Internals::draggableRegions(Document* document, Excep
tionState& exceptionState) | 2114 PassRefPtr<ClientRectList> Internals::draggableRegions(Document* document, Excep
tionState& exceptionState) |
| 2115 { | 2115 { |
| 2116 return annotatedRegions(document, true, exceptionState); | 2116 return annotatedRegions(document, true, exceptionState); |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2278 if (!document) { | 2278 if (!document) { |
| 2279 exceptionState.throwDOMException(InvalidAccessError, "No context documen
t is available."); | 2279 exceptionState.throwDOMException(InvalidAccessError, "No context documen
t is available."); |
| 2280 return String(); | 2280 return String(); |
| 2281 } | 2281 } |
| 2282 | 2282 |
| 2283 return document->baseURL().string(); | 2283 return document->baseURL().string(); |
| 2284 } | 2284 } |
| 2285 | 2285 |
| 2286 bool Internals::isSelectPopupVisible(Node* node) | 2286 bool Internals::isSelectPopupVisible(Node* node) |
| 2287 { | 2287 { |
| 2288 if (!node->hasTagName(HTMLNames::selectTag)) | 2288 ASSERT(node); |
| 2289 if (!isHTMLSelectElement(*node)) |
| 2289 return false; | 2290 return false; |
| 2290 | 2291 |
| 2291 HTMLSelectElement* select = toHTMLSelectElement(node); | 2292 HTMLSelectElement& select = toHTMLSelectElement(*node); |
| 2292 | 2293 |
| 2293 RenderObject* renderer = select->renderer(); | 2294 RenderObject* renderer = select.renderer(); |
| 2294 if (!renderer->isMenuList()) | 2295 if (!renderer->isMenuList()) |
| 2295 return false; | 2296 return false; |
| 2296 | 2297 |
| 2297 RenderMenuList* menuList = toRenderMenuList(renderer); | 2298 RenderMenuList* menuList = toRenderMenuList(renderer); |
| 2298 return menuList->popupIsVisible(); | 2299 return menuList->popupIsVisible(); |
| 2299 } | 2300 } |
| 2300 | 2301 |
| 2301 bool Internals::loseSharedGraphicsContext3D() | 2302 bool Internals::loseSharedGraphicsContext3D() |
| 2302 { | 2303 { |
| 2303 OwnPtr<blink::WebGraphicsContext3DProvider> sharedProvider = adoptPtr(blink:
:Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); | 2304 OwnPtr<blink::WebGraphicsContext3DProvider> sharedProvider = adoptPtr(blink:
:Platform::current()->createSharedOffscreenGraphicsContext3DProvider()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2336 return document->page()->chrome().client().isCompositorFramePending(); | 2337 return document->page()->chrome().client().isCompositorFramePending(); |
| 2337 } | 2338 } |
| 2338 | 2339 |
| 2339 void Internals::setZoomFactor(float factor) | 2340 void Internals::setZoomFactor(float factor) |
| 2340 { | 2341 { |
| 2341 frame()->setPageZoomFactor(factor); | 2342 frame()->setPageZoomFactor(factor); |
| 2342 } | 2343 } |
| 2343 | 2344 |
| 2344 void Internals::setShouldRevealPassword(Element* element, bool reveal, Exception
State& exceptionState) | 2345 void Internals::setShouldRevealPassword(Element* element, bool reveal, Exception
State& exceptionState) |
| 2345 { | 2346 { |
| 2346 if (!element || !element->hasTagName(inputTag)) { | 2347 if (!isHTMLInputElement(element)) { |
| 2347 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Element")); | 2348 exceptionState.throwDOMException(InvalidAccessError, ExceptionMessages::
argumentNullOrIncorrectType(1, "Element")); |
| 2348 return; | 2349 return; |
| 2349 } | 2350 } |
| 2350 | 2351 |
| 2351 return toHTMLInputElement(element)->setShouldRevealPassword(reveal); | 2352 return toHTMLInputElement(*element).setShouldRevealPassword(reveal); |
| 2352 } | 2353 } |
| 2353 | 2354 |
| 2354 namespace { | 2355 namespace { |
| 2355 | 2356 |
| 2356 class AddOneFunction : public ScriptFunction { | 2357 class AddOneFunction : public ScriptFunction { |
| 2357 public: | 2358 public: |
| 2358 static PassOwnPtr<ScriptFunction> create(ExecutionContext* context) | 2359 static PassOwnPtr<ScriptFunction> create(ExecutionContext* context) |
| 2359 { | 2360 { |
| 2360 return adoptPtr(new AddOneFunction(toIsolate(context))); | 2361 return adoptPtr(new AddOneFunction(toIsolate(context))); |
| 2361 } | 2362 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2409 } | 2410 } |
| 2410 | 2411 |
| 2411 String Internals::textSurroundingNode(Node* node, int x, int y, unsigned long ma
xLength) | 2412 String Internals::textSurroundingNode(Node* node, int x, int y, unsigned long ma
xLength) |
| 2412 { | 2413 { |
| 2413 blink::WebPoint point(x, y); | 2414 blink::WebPoint point(x, y); |
| 2414 SurroundingText surroundingText(VisiblePosition(node->renderer()->positionFo
rPoint(static_cast<IntPoint>(point))), maxLength); | 2415 SurroundingText surroundingText(VisiblePosition(node->renderer()->positionFo
rPoint(static_cast<IntPoint>(point))), maxLength); |
| 2415 return surroundingText.content(); | 2416 return surroundingText.content(); |
| 2416 } | 2417 } |
| 2417 | 2418 |
| 2418 } | 2419 } |
| OLD | NEW |