Merge remote-tracking branch 'origin/5.12' into 5.13
Change-Id: I6472cd72b27c69257efe54376e428274ebf68050
This commit is contained in:
commit
9a1e4ffa66
|
@ -0,0 +1,89 @@
|
||||||
|
Qt 5.12.5 is a bug-fix release. It maintains both forward and backward
|
||||||
|
compatibility (source and binary) with Qt 5.12.0 through 5.12.4.
|
||||||
|
|
||||||
|
For more details, refer to the online documentation included in this
|
||||||
|
distribution. The documentation is also available online:
|
||||||
|
|
||||||
|
https://doc.qt.io/qt-5/index.html
|
||||||
|
|
||||||
|
The Qt version 5.12 series is binary compatible with the 5.11.x series.
|
||||||
|
Applications compiled for 5.11 will continue to run with 5.12.
|
||||||
|
|
||||||
|
Some of the changes listed in this file include issue tracking numbers
|
||||||
|
corresponding to tasks in the Qt Bug Tracker:
|
||||||
|
|
||||||
|
https://bugreports.qt.io/
|
||||||
|
|
||||||
|
Each of these identifiers can be entered in the bug tracker to obtain more
|
||||||
|
information about a particular change.
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
* Important Behavior Changes *
|
||||||
|
****************************************************************************
|
||||||
|
|
||||||
|
- [QTBUG-76871] TapHandler.point now holds the release position while the
|
||||||
|
tapped() signal is emitted.
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
* QtQml *
|
||||||
|
****************************************************************************
|
||||||
|
|
||||||
|
- [QTBUG-76018] Readonly QML properties can now be templates such as
|
||||||
|
list<...>.
|
||||||
|
- [QTBUG-76085] QQmlApplication engine now automatically loads translation
|
||||||
|
files from resource directories.
|
||||||
|
- [QTBUG-75939] Instances of QJSValue can now safely be passed between
|
||||||
|
threads and destroyed in a different thread.
|
||||||
|
- [QTBUG-75642] Fixed an invalid memory read caused by the JIT compiler.
|
||||||
|
- [QTBUG-71387] Fixed a use-after-free condition caused by calling
|
||||||
|
qmlClearTypeRegistrations().
|
||||||
|
- [QTBUG-76656] Made sure JavaScript "this" points to the right object when
|
||||||
|
calling scope and context properties through lookups.
|
||||||
|
- [QTBUG-76796] Fixed bindings to typeof(<name>) to get re-evaluated when
|
||||||
|
<name> gets defined.
|
||||||
|
- [QTBUG-55407] Avoid invalid memory access when calling setData() on a
|
||||||
|
QQmlComponent constructed without an engine.
|
||||||
|
- [QTBUG-76441] Fixed importing "qrc:/" (with exactly one slash).
|
||||||
|
- [QTBUG-71329] Implemented the missing bits of JavaScript promise chains.
|
||||||
|
- [QTBUG-75983] Fixed null pointer dereference in QQmlXmlHttpRequest.
|
||||||
|
- [QTBUG-77012] Fixed static build issue: multiple definitions of
|
||||||
|
qtPositionAttributeName().
|
||||||
|
- [QTBUG-77102] The component versioning is not enforced when loading
|
||||||
|
singletons.
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
* QtQuick *
|
||||||
|
****************************************************************************
|
||||||
|
|
||||||
|
- Item Views:
|
||||||
|
* [QTBUG-76487] We now properly populate delegates with the populate
|
||||||
|
transition when the view is resized after componentComplete.
|
||||||
|
* [QTBUG-31677] A ListView footer is now positioned correctly after the
|
||||||
|
last item is removed.
|
||||||
|
* [QTBUG-76433][QTBUG-44308] Fixed a crash while doing fast flicking in
|
||||||
|
transitions that use Animators.
|
||||||
|
* [QTBUG-76254] Fixed a crash in QQmlDelegateModel.
|
||||||
|
|
||||||
|
- Input:
|
||||||
|
* [QTBUG-75399] Fixed a crash when using the KeyNavigation attached property.
|
||||||
|
* [QTBUG-76875] DragHandler now respects acceptedButtons.
|
||||||
|
* [QTBUG-71218] If a Controls 2 Button has a DragHandler, the button is
|
||||||
|
now released when the drag begins.
|
||||||
|
|
||||||
|
- Scene graph:
|
||||||
|
* [QTBUG-76603] qmlscene now sets the default surface format earlier
|
||||||
|
and correctly.
|
||||||
|
* [QTBUG-68566] Fixed rendering freeze when using software rendering
|
||||||
|
of WebEngine in QQuickWidget.
|
||||||
|
* [QTBUG-66810] Software rendering: repaint everything when moving
|
||||||
|
between HiDpi and lower-resolution screens.
|
||||||
|
|
||||||
|
- Text:
|
||||||
|
* [QTBUG-77217] Fixed a bug where aligning an image to "top" or "bottom"
|
||||||
|
could cause a crash under certain circumstances.
|
||||||
|
* [QTBUG-76528] Fixed missing glyphs and in some cases crashes when
|
||||||
|
displaying many characters from the same font on a system with a
|
||||||
|
low maximum texture size.
|
||||||
|
* [QTBUG-76528] Fixed a bug when displaying many characters from the same
|
||||||
|
font on a system with a low maximum texture size.
|
||||||
|
* [QTBUG-74761] Added support for text color when using color fonts.
|
|
@ -621,9 +621,9 @@ public:
|
||||||
|
|
||||||
loadPtr(exceptionHandlerAddress(), ScratchRegister);
|
loadPtr(exceptionHandlerAddress(), ScratchRegister);
|
||||||
Jump exitFunction = branchPtr(Equal, ScratchRegister, TrustedImmPtr(0));
|
Jump exitFunction = branchPtr(Equal, ScratchRegister, TrustedImmPtr(0));
|
||||||
|
loadUndefined();
|
||||||
jump(ScratchRegister);
|
jump(ScratchRegister);
|
||||||
exitFunction.link(this);
|
exitFunction.link(this);
|
||||||
loadUndefined();
|
|
||||||
|
|
||||||
if (functionExit.isSet())
|
if (functionExit.isSet())
|
||||||
jump(functionExit);
|
jump(functionExit);
|
||||||
|
|
|
@ -1479,6 +1479,12 @@ void BaselineAssembler::saveAccumulatorInFrame()
|
||||||
offsetof(CallData, accumulator)));
|
offsetof(CallData, accumulator)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BaselineAssembler::loadAccumulatorFromFrame()
|
||||||
|
{
|
||||||
|
pasm()->loadAccumulator(PlatformAssembler::Address(PlatformAssembler::JSStackFrameRegister,
|
||||||
|
offsetof(CallData, accumulator)));
|
||||||
|
}
|
||||||
|
|
||||||
static ReturnedValue TheJitIs__Tail_Calling__ToTheRuntimeSoTheJitFrameIsMissing(CppStackFrame *frame, ExecutionEngine *engine)
|
static ReturnedValue TheJitIs__Tail_Calling__ToTheRuntimeSoTheJitFrameIsMissing(CppStackFrame *frame, ExecutionEngine *engine)
|
||||||
{
|
{
|
||||||
return Runtime::method_tailCall(frame, engine);
|
return Runtime::method_tailCall(frame, engine);
|
||||||
|
@ -1606,7 +1612,6 @@ void BaselineAssembler::deadTemporalZoneCheck(int offsetForSavedIP, int variable
|
||||||
{
|
{
|
||||||
auto valueIsAliveJump = pasm()->jumpNotEmpty();
|
auto valueIsAliveJump = pasm()->jumpNotEmpty();
|
||||||
storeInstructionPointer(offsetForSavedIP);
|
storeInstructionPointer(offsetForSavedIP);
|
||||||
saveAccumulatorInFrame();
|
|
||||||
prepareCallWithArgCount(2);
|
prepareCallWithArgCount(2);
|
||||||
passInt32AsArg(variableName, 1);
|
passInt32AsArg(variableName, 1);
|
||||||
passEngineAsArg(0);
|
passEngineAsArg(0);
|
||||||
|
|
|
@ -153,6 +153,7 @@ public:
|
||||||
void passPointerAsArg(void *ptr, int arg);
|
void passPointerAsArg(void *ptr, int arg);
|
||||||
void callRuntime(const char *functionName, const void *funcPtr, CallResultDestination dest);
|
void callRuntime(const char *functionName, const void *funcPtr, CallResultDestination dest);
|
||||||
void saveAccumulatorInFrame();
|
void saveAccumulatorInFrame();
|
||||||
|
void loadAccumulatorFromFrame();
|
||||||
void jsTailCall(int func, int thisObject, int argc, int argv);
|
void jsTailCall(int func, int thisObject, int argc, int argv);
|
||||||
|
|
||||||
// exception/context stuff
|
// exception/context stuff
|
||||||
|
|
|
@ -77,6 +77,7 @@ void BaselineJIT::generate()
|
||||||
|
|
||||||
#define STORE_IP() as->storeInstructionPointer(nextInstructionOffset())
|
#define STORE_IP() as->storeInstructionPointer(nextInstructionOffset())
|
||||||
#define STORE_ACC() as->saveAccumulatorInFrame()
|
#define STORE_ACC() as->saveAccumulatorInFrame()
|
||||||
|
#define LOAD_ACC() as->loadAccumulatorFromFrame()
|
||||||
#define BASELINEJIT_GENERATE_RUNTIME_CALL(function, destination) \
|
#define BASELINEJIT_GENERATE_RUNTIME_CALL(function, destination) \
|
||||||
as->GENERATE_RUNTIME_CALL(function, destination)
|
as->GENERATE_RUNTIME_CALL(function, destination)
|
||||||
#define BASELINEJIT_GENERATE_TAIL_CALL(function) \
|
#define BASELINEJIT_GENERATE_TAIL_CALL(function) \
|
||||||
|
@ -235,6 +236,7 @@ void BaselineJIT::generate_StoreNameSloppy(int name)
|
||||||
as->passEngineAsArg(0);
|
as->passEngineAsArg(0);
|
||||||
BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_storeNameSloppy, CallResultDestination::Ignore);
|
BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_storeNameSloppy, CallResultDestination::Ignore);
|
||||||
as->checkException();
|
as->checkException();
|
||||||
|
LOAD_ACC();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineJIT::generate_StoreNameStrict(int name)
|
void BaselineJIT::generate_StoreNameStrict(int name)
|
||||||
|
@ -247,6 +249,7 @@ void BaselineJIT::generate_StoreNameStrict(int name)
|
||||||
as->passEngineAsArg(0);
|
as->passEngineAsArg(0);
|
||||||
BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_storeNameStrict, CallResultDestination::Ignore);
|
BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_storeNameStrict, CallResultDestination::Ignore);
|
||||||
as->checkException();
|
as->checkException();
|
||||||
|
LOAD_ACC();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineJIT::generate_LoadElement(int base, int /*traceSlot*/)
|
void BaselineJIT::generate_LoadElement(int base, int /*traceSlot*/)
|
||||||
|
@ -272,6 +275,7 @@ void BaselineJIT::generate_StoreElement(int base, int index, int /*traceSlot*/)
|
||||||
as->passEngineAsArg(0);
|
as->passEngineAsArg(0);
|
||||||
BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_storeElement, CallResultDestination::Ignore);
|
BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_storeElement, CallResultDestination::Ignore);
|
||||||
as->checkException();
|
as->checkException();
|
||||||
|
LOAD_ACC();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineJIT::generate_LoadProperty(int name, int /*traceSlot*/)
|
void BaselineJIT::generate_LoadProperty(int name, int /*traceSlot*/)
|
||||||
|
@ -310,6 +314,7 @@ void BaselineJIT::generate_StoreProperty(int name, int base)
|
||||||
as->passEngineAsArg(0);
|
as->passEngineAsArg(0);
|
||||||
BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_storeProperty, CallResultDestination::Ignore);
|
BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_storeProperty, CallResultDestination::Ignore);
|
||||||
as->checkException();
|
as->checkException();
|
||||||
|
LOAD_ACC();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineJIT::generate_SetLookup(int index, int base)
|
void BaselineJIT::generate_SetLookup(int index, int base)
|
||||||
|
@ -329,7 +334,6 @@ void BaselineJIT::generate_SetLookup(int index, int base)
|
||||||
void BaselineJIT::generate_LoadSuperProperty(int property)
|
void BaselineJIT::generate_LoadSuperProperty(int property)
|
||||||
{
|
{
|
||||||
STORE_IP();
|
STORE_IP();
|
||||||
STORE_ACC();
|
|
||||||
as->prepareCallWithArgCount(2);
|
as->prepareCallWithArgCount(2);
|
||||||
as->passJSSlotAsArg(property, 1);
|
as->passJSSlotAsArg(property, 1);
|
||||||
as->passEngineAsArg(0);
|
as->passEngineAsArg(0);
|
||||||
|
@ -347,6 +351,7 @@ void BaselineJIT::generate_StoreSuperProperty(int property)
|
||||||
as->passEngineAsArg(0);
|
as->passEngineAsArg(0);
|
||||||
BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_storeSuperProperty, CallResultDestination::Ignore);
|
BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_storeSuperProperty, CallResultDestination::Ignore);
|
||||||
as->checkException();
|
as->checkException();
|
||||||
|
LOAD_ACC();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineJIT::generate_Yield()
|
void BaselineJIT::generate_Yield()
|
||||||
|
@ -592,6 +597,7 @@ void BaselineJIT::generate_PushBlockContext(int index)
|
||||||
as->passInt32AsArg(index, 1);
|
as->passInt32AsArg(index, 1);
|
||||||
as->passJSSlotAsArg(0, 0);
|
as->passJSSlotAsArg(0, 0);
|
||||||
BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::pushBlockContext, CallResultDestination::Ignore);
|
BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::pushBlockContext, CallResultDestination::Ignore);
|
||||||
|
as->loadAccumulatorFromFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineJIT::generate_CloneBlockContext()
|
void BaselineJIT::generate_CloneBlockContext()
|
||||||
|
@ -600,6 +606,7 @@ void BaselineJIT::generate_CloneBlockContext()
|
||||||
as->prepareCallWithArgCount(1);
|
as->prepareCallWithArgCount(1);
|
||||||
as->passJSSlotAsArg(CallData::Context, 0);
|
as->passJSSlotAsArg(CallData::Context, 0);
|
||||||
BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::cloneBlockContext, CallResultDestination::Ignore);
|
BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::cloneBlockContext, CallResultDestination::Ignore);
|
||||||
|
as->loadAccumulatorFromFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineJIT::generate_PushScriptContext(int index)
|
void BaselineJIT::generate_PushScriptContext(int index)
|
||||||
|
@ -610,6 +617,7 @@ void BaselineJIT::generate_PushScriptContext(int index)
|
||||||
as->passEngineAsArg(1);
|
as->passEngineAsArg(1);
|
||||||
as->passJSSlotAsArg(0, 0);
|
as->passJSSlotAsArg(0, 0);
|
||||||
BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::pushScriptContext, CallResultDestination::Ignore);
|
BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::pushScriptContext, CallResultDestination::Ignore);
|
||||||
|
as->loadAccumulatorFromFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineJIT::generate_PopScriptContext()
|
void BaselineJIT::generate_PopScriptContext()
|
||||||
|
@ -619,6 +627,7 @@ void BaselineJIT::generate_PopScriptContext()
|
||||||
as->passEngineAsArg(1);
|
as->passEngineAsArg(1);
|
||||||
as->passJSSlotAsArg(0, 0);
|
as->passJSSlotAsArg(0, 0);
|
||||||
BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::popScriptContext, CallResultDestination::Ignore);
|
BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::popScriptContext, CallResultDestination::Ignore);
|
||||||
|
as->loadAccumulatorFromFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineJIT::generate_PopContext() { as->popContext(); }
|
void BaselineJIT::generate_PopContext() { as->popContext(); }
|
||||||
|
@ -719,11 +728,13 @@ void BaselineJIT::generate_TypeofValue()
|
||||||
|
|
||||||
void BaselineJIT::generate_DeclareVar(int varName, int isDeletable)
|
void BaselineJIT::generate_DeclareVar(int varName, int isDeletable)
|
||||||
{
|
{
|
||||||
|
STORE_ACC();
|
||||||
as->prepareCallWithArgCount(3);
|
as->prepareCallWithArgCount(3);
|
||||||
as->passInt32AsArg(varName, 2);
|
as->passInt32AsArg(varName, 2);
|
||||||
as->passInt32AsArg(isDeletable, 1);
|
as->passInt32AsArg(isDeletable, 1);
|
||||||
as->passEngineAsArg(0);
|
as->passEngineAsArg(0);
|
||||||
BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_declareVar, CallResultDestination::Ignore);
|
BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_declareVar, CallResultDestination::Ignore);
|
||||||
|
LOAD_ACC();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineJIT::generate_DefineArray(int argc, int args)
|
void BaselineJIT::generate_DefineArray(int argc, int args)
|
||||||
|
@ -781,11 +792,13 @@ void BaselineJIT::generate_CreateRestParameter(int argIndex)
|
||||||
|
|
||||||
void BaselineJIT::generate_ConvertThisToObject()
|
void BaselineJIT::generate_ConvertThisToObject()
|
||||||
{
|
{
|
||||||
|
STORE_ACC();
|
||||||
as->prepareCallWithArgCount(2);
|
as->prepareCallWithArgCount(2);
|
||||||
as->passJSSlotAsArg(CallData::This, 1);
|
as->passJSSlotAsArg(CallData::This, 1);
|
||||||
as->passEngineAsArg(0);
|
as->passEngineAsArg(0);
|
||||||
BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::convertThisToObject, CallResultDestination::Ignore);
|
BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::convertThisToObject, CallResultDestination::Ignore);
|
||||||
as->checkException();
|
as->checkException();
|
||||||
|
LOAD_ACC();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineJIT::generate_LoadSuperConstructor()
|
void BaselineJIT::generate_LoadSuperConstructor()
|
||||||
|
@ -931,6 +944,7 @@ void BaselineJIT::generate_ThrowOnNullOrUndefined()
|
||||||
as->passEngineAsArg(0);
|
as->passEngineAsArg(0);
|
||||||
BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::throwOnNullOrUndefined, CallResultDestination::Ignore);
|
BASELINEJIT_GENERATE_RUNTIME_CALL(Helpers::throwOnNullOrUndefined, CallResultDestination::Ignore);
|
||||||
as->checkException();
|
as->checkException();
|
||||||
|
LOAD_ACC();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaselineJIT::generate_GetTemplateObject(int index)
|
void BaselineJIT::generate_GetTemplateObject(int index)
|
||||||
|
|
|
@ -727,7 +727,6 @@ QV4::ReturnedValue VME::interpret(CppStackFrame *frame, ExecutionEngine *engine,
|
||||||
|
|
||||||
MOTH_BEGIN_INSTR(LoadSuperProperty)
|
MOTH_BEGIN_INSTR(LoadSuperProperty)
|
||||||
STORE_IP();
|
STORE_IP();
|
||||||
STORE_ACC();
|
|
||||||
acc = Runtime::method_loadSuperProperty(engine, STACK_VALUE(property));
|
acc = Runtime::method_loadSuperProperty(engine, STACK_VALUE(property));
|
||||||
CHECK_EXCEPTION;
|
CHECK_EXCEPTION;
|
||||||
MOTH_END_INSTR(LoadSuperProperty)
|
MOTH_END_INSTR(LoadSuperProperty)
|
||||||
|
@ -884,12 +883,14 @@ QV4::ReturnedValue VME::interpret(CppStackFrame *frame, ExecutionEngine *engine,
|
||||||
|
|
||||||
MOTH_BEGIN_INSTR(Construct)
|
MOTH_BEGIN_INSTR(Construct)
|
||||||
STORE_IP();
|
STORE_IP();
|
||||||
|
STORE_ACC();
|
||||||
acc = Runtime::method_construct(engine, STACK_VALUE(func), ACC, stack + argv, argc);
|
acc = Runtime::method_construct(engine, STACK_VALUE(func), ACC, stack + argv, argc);
|
||||||
CHECK_EXCEPTION;
|
CHECK_EXCEPTION;
|
||||||
MOTH_END_INSTR(Construct)
|
MOTH_END_INSTR(Construct)
|
||||||
|
|
||||||
MOTH_BEGIN_INSTR(ConstructWithSpread)
|
MOTH_BEGIN_INSTR(ConstructWithSpread)
|
||||||
STORE_IP();
|
STORE_IP();
|
||||||
|
STORE_ACC();
|
||||||
acc = Runtime::method_constructWithSpread(engine, STACK_VALUE(func), ACC, stack + argv, argc);
|
acc = Runtime::method_constructWithSpread(engine, STACK_VALUE(func), ACC, stack + argv, argc);
|
||||||
CHECK_EXCEPTION;
|
CHECK_EXCEPTION;
|
||||||
MOTH_END_INSTR(ConstructWithSpread)
|
MOTH_END_INSTR(ConstructWithSpread)
|
||||||
|
@ -917,7 +918,6 @@ QV4::ReturnedValue VME::interpret(CppStackFrame *frame, ExecutionEngine *engine,
|
||||||
MOTH_BEGIN_INSTR(DeadTemporalZoneCheck)
|
MOTH_BEGIN_INSTR(DeadTemporalZoneCheck)
|
||||||
if (ACC.isEmpty()) {
|
if (ACC.isEmpty()) {
|
||||||
STORE_IP();
|
STORE_IP();
|
||||||
STORE_ACC();
|
|
||||||
Runtime::method_throwReferenceError(engine, name);
|
Runtime::method_throwReferenceError(engine, name);
|
||||||
goto handleUnwind;
|
goto handleUnwind;
|
||||||
}
|
}
|
||||||
|
@ -1086,6 +1086,7 @@ QV4::ReturnedValue VME::interpret(CppStackFrame *frame, ExecutionEngine *engine,
|
||||||
if (t->isNullOrUndefined()) {
|
if (t->isNullOrUndefined()) {
|
||||||
*t = engine->globalObject->asReturnedValue();
|
*t = engine->globalObject->asReturnedValue();
|
||||||
} else {
|
} else {
|
||||||
|
STORE_ACC();
|
||||||
*t = t->toObject(engine)->asReturnedValue();
|
*t = t->toObject(engine)->asReturnedValue();
|
||||||
CHECK_EXCEPTION;
|
CHECK_EXCEPTION;
|
||||||
}
|
}
|
||||||
|
@ -1098,6 +1099,7 @@ QV4::ReturnedValue VME::interpret(CppStackFrame *frame, ExecutionEngine *engine,
|
||||||
MOTH_END_INSTR(LoadSuperConstructor)
|
MOTH_END_INSTR(LoadSuperConstructor)
|
||||||
|
|
||||||
MOTH_BEGIN_INSTR(ToObject)
|
MOTH_BEGIN_INSTR(ToObject)
|
||||||
|
STORE_ACC();
|
||||||
acc = ACC.toObject(engine)->asReturnedValue();
|
acc = ACC.toObject(engine)->asReturnedValue();
|
||||||
CHECK_EXCEPTION;
|
CHECK_EXCEPTION;
|
||||||
MOTH_END_INSTR(ToObject)
|
MOTH_END_INSTR(ToObject)
|
||||||
|
|
|
@ -238,12 +238,11 @@ void StringLiteral::accept0(Visitor *visitor)
|
||||||
|
|
||||||
void TemplateLiteral::accept0(Visitor *visitor)
|
void TemplateLiteral::accept0(Visitor *visitor)
|
||||||
{
|
{
|
||||||
if (visitor->visit(this)) {
|
bool accepted = true;
|
||||||
if (next)
|
for (TemplateLiteral *it = this; it && accepted; it = it->next) {
|
||||||
accept(next, visitor);
|
accepted = visitor->visit(it);
|
||||||
|
visitor->endVisit(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
visitor->endVisit(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NumericLiteral::accept0(Visitor *visitor)
|
void NumericLiteral::accept0(Visitor *visitor)
|
||||||
|
@ -1013,13 +1012,13 @@ QStringList FormalParameterList::boundNames() const
|
||||||
|
|
||||||
void FormalParameterList::accept0(Visitor *visitor)
|
void FormalParameterList::accept0(Visitor *visitor)
|
||||||
{
|
{
|
||||||
if (visitor->visit(this)) {
|
bool accepted = true;
|
||||||
accept(element, visitor);
|
for (FormalParameterList *it = this; it && accepted; it = it->next) {
|
||||||
if (next)
|
accepted = visitor->visit(it);
|
||||||
accept(next, visitor);
|
if (accepted)
|
||||||
|
accept(it->element, visitor);
|
||||||
|
visitor->endVisit(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
visitor->endVisit(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FormalParameterList *FormalParameterList::finish(QQmlJS::MemoryPool *pool)
|
FormalParameterList *FormalParameterList::finish(QQmlJS::MemoryPool *pool)
|
||||||
|
@ -1290,12 +1289,14 @@ void UiPragma::accept0(Visitor *visitor)
|
||||||
|
|
||||||
void UiHeaderItemList::accept0(Visitor *visitor)
|
void UiHeaderItemList::accept0(Visitor *visitor)
|
||||||
{
|
{
|
||||||
if (visitor->visit(this)) {
|
bool accepted = true;
|
||||||
accept(headerItem, visitor);
|
for (UiHeaderItemList *it = this; it && accepted; it = it->next) {
|
||||||
accept(next, visitor);
|
accepted = visitor->visit(it);
|
||||||
}
|
if (accepted)
|
||||||
|
accept(it->headerItem, visitor);
|
||||||
|
|
||||||
visitor->endVisit(this);
|
visitor->endVisit(it);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1359,14 +1360,15 @@ void PatternElement::boundNames(QStringList *names)
|
||||||
|
|
||||||
void PatternElementList::accept0(Visitor *visitor)
|
void PatternElementList::accept0(Visitor *visitor)
|
||||||
{
|
{
|
||||||
if (visitor->visit(this)) {
|
bool accepted = true;
|
||||||
accept(elision, visitor);
|
for (PatternElementList *it = this; it && accepted; it = it->next) {
|
||||||
accept(element, visitor);
|
accepted = visitor->visit(it);
|
||||||
if (next)
|
if (accepted) {
|
||||||
accept(next, visitor);
|
accept(it->elision, visitor);
|
||||||
|
accept(it->element, visitor);
|
||||||
|
}
|
||||||
|
visitor->endVisit(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
visitor->endVisit(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PatternElementList::boundNames(QStringList *names)
|
void PatternElementList::boundNames(QStringList *names)
|
||||||
|
@ -1395,13 +1397,13 @@ void PatternProperty::boundNames(QStringList *names)
|
||||||
|
|
||||||
void PatternPropertyList::accept0(Visitor *visitor)
|
void PatternPropertyList::accept0(Visitor *visitor)
|
||||||
{
|
{
|
||||||
if (visitor->visit(this)) {
|
bool accepted = true;
|
||||||
accept(property, visitor);
|
for (PatternPropertyList *it = this; it && accepted; it = it->next) {
|
||||||
if (next)
|
accepted = visitor->visit(it);
|
||||||
accept(next, visitor);
|
if (accepted)
|
||||||
|
accept(it->property, visitor);
|
||||||
|
visitor->endVisit(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
visitor->endVisit(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PatternPropertyList::boundNames(QStringList *names)
|
void PatternPropertyList::boundNames(QStringList *names)
|
||||||
|
@ -1446,13 +1448,14 @@ void ClassDeclaration::accept0(Visitor *visitor)
|
||||||
|
|
||||||
void ClassElementList::accept0(Visitor *visitor)
|
void ClassElementList::accept0(Visitor *visitor)
|
||||||
{
|
{
|
||||||
if (visitor->visit(this)) {
|
bool accepted = true;
|
||||||
accept(property, visitor);
|
for (ClassElementList *it = this; it && accepted; it = it->next) {
|
||||||
if (next)
|
accepted = visitor->visit(it);
|
||||||
accept(next, visitor);
|
if (accepted)
|
||||||
}
|
accept(it->property, visitor);
|
||||||
|
|
||||||
visitor->endVisit(this);
|
visitor->endVisit(it);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassElementList *ClassElementList::finish()
|
ClassElementList *ClassElementList::finish()
|
||||||
|
|
|
@ -781,7 +781,7 @@ void QQuickTextNodeEngine::addToSceneGraph(QQuickTextNode *parentNode,
|
||||||
for (int i = 0; i < m_backgrounds.size(); ++i) {
|
for (int i = 0; i < m_backgrounds.size(); ++i) {
|
||||||
const QRectF &rect = m_backgrounds.at(i).first;
|
const QRectF &rect = m_backgrounds.at(i).first;
|
||||||
const QColor &color = m_backgrounds.at(i).second;
|
const QColor &color = m_backgrounds.at(i).second;
|
||||||
|
if (color.alpha() != 0)
|
||||||
parentNode->addRectangleNode(rect, color);
|
parentNode->addRectangleNode(rect, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 6b0c42c63c2492bd0a7a96d3179d122b5f71793f
|
Subproject commit 3c69133cc419840c1be34638039cd8c48a7ef581
|
|
@ -0,0 +1,16 @@
|
||||||
|
import QtQuick 2.0
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
width: 200
|
||||||
|
height: 200
|
||||||
|
color: "white"
|
||||||
|
Text {
|
||||||
|
objectName: "text"
|
||||||
|
textFormat: Text.RichText
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "black"
|
||||||
|
text: "<h1 style=\"background-color:rgba(255,255,255,0.00)\">foo</h1>"
|
||||||
|
verticalAlignment: Text.AlignTop
|
||||||
|
horizontalAlignment: Text.AlignLeft
|
||||||
|
}
|
||||||
|
}
|
|
@ -164,6 +164,8 @@ private slots:
|
||||||
|
|
||||||
void verticallyAlignedImageInTable();
|
void verticallyAlignedImageInTable();
|
||||||
|
|
||||||
|
void transparentBackground();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QStringList standard;
|
QStringList standard;
|
||||||
QStringList richText;
|
QStringList richText;
|
||||||
|
@ -4429,6 +4431,26 @@ void tst_qquicktext::verticallyAlignedImageInTable()
|
||||||
// Don't crash
|
// Don't crash
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_qquicktext::transparentBackground()
|
||||||
|
{
|
||||||
|
if ((QGuiApplication::platformName() == QLatin1String("offscreen"))
|
||||||
|
|| (QGuiApplication::platformName() == QLatin1String("minimal")))
|
||||||
|
QSKIP("Skipping due to grabToImage not functional on offscreen/minimimal platforms");
|
||||||
|
|
||||||
|
QScopedPointer<QQuickView> window(new QQuickView);
|
||||||
|
window->setSource(testFileUrl("transparentBackground.qml"));
|
||||||
|
QTRY_COMPARE(window->status(), QQuickView::Ready);
|
||||||
|
|
||||||
|
window->show();
|
||||||
|
QVERIFY(QTest::qWaitForWindowExposed(window.data()));
|
||||||
|
QImage img = window->grabWindow();
|
||||||
|
QCOMPARE(img.isNull(), false);
|
||||||
|
|
||||||
|
QColor color = img.pixelColor(0, 0);
|
||||||
|
QCOMPARE(color.red(), 255);
|
||||||
|
QCOMPARE(color.blue(), 255);
|
||||||
|
QCOMPARE(color.green(), 255);
|
||||||
|
}
|
||||||
QTEST_MAIN(tst_qquicktext)
|
QTEST_MAIN(tst_qquicktext)
|
||||||
|
|
||||||
#include "tst_qquicktext.moc"
|
#include "tst_qquicktext.moc"
|
||||||
|
|
Loading…
Reference in New Issue