aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto
Commit message (Collapse)AuthorAgeFilesLines
* PinchHandler: Avoid unwanted translations when axes are disabledShawn Rutledge2019-01-282-1/+89
| | | | | | Fixes: QTBUG-72822 Change-Id: I2773ba14fcb24a47fe2ec04860b4aa305a051453 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* Bring behavior of String.replace() in line with other enginesLars Knoll2019-01-251-0/+59
| | | | | | | | | | | | | | | | "x".replace("x", "$1") gives "$1" in both JSC and V8, as there are no captures that could be used as a replacement for $1. Implement the same behavior as it's the most logical thing to do (even though it's undefined according to the spec). Two digit captures ($nm) work in a way that they get applied if $nm captures exist. If there are less than nm but more than n captures available $n is replaced by the n'th capture and m is copied over verbatim. Change-Id: I8b5f576f2c42c8334859ab7854dcdf07104dd35b Fixes: QTBUG-73152 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Canvas: Guard context pointer against external deletionUlf Hermann2019-01-232-1/+88
| | | | | | | | | You cannot keep the context when reparenting the canvas item. Use a QPointer prevent dangling. Task-number: QTBUG-73113 Change-Id: Ie7021c6f0bb0d09923eb358dc7e51d6727e74a7a Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* MemoryManager: Only clear weak values onceUlf Hermann2019-01-234-3/+90
| | | | | | | | | | | | We want to keep the weak values alive while the destruction callbacks are running, so that they can still access them. We set them to undefined later anyway because we expect the destruction callbacks to mess with the values. Therefore there is no point in also setting them in between. Fixes: QTBUG-72137 Change-Id: I83f70230f5b4ad2761c74770f975b14a5ca71f18 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* QQmlNotifier: Always keep the isNotifying flag when updating senderPtrUlf Hermann2019-01-232-0/+41
| | | | | | | | | | | When the sender gets deleted we still want to retain the flag that tells us that the notifier is currently active. Otherwise we can miss the error message about synchronously deleting objects while signal handlers are in progress. Task-number: QTBUG-73013 Change-Id: I8abba9b492327c15963d1875841c6822f345a89e Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Add handlers declared as Flickable children to its contentItemShawn Rutledge2019-01-227-0/+570
| | | | | | | | | | | | | | | | | | | | | | | | | | QQuickItemPrivate::data_append() was not invoked when any kind of Pointer Handler was directly declared in a Flickable (or subclass) because QQuickFlickable redefines the default property to be its own flickableData property. So we need to repeat the special handling in QQuickFlickablePrivate::data_append() too. The handler must be added to the private->extra->pointerHandlers vector, so that QQuickItemPrivate::handlePointerEvent() will attempt to deliver events to those handlers. TapHandler seems OK (especially with its default gesturePolicy so that it does not do an exclusive grab). PointHandler seems OK. DragHandler competes with Flickable for the exclusive grab. pressDelay can help; or set acceptedDevices: PointerDevice.Mouse to allow the mouse to drag but not flick, and the touchscreen to flick but not drag. Fixes: QTBUG-71918 Fixes: QTBUG-73035 Change-Id: Icb97ed5230abe0cb6ec0230b5b5759a0528df7e8 Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
* Skip shadersource-dynamic-shadersource test on XCB platformUlf Hermann2019-01-222-1/+8
| | | | | | | | | | The test crashes, which is counted as failure, even if the test is blacklisted. It also doesn't only crash on Ubuntu 18.04 but also on Redhat 7.4 and Ubuntu 16.04. Just blacklist it for any linux for now. Task-number: QTBUG-69893 Change-Id: Icc4c41b5d6fa339075b569fcd53220692e882d23 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Merge remote-tracking branch 'origin/5.12.1' into 5.12Qt Forward Merge Bot2019-01-2113-1/+58685
|\ | | | | | | Change-Id: I1e0bbc35807bd0f7f96694539d2fbec0f83ddb16
| * When matching RegExps catch JIT failuresUlf Hermann2019-01-093-0/+62
| | | | | | | | | | | | | | | | | | | | | | | | | | The Yarr JIT can generate code that fails to evaluate the RegExp at runtime. In that case we need to fall back to the interpreter. Also, don't needlessly cast the unsigned return value of RegExp::match to signed int before range-checking it. And fix some typos in the comments for the disassembler dumps. Fixes: QTBUG-72879 Change-Id: Ic8f80c076d6461d714816a9f66e1cac1d9b0c7a8 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * Merge 5.12 into 5.12.1Kari Oikarinen2019-01-0818-125/+240
| |\ | | | | | | | | | Change-Id: Ic746fbce93430867e2eda4bc7155d34e20a4aa2b
| * | Add binary compatibility files for 5.12 for QtDeclarativeMilla Pohjanheimo2018-12-204-0/+58401
| | | | | | | | | | | | | | | | | | | | | Binary compatibility files added. Change-Id: I98e3a26f0f5883217c05dfe35e723bee4f1521f8 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * | CMake: Don't handle empty resource filesAndy Shaw2018-12-172-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | [ChangeLog][Qml] Empty resource files will not be passed to Qt Quick Compiler to be handled when using CMake. Change-Id: I1513d29b70d8a4b08a2947f4a97fbd525c5ace8f Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
| * | TapHandler: clean up when wantsEventPoint returns falseShawn Rutledge2018-12-132-0/+56
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We already emitted grabCanceled() to inform QML callbacks, but we didn't call reset(). It seems more proper to do everything that would normally be done when grab is canceled. TapHandler should not give up its passive grab yet though, because that prevents delivery to any parent Flickable that might be filtering events. A parent Flickable should be able to start flicking after the drag threshold is exceeded (it happens to be exactly when TapHandler gives up). Fixes: QTBUG-71466 Fixes: QTBUG-71970 Change-Id: Ibba1b0de92cfd88547eeb44edb095d019de76a94 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
| * | PointHandler: distribute simultaneous touch presses properlyShawn Rutledge2018-12-132-0/+165
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If multiple touchpoints are pressed simultaneously, each point can be grabbed by one PointHandler instance. Each PointHandler instance cannot grab more than one point, nor grab a point that is already chosen by another PointHandler. This was always the intention, but got broken (perhaps by 3523b676382db4aa39adeb9126d8bb2185e84403), and there was no test coverage of this case until now. Fixes: QTBUG-71431 Change-Id: I6d7614eb4767c677d929291f917cf62d9c03bd93 Reviewed-by: Andre de la Rocha <andre.rocha@qt.io>
* | | Annotate stack traces when frames are elided through tail callsErik Verbruggen2019-01-151-0/+16
| | | | | | | | | | | | | | | | | | Task-number: QTBUG-72407 Change-Id: I98b96852309fc783a945797185f666196513d24b Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* | | QQmlMetaType: Erase attached properties in dtorUlf Hermann2019-01-151-0/+39
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Also, make it more obvious that the attachedPropertyIds are a static member of QQmlTypePrivate. Fixes: QTBUG-72972 Change-Id: If0a28e034dd46d7127993ed15aed11c7641d580e Reviewed-by: Harald Hvaal <harald.hvaal@gmail.com> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Stabilize tst_QQuickPathView::package()Friedemann Kleint2019-01-141-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | Add QQUICK_VERIFY_POLISH. Fixes: QTBUG-73007 Change-Id: I08d90058770ef496469b917892104c751b5cf9c1 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | | tst_qquickapplication: Don't assume app activation is tied to window activationTor Arne Vestbø2019-01-141-25/+31
| | | | | | | | | | | | | | | | | | | | | | | | | | | Follows same approach as 47f6d256ed in tst_qquickapplication::state(). Change-Id: Ibecdab3f874fc9e75b38ba2ccaf3776bd46c77e8 Fixes: QTBUG-72953 Reviewed-by: Liang Qi <liang.qi@qt.io> Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
* | | Avoid crash in property requirements testUlf Hermann2019-01-081-1/+3
| |/ |/| | | | | | | | | | | | | | | | | Pure QML types do not have a meta object hierarchy associated with them. The test is only supposed to test C++ types, though. We can ignore the types without meta objects. Change-Id: I2a40bc0023f6d335c4dbdbc04818da60f47d8787 Fixes: QTBUG-72637 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* | Tests: Don't capture stack value by referenceUlf Hermann2019-01-031-7/+7
| | | | | | | | | | | | | | | | | | We can actually not capture d at all there, as some of the items get deleted before the root object is deleted. Therefore, we need to iterate the children again on receiving the destroyed() signal. Change-Id: Iab7ebc3c731438a21b243284de7515530232828f Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Quote stringified generic variants on JSON.stringifyUlf Hermann2018-12-201-1/+2
| | | | | | | | | | | | | | | | | | | | A string representation of those is unlikely to be actual JSON, and even if it is, we don't want to use it as such. Fixes: QTBUG-72674 Change-Id: I6815366a0176d9725ff4840d3fc545792ce00535 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io> Reviewed-by: Robin Burchell <robin.burchell@crimson.no>
* | Tests: Un-crash image comparison testsFriedemann Kleint2018-12-206-60/+48
| | | | | | | | | | | | | | | | | | | | | | | | When (naively) running the tests with High-DPI scaling active, the test would assert on mismatching image sizes caused by the scaling. Add an error message parameter to QQuickVisualTestUtil::compareImages() for use with QVERIFY2, return false instead of asserting on format/size mismatches and adapt the usages. Remove duplicate code in tst_qquickwindow. Change-Id: I76564f4125798fa1e065a0202b686bc7f5ec5680 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
* | stabilize and standardize tst_qquickwidgetShawn Rutledge2018-12-192-16/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In tst_qquickwidget::enterLeave(), retain the changes from 9d2a929fa4dd0beae3c30fb08d4ed4df7368ea4f rather than the cherry-pick. Don't hard-code 5000ms timeout on qWaitForWindowExposed(): it's the default anyway. Task-number: QTBUG-64397 Change-Id: I67e4566c2c7f9e361a79e3a091436c3391f39786 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> (cherry-picked from commit 239b8f6ee869dbe1f27ec4fa5d5247eff502c47b) Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
* | Un-blacklist qsequentialanimationgroupjob testShawn Rutledge2018-12-131-2/+0
| | | | | | | | | | | | | | Recent Coin statistics seem to tell us that it's been passing. Change-Id: I0d32531266d1642a3fe2b18c0956a3ac589f5ee2 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* | Un-blacklist tst_touchmouse::hoverEnabledShawn Rutledge2018-12-131-3/+0
| | | | | | | | | | | | | | | | | | See if this is stable yet. Recent coin statistics seems to say it's been passing. Task-number: QTBUG-40856 Change-Id: I49372cc514971acf26ac9b9b9a86ea2eb46a9773 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* | Avoid memory leaks in QQmlComponent testUlf Hermann2018-12-121-42/+49
| | | | | | | | | | Change-Id: I33f5f72bf90ba1ba6aef5668fab660421c722ae6 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | QML: Fix registering and unregistering of context objectsUlf Hermann2018-12-123-0/+31
| | | | | | | | | | | | | | | | | | | | | | | | | | | | When we add a context object we need to include it into the list of contextObjects of its outer context, so that the outerContext member can be reset when the outer context disappears. On the flip side, we also need to remove it from this list when the object gets removed. We don't need to reset the inner context of an object when the outer context disappears, though. Fixes: QTBUG-72241 Change-Id: Ifd34650d852642a364df23b697d32e3961d0479b Reviewed-by: Mitch Curtis <mitch.curtis@qt.io> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Fix missing strike outDaniel Engelke2018-12-101-1/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Added <s></s> and <del></del> tag aka strike out to QQuickStyledText. QQuickStyledText covers the essential text decorations, apart from strike out. In order to use it, one had to switch to RichText, which comes with its own overhead and limitations. <s> for no longer accurate or no longer relevant content <del> for removed content Fixes: QTBUG-72376 Change-Id: I3c191d91d57afcc48090facc49d643f8ad708fb4 Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* | TapHandler: ignore scroll events and native gesturesShawn Rutledge2018-12-102-0/+80
| | | | | | | | | | | | | | | | | | | | | | | | | | | | During a 2-finger press (to emulate right click on a trackpad), the OS may also generate a QWheelEvent with ScrollBegin phase just in case scrolling starts. This must not prematurely deactivate the TapHandler. Also if a gesture or wheel event begins as the very first event after an application starts, ensure that subsequent mouse events are not mis-delivered as wheel or gesture events. Fixes: QTBUG-71955 Change-Id: Ic12e116483ab9ad37c4ac3b1d10ccb62e1349e0a Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
* | Merge "Merge remote-tracking branch 'origin/5.12.0' into 5.12" into ↵Ulf Hermann2018-12-101-0/+9
|\ \ | |/ |/| | | refs/staging/5.12
| * Merge remote-tracking branch 'origin/5.12.0' into 5.12Qt Forward Merge Bot2018-12-071-0/+9
| |\ | | | | | | | | | | | | | | | | | | | | | Conflicts: src/qml/jsruntime/qv4script.cpp src/qml/parser/qqmljslexer.cpp Change-Id: I82252a8c504a4b77c45f4f8efe849ff9acb949fd
| | * QML Lexer: Stop scanning template literals on closing '`'v5.12.0-rc2v5.12.0-rc1v5.12.0Ulf Hermann2018-11-191-0/+9
| | | | | | | | | | | | | | | | | | | | | Fixes: QTBUG-71812 Change-Id: I93b99496a7572c0f5128c69b865bb2b4f87d29af Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
* | | Ensure that each Event Handler has an Item parent rather than assertingShawn Rutledge2018-12-072-0/+39
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | QQuickItemPrivate::data_append() was already getting called, but the assert (that the parent was already an Item) was failing in case a handler was declared inside a Window or a Dialog. Fixes: QTBUG-71317 Change-Id: Ia497182e3b4a9722eee97a375f9ee5d4151108e6 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* | | Add dynamically-created Event Handlers to the relevant handlers vectorShawn Rutledge2018-12-073-4/+115
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If any kind of Pointer Handler is created dynamically in JS by calling Component.createObject(), QObject::setParent() is called rather than passing the parent to the constructor, so QQuickItemPrivate::data_append() did not take care of adding the handler to QQuickItemPrivate's extra->pointerHandlers vector. We need to use the auto-parent mechanism (just as we did with handling dynamic creation of nested Windows in 8cb02e23abbefc9d020707fc1a2d8b6eb4e103b6). Added QQuickItemPrivate::addPointerHandler() to put the prepend() and implied setAcceptedMouseButtons() in one place. Fixes: QTBUG-71427 Change-Id: I3be3dd033c1c89e6e5b5c3463e1a720bbe963281 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* | | tst_qquickwidget::enterLeave(): Handle varying screen setupsFriedemann Kleint2018-12-071-5/+9
|/ / | | | | | | | | | | | | | | | | | | Take the available screen geometry and window borders into account when positioning windows and moving cursors. Task-number: QTBUG-64397 Fixes: QTBUG-72305 Change-Id: Ia2b35a0deb144ab7194f7658d599888ff9d4a706 Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
* | Fix compilation with gcc 4.8Ville Voutilainen2018-12-033-12/+12
| | | | | | | | | | | | | | GCC 4.8 doesn't like using QPointers in signal connections. Change-Id: Ide55318374183e52eaf09176a118f7d22b7cfd6e Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | QML: Also clear outerContext's contextObject on destructionUlf Hermann2018-11-303-0/+81
| | | | | | | | | | | | | | | | | | | | | | | | | | | | A QObject can not only be set as contextObject of the own context, but also as contextObject of the outerContext of a respective QQmlData. This can be seen in QQmlObjectCreator::createInstance(...) if isContextObject is true. Therefore, when catching a QObject deletion we need to clear the pointer in the outerContext if that refers to the object being deleted. Fixes: QTBUG-71037 Change-Id: Ib6ba99bd5336f7582486b2128515021245370c60 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Fix parsing of js files via Qt.include()Simon Hausmann2018-11-292-1/+6
| | | | | | | | | | | | | | | | | | | | | | Make sure to parse them as JavaScript, not as QML, so that certain keywords such as char or double map to identifiers as expected. Also removed an unused function. Fixes: QTBUG-71524 Change-Id: Ie8a8dabe717ee12def6af512943e6d01efcf9876 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | JS: Limit expression and statement nesting levelErik Verbruggen2018-11-291-0/+24
| | | | | | | | | | | | | | | | | | This is to prevent extremely deeply nested expressions and statements make the code-generator run out of (native) stack space. Task-number: QTBUG-71087 Change-Id: I8e1a20a361bff3e49101e535754546475a63ca18 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Fix qmlplugindump version dump issueMichal Policht2018-11-234-0/+32
| | | | | | | | | | | | | | | | | | | | Changed major and minor version of created QQmlType. Using major and minor version of a candidate instead of major and minor versions passed to a function. Task-number: QTBUG-67292 Change-Id: I2c30f5e8f49aa0be3a1d5b404ab16eb376ad8092 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* | V4: Avoid copying WeakValues with wrapped QObjectsUlf Hermann2018-11-221-0/+40
| | | | | | | | | | | | | | | | | | | | | | Such WeakValues are kept alive until the respective QObject is deleted. Therefore they are quite expensive. In this case we don't actually need a copy as on retrieval we only want a ReturnValue and on inserting we just want to replace the value in the map. Fixes: QTBUG-71817 Change-Id: I385c55140337d468289046243941077ba1ff61a3 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
* | Ensure our builtin constructors are subclassableLars Knoll2018-11-222-5/+43
| | | | | | | | | | | | | | | | | | Respect the newTarget passed into those constructors and make sure we set up the proto chain correctly. Change-Id: I3d12c7dbef4b33660a6715d73e9fb0f89105167a Fixes: QTBUG-71138 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
* | QQuickText: Signal content height/width changes also when resettingUlf Hermann2018-11-202-0/+21
| | | | | | | | | | | | | | | | | | If we change the content height or content width to the initial one, we still need to signal the change. Fixes: QTBUG-71684 Change-Id: Idf6e3f89423eab3d8f5310c164c5acc5108e0d8b Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
* | QML TypeLoader: Sort composite singletons before recursing into themUlf Hermann2018-11-209-0/+105
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When recursingly loading further types for composite singletons before sorting them, the order in which the recursively referenced types are loaded is random because the composite singletons are kept in an (unordered) hash. Any sorting after loading the child components doesn't help as the recursive references may depend on the types already loaded at that point. Sorting the composite singletons before starting the recursion does help because it eliminates the source of randomness in the system. Fixes: QTBUG-66976 Change-Id: I0fa1f50b36eba8c73eb8d56b4d5118485ab05f35 Reviewed-by: Michael Brasser <michael.brasser@live.com> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | JS: Check pattern target to be an lvalueErik Verbruggen2018-11-191-0/+1
| | | | | | | | | | Change-Id: If9468b93b08ad355f07d1436ca88e8d36be22070 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | JS: Handle check for dangling jump gracefullyErik Verbruggen2018-11-191-0/+1
| | | | | | | | | | | | | | | | | | | | | | The destructor for the Jump object will check if it is linked somewhere. So when doing an early-exit after generating a jump (and before linking it) and after an error occurred, make sure to call link anyway. At this point no code will be generated, so where the jump points to is kinda pointless. Change-Id: I09fa03d4224805a838088acd0c5c83d02b328045 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | QML: Use all available type information to find enum typesUlf Hermann2018-11-193-1/+83
| | | | | | | | | | | | | | | | | | | | | | | | Using the metatype system we can identify most enumeration types statically, without lookup by name. Only if we get UnknownType we have to do a name based lookup. As the name based lookup only checks enums that either belong to the global Qt namespace or the surrounding class, the type based lookup gives better results. Task-number: QTBUG-58454 Change-Id: Id6bd748f37838249defb4c5b2a7628eadc1a8341 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | Fix tiling overflow with BorderImageAllan Sandfeld Jensen2018-11-171-4/+4
| | | | | | | | | | | | | | | | | | Switch the geometry to using quint32 indexes if there are too many tiles. Change-Id: Idf51210299d14737d0d115104060d32f5754dff7 Task-number: QTBUG-58924 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
* | Properly mark variables as unresolved when accessed from evalLars Knoll2018-11-161-1/+0
| | | | | | | | | | | | | | | | | | If we can't resolve the variable and are executing eval code, we need to look it up by name, and not generate a lookup in the global object. Change-Id: I693b3b714651911f72620160bfc463d6dbb00820 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Merge remote-tracking branch 'origin/5.12.0' into 5.12Qt Forward Merge Bot2018-11-1624-1380/+34
|\| | | | | | | Change-Id: I7623438dde316ae1e97802f91991f2e7ccc205a5