diff options
Diffstat (limited to 'Source')
465 files changed, 8254 insertions, 3377 deletions
diff --git a/Source/JavaScriptCore/API/JSContextRef.cpp b/Source/JavaScriptCore/API/JSContextRef.cpp index 7c815355b..e2a102948 100644 --- a/Source/JavaScriptCore/API/JSContextRef.cpp +++ b/Source/JavaScriptCore/API/JSContextRef.cpp @@ -185,9 +185,7 @@ JSStringRef JSContextCreateBacktrace(JSContextRef ctx, unsigned maxStackSize) intptr_t sourceID; String urlString; JSValue function; - - String levelStr = String::number(count); - + exec->interpreter()->retrieveLastCaller(callFrame, signedLineNumber, sourceID, urlString, function); if (function) @@ -202,7 +200,7 @@ JSStringRef JSContextCreateBacktrace(JSContextRef ctx, unsigned maxStackSize) if (!builder.isEmpty()) builder.append('\n'); builder.append('#'); - builder.append(levelStr); + builder.appendNumber(count); builder.append(' '); builder.append(functionName); builder.appendLiteral("() at "); diff --git a/Source/JavaScriptCore/CMakeLists.txt b/Source/JavaScriptCore/CMakeLists.txt index 22d571933..2065c5b39 100644 --- a/Source/JavaScriptCore/CMakeLists.txt +++ b/Source/JavaScriptCore/CMakeLists.txt @@ -119,6 +119,7 @@ SET(JavaScriptCore_SOURCES heap/MarkedBlock.cpp heap/MarkedSpace.cpp heap/MarkStack.cpp + heap/SlotVisitor.cpp heap/WeakSet.cpp heap/WeakHandleOwner.cpp heap/WeakBlock.cpp @@ -331,6 +332,7 @@ IF (ENABLE_LLINT) ADD_SOURCE_DEPENDENCIES(${JAVASCRIPTCORE_DIR}/llint/LLIntOffsetsExtractor.cpp ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/LLIntDesiredOffsets.h) ADD_EXECUTABLE(LLIntOffsetsExtractor ${JAVASCRIPTCORE_DIR}/llint/LLIntOffsetsExtractor.cpp) + TARGET_LINK_LIBRARIES(LLIntOffsetsExtractor ${WTF_LIBRARY_NAME}) ADD_CUSTOM_COMMAND( OUTPUT ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/LLIntAssembly.h @@ -407,10 +409,6 @@ TARGET_LINK_LIBRARIES(${JavaScriptCore_LIBRARY_NAME} ${JavaScriptCore_LIBRARIES} SET_TARGET_PROPERTIES(${JavaScriptCore_LIBRARY_NAME} PROPERTIES FOLDER "JavaScriptCore") SET_TARGET_PROPERTIES(${JavaScriptCore_LIBRARY_NAME} PROPERTIES LINK_INTERFACE_LIBRARIES "") -IF (JavaScriptCore_LINK_FLAGS) - ADD_TARGET_PROPERTIES(${JavaScriptCore_LIBRARY_NAME} LINK_FLAGS "${JavaScriptCore_LINK_FLAGS}") -ENDIF () - IF (SHARED_CORE) SET_TARGET_PROPERTIES(${JavaScriptCore_LIBRARY_NAME} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) INSTALL(TARGETS ${JavaScriptCore_LIBRARY_NAME} DESTINATION "${LIB_INSTALL_DIR}") diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog index 83cae4a31..e92f02211 100644 --- a/Source/JavaScriptCore/ChangeLog +++ b/Source/JavaScriptCore/ChangeLog @@ -1,3 +1,351 @@ +2012-09-11 Raphael Kubo da Costa <rakuco@webkit.org> + + [EFL] Rewrite the EFL-related Find modules + https://bugs.webkit.org/show_bug.cgi?id=95237 + + Reviewed by Kenneth Rohde Christiansen. + + * CMakeLists.txt: Stop setting the LINK_FLAGS property. + * PlatformEfl.cmake: Ditto. + * shell/PlatformEfl.cmake: Ditto. + +2012-09-11 Raphael Kubo da Costa <rakuco@webkit.org> + + [EFL] Unreviewed build fix after r128065. + + * CMakeLists.txt: Link against WTF for FastMalloc symbols, which + are needed when building with SYSTEM_MALLOC off. + +2012-09-10 Mark Hahnenberg <mhahnenberg@apple.com> + + Remove m_classInfo from JSCell + https://bugs.webkit.org/show_bug.cgi?id=96311 + + Reviewed by Oliver Hunt. + + Now that no one is using the ClassInfo in JSCell, we can remove it for the greater good. This is a 1.5% win on v8v7 and + a 1.7% win on kraken, and is an overall performance progression. + + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::emitAllocateBasicJSObject): Had to rearrange the order of when we take things off the free list + and when we store the Structure in the object because we would clobber the free list otherwise. This made it not okay for + the structure argument and the scratch register to alias one another. Also removed the store of the ClassInfo pointer in the + object. Yay! + (SpeculativeJIT): + * dfg/DFGSpeculativeJIT32_64.cpp: Since it's no longer okay for for the scratch register and structure register to alias + one another as stated above, had to add an extra temporary for passing the Structure. + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: Ditto. + (JSC::DFG::SpeculativeJIT::compile): + * jit/JITInlineMethods.h: + (JSC::JIT::emitAllocateBasicJSObject): Similar changes to DFG's inline allocation except that it removed the object from + the free list first, so no changes were necessary there. + * llint/LowLevelInterpreter.asm: Change the constants for amount of inline storage to match PropertyOffset.h and remove + the store of the ClassInfo pointer during inline allocation. + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: + * runtime/JSCell.h: Remove the m_classInfo field and associated methods. + (JSCell): + * runtime/JSObject.h: + (JSObject): + * runtime/PropertyOffset.h: Expand the number of inline storage properties to take up the extra space that we're freeing + with the removal of the ClassInfo pointer. + (JSC): + * runtime/Structure.h: + (JSC): + (JSC::JSCell::JSCell): + (JSC::JSCell::finishCreation): + +2012-09-10 Geoffrey Garen <ggaren@apple.com> + + Added large allocation support to MarkedSpace + https://bugs.webkit.org/show_bug.cgi?id=96214 + + Originally reviewed by Oliver Hunt, then I added a design revision by + suggested by Phil Pizlo. + + I expanded the imprecise size classes to cover up to 32KB, then added + an mmap-based allocator for everything bigger. There's a lot of tuning + we could do in these size classes, but currently they're almost + completely unused, so I haven't done any tuning. + + Subtle point: the large allocator is a degenerate case of our free list + logic. Its list only ever contains zero or one items. + + * heap/Heap.h: + (JSC::Heap::allocateStructure): Pipe in size information. + + * heap/MarkedAllocator.cpp: + (JSC::MarkedAllocator::tryAllocateHelper): Handle the case where we + find a free item in the sweep list but the item isn't big enough. This + can happen in the large allocator because it mixes sizes. + + (JSC::MarkedAllocator::tryAllocate): + (JSC::MarkedAllocator::allocateSlowCase): More piping. + + (JSC::MarkedAllocator::allocateBlock): Handle the oversize case. + + (JSC::MarkedAllocator::addBlock): I moved the call to didAddBlock here + because it made more sense. + + * heap/MarkedAllocator.h: + (MarkedAllocator): + (JSC::MarkedAllocator::allocate): + * heap/MarkedSpace.cpp: + (JSC::MarkedSpace::MarkedSpace): + (JSC::MarkedSpace::resetAllocators): + (JSC::MarkedSpace::canonicalizeCellLivenessData): + (JSC::MarkedSpace::isPagedOut): + (JSC::MarkedSpace::freeBlock): + * heap/MarkedSpace.h: + (MarkedSpace): + (JSC::MarkedSpace::allocatorFor): + (JSC::MarkedSpace::destructorAllocatorFor): + (JSC::MarkedSpace::allocateWithoutDestructor): + (JSC::MarkedSpace::allocateWithDestructor): + (JSC::MarkedSpace::allocateStructure): + (JSC::MarkedSpace::forEachBlock): + * runtime/Structure.h: + (JSC::Structure): More piping. + +2012-09-10 Geoffrey Garen <ggaren@apple.com> + + Try to fix the Windows (32-bit) build. + + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_tear_off_arguments): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::emit_op_tear_off_arguments): Get operands 1 and 2, not 1 and 1. :( + + Also took this opportunity to rename to indicate that these values are + not destinations anymore. + +2012-09-10 Geoffrey Garen <ggaren@apple.com> + + DFG misses arguments tear-off for function.arguments if 'arguments' is used + https://bugs.webkit.org/show_bug.cgi?id=96227 + + Reviewed by Gavin Barraclough. + + We've decided not to allow function.arguments to alias the local + 'arguments' object, or a local var or function named 'arguments'. + Aliasing complicates the implementation (cf, this bug) and can produce + surprising behavior for web programmers. + + Eliminating the aliasing has the side-effect of fixing this bug. + + The compatibilty story: function.arguments is deprecated, was never + specified, and throws an exception in strict mode, so we expect it to + disappear over time. Firefox does not alias to 'arguments'; Chrome + does, but not if you use eval or with; IE does; Safari did. + + * dfg/DFGByteCodeParser.cpp: Noticed a little cleanup while verifying + this code. Use the CodeBlock method for better encapsulation. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::retrieveArgumentsFromVMCode): Behavior change: don't + alias. + + * tests/mozilla/js1_4/Functions/function-001.js: + (TestFunction_4): Updated test expectations for changed behavior. + +2012-09-10 Filip Pizlo <fpizlo@apple.com> + + offlineasm has some impossible to implement, and unused, instructions + https://bugs.webkit.org/show_bug.cgi?id=96310 + + Reviewed by Mark Hahnenberg. + + * offlineasm/armv7.rb: + * offlineasm/instructions.rb: + * offlineasm/x86.rb: + +2012-09-09 Geoffrey Garen <ggaren@apple.com> + + Refactored op_tear_off* to support activations that don't allocate space for 'arguments' + https://bugs.webkit.org/show_bug.cgi?id=96231 + + Reviewed by Gavin Barraclough. + + This is a step toward smaller activations. + + As a side-effect, this patch eliminates a load and branch from the hot path + of activation tear-off by moving it to the cold path of arguments tear-off. Our + optimizing assumptions are that activations are common and that reifying the + arguments object is less common. + + * bytecode/CodeBlock.cpp: + (JSC::CodeBlock::dump): + * bytecode/Opcode.h: + (JSC::padOpcodeName): Updated for new opcode lengths. + + * bytecompiler/BytecodeGenerator.cpp: + (JSC::BytecodeGenerator::BytecodeGenerator): + (JSC::BytecodeGenerator::addConstantValue): Added support for JSValue() + in the bytecode, which we use when we have 'arguments' but no activation. + + (JSC::BytecodeGenerator::emitReturn): Always emit tear_off_arguments + if we've allocated the arguments registers. This allows tear_off_activation + not to worry about the arguments object anymore. + + Also, pass the activation and arguments values directly to these opcodes + instead of requiring the opcodes to infer the values through special + registers. This gives us more flexibility to move or eliminate registers. + + * dfg/DFGArgumentsSimplificationPhase.cpp: + (JSC::DFG::ArgumentsSimplificationPhase::run): + * dfg/DFGByteCodeParser.cpp: + (JSC::DFG::ByteCodeParser::parseBlock): + * dfg/DFGNode.h: + (Node): Updated for new opcode lengths. + + * dfg/DFGOperations.cpp: Activation tear-off doesn't worry about the + arguments object anymore. If 'arguments' is in use and reified, it's + responsible for aliasing back to the activation object in tear_off_arguments. + + * dfg/DFGOperations.h: + * dfg/DFGSpeculativeJIT.h: + (JSC::DFG::SpeculativeJIT::callOperation): + (SpeculativeJIT): + * dfg/DFGSpeculativeJIT32_64.cpp: + (JSC::DFG::SpeculativeJIT::compile): + * dfg/DFGSpeculativeJIT64.cpp: + (JSC::DFG::SpeculativeJIT::compile): Don't pass the arguments object to + activation tear-off; do pass the activation object to arguments tear-off. + + * interpreter/Interpreter.cpp: + (JSC::Interpreter::privateExecute): Ditto. + + * jit/JITOpcodes.cpp: + (JSC::JIT::emit_op_tear_off_activation): + (JSC::JIT::emit_op_tear_off_arguments): + * jit/JITOpcodes32_64.cpp: + (JSC::JIT::emit_op_tear_off_activation): + (JSC::JIT::emit_op_tear_off_arguments): + * jit/JITStubs.cpp: + (JSC::DEFINE_STUB_FUNCTION): + * llint/LLIntSlowPaths.cpp: + (JSC::LLInt::LLINT_SLOW_PATH_DECL): + * llint/LowLevelInterpreter32_64.asm: + * llint/LowLevelInterpreter64.asm: Same change in a few more execution engines. + +2012-09-10 Patrick Gansterer <paroga@webkit.org> + + [JSC] Use StringBuilder::appendNumber() instead of String::number() + https://bugs.webkit.org/show_bug.cgi?id=96236 + + Reviewed by Benjamin Poulain. + + * API/JSContextRef.cpp: + (JSContextCreateBacktrace): + +2012-09-06 Mark Hahnenberg <mhahnenberg@apple.com> + + Combine MarkStack and SlotVisitor into single class + https://bugs.webkit.org/show_bug.cgi?id=96043 + + Reviewed by Geoff Garen. + + Move all of MarkStack into SlotVisitor. The remaining stuff in MarkStack.cpp actually has to do + with MarkStack management/allocation. Cleaned up a few of the header files while I was at it. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj: + * JavaScriptCore.xcodeproj/project.pbxproj: + * Target.pri: + * bytecode/CodeBlock.cpp: + * dfg/DFGCommon.h: + * heap/GCThreadSharedData.cpp: + * heap/GCThreadSharedData.h: + (GCThreadSharedData): + * heap/HeapRootVisitor.h: + * heap/MarkStack.cpp: + (JSC): + * heap/MarkStack.h: + (JSC): + (MarkStackSegment): + (JSC::MarkStackSegment::data): + (JSC::MarkStackSegment::capacityFromSize): + (JSC::MarkStackSegment::sizeFromCapacity): + (MarkStackSegmentAllocator): + (MarkStackArray): + * heap/MarkStackInlineMethods.h: + (JSC::MarkStackArray::postIncTop): + (JSC): + (JSC::MarkStackArray::preDecTop): + (JSC::MarkStackArray::setTopForFullSegment): + (JSC::MarkStackArray::setTopForEmptySegment): + (JSC::MarkStackArray::top): + (JSC::MarkStackArray::validatePrevious): + (JSC::MarkStackArray::append): + (JSC::MarkStackArray::canRemoveLast): + (JSC::MarkStackArray::removeLast): + (JSC::MarkStackArray::isEmpty): + (JSC::MarkStackArray::size): + * heap/SlotVisitor.cpp: Added. + (JSC): + (JSC::SlotVisitor::SlotVisitor): + (JSC::SlotVisitor::~SlotVisitor): + (JSC::SlotVisitor::setup): + (JSC::SlotVisitor::reset): + (JSC::SlotVisitor::append): + (JSC::visitChildren): + (JSC::SlotVisitor::donateKnownParallel): + (JSC::SlotVisitor::drain): + (JSC::SlotVisitor::drainFromShared): + (JSC::SlotVisitor::mergeOpaqueRoots): + (JSC::SlotVisitor::startCopying): + (JSC::SlotVisitor::allocateNewSpaceSlow): + (JSC::SlotVisitor::allocateNewSpaceOrPin): + (JSC::JSString::tryHashConstLock): + (JSC::JSString::releaseHashConstLock): + (JSC::JSString::shouldTryHashConst): + (JSC::SlotVisitor::internalAppend): + (JSC::SlotVisitor::copyAndAppend): + (JSC::SlotVisitor::doneCopying): + (JSC::SlotVisitor::harvestWeakReferences): + (JSC::SlotVisitor::finalizeUnconditionalFinalizers): + (JSC::SlotVisitor::validate): + * heap/SlotVisitor.h: + (JSC): + (SlotVisitor): + (JSC::SlotVisitor::sharedData): + (JSC::SlotVisitor::isEmpty): + (JSC::SlotVisitor::visitCount): + (JSC::SlotVisitor::resetChildCount): + (JSC::SlotVisitor::childCount): + (JSC::SlotVisitor::incrementChildCount): + (ParallelModeEnabler): + (JSC::ParallelModeEnabler::ParallelModeEnabler): + (JSC::ParallelModeEnabler::~ParallelModeEnabler): + * heap/SlotVisitorInlineMethods.h: + (JSC::SlotVisitor::append): + (JSC): + (JSC::SlotVisitor::appendUnbarrieredPointer): + (JSC::SlotVisitor::appendUnbarrieredValue): + (JSC::SlotVisitor::internalAppend): + (JSC::SlotVisitor::addWeakReferenceHarvester): + (JSC::SlotVisitor::addUnconditionalFinalizer): + (JSC::SlotVisitor::addOpaqueRoot): + (JSC::SlotVisitor::containsOpaqueRoot): + (JSC::SlotVisitor::opaqueRootCount): + (JSC::SlotVisitor::mergeOpaqueRootsIfNecessary): + (JSC::SlotVisitor::mergeOpaqueRootsIfProfitable): + (JSC::SlotVisitor::donate): + (JSC::SlotVisitor::donateAndDrain): + * jit/JITWriteBarrier.h: + (JSC::SlotVisitor::append): + * jit/JumpReplacementWatchpoint.cpp: + * runtime/JSCell.h: + * runtime/Structure.h: + (JSC::SlotVisitor::internalAppend): + * runtime/WriteBarrier.h: + (JSC): + (JSC::SlotVisitor::append): + (JSC::SlotVisitor::appendValues): + * yarr/YarrJIT.cpp: + 2012-09-10 Hojong Han <hojong.han@samsung.com> [EFL] JIT memory usage is not retrieved diff --git a/Source/JavaScriptCore/GNUmakefile.list.am b/Source/JavaScriptCore/GNUmakefile.list.am index dd584f747..9d8161fdd 100644 --- a/Source/JavaScriptCore/GNUmakefile.list.am +++ b/Source/JavaScriptCore/GNUmakefile.list.am @@ -266,6 +266,7 @@ javascriptcore_sources += \ Source/JavaScriptCore/heap/HeapTimer.cpp \ Source/JavaScriptCore/heap/IncrementalSweeper.h \ Source/JavaScriptCore/heap/IncrementalSweeper.cpp \ + Source/JavaScriptCore/heap/SlotVisitor.cpp \ Source/JavaScriptCore/heap/SlotVisitor.h \ Source/JavaScriptCore/heap/SlotVisitorInlineMethods.h \ Source/JavaScriptCore/heap/HandleStack.cpp \ diff --git a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def index aa7ec78df..843bd1475 100755 --- a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def +++ b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def @@ -63,7 +63,7 @@ EXPORTS ?addSlowCase@Identifier@JSC@@CA?AV?$PassRefPtr@VStringImpl@WTF@@@WTF@@PAVExecState@2@PAVStringImpl@4@@Z ?addSlowCase@Identifier@JSC@@CA?AV?$PassRefPtr@VStringImpl@WTF@@@WTF@@PAVJSGlobalData@2@PAVStringImpl@4@@Z ?addStaticGlobals@JSGlobalObject@JSC@@IAEXPAUGlobalPropertyInfo@12@H@Z - ?allocateSlowCase@MarkedAllocator@JSC@@AAEPAXXZ + ?allocateSlowCase@MarkedAllocator@JSC@@AAEPAXI@Z ?append@StringBuilder@WTF@@QAEXPBEI@Z ?append@StringBuilder@WTF@@QAEXPB_WI@Z ?appendNumber@StringBuilder@WTF@@QAEXH@Z @@ -365,7 +365,7 @@ EXPORTS ?unlock@Mutex@WTF@@QAEXXZ ?unlockAtomicallyInitializedStaticMutex@WTF@@YAXXZ ?unprotect@Heap@JSC@@QAE_NVJSValue@2@@Z - ?validate@MarkStack@JSC@@KAXPAVJSCell@2@@Z + ?validate@SlotVisitor@JSC@@CAXPAVJSCell@2@@Z ?visitChildren@JSGlobalObject@JSC@@SAXPAVJSCell@2@AAVSlotVisitor@2@@Z ?visitChildren@JSGlobalThis@JSC@@KAXPAVJSCell@2@AAVSlotVisitor@2@@Z ?visitChildren@JSObject@JSC@@SAXPAVJSCell@2@AAVSlotVisitor@2@@Z diff --git a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj index a7f7cf9af..43fdfb21a 100644 --- a/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj +++ b/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj @@ -2386,6 +2386,10 @@ >
</File>
<File
+ RelativePath="..\..\heap\SlotVisitor.cpp"
+ >
+ </File>
+ <File
RelativePath="..\..\heap\Strong.h"
>
</File>
diff --git a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj index 948cecc11..7d180ebae 100644 --- a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj +++ b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj @@ -693,6 +693,8 @@ C21122E115DD9AB300790E3A /* GCThreadSharedData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C21122DE15DD9AB300790E3A /* GCThreadSharedData.cpp */; }; C21122E215DD9AB300790E3A /* GCThreadSharedData.h in Headers */ = {isa = PBXBuildFile; fileRef = C21122DF15DD9AB300790E3A /* GCThreadSharedData.h */; settings = {ATTRIBUTES = (Private, ); }; }; C21122E315DD9AB300790E3A /* MarkStackInlineMethods.h in Headers */ = {isa = PBXBuildFile; fileRef = C21122E015DD9AB300790E3A /* MarkStackInlineMethods.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C2160FE715F7E95E00942DFC /* SlotVisitorInlineMethods.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FCB408515C0A3C30048932B /* SlotVisitorInlineMethods.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C225494315F7DBAA0065E898 /* SlotVisitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C225494215F7DBAA0065E898 /* SlotVisitor.cpp */; }; C22B31B9140577D700DB475A /* SamplingCounter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F77008E1402FDD60078EB39 /* SamplingCounter.h */; settings = {ATTRIBUTES = (Private, ); }; }; C240305514B404E60079EB64 /* CopiedSpace.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C240305314B404C90079EB64 /* CopiedSpace.cpp */; }; C25F8BCD157544A900245B71 /* IncrementalSweeper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C25F8BCB157544A900245B71 /* IncrementalSweeper.cpp */; }; @@ -1455,6 +1457,7 @@ C21122DE15DD9AB300790E3A /* GCThreadSharedData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GCThreadSharedData.cpp; sourceTree = "<group>"; }; C21122DF15DD9AB300790E3A /* GCThreadSharedData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCThreadSharedData.h; sourceTree = "<group>"; }; C21122E015DD9AB300790E3A /* MarkStackInlineMethods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MarkStackInlineMethods.h; sourceTree = "<group>"; }; + C225494215F7DBAA0065E898 /* SlotVisitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SlotVisitor.cpp; sourceTree = "<group>"; }; C240305314B404C90079EB64 /* CopiedSpace.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CopiedSpace.cpp; sourceTree = "<group>"; }; C25F8BCB157544A900245B71 /* IncrementalSweeper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IncrementalSweeper.cpp; sourceTree = "<group>"; }; C25F8BCC157544A900245B71 /* IncrementalSweeper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IncrementalSweeper.h; sourceTree = "<group>"; }; @@ -1784,6 +1787,7 @@ 142E312A134FF0A600AFADB5 /* heap */ = { isa = PBXGroup; children = ( + C225494215F7DBAA0065E898 /* SlotVisitor.cpp */, C21122DE15DD9AB300790E3A /* GCThreadSharedData.cpp */, C21122DF15DD9AB300790E3A /* GCThreadSharedData.h */, C21122E015DD9AB300790E3A /* MarkStackInlineMethods.h */, @@ -2527,6 +2531,7 @@ C2B916C214DA014E00CBAC86 /* MarkedAllocator.h in Headers */, FE20CE9E15F04A9500DF3430 /* LLIntCLoop.h in Headers */, C21122E215DD9AB300790E3A /* GCThreadSharedData.h in Headers */, + C2160FE715F7E95E00942DFC /* SlotVisitorInlineMethods.h in Headers */, C2E526BE1590EF000054E48D /* HeapTimer.h in Headers */, C21122E315DD9AB300790E3A /* MarkStackInlineMethods.h in Headers */, C25F8BCE157544A900245B71 /* IncrementalSweeper.h in Headers */, @@ -3503,6 +3508,7 @@ 14874AE515EBDE4A002E3587 /* JSScope.cpp in Sources */, 1442566115EDE98D0066A49B /* JSWithScope.cpp in Sources */, FE20CE9D15F04A9500DF3430 /* LLIntCLoop.cpp in Sources */, + C225494315F7DBAA0065E898 /* SlotVisitor.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Source/JavaScriptCore/PlatformEfl.cmake b/Source/JavaScriptCore/PlatformEfl.cmake index 78a3a1f17..3b4115514 100644 --- a/Source/JavaScriptCore/PlatformEfl.cmake +++ b/Source/JavaScriptCore/PlatformEfl.cmake @@ -18,7 +18,3 @@ IF (ENABLE_GLIB_SUPPORT) ${JAVASCRIPTCORE_DIR}/wtf/gobject ) ENDIF () - -LIST(APPEND JavaScriptCore_LINK_FLAGS - ${ECORE_LDFLAGS} -) diff --git a/Source/JavaScriptCore/Target.pri b/Source/JavaScriptCore/Target.pri index bcbc0363a..336d8008b 100644 --- a/Source/JavaScriptCore/Target.pri +++ b/Source/JavaScriptCore/Target.pri @@ -89,6 +89,7 @@ SOURCES += \ heap/MarkedAllocator.cpp \ heap/MarkedBlock.cpp \ heap/MarkedSpace.cpp \ + heap/SlotVisitor.cpp \ heap/VTableSpectrum.cpp \ heap/WriteBarrierSupport.cpp \ debugger/DebuggerActivation.cpp \ diff --git a/Source/JavaScriptCore/bytecode/CodeBlock.cpp b/Source/JavaScriptCore/bytecode/CodeBlock.cpp index f15e5b0dd..d79a37668 100644 --- a/Source/JavaScriptCore/bytecode/CodeBlock.cpp +++ b/Source/JavaScriptCore/bytecode/CodeBlock.cpp @@ -45,6 +45,7 @@ #include "LowLevelInterpreter.h" #include "MethodCallLinkStatus.h" #include "RepatchBuffer.h" +#include "SlotVisitorInlineMethods.h" #include <stdio.h> #include <wtf/StringExtras.h> #include <wtf/UnusedParam.h> @@ -1406,14 +1407,14 @@ void CodeBlock::dump(ExecState* exec, const Vector<Instruction>::const_iterator& } case op_tear_off_activation: { int r0 = (++it)->u.operand; - int r1 = (++it)->u.operand; - dataLog("[%4d] tear_off_activation\t %s, %s", location, registerName(exec, r0).data(), registerName(exec, r1).data()); + dataLog("[%4d] tear_off_activation\t %s", location, registerName(exec, r0).data()); dumpBytecodeCommentAndNewLine(location); break; } case op_tear_off_arguments: { int r0 = (++it)->u.operand; - dataLog("[%4d] tear_off_arguments %s", location, registerName(exec, r0).data()); + int r1 = (++it)->u.operand; + dataLog("[%4d] tear_off_arguments %s, %s", location, registerName(exec, r0).data(), registerName(exec, r1).data()); dumpBytecodeCommentAndNewLine(location); break; } diff --git a/Source/JavaScriptCore/bytecode/Opcode.h b/Source/JavaScriptCore/bytecode/Opcode.h index a63cccaec..5cbae8a09 100644 --- a/Source/JavaScriptCore/bytecode/Opcode.h +++ b/Source/JavaScriptCore/bytecode/Opcode.h @@ -174,8 +174,8 @@ namespace JSC { macro(op_call, 6) \ macro(op_call_eval, 6) \ macro(op_call_varargs, 5) \ - macro(op_tear_off_activation, 3) \ - macro(op_tear_off_arguments, 2) \ + macro(op_tear_off_activation, 2) \ + macro(op_tear_off_arguments, 3) \ macro(op_ret, 2) \ macro(op_call_put_result, 3) /* has value profiling */ \ macro(op_ret_object_or_this, 3) \ diff --git a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp index 52b576da2..82f9d6f60 100644 --- a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp +++ b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp @@ -272,6 +272,7 @@ BytecodeGenerator::BytecodeGenerator(ProgramNode* programNode, JSScope* scope, S , m_scopeNode(programNode) , m_codeBlock(codeBlock) , m_thisRegister(CallFrame::thisArgumentOffset()) + , m_emptyValueRegister(0) , m_finallyDepth(0) , m_dynamicScopeDepth(0) , m_baseScopeDepth(0) @@ -353,6 +354,7 @@ BytecodeGenerator::BytecodeGenerator(FunctionBodyNode* functionBody, JSScope* sc , m_scopeNode(functionBody) , m_codeBlock(codeBlock) , m_activationRegister(0) + , m_emptyValueRegister(0) , m_finallyDepth(0) , m_dynamicScopeDepth(0) , m_baseScopeDepth(0) @@ -386,8 +388,6 @@ BytecodeGenerator::BytecodeGenerator(FunctionBodyNode* functionBody, JSScope* sc m_codeBlock->setActivationRegister(m_activationRegister->index()); } - // Both op_tear_off_activation and op_tear_off_arguments tear off the 'arguments' - // object, if created. if (m_codeBlock->needsFullScopeChain() || functionBody->usesArguments()) { RegisterID* unmodifiedArgumentsRegister = addVar(); // Anonymous, so it can't be modified by user code. RegisterID* argumentsRegister = addVar(propertyNames().arguments, false); // Can be changed by assigning to 'arguments'. @@ -526,6 +526,7 @@ BytecodeGenerator::BytecodeGenerator(EvalNode* evalNode, JSScope* scope, SymbolT , m_scopeNode(evalNode) , m_codeBlock(codeBlock) , m_thisRegister(CallFrame::thisArgumentOffset()) + , m_emptyValueRegister(0) , m_finallyDepth(0) , m_dynamicScopeDepth(0) , m_baseScopeDepth(codeBlock->baseScopeDepth()) @@ -1111,18 +1112,33 @@ unsigned BytecodeGenerator::addConstant(const Identifier& ident) return result.iterator->second; } +// We can't hash JSValue(), so we use a dedicated data member to cache it. +RegisterID* BytecodeGenerator::addConstantEmptyValue() +{ + if (!m_emptyValueRegister) { + int index = m_nextConstantOffset; + m_constantPoolRegisters.append(FirstConstantRegisterIndex + m_nextConstantOffset); + ++m_nextConstantOffset; + m_codeBlock->addConstant(JSValue()); + m_emptyValueRegister = &m_constantPoolRegisters[index]; + } + + return m_emptyValueRegister; +} + RegisterID* BytecodeGenerator::addConstantValue(JSValue v) { - int index = m_nextConstantOffset; + if (!v) + return addConstantEmptyValue(); + int index = m_nextConstantOffset; JSValueMap::AddResult result = m_jsValueMap.add(JSValue::encode(v), m_nextConstantOffset); if (result.isNewEntry) { m_constantPoolRegisters.append(FirstConstantRegisterIndex + m_nextConstantOffset); ++m_nextConstantOffset; - m_codeBlock->addConstant(JSValue(v)); + m_codeBlock->addConstant(v); } else index = result.iterator->second; - return &m_constantPoolRegisters[index]; } @@ -2046,10 +2062,12 @@ RegisterID* BytecodeGenerator::emitReturn(RegisterID* src) if (m_codeBlock->needsFullScopeChain()) { emitOpcode(op_tear_off_activation); instructions().append(m_activationRegister->index()); - instructions().append(m_codeBlock->argumentsRegister()); - } else if (m_codeBlock->usesArguments() && m_codeBlock->numParameters() != 1 && !m_codeBlock->isStrictMode()) { + } + + if (m_codeBlock->usesArguments() && m_codeBlock->numParameters() != 1 && !m_codeBlock->isStrictMode()) { emitOpcode(op_tear_off_arguments); instructions().append(m_codeBlock->argumentsRegister()); + instructions().append(m_activationRegister ? m_activationRegister->index() : emitLoad(0, JSValue())->index()); } // Constructors use op_ret_object_or_this to check the result is an diff --git a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h index 037a2ce25..28a806eb3 100644 --- a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h +++ b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h @@ -637,6 +637,7 @@ namespace JSC { unsigned addConstant(const Identifier&); RegisterID* addConstantValue(JSValue); + RegisterID* addConstantEmptyValue(); unsigned addRegExp(RegExp*); unsigned addConstantBuffer(unsigned length); @@ -713,6 +714,7 @@ namespace JSC { RegisterID m_thisRegister; RegisterID m_calleeRegister; RegisterID* m_activationRegister; + RegisterID* m_emptyValueRegister; SegmentedVector<RegisterID, 32> m_constantPoolRegisters; SegmentedVector<RegisterID, 32> m_calleeRegisters; SegmentedVector<RegisterID, 32> m_parameters; diff --git a/Source/JavaScriptCore/dfg/DFGArgumentsSimplificationPhase.cpp b/Source/JavaScriptCore/dfg/DFGArgumentsSimplificationPhase.cpp index 640a0a966..ab0da20c7 100644 --- a/Source/JavaScriptCore/dfg/DFGArgumentsSimplificationPhase.cpp +++ b/Source/JavaScriptCore/dfg/DFGArgumentsSimplificationPhase.cpp @@ -616,6 +616,7 @@ public: node.setOpAndDefaultFlags(Nop); m_graph.clearAndDerefChild1(node); + m_graph.clearAndDerefChild2(node); node.setRefCount(0); break; } diff --git a/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp b/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp index b96b8d9a3..201c42e71 100644 --- a/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp +++ b/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp @@ -2855,13 +2855,13 @@ bool ByteCodeParser::parseBlock(unsigned limit) } case op_tear_off_activation: { - addToGraph(TearOffActivation, OpInfo(unmodifiedArgumentsRegister(currentInstruction[2].u.operand)), get(currentInstruction[1].u.operand), get(currentInstruction[2].u.operand)); + addToGraph(TearOffActivation, get(currentInstruction[1].u.operand)); NEXT_OPCODE(op_tear_off_activation); } - + case op_tear_off_arguments: { m_graph.m_hasArguments = true; - addToGraph(TearOffArguments, get(unmodifiedArgumentsRegister(currentInstruction[1].u.operand))); + addToGraph(TearOffArguments, get(unmodifiedArgumentsRegister(currentInstruction[1].u.operand)), get(currentInstruction[2].u.operand)); NEXT_OPCODE(op_tear_off_arguments); } @@ -3191,7 +3191,7 @@ ByteCodeParser::InlineStackEntry::InlineStackEntry( inlineCallFrame.capturedVars.set(i); } - if (codeBlock->usesArguments() || codeBlock->needsActivation()) { + if (codeBlock->argumentsAreCaptured()) { for (int i = argumentCountIncludingThis; i--;) inlineCallFrame.capturedVars.set(argumentToOperand(i) + inlineCallFrame.stackOffset); } diff --git a/Source/JavaScriptCore/dfg/DFGCommon.h b/Source/JavaScriptCore/dfg/DFGCommon.h index ddbefd2d5..c3726ed85 100644 --- a/Source/JavaScriptCore/dfg/DFGCommon.h +++ b/Source/JavaScriptCore/dfg/DFGCommon.h @@ -31,6 +31,7 @@ #if ENABLE(DFG_JIT) #include "CodeOrigin.h" +#include "Options.h" #include "VirtualRegister.h" /* DFG_ENABLE() - turn on a specific features in the DFG JIT */ diff --git a/Source/JavaScriptCore/dfg/DFGNode.h b/Source/JavaScriptCore/dfg/DFGNode.h index fb31f935e..0a51b71d7 100644 --- a/Source/JavaScriptCore/dfg/DFGNode.h +++ b/Source/JavaScriptCore/dfg/DFGNode.h @@ -337,12 +337,6 @@ struct Node { return variableAccessData()->local(); } - VirtualRegister unmodifiedArgumentsRegister() - { - ASSERT(op() == TearOffActivation); - return static_cast<VirtualRegister>(m_opInfo); - } - VirtualRegister unlinkedLocal() { ASSERT(op() == GetLocalUnlinked); diff --git a/Source/JavaScriptCore/dfg/DFGOperations.cpp b/Source/JavaScriptCore/dfg/DFGOperations.cpp index 824a0a37a..b5bfd2334 100644 --- a/Source/JavaScriptCore/dfg/DFGOperations.cpp +++ b/Source/JavaScriptCore/dfg/DFGOperations.cpp @@ -1165,40 +1165,28 @@ JSCell* DFG_OPERATION operationCreateInlinedArguments( return result; } -void DFG_OPERATION operationTearOffActivation(ExecState* exec, JSCell* activationCell, int32_t unmodifiedArgumentsRegister) +void DFG_OPERATION operationTearOffActivation(ExecState* exec, JSCell* activationCell) { JSGlobalData& globalData = exec->globalData(); NativeCallFrameTracer tracer(&globalData, exec); - if (!activationCell) { - if (JSValue v = exec->uncheckedR(unmodifiedArgumentsRegister).jsValue()) { - if (!exec->codeBlock()->isStrictMode()) - asArguments(v)->tearOff(exec); - } - return; - } - JSActivation* activation = jsCast<JSActivation*>(activationCell); - activation->tearOff(exec->globalData()); - if (JSValue v = exec->uncheckedR(unmodifiedArgumentsRegister).jsValue()) - asArguments(v)->didTearOffActivation(exec->globalData(), activation); + jsCast<JSActivation*>(activationCell)->tearOff(exec->globalData()); } - -void DFG_OPERATION operationTearOffArguments(ExecState* exec, JSCell* argumentsCell) +void DFG_OPERATION operationTearOffArguments(ExecState* exec, JSCell* argumentsCell, JSCell* activationCell) { ASSERT(exec->codeBlock()->usesArguments()); - ASSERT(!exec->codeBlock()->needsFullScopeChain()); - asArguments(argumentsCell)->tearOff(exec); + if (activationCell) { + jsCast<Arguments*>(argumentsCell)->didTearOffActivation(exec->globalData(), jsCast<JSActivation*>(activationCell)); + return; + } + jsCast<Arguments*>(argumentsCell)->tearOff(exec); } void DFG_OPERATION operationTearOffInlinedArguments( - ExecState* exec, JSCell* argumentsCell, InlineCallFrame* inlineCallFrame) -{ - // This should only be called when the inline code block uses arguments but does not - // need a full scope chain. We could assert it, except that the assertion would be - // rather expensive and may cause side effects that would greatly diverge debug-mode - // behavior from release-mode behavior, since getting the code block of an inline - // call frame implies call frame reification. - asArguments(argumentsCell)->tearOff(exec, inlineCallFrame); + ExecState* exec, JSCell* argumentsCell, JSCell* activationCell, InlineCallFrame* inlineCallFrame) +{ + ASSERT_UNUSED(activationCell, !activationCell); // Currently, we don't inline functions with activations. + jsCast<Arguments*>(argumentsCell)->tearOff(exec, inlineCallFrame); } EncodedJSValue DFG_OPERATION operationGetArgumentsLength(ExecState* exec, int32_t argumentsRegister) diff --git a/Source/JavaScriptCore/dfg/DFGOperations.h b/Source/JavaScriptCore/dfg/DFGOperations.h index 82babe875..aa52703c7 100644 --- a/Source/JavaScriptCore/dfg/DFGOperations.h +++ b/Source/JavaScriptCore/dfg/DFGOperations.h @@ -98,8 +98,10 @@ typedef size_t DFG_OPERATION (*S_DFGOperation_J)(EncodedJSValue); typedef void DFG_OPERATION (*V_DFGOperation_EAZJ)(ExecState*, JSArray*, int32_t, EncodedJSValue); typedef void DFG_OPERATION (*V_DFGOperation_EC)(ExecState*, JSCell*); typedef void DFG_OPERATION (*V_DFGOperation_ECIcf)(ExecState*, JSCell*, InlineCallFrame*); +typedef void DFG_OPERATION (*V_DFGOperation_ECCIcf)(ExecState*, JSCell*, JSCell*, InlineCallFrame*); typedef void DFG_OPERATION (*V_DFGOperation_ECJJ)(ExecState*, JSCell*, EncodedJSValue, EncodedJSValue); typedef void DFG_OPERATION (*V_DFGOperation_ECZ)(ExecState*, JSCell*, int32_t); +typedef void DFG_OPERATION (*V_DFGOperation_ECC)(ExecState*, JSCell*, JSCell*); typedef void DFG_OPERATION (*V_DFGOperation_EJCI)(ExecState*, EncodedJSValue, JSCell*, Identifier*); typedef void DFG_OPERATION (*V_DFGOperation_EJJJ)(ExecState*, EncodedJSValue, EncodedJSValue, EncodedJSValue); typedef void DFG_OPERATION (*V_DFGOperation_EJPP)(ExecState*, EncodedJSValue, EncodedJSValue, void*); @@ -173,9 +175,9 @@ char* DFG_OPERATION operationLinkConstruct(ExecState*) WTF_INTERNAL; JSCell* DFG_OPERATION operationCreateActivation(ExecState*) WTF_INTERNAL; JSCell* DFG_OPERATION operationCreateArguments(ExecState*) WTF_INTERNAL; JSCell* DFG_OPERATION operationCreateInlinedArguments(ExecState*, InlineCallFrame*) WTF_INTERNAL; -void DFG_OPERATION operationTearOffActivation(ExecState*, JSCell*, int32_t unmodifiedArgumentsRegister) WTF_INTERNAL; -void DFG_OPERATION operationTearOffArguments(ExecState*, JSCell*) WTF_INTERNAL; -void DFG_OPERATION operationTearOffInlinedArguments(ExecState*, JSCell*, InlineCallFrame*) WTF_INTERNAL; +void DFG_OPERATION operationTearOffActivation(ExecState*, JSCell*) WTF_INTERNAL; +void DFG_OPERATION operationTearOffArguments(ExecState*, JSCell*, JSCell*) WTF_INTERNAL; +void DFG_OPERATION operationTearOffInlinedArguments(ExecState*, JSCell*, JSCell*, InlineCallFrame*) WTF_INTERNAL; EncodedJSValue DFG_OPERATION operationGetArgumentsLength(ExecState*, int32_t) WTF_INTERNAL; EncodedJSValue DFG_OPERATION operationGetInlinedArgumentByVal(ExecState*, int32_t, InlineCallFrame*, int32_t) WTF_INTERNAL; EncodedJSValue DFG_OPERATION operationGetArgumentByVal(ExecState*, int32_t, int32_t) WTF_INTERNAL; diff --git a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h index f7b125e1b..06a8d9e31 100644 --- a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h +++ b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h @@ -1353,6 +1353,11 @@ public: m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(arg2)); return appendCallWithExceptionCheck(operation); } + JITCompiler::Call callOperation(V_DFGOperation_ECCIcf operation, GPRReg arg1, GPRReg arg2, InlineCallFrame* arg3) + { + m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(arg3)); + return appendCallWithExceptionCheck(operation); + } JITCompiler::Call callOperation(V_DFGOperation_EJPP operation, GPRReg arg1, GPRReg arg2, void* pointer) { m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(pointer)); @@ -1388,6 +1393,11 @@ public: m_jit.setupArgumentsWithExecState(arg1, TrustedImm32(arg2)); return appendCallWithExceptionCheck(operation); } + JITCompiler::Call callOperation(V_DFGOperation_ECC operation, GPRReg arg1, GPRReg arg2) + { + m_jit.setupArgumentsWithExecState(arg1, arg2); + return appendCallWithExceptionCheck(operation); + } JITCompiler::Call callOperation(V_DFGOperation_W operation, WatchpointSet* watchpointSet) { m_jit.setupArguments(TrustedImmPtr(watchpointSet)); @@ -1651,6 +1661,11 @@ public: m_jit.setupArgumentsWithExecState(arg1, TrustedImmPtr(inlineCallFrame)); return appendCallWithExceptionCheck(operation); } + JITCompiler::Call callOperation(V_DFGOperation_ECCIcf operation, GPRReg arg1, GPRReg arg2, InlineCallFrame* inlineCallFrame) + { + m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(inlineCallFrame)); + return appendCallWithExceptionCheck(operation); + } JITCompiler::Call callOperation(V_DFGOperation_EJPP operation, GPRReg arg1Tag, GPRReg arg1Payload, GPRReg arg2, void* pointer) { m_jit.setupArgumentsWithExecState(EABI_32BIT_DUMMY_ARG arg1Payload, arg1Tag, arg2, TrustedImmPtr(pointer)); @@ -1671,6 +1686,11 @@ public: m_jit.setupArgumentsWithExecState(arg1, TrustedImm32(arg2)); return appendCallWithExceptionCheck(operation); } + JITCompiler::Call callOperation(V_DFGOperation_ECC operation, GPRReg arg1, GPRReg arg2) + { + m_jit.setupArgumentsWithExecState(arg1, arg2); + return appendCallWithExceptionCheck(operation); + } JITCompiler::Call callOperation(V_DFGOperation_EPZJ operation, GPRReg arg1, GPRReg arg2, GPRReg arg3Tag, GPRReg arg3Payload) { m_jit.setupArgumentsWithExecState(arg1, arg2, EABI_32BIT_DUMMY_ARG arg3Payload, arg3Tag); @@ -1696,6 +1716,11 @@ public: { return callOperation(operation, arg1, arg2); } + template<typename FunctionType, typename ArgumentType1, typename ArgumentType2, typename ArgumentType3> + JITCompiler::Call callOperation(FunctionType operation, NoResultTag, ArgumentType1 arg1, ArgumentType2 arg2, ArgumentType3 arg3) + { + return callOperation(operation, arg1, arg2, arg3); + } template<typename FunctionType, typename ArgumentType1, typename ArgumentType2, typename ArgumentType3, typename ArgumentType4> JITCompiler::Call callOperation(FunctionType operation, NoResultTag, ArgumentType1 arg1, ArgumentType2 arg2, ArgumentType3 arg3, ArgumentType4 arg4) { @@ -2136,7 +2161,9 @@ public: void compileNewFunctionNoCheck(Node&); void compileNewFunctionExpression(Node&); bool compileRegExpExec(Node&); - + + // It is NOT okay for the structure and the scratch register to be the same thing because if they are then the Structure will + // get clobbered. template <typename ClassType, bool destructor, typename StructureType> void emitAllocateBasicJSObject(StructureType structure, GPRReg resultGPR, GPRReg scratchGPR, MacroAssembler::JumpList& slowPath) { @@ -2151,24 +2178,16 @@ public: // The object is half-allocated: we have what we know is a fresh object, but // it's still on the GC's free list. - - // Ditch the structure by placing it into the structure slot, so that we can reuse - // scratchGPR. - m_jit.storePtr(structure, MacroAssembler::Address(resultGPR, JSObject::structureOffset())); - - // Now that we have scratchGPR back, remove the object from the free list m_jit.loadPtr(MacroAssembler::Address(resultGPR), scratchGPR); m_jit.storePtr(scratchGPR, &allocator->m_freeList.head); - - // Initialize the object's classInfo pointer - m_jit.storePtr(MacroAssembler::TrustedImmPtr(&ClassType::s_info), MacroAssembler::Address(resultGPR, JSCell::classInfoOffset())); + + // Initialize the object's Structure. + m_jit.storePtr(structure, MacroAssembler::Address(resultGPR, JSCell::structureOffset())); // Initialize the object's property storage pointer. m_jit.storePtr(MacroAssembler::TrustedImmPtr(0), MacroAssembler::Address(resultGPR, ClassType::offsetOfOutOfLineStorage())); } - // It is acceptable to have structure be equal to scratch, so long as you're fine - // with the structure GPR being clobbered. template<typename T> void emitAllocateJSFinalObject(T structure, GPRReg resultGPR, GPRReg scratchGPR, MacroAssembler::JumpList& slowPath) { diff --git a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp index 34b8dae46..38889fd05 100644 --- a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp +++ b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp @@ -3296,18 +3296,20 @@ void SpeculativeJIT::compile(Node& node) SpeculateCellOperand callee(this, node.child1()); GPRTemporary result(this); + GPRTemporary structure(this); GPRTemporary scratch(this); GPRReg calleeGPR = callee.gpr(); GPRReg resultGPR = result.gpr(); + GPRReg structureGPR = structure.gpr(); GPRReg scratchGPR = scratch.gpr(); // Load the inheritorID. If the inheritorID is not set, go to slow path. - m_jit.loadPtr(MacroAssembler::Address(calleeGPR, JSFunction::offsetOfCachedInheritorID()), scratchGPR); + m_jit.loadPtr(MacroAssembler::Address(calleeGPR, JSFunction::offsetOfCachedInheritorID()), structureGPR); MacroAssembler::JumpList slowPath; - slowPath.append(m_jit.branchTestPtr(MacroAssembler::Zero, scratchGPR)); + slowPath.append(m_jit.branchTestPtr(MacroAssembler::Zero, structureGPR)); - emitAllocateJSFinalObject(scratchGPR, resultGPR, scratchGPR, slowPath); + emitAllocateJSFinalObject(structureGPR, resultGPR, scratchGPR, slowPath); addSlowPathGenerator(slowPathCall(slowPath, this, operationCreateThis, resultGPR, calleeGPR)); @@ -4023,43 +4025,39 @@ void SpeculativeJIT::compile(Node& node) case TearOffActivation: { JSValueOperand activationValue(this, node.child1()); - JSValueOperand argumentsValue(this, node.child2()); GPRReg activationValueTagGPR = activationValue.tagGPR(); GPRReg activationValuePayloadGPR = activationValue.payloadGPR(); - GPRReg argumentsValueTagGPR = argumentsValue.tagGPR(); - - JITCompiler::JumpList created; - created.append(m_jit.branch32(JITCompiler::NotEqual, activationValueTagGPR, TrustedImm32(JSValue::EmptyValueTag))); - created.append(m_jit.branch32(JITCompiler::NotEqual, argumentsValueTagGPR, TrustedImm32(JSValue::EmptyValueTag))); - + + JITCompiler::Jump created = m_jit.branch32(JITCompiler::NotEqual, activationValueTagGPR, TrustedImm32(JSValue::EmptyValueTag)); + addSlowPathGenerator( slowPathCall( - created, this, operationTearOffActivation, NoResult, activationValuePayloadGPR, - static_cast<int32_t>(node.unmodifiedArgumentsRegister()))); + created, this, operationTearOffActivation, NoResult, activationValuePayloadGPR)); noResult(m_compileIndex); break; } case TearOffArguments: { - JSValueOperand argumentsValue(this, node.child1()); - GPRReg argumentsValueTagGPR = argumentsValue.tagGPR(); - GPRReg argumentsValuePayloadGPR = argumentsValue.payloadGPR(); + JSValueOperand unmodifiedArgumentsValue(this, node.child1()); + JSValueOperand activationValue(this, node.child2()); + GPRReg unmodifiedArgumentsValuePayloadGPR = unmodifiedArgumentsValue.payloadGPR(); + GPRReg activationValuePayloadGPR = activationValue.payloadGPR(); - JITCompiler::Jump created = m_jit.branch32( - JITCompiler::NotEqual, argumentsValueTagGPR, TrustedImm32(JSValue::EmptyValueTag)); + JITCompiler::Jump created = m_jit.branchTest32( + JITCompiler::NonZero, unmodifiedArgumentsValuePayloadGPR); if (node.codeOrigin.inlineCallFrame) { addSlowPathGenerator( slowPathCall( created, this, operationTearOffInlinedArguments, NoResult, - argumentsValuePayloadGPR, node.codeOrigin.inlineCallFrame)); + unmodifiedArgumentsValuePayloadGPR, activationValuePayloadGPR, node.codeOrigin.inlineCallFrame)); } else { addSlowPathGenerator( slowPathCall( created, this, operationTearOffArguments, NoResult, - argumentsValuePayloadGPR)); + unmodifiedArgumentsValuePayloadGPR, activationValuePayloadGPR)); } noResult(m_compileIndex); diff --git a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp index a1ac899a2..0435df930 100644 --- a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp +++ b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp @@ -3289,18 +3289,20 @@ void SpeculativeJIT::compile(Node& node) SpeculateCellOperand callee(this, node.child1()); GPRTemporary result(this); + GPRTemporary structure(this); GPRTemporary scratch(this); GPRReg calleeGPR = callee.gpr(); GPRReg resultGPR = result.gpr(); + GPRReg structureGPR = structure.gpr(); GPRReg scratchGPR = scratch.gpr(); // Load the inheritorID. If the inheritorID is not set, go to slow path. - m_jit.loadPtr(MacroAssembler::Address(calleeGPR, JSFunction::offsetOfCachedInheritorID()), scratchGPR); + m_jit.loadPtr(MacroAssembler::Address(calleeGPR, JSFunction::offsetOfCachedInheritorID()), structureGPR); MacroAssembler::JumpList slowPath; - slowPath.append(m_jit.branchTestPtr(MacroAssembler::Zero, scratchGPR)); + slowPath.append(m_jit.branchTestPtr(MacroAssembler::Zero, structureGPR)); - emitAllocateJSFinalObject(scratchGPR, resultGPR, scratchGPR, slowPath); + emitAllocateJSFinalObject(structureGPR, resultGPR, scratchGPR, slowPath); addSlowPathGenerator(slowPathCall(slowPath, this, operationCreateThis, resultGPR, calleeGPR)); @@ -3972,43 +3974,40 @@ void SpeculativeJIT::compile(Node& node) cellResult(resultGPR, m_compileIndex); break; } - + case TearOffActivation: { ASSERT(!node.codeOrigin.inlineCallFrame); JSValueOperand activationValue(this, node.child1()); - JSValueOperand argumentsValue(this, node.child2()); GPRReg activationValueGPR = activationValue.gpr(); - GPRReg argumentsValueGPR = argumentsValue.gpr(); - - JITCompiler::JumpList created; - created.append(m_jit.branchTestPtr(JITCompiler::NonZero, activationValueGPR)); - created.append(m_jit.branchTestPtr(JITCompiler::NonZero, argumentsValueGPR)); + + JITCompiler::Jump created = m_jit.branchTestPtr(JITCompiler::NonZero, activationValueGPR); addSlowPathGenerator( slowPathCall( - created, this, operationTearOffActivation, NoResult, activationValueGPR, - static_cast<int32_t>(node.unmodifiedArgumentsRegister()))); + created, this, operationTearOffActivation, NoResult, activationValueGPR)); noResult(m_compileIndex); break; } - + case TearOffArguments: { - JSValueOperand argumentsValue(this, node.child1()); - GPRReg argumentsValueGPR = argumentsValue.gpr(); - - JITCompiler::Jump created = m_jit.branchTestPtr(JITCompiler::NonZero, argumentsValueGPR); - + JSValueOperand unmodifiedArgumentsValue(this, node.child1()); + JSValueOperand activationValue(this, node.child2()); + GPRReg unmodifiedArgumentsValueGPR = unmodifiedArgumentsValue.gpr(); + GPRReg activationValueGPR = activationValue.gpr(); + + JITCompiler::Jump created = m_jit.branchTestPtr(JITCompiler::NonZero, unmodifiedArgumentsValueGPR); + if (node.codeOrigin.inlineCallFrame) { addSlowPathGenerator( slowPathCall( created, this, operationTearOffInlinedArguments, NoResult, - argumentsValueGPR, node.codeOrigin.inlineCallFrame)); + unmodifiedArgumentsValueGPR, activationValueGPR, node.codeOrigin.inlineCallFrame)); } else { addSlowPathGenerator( slowPathCall( - created, this, operationTearOffArguments, NoResult, argumentsValueGPR)); + created, this, operationTearOffArguments, NoResult, unmodifiedArgumentsValueGPR, activationValueGPR)); } noResult(m_compileIndex); diff --git a/Source/JavaScriptCore/heap/GCThreadSharedData.cpp b/Source/JavaScriptCore/heap/GCThreadSharedData.cpp index 82c52d22e..23a6b97a1 100644 --- a/Source/JavaScriptCore/heap/GCThreadSharedData.cpp +++ b/Source/JavaScriptCore/heap/GCThreadSharedData.cpp @@ -29,6 +29,7 @@ #include "JSGlobalData.h" #include "MarkStack.h" #include "SlotVisitor.h" +#include "SlotVisitorInlineMethods.h" #include <wtf/MainThread.h> namespace JSC { diff --git a/Source/JavaScriptCore/heap/GCThreadSharedData.h b/Source/JavaScriptCore/heap/GCThreadSharedData.h index 8868b440c..3f09a2820 100644 --- a/Source/JavaScriptCore/heap/GCThreadSharedData.h +++ b/Source/JavaScriptCore/heap/GCThreadSharedData.h @@ -26,7 +26,12 @@ #ifndef GCThreadSharedData_h #define GCThreadSharedData_h +#include "ListableHandler.h" #include "MarkStack.h" +#include "UnconditionalFinalizer.h" +#include "WeakReferenceHarvester.h" +#include <wtf/HashSet.h> +#include <wtf/Threading.h> #include <wtf/Vector.h> namespace JSC { @@ -48,7 +53,6 @@ public: #endif private: - friend class MarkStack; friend class SlotVisitor; #if ENABLE(PARALLEL_GC) @@ -64,7 +68,7 @@ private: bool m_shouldHashConst; Vector<ThreadIdentifier> m_markingThreads; - Vector<MarkStack*> m_markingThreadsMarkStack; + Vector<SlotVisitor*> m_markingThreadsMarkStack; Mutex m_markingLock; ThreadCondition m_markingCondition; diff --git a/Source/JavaScriptCore/heap/Heap.h b/Source/JavaScriptCore/heap/Heap.h index 69aa97e33..e48386791 100644 --- a/Source/JavaScriptCore/heap/Heap.h +++ b/Source/JavaScriptCore/heap/Heap.h @@ -185,7 +185,7 @@ namespace JSC { void* allocateWithDestructor(size_t); void* allocateWithoutDestructor(size_t); - void* allocateStructure(); + void* allocateStructure(size_t); static const size_t minExtraCost = 256; static const size_t maxExtraCost = 1024 * 1024; @@ -372,9 +372,9 @@ namespace JSC { return m_objectSpace.allocateWithoutDestructor(bytes); } - inline void* Heap::allocateStructure() + inline void* Heap::allocateStructure(size_t bytes) { - return m_objectSpace.allocateStructure(); + return m_objectSpace.allocateStructure(bytes); } inline CheckedBoolean Heap::tryAllocateStorage(size_t bytes, void** outPtr) diff --git a/Source/JavaScriptCore/heap/HeapRootVisitor.h b/Source/JavaScriptCore/heap/HeapRootVisitor.h index 76c97290a..9849d7c39 100644 --- a/Source/JavaScriptCore/heap/HeapRootVisitor.h +++ b/Source/JavaScriptCore/heap/HeapRootVisitor.h @@ -27,6 +27,7 @@ #define HeapRootVisitor_h #include "SlotVisitor.h" +#include "SlotVisitorInlineMethods.h" namespace JSC { diff --git a/Source/JavaScriptCore/heap/MarkStack.cpp b/Source/JavaScriptCore/heap/MarkStack.cpp index 9a4a01f04..582439fd2 100644 --- a/Source/JavaScriptCore/heap/MarkStack.cpp +++ b/Source/JavaScriptCore/heap/MarkStack.cpp @@ -223,402 +223,4 @@ void MarkStackArray::stealSomeCellsFrom(MarkStackArray& other, size_t idleThread append(other.removeLast()); } -MarkStack::MarkStack(GCThreadSharedData& shared) - : m_stack(shared.m_segmentAllocator) -#if !ASSERT_DISABLED - , m_isCheckingForDefaultMarkViolation(false) - , m_isDraining(false) -#endif - , m_visitCount(0) - , m_isInParallelMode(false) - , m_shared(shared) - , m_shouldHashConst(false) -{ -} - -MarkStack::~MarkStack() -{ - ASSERT(m_stack.isEmpty()); -} - -void MarkStack::setup() -{ - m_shared.m_shouldHashConst = m_shared.m_globalData->haveEnoughNewStringsToHashConst(); - m_shouldHashConst = m_shared.m_shouldHashConst; -#if ENABLE(PARALLEL_GC) - for (unsigned i = 0; i < m_shared.m_markingThreadsMarkStack.size(); ++i) - m_shared.m_markingThreadsMarkStack[i]->m_shouldHashConst = m_shared.m_shouldHashConst; -#endif -} - -void MarkStack::reset() -{ - m_visitCount = 0; - ASSERT(m_stack.isEmpty()); -#if ENABLE(PARALLEL_GC) - ASSERT(m_opaqueRoots.isEmpty()); // Should have merged by now. -#else - m_opaqueRoots.clear(); -#endif - if (m_shouldHashConst) { - m_uniqueStrings.clear(); - m_shouldHashConst = false; - } -} - -void MarkStack::append(ConservativeRoots& conservativeRoots) -{ - JSCell** roots = conservativeRoots.roots(); - size_t size = conservativeRoots.size(); - for (size_t i = 0; i < size; ++i) - internalAppend(roots[i]); -} - -ALWAYS_INLINE static void visitChildren(SlotVisitor& visitor, const JSCell* cell) -{ -#if ENABLE(SIMPLE_HEAP_PROFILING) - m_visitedTypeCounts.count(cell); -#endif - - ASSERT(Heap::isMarked(cell)); - - if (isJSString(cell)) { - JSString::visitChildren(const_cast<JSCell*>(cell), visitor); - return; - } - - if (isJSFinalObject(cell)) { - JSFinalObject::visitChildren(const_cast<JSCell*>(cell), visitor); - return; - } - - if (isJSArray(cell)) { - JSArray::visitChildren(const_cast<JSCell*>(cell), visitor); - return; - } - - cell->methodTable()->visitChildren(const_cast<JSCell*>(cell), visitor); -} - -void SlotVisitor::donateKnownParallel() -{ - // NOTE: Because we re-try often, we can afford to be conservative, and - // assume that donating is not profitable. - - // Avoid locking when a thread reaches a dead end in the object graph. - if (m_stack.size() < 2) - return; - - // If there's already some shared work queued up, be conservative and assume - // that donating more is not profitable. - if (m_shared.m_sharedMarkStack.size()) - return; - - // If we're contending on the lock, be conservative and assume that another - // thread is already donating. - MutexTryLocker locker(m_shared.m_markingLock); - if (!locker.locked()) - return; - - // Otherwise, assume that a thread will go idle soon, and donate. - m_stack.donateSomeCellsTo(m_shared.m_sharedMarkStack); - - if (m_shared.m_numberOfActiveParallelMarkers < Options::numberOfGCMarkers()) - m_shared.m_markingCondition.broadcast(); -} - -void SlotVisitor::drain() -{ - ASSERT(m_isInParallelMode); - -#if ENABLE(PARALLEL_GC) - if (Options::numberOfGCMarkers() > 1) { - while (!m_stack.isEmpty()) { - m_stack.refill(); - for (unsigned countdown = Options::minimumNumberOfScansBetweenRebalance(); m_stack.canRemoveLast() && countdown--;) - visitChildren(*this, m_stack.removeLast()); - donateKnownParallel(); - } - - mergeOpaqueRootsIfNecessary(); - return; - } -#endif - - while (!m_stack.isEmpty()) { - m_stack.refill(); - while (m_stack.canRemoveLast()) - visitChildren(*this, m_stack.removeLast()); - } -} - -void SlotVisitor::drainFromShared(SharedDrainMode sharedDrainMode) -{ - ASSERT(m_isInParallelMode); - - ASSERT(Options::numberOfGCMarkers()); - - bool shouldBeParallel; - -#if ENABLE(PARALLEL_GC) - shouldBeParallel = Options::numberOfGCMarkers() > 1; -#else - ASSERT(Options::numberOfGCMarkers() == 1); - shouldBeParallel = false; -#endif - - if (!shouldBeParallel) { - // This call should be a no-op. - ASSERT_UNUSED(sharedDrainMode, sharedDrainMode == MasterDrain); - ASSERT(m_stack.isEmpty()); - ASSERT(m_shared.m_sharedMarkStack.isEmpty()); - return; - } - -#if ENABLE(PARALLEL_GC) - { - MutexLocker locker(m_shared.m_markingLock); - m_shared.m_numberOfActiveParallelMarkers++; - } - while (true) { - { - MutexLocker locker(m_shared.m_markingLock); - m_shared.m_numberOfActiveParallelMarkers--; - - // How we wait differs depending on drain mode. - if (sharedDrainMode == MasterDrain) { - // Wait until either termination is reached, or until there is some work - // for us to do. - while (true) { - // Did we reach termination? - if (!m_shared.m_numberOfActiveParallelMarkers && m_shared.m_sharedMarkStack.isEmpty()) { - // Let any sleeping slaves know it's time for them to give their private CopiedBlocks back - m_shared.m_markingCondition.broadcast(); - return; - } - - // Is there work to be done? - if (!m_shared.m_sharedMarkStack.isEmpty()) - break; - - // Otherwise wait. - m_shared.m_markingCondition.wait(m_shared.m_markingLock); - } - } else { - ASSERT(sharedDrainMode == SlaveDrain); - - // Did we detect termination? If so, let the master know. - if (!m_shared.m_numberOfActiveParallelMarkers && m_shared.m_sharedMarkStack.isEmpty()) - m_shared.m_markingCondition.broadcast(); - - while (m_shared.m_sharedMarkStack.isEmpty() && !m_shared.m_parallelMarkersShouldExit) { - if (!m_shared.m_numberOfActiveParallelMarkers && m_shared.m_sharedMarkStack.isEmpty()) - doneCopying(); - m_shared.m_markingCondition.wait(m_shared.m_markingLock); - } - - // Is the VM exiting? If so, exit this thread. - if (m_shared.m_parallelMarkersShouldExit) { - doneCopying(); - return; - } - } - - size_t idleThreadCount = Options::numberOfGCMarkers() - m_shared.m_numberOfActiveParallelMarkers; - m_stack.stealSomeCellsFrom(m_shared.m_sharedMarkStack, idleThreadCount); - m_shared.m_numberOfActiveParallelMarkers++; - } - - drain(); - } -#endif -} - -void MarkStack::mergeOpaqueRoots() -{ - ASSERT(!m_opaqueRoots.isEmpty()); // Should only be called when opaque roots are non-empty. - { - MutexLocker locker(m_shared.m_opaqueRootsLock); - HashSet<void*>::iterator begin = m_opaqueRoots.begin(); - HashSet<void*>::iterator end = m_opaqueRoots.end(); - for (HashSet<void*>::iterator iter = begin; iter != end; ++iter) - m_shared.m_opaqueRoots.add(*iter); - } - m_opaqueRoots.clear(); -} - -void SlotVisitor::startCopying() -{ - ASSERT(!m_copiedAllocator.isValid()); -} - -void* SlotVisitor::allocateNewSpaceSlow(size_t bytes) -{ - m_shared.m_copiedSpace->doneFillingBlock(m_copiedAllocator.resetCurrentBlock()); - m_copiedAllocator.setCurrentBlock(m_shared.m_copiedSpace->allocateBlockForCopyingPhase()); - - void* result = 0; - CheckedBoolean didSucceed = m_copiedAllocator.tryAllocate(bytes, &result); - ASSERT(didSucceed); - return result; -} - -void* SlotVisitor::allocateNewSpaceOrPin(void* ptr, size_t bytes) -{ - if (!checkIfShouldCopyAndPinOtherwise(ptr, bytes)) - return 0; - - return allocateNewSpace(bytes); -} - -ALWAYS_INLINE bool JSString::tryHashConstLock() -{ -#if ENABLE(PARALLEL_GC) - unsigned currentFlags = m_flags; - - if (currentFlags & HashConstLock) - return false; - - unsigned newFlags = currentFlags | HashConstLock; - - if (!WTF::weakCompareAndSwap(&m_flags, currentFlags, newFlags)) - return false; - - WTF::memoryBarrierAfterLock(); - return true; -#else - if (isHashConstSingleton()) - return false; - - m_flags |= HashConstLock; - - return true; -#endif -} - -ALWAYS_INLINE void JSString::releaseHashConstLock() -{ -#if ENABLE(PARALLEL_GC) - WTF::memoryBarrierBeforeUnlock(); -#endif - m_flags &= ~HashConstLock; -} - -ALWAYS_INLINE bool JSString::shouldTryHashConst() -{ - return ((length() > 1) && !isRope() && !isHashConstSingleton()); -} - -ALWAYS_INLINE void MarkStack::internalAppend(JSValue* slot) -{ - // This internalAppend is only intended for visits to object and array backing stores. - // as it can change the JSValue pointed to be the argument when the original JSValue - // is a string that contains the same contents as another string. - - ASSERT(slot); - JSValue value = *slot; - ASSERT(value); - if (!value.isCell()) - return; - - JSCell* cell = value.asCell(); - if (!cell) - return; - - if (m_shouldHashConst && cell->isString()) { - JSString* string = jsCast<JSString*>(cell); - if (string->shouldTryHashConst() && string->tryHashConstLock()) { - UniqueStringMap::AddResult addResult = m_uniqueStrings.add(string->string().impl(), value); - if (addResult.isNewEntry) - string->setHashConstSingleton(); - else { - JSValue existingJSValue = addResult.iterator->second; - if (value != existingJSValue) - jsCast<JSString*>(existingJSValue.asCell())->clearHashConstSingleton(); - *slot = existingJSValue; - string->releaseHashConstLock(); - return; - } - string->releaseHashConstLock(); - } - } - - internalAppend(cell); -} - -void SlotVisitor::copyAndAppend(void** ptr, size_t bytes, JSValue* values, unsigned length) -{ - void* oldPtr = *ptr; - void* newPtr = allocateNewSpaceOrPin(oldPtr, bytes); - if (newPtr) { - size_t jsValuesOffset = static_cast<size_t>(reinterpret_cast<char*>(values) - static_cast<char*>(oldPtr)); - - JSValue* newValues = reinterpret_cast_ptr<JSValue*>(static_cast<char*>(newPtr) + jsValuesOffset); - for (unsigned i = 0; i < length; i++) { - JSValue& value = values[i]; - newValues[i] = value; - if (!value) - continue; - internalAppend(&newValues[i]); - } - - memcpy(newPtr, oldPtr, jsValuesOffset); - *ptr = newPtr; - } else - append(values, length); -} - -void SlotVisitor::doneCopying() -{ - if (!m_copiedAllocator.isValid()) - return; - - m_shared.m_copiedSpace->doneFillingBlock(m_copiedAllocator.resetCurrentBlock()); -} - -void SlotVisitor::harvestWeakReferences() -{ - for (WeakReferenceHarvester* current = m_shared.m_weakReferenceHarvesters.head(); current; current = current->next()) - current->visitWeakReferences(*this); -} - -void SlotVisitor::finalizeUnconditionalFinalizers() -{ - while (m_shared.m_unconditionalFinalizers.hasNext()) - m_shared.m_unconditionalFinalizers.removeNext()->finalizeUnconditionally(); -} - -#if ENABLE(GC_VALIDATION) -void MarkStack::validate(JSCell* cell) -{ - if (!cell) { - dataLog("cell is NULL\n"); - CRASH(); - } - - if (!cell->structure()) { - dataLog("cell at %p has a null structure\n" , cell); - CRASH(); - } - - // Both the cell's structure, and the cell's structure's structure should be the Structure Structure. - // I hate this sentence. - if (cell->structure()->structure()->JSCell::classInfo() != cell->structure()->JSCell::classInfo()) { - const char* parentClassName = 0; - const char* ourClassName = 0; - if (cell->structure()->structure() && cell->structure()->structure()->JSCell::classInfo()) - parentClassName = cell->structure()->structure()->JSCell::classInfo()->className; - if (cell->structure()->JSCell::classInfo()) - ourClassName = cell->structure()->JSCell::classInfo()->className; - dataLog("parent structure (%p <%s>) of cell at %p doesn't match cell's structure (%p <%s>)\n", - cell->structure()->structure(), parentClassName, cell, cell->structure(), ourClassName); - CRASH(); - } -} -#else -void MarkStack::validate(JSCell*) -{ -} -#endif - } // namespace JSC diff --git a/Source/JavaScriptCore/heap/MarkStack.h b/Source/JavaScriptCore/heap/MarkStack.h index 54ae1cb02..0245e4be5 100644 --- a/Source/JavaScriptCore/heap/MarkStack.h +++ b/Source/JavaScriptCore/heap/MarkStack.h @@ -26,25 +26,6 @@ #ifndef MarkStack_h #define MarkStack_h -#include "CopiedSpace.h" -#include "HandleTypes.h" -#include "JSValue.h" -#include "Options.h" -#include "Register.h" -#include "UnconditionalFinalizer.h" -#include "VTableSpectrum.h" -#include "WeakReferenceHarvester.h" -#include <wtf/DataLog.h> -#include <wtf/Forward.h> -#include <wtf/HashMap.h> -#include <wtf/HashSet.h> -#include <wtf/Noncopyable.h> -#include <wtf/OSAllocator.h> -#include <wtf/PageBlock.h> -#include <wtf/TCSpinLock.h> -#include <wtf/text/StringHash.h> -#include <wtf/Vector.h> - #if ENABLE(OBJECT_MARK_LOGGING) #define MARK_LOG_MESSAGE0(message) dataLog(message) #define MARK_LOG_MESSAGE1(message, arg1) dataLog(message, arg1) @@ -69,276 +50,86 @@ #define MARK_LOG_CHILD(visitor, child) do { } while (false) #endif -namespace JSC { - - class ConservativeRoots; - class JSGlobalData; - class MarkStack; - class GCThreadSharedData; - class ParallelModeEnabler; - class Register; - class SlotVisitor; - template<typename T> class WriteBarrierBase; - template<typename T> class JITWriteBarrier; - - struct MarkStackSegment { - MarkStackSegment* m_previous; -#if !ASSERT_DISABLED - size_t m_top; -#endif - - const JSCell** data() - { - return bitwise_cast<const JSCell**>(this + 1); - } - - static size_t capacityFromSize(size_t size) - { - return (size - sizeof(MarkStackSegment)) / sizeof(const JSCell*); - } - - static size_t sizeFromCapacity(size_t capacity) - { - return sizeof(MarkStackSegment) + capacity * sizeof(const JSCell*); - } - }; - - class MarkStackSegmentAllocator { - public: - MarkStackSegmentAllocator(); - ~MarkStackSegmentAllocator(); - - MarkStackSegment* allocate(); - void release(MarkStackSegment*); - - void shrinkReserve(); - - private: - SpinLock m_lock; - MarkStackSegment* m_nextFreeSegment; - }; - - class MarkStackArray { - public: - MarkStackArray(MarkStackSegmentAllocator&); - ~MarkStackArray(); - - void append(const JSCell*); - - bool canRemoveLast(); - const JSCell* removeLast(); - bool refill(); - - bool isEmpty(); - - void donateSomeCellsTo(MarkStackArray& other); - - void stealSomeCellsFrom(MarkStackArray& other, size_t idleThreadCount); - - size_t size(); - - private: - MarkStackSegment* m_topSegment; - - JS_EXPORT_PRIVATE void expand(); - - MarkStackSegmentAllocator& m_allocator; - - size_t m_segmentCapacity; - size_t m_top; - size_t m_numberOfPreviousSegments; - - size_t postIncTop() - { - size_t result = m_top++; - ASSERT(result == m_topSegment->m_top++); - return result; - } - - size_t preDecTop() - { - size_t result = --m_top; - ASSERT(result == --m_topSegment->m_top); - return result; - } - - void setTopForFullSegment() - { - ASSERT(m_topSegment->m_top == m_segmentCapacity); - m_top = m_segmentCapacity; - } - - void setTopForEmptySegment() - { - ASSERT(!m_topSegment->m_top); - m_top = 0; - } - - size_t top() - { - ASSERT(m_top == m_topSegment->m_top); - return m_top; - } - -#if ASSERT_DISABLED - void validatePrevious() { } -#else - void validatePrevious() - { - unsigned count = 0; - for (MarkStackSegment* current = m_topSegment->m_previous; current; current = current->m_previous) - count++; - ASSERT(count == m_numberOfPreviousSegments); - } -#endif - }; - - class MarkStack { - WTF_MAKE_NONCOPYABLE(MarkStack); - friend class HeapRootVisitor; // Allowed to mark a JSValue* or JSCell** directly. - - public: - MarkStack(GCThreadSharedData&); - ~MarkStack(); - - void append(ConservativeRoots&); - - template<typename T> void append(JITWriteBarrier<T>*); - template<typename T> void append(WriteBarrierBase<T>*); - void appendValues(WriteBarrierBase<Unknown>*, size_t count); - - template<typename T> - void appendUnbarrieredPointer(T**); - void appendUnbarrieredValue(JSValue*); - - void addOpaqueRoot(void*); - bool containsOpaqueRoot(void*); - int opaqueRootCount(); - - GCThreadSharedData& sharedData() { return m_shared; } - bool isEmpty() { return m_stack.isEmpty(); } - - void setup(); - void reset(); - - size_t visitCount() const { return m_visitCount; } - -#if ENABLE(SIMPLE_HEAP_PROFILING) - VTableSpectrum m_visitedTypeCounts; -#endif - - void addWeakReferenceHarvester(WeakReferenceHarvester*); - void addUnconditionalFinalizer(UnconditionalFinalizer*); - -#if ENABLE(OBJECT_MARK_LOGGING) - inline void resetChildCount() { m_logChildCount = 0; } - inline unsigned childCount() { return m_logChildCount; } - inline void incrementChildCount() { m_logChildCount++; } -#endif +#include <wtf/StdLibExtras.h> +#include <wtf/TCSpinLock.h> - protected: - JS_EXPORT_PRIVATE static void validate(JSCell*); +namespace JSC { - void append(JSValue*); - void append(JSValue*, size_t count); - void append(JSCell**); +class JSCell; - void internalAppend(JSCell*); - void internalAppend(JSValue); - void internalAppend(JSValue*); - - JS_EXPORT_PRIVATE void mergeOpaqueRoots(); - - void mergeOpaqueRootsIfNecessary() - { - if (m_opaqueRoots.isEmpty()) - return; - mergeOpaqueRoots(); - } - - void mergeOpaqueRootsIfProfitable() - { - if (static_cast<unsigned>(m_opaqueRoots.size()) < Options::opaqueRootMergeThreshold()) - return; - mergeOpaqueRoots(); - } - - MarkStackArray m_stack; - HashSet<void*> m_opaqueRoots; // Handle-owning data structures not visible to the garbage collector. - +struct MarkStackSegment { + MarkStackSegment* m_previous; #if !ASSERT_DISABLED - public: - bool m_isCheckingForDefaultMarkViolation; - bool m_isDraining; + size_t m_top; #endif - protected: - friend class ParallelModeEnabler; - size_t m_visitCount; - bool m_isInParallelMode; - - GCThreadSharedData& m_shared; - - bool m_shouldHashConst; // Local per-thread copy of shared flag for performance reasons - typedef HashMap<StringImpl*, JSValue> UniqueStringMap; - UniqueStringMap m_uniqueStrings; - -#if ENABLE(OBJECT_MARK_LOGGING) - unsigned m_logChildCount; -#endif - }; - - inline void MarkStackArray::append(const JSCell* cell) + const JSCell** data() { - if (m_top == m_segmentCapacity) - expand(); - m_topSegment->data()[postIncTop()] = cell; + return bitwise_cast<const JSCell**>(this + 1); } - - inline bool MarkStackArray::canRemoveLast() + + static size_t capacityFromSize(size_t size) { - return !!m_top; + return (size - sizeof(MarkStackSegment)) / sizeof(const JSCell*); } - - inline const JSCell* MarkStackArray::removeLast() + + static size_t sizeFromCapacity(size_t capacity) { - return m_topSegment->data()[preDecTop()]; + return sizeof(MarkStackSegment) + capacity * sizeof(const JSCell*); } +}; - inline bool MarkStackArray::isEmpty() - { - if (m_top) - return false; - if (m_topSegment->m_previous) { - ASSERT(m_topSegment->m_previous->m_top == m_segmentCapacity); - return false; - } - return true; - } +class MarkStackSegmentAllocator { +public: + MarkStackSegmentAllocator(); + ~MarkStackSegmentAllocator(); + + MarkStackSegment* allocate(); + void release(MarkStackSegment*); + + void shrinkReserve(); + +private: + SpinLock m_lock; + MarkStackSegment* m_nextFreeSegment; +}; - inline size_t MarkStackArray::size() - { - return m_top + m_segmentCapacity * m_numberOfPreviousSegments; - } +class MarkStackArray { +public: + MarkStackArray(MarkStackSegmentAllocator&); + ~MarkStackArray(); - class ParallelModeEnabler { - public: - ParallelModeEnabler(MarkStack& stack) - : m_stack(stack) - { - ASSERT(!m_stack.m_isInParallelMode); - m_stack.m_isInParallelMode = true; - } - - ~ParallelModeEnabler() - { - ASSERT(m_stack.m_isInParallelMode); - m_stack.m_isInParallelMode = false; - } - - private: - MarkStack& m_stack; - }; + void append(const JSCell*); + + bool canRemoveLast(); + const JSCell* removeLast(); + bool refill(); + + void donateSomeCellsTo(MarkStackArray& other); + void stealSomeCellsFrom(MarkStackArray& other, size_t idleThreadCount); + + size_t size(); + bool isEmpty(); + +private: + JS_EXPORT_PRIVATE void expand(); + + size_t postIncTop(); + size_t preDecTop(); + void setTopForFullSegment(); + void setTopForEmptySegment(); + size_t top(); + + void validatePrevious(); + + MarkStackSegment* m_topSegment; + MarkStackSegmentAllocator& m_allocator; + + size_t m_segmentCapacity; + size_t m_top; + size_t m_numberOfPreviousSegments; + +}; } // namespace JSC diff --git a/Source/JavaScriptCore/heap/MarkStackInlineMethods.h b/Source/JavaScriptCore/heap/MarkStackInlineMethods.h index 031dfff39..d3276d7fa 100644 --- a/Source/JavaScriptCore/heap/MarkStackInlineMethods.h +++ b/Source/JavaScriptCore/heap/MarkStackInlineMethods.h @@ -31,94 +31,81 @@ namespace JSC { -ALWAYS_INLINE void MarkStack::append(JSValue* slot, size_t count) +inline size_t MarkStackArray::postIncTop() { - for (size_t i = 0; i < count; ++i) { - JSValue& value = slot[i]; - internalAppend(value); - } + size_t result = m_top++; + ASSERT(result == m_topSegment->m_top++); + return result; } - -template<typename T> -inline void MarkStack::appendUnbarrieredPointer(T** slot) + +inline size_t MarkStackArray::preDecTop() { - ASSERT(slot); - JSCell* cell = *slot; - internalAppend(cell); + size_t result = --m_top; + ASSERT(result == --m_topSegment->m_top); + return result; } - -ALWAYS_INLINE void MarkStack::append(JSValue* slot) + +inline void MarkStackArray::setTopForFullSegment() { - ASSERT(slot); - internalAppend(*slot); + ASSERT(m_topSegment->m_top == m_segmentCapacity); + m_top = m_segmentCapacity; } -ALWAYS_INLINE void MarkStack::appendUnbarrieredValue(JSValue* slot) +inline void MarkStackArray::setTopForEmptySegment() { - ASSERT(slot); - internalAppend(*slot); + ASSERT(!m_topSegment->m_top); + m_top = 0; } -ALWAYS_INLINE void MarkStack::append(JSCell** slot) +inline size_t MarkStackArray::top() { - ASSERT(slot); - internalAppend(*slot); + ASSERT(m_top == m_topSegment->m_top); + return m_top; } -ALWAYS_INLINE void MarkStack::internalAppend(JSValue value) +#if ASSERT_DISABLED +inline void MarkStackArray::validatePrevious() { } +#else +inline void MarkStackArray::validatePrevious() { - if (!value || !value.isCell()) - return; - internalAppend(value.asCell()); + unsigned count = 0; + for (MarkStackSegment* current = m_topSegment->m_previous; current; current = current->m_previous) + count++; + ASSERT(count == m_numberOfPreviousSegments); } +#endif -inline void MarkStack::addWeakReferenceHarvester(WeakReferenceHarvester* weakReferenceHarvester) +inline void MarkStackArray::append(const JSCell* cell) { - m_shared.m_weakReferenceHarvesters.addThreadSafe(weakReferenceHarvester); + if (m_top == m_segmentCapacity) + expand(); + m_topSegment->data()[postIncTop()] = cell; } -inline void MarkStack::addUnconditionalFinalizer(UnconditionalFinalizer* unconditionalFinalizer) +inline bool MarkStackArray::canRemoveLast() { - m_shared.m_unconditionalFinalizers.addThreadSafe(unconditionalFinalizer); + return !!m_top; } -inline void MarkStack::addOpaqueRoot(void* root) +inline const JSCell* MarkStackArray::removeLast() { -#if ENABLE(PARALLEL_GC) - if (Options::numberOfGCMarkers() == 1) { - // Put directly into the shared HashSet. - m_shared.m_opaqueRoots.add(root); - return; - } - // Put into the local set, but merge with the shared one every once in - // a while to make sure that the local sets don't grow too large. - mergeOpaqueRootsIfProfitable(); - m_opaqueRoots.add(root); -#else - m_opaqueRoots.add(root); -#endif + return m_topSegment->data()[preDecTop()]; } -inline bool MarkStack::containsOpaqueRoot(void* root) +inline bool MarkStackArray::isEmpty() { - ASSERT(!m_isInParallelMode); -#if ENABLE(PARALLEL_GC) - ASSERT(m_opaqueRoots.isEmpty()); - return m_shared.m_opaqueRoots.contains(root); -#else - return m_opaqueRoots.contains(root); -#endif + if (m_top) + return false; + if (m_topSegment->m_previous) { + ASSERT(m_topSegment->m_previous->m_top == m_segmentCapacity); + return false; + } + return true; } -inline int MarkStack::opaqueRootCount() +inline size_t MarkStackArray::size() { - ASSERT(!m_isInParallelMode); -#if ENABLE(PARALLEL_GC) - ASSERT(m_opaqueRoots.isEmpty()); - return m_shared.m_opaqueRoots.size(); -#else - return m_opaqueRoots.size(); -#endif + return m_top + m_segmentCapacity * m_numberOfPreviousSegments; } } // namespace JSC diff --git a/Source/JavaScriptCore/heap/MarkedAllocator.cpp b/Source/JavaScriptCore/heap/MarkedAllocator.cpp index 20b556969..ab37ead4c 100644 --- a/Source/JavaScriptCore/heap/MarkedAllocator.cpp +++ b/Source/JavaScriptCore/heap/MarkedAllocator.cpp @@ -27,7 +27,7 @@ bool MarkedAllocator::isPagedOut(double deadline) return false; } -inline void* MarkedAllocator::tryAllocateHelper() +inline void* MarkedAllocator::tryAllocateHelper(size_t bytes) { if (!m_freeList.head) { if (m_onlyContainsStructures && !m_heap->isSafeToSweepStructures()) { @@ -42,12 +42,20 @@ inline void* MarkedAllocator::tryAllocateHelper() } for (MarkedBlock*& block = m_blocksToSweep; block; block = block->next()) { - m_freeList = block->sweep(MarkedBlock::SweepToFreeList); - if (m_freeList.head) { - m_currentBlock = block; - break; + MarkedBlock::FreeList freeList = block->sweep(MarkedBlock::SweepToFreeList); + if (!freeList.head) { + block->didConsumeFreeList(); + continue; } - block->didConsumeFreeList(); + + if (bytes > block->cellSize()) { + block->zapFreeList(freeList); + continue; + } + + m_currentBlock = block; + m_freeList = freeList; + break; } if (!m_freeList.head) { @@ -62,16 +70,16 @@ inline void* MarkedAllocator::tryAllocateHelper() return head; } -inline void* MarkedAllocator::tryAllocate() +inline void* MarkedAllocator::tryAllocate(size_t bytes) { ASSERT(!m_heap->isBusy()); m_heap->m_operationInProgress = Allocation; - void* result = tryAllocateHelper(); + void* result = tryAllocateHelper(bytes); m_heap->m_operationInProgress = NoOperation; return result; } -void* MarkedAllocator::allocateSlowCase() +void* MarkedAllocator::allocateSlowCase(size_t bytes) { ASSERT(m_heap->globalData()->apiLock().currentThreadIsHoldingLock()); #if COLLECT_ON_EVERY_ALLOCATION @@ -82,7 +90,7 @@ void* MarkedAllocator::allocateSlowCase() ASSERT(!m_freeList.head); m_heap->didAllocate(m_freeList.bytes); - void* result = tryAllocate(); + void* result = tryAllocate(bytes); if (LIKELY(result != 0)) return result; @@ -90,27 +98,39 @@ void* MarkedAllocator::allocateSlowCase() if (m_heap->shouldCollect()) { m_heap->collect(Heap::DoNotSweep); - result = tryAllocate(); + result = tryAllocate(bytes); if (result) return result; } ASSERT(!m_heap->shouldCollect()); - MarkedBlock* block = allocateBlock(); + MarkedBlock* block = allocateBlock(bytes); ASSERT(block); addBlock(block); - result = tryAllocate(); + result = tryAllocate(bytes); ASSERT(result); return result; } -MarkedBlock* MarkedAllocator::allocateBlock() +MarkedBlock* MarkedAllocator::allocateBlock(size_t bytes) { - MarkedBlock* block = MarkedBlock::create(m_heap->blockAllocator().allocate(), m_heap, m_cellSize, m_cellsNeedDestruction, m_onlyContainsStructures); - m_markedSpace->didAddBlock(block); - return block; + size_t minBlockSize = MarkedBlock::blockSize; + size_t minAllocationSize = WTF::roundUpToMultipleOf(WTF::pageSize(), sizeof(MarkedBlock) + bytes); + size_t blockSize = std::max(minBlockSize, minAllocationSize); + + size_t cellSize = m_cellSize ? m_cellSize : WTF::roundUpToMultipleOf<MarkedBlock::atomSize>(bytes); + + if (blockSize == MarkedBlock::blockSize) { + PageAllocationAligned allocation = m_heap->blockAllocator().allocate(); + return MarkedBlock::create(allocation, m_heap, cellSize, m_cellsNeedDestruction, m_onlyContainsStructures); + } + + PageAllocationAligned allocation = PageAllocationAligned::allocate(blockSize, MarkedBlock::blockSize, OSAllocator::JSGCHeapPages); + if (!static_cast<bool>(allocation)) + CRASH(); + return MarkedBlock::create(allocation, m_heap, cellSize, m_cellsNeedDestruction, m_onlyContainsStructures); } void MarkedAllocator::addBlock(MarkedBlock* block) @@ -121,6 +141,7 @@ void MarkedAllocator::addBlock(MarkedBlock* block) m_blockList.append(block); m_blocksToSweep = m_currentBlock = block; m_freeList = block->sweep(MarkedBlock::SweepToFreeList); + m_markedSpace->didAddBlock(block); } void MarkedAllocator::removeBlock(MarkedBlock* block) diff --git a/Source/JavaScriptCore/heap/MarkedAllocator.h b/Source/JavaScriptCore/heap/MarkedAllocator.h index c1c431194..7273c13e4 100644 --- a/Source/JavaScriptCore/heap/MarkedAllocator.h +++ b/Source/JavaScriptCore/heap/MarkedAllocator.h @@ -25,7 +25,7 @@ public: size_t cellSize() { return m_cellSize; } bool cellsNeedDestruction() { return m_cellsNeedDestruction; } bool onlyContainsStructures() { return m_onlyContainsStructures; } - void* allocate(); + void* allocate(size_t); Heap* heap() { return m_heap; } template<typename Functor> void forEachBlock(Functor&); @@ -39,10 +39,10 @@ public: private: friend class LLIntOffsetsExtractor; - JS_EXPORT_PRIVATE void* allocateSlowCase(); - void* tryAllocate(); - void* tryAllocateHelper(); - MarkedBlock* allocateBlock(); + JS_EXPORT_PRIVATE void* allocateSlowCase(size_t); + void* tryAllocate(size_t); + void* tryAllocateHelper(size_t); + MarkedBlock* allocateBlock(size_t); MarkedBlock::FreeList m_freeList; MarkedBlock* m_currentBlock; @@ -75,12 +75,11 @@ inline void MarkedAllocator::init(Heap* heap, MarkedSpace* markedSpace, size_t c m_onlyContainsStructures = onlyContainsStructures; } -inline void* MarkedAllocator::allocate() +inline void* MarkedAllocator::allocate(size_t bytes) { MarkedBlock::FreeCell* head = m_freeList.head; - // This is a light-weight fast path to cover the most common case. if (UNLIKELY(!head)) - return allocateSlowCase(); + return allocateSlowCase(bytes); m_freeList.head = head->next; return head; diff --git a/Source/JavaScriptCore/heap/MarkedSpace.cpp b/Source/JavaScriptCore/heap/MarkedSpace.cpp index 68b059c36..689e5f9ab 100644 --- a/Source/JavaScriptCore/heap/MarkedSpace.cpp +++ b/Source/JavaScriptCore/heap/MarkedSpace.cpp @@ -90,6 +90,7 @@ MarkedSpace::MarkedSpace(Heap* heap) destructorAllocatorFor(cellSize).init(heap, this, cellSize, true, false); } + m_largeAllocator.init(heap, this, 0, true, false); m_structureAllocator.init(heap, this, WTF::roundUpToMultipleOf(32, sizeof(Structure)), true, true); } @@ -127,6 +128,7 @@ void MarkedSpace::resetAllocators() destructorAllocatorFor(cellSize).reset(); } + m_largeAllocator.reset(); m_structureAllocator.reset(); } @@ -153,6 +155,7 @@ void MarkedSpace::canonicalizeCellLivenessData() destructorAllocatorFor(cellSize).zapFreeList(); } + m_largeAllocator.zapFreeList(); m_structureAllocator.zapFreeList(); } @@ -168,6 +171,9 @@ bool MarkedSpace::isPagedOut(double deadline) return true; } + if (m_largeAllocator.isPagedOut(deadline)) + return true; + if (m_structureAllocator.isPagedOut(deadline)) return true; @@ -178,7 +184,12 @@ void MarkedSpace::freeBlock(MarkedBlock* block) { allocatorFor(block).removeBlock(block); m_blocks.remove(block); - m_heap->blockAllocator().deallocate(MarkedBlock::destroy(block)); + if (block->capacity() == MarkedBlock::blockSize) { + m_heap->blockAllocator().deallocate(MarkedBlock::destroy(block)); + return; + } + + MarkedBlock::destroy(block).deallocate(); } void MarkedSpace::freeOrShrinkBlock(MarkedBlock* block) diff --git a/Source/JavaScriptCore/heap/MarkedSpace.h b/Source/JavaScriptCore/heap/MarkedSpace.h index d5dae3584..03679d9d3 100644 --- a/Source/JavaScriptCore/heap/MarkedSpace.h +++ b/Source/JavaScriptCore/heap/MarkedSpace.h @@ -80,7 +80,7 @@ public: MarkedAllocator& destructorAllocatorFor(size_t); void* allocateWithDestructor(size_t); void* allocateWithoutDestructor(size_t); - void* allocateStructure(); + void* allocateStructure(size_t); void resetAllocators(); @@ -115,15 +115,15 @@ public: private: friend class LLIntOffsetsExtractor; - - // [ 32... 256 ] + + // [ 32... 512 ] static const size_t preciseStep = MarkedBlock::atomSize; - static const size_t preciseCutoff = 256; + static const size_t preciseCutoff = 512; static const size_t preciseCount = preciseCutoff / preciseStep; - // [ 512... 2048 ] - static const size_t impreciseStep = preciseCutoff; - static const size_t impreciseCutoff = maxCellSize; + // [ 1024... blockSize ] + static const size_t impreciseStep = 2 * preciseCutoff; + static const size_t impreciseCutoff = MarkedBlock::blockSize / 2; static const size_t impreciseCount = impreciseCutoff / impreciseStep; struct Subspace { @@ -133,6 +133,7 @@ private: Subspace m_destructorSpace; Subspace m_normalSpace; + MarkedAllocator m_largeAllocator; MarkedAllocator m_structureAllocator; Heap* m_heap; @@ -162,10 +163,12 @@ inline MarkedAllocator& MarkedSpace::firstAllocator() inline MarkedAllocator& MarkedSpace::allocatorFor(size_t bytes) { - ASSERT(bytes && bytes <= maxCellSize); + ASSERT(bytes); if (bytes <= preciseCutoff) return m_normalSpace.preciseAllocators[(bytes - 1) / preciseStep]; - return m_normalSpace.impreciseAllocators[(bytes - 1) / impreciseStep]; + if (bytes <= impreciseCutoff) + return m_normalSpace.impreciseAllocators[(bytes - 1) / impreciseStep]; + return m_largeAllocator; } inline MarkedAllocator& MarkedSpace::allocatorFor(MarkedBlock* block) @@ -181,25 +184,27 @@ inline MarkedAllocator& MarkedSpace::allocatorFor(MarkedBlock* block) inline MarkedAllocator& MarkedSpace::destructorAllocatorFor(size_t bytes) { - ASSERT(bytes && bytes <= maxCellSize); + ASSERT(bytes); if (bytes <= preciseCutoff) return m_destructorSpace.preciseAllocators[(bytes - 1) / preciseStep]; - return m_destructorSpace.impreciseAllocators[(bytes - 1) / impreciseStep]; + if (bytes <= impreciseCutoff) + return m_normalSpace.impreciseAllocators[(bytes - 1) / impreciseStep]; + return m_largeAllocator; } inline void* MarkedSpace::allocateWithoutDestructor(size_t bytes) { - return allocatorFor(bytes).allocate(); + return allocatorFor(bytes).allocate(bytes); } inline void* MarkedSpace::allocateWithDestructor(size_t bytes) { - return destructorAllocatorFor(bytes).allocate(); + return destructorAllocatorFor(bytes).allocate(bytes); } -inline void* MarkedSpace::allocateStructure() +inline void* MarkedSpace::allocateStructure(size_t bytes) { - return m_structureAllocator.allocate(); + return m_structureAllocator.allocate(bytes); } template <typename Functor> inline typename Functor::ReturnType MarkedSpace::forEachBlock(Functor& functor) @@ -214,6 +219,7 @@ template <typename Functor> inline typename Functor::ReturnType MarkedSpace::for m_destructorSpace.impreciseAllocators[i].forEachBlock(functor); } + m_largeAllocator.forEachBlock(functor); m_structureAllocator.forEachBlock(functor); return functor.returnValue(); diff --git a/Source/JavaScriptCore/heap/SlotVisitor.cpp b/Source/JavaScriptCore/heap/SlotVisitor.cpp new file mode 100644 index 000000000..0f003e79d --- /dev/null +++ b/Source/JavaScriptCore/heap/SlotVisitor.cpp @@ -0,0 +1,412 @@ +#include "config.h" +#include "SlotVisitor.h" + +#include "ConservativeRoots.h" +#include "CopiedSpace.h" +#include "CopiedSpaceInlineMethods.h" +#include "JSArray.h" +#include "JSGlobalData.h" +#include "JSObject.h" +#include "JSString.h" + +namespace JSC { + +SlotVisitor::SlotVisitor(GCThreadSharedData& shared) + : m_stack(shared.m_segmentAllocator) + , m_visitCount(0) + , m_isInParallelMode(false) + , m_shared(shared) + , m_shouldHashConst(false) +#if !ASSERT_DISABLED + , m_isCheckingForDefaultMarkViolation(false) + , m_isDraining(false) +#endif +{ +} + +SlotVisitor::~SlotVisitor() +{ + ASSERT(m_stack.isEmpty()); +} + +void SlotVisitor::setup() +{ + m_shared.m_shouldHashConst = m_shared.m_globalData->haveEnoughNewStringsToHashConst(); + m_shouldHashConst = m_shared.m_shouldHashConst; +#if ENABLE(PARALLEL_GC) + for (unsigned i = 0; i < m_shared.m_markingThreadsMarkStack.size(); ++i) + m_shared.m_markingThreadsMarkStack[i]->m_shouldHashConst = m_shared.m_shouldHashConst; +#endif +} + +void SlotVisitor::reset() +{ + m_visitCount = 0; + ASSERT(m_stack.isEmpty()); +#if ENABLE(PARALLEL_GC) + ASSERT(m_opaqueRoots.isEmpty()); // Should have merged by now. +#else + m_opaqueRoots.clear(); +#endif + if (m_shouldHashConst) { + m_uniqueStrings.clear(); + m_shouldHashConst = false; + } +} + +void SlotVisitor::append(ConservativeRoots& conservativeRoots) +{ + JSCell** roots = conservativeRoots.roots(); + size_t size = conservativeRoots.size(); + for (size_t i = 0; i < size; ++i) + internalAppend(roots[i]); +} + +ALWAYS_INLINE static void visitChildren(SlotVisitor& visitor, const JSCell* cell) +{ +#if ENABLE(SIMPLE_HEAP_PROFILING) + m_visitedTypeCounts.count(cell); +#endif + + ASSERT(Heap::isMarked(cell)); + + if (isJSString(cell)) { + JSString::visitChildren(const_cast<JSCell*>(cell), visitor); + return; + } + + if (isJSFinalObject(cell)) { + JSFinalObject::visitChildren(const_cast<JSCell*>(cell), visitor); + return; + } + + if (isJSArray(cell)) { + JSArray::visitChildren(const_cast<JSCell*>(cell), visitor); + return; + } + + cell->methodTable()->visitChildren(const_cast<JSCell*>(cell), visitor); +} + +void SlotVisitor::donateKnownParallel() +{ + // NOTE: Because we re-try often, we can afford to be conservative, and + // assume that donating is not profitable. + + // Avoid locking when a thread reaches a dead end in the object graph. + if (m_stack.size() < 2) + return; + + // If there's already some shared work queued up, be conservative and assume + // that donating more is not profitable. + if (m_shared.m_sharedMarkStack.size()) + return; + + // If we're contending on the lock, be conservative and assume that another + // thread is already donating. + MutexTryLocker locker(m_shared.m_markingLock); + if (!locker.locked()) + return; + + // Otherwise, assume that a thread will go idle soon, and donate. + m_stack.donateSomeCellsTo(m_shared.m_sharedMarkStack); + + if (m_shared.m_numberOfActiveParallelMarkers < Options::numberOfGCMarkers()) + m_shared.m_markingCondition.broadcast(); +} + +void SlotVisitor::drain() +{ + ASSERT(m_isInParallelMode); + +#if ENABLE(PARALLEL_GC) + if (Options::numberOfGCMarkers() > 1) { + while (!m_stack.isEmpty()) { + m_stack.refill(); + for (unsigned countdown = Options::minimumNumberOfScansBetweenRebalance(); m_stack.canRemoveLast() && countdown--;) + visitChildren(*this, m_stack.removeLast()); + donateKnownParallel(); + } + + mergeOpaqueRootsIfNecessary(); + return; + } +#endif + + while (!m_stack.isEmpty()) { + m_stack.refill(); + while (m_stack.canRemoveLast()) + visitChildren(*this, m_stack.removeLast()); + } +} + +void SlotVisitor::drainFromShared(SharedDrainMode sharedDrainMode) +{ + ASSERT(m_isInParallelMode); + + ASSERT(Options::numberOfGCMarkers()); + + bool shouldBeParallel; + +#if ENABLE(PARALLEL_GC) + shouldBeParallel = Options::numberOfGCMarkers() > 1; +#else + ASSERT(Options::numberOfGCMarkers() == 1); + shouldBeParallel = false; +#endif + + if (!shouldBeParallel) { + // This call should be a no-op. + ASSERT_UNUSED(sharedDrainMode, sharedDrainMode == MasterDrain); + ASSERT(m_stack.isEmpty()); + ASSERT(m_shared.m_sharedMarkStack.isEmpty()); + return; + } + +#if ENABLE(PARALLEL_GC) + { + MutexLocker locker(m_shared.m_markingLock); + m_shared.m_numberOfActiveParallelMarkers++; + } + while (true) { + { + MutexLocker locker(m_shared.m_markingLock); + m_shared.m_numberOfActiveParallelMarkers--; + + // How we wait differs depending on drain mode. + if (sharedDrainMode == MasterDrain) { + // Wait until either termination is reached, or until there is some work + // for us to do. + while (true) { + // Did we reach termination? + if (!m_shared.m_numberOfActiveParallelMarkers && m_shared.m_sharedMarkStack.isEmpty()) { + // Let any sleeping slaves know it's time for them to give their private CopiedBlocks back + m_shared.m_markingCondition.broadcast(); + return; + } + + // Is there work to be done? + if (!m_shared.m_sharedMarkStack.isEmpty()) + break; + + // Otherwise wait. + m_shared.m_markingCondition.wait(m_shared.m_markingLock); + } + } else { + ASSERT(sharedDrainMode == SlaveDrain); + + // Did we detect termination? If so, let the master know. + if (!m_shared.m_numberOfActiveParallelMarkers && m_shared.m_sharedMarkStack.isEmpty()) + m_shared.m_markingCondition.broadcast(); + + while (m_shared.m_sharedMarkStack.isEmpty() && !m_shared.m_parallelMarkersShouldExit) { + if (!m_shared.m_numberOfActiveParallelMarkers && m_shared.m_sharedMarkStack.isEmpty()) + doneCopying(); + m_shared.m_markingCondition.wait(m_shared.m_markingLock); + } + + // Is the VM exiting? If so, exit this thread. + if (m_shared.m_parallelMarkersShouldExit) { + doneCopying(); + return; + } + } + + size_t idleThreadCount = Options::numberOfGCMarkers() - m_shared.m_numberOfActiveParallelMarkers; + m_stack.stealSomeCellsFrom(m_shared.m_sharedMarkStack, idleThreadCount); + m_shared.m_numberOfActiveParallelMarkers++; + } + + drain(); + } +#endif +} + +void SlotVisitor::mergeOpaqueRoots() +{ + ASSERT(!m_opaqueRoots.isEmpty()); // Should only be called when opaque roots are non-empty. + { + MutexLocker locker(m_shared.m_opaqueRootsLock); + HashSet<void*>::iterator begin = m_opaqueRoots.begin(); + HashSet<void*>::iterator end = m_opaqueRoots.end(); + for (HashSet<void*>::iterator iter = begin; iter != end; ++iter) + m_shared.m_opaqueRoots.add(*iter); + } + m_opaqueRoots.clear(); +} + +void SlotVisitor::startCopying() +{ + ASSERT(!m_copiedAllocator.isValid()); +} + +void* SlotVisitor::allocateNewSpaceSlow(size_t bytes) +{ + m_shared.m_copiedSpace->doneFillingBlock(m_copiedAllocator.resetCurrentBlock()); + m_copiedAllocator.setCurrentBlock(m_shared.m_copiedSpace->allocateBlockForCopyingPhase()); + + void* result = 0; + CheckedBoolean didSucceed = m_copiedAllocator.tryAllocate(bytes, &result); + ASSERT(didSucceed); + return result; +} + +void* SlotVisitor::allocateNewSpaceOrPin(void* ptr, size_t bytes) +{ + if (!checkIfShouldCopyAndPinOtherwise(ptr, bytes)) + return 0; + + return allocateNewSpace(bytes); +} + +ALWAYS_INLINE bool JSString::tryHashConstLock() +{ +#if ENABLE(PARALLEL_GC) + unsigned currentFlags = m_flags; + + if (currentFlags & HashConstLock) + return false; + + unsigned newFlags = currentFlags | HashConstLock; + + if (!WTF::weakCompareAndSwap(&m_flags, currentFlags, newFlags)) + return false; + + WTF::memoryBarrierAfterLock(); + return true; +#else + if (isHashConstSingleton()) + return false; + + m_flags |= HashConstLock; + + return true; +#endif +} + +ALWAYS_INLINE void JSString::releaseHashConstLock() +{ +#if ENABLE(PARALLEL_GC) + WTF::memoryBarrierBeforeUnlock(); +#endif + m_flags &= ~HashConstLock; +} + +ALWAYS_INLINE bool JSString::shouldTryHashConst() +{ + return ((length() > 1) && !isRope() && !isHashConstSingleton()); +} + +ALWAYS_INLINE void SlotVisitor::internalAppend(JSValue* slot) +{ + // This internalAppend is only intended for visits to object and array backing stores. + // as it can change the JSValue pointed to be the argument when the original JSValue + // is a string that contains the same contents as another string. + + ASSERT(slot); + JSValue value = *slot; + ASSERT(value); + if (!value.isCell()) + return; + + JSCell* cell = value.asCell(); + if (!cell) + return; + + if (m_shouldHashConst && cell->isString()) { + JSString* string = jsCast<JSString*>(cell); + if (string->shouldTryHashConst() && string->tryHashConstLock()) { + UniqueStringMap::AddResult addResult = m_uniqueStrings.add(string->string().impl(), value); + if (addResult.isNewEntry) + string->setHashConstSingleton(); + else { + JSValue existingJSValue = addResult.iterator->second; + if (value != existingJSValue) + jsCast<JSString*>(existingJSValue.asCell())->clearHashConstSingleton(); + *slot = existingJSValue; + string->releaseHashConstLock(); + return; + } + string->releaseHashConstLock(); + } + } + + internalAppend(cell); +} + +void SlotVisitor::copyAndAppend(void** ptr, size_t bytes, JSValue* values, unsigned length) +{ + void* oldPtr = *ptr; + void* newPtr = allocateNewSpaceOrPin(oldPtr, bytes); + if (newPtr) { + size_t jsValuesOffset = static_cast<size_t>(reinterpret_cast<char*>(values) - static_cast<char*>(oldPtr)); + + JSValue* newValues = reinterpret_cast_ptr<JSValue*>(static_cast<char*>(newPtr) + jsValuesOffset); + for (unsigned i = 0; i < length; i++) { + JSValue& value = values[i]; + newValues[i] = value; + if (!value) + continue; + internalAppend(&newValues[i]); + } + + memcpy(newPtr, oldPtr, jsValuesOffset); + *ptr = newPtr; + } else + append(values, length); +} + +void SlotVisitor::doneCopying() +{ + if (!m_copiedAllocator.isValid()) + return; + + m_shared.m_copiedSpace->doneFillingBlock(m_copiedAllocator.resetCurrentBlock()); +} + +void SlotVisitor::harvestWeakReferences() +{ + for (WeakReferenceHarvester* current = m_shared.m_weakReferenceHarvesters.head(); current; current = current->next()) + current->visitWeakReferences(*this); +} + +void SlotVisitor::finalizeUnconditionalFinalizers() +{ + while (m_shared.m_unconditionalFinalizers.hasNext()) + m_shared.m_unconditionalFinalizers.removeNext()->finalizeUnconditionally(); +} + +#if ENABLE(GC_VALIDATION) +void SlotVisitor::validate(JSCell* cell) +{ + if (!cell) { + dataLog("cell is NULL\n"); + CRASH(); + } + + if (!cell->structure()) { + dataLog("cell at %p has a null structure\n" , cell); + CRASH(); + } + + // Both the cell's structure, and the cell's structure's structure should be the Structure Structure. + // I hate this sentence. + if (cell->structure()->structure()->JSCell::classInfo() != cell->structure()->JSCell::classInfo()) { + const char* parentClassName = 0; + const char* ourClassName = 0; + if (cell->structure()->structure() && cell->structure()->structure()->JSCell::classInfo()) + parentClassName = cell->structure()->structure()->JSCell::classInfo()->className; + if (cell->structure()->JSCell::classInfo()) + ourClassName = cell->structure()->JSCell::classInfo()->className; + dataLog("parent structure (%p <%s>) of cell at %p doesn't match cell's structure (%p <%s>)\n", + cell->structure()->structure(), parentClassName, cell, cell->structure(), ourClassName); + CRASH(); + } +} +#else +void SlotVisitor::validate(JSCell*) +{ +} +#endif + +} // namespace JSC diff --git a/Source/JavaScriptCore/heap/SlotVisitor.h b/Source/JavaScriptCore/heap/SlotVisitor.h index 6364b23e4..230ed3334 100644 --- a/Source/JavaScriptCore/heap/SlotVisitor.h +++ b/Source/JavaScriptCore/heap/SlotVisitor.h @@ -27,35 +27,52 @@ #define SlotVisitor_h #include "CopiedSpace.h" -#include "MarkStack.h" +#include "HandleTypes.h" #include "MarkStackInlineMethods.h" +#include <wtf/text/StringHash.h> + namespace JSC { -class Heap; +class ConservativeRoots; class GCThreadSharedData; +class Heap; +template<typename T> class WriteBarrierBase; +template<typename T> class JITWriteBarrier; + +class SlotVisitor { + WTF_MAKE_NONCOPYABLE(SlotVisitor); + friend class HeapRootVisitor; // Allowed to mark a JSValue* or JSCell** directly. -class SlotVisitor : public MarkStack { - friend class HeapRootVisitor; public: SlotVisitor(GCThreadSharedData&); + ~SlotVisitor(); - void donate() - { - ASSERT(m_isInParallelMode); - if (Options::numberOfGCMarkers() == 1) - return; - - donateKnownParallel(); - } + void append(ConservativeRoots&); - void drain(); + template<typename T> void append(JITWriteBarrier<T>*); + template<typename T> void append(WriteBarrierBase<T>*); + void appendValues(WriteBarrierBase<Unknown>*, size_t count); - void donateAndDrain() - { - donate(); - drain(); - } + template<typename T> + void appendUnbarrieredPointer(T**); + void appendUnbarrieredValue(JSValue*); + + void addOpaqueRoot(void*); + bool containsOpaqueRoot(void*); + int opaqueRootCount(); + + GCThreadSharedData& sharedData() { return m_shared; } + bool isEmpty() { return m_stack.isEmpty(); } + + void setup(); + void reset(); + + size_t visitCount() const { return m_visitCount; } + + void donate(); + void drain(); + void donateAndDrain(); enum SharedDrainMode { SlaveDrain, MasterDrain }; void drainFromShared(SharedDrainMode); @@ -78,19 +95,84 @@ public: void doneCopying(); +#if ENABLE(SIMPLE_HEAP_PROFILING) + VTableSpectrum m_visitedTypeCounts; +#endif + + void addWeakReferenceHarvester(WeakReferenceHarvester*); + void addUnconditionalFinalizer(UnconditionalFinalizer*); + +#if ENABLE(OBJECT_MARK_LOGGING) + inline void resetChildCount() { m_logChildCount = 0; } + inline unsigned childCount() { return m_logChildCount; } + inline void incrementChildCount() { m_logChildCount++; } +#endif + private: + friend class ParallelModeEnabler; + + JS_EXPORT_PRIVATE static void validate(JSCell*); + + void append(JSValue*); + void append(JSValue*, size_t count); + void append(JSCell**); + + void internalAppend(JSCell*); + void internalAppend(JSValue); + void internalAppend(JSValue*); + + JS_EXPORT_PRIVATE void mergeOpaqueRoots(); + void mergeOpaqueRootsIfNecessary(); + void mergeOpaqueRootsIfProfitable(); + void* allocateNewSpaceOrPin(void*, size_t); void* allocateNewSpaceSlow(size_t); void donateKnownParallel(); + MarkStackArray m_stack; + HashSet<void*> m_opaqueRoots; // Handle-owning data structures not visible to the garbage collector. + + size_t m_visitCount; + bool m_isInParallelMode; + + GCThreadSharedData& m_shared; + + bool m_shouldHashConst; // Local per-thread copy of shared flag for performance reasons + typedef HashMap<StringImpl*, JSValue> UniqueStringMap; + UniqueStringMap m_uniqueStrings; + +#if ENABLE(OBJECT_MARK_LOGGING) + unsigned m_logChildCount; +#endif + CopiedAllocator m_copiedAllocator; + +public: +#if !ASSERT_DISABLED + bool m_isCheckingForDefaultMarkViolation; + bool m_isDraining; +#endif }; -inline SlotVisitor::SlotVisitor(GCThreadSharedData& shared) - : MarkStack(shared) -{ -} +class ParallelModeEnabler { +public: + ParallelModeEnabler(SlotVisitor& stack) + : m_stack(stack) + { + ASSERT(!m_stack.m_isInParallelMode); + m_stack.m_isInParallelMode = true; + } + + ~ParallelModeEnabler() + { + ASSERT(m_stack.m_isInParallelMode); + m_stack.m_isInParallelMode = false; + } + +private: + SlotVisitor& m_stack; +}; } // namespace JSC diff --git a/Source/JavaScriptCore/heap/SlotVisitorInlineMethods.h b/Source/JavaScriptCore/heap/SlotVisitorInlineMethods.h index f02564e10..540da3bc4 100644 --- a/Source/JavaScriptCore/heap/SlotVisitorInlineMethods.h +++ b/Source/JavaScriptCore/heap/SlotVisitorInlineMethods.h @@ -27,10 +27,115 @@ #define SlotVisitorInlineMethods_h #include "CopiedSpaceInlineMethods.h" +#include "Options.h" #include "SlotVisitor.h" namespace JSC { +ALWAYS_INLINE void SlotVisitor::append(JSValue* slot, size_t count) +{ + for (size_t i = 0; i < count; ++i) { + JSValue& value = slot[i]; + internalAppend(value); + } +} + +template<typename T> +inline void SlotVisitor::appendUnbarrieredPointer(T** slot) +{ + ASSERT(slot); + JSCell* cell = *slot; + internalAppend(cell); +} + +ALWAYS_INLINE void SlotVisitor::append(JSValue* slot) +{ + ASSERT(slot); + internalAppend(*slot); +} + +ALWAYS_INLINE void SlotVisitor::appendUnbarrieredValue(JSValue* slot) +{ + ASSERT(slot); + internalAppend(*slot); +} + +ALWAYS_INLINE void SlotVisitor::append(JSCell** slot) +{ + ASSERT(slot); + internalAppend(*slot); +} + +ALWAYS_INLINE void SlotVisitor::internalAppend(JSValue value) +{ + if (!value || !value.isCell()) + return; + internalAppend(value.asCell()); +} + +inline void SlotVisitor::addWeakReferenceHarvester(WeakReferenceHarvester* weakReferenceHarvester) +{ + m_shared.m_weakReferenceHarvesters.addThreadSafe(weakReferenceHarvester); +} + +inline void SlotVisitor::addUnconditionalFinalizer(UnconditionalFinalizer* unconditionalFinalizer) +{ + m_shared.m_unconditionalFinalizers.addThreadSafe(unconditionalFinalizer); +} + +inline void SlotVisitor::addOpaqueRoot(void* root) +{ +#if ENABLE(PARALLEL_GC) + if (Options::numberOfGCMarkers() == 1) { + // Put directly into the shared HashSet. + m_shared.m_opaqueRoots.add(root); + return; + } + // Put into the local set, but merge with the shared one every once in + // a while to make sure that the local sets don't grow too large. + mergeOpaqueRootsIfProfitable(); + m_opaqueRoots.add(root); +#else + m_opaqueRoots.add(root); +#endif +} + +inline bool SlotVisitor::containsOpaqueRoot(void* root) +{ + ASSERT(!m_isInParallelMode); +#if ENABLE(PARALLEL_GC) + ASSERT(m_opaqueRoots.isEmpty()); + return m_shared.m_opaqueRoots.contains(root); +#else + return m_opaqueRoots.contains(root); +#endif +} + +inline int SlotVisitor::opaqueRootCount() +{ + ASSERT(!m_isInParallelMode); +#if ENABLE(PARALLEL_GC) + ASSERT(m_opaqueRoots.isEmpty()); + return m_shared.m_opaqueRoots.size(); +#else + return m_opaqueRoots.size(); +#endif +} + +inline void SlotVisitor::mergeOpaqueRootsIfNecessary() +{ + if (m_opaqueRoots.isEmpty()) + return; + mergeOpaqueRoots(); +} + +inline void SlotVisitor::mergeOpaqueRootsIfProfitable() +{ + if (static_cast<unsigned>(m_opaqueRoots.size()) < Options::opaqueRootMergeThreshold()) + return; + mergeOpaqueRoots(); +} + ALWAYS_INLINE bool SlotVisitor::checkIfShouldCopyAndPinOtherwise(void* oldPtr, size_t bytes) { if (CopiedSpace::isOversize(bytes)) { @@ -55,6 +160,21 @@ ALWAYS_INLINE void* SlotVisitor::allocateNewSpace(size_t bytes) return result; } +inline void SlotVisitor::donate() +{ + ASSERT(m_isInParallelMode); + if (Options::numberOfGCMarkers() == 1) + return; + + donateKnownParallel(); +} + +inline void SlotVisitor::donateAndDrain() +{ + donate(); + drain(); +} + } // namespace JSC #endif // SlotVisitorInlineMethods_h diff --git a/Source/JavaScriptCore/interpreter/Interpreter.cpp b/Source/JavaScriptCore/interpreter/Interpreter.cpp index 87b77d639..358a24096 100644 --- a/Source/JavaScriptCore/interpreter/Interpreter.cpp +++ b/Source/JavaScriptCore/interpreter/Interpreter.cpp @@ -4475,50 +4475,43 @@ skip_id_custom_self: goto vm_throw; } DEFINE_OPCODE(op_tear_off_activation) { - /* tear_off_activation activation(r) arguments(r) + /* tear_off_activation activation(r) Copy locals and named parameters from the register file to the heap. - Point the bindings in 'activation' and 'arguments' to this new backing - store. (Note that 'arguments' may not have been created. If created, - 'arguments' already holds a copy of any extra / unnamed parameters.) + Point the bindings in 'activation' to this new backing store. This opcode appears before op_ret in functions that require full scope chains. */ int activation = vPC[1].u.operand; - int arguments = vPC[2].u.operand; ASSERT(codeBlock->needsFullScopeChain()); JSValue activationValue = callFrame->r(activation).jsValue(); - if (activationValue) { + if (activationValue) asActivation(activationValue)->tearOff(*globalData); - if (JSValue argumentsValue = callFrame->r(unmodifiedArgumentsRegister(arguments)).jsValue()) - asArguments(argumentsValue)->didTearOffActivation(*globalData, asActivation(activationValue)); - } else if (JSValue argumentsValue = callFrame->r(unmodifiedArgumentsRegister(arguments)).jsValue()) { - if (!codeBlock->isStrictMode()) - asArguments(argumentsValue)->tearOff(callFrame); - } - vPC += OPCODE_LENGTH(op_tear_off_activation); NEXT_INSTRUCTION(); } DEFINE_OPCODE(op_tear_off_arguments) { - /* tear_off_arguments arguments(r) + /* tear_off_arguments arguments(r) activation(r) Copy named parameters from the register file to the heap. Point the - bindings in 'arguments' to this new backing store. (Note that - 'arguments' may not have been created. If created, 'arguments' already - holds a copy of any extra / unnamed parameters.) + bindings in 'arguments' to this new backing store. (If 'activation' + was also copied to the heap, 'arguments' will point to its storage.) This opcode appears before op_ret in functions that don't require full scope chains, but do use 'arguments'. */ - int src1 = vPC[1].u.operand; - ASSERT(!codeBlock->needsFullScopeChain() && codeBlock->ownerExecutable()->usesArguments()); - - if (JSValue arguments = callFrame->r(unmodifiedArgumentsRegister(src1)).jsValue()) - asArguments(arguments)->tearOff(callFrame); + int arguments = vPC[1].u.operand; + int activation = vPC[2].u.operand; + ASSERT(codeBlock->usesArguments()); + if (JSValue argumentsValue = callFrame->r(unmodifiedArgumentsRegister(arguments)).jsValue()) { + if (JSValue activationValue = callFrame->r(activation).jsValue()) + asArguments(argumentsValue)->didTearOffActivation(callFrame->globalData(), asActivation(activationValue)); + else + asArguments(argumentsValue)->tearOff(callFrame); + } vPC += OPCODE_LENGTH(op_tear_off_arguments); NEXT_INSTRUCTION(); @@ -5112,19 +5105,6 @@ JSValue Interpreter::retrieveArgumentsFromVMCode(CallFrame* callFrame, JSFunctio if (!functionCallFrame) return jsNull(); - CodeBlock* codeBlock = functionCallFrame->someCodeBlockForPossiblyInlinedCode(); - if (codeBlock->usesArguments()) { - ASSERT(codeBlock->codeType() == FunctionCode); - int argumentsRegister = codeBlock->argumentsRegister(); - int realArgumentsRegister = unmodifiedArgumentsRegister(argumentsRegister); - if (JSValue arguments = functionCallFrame->uncheckedR(argumentsRegister).jsValue()) - return arguments; - JSValue arguments = JSValue(Arguments::create(callFrame->globalData(), functionCallFrame)); - functionCallFrame->r(argumentsRegister) = arguments; - functionCallFrame->r(realArgumentsRegister) = arguments; - return arguments; - } - Arguments* arguments = Arguments::create(functionCallFrame->globalData(), functionCallFrame); arguments->tearOff(functionCallFrame); return JSValue(arguments); diff --git a/Source/JavaScriptCore/jit/JITInlineMethods.h b/Source/JavaScriptCore/jit/JITInlineMethods.h index e68ecbe78..3f32597fa 100644 --- a/Source/JavaScriptCore/jit/JITInlineMethods.h +++ b/Source/JavaScriptCore/jit/JITInlineMethods.h @@ -422,9 +422,6 @@ template <typename ClassType, bool destructor, typename StructureType> inline vo // initialize the object's structure storePtr(structure, Address(result, JSCell::structureOffset())); - // initialize the object's classInfo pointer - storePtr(TrustedImmPtr(&ClassType::s_info), Address(result, JSCell::classInfoOffset())); - // initialize the object's property storage pointer storePtr(TrustedImmPtr(0), Address(result, ClassType::offsetOfOutOfLineStorage())); } diff --git a/Source/JavaScriptCore/jit/JITOpcodes.cpp b/Source/JavaScriptCore/jit/JITOpcodes.cpp index 9b7dc634f..f859f8b93 100644 --- a/Source/JavaScriptCore/jit/JITOpcodes.cpp +++ b/Source/JavaScriptCore/jit/JITOpcodes.cpp @@ -559,25 +559,23 @@ void JIT::emit_op_construct(Instruction* currentInstruction) void JIT::emit_op_tear_off_activation(Instruction* currentInstruction) { - unsigned activation = currentInstruction[1].u.operand; - unsigned arguments = currentInstruction[2].u.operand; - Jump activationCreated = branchTestPtr(NonZero, addressFor(activation)); - Jump argumentsNotCreated = branchTestPtr(Zero, addressFor(arguments)); - activationCreated.link(this); + int activation = currentInstruction[1].u.operand; + Jump activationNotCreated = branchTestPtr(Zero, addressFor(activation)); JITStubCall stubCall(this, cti_op_tear_off_activation); stubCall.addArgument(activation, regT2); - stubCall.addArgument(unmodifiedArgumentsRegister(arguments), regT2); stubCall.call(); - argumentsNotCreated.link(this); + activationNotCreated.link(this); } void JIT::emit_op_tear_off_arguments(Instruction* currentInstruction) { - unsigned dst = currentInstruction[1].u.operand; + int arguments = currentInstruction[1].u.operand; + int activation = currentInstruction[2].u.operand; - Jump argsNotCreated = branchTestPtr(Zero, Address(callFrameRegister, sizeof(Register) * (unmodifiedArgumentsRegister(dst)))); + Jump argsNotCreated = branchTestPtr(Zero, Address(callFrameRegister, sizeof(Register) * (unmodifiedArgumentsRegister(arguments)))); JITStubCall stubCall(this, cti_op_tear_off_arguments); - stubCall.addArgument(unmodifiedArgumentsRegister(dst), regT2); + stubCall.addArgument(unmodifiedArgumentsRegister(arguments), regT2); + stubCall.addArgument(activation, regT2); stubCall.call(); argsNotCreated.link(this); } diff --git a/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp b/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp index c94f5d910..adfb57341 100644 --- a/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp +++ b/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp @@ -703,24 +703,22 @@ void JIT::emit_op_is_string(Instruction* currentInstruction) void JIT::emit_op_tear_off_activation(Instruction* currentInstruction) { unsigned activation = currentInstruction[1].u.operand; - unsigned arguments = currentInstruction[2].u.operand; - Jump activationCreated = branch32(NotEqual, tagFor(activation), TrustedImm32(JSValue::EmptyValueTag)); - Jump argumentsNotCreated = branch32(Equal, tagFor(arguments), TrustedImm32(JSValue::EmptyValueTag)); - activationCreated.link(this); + Jump activationNotCreated = branch32(Equal, tagFor(activation), TrustedImm32(JSValue::EmptyValueTag)); JITStubCall stubCall(this, cti_op_tear_off_activation); - stubCall.addArgument(currentInstruction[1].u.operand); - stubCall.addArgument(unmodifiedArgumentsRegister(currentInstruction[2].u.operand)); + stubCall.addArgument(activation); stubCall.call(); - argumentsNotCreated.link(this); + activationNotCreated.link(this); } void JIT::emit_op_tear_off_arguments(Instruction* currentInstruction) { - int dst = currentInstruction[1].u.operand; + int arguments = currentInstruction[1].u.operand; + int activation = currentInstruction[2].u.operand; - Jump argsNotCreated = branch32(Equal, tagFor(unmodifiedArgumentsRegister(dst)), TrustedImm32(JSValue::EmptyValueTag)); + Jump argsNotCreated = branch32(Equal, tagFor(unmodifiedArgumentsRegister(arguments)), TrustedImm32(JSValue::EmptyValueTag)); JITStubCall stubCall(this, cti_op_tear_off_arguments); - stubCall.addArgument(unmodifiedArgumentsRegister(dst)); + stubCall.addArgument(unmodifiedArgumentsRegister(arguments)); + stubCall.addArgument(activation); stubCall.call(); argsNotCreated.link(this); } diff --git a/Source/JavaScriptCore/jit/JITStubs.cpp b/Source/JavaScriptCore/jit/JITStubs.cpp index 8fc395a63..5fad9c8d7 100644 --- a/Source/JavaScriptCore/jit/JITStubs.cpp +++ b/Source/JavaScriptCore/jit/JITStubs.cpp @@ -2311,20 +2311,8 @@ DEFINE_STUB_FUNCTION(void, op_tear_off_activation) { STUB_INIT_STACK_FRAME(stackFrame); - CallFrame* callFrame = stackFrame.callFrame; - ASSERT(callFrame->codeBlock()->needsFullScopeChain()); - JSValue activationValue = stackFrame.args[0].jsValue(); - if (!activationValue) { - if (JSValue v = stackFrame.args[1].jsValue()) { - if (!callFrame->codeBlock()->isStrictMode()) - asArguments(v)->tearOff(callFrame); - } - return; - } - JSActivation* activation = asActivation(stackFrame.args[0].jsValue()); - activation->tearOff(*stackFrame.globalData); - if (JSValue v = stackFrame.args[1].jsValue()) - asArguments(v)->didTearOffActivation(*stackFrame.globalData, activation); + ASSERT(stackFrame.callFrame->codeBlock()->needsFullScopeChain()); + jsCast<JSActivation*>(stackFrame.args[0].jsValue())->tearOff(*stackFrame.globalData); } DEFINE_STUB_FUNCTION(void, op_tear_off_arguments) @@ -2332,8 +2320,13 @@ DEFINE_STUB_FUNCTION(void, op_tear_off_arguments) STUB_INIT_STACK_FRAME(stackFrame); CallFrame* callFrame = stackFrame.callFrame; - ASSERT(callFrame->codeBlock()->usesArguments() && !callFrame->codeBlock()->needsFullScopeChain()); - asArguments(stackFrame.args[0].jsValue())->tearOff(callFrame); + ASSERT(callFrame->codeBlock()->usesArguments()); + Arguments* arguments = jsCast<Arguments*>(stackFrame.args[0].jsValue()); + if (JSValue activationValue = stackFrame.args[1].jsValue()) { + arguments->didTearOffActivation(callFrame->globalData(), jsCast<JSActivation*>(activationValue)); + return; + } + arguments->tearOff(callFrame); } DEFINE_STUB_FUNCTION(void, op_profile_will_call) diff --git a/Source/JavaScriptCore/jit/JITWriteBarrier.h b/Source/JavaScriptCore/jit/JITWriteBarrier.h index 81a3653a0..ee73b702f 100644 --- a/Source/JavaScriptCore/jit/JITWriteBarrier.h +++ b/Source/JavaScriptCore/jit/JITWriteBarrier.h @@ -29,7 +29,7 @@ #if ENABLE(JIT) #include "MacroAssembler.h" -#include "MarkStack.h" +#include "SlotVisitor.h" #include "WriteBarrier.h" namespace JSC { @@ -135,7 +135,7 @@ public: } }; -template<typename T> inline void MarkStack::append(JITWriteBarrier<T>* slot) +template<typename T> inline void SlotVisitor::append(JITWriteBarrier<T>* slot) { internalAppend(slot->get()); } diff --git a/Source/JavaScriptCore/jit/JumpReplacementWatchpoint.cpp b/Source/JavaScriptCore/jit/JumpReplacementWatchpoint.cpp index 00311dab4..26eae57be 100644 --- a/Source/JavaScriptCore/jit/JumpReplacementWatchpoint.cpp +++ b/Source/JavaScriptCore/jit/JumpReplacementWatchpoint.cpp @@ -29,6 +29,7 @@ #if ENABLE(JIT) #include "LinkBuffer.h" +#include "Options.h" namespace JSC { diff --git a/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp b/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp index 1a34a09d4..fa50fedb6 100644 --- a/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp +++ b/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp @@ -1454,26 +1454,19 @@ LLINT_SLOW_PATH_DECL(slow_path_tear_off_activation) { LLINT_BEGIN(); ASSERT(exec->codeBlock()->needsFullScopeChain()); - JSValue activationValue = LLINT_OP(1).jsValue(); - if (!activationValue) { - if (JSValue v = exec->uncheckedR(unmodifiedArgumentsRegister(pc[2].u.operand)).jsValue()) { - if (!exec->codeBlock()->isStrictMode()) - asArguments(v)->tearOff(exec); - } - LLINT_END(); - } - JSActivation* activation = asActivation(activationValue); - activation->tearOff(globalData); - if (JSValue v = exec->uncheckedR(unmodifiedArgumentsRegister(pc[2].u.operand)).jsValue()) - asArguments(v)->didTearOffActivation(globalData, activation); + jsCast<JSActivation*>(LLINT_OP(1).jsValue())->tearOff(globalData); LLINT_END(); } LLINT_SLOW_PATH_DECL(slow_path_tear_off_arguments) { LLINT_BEGIN(); - ASSERT(exec->codeBlock()->usesArguments() && !exec->codeBlock()->needsFullScopeChain()); - asArguments(exec->uncheckedR(unmodifiedArgumentsRegister(pc[1].u.operand)).jsValue())->tearOff(exec); + ASSERT(exec->codeBlock()->usesArguments()); + Arguments* arguments = jsCast<Arguments*>(exec->uncheckedR(unmodifiedArgumentsRegister(pc[1].u.operand)).jsValue()); + if (JSValue activationValue = LLINT_OP_C(2).jsValue()) + arguments->didTearOffActivation(globalData, jsCast<JSActivation*>(activationValue)); + else + arguments->tearOff(exec); LLINT_END(); } diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter.asm b/Source/JavaScriptCore/llint/LowLevelInterpreter.asm index db4b71dfd..4c590a1c3 100644 --- a/Source/JavaScriptCore/llint/LowLevelInterpreter.asm +++ b/Source/JavaScriptCore/llint/LowLevelInterpreter.asm @@ -86,9 +86,9 @@ const HashFlags8BitBuffer = 64 # Property storage constants if JSVALUE64 - const InlineStorageCapacity = 5 -else const InlineStorageCapacity = 6 +else + const InlineStorageCapacity = 7 end # Allocation constants @@ -310,7 +310,7 @@ macro functionInitialization(profileArgSkip) .stackHeightOK: end -macro allocateBasicJSObject(sizeClassIndex, classInfoOffset, structure, result, scratch1, scratch2, slowCase) +macro allocateBasicJSObject(sizeClassIndex, structure, result, scratch1, scratch2, slowCase) if ALWAYS_ALLOCATE_SLOW jmp slowCase else @@ -338,8 +338,6 @@ macro allocateBasicJSObject(sizeClassIndex, classInfoOffset, structure, result, storep scratch2, offsetOfMySizeClass + offsetOfFirstFreeCell[scratch1] # Initialize the object. - loadp classInfoOffset[scratch1], scratch2 - storep scratch2, [result] storep structure, JSCell::m_structure[result] storep 0, JSObject::m_outOfLineStorage[result] end diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm b/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm index b011c5425..103a3f978 100644 --- a/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm +++ b/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm @@ -352,7 +352,7 @@ _llint_op_create_this: loadp Callee[cfr], t0 loadp JSFunction::m_cachedInheritorID[t0], t2 btpz t2, .opCreateThisSlow - allocateBasicJSObject(JSFinalObjectSizeClassIndex, JSGlobalData::jsFinalObjectClassInfo, t2, t0, t1, t3, .opCreateThisSlow) + allocateBasicJSObject(JSFinalObjectSizeClassIndex, t2, t0, t1, t3, .opCreateThisSlow) loadi 4[PC], t1 storei CellTag, TagOffset[cfr, t1, 8] storei t0, PayloadOffset[cfr, t1, 8] @@ -384,7 +384,7 @@ _llint_op_new_object: loadp CodeBlock[cfr], t0 loadp CodeBlock::m_globalObject[t0], t0 loadp JSGlobalObject::m_emptyObjectStructure[t0], t1 - allocateBasicJSObject(JSFinalObjectSizeClassIndex, JSGlobalData::jsFinalObjectClassInfo, t1, t0, t2, t3, .opNewObjectSlow) + allocateBasicJSObject(JSFinalObjectSizeClassIndex, t1, t0, t2, t3, .opNewObjectSlow) loadi 4[PC], t1 storei CellTag, TagOffset[cfr, t1, 8] storei t0, PayloadOffset[cfr, t1, 8] @@ -1639,13 +1639,10 @@ end _llint_op_tear_off_activation: traceExecution() loadi 4[PC], t0 - loadi 8[PC], t1 - bineq TagOffset[cfr, t0, 8], EmptyValueTag, .opTearOffActivationCreated - bieq TagOffset[cfr, t1, 8], EmptyValueTag, .opTearOffActivationNotCreated -.opTearOffActivationCreated: + bieq TagOffset[cfr, t0, 8], EmptyValueTag, .opTearOffActivationNotCreated callSlowPath(_llint_slow_path_tear_off_activation) .opTearOffActivationNotCreated: - dispatch(3) + dispatch(2) _llint_op_tear_off_arguments: @@ -1655,7 +1652,7 @@ _llint_op_tear_off_arguments: bieq TagOffset[cfr, t0, 8], EmptyValueTag, .opTearOffArgumentsNotCreated callSlowPath(_llint_slow_path_tear_off_arguments) .opTearOffArgumentsNotCreated: - dispatch(2) + dispatch(3) _llint_op_ret: diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm b/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm index d429542e7..4bb7b8e1c 100644 --- a/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm +++ b/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm @@ -236,7 +236,7 @@ _llint_op_create_this: loadp Callee[cfr], t0 loadp JSFunction::m_cachedInheritorID[t0], t2 btpz t2, .opCreateThisSlow - allocateBasicJSObject(JSFinalObjectSizeClassIndex, JSGlobalData::jsFinalObjectClassInfo, t2, t0, t1, t3, .opCreateThisSlow) + allocateBasicJSObject(JSFinalObjectSizeClassIndex, t2, t0, t1, t3, .opCreateThisSlow) loadis 8[PB, PC, 8], t1 storep t0, [cfr, t1, 8] dispatch(2) @@ -267,7 +267,7 @@ _llint_op_new_object: loadp CodeBlock[cfr], t0 loadp CodeBlock::m_globalObject[t0], t0 loadp JSGlobalObject::m_emptyObjectStructure[t0], t1 - allocateBasicJSObject(JSFinalObjectSizeClassIndex, JSGlobalData::jsFinalObjectClassInfo, t1, t0, t2, t3, .opNewObjectSlow) + allocateBasicJSObject(JSFinalObjectSizeClassIndex, t1, t0, t2, t3, .opNewObjectSlow) loadis 8[PB, PC, 8], t1 storep t0, [cfr, t1, 8] dispatch(2) @@ -1483,13 +1483,10 @@ end _llint_op_tear_off_activation: traceExecution() loadis 8[PB, PC, 8], t0 - loadis 16[PB, PC, 8], t1 - btpnz [cfr, t0, 8], .opTearOffActivationCreated - btpz [cfr, t1, 8], .opTearOffActivationNotCreated -.opTearOffActivationCreated: + btpz [cfr, t0, 8], .opTearOffActivationNotCreated callSlowPath(_llint_slow_path_tear_off_activation) .opTearOffActivationNotCreated: - dispatch(3) + dispatch(2) _llint_op_tear_off_arguments: @@ -1499,7 +1496,7 @@ _llint_op_tear_off_arguments: btpz [cfr, t0, 8], .opTearOffArgumentsNotCreated callSlowPath(_llint_slow_path_tear_off_arguments) .opTearOffArgumentsNotCreated: - dispatch(2) + dispatch(3) _llint_op_ret: diff --git a/Source/JavaScriptCore/offlineasm/armv7.rb b/Source/JavaScriptCore/offlineasm/armv7.rb index 6595fdc71..eb9472af3 100644 --- a/Source/JavaScriptCore/offlineasm/armv7.rb +++ b/Source/JavaScriptCore/offlineasm/armv7.rb @@ -527,8 +527,8 @@ def armV7LowerMisplacedAddresses(list) node.opcode, armV7AsRegisters(newList, postInstructions, node.operands, "i"), annotation) - when "bbeq", "bbneq", "bba", "bbaeq", "bbb", "bbbeq", "btbo", "btbz", "btbnz", "tbz", "tbnz", - "tbo", "cbeq", "cbneq", "cba", "cbaeq", "cbb", "cbbeq" + when "bbeq", "bbneq", "bba", "bbaeq", "bbb", "bbbeq", "btbz", "btbnz", "tbz", "tbnz", + "cbeq", "cbneq", "cba", "cbaeq", "cbb", "cbbeq" newList << Instruction.new(node.codeOrigin, node.opcode, armV7AsRegisters(newList, postInstructions, node.operands, "b"), @@ -579,8 +579,8 @@ def armV7LowerRegisterReuse(list) case node.opcode when "cieq", "cineq", "cia", "ciaeq", "cib", "cibeq", "cigt", "cigteq", "cilt", "cilteq", "cpeq", "cpneq", "cpa", "cpaeq", "cpb", "cpbeq", "cpgt", "cpgteq", "cplt", "cplteq", - "tio", "tis", "tiz", "tinz", "tbo", "tbs", "tbz", "tbnz", "tpo", "tps", "tpz", "tpnz", - "cbeq", "cbneq", "cba", "cbaeq", "cbb", "cbbeq", "cbgt", "cbgteq", "cblt", "cblteq" + "tis", "tiz", "tinz", "tbs", "tbz", "tbnz", "tps", "tpz", "tpnz", "cbeq", "cbneq", + "cba", "cbaeq", "cbb", "cbbeq", "cbgt", "cbgteq", "cblt", "cblteq" if node.operands.size == 2 if node.operands[0] == node.operands[1] tmp = Tmp.new(node.codeOrigin, :gpr) @@ -940,9 +940,6 @@ class Instruction when "btinz", "btpnz", "btbnz" emitArmV7Test(operands) $asm.puts "bne #{operands[-1].asmLabel}" - when "btio", "btpo", "btbo" - emitArmV7Test(operands) - $asm.puts "bvs #{operands[-1].asmLabel}" when "btis", "btps", "btbs" emitArmV7Test(operands) $asm.puts "bmi #{operands[-1].asmLabel}" @@ -982,8 +979,6 @@ class Instruction emitArmV7Compare(operands, "lt") when "cilteq", "cplteq", "cblteq" emitArmV7Compare(operands, "le") - when "tio", "tbo", "tpo" - emitArmV7TestSet(operands, "vs") when "tis", "tbs", "tps" emitArmV7TestSet(operands, "mi") when "tiz", "tbz", "tpz" diff --git a/Source/JavaScriptCore/offlineasm/instructions.rb b/Source/JavaScriptCore/offlineasm/instructions.rb index 211c10933..d046bee6f 100644 --- a/Source/JavaScriptCore/offlineasm/instructions.rb +++ b/Source/JavaScriptCore/offlineasm/instructions.rb @@ -107,11 +107,9 @@ MACRO_INSTRUCTIONS = "bbgteq", "bblt", "bblteq", - "btio", "btis", "btiz", "btinz", - "btbo", "btbs", "btbz", "btbnz", @@ -155,15 +153,12 @@ MACRO_INSTRUCTIONS = "cigteq", "cilt", "cilteq", - "tio", "tis", "tiz", "tinz", - "tbo", "tbs", "tbz", "tbnz", - "tpo", "tps", "tpz", "tpnz", @@ -197,7 +192,6 @@ MACRO_INSTRUCTIONS = "cplt", "cplteq", "storep", - "btpo", "btps", "btpz", "btpnz", diff --git a/Source/JavaScriptCore/offlineasm/x86.rb b/Source/JavaScriptCore/offlineasm/x86.rb index cebc83326..033c200d7 100644 --- a/Source/JavaScriptCore/offlineasm/x86.rb +++ b/Source/JavaScriptCore/offlineasm/x86.rb @@ -835,10 +835,6 @@ class Instruction handleX86IntBranch("jl", :byte) when "bblteq" handleX86IntBranch("jlteq", :byte) - when "btio" - handleX86BranchTest("jo", :int) - when "btpo" - handleX86BranchTest("jo", :ptr) when "btis" handleX86BranchTest("js", :int) when "btps" @@ -851,8 +847,6 @@ class Instruction handleX86BranchTest("jnz", :int) when "btpnz" handleX86BranchTest("jnz", :ptr) - when "btbo" - handleX86BranchTest("jo", :byte) when "btbs" handleX86BranchTest("js", :byte) when "btbz" @@ -967,24 +961,18 @@ class Instruction handleX86IntCompareSet("setle", :byte) when "cplteq" handleX86IntCompareSet("setle", :ptr) - when "tio" - handleX86SetTest("seto", :int) when "tis" handleX86SetTest("sets", :int) when "tiz" handleX86SetTest("setz", :int) when "tinz" handleX86SetTest("setnz", :int) - when "tpo" - handleX86SetTest("seto", :ptr) when "tps" handleX86SetTest("sets", :ptr) when "tpz" handleX86SetTest("setz", :ptr) when "tpnz" handleX86SetTest("setnz", :ptr) - when "tbo" - handleX86SetTest("seto", :byte) when "tbs" handleX86SetTest("sets", :byte) when "tbz" diff --git a/Source/JavaScriptCore/runtime/JSCell.h b/Source/JavaScriptCore/runtime/JSCell.h index ef06b1ecf..a63e08e33 100644 --- a/Source/JavaScriptCore/runtime/JSCell.h +++ b/Source/JavaScriptCore/runtime/JSCell.h @@ -30,6 +30,7 @@ #include "JSLock.h" #include "JSValueInlineMethods.h" #include "SlotVisitor.h" +#include "SlotVisitorInlineMethods.h" #include "WriteBarrier.h" #include <wtf/Noncopyable.h> @@ -108,7 +109,6 @@ namespace JSC { // Object operations, with the toObject operation included. const ClassInfo* classInfo() const; - const ClassInfo* validatedClassInfo() const; const MethodTable* methodTable() const; static void put(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&); static void putByIndex(JSCell*, ExecState*, unsigned propertyName, JSValue, bool shouldThrow); @@ -133,11 +133,6 @@ namespace JSC { return OBJECT_OFFSETOF(JSCell, m_structure); } - static ptrdiff_t classInfoOffset() - { - return OBJECT_OFFSETOF(JSCell, m_classInfo); - } - void* structureAddress() { return &m_structure; @@ -170,7 +165,6 @@ namespace JSC { private: friend class LLIntOffsetsExtractor; - const ClassInfo* m_classInfo; WriteBarrier<Structure> m_structure; }; diff --git a/Source/JavaScriptCore/runtime/JSObject.h b/Source/JavaScriptCore/runtime/JSObject.h index f4b847b4c..5e2c12f2f 100644 --- a/Source/JavaScriptCore/runtime/JSObject.h +++ b/Source/JavaScriptCore/runtime/JSObject.h @@ -346,9 +346,6 @@ namespace JSC { Structure* createInheritorID(JSGlobalData&); StorageBarrier m_outOfLineStorage; -#if USE(JSVALUE32_64) - void* m_padding; -#endif }; diff --git a/Source/JavaScriptCore/runtime/PropertyOffset.h b/Source/JavaScriptCore/runtime/PropertyOffset.h index 511c5e334..aa82eb468 100644 --- a/Source/JavaScriptCore/runtime/PropertyOffset.h +++ b/Source/JavaScriptCore/runtime/PropertyOffset.h @@ -34,9 +34,9 @@ namespace JSC { #if USE(JSVALUE32_64) -#define INLINE_STORAGE_CAPACITY 6 +#define INLINE_STORAGE_CAPACITY 7 #else -#define INLINE_STORAGE_CAPACITY 5 +#define INLINE_STORAGE_CAPACITY 6 #endif typedef int PropertyOffset; diff --git a/Source/JavaScriptCore/runtime/Structure.h b/Source/JavaScriptCore/runtime/Structure.h index 57368bee8..73ec0789e 100644 --- a/Source/JavaScriptCore/runtime/Structure.h +++ b/Source/JavaScriptCore/runtime/Structure.h @@ -460,7 +460,7 @@ namespace JSC { ASSERT(!heap.globalData()->isInitializingObject()); heap.globalData()->setInitializingObjectClass(&Structure::s_info); #endif - JSCell* result = static_cast<JSCell*>(heap.allocateStructure()); + JSCell* result = static_cast<JSCell*>(heap.allocateStructure(sizeof(Structure))); result->clearStructure(); return result; } @@ -554,17 +554,7 @@ namespace JSC { m_structure.set(globalData, this, structure); } - inline const ClassInfo* JSCell::validatedClassInfo() const - { -#if ENABLE(GC_VALIDATION) - ASSERT(m_structure.unvalidatedGet()->classInfo() == m_classInfo); -#else - ASSERT(m_structure->classInfo() == m_classInfo); -#endif - return m_classInfo; - } - - ALWAYS_INLINE void MarkStack::internalAppend(JSCell* cell) + ALWAYS_INLINE void SlotVisitor::internalAppend(JSCell* cell) { ASSERT(!m_isCheckingForDefaultMarkViolation); if (!cell) @@ -603,8 +593,7 @@ namespace JSC { } inline JSCell::JSCell(JSGlobalData& globalData, Structure* structure) - : m_classInfo(structure->classInfo()) - , m_structure(globalData, this, structure) + : m_structure(globalData, this, structure) { } @@ -616,7 +605,6 @@ namespace JSC { if (structure) #endif m_structure.setEarlyValue(globalData, this, structure); - m_classInfo = structure->classInfo(); // Very first set of allocations won't have a real structure. ASSERT(m_structure || !globalData.structureStructure); } diff --git a/Source/JavaScriptCore/runtime/WriteBarrier.h b/Source/JavaScriptCore/runtime/WriteBarrier.h index 9784a921e..ef8c3aff8 100644 --- a/Source/JavaScriptCore/runtime/WriteBarrier.h +++ b/Source/JavaScriptCore/runtime/WriteBarrier.h @@ -225,14 +225,14 @@ template <typename U, typename V> inline bool operator==(const WriteBarrierBase< return lhs.get() == rhs.get(); } -// MarkStack functions +// SlotVisitor functions -template<typename T> inline void MarkStack::append(WriteBarrierBase<T>* slot) +template<typename T> inline void SlotVisitor::append(WriteBarrierBase<T>* slot) { internalAppend(*slot->slot()); } -ALWAYS_INLINE void MarkStack::appendValues(WriteBarrierBase<Unknown>* barriers, size_t count) +ALWAYS_INLINE void SlotVisitor::appendValues(WriteBarrierBase<Unknown>* barriers, size_t count) { append(barriers->slot(), count); } diff --git a/Source/JavaScriptCore/shell/PlatformEfl.cmake b/Source/JavaScriptCore/shell/PlatformEfl.cmake index 53755727b..22fe20a8e 100644 --- a/Source/JavaScriptCore/shell/PlatformEfl.cmake +++ b/Source/JavaScriptCore/shell/PlatformEfl.cmake @@ -3,7 +3,3 @@ LIST(APPEND JSC_LIBRARIES ${ECORE_LIBRARIES} ${CMAKE_DL_LIBS} ) - -LIST(APPEND JSC_LINK_FLAGS - ${ECORE_LDFLAGS} -) diff --git a/Source/JavaScriptCore/tests/mozilla/js1_4/Functions/function-001.js b/Source/JavaScriptCore/tests/mozilla/js1_4/Functions/function-001.js index c1e6a3df1..fd2ceb0c3 100644 --- a/Source/JavaScriptCore/tests/mozilla/js1_4/Functions/function-001.js +++ b/Source/JavaScriptCore/tests/mozilla/js1_4/Functions/function-001.js @@ -82,7 +82,7 @@ SECTION, "return function.arguments when function contains an arguments property", "PASS", - TestFunction_4( "F", "A", "I", "L" ) +""); + TestFunction_4( "P", "A", "S", "S" ) +""); test(); @@ -100,7 +100,7 @@ } function TestFunction_4( a, b, c, d, e ) { - var arguments = "PASS"; - return TestFunction_4.arguments; + var arguments = "FAIL"; + return Array.prototype.join.call(TestFunction_4.arguments, ""); } diff --git a/Source/JavaScriptCore/yarr/YarrJIT.cpp b/Source/JavaScriptCore/yarr/YarrJIT.cpp index ee6e39753..ce84e2c74 100644 --- a/Source/JavaScriptCore/yarr/YarrJIT.cpp +++ b/Source/JavaScriptCore/yarr/YarrJIT.cpp @@ -28,6 +28,7 @@ #include <wtf/ASCIICType.h> #include "LinkBuffer.h" +#include "Options.h" #include "Yarr.h" #include "YarrCanonicalizeUCS2.h" diff --git a/Source/Platform/ChangeLog b/Source/Platform/ChangeLog index 6e913e781..240d932cf 100644 --- a/Source/Platform/ChangeLog +++ b/Source/Platform/ChangeLog @@ -1,3 +1,39 @@ +2012-09-11 Zach Kuznia <zork@chromium.org> + + Fix FilterTypeZoom to properly call canvas->restore() + https://bugs.webkit.org/show_bug.cgi?id=96082 + + Reviewed by Adrienne Walker. + + Fix zoom filter to properly indicate that it affects pixels. + + * chromium/src/WebFilterOperations.cpp: + (WebKit::WebFilterOperations::hasFilterThatMovesPixels): + (WebKit::WebFilterOperations::hasFilterThatAffectsOpacity): + +2012-09-11 Tommy Widenflycht <tommyw@google.com> + + MediaStream API: add RTCPeerConnection::onnegotiationneeded + https://bugs.webkit.org/show_bug.cgi?id=96097 + + Reviewed by Adam Barth. + + * chromium/public/WebRTCPeerConnectionHandlerClient.h: + (WebRTCPeerConnectionHandlerClient): + +2012-09-10 Adrienne Walker <enne@google.com> + + [chromium] Fix deadlock between WebMediaPlayerClientImpl dtor and PutCurrentFrame + https://bugs.webkit.org/show_bug.cgi?id=96010 + + Reviewed by James Robinson. + + Add some additional clarifying comments. + + * chromium/public/WebVideoFrameProvider.h: + (Client): + (WebVideoFrameProvider): + 2012-09-10 Tommy Widenflycht <tommyw@google.com> [chromium] MediaStream API: Remove the Descriptor postfix diff --git a/Source/Platform/chromium/public/WebRTCPeerConnectionHandlerClient.h b/Source/Platform/chromium/public/WebRTCPeerConnectionHandlerClient.h index 815981d87..316ce5c30 100644 --- a/Source/Platform/chromium/public/WebRTCPeerConnectionHandlerClient.h +++ b/Source/Platform/chromium/public/WebRTCPeerConnectionHandlerClient.h @@ -58,6 +58,7 @@ public: virtual ~WebRTCPeerConnectionHandlerClient() { } + virtual void negotiationNeeded() = 0; virtual void didGenerateICECandidate(const WebRTCICECandidate&) = 0; virtual void didChangeReadyState(ReadyState) = 0; virtual void didChangeICEState(ICEState) = 0; diff --git a/Source/Platform/chromium/public/WebVideoFrameProvider.h b/Source/Platform/chromium/public/WebVideoFrameProvider.h index 4d656a268..24552e802 100644 --- a/Source/Platform/chromium/public/WebVideoFrameProvider.h +++ b/Source/Platform/chromium/public/WebVideoFrameProvider.h @@ -46,7 +46,8 @@ public: class Client { public: // Provider will call this method to tell the client to stop using it. - // stopUsingProvider() may be called from any thread. + // stopUsingProvider() may be called from any thread. The client should + // block until it has putCurrentFrame any outstanding frames. virtual void stopUsingProvider() = 0; // Notifies the provider's client that a call to getCurrentFrame() will return new data. @@ -57,17 +58,20 @@ public: virtual void didUpdateMatrix(const float*) = 0; }; - // May be called from any thread. + // May be called from any thread, but there must be some external guarantee + // that the provider is not destroyed before this call returns. virtual void setVideoFrameProviderClient(Client*) = 0; // This function places a lock on the current frame and returns a pointer to it. // Calls to this method should always be followed with a call to putCurrentFrame(). // The ownership of the object is not transferred to the caller and - // the caller should not free the returned object. + // the caller should not free the returned object. Only the current provider + // client should call this function. virtual WebVideoFrame* getCurrentFrame() = 0; // This function releases the lock on the video frame in chromium. It should // always be called after getCurrentFrame(). Frames passed into this method - // should no longer be referenced after the call is made. + // should no longer be referenced after the call is made. Only the current + // provider client should call this function. virtual void putCurrentFrame(WebVideoFrame*) = 0; }; diff --git a/Source/Platform/chromium/src/WebFilterOperations.cpp b/Source/Platform/chromium/src/WebFilterOperations.cpp index 882d5a1e8..d724d5316 100644 --- a/Source/Platform/chromium/src/WebFilterOperations.cpp +++ b/Source/Platform/chromium/src/WebFilterOperations.cpp @@ -116,6 +116,7 @@ bool WebFilterOperations::hasFilterThatMovesPixels() const switch (op.type()) { case WebFilterOperation::FilterTypeBlur: case WebFilterOperation::FilterTypeDropShadow: + case WebFilterOperation::FilterTypeZoom: return true; default: break; @@ -132,6 +133,7 @@ bool WebFilterOperations::hasFilterThatAffectsOpacity() const case WebFilterOperation::FilterTypeOpacity: case WebFilterOperation::FilterTypeBlur: case WebFilterOperation::FilterTypeDropShadow: + case WebFilterOperation::FilterTypeZoom: return true; case WebFilterOperation::FilterTypeColorMatrix: { const SkScalar* matrix = op.matrix(); diff --git a/Source/QtWebKit.pro b/Source/QtWebKit.pro index b10c7acf4..b15862556 100644 --- a/Source/QtWebKit.pro +++ b/Source/QtWebKit.pro @@ -10,10 +10,10 @@ CONFIG += ordered api.file = api.pri SUBDIRS += api -!no_webkit2 { +build?(webkit2) { webprocess.file = WebKit2/WebProcess.pro SUBDIRS += webprocess - contains(DEFINES, ENABLE_PLUGIN_PROCESS=1) { + enable?(PLUGIN_PROCESS) { pluginprocess.file = WebKit2/PluginProcess.pro SUBDIRS += pluginprocess } @@ -23,10 +23,10 @@ include(WebKit/qt/docs/docs.pri) declarative.file = WebKit/qt/declarative/declarative.pro declarative.makefile = Makefile.declarative -contains(DEFINES, HAVE_QTQUICK=1): SUBDIRS += declarative +have?(QTQUICK): SUBDIRS += declarative -!no_webkit1 { - contains(DEFINES, HAVE_QTTESTLIB=1) { +build?(webkit1) { + build?(tests) { tests.file = tests.pri SUBDIRS += tests } diff --git a/Source/WTF/ChangeLog b/Source/WTF/ChangeLog index cf4eada78..e07e85b7d 100644 --- a/Source/WTF/ChangeLog +++ b/Source/WTF/ChangeLog @@ -1,3 +1,131 @@ +2012-09-11 Adrienne Walker <enne@google.com> + + Clang doesn't optimize away undefined OwnPtr copy constructor + https://bugs.webkit.org/show_bug.cgi?id=74625 + + Reviewed by Anders Carlsson. + + Original patch by Anders Carlsson, with a minor edit. + + The publicly declared-but-not-defined copy constructor is a compiler + optimization-dependent landmine. Clang often fails to optimize the use + of this function out, leading to internal linkage errors for the missing + definition. gcc doesn't have this problem and optimizes that function + out, leading to code that inconsistently fails to link across platforms. + + As a partial fix for this problem, on any compiler that supports C++11 + move semantics, replace the bogus copy constructor with the move + constructors. In the future, if all compilers support this, then the + copy constructor can be removed. + + This still leaves other compilers that don't support move semantics + like Visual Studio vulnerable to linking inconsistencies. + + * wtf/OwnPtr.h: + (OwnPtr): + (WTF): + (WTF::::OwnPtr): + (WTF::=): + +2012-09-11 Raphael Kubo da Costa <rakuco@webkit.org> + + [EFL] Rewrite the EFL-related Find modules + https://bugs.webkit.org/show_bug.cgi?id=95237 + + Reviewed by Kenneth Rohde Christiansen. + + * CMakeLists.txt: Stop setting the LINK_FLAGS property. + * PlatformEfl.cmake: Add libraries and include directories for + each Enlightenment Foundation Library used by the port. + +2012-09-11 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> + + [Qt] Add a configure step to the Qt build system + + This allows building the Qt port using just 'qmake WebKit.pro'. Using + the build-webkit script is still supported, and will add slightly more + logic to the build, such as detecting the need for clean or incremental + builds. + + Internally, the build system now uses a new variable, WEBKIT_CONFIG, for + all things related to configuring the build, such as use/have/enable flags, + and these are translated to defines in default_post. Project files should + no longer check contains(DEFINES,...) to detect features, but use the new + enable?(), use?(), and have?() functions. The no_webkit1 and no_webkit2 + options have been translated into WEBKIT_CONFIG options as well, and can + be checked using build?(). + + Reviewed by Simon Hausmann. + + * WTF.pri: + * wtf/Platform.h: + +2012-09-10 Ilya Tikhonovsky <loislo@chromium.org> + + Web Inspector: NMI: move MemoryInstrumentation.h to wtf + https://bugs.webkit.org/show_bug.cgi?id=96356 + + Reviewed by Yury Semikhatsky. + + It is necessary step because it helps us to remove dependency between platform and WebCore. + + * GNUmakefile.list.am: + * WTF.gypi: + * WTF.pro: + * WTF.vcproj/WTF.vcproj: + * WTF.xcodeproj/project.pbxproj: + * wtf/MemoryInstrumentation.h: Renamed from Source/WebCore/dom/MemoryInstrumentation.h. + (WebCore): + (GenericMemoryTypes): + (MemoryInstrumentationTraits): + (MemoryInstrumentation): + (WebCore::MemoryInstrumentation::~MemoryInstrumentation): + (WebCore::MemoryInstrumentation::addRootObject): + (InstrumentedPointerBase): + (WebCore::MemoryInstrumentation::InstrumentedPointerBase::~InstrumentedPointerBase): + (InstrumentedPointer): + (WebCore::MemoryInstrumentation::InstrumentedPointer::InstrumentedPointer): + (WebCore::MemoryInstrumentation::addObject): + (WebCore::MemoryInstrumentation::addInstrumentedObject): + (WebCore::MemoryInstrumentation::addRawBuffer): + (WebCore::MemoryInstrumentation::OwningTraits::addInstrumentedObject): + (WebCore::MemoryInstrumentation::OwningTraits::addObject): + (WebCore::MemoryInstrumentationTraits::addInstrumentedObject): + (WebCore::MemoryInstrumentationTraits::addObject): + (MemoryObjectInfo): + (WebCore::MemoryObjectInfo::MemoryObjectInfo): + (WebCore::MemoryObjectInfo::objectType): + (WebCore::MemoryObjectInfo::objectSize): + (WebCore::MemoryObjectInfo::memoryInstrumentation): + (WebCore::MemoryObjectInfo::reportObjectInfo): + (MemoryClassInfo): + (WebCore::MemoryClassInfo::MemoryClassInfo): + (WebCore::MemoryClassInfo::addInstrumentedMember): + (WebCore::MemoryClassInfo::addMember): + (WebCore::MemoryClassInfo::addHashMap): + (WebCore::MemoryClassInfo::addHashSet): + (WebCore::MemoryClassInfo::addHashCountedSet): + (WebCore::MemoryClassInfo::addInstrumentedHashSet): + (WebCore::MemoryClassInfo::addInstrumentedVector): + (WebCore::MemoryClassInfo::addInstrumentedVectorPtr): + (WebCore::MemoryClassInfo::addInstrumentedMapEntries): + (WebCore::MemoryClassInfo::addInstrumentedMapValues): + (WebCore::MemoryClassInfo::addListHashSet): + (WebCore::MemoryClassInfo::addVector): + (WebCore::MemoryClassInfo::addVectorPtr): + (WebCore::MemoryClassInfo::addRawBuffer): + (WebCore::MemoryInstrumentation::addInstrumentedObjectImpl): + (WebCore::MemoryInstrumentation::addObjectImpl): + (WebCore::MemoryInstrumentation::addHashMap): + (WebCore::MemoryInstrumentation::addHashSet): + (WebCore::MemoryInstrumentation::addInstrumentedCollection): + (WebCore::MemoryInstrumentation::addInstrumentedMapEntries): + (WebCore::MemoryInstrumentation::addInstrumentedMapValues): + (WebCore::MemoryInstrumentation::addListHashSet): + (WebCore::MemoryInstrumentation::addVector): + (WebCore::MemoryInstrumentation::calculateContainerSize): + (WebCore::::process): + 2012-09-09 Mark Lam <mark.lam@apple.com> Fixed ASSERT() and ASSERT_AT() macros so that they can be used in diff --git a/Source/WTF/GNUmakefile.list.am b/Source/WTF/GNUmakefile.list.am index a40803455..e8e42edd3 100644 --- a/Source/WTF/GNUmakefile.list.am +++ b/Source/WTF/GNUmakefile.list.am @@ -79,6 +79,7 @@ wtf_sources += \ Source/WTF/wtf/MathExtras.h \ Source/WTF/wtf/MediaTime.h \ Source/WTF/wtf/MediaTime.cpp \ + Source/WTF/wtf/MemoryInstrumentation.h \ Source/WTF/wtf/MessageQueue.h \ Source/WTF/wtf/MetaAllocator.cpp \ Source/WTF/wtf/MetaAllocator.h \ diff --git a/Source/WTF/WTF.gypi b/Source/WTF/WTF.gypi index cdc73fd45..5dcd01ed7 100644 --- a/Source/WTF/WTF.gypi +++ b/Source/WTF/WTF.gypi @@ -49,6 +49,7 @@ 'wtf/MD5.h', 'wtf/MainThread.h', 'wtf/MathExtras.h', + 'wtf/MemoryInstrumentation.h', 'wtf/MessageQueue.h', 'wtf/NonCopyingSort.h', 'wtf/Noncopyable.h', diff --git a/Source/WTF/WTF.pri b/Source/WTF/WTF.pri index 9e9493301..bcfb491a4 100644 --- a/Source/WTF/WTF.pri +++ b/Source/WTF/WTF.pri @@ -22,7 +22,7 @@ mac { } } -linux-*:contains(DEFINES, WTF_USE_GSTREAMER=1) { +linux-*:use?(GSTREAMER) { DEFINES += ENABLE_GLIB_SUPPORT=1 PKGCONFIG += glib-2.0 gio-2.0 } diff --git a/Source/WTF/WTF.pro b/Source/WTF/WTF.pro index 5d6a6e54f..789e49bfa 100644 --- a/Source/WTF/WTF.pro +++ b/Source/WTF/WTF.pro @@ -81,6 +81,7 @@ HEADERS += \ MathExtras.h \ MD5.h \ MediaTime.h \ + MemoryInstrumentation.h \ MessageQueue.h \ MetaAllocator.h \ MetaAllocatorHandle.h \ diff --git a/Source/WTF/WTF.vcproj/WTF.vcproj b/Source/WTF/WTF.vcproj/WTF.vcproj index 789a2546d..4ec3e5544 100644 --- a/Source/WTF/WTF.vcproj/WTF.vcproj +++ b/Source/WTF/WTF.vcproj/WTF.vcproj @@ -901,6 +901,10 @@ >
</File>
<File
+ RelativePath="..\wtf\MemoryInstrumentation.h"
+ >
+ </File>
+ <File
RelativePath="..\wtf\MessageQueue.h"
>
</File>
diff --git a/Source/WTF/WTF.xcodeproj/project.pbxproj b/Source/WTF/WTF.xcodeproj/project.pbxproj index d236bd77c..750b61749 100644 --- a/Source/WTF/WTF.xcodeproj/project.pbxproj +++ b/Source/WTF/WTF.xcodeproj/project.pbxproj @@ -16,6 +16,7 @@ 2CCD892A15C0390200285083 /* GregorianDateTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2CCD892915C0390200285083 /* GregorianDateTime.cpp */; }; 4330F38F15745B0500AAFA8F /* URLString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4330F38E15745B0500AAFA8F /* URLString.cpp */; }; 4F0321BC156AA8D1006EBAF6 /* BitArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F0321BB156AA8D1006EBAF6 /* BitArray.h */; }; + 4F1D115415FF11BE0026E908 /* MemoryInstrumentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F1D115315FF11BE0026E908 /* MemoryInstrumentation.h */; }; 8134013815B092FD001FF0B8 /* Base64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8134013615B092FD001FF0B8 /* Base64.cpp */; }; 8134013915B092FD001FF0B8 /* Base64.h in Headers */ = {isa = PBXBuildFile; fileRef = 8134013715B092FD001FF0B8 /* Base64.h */; }; A876DBD8151816E500DADB95 /* Platform.h in Headers */ = {isa = PBXBuildFile; fileRef = A876DBD7151816E500DADB95 /* Platform.h */; }; @@ -262,6 +263,7 @@ 2CCD892915C0390200285083 /* GregorianDateTime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GregorianDateTime.cpp; sourceTree = "<group>"; }; 4330F38E15745B0500AAFA8F /* URLString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = URLString.cpp; sourceTree = "<group>"; }; 4F0321BB156AA8D1006EBAF6 /* BitArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitArray.h; sourceTree = "<group>"; }; + 4F1D115315FF11BE0026E908 /* MemoryInstrumentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryInstrumentation.h; sourceTree = "<group>"; }; 5D247B6214689B8600E78B76 /* libWTF.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libWTF.a; sourceTree = BUILT_PRODUCTS_DIR; }; 5D247B6E14689C4700E78B76 /* Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Base.xcconfig; sourceTree = "<group>"; }; 5D247B6F14689C4700E78B76 /* CompilerVersion.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = CompilerVersion.xcconfig; sourceTree = "<group>"; }; @@ -647,6 +649,7 @@ A8A472CB151A825B004123FF /* MD5.h */, CD5497AA15857D0300B5BC30 /* MediaTime.cpp */, CD5497AB15857D0300B5BC30 /* MediaTime.h */, + 4F1D115315FF11BE0026E908 /* MemoryInstrumentation.h */, A8A472CC151A825B004123FF /* MessageQueue.h */, A8A472CD151A825B004123FF /* MetaAllocator.cpp */, A8A472CE151A825B004123FF /* MetaAllocator.h */, @@ -1070,6 +1073,7 @@ A8A47480151A825B004123FF /* VMTags.h in Headers */, A8A47446151A825B004123FF /* WTFString.h in Headers */, A8A47487151A825B004123FF /* WTFThreadData.h in Headers */, + 4F1D115415FF11BE0026E908 /* MemoryInstrumentation.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Source/WTF/wtf/CMakeLists.txt b/Source/WTF/wtf/CMakeLists.txt index 679b20e96..847807f21 100644 --- a/Source/WTF/wtf/CMakeLists.txt +++ b/Source/WTF/wtf/CMakeLists.txt @@ -217,7 +217,3 @@ ADD_DEFINITIONS(-DBUILDING_WTF) ADD_LIBRARY(${WTF_LIBRARY_NAME} STATIC ${WTF_HEADERS} ${WTF_SOURCES}) TARGET_LINK_LIBRARIES(${WTF_LIBRARY_NAME} ${WTF_LIBRARIES}) SET_TARGET_PROPERTIES(${WTF_LIBRARY_NAME} PROPERTIES FOLDER "JavaScriptCore") - -IF (WTF_LINK_FLAGS) - ADD_TARGET_PROPERTIES(${WTF_LIBRARY_NAME} LINK_FLAGS "${WTF_LINK_FLAGS}") -ENDIF () diff --git a/Source/WebCore/dom/MemoryInstrumentation.h b/Source/WTF/wtf/MemoryInstrumentation.h index ac67ffff6..ac67ffff6 100644 --- a/Source/WebCore/dom/MemoryInstrumentation.h +++ b/Source/WTF/wtf/MemoryInstrumentation.h diff --git a/Source/WTF/wtf/OwnPtr.h b/Source/WTF/wtf/OwnPtr.h index 326e3fd61..fa79aa1e3 100644 --- a/Source/WTF/wtf/OwnPtr.h +++ b/Source/WTF/wtf/OwnPtr.h @@ -22,6 +22,7 @@ #define WTF_OwnPtr_h #include <wtf/Assertions.h> +#include <wtf/Noncopyable.h> #include <wtf/NullPtr.h> #include <wtf/OwnPtrCommon.h> #include <wtf/TypeTraits.h> @@ -36,6 +37,11 @@ namespace WTF { template<typename T> PassOwnPtr<T> adoptPtr(T*); template<typename T> class OwnPtr { +#if COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES) + // If rvalue references are not supported, the copy constructor is + // public so OwnPtr cannot be marked noncopyable. See note below. + WTF_MAKE_NONCOPYABLE(OwnPtr); +#endif public: typedef typename RemovePointer<T>::Type ValueType; typedef ValueType* PtrType; @@ -46,11 +52,13 @@ namespace WTF { // See comment in PassOwnPtr.h for why this takes a const reference. template<typename U> OwnPtr(const PassOwnPtr<U>& o); +#if !COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES) // This copy constructor is used implicitly by gcc when it generates // transients for assigning a PassOwnPtr<T> object to a stack-allocated // OwnPtr<T> object. It should never be called explicitly and gcc // should optimize away the constructor when generating code. OwnPtr(const OwnPtr<ValueType>&); +#endif ~OwnPtr() { deleteOwnedPtr(m_ptr); } @@ -73,10 +81,21 @@ namespace WTF { OwnPtr& operator=(std::nullptr_t) { clear(); return *this; } template<typename U> OwnPtr& operator=(const PassOwnPtr<U>&); +#if COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES) + OwnPtr(OwnPtr&&); + template<typename U> OwnPtr(OwnPtr<U>&&); + + OwnPtr& operator=(OwnPtr&&); + template<typename U> OwnPtr& operator=(OwnPtr<U>&&); +#endif + void swap(OwnPtr& o) { std::swap(m_ptr, o.m_ptr); } private: - OwnPtr& operator=(const OwnPtr<T>&); +#if !COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES) + // If rvalue references are supported, noncopyable takes care of this. + OwnPtr& operator=(const OwnPtr&); +#endif // We should never have two OwnPtrs for the same underlying object (otherwise we'll get // double-destruction), so these equality operators should never be needed. @@ -132,6 +151,38 @@ namespace WTF { return *this; } +#if COMPILER_SUPPORTS(CXX_RVALUE_REFERENCES) + template<typename T> inline OwnPtr<T>::OwnPtr(OwnPtr<T>&& o) + : m_ptr(o.leakPtr()) + { + } + + template<typename T> template<typename U> inline OwnPtr<T>::OwnPtr(OwnPtr<U>&& o) + : m_ptr(o.leakPtr()) + { + } + + template<typename T> inline OwnPtr<T>& OwnPtr<T>::operator=(OwnPtr<T>&& o) + { + PtrType ptr = m_ptr; + m_ptr = o.leakPtr(); + ASSERT(!ptr || m_ptr != ptr); + deleteOwnedPtr(ptr); + + return *this; + } + + template<typename T> template<typename U> inline OwnPtr<T>& OwnPtr<T>::operator=(OwnPtr<U>&& o) + { + PtrType ptr = m_ptr; + m_ptr = o.leakPtr(); + ASSERT(!ptr || m_ptr != ptr); + deleteOwnedPtr(ptr); + + return *this; + } +#endif + template<typename T> inline void swap(OwnPtr<T>& a, OwnPtr<T>& b) { a.swap(b); diff --git a/Source/WTF/wtf/Platform.h b/Source/WTF/wtf/Platform.h index eb0e73228..e5cc9ccb8 100644 --- a/Source/WTF/wtf/Platform.h +++ b/Source/WTF/wtf/Platform.h @@ -522,11 +522,7 @@ #endif /* OS(WINCE) && !PLATFORM(QT) */ -#if PLATFORM(QT) -#ifndef WTF_USE_ICU_UNICODE -#define WTF_USE_QT4_UNICODE 1 -#endif -#elif OS(WINCE) +#if OS(WINCE) #define WTF_USE_WCHAR_UNICODE 1 #elif PLATFORM(GTK) /* The GTK+ Unicode backend is configurable */ diff --git a/Source/WTF/wtf/PlatformEfl.cmake b/Source/WTF/wtf/PlatformEfl.cmake index eb85fb9d3..05ad8478d 100644 --- a/Source/WTF/wtf/PlatformEfl.cmake +++ b/Source/WTF/wtf/PlatformEfl.cmake @@ -15,6 +15,7 @@ LIST(APPEND WTF_LIBRARIES pthread ${GLIB_LIBRARIES} ${GLIB_GIO_LIBRARIES} + ${GLIB_GOBJECT_LIBRARIES} ${ICU_LIBRARIES} ${ICU_I18N_LIBRARIES} ${ECORE_LIBRARIES} @@ -24,15 +25,10 @@ LIST(APPEND WTF_LIBRARIES ${CMAKE_DL_LIBS} ) -LIST(APPEND WTF_LINK_FLAGS - ${ECORE_LDFLAGS} - ${ECORE_EVAS_LDFLAGS} - ${EVAS_LDFLAGS} -) - LIST(APPEND WTF_INCLUDE_DIRECTORIES ${ECORE_INCLUDE_DIRS} ${ECORE_EVAS_INCLUDE_DIRS} + ${EINA_INCLUDE_DIRS} ${EVAS_INCLUDE_DIRS} ${GLIB_INCLUDE_DIRS} ${ICU_INCLUDE_DIRS} diff --git a/Source/WebCore/CMakeLists.txt b/Source/WebCore/CMakeLists.txt index 76a115d20..e5683b362 100644 --- a/Source/WebCore/CMakeLists.txt +++ b/Source/WebCore/CMakeLists.txt @@ -1420,6 +1420,7 @@ SET(WebCore_SOURCES html/ImageDocument.cpp html/ImageInputType.cpp html/InputType.cpp + html/InputTypeNames.cpp html/LabelableElement.cpp html/LabelsNodeList.cpp html/LinkRelAttribute.cpp @@ -2015,6 +2016,9 @@ SET(WebCore_SOURCES rendering/BidiRun.cpp rendering/CounterNode.cpp rendering/EllipsisBox.cpp + rendering/ExclusionInterval.cpp + rendering/ExclusionRectangle.cpp + rendering/ExclusionShape.cpp rendering/FilterEffectRenderer.cpp rendering/FixedTableLayout.cpp rendering/FlowThreadController.cpp @@ -2678,28 +2682,6 @@ IF (WTF_USE_3D_GRAPHICS) ) ENDIF () -IF (ENABLE_REQUEST_ANIMATION_FRAME) - LIST(APPEND WebCore_IDL_FILES - dom/RequestAnimationFrameCallback.idl - ) - LIST(APPEND WebCore_SOURCES - dom/ScriptedAnimationController.cpp - ) -ENDIF () - -IF (ENABLE_VIBRATION) - LIST(APPEND WebCore_INCLUDE_DIRECTORIES - ${WEBCORE_DIR}/Modules/vibration - ) - LIST(APPEND WebCore_IDL_FILES - Modules/vibration/NavigatorVibration.idl - ) - LIST(APPEND WebCore_SOURCES - Modules/vibration/NavigatorVibration.cpp - Modules/vibration/Vibration.cpp - ) -ENDIF () - SET(WebCoreTestSupport_INCLUDE_DIRECTORIES "${WebCore_INCLUDE_DIRECTORIES}" "${WEBCORE_DIR}/testing" @@ -2737,7 +2719,6 @@ SET(IDL_ATTRIBUTES_FILE ${WEBCORE_DIR}/bindings/scripts/IDLAttributes.txt) INCLUDE(${WEBCORE_DIR}/UseJSC.cmake) SET(WebCore_LIBRARIES ${WTF_LIBRARY_NAME} ${JavaScriptCore_LIBRARY_NAME}) -SET(WebCore_LINK_FLAGS "") WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS() # ANGLE tokenizer & parser @@ -2982,11 +2963,6 @@ ENDIF () TARGET_LINK_LIBRARIES(${WebCore_LIBRARY_NAME} ${WebCore_LIBRARIES}) -IF (WebCore_LINK_FLAGS) - ADD_TARGET_PROPERTIES(${WebCore_LIBRARY_NAME} LINK_FLAGS "${WebCore_LINK_FLAGS}") - ADD_TARGET_PROPERTIES(${WebCoreTestSupport_LIBRARY_NAME} LINK_FLAGS "${WebCore_LINK_FLAGS}") -ENDIF () - IF (SHARED_CORE) SET_TARGET_PROPERTIES(${WebCore_LIBRARY_NAME} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) INSTALL(TARGETS ${WebCore_LIBRARY_NAME} DESTINATION "${LIB_INSTALL_DIR}") diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index dde6e7578..cbbb64320 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,1824 @@ +2012-09-11 Jinwoo Song <jinwoo7.song@samsung.com> + + Deploy StringBuilder::appendNumber() and StringBuilder::appendLiteral() in more places + https://bugs.webkit.org/show_bug.cgi?id=96344 + + Reviewed by Benjamin Poulain. + + Use StringBuilder::appendNumber() instead of String::number(). Also deploy + StringBuilder::appendLiteral() instead of String::append() in the surrounding code. + + * css/CSSAspectRatioValue.cpp: + (WebCore::CSSAspectRatioValue::customCssText): + * platform/graphics/gpu/LoopBlinnPathProcessor.cpp: + (WebCore): + * svg/SVGPointList.cpp: + (WebCore::SVGPointList::valueAsString): + +2012-09-11 Tony Chang <tony@chromium.org> + + Rename computeLogicalHeight to updateLogicalHeight + https://bugs.webkit.org/show_bug.cgi?id=96305 + + Reviewed by Ojan Vafai. + + computeLogicalHeight changes the value of 4 member variables of the + render box, so give it a name that makes it more clear that it is + updating member variables. + + No new tests, this is just a refactor. + + * rendering/RenderBlock.cpp: + (WebCore::RenderBlock::computeInitialRegionRangeForBlock): + (WebCore::RenderBlock::checkForPaginationLogicalHeightChange): + (WebCore::RenderBlock::layoutBlock): + (WebCore::RenderBlock::layoutPositionedObjects): + (WebCore::RenderBlock::computeBlockPreferredLogicalWidths): + * rendering/RenderBox.cpp: + (WebCore::RenderBox::updateLogicalHeight): + (WebCore::RenderBox::computePercentageLogicalHeight): + (WebCore::RenderBox::computeReplacedLogicalHeightUsing): + (WebCore::RenderBox::availableLogicalHeightUsing): + * rendering/RenderBox.h: + (RenderBox): + (WebCore::RenderBox::tryLayoutDoingPositionedMovementOnly): + * rendering/RenderDeprecatedFlexibleBox.cpp: + (WebCore::RenderDeprecatedFlexibleBox::layoutBlock): + (WebCore::RenderDeprecatedFlexibleBox::layoutHorizontalBox): + (WebCore::RenderDeprecatedFlexibleBox::layoutVerticalBox): + * rendering/RenderEmbeddedObject.cpp: + (WebCore::RenderEmbeddedObject::layout): + * rendering/RenderFlexibleBox.cpp: + (WebCore::RenderFlexibleBox::layoutBlock): + (WebCore::RenderFlexibleBox::layoutAndPlaceChildren): + * rendering/RenderFlowThread.cpp: + (WebCore::RenderFlowThread::updateLogicalHeight): + * rendering/RenderFlowThread.h: + * rendering/RenderGrid.cpp: + (WebCore::RenderGrid::layoutBlock): + * rendering/RenderHTMLCanvas.cpp: + (WebCore::RenderHTMLCanvas::canvasSizeChanged): + * rendering/RenderIFrame.cpp: + (WebCore::RenderIFrame::updateLogicalHeight): + (WebCore::RenderIFrame::layoutSeamlessly): + (WebCore::RenderIFrame::layout): + * rendering/RenderIFrame.h: + (RenderIFrame): + * rendering/RenderImage.cpp: + (WebCore::RenderImage::imageDimensionsChanged): + * rendering/RenderListBox.cpp: + (WebCore::RenderListBox::updateLogicalHeight): + * rendering/RenderListBox.h: + (RenderListBox): + * rendering/RenderMeter.cpp: + (WebCore::RenderMeter::updateLogicalHeight): + * rendering/RenderMeter.h: + (RenderMeter): + * rendering/RenderMultiColumnBlock.cpp: + (WebCore::RenderMultiColumnBlock::checkForPaginationLogicalHeightChange): + * rendering/RenderMultiColumnFlowThread.h: + * rendering/RenderMultiColumnSet.cpp: + (WebCore::RenderMultiColumnSet::updateLogicalHeight): + * rendering/RenderMultiColumnSet.h: + (RenderMultiColumnSet): + * rendering/RenderReplaced.cpp: + (WebCore::RenderReplaced::layout): + * rendering/RenderSearchField.cpp: + (WebCore::RenderSearchField::computeControlHeight): + * rendering/RenderTable.cpp: + (WebCore::RenderTable::layout): + * rendering/RenderTextControl.cpp: + (WebCore::RenderTextControl::updateLogicalHeight): + * rendering/RenderTextControl.h: + (RenderTextControl): + * rendering/RenderView.cpp: + (WebCore::RenderView::updateLogicalHeight): + * rendering/RenderView.h: + * rendering/svg/RenderSVGForeignObject.cpp: + (WebCore::RenderSVGForeignObject::updateLogicalHeight): + * rendering/svg/RenderSVGForeignObject.h: + (RenderSVGForeignObject): + * rendering/svg/RenderSVGRoot.cpp: + (WebCore::RenderSVGRoot::layout): + +2012-09-11 Zach Kuznia <zork@chromium.org> + + Fix FilterTypeZoom to properly call canvas->restore() + https://bugs.webkit.org/show_bug.cgi?id=96082 + + Reviewed by Adrienne Walker. + + Fix zoom filter to properly call canvas->restore() + + * platform/graphics/chromium/cc/CCRenderSurfaceFilters.cpp: + (WebCore::CCRenderSurfaceFilters::apply): + +2012-09-11 Sergio Villar Senin <svillar@igalia.com> + + [GTK] WebKitGtk+ crashes with non-UTF8 HTTP header names + https://bugs.webkit.org/show_bug.cgi?id=96284 + + Reviewed by Gustavo Noronha Silva. + + Non UTF-8 characters sent as part of a HTTP header name were + causing crashes as String::fromUTF8() was returning NULL for + them. Use String::fromUTF8WithLatin1Fallback() instead. + + Test: http/tests/misc/non-utf8-header-name.php + + * platform/network/soup/ResourceResponseSoup.cpp: + (WebCore::ResourceResponse::updateFromSoupMessage): + +2012-09-11 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r128175. + http://trac.webkit.org/changeset/128175 + https://bugs.webkit.org/show_bug.cgi?id=96395 + + broke hunders of tests for EFL and GTK (Requested by rakuco on + #webkit). + + * platform/network/soup/ResourceResponseSoup.cpp: + (WebCore::ResourceResponse::updateFromSoupMessage): + +2012-09-11 Raphael Kubo da Costa <rakuco@webkit.org> + + [EFL] Rewrite the EFL-related Find modules + https://bugs.webkit.org/show_bug.cgi?id=95237 + + Reviewed by Kenneth Rohde Christiansen. + + * CMakeLists.txt: Stop setting the LINK_FLAGS property now that no + port sets WebCore_LINK_FLAGS. + * PlatformEfl.cmake: Add libraries and include directories for + each Enlightenment Foundation Library used by the port. + +2012-09-11 Csaba Osztrogonác <ossy@webkit.org> + + [Qt] Unreviewed, rolling out 128054, because it broke the Windows build. + + * DerivedSources.pri: + +2012-09-11 Andras Becsi <andras.becsi@nokia.com> + + [Qt] Fix the build with libwebp + + Rubber-stamped by Tor Arne Vestbø + + The use-flag is called WEBP not LIBWEBP, so use that when appending -lwebp. + + * WebCore.pri: + +2012-09-10 Andrey Kosyakov <caseq@chromium.org> + + Web Inspector: visualize layout root in Timeline + https://bugs.webkit.org/show_bug.cgi?id=96279 + + Reviewed by Pavel Feldman. + + - pass layout root to InspectorTimelineAgent::didLayout + - show rectangles of the layout root upon hover over the Layout record; + + * inspector/InspectorInstrumentation.cpp: + (WebCore): + (WebCore::InspectorInstrumentation::didLayoutImpl): + * inspector/InspectorInstrumentation.h: + (WebCore): + (InspectorInstrumentation): + (WebCore::InspectorInstrumentation::didLayout): + * inspector/InspectorTimelineAgent.cpp: + (WebCore::InspectorTimelineAgent::didLayout): + * inspector/InspectorTimelineAgent.h: + (WebCore): + (InspectorTimelineAgent): + * inspector/TimelineRecordFactory.cpp: + (WebCore::TimelineRecordFactory::createPaintData): + (WebCore::TimelineRecordFactory::addRectData): + (WebCore): + * inspector/TimelineRecordFactory.h: + (TimelineRecordFactory): + * inspector/front-end/TimelinePanel.js: + (WebInspector.TimelinePanel.prototype._mouseMove): + * page/FrameView.cpp: + (WebCore::FrameView::layout): + +2012-09-10 Andrey Kosyakov <caseq@chromium.org> + + Web Inspector: highlight of paint rectangles is broken + https://bugs.webkit.org/show_bug.cgi?id=96276 + + Reviewed by Pavel Feldman. + + * inspector/InspectorOverlay.cpp: + (WebCore::InspectorOverlay::drawRectHighlight): Fix JS method name to match the one in InspectorOverlayPage.html + +2012-09-11 Chris Guan <chris.guan@torchmobile.com.cn> + + [Blackberry] use ReadOnlyLatin1String to save a deep copy + https://bugs.webkit.org/show_bug.cgi?id=96364 + + Reviewed by Yong Li. + Internally reviewed by Yong li. + + * platform/network/blackberry/NetworkManager.cpp: + (WebCore::NetworkManager::startJob): + +2012-09-11 Sergio Villar Senin <svillar@igalia.com> + + [GTK] WebKitGtk+ crashes with non-UTF8 HTTP header names + https://bugs.webkit.org/show_bug.cgi?id=96284 + + Reviewed by Gustavo Noronha Silva. + + Non UTF-8 characters sent as part of a HTTP header name were + causing crashes as String::fromUTF8() was returning NULL for + them. Use String::fromUTF8WithLatin1Fallback() instead. + + Test: http/tests/misc/non-utf8-header-name.php + + * platform/network/soup/ResourceResponseSoup.cpp: + (WebCore::ResourceResponse::updateFromSoupMessage): + +2012-09-11 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> + + [Qt] Add a configure step to the Qt build system + + This allows building the Qt port using just 'qmake WebKit.pro'. Using + the build-webkit script is still supported, and will add slightly more + logic to the build, such as detecting the need for clean or incremental + builds. + + Internally, the build system now uses a new variable, WEBKIT_CONFIG, for + all things related to configuring the build, such as use/have/enable flags, + and these are translated to defines in default_post. Project files should + no longer check contains(DEFINES,...) to detect features, but use the new + enable?(), use?(), and have?() functions. The no_webkit1 and no_webkit2 + options have been translated into WEBKIT_CONFIG options as well, and can + be checked using build?(). + + Reviewed by Simon Hausmann. + + * DerivedSources.pri: + * Target.pri: + * WebCore.pri: + +2012-09-11 Alexander Pavlov <apavlov@chromium.org> + + Web Inspector: Remove no-op TreeElement.prototype.didChange method + https://bugs.webkit.org/show_bug.cgi?id=96376 + + Reviewed by Yury Semikhatsky. + + * inspector/front-end/treeoutline.js: + (TreeElement.prototype.set title): + (TreeElement.prototype.set tooltip): + (TreeElement.prototype.set hasChildren): + +2012-09-11 Tommy Widenflycht <tommyw@google.com> + + MediaStream API: add RTCPeerConnection::onnegotiationneeded + https://bugs.webkit.org/show_bug.cgi?id=96097 + + Reviewed by Adam Barth. + + This patch adds the last callback to RTCPeerConnection: onnegotiationneeded. + This is called whenever the state in the RTCPeerConnection changes and that + change needs to be sent to the other side. + + Test: fast/mediastream/RTCPeerConnection-onnegotiationneeded.html + + * Modules/mediastream/RTCPeerConnection.cpp: + (WebCore::RTCPeerConnection::negotiationNeeded): + (WebCore): + * Modules/mediastream/RTCPeerConnection.h: + (RTCPeerConnection): + * Modules/mediastream/RTCPeerConnection.idl: + * dom/EventNames.h: + (WebCore): + * platform/mediastream/RTCPeerConnectionHandlerClient.h: + (RTCPeerConnectionHandlerClient): + * platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.cpp: + (WebCore::RTCPeerConnectionHandlerChromium::negotiationNeeded): + (WebCore): + * platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.h: + (RTCPeerConnectionHandlerChromium): + +2012-09-11 Kent Tamura <tkent@chromium.org> + + Sort an Xcode project file. + + * WebCore.xcodeproj/project.pbxproj: + +2012-09-11 Dan Carney <dcarney@google.com> + + Removed V8IsolatedContext + https://bugs.webkit.org/show_bug.cgi?id=95735 + + Reviewed by Adam Barth. + + Remove V8IsolatedContext and merge functionality into V8DOMWindowShell. + This brings the V8 isolated world model into closer alignment with + that of JSC. + + No new tests. No change in functionality. + + * UseV8.cmake: + * WebCore.gypi: + * bindings/scripts/CodeGeneratorV8.pm: + (GenerateImplementation): + * bindings/scripts/test/V8/V8Float64Array.cpp: + * bindings/scripts/test/V8/V8TestActiveDOMObject.cpp: + * bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp: + * bindings/scripts/test/V8/V8TestEventConstructor.cpp: + * bindings/scripts/test/V8/V8TestEventTarget.cpp: + * bindings/scripts/test/V8/V8TestException.cpp: + * bindings/scripts/test/V8/V8TestInterface.cpp: + * bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp: + * bindings/scripts/test/V8/V8TestNamedConstructor.cpp: + * bindings/scripts/test/V8/V8TestNode.cpp: + * bindings/scripts/test/V8/V8TestObj.cpp: + * bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp: + * bindings/v8/DOMData.cpp: + (WebCore::DOMData::getCurrentStore): + * bindings/v8/DOMWrapperWorld.cpp: + (WebCore::DOMWrapperWorld::ensureIsolatedWorld): + * bindings/v8/DOMWrapperWorld.h: + (DOMWrapperWorld): + * bindings/v8/ScriptController.cpp: + (WebCore::ScriptController::ScriptController): + (WebCore::ScriptController::resetIsolatedWorlds): + (WebCore::ScriptController::ensureIsolatedWorldContext): + (WebCore::ScriptController::existingWindowShellInternal): + (WebCore): + (WebCore::ScriptController::windowShell): + (WebCore::ScriptController::evaluateInIsolatedWorld): + (WebCore::ScriptController::setIsolatedWorldSecurityOrigin): + (WebCore::ScriptController::currentWorldContext): + (WebCore::ScriptController::evaluateInWorld): + (WebCore::ScriptController::collectIsolatedContexts): + * bindings/v8/ScriptController.h: + (WebCore): + (ScriptController): + (WebCore::ScriptController::existingWindowShell): + * bindings/v8/SharedPersistent.h: + (WebCore): + (WebCore::SharedPersistent::create): + (WebCore::SharedPersistent::get): + (WebCore::SharedPersistent::SharedPersistent): + (SharedPersistent): + * bindings/v8/V8Binding.cpp: + (WebCore::perContextDataForCurrentWorld): + * bindings/v8/V8DOMWindowShell.cpp: + (WebCore::setIsolatedWorldField): + (WebCore::V8DOMWindowShell::enteredIsolatedWorldContext): + (WebCore): + (WebCore::setInjectedScriptContextDebugId): + (WebCore::V8DOMWindowShell::create): + (WebCore::V8DOMWindowShell::V8DOMWindowShell): + (WebCore::V8DOMWindowShell::destroyIsolatedShell): + (WebCore::isolatedContextWeakCallback): + (WebCore::V8DOMWindowShell::disposeContext): + (WebCore::V8DOMWindowShell::initializeIfNeeded): + (WebCore::V8DOMWindowShell::createContext): + (WebCore::V8DOMWindowShell::installDOMWindow): + (WebCore::V8DOMWindowShell::updateDocumentWrapper): + (WebCore::V8DOMWindowShell::updateDocumentProperty): + (WebCore::V8DOMWindowShell::clearDocumentProperty): + (WebCore::V8DOMWindowShell::setSecurityToken): + (WebCore::V8DOMWindowShell::updateDocument): + (WebCore::V8DOMWindowShell::namedItemAdded): + (WebCore::V8DOMWindowShell::namedItemRemoved): + (WebCore::V8DOMWindowShell::updateSecurityOrigin): + (WebCore::V8DOMWindowShell::setIsolatedWorldSecurityOrigin): + * bindings/v8/V8DOMWindowShell.h: + (V8DOMWindowShell): + (WebCore::V8DOMWindowShell::world): + (WebCore::V8DOMWindowShell::isolatedWorldSecurityOrigin): + (WebCore::V8DOMWindowShell::getEntered): + * bindings/v8/V8DOMWrapper.h: + (WebCore::V8DOMWrapper::getCachedWrapper): + * bindings/v8/V8IsolatedContext.cpp: Removed. + * bindings/v8/V8IsolatedContext.h: Removed. + * bindings/v8/V8LazyEventListener.cpp: + * bindings/v8/WorldContextHandle.cpp: + (WebCore::WorldContextHandle::WorldContextHandle): + (WebCore::WorldContextHandle::adjustedContext): + * bindings/v8/custom/V8DocumentCustom.cpp: + (WebCore::toV8): + * bindings/v8/custom/V8HTMLDocumentCustom.cpp: + (WebCore::toV8): + * bindings/v8/custom/V8SVGDocumentCustom.cpp: + (WebCore::toV8): + * bindings/v8/custom/V8XMLHttpRequestConstructor.cpp: + (WebCore::V8XMLHttpRequest::constructorCallback): + +2012-09-11 Keishi Hattori <keishi@webkit.org> + + Create Localizer factory method for LocaleMac + https://bugs.webkit.org/show_bug.cgi?id=96355 + + Reviewed by Kent Tamura. + + Preparing to use Localizer instead of LocaleMac/Win/ICU + + No new tests. Covered in unit test tests/LocaleMacTest.cpp + + * platform/text/Localizer.h: + (Localizer): + * platform/text/mac/LocaleMac.mm: + (WebCore::Localizer::create): + (WebCore): + +2012-09-11 Mihnea Ovidenie <mihnea@adobe.com> + + [CSS Regions] Auto width is not working for Regions + https://bugs.webkit.org/show_bug.cgi?id=74135 + + Reviewed by Julien Chaffraix. + + It was not possible to flow content into a region having { width: auto; } since in such case, the region width was computed to 0. + Now, a region having auto width, will have its width computed following the rules for calculation of widths and margins + (http://www.w3.org/TR/CSS2/visudet.html#Computing_widths_and_margins). + For those cases in which resolving the width requires measuring of content's min/max-content values, we use the associated named flow min/max-content + values (the same for all regions with width auto in a region chain). + When a region has width:auto, the computation of width should be done using normal block/box sizing code, instead of replaced element code. + Contains code contributed by Alexandru Chiculita(achicu@adobe.com). + + Tests: fast/regions/autowidth-abspos-regionchain.html + fast/regions/autowidth-abspos.html + fast/regions/autowidth-attachedinvalidregion.html + fast/regions/autowidth-float.html + fast/regions/autowidth-inlineblock.html + fast/regions/autowidth-nonreplaced-abspos.html + fast/regions/autowidth-nonreplacedblock-normalflow.html + fast/regions/autowidth-normalflow-maxwidth.html + fast/regions/autowidth-normalflow-minmaxwidth.html + fast/regions/autowidth-normalflow-minwidth.html + fast/regions/autowidth-normalflow-vertrl.html + fast/regions/autowidth-normalflow.html + + * rendering/RenderBox.cpp: + (WebCore::RenderBox::computePositionedLogicalWidth): For positioned auto-width regions, skip the code path for replaced elements. + * rendering/RenderRegion.cpp: + (WebCore): Override min/maxPreferredLogicalWidth as they are used in the process of computing width for regions with auto width. + As this moment, a region is still a RenderReplaced element, so this code needs to be revisited when the region will become a RenderBlock. + Also, for min/max-width, we support only <length> values. We will extend support for other values in a following patch. + We only attempt to use the flowThread min/maxPreferredLogicalWidth if the region is valid (there are no circular dependencies). + (WebCore::RenderRegion::minPreferredLogicalWidth): + (WebCore::RenderRegion::maxPreferredLogicalWidth): + * rendering/RenderRegion.h: + (RenderRegion): Override isInlineBlockOrInlineTable() and shouldComputeSizeAsReplaced() to ensure that computation for width auto follows the normal + block/box sizing code. + (WebCore::RenderRegion::expandToEncompassFlowThreadContentsIfNeeded): + +2012-09-10 Ilya Tikhonovsky <loislo@chromium.org> + + Web Inspector: NMI: move MemoryInstrumentation.h to wtf + https://bugs.webkit.org/show_bug.cgi?id=96356 + + Reviewed by Yury Semikhatsky. + + It is necessary step because it helps us to remove dependency between platform and WebCore. + + * GNUmakefile.list.am: + * Target.pri: + * WebCore.gypi: + * WebCore.vcproj/WebCore.vcproj: + * WebCore.xcodeproj/project.pbxproj: + * dom/WebCoreMemoryInstrumentation.h: + * inspector/MemoryInstrumentationImpl.h: + +2012-09-10 Keishi Hattori <keishi@webkit.org> + + Move InputTypeNames to a separate file + https://bugs.webkit.org/show_bug.cgi?id=96255 + + Reviewed by Kent Tamura. + + We want to move InputTypeNames to a separate file so we can use it without including InputType.h. + + No new tests. No behavior change. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * Target.pri: + * WebCore.gypi: + * WebCore.vcproj/WebCore.vcproj: + * WebCore.xcodeproj/project.pbxproj: + * html/ButtonInputType.cpp: + * html/CheckboxInputType.cpp: + * html/ColorInputType.cpp: + * html/DateInputType.cpp: + * html/DateTimeInputType.cpp: + * html/DateTimeLocalInputType.cpp: + * html/EmailInputType.cpp: + * html/FileInputType.cpp: + * html/HiddenInputType.cpp: + * html/ImageInputType.cpp: + * html/InputType.cpp: + * html/InputType.h: + * html/InputTypeNames.cpp: Added. + (WebCore): + (InputTypeNames): + (WebCore::InputTypeNames::button): + (WebCore::InputTypeNames::checkbox): + (WebCore::InputTypeNames::color): + (WebCore::InputTypeNames::date): + (WebCore::InputTypeNames::datetime): + (WebCore::InputTypeNames::datetimelocal): + (WebCore::InputTypeNames::email): + (WebCore::InputTypeNames::file): + (WebCore::InputTypeNames::hidden): + (WebCore::InputTypeNames::image): + (WebCore::InputTypeNames::month): + (WebCore::InputTypeNames::number): + (WebCore::InputTypeNames::password): + (WebCore::InputTypeNames::radio): + (WebCore::InputTypeNames::range): + (WebCore::InputTypeNames::reset): + (WebCore::InputTypeNames::search): + (WebCore::InputTypeNames::submit): + (WebCore::InputTypeNames::telephone): + (WebCore::InputTypeNames::text): + (WebCore::InputTypeNames::time): + (WebCore::InputTypeNames::url): + (WebCore::InputTypeNames::week): + * html/InputTypeNames.h: Added. + (WebCore): + (InputTypeNames): + * html/MonthInputType.cpp: + * html/NumberInputType.cpp: + * html/PasswordInputType.cpp: + * html/RadioInputType.cpp: + * html/RangeInputType.cpp: + * html/ResetInputType.cpp: + * html/SearchInputType.cpp: + * html/SubmitInputType.cpp: + * html/TelephoneInputType.cpp: + * html/TextInputType.cpp: + * html/TimeInputType.cpp: + * html/URLInputType.cpp: + * html/WeekInputType.cpp: + * html/parser/HTMLPreloadScanner.cpp: + * platform/efl/RenderThemeEfl.cpp: + * rendering/RenderThemeChromiumCommon.cpp: + +2012-09-10 Yoshifumi Inoue <yosin@chromium.org> + + REGRESSION (r127226): Calling DateTimeEditElement::layout() in focus handler should not dispatch blur event + https://bugs.webkit.org/show_bug.cgi?id=96232 + + Reviewed by Kent Tamura. + + This patch makes DateTimeEditElement::layout() not to dispatch blur + event by removing existing fields, one of them can be focused, after + moving focus to newly created field. + + This patch affects ports which enable both ENABLE_INPUT_TYPE_TIME and + ENABLE_INPUT_TYPE_TIME_MULTIPLE_FIELDS. + + Test: fast/forms/time-multiple-fields/time-multiple-fields-state-change-on-focus-or-blur.html + + * html/shadow/DateTimeEditElement.cpp: + (WebCore::DateTimeEditBuilder::build): Changed to call resetFields(). + (WebCore::DateTimeEditElement::focusedFieldIndex): Changed to use + Document::focusedNode(). When this function is called during handling + focus event, Element::focused() isn't true. + (WebCore::DateTimeEditElement::layout): Changed to remove existing + child nodes after moving focus to newly created field. + (WebCore::DateTimeEditElement::resetFields): Renamed from resetLayout(). + This function makes m_fields vector empty. + (WebCore::DateTimeEditElement::resetLayout): Renamed to resetFields(). + We moved removing field elements and spin button to layout(). + * html/shadow/DateTimeEditElement.h: + (DateTimeEditElement): Renamed resetLayout() to resetFields(). + +2012-09-10 Keishi Hattori <keishi@webkit.org> + + Rename NumberLocalizer to Localizer + https://bugs.webkit.org/show_bug.cgi?id=96350 + + Reviewed by Kent Tamura. + + Renaming NumberLocalizer to Localizer so we can unify our localization methods into this class in the future. + + No new tests. No behavior change. + + * WebCore.gypi: + * WebCore.xcodeproj/project.pbxproj: + * platform/text/LocaleICU.cpp: + (WebCore::LocaleICU::initializeLocalizerData): + * platform/text/LocaleICU.h: + (LocaleICU): + * platform/text/LocaleWin.cpp: + (WebCore::LocaleWin::initializeLocalizerData): + * platform/text/LocaleWin.h: + (LocaleWin): + * platform/text/Localizer.cpp: Renamed from Source/WebCore/platform/text/NumberLocalizer.cpp. + (WebCore): + (WebCore::Localizer::~Localizer): + (WebCore::Localizer::setLocalizerData): + (WebCore::Localizer::convertToLocalizedNumber): + (WebCore::matches): + (WebCore::Localizer::detectSignAndGetDigitRange): + (WebCore::Localizer::matchedDecimalSymbolIndex): + (WebCore::Localizer::convertFromLocalizedNumber): + (WebCore::Localizer::localizedDecimalSeparator): + * platform/text/Localizer.h: Renamed from Source/WebCore/platform/text/NumberLocalizer.h. + (WebCore): + (Localizer): + (WebCore::Localizer::Localizer): + * platform/text/mac/LocaleMac.h: + (LocaleMac): + * platform/text/mac/LocaleMac.mm: + (WebCore::LocaleMac::initializeLocalizerData): + +2012-09-10 Dan Bernstein <mitz@apple.com> + + Use an API symbol instead of a hardcoded string for the TIFF uniform type identifier. + + Reviewed by Mark Rowe. + + * platform/graphics/mac/ImageMac.mm: + (WebCore::BitmapImage::getTIFFRepresentation): Replaced CFSTR("public.tiff") with kUTTypeTIFF. + +2012-09-10 Gyuyoung Kim <gyuyoung.kim@samsung.com> + + [CMake] Remove duplicated file in CMakeLists.txt + https://bugs.webkit.org/show_bug.cgi?id=96346 + + Reviewed by Benjamin Poulain. + + * CMakeLists.txt: Remove duplicated files. + +2012-09-10 Joanmarie Diggs <jdiggs@igalia.com> + + Properly expose <legend> elements to ATs + https://bugs.webkit.org/show_bug.cgi?id=84137 + + Reviewed by Chris Fleizach. + + Created a new WebCore Accessibility Role, LegendRole. Used it to map to + the expected platform role, ATK_ROLE_LABEL. Also established the needed + AtkRelation pair, label-for/labelled-by between the legend and fieldset. + + No new test needed - Existing legend.html test is now unskipped for Gtk. + + * accessibility/AccessibilityObject.h: Added LegendRole + * accessibility/AccessibilityRenderObject.cpp: + (WebCore::AccessibilityRenderObject::determineAccessibilityRole): Map legendTag to LegendRole + * accessibility/gtk/WebKitAccessibleWrapperAtk.cpp: + (webkitAccessibleGetName): Fieldset accessible should take its name from the associated LegendRole/label + (setAtkRelationSetFromCoreObject): Set label-for/labelled-by AtkRelation pair between fieldset and legend + (atkRole): Map LegendRole to ATK_ROLE_LABEL + * accessibility/mac/WebAccessibilityObjectWrapper.mm: + (createAccessibilityRoleMap): Map LegendRole to NSAccessibilityGroupRole + +2012-09-10 Adam Barth <abarth@chromium.org> + + [V8] Code assumes that getScriptExecutionContext can return 0 + https://bugs.webkit.org/show_bug.cgi?id=96340 + + Reviewed by Eric Seidel. + + This function can never return 0 (as long as V8 is on the stack). + There's no reason to try to handle a 0 return as an error. + + * bindings/scripts/CodeGeneratorV8.pm: + (GenerateCallWith): + (GenerateConstructorCallback): + * bindings/scripts/test/V8/V8TestInterface.cpp: + (WebCore::TestInterfaceV8Internal::supplementalMethod2Callback): + (WebCore::V8TestInterface::constructorCallback): + * bindings/scripts/test/V8/V8TestObj.cpp: + (WebCore::TestObjV8Internal::withScriptExecutionContextAttributeAttrGetter): + (WebCore::TestObjV8Internal::withScriptExecutionContextAttributeAttrSetter): + (WebCore::TestObjV8Internal::withScriptExecutionContextAttributeRaisesAttrGetter): + (WebCore::TestObjV8Internal::withScriptExecutionContextAttributeRaisesAttrSetter): + (WebCore::TestObjV8Internal::withScriptExecutionContextAndScriptStateAttributeAttrGetter): + (WebCore::TestObjV8Internal::withScriptExecutionContextAndScriptStateAttributeAttrSetter): + (WebCore::TestObjV8Internal::withScriptExecutionContextAndScriptStateAttributeRaisesAttrGetter): + (WebCore::TestObjV8Internal::withScriptExecutionContextAndScriptStateAttributeRaisesAttrSetter): + (WebCore::TestObjV8Internal::withScriptExecutionContextAndScriptStateWithSpacesAttributeAttrGetter): + (WebCore::TestObjV8Internal::withScriptExecutionContextAndScriptStateWithSpacesAttributeAttrSetter): + (WebCore::TestObjV8Internal::withScriptExecutionContextCallback): + (WebCore::TestObjV8Internal::withScriptExecutionContextAndScriptStateCallback): + (WebCore::TestObjV8Internal::withScriptExecutionContextAndScriptStateObjExceptionCallback): + (WebCore::TestObjV8Internal::withScriptExecutionContextAndScriptStateWithSpacesCallback): + * bindings/v8/custom/V8BlobCustom.cpp: + (WebCore::V8Blob::constructorCallback): + * bindings/v8/custom/V8CustomXPathNSResolver.cpp: + (WebCore::V8CustomXPathNSResolver::lookupNamespaceURI): + * bindings/v8/custom/V8MessageChannelConstructor.cpp: + (WebCore::V8MessageChannel::constructorCallback): + * bindings/v8/custom/V8MutationObserverCustom.cpp: + (WebCore::V8MutationObserver::constructorCallback): + * bindings/v8/custom/V8SQLTransactionCustom.cpp: + (WebCore::V8SQLTransaction::executeSqlCallback): + * bindings/v8/custom/V8WebSocketCustom.cpp: + (WebCore::V8WebSocket::constructorCallback): + * bindings/v8/custom/V8XMLHttpRequestConstructor.cpp: + (WebCore::V8XMLHttpRequest::constructorCallback): + * bindings/v8/custom/V8XMLHttpRequestCustom.cpp: + (WebCore::V8XMLHttpRequest::openCallback): + +2012-09-10 Adam Barth <abarth@chromium.org> + + [V8] We don't us the global handle map for anything useful---let's remove it + https://bugs.webkit.org/show_bug.cgi?id=96343 + + Reviewed by Kentaro Hara. + + The global handle map was a dream of tracking all the persistent V8 + handles in WebCore. Unfortunately, it has never been complete, and I'm + not aware of us using it for anything. This patch removes what little + is left of it. + + * bindings/v8/NPV8Object.cpp: + (WebCore::freeV8NPObject): + (WebCore::npCreateV8ScriptObject): + * bindings/v8/V8GCController.cpp: + (WebCore): + (WebCore::V8GCController::gcEpilogue): + (WebCore::V8GCController::collectGarbage): + * bindings/v8/V8GCController.h: + (V8GCController): + * bindings/v8/V8PerIsolateData.h: + (WebCore): + (V8PerIsolateData): + +2012-09-10 John Bates <jbates@google.com> + + [chromium] Fix trace event macro naming issue + https://bugs.webkit.org/show_bug.cgi?id=96337 + + Reviewed by James Robinson. + + * platform/chromium/TraceEvent.h: + +2012-09-10 Joshua Bell <jsbell@chromium.org> + + IndexedDB: IDBFactory.deleteDatabase() is slow + https://bugs.webkit.org/show_bug.cgi?id=96036 + + Reviewed by Tony Chang. + + The deleteDatabase() operation is implemented by creating a LevelDBTansaction to accumulate + the records to delete, then committing it. The transaction is a tree of key/operation pairs. + As each (key, delete) entry is added to the tree compares need to be made, potentially + requiring full key decodes. Since this temporary transaction is never read from, this is + overkill. + + Add a new "write only" transaction type that simply wraps a write batch, which provides + transaction integrity but avoids the insertion overhead and has a minimal interface. + + No new tests - no functional changes, only perf improvement. + + * Modules/indexeddb/IDBLevelDBBackingStore.cpp: + (WebCore::IDBLevelDBBackingStore::deleteDatabase): Use new write-only transaction type. + * platform/leveldb/LevelDBTransaction.cpp: + (WebCore::LevelDBWriteOnlyTransaction::create): + (WebCore): + (WebCore::LevelDBWriteOnlyTransaction::LevelDBWriteOnlyTransaction): + (WebCore::LevelDBWriteOnlyTransaction::~LevelDBWriteOnlyTransaction): + (WebCore::LevelDBWriteOnlyTransaction::remove): + (WebCore::LevelDBWriteOnlyTransaction::commit): + * platform/leveldb/LevelDBTransaction.h: + (WebCore): + (LevelDBWriteOnlyTransaction): + +2012-09-10 Adam Barth <abarth@chromium.org> + + [V8] createFunctionOnlyCallback should be in V8Callback.h with the other callback functions + https://bugs.webkit.org/show_bug.cgi?id=96336 + + Reviewed by Kentaro Hara. + + Moving this function to V8Callback.h also lets us delete + setTypeMismatchException because we no longer have a header inclusion + cycle. + + * bindings/v8/V8Callback.h: + (WebCore::createFunctionOnlyCallback): + (WebCore): + * bindings/v8/V8Utilities.cpp: + * bindings/v8/V8Utilities.h: + (WebCore): + * bindings/v8/custom/V8GeolocationCustom.cpp: + * bindings/v8/custom/V8NotificationCustom.cpp: + +2012-09-10 Beth Dakin <bdakin@apple.com> + + https://bugs.webkit.org/show_bug.cgi?id=96158 + Need API to suppress scrollbar animations + -and corresponding- + <rdar://problem/12210972> + + Reviewed by Sam Weinig. + + This patch re-names ScrollableAre::isOnActivePage() to + ScrollableArea::scrollbarsCanBeActive(). The new name better reflects + how the function is actually used, and it allows us to use the same + function for the new API that has been added to WebKit2. Now when a + client has used that API to indicate that scrollbars should be + suppressed, ScrollableArea::scrollbarsCanBeActive() will return + false. + + Page has a new member variable which indicated whether scrollbar + animations for all scrollbars associated with that page should be + suppressed. Whenever it is set to true (meaning the animations + should be suppressed), Page iterates through all of the + ScrollableAreas to tell each one to finishCurrentScrollAnimations(). + * WebCore.exp.in: + * page/Page.cpp: + (WebCore::Page::Page): + (WebCore::Page::setShouldSuppressScrollbarAnimations): + (WebCore): + * page/Page.h: + (WebCore::Page::shouldSuppressScrollbarAnimations): + (Page): + + FrameView::isOnActivePage() is renamed to scrollbarsCanBeActive () + and it will now return false if the Page says that scrollbar + animations should be suppressed. + * page/FrameView.cpp: + (WebCore::FrameView::scrollbarsCanBeActive): + + scrollbarsCanBeActive() must now be a public member of FrameView so + that it can be called from RenderLayer and RenderListBox. + * page/FrameView.h: + (FrameView): + + New ScrollAnimator function calls hideOverlayScrollers. + * platform/ScrollAnimator.h: + (WebCore::ScrollAnimator::finishCurrentScrollAnimations): + (ScrollAnimator): + * platform/ScrollableArea.cpp: + (WebCore::ScrollableArea::finishCurrentScrollAnimations): + (WebCore): + * platform/ScrollableArea.h: + (ScrollableArea): + * platform/mac/ScrollAnimatorMac.h: + (ScrollAnimatorMac): + (WebCore::ScrollAnimatorMac::finishCurrentScrollAnimations): + + Re-name. isOnActivePage() -> scrollbarsCanBeActive() + (WebCore::FrameView::setAnimatorsAreActive): + (WebCore::FrameView::notifyPageThatContentAreaWillPaint): + * platform/mac/ScrollAnimatorMac.mm: + (-[WebScrollbarPainterControllerDelegate scrollerImpPair:setContentAreaNeedsDisplayInRect:]): + (WebCore::ScrollAnimatorMac::contentAreaWillPaint): + (WebCore::ScrollAnimatorMac::mouseEnteredContentArea): + (WebCore::ScrollAnimatorMac::mouseExitedContentArea): + (WebCore::ScrollAnimatorMac::mouseMovedInContentArea): + (WebCore::ScrollAnimatorMac::mouseEnteredScrollbar): + (WebCore::ScrollAnimatorMac::mouseExitedScrollbar): + (WebCore::ScrollAnimatorMac::willStartLiveResize): + (WebCore::ScrollAnimatorMac::contentsResized): + (WebCore::ScrollAnimatorMac::willEndLiveResize): + (WebCore::ScrollAnimatorMac::contentAreaDidShow): + (WebCore::ScrollAnimatorMac::contentAreaDidHide): + (WebCore::ScrollAnimatorMac::didBeginScrollGesture): + (WebCore::ScrollAnimatorMac::didEndScrollGesture): + (WebCore::ScrollAnimatorMac::mayBeginScrollGesture): + (WebCore): + (WebCore::ScrollAnimatorMac::notifyContentAreaScrolled): + (WebCore::ScrollAnimatorMac::updateScrollerStyle): + * rendering/RenderLayer.cpp: + + RenderLayer and RenderListBox should call into FrameView's + scrollbarsCanBeActive() so that they also return false when Page:: + shouldSuppressScrollbarAnimations() is true. + (WebCore::RenderLayer::scrollbarsCanBeActive): + * rendering/RenderLayer.h: + (RenderLayer): + * rendering/RenderListBox.cpp: + (WebCore::RenderListBox::scrollbarsCanBeActive): + * rendering/RenderListBox.h: + + This is the one caller of ScrollableArea:: scrollbarsCanBeActive() + that needs to distinguish between the scrollbar-suppressing scenario + and the in-the-page-cache scenario. + * page/FocusController.cpp: + (WebCore::FocusController::setContainingWindowIsVisible): + +2012-09-10 James Robinson <jamesr@chromium.org> + + Unreviewed, rolling out r127837. + http://trac.webkit.org/changeset/127837 + https://bugs.webkit.org/show_bug.cgi?id=93898 + + Broke ScrollingCoordinator on chromium + + * WebCore.xcodeproj/project.pbxproj: + * page/scrolling/ScrollingCoordinator.cpp: + (WebCore::ScrollingCoordinator::frameViewHasSlowRepaintObjectsDidChange): + (WebCore::ScrollingCoordinator::frameViewFixedObjectsDidChange): + (WebCore::ScrollingCoordinator::frameViewRootLayerDidChange): + (WebCore::ScrollingCoordinator::hasNonLayerFixedObjects): + (WebCore::ScrollingCoordinator::updateShouldUpdateScrollLayerPositionOnMainThread): + (WebCore::ScrollingCoordinator::setForceMainThreadScrollLayerPositionUpdates): + (WebCore::ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThread): + * page/scrolling/ScrollingCoordinator.h: + (ScrollingCoordinator): + * page/scrolling/ScrollingCoordinatorNone.cpp: + (WebCore::ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThread): + * page/scrolling/ScrollingTree.cpp: + (WebCore::ScrollingTree::scrollingPeformanceLoggingEnabled): + * page/scrolling/ScrollingTree.h: + * page/scrolling/ScrollingTreeNode.cpp: + (WebCore::ScrollingTreeNode::ScrollingTreeNode): + (WebCore::ScrollingTreeNode::update): + * page/scrolling/ScrollingTreeNode.h: + (WebCore::ScrollingTreeNode::shouldUpdateScrollLayerPositionOnMainThread): + (ScrollingTreeNode): + * page/scrolling/ScrollingTreeState.cpp: + (WebCore::ScrollingTreeState::ScrollingTreeState): + (WebCore::ScrollingTreeState::setShouldUpdateScrollLayerPositionOnMainThread): + * page/scrolling/ScrollingTreeState.h: + (WebCore::ScrollingTreeState::shouldUpdateScrollLayerPositionOnMainThread): + (ScrollingTreeState): + * page/scrolling/chromium/ScrollingCoordinatorChromium.cpp: + (WebCore::ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThread): + * page/scrolling/mac/ScrollingTreeMac.mm: + (WebCore::ScrollingTree::updateDebugRootLayer): + * page/scrolling/mac/ScrollingTreeNodeMac.mm: + (WebCore::ScrollingTreeNodeMac::update): + (WebCore::ScrollingTreeNodeMac::scrollPosition): + (WebCore::ScrollingTreeNodeMac::setScrollPosition): + (WebCore::ScrollingTreeNodeMac::setScrollPositionWithoutContentEdgeConstraints): + (WebCore::ScrollingTreeNodeMac::setScrollLayerPosition): + +2012-09-10 Philip Rogers <pdr@google.com> + + Remove unnecessary codepaths in SMILTimeContainer::updateAnimations + https://bugs.webkit.org/show_bug.cgi?id=96224 + + Reviewed by Nikolas Zimmermann. + + This change removes two sources of unnecessary code in + SMILTimeContainer::updateAnimations: + 1) After r117711 we now accumulate the result of multiple + animations into the first _contributing_ animation + element. As a result it is no longer necessary to + track both which elements are contributing AND which elements + we are storing results into. Both cases are now handled + together with resultsElements. + + 2) r32044 added a second sort of the animation elements + in order to process animateTransform last. This change + was added 4 years ago, before we correctly handled <use> + and the instance tree, and I think the extra sort is no + longer necessary. A test has been added to ensure this + is the case. + + This change also does a minor cleanup of resultsElements. Previously, + we added animation elements to resultsElements and then removed them + if the animation element did not contribute. After this change, we + only add to resultsElements (no more add-then-remove). + + Test: svg/animations/use-animate-transform-and-position.html + + * svg/animation/SMILTimeContainer.cpp: + (WebCore::SMILTimeContainer::sortByPriority): + (WebCore::SMILTimeContainer::updateAnimations): + +2012-09-10 Ojan Vafai <ojan@chromium.org> + + Rename box-sizing applying methods to be more clear about just applying box-sizing. + https://bugs.webkit.org/show_bug.cgi?id=96319 + + Reviewed by Tony Chang. + + This is strictly a rename. No logic or web-exposed changes. + + * rendering/AutoTableLayout.cpp: + (WebCore::AutoTableLayout::recalcColumn): + * rendering/FixedTableLayout.cpp: + (WebCore::FixedTableLayout::calcWidthArray): + * rendering/RenderBlock.cpp: + (WebCore::RenderBlock::computePreferredLogicalWidths): + * rendering/RenderBox.cpp: + (WebCore::RenderBox::adjustBorderBoxLogicalWidthForBoxSizing): + (WebCore::RenderBox::adjustBorderBoxLogicalHeightForBoxSizing): + (WebCore::RenderBox::adjustContentBoxLogicalWidthForBoxSizing): + (WebCore::RenderBox::adjustContentBoxLogicalHeightForBoxSizing): + (WebCore::RenderBox::perpendicularContainingBlockLogicalHeight): + (WebCore::RenderBox::computeLogicalWidthInRegionUsing): + (WebCore::RenderBox::computeLogicalHeightUsing): + (WebCore::RenderBox::computeLogicalClientHeight): + (WebCore::RenderBox::computePercentageLogicalHeight): + (WebCore::RenderBox::computeReplacedLogicalWidthUsing): + (WebCore::RenderBox::computeReplacedLogicalHeightUsing): + (WebCore::RenderBox::availableLogicalHeightUsing): + (WebCore::RenderBox::computePositionedLogicalWidthUsing): + (WebCore::RenderBox::computePositionedLogicalHeightUsing): + * rendering/RenderBox.h: + (RenderBox): + * rendering/RenderDeprecatedFlexibleBox.cpp: + (WebCore::RenderDeprecatedFlexibleBox::computePreferredLogicalWidths): + * rendering/RenderFileUploadControl.cpp: + (WebCore::RenderFileUploadControl::computePreferredLogicalWidths): + * rendering/RenderFlexibleBox.cpp: + (WebCore::RenderFlexibleBox::computePreferredLogicalWidths): + (WebCore::RenderFlexibleBox::computeMainAxisExtentForChild): + * rendering/RenderListBox.cpp: + (WebCore::RenderListBox::computePreferredLogicalWidths): + * rendering/RenderMenuList.cpp: + (WebCore::RenderMenuList::computePreferredLogicalWidths): + * rendering/RenderSlider.cpp: + (WebCore::RenderSlider::computePreferredLogicalWidths): + * rendering/RenderTextControl.cpp: + (WebCore::RenderTextControl::computePreferredLogicalWidths): + +2012-09-10 Jer Noble <jer.noble@apple.com> + + Unreviewed; rolling out r128081. + http://trac.webkit.org/changeset/128081 + https://bugs.webkit.org/show_bug.cgi?id=96134 + + New test http/tests/media/video-donottrack.html fails to run on Apple test bots. + + * html/HTMLMediaElement.cpp: + * html/HTMLMediaElement.h: + (HTMLMediaElement): + * loader/FrameLoaderClient.h: + * platform/graphics/MediaPlayer.h: + (MediaPlayer): + * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm: + (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL): + +2012-09-10 Dimitri Glazkov <dglazkov@chromium.org> + + Reduce the number of treeScope queries when matching rules. + https://bugs.webkit.org/show_bug.cgi?id=96315 + + Reviewed by Eric Seidel. + + In the worst case, treeScope() requires a HashMap lookup, which could be slow. Since the value is always the same for the element, + we can just ask for it once. + + No new tests, no change in behavior. + + * css/StyleResolver.cpp: + (WebCore::StyleResolver::collectMatchingRulesForList): Moved the call to treeScope out of the loop. + +2012-09-10 Adam Barth <abarth@chromium.org> + + [V8] V8PerIsolateData::m_toStringTemplate leaks memory + https://bugs.webkit.org/show_bug.cgi?id=96322 + + Reviewed by Kentaro Hara. + + We never call Dispose to balance the call to v8::Persistent::New. This + patch uses ScopedPersistent to call Dispose automatically. + + * bindings/v8/V8PerIsolateData.cpp: + (WebCore::V8PerIsolateData::toStringTemplate): + - I've changed this function to return a new local handle in case + anyone is trying to hold on to these handles during shutdown. + * bindings/v8/V8PerIsolateData.h: + (V8PerIsolateData): + +2012-09-10 Adam Barth <abarth@chromium.org> + + [V8] V8LazyEventListener::prepareListenerObject uses inefficient string operations + https://bugs.webkit.org/show_bug.cgi?id=96324 + + Reviewed by Kentaro Hara. + + Previously, this code called String::append several times, which + mallocs a new string buffer each time. This patch switches this code to + use operator+, which uses StringAppend to optimize these operations + down to a single malloc. + + * bindings/v8/V8LazyEventListener.cpp: + (WebCore::V8LazyEventListener::prepareListenerObject): + +2012-09-10 Adam Barth <abarth@chromium.org> + + [V8] V8AuxiliaryContext used by IDB leaks memory + https://bugs.webkit.org/show_bug.cgi?id=96317 + + Reviewed by Tony Chang. + + Before this patch, we leaked m_auxiliaryContext on V8PerIsolateData + because no one ever called Dispose to balance the call to + V8::Context::New. This patch uses ScopedPersistent to call Dispose + automatically. + + Also, I've deleted the V8AuxiliaryContext because it just reinvents + V8::Context::Scope. + + * bindings/v8/IDBBindingUtilities.cpp: + (WebCore::createIDBKeyFromSerializedValueAndKeyPath): + (WebCore::injectIDBKeyIntoSerializedValue): + * bindings/v8/V8PerIsolateData.cpp: + (WebCore::V8PerIsolateData::ensureAuxiliaryContext): + (WebCore): + * bindings/v8/V8PerIsolateData.h: + (V8PerIsolateData): + * bindings/v8/V8Utilities.cpp: + * bindings/v8/V8Utilities.h: + +2012-09-10 Adam Barth <abarth@chromium.org> + + [V8] currentDocument doesn't need to handle the case where there is no v8::Context + https://bugs.webkit.org/show_bug.cgi?id=96312 + + Reviewed by Eric Seidel. + + This function is always called while V8 is on the stack. It doesn't + need to handle this impossible error condition. + + * bindings/v8/BindingState.cpp: + (WebCore::currentDocument): + +2012-09-10 Adam Barth <abarth@chromium.org> + + [V8] Inline firstFrame and currentFrame into their unique callers + https://bugs.webkit.org/show_bug.cgi?id=96309 + + Reviewed by Eric Seidel. + + These functions have only one caller. We'd prefer not to have more + callers (because there's usually no reason to indirect through the + Frame), so we should inline them into their one caller (which is the + Chromium WebKit API). + + * bindings/js/BindingState.h: + (WebCore): + * bindings/v8/BindingState.cpp: + * bindings/v8/BindingState.h: + (WebCore): + * bindings/v8/ScriptController.cpp: + * bindings/v8/ScriptController.h: + (ScriptController): + +2012-09-10 Justin Novosad <junov@chromium.org> + + Implement canvas v5 line dash feature + https://bugs.webkit.org/show_bug.cgi?id=82560 + + Reviewed by Darin Adler. + + Adding new canvas 2d context API methods getLineDash and setLineDash, + and new attribute lineDashOffset. Implementation mostly based on + the existing webkitLineDash feature, with changes that reflect the + canvas v5 specification. This change is visible to all JS ports, + unlike webkitLineDash which is not exposed to V8. The new lineDash + and the legacy webkitLineDash features access the same rendering + context state. The JavasScriptCore binding layer was augmented to + support the sequence<float> IDL type. + + Tests: fast/canvas/canvas-lineDash-invalid.html + fast/canvas/canvas-lineDash.html + + * bindings/js/JSCanvasRenderingContext2DCustom.cpp: + (WebCore::JSCanvasRenderingContext2D::webkitLineDash): + (WebCore::JSCanvasRenderingContext2D::setWebkitLineDash): + * bindings/js/JSDOMBinding.h: + Added template specialization on float to NativeValueTraits in order to + add support for the sequence<double> IDL type to JavaScriptCore. + * html/canvas/CanvasRenderingContext2D.cpp: + (WebCore::CanvasRenderingContext2D::getLineDash): + New 2D canvas API method, returns the current line dash array + (WebCore::lineDashSequenceIsValid): + Returns true if the line dash array contains only non-negative finite + numbers. + (WebCore::CanvasRenderingContext2D::setLineDash): + New 2D canvas API method, set the line dash array. + (WebCore::CanvasRenderingContext2D::setWebkitLineDash): + Legacy implementation, does not double the new line dash array if + it contains an odd number of elements. Just accepts it as is. + (WebCore::CanvasRenderingContext2D::lineDashOffset): + Attribute getter + (WebCore::CanvasRenderingContext2D::setLineDashOffset): + Attribute setter + (WebCore::CanvasRenderingContext2D::webkitLineDashOffset): + Alias for lineDashOffset + (WebCore::CanvasRenderingContext2D::setWebkitLineDashOffset): + Alias for setLineDashOffset + (WebCore::CanvasRenderingContext2D::applyLineDash): + Sends the line dash state to the GraphicsContext + * html/canvas/CanvasRenderingContext2D.h: + (CanvasRenderingContext2D): + (State): + * html/canvas/CanvasRenderingContext2D.idl: + * platform/graphics/DashArray.h: + +2012-09-10 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r128109. + http://trac.webkit.org/changeset/128109 + https://bugs.webkit.org/show_bug.cgi?id=96326 + + broke win and lion builds (Requested by kling on #webkit). + + * WebCore.exp.in: + * dom/Element.cpp: + (WebCore::Element::createMutableAttributeData): + * dom/ElementAttributeData.cpp: + (WebCore::immutableElementAttributeDataSize): + (WebCore::ElementAttributeData::createImmutable): + (WebCore::ElementAttributeData::ElementAttributeData): + (WebCore::ElementAttributeData::~ElementAttributeData): + (WebCore::ElementAttributeData::addAttribute): + (WebCore::ElementAttributeData::removeAttribute): + (WebCore::ElementAttributeData::reportMemoryUsage): + (WebCore::ElementAttributeData::cloneDataFrom): + (WebCore::ElementAttributeData::clearAttributes): + * dom/ElementAttributeData.h: + (WebCore): + (WebCore::ElementAttributeData::create): + (ElementAttributeData): + (WebCore::ElementAttributeData::isMutable): + (WebCore::ElementAttributeData::makeMutable): + (WebCore::ElementAttributeData::length): + (WebCore::ElementAttributeData::attributeItem): + +2012-09-10 Chris Fleizach <cfleizach@apple.com> + + AccessibilityNodeObject* is not in Mac xcode file + https://bugs.webkit.org/show_bug.cgi?id=96327 + + Reviewed by Sam Weinig. + + * WebCore.xcodeproj/project.pbxproj: + +2012-09-07 Jon Lee <jonlee@apple.com> + + Update notifications to latest spec + https://bugs.webkit.org/show_bug.cgi?id=91726 + <rdar://problem/11910451> + + Reviewed by Alexey Proskuryakov. + + Among the changes: + + Addition of lang attribute + http://lists.w3.org/Archives/Public/public-web-notification/2012Jul/0025.html + + Specification of icon URL is icon instead of iconURL + http://lists.w3.org/Archives/Public/public-web-notification/2012Jul/0012.html + + Tests are not possible since at best they only verify exposure of the attributes, which isn't + terribly useful, and use of the attributes depend on the platform. + + * Modules/notifications/Notification.cpp: + (WebCore::Notification::create): Add support for reading lang, dir, and icon from option dictionary. + * Modules/notifications/Notification.h: + (Notification): Make url() and setURL(), which are used for HTML notifications, only available with + ENABLE(LEGACY_NOTIFICATIONS). + (WebCore::Notification::setIconURL): Added so that it can be set from the option dictionary. + (WebCore::Notification::lang): + (WebCore::Notification::setLang): + * Modules/notifications/Notification.idl: According to specification, dir is not exposed. + +2012-08-31 Jon Lee <jonlee@apple.com> + + The options dictionary in Notification constructor should not accept event listeners + https://bugs.webkit.org/show_bug.cgi?id=95538 + <rdar://problem/12213901> + + Reviewed by Alexey Proskuryakov. + + The latest spec only allows setting the event listeners after the notification has been created. + + Test: http/tests/notifications/events-in-dictionary.html + + * Modules/notifications/Notification.cpp: + (WebCore::Notification::create): Do not look for the event handlers in the options dictionary. + +2012-09-10 Tony Chang <tony@chromium.org> + + Rename computeLogicalWidth to updateLogicalWidth + https://bugs.webkit.org/show_bug.cgi?id=96288 + + Reviewed by Ojan Vafai. + + Also rename recomputeLogicalWidth to updateLogicalWidthAndColumnWidth. + Also rename RenderTableCell::updateLogicalWidth to RenderTableCell::setCellLogicalWidth. + + No new tests, this is just a refactor. + + * rendering/RenderBlock.cpp: + (WebCore::RenderBlock::updateLogicalWidthAndColumnWidth): + (WebCore::RenderBlock::layoutBlock): + (WebCore::RenderBlock::layoutPositionedObjects): + (WebCore::RenderBlock::insertFloatingObject): + (WebCore::RenderBlock::getClearDelta): + * rendering/RenderBlock.h: + * rendering/RenderBox.cpp: + (WebCore::RenderBox::updateLogicalWidth): + * rendering/RenderBox.h: + (RenderBox): + (WebCore::RenderBox::tryLayoutDoingPositionedMovementOnly): + * rendering/RenderDeprecatedFlexibleBox.cpp: + (WebCore::RenderDeprecatedFlexibleBox::layoutBlock): + * rendering/RenderEmbeddedObject.cpp: + (WebCore::RenderEmbeddedObject::layout): + * rendering/RenderFlexibleBox.cpp: + (WebCore::RenderFlexibleBox::layoutBlock): + * rendering/RenderFlowThread.cpp: + (WebCore::RenderFlowThread::layout): + (WebCore::RenderFlowThread::updateLogicalWidth): + * rendering/RenderFlowThread.h: + * rendering/RenderGrid.cpp: + (WebCore::RenderGrid::layoutBlock): + * rendering/RenderHTMLCanvas.cpp: + (WebCore::RenderHTMLCanvas::canvasSizeChanged): + * rendering/RenderIFrame.cpp: + (WebCore::RenderIFrame::updateLogicalWidth): + (WebCore::RenderIFrame::layoutSeamlessly): + (WebCore::RenderIFrame::layout): + * rendering/RenderIFrame.h: + (RenderIFrame): + * rendering/RenderImage.cpp: + (WebCore::RenderImage::imageDimensionsChanged): + * rendering/RenderMeter.cpp: + (WebCore::RenderMeter::updateLogicalWidth): + * rendering/RenderMeter.h: + (RenderMeter): + * rendering/RenderMultiColumnBlock.cpp: + (WebCore::RenderMultiColumnBlock::updateLogicalWidthAndColumnWidth): + * rendering/RenderMultiColumnBlock.h: + (RenderMultiColumnBlock): + * rendering/RenderMultiColumnSet.cpp: + (WebCore::RenderMultiColumnSet::updateLogicalWidth): + * rendering/RenderMultiColumnSet.h: + (RenderMultiColumnSet): + * rendering/RenderReplaced.cpp: + (WebCore::RenderReplaced::layout): + * rendering/RenderTable.cpp: + (WebCore::RenderTable::updateLogicalWidth): + (WebCore::RenderTable::layout): + * rendering/RenderTable.h: + (RenderTable): + * rendering/RenderTableCell.cpp: + (WebCore::RenderTableCell::updateLogicalWidth): + (WebCore::RenderTableCell::setCellLogicalWidth): + * rendering/RenderTableCell.h: + (RenderTableCell): + * rendering/RenderTableSection.cpp: + (WebCore::RenderTableSection::setCellLogicalWidths): + * rendering/RenderView.cpp: + (WebCore::RenderView::updateLogicalWidth): + * rendering/RenderView.h: + * rendering/svg/RenderSVGForeignObject.cpp: + (WebCore::RenderSVGForeignObject::updateLogicalWidth): + * rendering/svg/RenderSVGForeignObject.h: + (RenderSVGForeignObject): + * rendering/svg/RenderSVGRoot.cpp: + (WebCore::RenderSVGRoot::layout): + +2012-09-10 Andreas Kling <kling@webkit.org> + + ElementAttributeData: Use subclasses to manage varying object layouts. + <http://webkit.org/b/94465> + + Reviewed by Antti Koivisto. + + Add two ElementAttributeData subclasses: + + - MutableElementAttributeData + - ImmutableElementAttributeData + + The ElementAttributeData::m_isMutable bit determines which subclass to cast to when accessing + the attribute storage. Added mutableAttributeVector() and immutableAttributeArray() helpers + to ElementAttributeData (with appropriate assertions.) + + This patch removes one step of indirection in the mutable case, since the Vector<Attribute> is no + longer heap-allocated, but part of MutableElementAttributeData. + + Added a WTF::deleteOwnedPtr(ElementAttributeData*) specialization so that the appropriate subclass + destructor is called for these objects. + + * WebCore.exp.in: + * dom/Element.cpp: + (WebCore::Element::createMutableAttributeData): + * dom/ElementAttributeData.cpp: + (WebCore::ElementAttributeData::createImmutable): + (WebCore::ElementAttributeData::create): + (WebCore::ElementAttributeData::ElementAttributeData): + (WebCore::MutableElementAttributeData::MutableElementAttributeData): + (WebCore::ImmutableElementAttributeData::ImmutableElementAttributeData): + (WebCore::ImmutableElementAttributeData::~ImmutableElementAttributeData): + (WebCore::ElementAttributeData::makeMutableCopy): + (WebCore::ElementAttributeData::addAttribute): + (WebCore::ElementAttributeData::removeAttribute): + (WebCore::ElementAttributeData::reportMemoryUsage): + (WebCore::ElementAttributeData::cloneDataFrom): + (WebCore::ElementAttributeData::clearAttributes): + * dom/ElementAttributeData.h: + (ElementAttributeData): + (WebCore::ElementAttributeData::isMutable): + (ImmutableElementAttributeData): + (MutableElementAttributeData): + (WebCore::MutableElementAttributeData::MutableElementAttributeData): + (WebCore::ElementAttributeData::immutableAttributeArray): + (WebCore::ElementAttributeData::mutableAttributeVector): + (WebCore::ElementAttributeData::length): + (WebCore::ElementAttributeData::attributeItem): + +2012-09-10 Tony Chang <tony@chromium.org> + + Remove stray spaces found after :: in case statements + https://bugs.webkit.org/show_bug.cgi?id=96314 + + Reviewed by Ojan Vafai. + + New contributors keep copy/pasting this style error and it makes me sad. + Also remove the extra spaces in MediaQueryEvaluator.cpp. + + No new tests, this is just a style refactor. + + * css/CSSPrimitiveValue.cpp: + (WebCore::isValidCSSUnitTypeForDoubleConversion): + (WebCore::unitCategory): + * css/MediaQueryEvaluator.cpp: + (WebCore::MediaQueryEvaluator::MediaQueryEvaluator): + +2012-09-10 Adam Barth <abarth@webkit.org> + + [V8] setNamedHiddenWindowReference doesn't need to be a special case + https://bugs.webkit.org/show_bug.cgi?id=96198 + + Reviewed by Nate Chapin. + + Prior to this patch, the DOMWindow cached its properties on the outter + global object rather than on the Holder of the properties. (We cache + properties to prevent their DOM wrappers from being garbage collected + too early.) There doesn't seem to be any reason why DOMWindow need to + be special-cased in this regard. We can just cache the properities on + their Holders, as usual. + + * bindings/scripts/CodeGeneratorV8.pm: + (GenerateNormalAttrGetter): + * bindings/v8/V8DOMWrapper.cpp: + * bindings/v8/V8DOMWrapper.h: + (V8DOMWrapper): + * bindings/v8/custom/V8LocationCustom.cpp: + * page/Location.idl: + - Previously, Location had a custom toV8 function so that + document.location would cache its wrapper in the same place as + window.location. However, that's no longer necessary as the + DOMWindow now holds its Document in a hidden property, which + means the DOMWindow keeps the cached location property on + Document alive anyway. + +2012-09-10 Anders Carlsson <andersca@apple.com> + + Silence a warning when running update-webkit-localizable-strings + https://bugs.webkit.org/show_bug.cgi?id=96307 + + Reviewed by John Sullivan. + + Since both the blockedPluginByContentSecurityPolicyText and insecurePluginVersionText strings use exact the same wording, + use WEB_UI_STRING_KEY to indicate that they are different. + + * English.lproj/Localizable.strings: + Update the localizable strings file. + + * platform/LocalizedStrings.cpp: + (WebCore::blockedPluginByContentSecurityPolicyText): + (WebCore::insecurePluginVersionText): + +2012-09-10 Adam Barth <abarth@chromium.org> + + [V8] V8HTMLDocument::write and friends should not indirect through Frame + https://bugs.webkit.org/show_bug.cgi?id=96289 + + Reviewed by Eric Seidel. + + There is no reason why document.write and friends need to indirect + through the Frame to find the active document. This patch makes these + functions work the same as the JSC versions. + + * bindings/v8/BindingState.cpp: + * bindings/v8/BindingState.h: + - This patch removes the last callers of activeFrame, so we can + remove the function entirely. + * bindings/v8/custom/V8HTMLDocumentCustom.cpp: + (WebCore::V8HTMLDocument::writeCallback): + (WebCore::V8HTMLDocument::writelnCallback): + (WebCore::V8HTMLDocument::openCallback): + +2012-09-10 Adam Barth <abarth@chromium.org> + + [V8] Constructors try to handle errors that cannot occur + https://bugs.webkit.org/show_bug.cgi?id=96304 + + Reviewed by Kentaro Hara. + + There's no reason for constructors to indirect through the Frame. Now + that we can reliably get the Document from the v8::Context, we can just + grab it without worrying about handling error conditions related to not + being able to find the Document. + + * bindings/scripts/CodeGeneratorV8.pm: + (GenerateNamedConstructorCallback): + * bindings/scripts/test/V8/V8TestNamedConstructor.cpp: + (WebCore::V8TestNamedConstructorConstructorCallback): + * bindings/v8/custom/V8AudioContextCustom.cpp: + (WebCore::V8AudioContext::constructorCallback): + * bindings/v8/custom/V8HTMLImageElementConstructor.cpp: + (WebCore::v8HTMLImageElementConstructorCallback): + +2012-09-10 Andrey Kosyakov <caseq@chromium.org> + + Web Inspector: highlight of paint rectangles is broken + https://bugs.webkit.org/show_bug.cgi?id=96276 + + Reviewed by Vsevolod Vlasov. + + * inspector/InspectorOverlay.cpp: + (WebCore::InspectorOverlay::drawRectHighlight): Fix JS method name to match the one in InspectorOverlayPage.html + +2012-09-10 Catalin Badea <badea@adobe.com> + + webkit build for 64-bit Mac chromium + https://bugs.webkit.org/show_bug.cgi?id=95977 + + Reviewed by Eric Seidel. + + Use the correct definitions for NS types in order to fix build issues for 64-bit chromium on mac. + + * platform/chromium/PlatformSupport.h: + Remove a deprecated Carbon typedef. + * platform/graphics/FloatPoint.h: + (FloatPoint): + * platform/graphics/FloatRect.h: + (FloatRect): + * platform/graphics/FloatSize.h: + (FloatSize): + * platform/graphics/IntRect.h: + (IntRect): + +2012-09-10 Hans Muller <hmuller@adobe.com> + + [CSS Exlusions] add support for the basic shapes + https://bugs.webkit.org/show_bug.cgi?id=95490 + + Reviewed by David Hyatt. + + Initial commit of a subset of the ExclusionShape classes. + + This set of classes enables the exclusions layout code to determine how to break up a line into segments + that will fit within or around a shape, given the Y coordinates of the line's top edge and bottom edges. + The ExclusionShape class represents BasicShapes whose coordinates have been resolved to actual values. It + provides a pair of methods, getInsideIntervals() and getOutsideIntervals(), that return the line segments' + start and end X coordinates, and a method that computes the shape's bounding box. The line segments' + coordinates are represented by a Vector of ExclusionIntervals. ExclusionInterval is just a pair + of X coordinates. + + The other classes, ExclusionRectangle (and TBD ExclusionPolygon et al), are internal to the + ExclusionShape implementation. + + This is the initial version of the ExclusionShapes code and it's only being used to the limited extent WebKit + currently supports shape-inside exclusions. It will be extended to support computing a minimal + line segment's "first layout location" and other improvements, in tandem with the exclusions layout code. + + No new tests have been added since this code just replaces a provisional implementation stub. + + More information about the algorithms used by the ExclusionShapes classes can be found here: http://hansmuller-webkit.blogspot.com. + + * CMakeLists.txt: + * GNUmakefile.list.am: + * Target.pri: + * WebCore.gypi: + * WebCore.vcproj/WebCore.vcproj: + * WebCore.xcodeproj/project.pbxproj: + * rendering/ExclusionInterval.cpp: Added. + (WebCore): + (WebCore::IntervalX1Comparator::operator()): + Compare x1 ExclusionInterval fields. + (WebCore::ExclusionInterval::intersect): + Compute the intersection of this interval with another interval. Unlike merge/subtract, + the result is always a single interval. + (WebCore::sortExclusionIntervals): + Sort a vector of intervals by their x1 (start) field. + (WebCore::mergeExclusionIntervals): + Union of two vectors of intervals. + (WebCore::intersectExclusionIntervals): + Intersecion of two vectors of intervals. + (WebCore::subtractExclusionIntervals): + Difference of two vectors of intervals. + + * rendering/ExclusionInterval.h: Added. + Represents the actual start and end coordinates of a horizontal line segment. + (WebCore): + (ExclusionInterval): + (WebCore::ExclusionInterval::ExclusionInterval): + + * rendering/ExclusionRectangle.cpp: Added. + (WebCore): + (WebCore::ellipseXIntercept): + (WebCore::ExclusionRectangle::getOutsideIntervals): + (WebCore::ExclusionRectangle::getInsideIntervals): + + * rendering/ExclusionRectangle.h: Added. + A subclass of ExclusionShape used to represent rounded rectangles, circles, and ellipses. + (WebCore): + (ExclusionRectangle) + (WebCore::ExclusionRectangle::ExclusionRectangle): + (WebCore::ExclusionRectangle::shapeBoundingBox): + + * rendering/ExclusionShape.cpp: Added. + (WebCore): + (WebCore::createExclusionRectangle): + (WebCore::createExclusionCircle): + (WebCore::createExclusionEllipse): + (WebCore::Exclusionhape::createExclusionShape): + Creates an ExclusionShape given a BasicShape and the width/height of a border box. Currently rounded + rectangles, circles, and ellipses are supported. Support for polygons will be included in the + next patch. + + * rendering/ExclusionShape.h: Added. + The rest of the exclusions implementation will only depend on the definitions included by this file: ExclusionShape, + and ExclusionInterval. ExclusionShape subclasses define shape-specific implementations of the methods that compute the + horizontal intervals that fit within or around a specific shape, a shape's bounding box, and - in future + revisions - other operations required by the exclusions implementation, like computing the first possible + layout location within a shape. ExclusionShapes are created for BasicShape objects as needed, using the + createExclusionShape() method. + (WebCore): + (ExclusionShape): + (WebCore::ExclusionShape::~ExclusionShape): + + * rendering/WrapShapeInfo.cpp: + (WebCore::WrapShapeInfo::computeShapeSize): + Create an ExclusionShape for the RenderBlock's BasicShape. + (WebCore::WrapShapeInfo::computeSegmentsForLine): + Use ExclusionShape::getInsideIntervals() to compute the shape-inside intervals within which a line will fit. + + * rendering/WrapShapeInfo.h: + (WebCore::WrapShapeInfo::shapeTop): + Removed - no longer used. + (WrapShapeInfo): + (WebCore::WrapShapeInfo::lineState): + Use the ExclusionShape's bounding box to compute lineState. + +2012-09-07 Jer Noble <jer.noble@apple.com> + + <audio> and <video> should send Do Not Track when appropriate + https://bugs.webkit.org/show_bug.cgi?id=96134 + + Reviewed by Eric Carlson. + + Add a FrameLoaderClient function to determine whether the DNT header should be sent, + and plumb that new function down into the MediaPlayerPrivateAVFoundationObjC class. + + Test: http/tests/media/video-donottrack.html + + * html/HTMLMediaElement.cpp: + (WebCore::HTMLMediaElement::mediaPlayerShouldSendDoNotTrackHTTPHeader): + Pass the question on through to the FrameLoaderClient. + * html/HTMLMediaElement.h: + * loader/FrameLoaderClient.h: + (WebCore::FrameLoaderClient::shouldSendDoNotTrackHTTPHeader): + Call through to the implementation in WebKit or WebKit2. + * platform/graphics/MediaPlayer.h: + (WebCore::MediaPlayerClient::mediaPlayerShouldSendDoNotTrackHTTPHeader): + Pass the question on to the HTMLMediaElement. + * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm: + (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL): + If we should send the DNT header, add it to the header options array + when creating the AVAsset. + +2012-08-31 Jon Lee <jonlee@apple.com> + + The options dictionary in Notification constructor should not accept event listeners + https://bugs.webkit.org/show_bug.cgi?id=95538 + <rdar://problem/12213901> + + Reviewed by Alexey Proskuryakov. + + The latest spec only allows setting the event listeners after the notification has been created. + + Test: http/tests/notifications/events-in-dictionary.html + + * Modules/notifications/Notification.cpp: + (WebCore::Notification::create): Do not look for the event handlers in the options dictionary. + +2012-09-04 Robert Hogan <robert@webkit.org> + + CSS 2.1 failure: content-counter-010.htm fails + https://bugs.webkit.org/show_bug.cgi?id=81447 + + Reviewed by Alexey Proskuryakov. + + Test: fast/css/content-counter-010.htm + + Per http://lists.w3.org/Archives/Public/public-css-testsuite/2010Nov/0064.html, the correct rendering of + 7000 to 7999 in Armenian changed in Nov 2010. Update implementation to match the revised spec. + + * rendering/RenderListMarker.cpp: + (WebCore::toArmenianUnder10000): + +2012-09-10 Thiago Marcos P. Santos <thiago.santos@intel.com> + + Font value should be parsed as a individual property + https://bugs.webkit.org/show_bug.cgi?id=96271 + + Reviewed by Eric Seidel. + + Parsing the font value as an individual CSS property instead of a style + body should make it significantly more effective and will not + validate something like ctx.font = "25px serif; background: green". + + Updated canvas/philip/tests/2d.text.font.parse.invalid.html to cover + this use case. + + * html/canvas/CanvasRenderingContext2D.cpp: + (WebCore::CanvasRenderingContext2D::setFont): + +2012-09-10 Silvia Pfeiffer <silviapf@chromium.org> + + [Chromium] Handle smaller sizes of media elements in media controls. + https://bugs.webkit.org/show_bug.cgi?id=89344 + + Reviewed by Eric Carlson. + + The redesign of the Chrome video controls calls for successive removal of individual + elements in the Chrome video and audio controls as the element becomes smaller in width. + It also requires decreasing padding on the enclosure element of videos. + + This patch introduces a layout() function into the MediaControlRootElementChromium to + react to any changes of the media controls width and appropriately hide/show the + interactive elements and apply the correct padding on video elements. + + Tests: platform/chromium/media/controls-audio-sizes.html + platform/chromium/media/controls-video-sizes-padding.html + platform/chromium/media/controls-video-sizes.html + + * html/shadow/MediaControlRootElementChromium.cpp: + (WebCore): + (RenderMediaControlPanelEnclosureElement): + Introduce a renderer for the MediaControlPanelEnclosureElement in which to deal with the layout changes. + Following the pattern in MediaControlElements.cpp . + (WebCore::RenderMediaControlPanelEnclosureElement::RenderMediaControlPanelEnclosureElement): + Definition of the new RenderMediaControlPanelEnclosureElement class. + (WebCore::RenderMediaControlPanelEnclosureElement::layout): + Definition of the layout() function for the renderer. This does most of the actual work. + (WebCore::MediaControlPanelEnclosureElement::createRenderer): + Create the renderer for the MediaControlPanelEnclosureElement. + (WebCore::MediaControlPanelEnclosureElement::updatePadding): + Update padding as part of the MediaControlPanelEnclosureElement functions. + (WebCore::MediaControlRootElementChromium::MediaControlRootElementChromium): + Add a class property to store whether the duration and current time display are hidden. + (WebCore::MediaControlRootElementChromium::reset): + Include the hiding/showing of the timeline into the updateTimeDisplay() function to reduce code duplication. + (WebCore::MediaControlRootElementChromium::playbackStarted): + Include the hiding/showing of the timeline and time display into the updateTimeDisplay() function + to reduce code duplication. + (WebCore::MediaControlRootElementChromium::playbackProgressed): + Include the hiding/showing of the timeline into the updateTimeDisplay() function to reduce code duplication. + (WebCore::MediaControlRootElementChromium::playbackStopped): + Include the hiding/showing of the timeline into the updateTimeDisplay() function to reduce code duplication. + (WebCore::MediaControlRootElementChromium::updateTimeDisplay): + Only show time display if not hidden. Add timeline update here to reduce code duplication/ + (WebCore::MediaControlRootElementChromium::hideVolumeSlider): + New function to allow layout() function to hide the volume slider. + (WebCore::MediaControlRootElementChromium::showTimeDisplay): + New function to allow layout() function to show the time display. + (WebCore::MediaControlRootElementChromium::hideTimeDisplay): + New function to allow layout() function to hide the time display. + (WebCore::MediaControlRootElementChromium::showMuteButton): + New function to allow layout() function to show the mute button. + (WebCore::MediaControlRootElementChromium::hideMuteButton): + New function to allow layout() function to hide the mute button. + (WebCore::MediaControlRootElementChromium::showFullscreenButton): + New function to allow layout() function to show the fullscreen button. + (WebCore::MediaControlRootElementChromium::hideFullscreenButton): + New function to allow layout() function to hide the fullscreen button. + (WebCore::MediaControlRootElementChromium::showTimeline): + New function to allow layout() function to show the timeline. + (WebCore::MediaControlRootElementChromium::hideTimeline): + New function to allow layout() function to hide the timeline. + + * html/shadow/MediaControlRootElementChromium.h: + (MediaControlPanelEnclosureElement): + Add a createRender() and a updatePadding() function to the MediaControlPanelEnclosureElement class. + (MediaControlRootElementChromium): + Add hide/show functions for volume slider, time display, mute button, fullscreen button and timeline. + Add a class property to store whether the duration and current time display are hidden. + +2012-09-10 Joanmarie Diggs <jdiggs@igalia.com> + + [GTK][a11y] editing/pasteboard/paste-blockquote-into-blockquote-4.html crashes + https://bugs.webkit.org/show_bug.cgi?id=96199 + + Reviewed by Martin Robinson. + + Added sanity check to correct erroneous assumption that there will + always be a child object. + + No new tests as the bug crashes two existing Layout Tests which should + no longer crash as a result of this fix. + + * accessibility/gtk/AccessibilityObjectAtk.cpp: + (WebCore::AccessibilityObject::accessibilityPlatformIncludesObject): + 2012-09-10 Mike West <mkwst@chromium.org> Clarify the cause of console warnings generated by "cross-origin" access to sandboxed iframes. diff --git a/Source/WebCore/DerivedSources.pri b/Source/WebCore/DerivedSources.pri index 011d7f470..a269e0573 100644 --- a/Source/WebCore/DerivedSources.pri +++ b/Source/WebCore/DerivedSources.pri @@ -26,7 +26,7 @@ XLINK_NAMES = $$PWD/svg/xlinkattrs.in CSSBISON = $$PWD/css/CSSGrammar.y -contains(DEFINES, ENABLE_XSLT=1) { +enable?(XSLT) { XMLVIEWER_CSS = $$PWD/xml/XMLViewer.css XMLVIEWER_JS = $$PWD/xml/XMLViewer.js } @@ -69,7 +69,7 @@ ARRAY_BUFFER_VIEW_CUSTOM_SCRIPT_SOURCE = $$PWD/bindings/v8/custom/V8ArrayBufferV XPATHBISON = $$PWD/xml/XPathGrammar.y -contains(DEFINES, ENABLE_SVG=1) { +enable?(SVG) { EXTRACSSPROPERTIES += $$PWD/css/SVGCSSPropertyNames.in EXTRACSSVALUES += $$PWD/css/SVGCSSValueKeywords.in } @@ -479,7 +479,7 @@ IDL_BINDINGS += \ $$PWD/xml/XPathEvaluator.idl \ $$PWD/xml/XSLTProcessor.idl -contains(DEFINES, ENABLE_SVG=1) { +enable?(SVG) { IDL_BINDINGS += \ $$PWD/svg/SVGAElement.idl \ $$PWD/svg/SVGAltGlyphDefElement.idl \ @@ -626,14 +626,14 @@ contains(DEFINES, ENABLE_SVG=1) { $$PWD/svg/SVGZoomEvent.idl } -contains(DEFINES, ENABLE_GAMEPAD=1) { +enable?(GAMEPAD) { IDL_BINDINGS += \ $$PWD/Modules/gamepad/Gamepad.idl \ $$PWD/Modules/gamepad/GamepadList.idl \ $$PWD/Modules/gamepad/NavigatorGamepad.idl } -contains(DEFINES, ENABLE_VIDEO_TRACK=1) { +enable?(VIDEO_TRACK) { IDL_BINDINGS += \ $$PWD/html/track/TextTrack.idl \ $$PWD/html/track/TextTrackCue.idl \ @@ -642,7 +642,7 @@ contains(DEFINES, ENABLE_VIDEO_TRACK=1) { $$PWD/html/track/TrackEvent.idl \ } -contains(DEFINES, ENABLE_MEDIA_SOURCE=1) { +enable?(MEDIA_SOURCE) { IDL_BINDINGS += \ $$PWD/Modules/mediasource/MediaSource.idl \ $$PWD/Modules/mediasource/SourceBuffer.idl \ @@ -653,7 +653,7 @@ mathmlnames.output = MathMLNames.cpp mathmlnames.input = MATHML_NAMES mathmlnames.depends = $$PWD/mathml/mathattrs.in mathmlnames.script = $$PWD/dom/make_names.pl -mathmlnames.commands = perl -I$$PWD/bindings/scripts $$mathmlnames.script --tags $$PWD/mathml/mathtags.in --attrs $$PWD/mathml/mathattrs.in --extraDefines \"$${DEFINES}\" --preprocessor \"$${QMAKE_MOC} -E\" --factory --wrapperFactory --outputDir ${QMAKE_FUNC_FILE_OUT_PATH} +mathmlnames.commands = perl -I$$PWD/bindings/scripts $$mathmlnames.script --tags $$PWD/mathml/mathtags.in --attrs $$PWD/mathml/mathattrs.in --extraDefines \"$${DEFINES} $$configDefines()\" --preprocessor \"$${QMAKE_MOC} -E\" --factory --wrapperFactory --outputDir ${QMAKE_FUNC_FILE_OUT_PATH} mathmlnames.extra_sources = MathMLElementFactory.cpp GENERATORS += mathmlnames @@ -662,7 +662,7 @@ svgnames.output = SVGNames.cpp svgnames.input = SVG_NAMES svgnames.depends = $$PWD/svg/svgattrs.in svgnames.script = $$PWD/dom/make_names.pl -svgnames.commands = perl -I$$PWD/bindings/scripts $$svgnames.script --tags $$PWD/svg/svgtags.in --attrs $$PWD/svg/svgattrs.in --extraDefines \"$${DEFINES}\" --preprocessor \"$${QMAKE_MOC} -E\" --factory --wrapperFactory --outputDir ${QMAKE_FUNC_FILE_OUT_PATH} +svgnames.commands = perl -I$$PWD/bindings/scripts $$svgnames.script --tags $$PWD/svg/svgtags.in --attrs $$PWD/svg/svgattrs.in --extraDefines \"$${DEFINES} $$configDefines()\" --preprocessor \"$${QMAKE_MOC} -E\" --factory --wrapperFactory --outputDir ${QMAKE_FUNC_FILE_OUT_PATH} svgnames.extra_sources = SVGElementFactory.cpp svgnames.extra_sources += JSSVGElementWrapperFactory.cpp GENERATORS += svgnames @@ -678,7 +678,7 @@ GENERATORS += xlinknames cssprops.script = $$PWD/css/makeprop.pl cssprops.output = CSSPropertyNames.cpp cssprops.input = WALDOCSSPROPS -cssprops.commands = perl -ne \"print $1\" ${QMAKE_FILE_NAME} $${EXTRACSSPROPERTIES} > ${QMAKE_FUNC_FILE_OUT_PATH}/${QMAKE_FILE_BASE}.in && cd ${QMAKE_FUNC_FILE_OUT_PATH} && perl -I$$PWD/bindings/scripts $$cssprops.script --defines \"$${FEATURE_DEFINES_JAVASCRIPT}\" --preprocessor \"$${QMAKE_MOC} -E\" ${QMAKE_FILE_NAME} && $(DEL_FILE) ${QMAKE_FILE_BASE}.in ${QMAKE_FILE_BASE}.gperf +cssprops.commands = perl -ne \"print $1\" ${QMAKE_FILE_NAME} $${EXTRACSSPROPERTIES} > ${QMAKE_FUNC_FILE_OUT_PATH}/${QMAKE_FILE_BASE}.in && cd ${QMAKE_FUNC_FILE_OUT_PATH} && perl -I$$PWD/bindings/scripts $$cssprops.script --defines \"$$javascriptFeatureDefines()\" --preprocessor \"$${QMAKE_MOC} -E\" ${QMAKE_FILE_NAME} && $(DEL_FILE) ${QMAKE_FILE_BASE}.in ${QMAKE_FILE_BASE}.gperf cssprops.depends = ${QMAKE_FILE_NAME} $${EXTRACSSPROPERTIES} $$cssprops.script GENERATORS += cssprops @@ -686,7 +686,7 @@ GENERATORS += cssprops cssvalues.script = $$PWD/css/makevalues.pl cssvalues.output = CSSValueKeywords.cpp cssvalues.input = WALDOCSSVALUES -cssvalues.commands = perl -ne \"print $1\" ${QMAKE_FILE_NAME} $$EXTRACSSVALUES > ${QMAKE_FUNC_FILE_OUT_PATH}/${QMAKE_FILE_BASE}.in && cd ${QMAKE_FUNC_FILE_OUT_PATH} && perl -I$$PWD/bindings/scripts $$cssvalues.script --defines \"$${FEATURE_DEFINES_JAVASCRIPT}\" --preprocessor \"$${QMAKE_MOC} -E\" ${QMAKE_FILE_NAME} && $(DEL_FILE) ${QMAKE_FILE_BASE}.in ${QMAKE_FILE_BASE}.gperf +cssvalues.commands = perl -ne \"print $1\" ${QMAKE_FILE_NAME} $$EXTRACSSVALUES > ${QMAKE_FUNC_FILE_OUT_PATH}/${QMAKE_FILE_BASE}.in && cd ${QMAKE_FUNC_FILE_OUT_PATH} && perl -I$$PWD/bindings/scripts $$cssvalues.script --defines \"$$javascriptFeatureDefines()\" --preprocessor \"$${QMAKE_MOC} -E\" ${QMAKE_FILE_NAME} && $(DEL_FILE) ${QMAKE_FILE_BASE}.in ${QMAKE_FILE_BASE}.gperf cssvalues.depends = ${QMAKE_FILE_NAME} $${EXTRACSSVALUES} $$cssvalues.script cssvalues.clean = ${QMAKE_FILE_OUT} ${QMAKE_FUNC_FILE_OUT_PATH}/${QMAKE_FILE_BASE}.h GENERATORS += cssvalues @@ -700,7 +700,6 @@ IDL_ATTRIBUTES_FILE = $$PWD/bindings/scripts/IDLAttributes.txt preprocessIdls.input = IDL_ATTRIBUTES_FILE preprocessIdls.script = $$PREPROCESS_IDLS_SCRIPT # FIXME : We need to use only perl at some point. -EOC = $$escape_expand(\\n\\t) win_cmd_shell: preprocessIdls.commands = type nul > $$IDL_FILES_TMP $$EOC else: preprocessIdls.commands = cat /dev/null > $$IDL_FILES_TMP $$EOC for(binding, IDL_BINDINGS) { @@ -709,7 +708,7 @@ for(binding, IDL_BINDINGS) { preprocessIdls.commands += echo $$binding>> $$IDL_FILES_TMP$$EOC } preprocessIdls.commands += perl -I$$PWD/bindings/scripts $$preprocessIdls.script \ - --defines \"$${FEATURE_DEFINES_JAVASCRIPT}\" \ + --defines \"$$javascriptFeatureDefines()\" \ --idlFilesList $$IDL_FILES_TMP \ --supplementalDependencyFile ${QMAKE_FUNC_FILE_OUT_PATH}/$$SUPPLEMENTAL_DEPENDENCY_FILE \ --idlAttributesFile $${IDL_ATTRIBUTES_FILE} \ @@ -719,44 +718,38 @@ preprocessIdls.add_output_to_sources = false preprocessIdls.depends = $$PWD/bindings/scripts/IDLParser.pm $$IDL_BINDINGS GENERATORS += preprocessIdls -win32 { - env_export = set -} else { - env_export = export -} - # GENERATOR 1: Generate .h and .cpp from IDLs generateBindings.input = IDL_BINDINGS generateBindings.script = $$PWD/bindings/scripts/generate-bindings.pl -generateBindings.commands = $$env_export \"SOURCE_ROOT=$$toSystemPath($$PWD)\" && perl -I$$PWD/bindings/scripts $$generateBindings.script \ - --defines \"$${FEATURE_DEFINES_JAVASCRIPT}\" \ +generateBindings.commands = perl -I$$PWD/bindings/scripts $$generateBindings.script \ + --defines \"$$javascriptFeatureDefines()\" \ --generator JS \ - --include Modules/filesystem \ - --include Modules/geolocation \ - --include Modules/indexeddb \ - --include Modules/mediasource \ - --include Modules/notifications \ - --include Modules/quota \ - --include Modules/webaudio \ - --include Modules/webdatabase \ - --include Modules/websockets \ - --include css \ - --include dom \ - --include editing \ - --include fileapi \ - --include html \ - --include html/canvas \ - --include html/shadow \ - --include html/track \ - --include inspector \ - --include loader/appcache \ - --include page \ - --include plugins \ - --include storage \ - --include svg \ - --include testing \ - --include workers \ - --include xml \ + --include $$PWD/Modules/filesystem \ + --include $$PWD/Modules/geolocation \ + --include $$PWD/Modules/indexeddb \ + --include $$PWD/Modules/mediasource \ + --include $$PWD/Modules/notifications \ + --include $$PWD/Modules/quota \ + --include $$PWD/Modules/webaudio \ + --include $$PWD/Modules/webdatabase \ + --include $$PWD/Modules/websockets \ + --include $$PWD/css \ + --include $$PWD/dom \ + --include $$PWD/editing \ + --include $$PWD/fileapi \ + --include $$PWD/html \ + --include $$PWD/html/canvas \ + --include $$PWD/html/shadow \ + --include $$PWD/html/track \ + --include $$PWD/inspector \ + --include $$PWD/loader/appcache \ + --include $$PWD/page \ + --include $$PWD/plugins \ + --include $$PWD/storage \ + --include $$PWD/svg \ + --include $$PWD/testing \ + --include $$PWD/workers \ + --include $$PWD/xml \ --outputDir ${QMAKE_FUNC_FILE_OUT_PATH} \ --supplementalDependencyFile ${QMAKE_FUNC_FILE_OUT_PATH}/$$SUPPLEMENTAL_DEPENDENCY_FILE \ --preprocessor \"$${QMAKE_MOC} -E\" ${QMAKE_FILE_NAME} @@ -838,7 +831,7 @@ htmlnames.output = HTMLNames.cpp htmlnames.input = HTML_NAMES htmlnames.script = $$PWD/dom/make_names.pl htmlnames.depends = $$PWD/html/HTMLAttributeNames.in -htmlnames.commands = perl -I$$PWD/bindings/scripts $$htmlnames.script --tags $$PWD/html/HTMLTagNames.in --attrs $$PWD/html/HTMLAttributeNames.in --extraDefines \"$${DEFINES}\" --preprocessor \"$${QMAKE_MOC} -E\" --factory --wrapperFactory --outputDir ${QMAKE_FUNC_FILE_OUT_PATH} +htmlnames.commands = perl -I$$PWD/bindings/scripts $$htmlnames.script --tags $$PWD/html/HTMLTagNames.in --attrs $$PWD/html/HTMLAttributeNames.in --extraDefines \"$${DEFINES} $$configDefines()\" --preprocessor \"$${QMAKE_MOC} -E\" --factory --wrapperFactory --outputDir ${QMAKE_FUNC_FILE_OUT_PATH} htmlnames.extra_sources = HTMLElementFactory.cpp htmlnames.extra_sources += JSHTMLElementWrapperFactory.cpp GENERATORS += htmlnames @@ -908,7 +901,7 @@ colordata.clean = ${QMAKE_FILE_OUT} colordata.depends = $$PWD/make-hash-tools.pl GENERATORS += colordata -contains(DEFINES, ENABLE_XSLT=1) { +enable?(XSLT) { # GENERATOR 8-C: xmlviewercss.output = XMLViewerCSS.h xmlviewercss.input = XMLVIEWER_CSS @@ -955,4 +948,3 @@ webkitversion.commands = perl $$webkitversion.script --config $$PWD/../WebKit/ma webkitversion.clean = ${QMAKE_FUNC_FILE_OUT_PATH}/WebKitVersion.h webkitversion.add_output_to_sources = false GENERATORS += webkitversion - diff --git a/Source/WebCore/English.lproj/Localizable.strings b/Source/WebCore/English.lproj/Localizable.strings Binary files differindex b5e54ea33..12c96b480 100644 --- a/Source/WebCore/English.lproj/Localizable.strings +++ b/Source/WebCore/English.lproj/Localizable.strings diff --git a/Source/WebCore/English.lproj/localizedStrings.js b/Source/WebCore/English.lproj/localizedStrings.js index cf4b784d3..66938a35d 100644 --- a/Source/WebCore/English.lproj/localizedStrings.js +++ b/Source/WebCore/English.lproj/localizedStrings.js @@ -731,7 +731,7 @@ localizedStrings["Override Geolocation"] = "Override Geolocation"; localizedStrings["Geolocation Position"] = "Geolocation Position"; localizedStrings["Override Device Orientation"] = "Override Device Orientation"; localizedStrings["Note"] = "Note"; -localizedStrings["Forced synchronous layout is a possible performance bottlenck."] = "Forced synchronous layout is a possible performance bottlenck."; +localizedStrings["Forced synchronous layout is a possible performance bottleneck."] = "Forced synchronous layout is a possible performance bottleneck."; localizedStrings["Styles invalidated"] = "Styles invalidated"; localizedStrings["Styles recalculation forced"] = "Styles recalculation forced"; localizedStrings["Layout invalidated"] = "Layout invalidated"; diff --git a/Source/WebCore/GNUmakefile.list.am b/Source/WebCore/GNUmakefile.list.am index df8121eff..cb547d57d 100644 --- a/Source/WebCore/GNUmakefile.list.am +++ b/Source/WebCore/GNUmakefile.list.am @@ -2808,7 +2808,6 @@ webcore_sources += \ Source/WebCore/dom/HashChangeEvent.h \ Source/WebCore/dom/KeyboardEvent.cpp \ Source/WebCore/dom/KeyboardEvent.h \ - Source/WebCore/dom/MemoryInstrumentation.h \ Source/WebCore/dom/MessageChannel.cpp \ Source/WebCore/dom/MessageChannel.h \ Source/WebCore/dom/MessageEvent.cpp \ @@ -3434,6 +3433,8 @@ webcore_sources += \ Source/WebCore/html/ImageInputType.h \ Source/WebCore/html/InputType.cpp \ Source/WebCore/html/InputType.h \ + Source/WebCore/html/InputTypeNames.cpp \ + Source/WebCore/html/InputTypeNames.h \ Source/WebCore/html/LabelableElement.cpp \ Source/WebCore/html/LabelableElement.h \ Source/WebCore/html/LabelsNodeList.cpp \ @@ -4870,6 +4871,12 @@ webcore_sources += \ Source/WebCore/rendering/CounterNode.h \ Source/WebCore/rendering/EllipsisBox.cpp \ Source/WebCore/rendering/EllipsisBox.h \ + Source/WebCore/rendering/ExclusionInterval.cpp \ + Source/WebCore/rendering/ExclusionInterval.h \ + Source/WebCore/rendering/ExclusionRectangle.cpp \ + Source/WebCore/rendering/ExclusionRectangle.h \ + Source/WebCore/rendering/ExclusionShape.cpp \ + Source/WebCore/rendering/ExclusionShape.h \ Source/WebCore/rendering/FilterEffectRenderer.cpp \ Source/WebCore/rendering/FilterEffectRenderer.h \ Source/WebCore/rendering/FixedTableLayout.cpp \ diff --git a/Source/WebCore/Modules/indexeddb/IDBLevelDBBackingStore.cpp b/Source/WebCore/Modules/indexeddb/IDBLevelDBBackingStore.cpp index 15be89610..dcdeecd00 100644 --- a/Source/WebCore/Modules/indexeddb/IDBLevelDBBackingStore.cpp +++ b/Source/WebCore/Modules/indexeddb/IDBLevelDBBackingStore.cpp @@ -372,22 +372,19 @@ static bool deleteRange(LevelDBTransaction* transaction, const Vector<char>& beg bool IDBLevelDBBackingStore::deleteDatabase(const String& name) { IDB_TRACE("IDBLevelDBBackingStore::deleteDatabase"); - RefPtr<LevelDBTransaction> transaction = LevelDBTransaction::create(m_db.get()); + OwnPtr<LevelDBWriteOnlyTransaction> transaction = LevelDBWriteOnlyTransaction::create(m_db.get()); int64_t databaseId; String version; int64_t intVersion; - if (!getIDBDatabaseMetaData(name, version, intVersion, databaseId)) { - transaction->rollback(); + if (!getIDBDatabaseMetaData(name, version, intVersion, databaseId)) return true; - } const Vector<char> startKey = DatabaseMetaDataKey::encode(databaseId, DatabaseMetaDataKey::OriginName); const Vector<char> stopKey = DatabaseMetaDataKey::encode(databaseId + 1, DatabaseMetaDataKey::OriginName); - if (!deleteRange(transaction.get(), startKey, stopKey)) { - transaction->rollback(); - return false; - } + OwnPtr<LevelDBIterator> it = m_db->createIterator(); + for (it->seek(startKey); it->isValid() && compareKeys(it->key(), stopKey) < 0; it->next()) + transaction->remove(it->key()); const Vector<char> key = DatabaseNameKey::encode(m_identifier, name); transaction->remove(key); diff --git a/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp b/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp index 6fa7c3882..da2bb5845 100644 --- a/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp +++ b/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp @@ -391,6 +391,11 @@ void RTCPeerConnection::close(ExceptionCode& ec) stop(); } +void RTCPeerConnection::negotiationNeeded() +{ + dispatchEvent(Event::create(eventNames().negotationneededEvent, false, false)); +} + void RTCPeerConnection::didGenerateIceCandidate(PassRefPtr<RTCIceCandidateDescriptor> iceCandidateDescriptor) { ASSERT(scriptExecutionContext()->isContextThread()); diff --git a/Source/WebCore/Modules/mediastream/RTCPeerConnection.h b/Source/WebCore/Modules/mediastream/RTCPeerConnection.h index 326c968c7..1615581a5 100644 --- a/Source/WebCore/Modules/mediastream/RTCPeerConnection.h +++ b/Source/WebCore/Modules/mediastream/RTCPeerConnection.h @@ -86,6 +86,7 @@ public: void close(ExceptionCode&); + DEFINE_ATTRIBUTE_EVENT_LISTENER(negotationneeded); DEFINE_ATTRIBUTE_EVENT_LISTENER(icecandidate); DEFINE_ATTRIBUTE_EVENT_LISTENER(open); DEFINE_ATTRIBUTE_EVENT_LISTENER(statechange); @@ -94,6 +95,7 @@ public: DEFINE_ATTRIBUTE_EVENT_LISTENER(icechange); // RTCPeerConnectionHandlerClient + virtual void negotiationNeeded() OVERRIDE; virtual void didGenerateIceCandidate(PassRefPtr<RTCIceCandidateDescriptor>) OVERRIDE; virtual void didChangeReadyState(ReadyState) OVERRIDE; virtual void didChangeIceState(IceState) OVERRIDE; diff --git a/Source/WebCore/Modules/mediastream/RTCPeerConnection.idl b/Source/WebCore/Modules/mediastream/RTCPeerConnection.idl index 8312ecea2..967ad4023 100644 --- a/Source/WebCore/Modules/mediastream/RTCPeerConnection.idl +++ b/Source/WebCore/Modules/mediastream/RTCPeerConnection.idl @@ -75,6 +75,7 @@ module mediastream { void close() raises(DOMException); + attribute EventListener onnegotationneeded; attribute EventListener onicecandidate; attribute EventListener onopen; attribute EventListener onstatechange; diff --git a/Source/WebCore/Modules/notifications/Notification.cpp b/Source/WebCore/Modules/notifications/Notification.cpp index 36a1c8cbb..32d8efd76 100644 --- a/Source/WebCore/Modules/notifications/Notification.cpp +++ b/Source/WebCore/Modules/notifications/Notification.cpp @@ -138,13 +138,6 @@ PassRefPtr<Notification> Notification::create(const String& title, const String& #endif #if ENABLE(NOTIFICATIONS) -static void getAndAddEventListener(const AtomicString& eventName, const char* property, const Dictionary& options, Notification* notification) -{ - RefPtr<EventListener> listener = options.getEventListener(property, notification); - if (listener) - notification->addEventListener(eventName, listener.release(), false); -} - PassRefPtr<Notification> Notification::create(ScriptExecutionContext* context, const String& title, const Dictionary& options) { RefPtr<Notification> notification(adoptRef(new Notification(context, title))); @@ -153,10 +146,15 @@ PassRefPtr<Notification> Notification::create(ScriptExecutionContext* context, c notification->setBody(argument); if (options.get("tag", argument)) notification->setTag(argument); - getAndAddEventListener(eventNames().showEvent, "onshow", options, notification.get()); - getAndAddEventListener(eventNames().closeEvent, "onclose", options, notification.get()); - getAndAddEventListener(eventNames().errorEvent, "onerror", options, notification.get()); - getAndAddEventListener(eventNames().clickEvent, "onclick", options, notification.get()); + if (options.get("lang", argument)) + notification->setLang(argument); + if (options.get("dir", argument)) + notification->setDir(argument); + if (options.get("icon", argument)) { + KURL iconURI = argument.isEmpty() ? KURL() : context->completeURL(argument); + if (!iconURI.isEmpty() && iconURI.isValid()) + notification->setIconURL(iconURI); + } notification->suspendIfNeeded(); return notification.release(); diff --git a/Source/WebCore/Modules/notifications/Notification.h b/Source/WebCore/Modules/notifications/Notification.h index 995a70032..6fce5edc8 100644 --- a/Source/WebCore/Modules/notifications/Notification.h +++ b/Source/WebCore/Modules/notifications/Notification.h @@ -86,14 +86,20 @@ public: bool isHTML() const { return m_isHTML; } void setHTML(bool isHTML) { m_isHTML = isHTML; } +#if ENABLE(LEGACY_NOTIFICATIONS) KURL url() const { return m_notificationURL; } void setURL(KURL url) { m_notificationURL = url; } - +#endif + KURL iconURL() const { return m_icon; } + void setIconURL(const KURL& url) { m_icon = url; } String title() const { return m_title; } String body() const { return m_body; } + String lang() const { return m_lang; } + void setLang(const String& lang) { m_lang = lang; } + String dir() const { return m_direction; } void setDir(const String& dir) { m_direction = dir; } @@ -174,10 +180,12 @@ private: KURL m_icon; String m_title; String m_body; - // FIXME: Deprecate HTML Notifications. +#if ENABLE(LEGACY_NOTIFICATIONS) KURL m_notificationURL; +#endif String m_direction; + String m_lang; String m_tag; enum NotificationState { diff --git a/Source/WebCore/Modules/notifications/Notification.idl b/Source/WebCore/Modules/notifications/Notification.idl index 0f029f863..c61b3cd66 100644 --- a/Source/WebCore/Modules/notifications/Notification.idl +++ b/Source/WebCore/Modules/notifications/Notification.idl @@ -64,8 +64,8 @@ module threads { attribute EventListener onclose; attribute EventListener onclick; - attribute DOMString dir; #if defined(ENABLE_LEGACY_NOTIFICATIONS) && ENABLE_LEGACY_NOTIFICATIONS + attribute DOMString dir; attribute DOMString replaceId; #endif #if defined(ENABLE_NOTIFICATIONS) && ENABLE_NOTIFICATIONS diff --git a/Source/WebCore/PlatformEfl.cmake b/Source/WebCore/PlatformEfl.cmake index b9af98e9f..793c82178 100644 --- a/Source/WebCore/PlatformEfl.cmake +++ b/Source/WebCore/PlatformEfl.cmake @@ -1,8 +1,3 @@ -LIST(APPEND WebCore_LINK_FLAGS - ${ECORE_X_LDFLAGS} - ${EFLDEPS_LDFLAGS} -) - LIST(APPEND WebCore_INCLUDE_DIRECTORIES "${WEBCORE_DIR}/accessibility/efl" "${WEBCORE_DIR}/page/efl" @@ -194,9 +189,15 @@ ENDIF () LIST(APPEND WebCore_LIBRARIES ${CAIRO_LIBRARIES} + ${ECORE_LIBRARIES} + ${ECORE_EVAS_LIBRARIES} + ${ECORE_FILE_LIBRARIES} ${ECORE_X_LIBRARIES} + ${E_DBUS_LIBRARIES} + ${E_DBUS_EUKIT_LIBRARIES} + ${EDJE_LIBRARIES} ${EEZE_LIBRARIES} - ${EFLDEPS_LIBRARIES} + ${EINA_LIBRARIES} ${EVAS_LIBRARIES} ${FONTCONFIG_LIBRARIES} ${FREETYPE_LIBRARIES} @@ -215,9 +216,15 @@ LIST(APPEND WebCore_LIBRARIES LIST(APPEND WebCore_INCLUDE_DIRECTORIES ${CAIRO_INCLUDE_DIRS} + ${ECORE_INCLUDE_DIRS} + ${ECORE_EVAS_INCLUDE_DIRS} + ${ECORE_FILE_INCLUDE_DIRS} ${ECORE_X_INCLUDE_DIRS} + ${E_DBUS_INCLUDE_DIRS} + ${E_DBUS_EUKIT_INCLUDE_DIRS} + ${EDJE_INCLUDE_DIRS} ${EEZE_INCLUDE_DIRS} - ${EFLDEPS_INCLUDE_DIRS} + ${EINA_INCLUDE_DIRS} ${EVAS_INCLUDE_DIRS} ${FREETYPE_INCLUDE_DIRS} ${ICU_INCLUDE_DIRS} diff --git a/Source/WebCore/Target.pri b/Source/WebCore/Target.pri index edbe2f437..873254ee8 100644 --- a/Source/WebCore/Target.pri +++ b/Source/WebCore/Target.pri @@ -662,6 +662,7 @@ SOURCES += \ html/ImageDocument.cpp \ html/ImageInputType.cpp \ html/InputType.cpp \ + html/InputTypeNames.cpp \ html/LabelableElement.cpp \ html/LabelsNodeList.cpp \ html/LinkRelAttribute.cpp \ @@ -1096,6 +1097,9 @@ SOURCES += \ rendering/BidiRun.cpp \ rendering/CounterNode.cpp \ rendering/EllipsisBox.cpp \ + rendering/ExclusionInterval.cpp \ + rendering/ExclusionRectangle.cpp \ + rendering/ExclusionShape.cpp \ rendering/FilterEffectRenderer.cpp \ rendering/FixedTableLayout.cpp \ rendering/FlowThreadController.cpp \ @@ -1552,7 +1556,6 @@ HEADERS += \ dom/IdTargetObserver.h \ dom/IdTargetObserverRegistry.h \ dom/KeyboardEvent.h \ - dom/MemoryInstrumentation.h \ dom/MessageChannel.h \ dom/MessageEvent.h \ dom/MessagePortChannel.h \ @@ -2050,6 +2053,7 @@ HEADERS += \ platform/graphics/filters/CustomFilterOperation.h \ platform/graphics/filters/CustomFilterParameter.h \ platform/graphics/filters/CustomFilterProgram.h \ + platform/graphics/filters/CustomFilterProgramInfo.h \ platform/graphics/filters/CustomFilterTransformParameter.h \ platform/graphics/filters/CustomFilterValidatedProgram.h \ platform/graphics/filters/FEBlend.h \ @@ -2278,6 +2282,9 @@ HEADERS += \ rendering/break_lines.h \ rendering/CounterNode.h \ rendering/EllipsisBox.h \ + rendering/ExclusionInterval.h \ + rendering/ExclusionRectangle.h \ + rendering/ExclusionShape.h \ rendering/FilterEffectRenderer.h \ rendering/FixedTableLayout.h \ rendering/HitTestingTransformState.h \ @@ -2800,7 +2807,7 @@ SOURCES += \ platform/text/qt/TextCodecQt.cpp \ platform/qt/WidgetQt.cpp -contains(DEFINES, WTF_USE_LIBXML2=1) { +use?(LIBXML2) { HEADERS += xml/parser/XMLDocumentParserScope.h SOURCES += \ xml/parser/XMLDocumentParserLibxml2.cpp \ @@ -2809,7 +2816,7 @@ contains(DEFINES, WTF_USE_LIBXML2=1) { SOURCES += xml/parser/XMLDocumentParserQt.cpp } -contains(DEFINES, ENABLE_SMOOTH_SCROLLING=1) { +enable?(SMOOTH_SCROLLING) { HEADERS += platform/ScrollAnimatorNone.h SOURCES += platform/ScrollAnimatorNone.cpp } @@ -2837,7 +2844,7 @@ mac { SOURCES += editing/SmartReplaceICU.cpp } -contains(DEFINES, ENABLE_NETSCAPE_PLUGIN_API=1) { +enable?(NETSCAPE_PLUGIN_API) { SOURCES += plugins/npapi.cpp @@ -2875,12 +2882,12 @@ contains(DEFINES, ENABLE_NETSCAPE_PLUGIN_API=1) { plugins/PluginViewNone.cpp } -plugin_backend_xlib { +use?(PLUGIN_BACKEND_XLIB) { SOURCES += plugins/qt/QtX11ImageConversion.cpp HEADERS += plugins/qt/QtX11ImageConversion.h } -contains(DEFINES, ENABLE_SQL_DATABASE=1) { +enable?(SQL_DATABASE) { SOURCES += \ Modules/webdatabase/ChangeVersionWrapper.cpp \ Modules/webdatabase/DatabaseTask.cpp \ @@ -2905,7 +2912,7 @@ contains(DEFINES, ENABLE_SQL_DATABASE=1) { bindings/js/JSSQLTransactionSyncCustom.cpp } -contains(DEFINES, ENABLE_INDEXED_DATABASE=1) { +enable?(INDEXED_DATABASE) { HEADERS += \ bindings/js/IDBBindingUtilities.h \ @@ -2965,7 +2972,7 @@ contains(DEFINES, ENABLE_INDEXED_DATABASE=1) { Modules/indexeddb/WorkerContextIndexedDatabase.cpp } -contains(DEFINES, ENABLE_DATA_TRANSFER_ITEMS=1) { +enable?(DATA_TRANSFER_ITEMS) { HEADERS += \ dom/DataTransferItem.h \ dom/DataTransferItemList.h \ @@ -2979,7 +2986,7 @@ contains(DEFINES, ENABLE_DATA_TRANSFER_ITEMS=1) { platform/qt/DataTransferItemListQt.cpp } -contains(DEFINES, ENABLE_FILE_SYSTEM=1) { +enable?(FILE_SYSTEM) { HEADERS += \ Modules/filesystem/AsyncFileWriter.h \ Modules/filesystem/DOMFilePath.h \ @@ -3024,7 +3031,7 @@ contains(DEFINES, ENABLE_FILE_SYSTEM=1) { platform/AsyncFileSystem.cpp } -contains(DEFINES, ENABLE_MEDIA_SOURCE=1) { +enable?(MEDIA_SOURCE) { HEADERS += \ Modules/mediasource/MediaSource.h \ Modules/mediasource/MediaSourceRegistry.h \ @@ -3037,14 +3044,14 @@ contains(DEFINES, ENABLE_MEDIA_SOURCE=1) { Modules/mediasource/SourceBufferList.cpp } -contains(DEFINES, ENABLE_ICONDATABASE=1) { +enable?(ICONDATABASE) { SOURCES += \ loader/icon/IconDatabase.cpp \ loader/icon/IconRecord.cpp \ loader/icon/PageURLRecord.cpp } -contains(DEFINES, ENABLE_WORKERS=1) { +enable?(WORKERS) { SOURCES += \ bindings/js/JSDedicatedWorkerContextCustom.cpp \ bindings/js/JSWorkerContextBase.cpp \ @@ -3069,7 +3076,7 @@ contains(DEFINES, ENABLE_WORKERS=1) { workers/WorkerScriptLoader.cpp } -contains(DEFINES, ENABLE_SHARED_WORKERS=1) { +enable?(SHARED_WORKERS) { SOURCES += \ bindings/js/JSSharedWorkerCustom.cpp @@ -3080,7 +3087,7 @@ contains(DEFINES, ENABLE_SHARED_WORKERS=1) { workers/SharedWorkerThread.cpp } -contains(DEFINES, ENABLE_INPUT_SPEECH=1) { +enable?(INPUT_SPEECH) { SOURCES += \ page/SpeechInput.cpp \ page/SpeechInputEvent.cpp \ @@ -3089,11 +3096,11 @@ contains(DEFINES, ENABLE_INPUT_SPEECH=1) { rendering/RenderInputSpeech.cpp } -contains(DEFINES, ENABLE_SCRIPTED_SPEECH=1) { +enable?(SCRIPTED_SPEECH) { SOURCES += # FIXME! } -contains(DEFINES, ENABLE_QUOTA=1) { +enable?(QUOTA) { HEADERS += \ Modules/quota/DOMWindowQuota.idl \ Modules/quota/StorageInfo.h \ @@ -3106,7 +3113,7 @@ contains(DEFINES, ENABLE_QUOTA=1) { Modules/quota/StorageInfo.cpp } -contains(DEFINES, ENABLE_GAMEPAD=1) { +enable?(GAMEPAD) { HEADERS += \ Modules/gamepad/Gamepad.h\ Modules/gamepad/GamepadList.h \ @@ -3122,7 +3129,7 @@ contains(DEFINES, ENABLE_GAMEPAD=1) { platform/qt/GamepadsQt.cpp } -contains(DEFINES, WTF_USE_GSTREAMER=1) { +use?(GSTREAMER) { HEADERS += \ platform/graphics/gstreamer/GRefPtrGStreamer.h \ platform/graphics/gstreamer/GStreamerUtilities.h \ @@ -3134,7 +3141,7 @@ contains(DEFINES, WTF_USE_GSTREAMER=1) { platform/graphics/gstreamer/GStreamerVersioning.cpp } -contains(DEFINES, ENABLE_VIDEO=1) { +enable?(VIDEO) { SOURCES += \ html/HTMLAudioElement.cpp \ html/HTMLMediaElement.cpp \ @@ -3148,7 +3155,7 @@ contains(DEFINES, ENABLE_VIDEO=1) { rendering/RenderVideo.cpp \ rendering/RenderMedia.cpp - contains(DEFINES, WTF_USE_QTKIT=1) { + use?(QTKIT) { INCLUDEPATH += \ $$SOURCE_DIR/../WebKitLibraries/ \ $$PWD/platform/mac @@ -3193,7 +3200,7 @@ contains(DEFINES, ENABLE_VIDEO=1) { QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.5 - } else: contains(DEFINES, WTF_USE_GSTREAMER=1) { + } else: use?(GSTREAMER) { HEADERS += \ platform/graphics/gstreamer/GStreamerGWorld.h \ platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h \ @@ -3210,7 +3217,7 @@ contains(DEFINES, ENABLE_VIDEO=1) { platform/graphics/gstreamer/PlatformVideoWindowQt.cpp \ platform/graphics/gstreamer/ImageGStreamerQt.cpp - } else:contains(DEFINES, WTF_USE_QT_MULTIMEDIA=1) { + } else:use?(QT_MULTIMEDIA) { HEADERS += \ platform/graphics/qt/MediaPlayerPrivateQt.h @@ -3219,7 +3226,7 @@ contains(DEFINES, ENABLE_VIDEO=1) { } } -contains(DEFINES, ENABLE_WEB_AUDIO=1) { +enable?(WEB_AUDIO) { HEADERS += \ Modules/webaudio/AsyncAudioDecoder.h \ Modules/webaudio/AudioBasicInspectorNode.h \ @@ -3388,7 +3395,7 @@ contains(DEFINES, ENABLE_WEB_AUDIO=1) { platform/audio/VectorMath.cpp \ platform/audio/ZeroPole.cpp - contains(DEFINES, WTF_USE_GSTREAMER=1) { + use?(GSTREAMER) { HEADERS += \ platform/audio/gstreamer/AudioDestinationGStreamer.h \ platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.h @@ -3400,21 +3407,21 @@ contains(DEFINES, ENABLE_WEB_AUDIO=1) { } } -contains(DEFINES, ENABLE_FULLSCREEN_API=1) { +enable?(FULLSCREEN_API) { SOURCES += \ rendering/RenderFullScreen.cpp HEADERS += \ rendering/RenderFullScreen.h } -contains(DEFINES, ENABLE_XSLT=1) { +enable?(XSLT) { SOURCES += \ bindings/js/JSXSLTProcessorCustom.cpp SOURCES += xml/XMLTreeViewer.cpp HEADERS += xml/XMLTreeViewer.h - contains(DEFINES, WTF_USE_LIBXML2=1) { + use?(LIBXML2) { SOURCES += \ xml/XSLTProcessor.cpp \ xml/XSLTProcessorLibxslt.cpp \ @@ -3440,11 +3447,12 @@ contains(DEFINES, ENABLE_XSLT=1) { } } -contains(DEFINES, ENABLE_FILTERS=1) { +enable?(FILTERS) { SOURCES += \ platform/graphics/filters/CustomFilterGlobalContext.cpp \ platform/graphics/filters/CustomFilterOperation.cpp \ platform/graphics/filters/CustomFilterProgram.cpp \ + platform/graphics/filters/CustomFilterProgramInfo.cpp \ platform/graphics/filters/CustomFilterCompiledProgram.cpp \ platform/graphics/filters/CustomFilterMesh.cpp \ platform/graphics/filters/CustomFilterMeshGenerator.cpp \ @@ -3479,7 +3487,7 @@ contains(DEFINES, ENABLE_FILTERS=1) { platform/graphics/filters/arm/FELightingNEON.cpp \ } -contains(DEFINES, ENABLE_MATHML=1) { +enable?(MATHML) { SOURCES += \ mathml/MathMLElement.cpp \ mathml/MathMLInlineContainerElement.cpp \ @@ -3500,11 +3508,11 @@ contains(DEFINES, ENABLE_MATHML=1) { mathml/MathMLAllInOne.cpp } -contains(DEFINES, ENABLE_TEXT_AUTOSIZING=1) { +enable?(TEXT_AUTOSIZING) { SOURCES += # FIXME! } -contains(DEFINES, ENABLE_DEVICE_ORIENTATION=1) { +enable?(DEVICE_ORIENTATION) { HEADERS += \ platform/qt/DeviceMotionClientQt.h \ platform/qt/DeviceMotionProviderQt.h \ @@ -3517,7 +3525,7 @@ contains(DEFINES, ENABLE_DEVICE_ORIENTATION=1) { platform/qt/DeviceOrientationProviderQt.cpp } -contains(DEFINES, ENABLE_SVG=1) { +enable?(SVG) { SOURCES += \ # TODO: this-one-is-not-auto-added! FIXME! tmp/SVGElementFactory.cpp \ bindings/js/JSSVGElementInstanceCustom.cpp \ @@ -3754,7 +3762,7 @@ contains(DEFINES, ENABLE_SVG=1) { svg/SVGAllInOne.cpp } -contains(DEFINES, ENABLE_JAVASCRIPT_DEBUGGER=1) { +enable?(JAVASCRIPT_DEBUGGER) { SOURCES += \ bindings/js/JSJavaScriptCallFrameCustom.cpp \ bindings/js/ScriptProfiler.cpp \ @@ -3762,7 +3770,7 @@ contains(DEFINES, ENABLE_JAVASCRIPT_DEBUGGER=1) { } -contains(DEFINES, ENABLE_VIDEO_TRACK=1) { +enable?(VIDEO_TRACK) { SOURCES += \ bindings/js/JSTextTrackCueCustom.cpp \ bindings/js/JSTextTrackCustom.cpp \ @@ -3773,7 +3781,7 @@ contains(DEFINES, ENABLE_VIDEO_TRACK=1) { bindings/js/JSTextTrackListCustom.cpp } -contains(DEFINES, ENABLE_WEB_SOCKETS=1) { +enable?(WEB_SOCKETS) { HEADERS += \ Modules/websockets/CloseEvent.h \ Modules/websockets/ThreadableWebSocketChannel.h \ @@ -3812,7 +3820,7 @@ contains(DEFINES, ENABLE_WEB_SOCKETS=1) { SOURCES += \ bindings/js/JSWebSocketCustom.cpp - contains(DEFINES, ENABLE_WORKERS=1) { + enable?(WORKERS) { HEADERS += \ Modules/websockets/WorkerThreadableWebSocketChannel.h @@ -3821,7 +3829,7 @@ contains(DEFINES, ENABLE_WEB_SOCKETS=1) { } } -contains(DEFINES, ENABLE_WEBGL=1) { +enable?(WEBGL) { HEADERS += \ html/canvas/CanvasContextAttributes.h \ html/canvas/WebGLObject.h \ @@ -3887,7 +3895,7 @@ contains(DEFINES, ENABLE_WEBGL=1) { html/canvas/WebGLVertexArrayObjectOES.cpp } -contains(DEFINES, WTF_USE_3D_GRAPHICS=1) { +use?(3D_GRAPHICS) { HEADERS += \ platform/graphics/ANGLEWebKitBridge.h \ platform/graphics/Extensions3D.h \ @@ -3939,7 +3947,7 @@ contains(DEFINES, WTF_USE_3D_GRAPHICS=1) { } -contains(DEFINES, ENABLE_MHTML=1) { +enable?(MHTML) { INCLUDEPATH += $$PWD/loader/archive/mhtml @@ -3955,23 +3963,23 @@ contains(DEFINES, ENABLE_MHTML=1) { page/PageSerializer.cpp } -contains(DEFINES, ENABLE_UNDO_MANAGER=1) { +enable?(UNDO_MANAGER) { SOURCES += \ editing/UndoManager.cpp HEADERS += \ editing/UndoManager.h } -contains(DEFINES, WTF_USE_LIBPNG=1) { +use?(LIBPNG) { SOURCES += platform/image-decoders/ico/ICOImageDecoder.cpp \ platform/image-decoders/png/PNGImageDecoder.cpp } -contains(DEFINES, WTF_USE_LIBJPEG=1) { +use?(LIBJPEG) { SOURCES += platform/image-decoders/jpeg/JPEGImageDecoder.cpp } -contains(DEFINES, WTF_USE_WEBP=1) { +use?(WEBP) { HEADERS += platform/image-decoders/webp/WEBPImageDecoder.h SOURCES += platform/image-decoders/webp/WEBPImageDecoder.cpp } @@ -4006,12 +4014,12 @@ contains(CONFIG, opengl-shims) { DEFINES += QT_OPENGL_SHIMS=1 } -contains(DEFINES, WTF_USE_GRAPHICS_SURFACE=1) { +use?(GRAPHICS_SURFACE) { mac { SOURCES += platform/graphics/surfaces/mac/GraphicsSurfaceMac.cpp INCLUDEPATH += /System/Library/Frameworks/CoreFoundation.framework/Headers } - contains(DEFINES, HAVE_XCOMPOSITE=1) { + have?(XCOMPOSITE) { SOURCES += platform/graphics/surfaces/qt/GraphicsSurfaceGLX.cpp } } @@ -4023,7 +4031,7 @@ ALL_IN_ONE_SOURCES += \ platform/text/TextAllInOne.cpp \ rendering/style/StyleAllInOne.cpp -contains(DEFINES, ENABLE_XSLT=1):contains(DEFINES, WTF_USE_LIBXML2=1) { +enable?(XSLT):use?(LIBXML2) { ALL_IN_ONE_SOURCES += \ dom/DOMAllInOne.cpp } diff --git a/Source/WebCore/UseV8.cmake b/Source/WebCore/UseV8.cmake index d041c8164..9862588a8 100755 --- a/Source/WebCore/UseV8.cmake +++ b/Source/WebCore/UseV8.cmake @@ -57,7 +57,6 @@ LIST(APPEND WebCore_SOURCES bindings/v8/V8GCController.cpp bindings/v8/V8GCForContextDispose.cpp bindings/v8/V8HiddenPropertyName.cpp - bindings/v8/V8IsolatedContext.cpp bindings/v8/V8LazyEventListener.cpp bindings/v8/V8NodeFilterCondition.cpp bindings/v8/V8ObjectConstructor.cpp diff --git a/Source/WebCore/WebCore.exp.in b/Source/WebCore/WebCore.exp.in index b4769f918..df9a5cc8d 100644 --- a/Source/WebCore/WebCore.exp.in +++ b/Source/WebCore/WebCore.exp.in @@ -683,6 +683,7 @@ __ZN7WebCore4Page31setCustomHTMLTokenizerChunkSizeEi __ZN7WebCore4Page31setCustomHTMLTokenizerTimeDelayEd __ZN7WebCore4Page32setMemoryCacheClientCallsEnabledEb __ZN7WebCore4Page35resumeActiveDOMObjectsAndAnimationsEv +__ZN7WebCore4Page36setShouldSuppressScrollbarAnimationsEb __ZN7WebCore4Page36suspendActiveDOMObjectsAndAnimationsEv __ZN7WebCore4Page37setInLowQualityImageInterpolationModeEb __ZN7WebCore4Page43setRelevantRepaintedObjectsCounterThresholdEy diff --git a/Source/WebCore/WebCore.gypi b/Source/WebCore/WebCore.gypi index 03237f6fc..feda60bba 100644 --- a/Source/WebCore/WebCore.gypi +++ b/Source/WebCore/WebCore.gypi @@ -2301,8 +2301,6 @@ 'bindings/v8/V8GCForContextDispose.h', 'bindings/v8/V8HiddenPropertyName.cpp', 'bindings/v8/V8HiddenPropertyName.h', - 'bindings/v8/V8IsolatedContext.cpp', - 'bindings/v8/V8IsolatedContext.h', 'bindings/v8/V8LazyEventListener.cpp', 'bindings/v8/V8LazyEventListener.h', 'bindings/v8/V8NPObject.cpp', @@ -3289,6 +3287,12 @@ 'rendering/CounterNode.h', 'rendering/EllipsisBox.cpp', 'rendering/EllipsisBox.h', + 'rendering/ExclusionInterval.cpp', + 'rendering/ExclusionInterval.h', + 'rendering/ExclusionRectangle.cpp', + 'rendering/ExclusionRectangle.h', + 'rendering/ExclusionShape.cpp', + 'rendering/ExclusionShape.h', 'rendering/FilterEffectRenderer.cpp', 'rendering/FilterEffectRenderer.h', 'rendering/FixedTableLayout.cpp', @@ -3854,7 +3858,6 @@ 'dom/IdTargetObserverRegistry.cpp', 'dom/IdTargetObserverRegistry.h', 'dom/KeyboardEvent.cpp', - 'dom/MemoryInstrumentation.h', 'dom/MessageChannel.cpp', 'dom/MessageChannel.h', 'dom/MessageEvent.cpp', @@ -4201,6 +4204,8 @@ 'html/ImageInputType.cpp', 'html/ImageInputType.h', 'html/InputType.cpp', + 'html/InputTypeNames.cpp', + 'html/InputTypeNames.h', 'html/LabelableElement.cpp', 'html/LabelsNodeList.cpp', 'html/LabelsNodeList.h', @@ -5671,8 +5676,8 @@ 'platform/text/LocalizedNumber.h', 'platform/text/LocalizedNumberICU.cpp', 'platform/text/LocalizedNumberNone.cpp', - 'platform/text/NumberLocalizer.cpp', - 'platform/text/NumberLocalizer.h', + 'platform/text/Localizer.cpp', + 'platform/text/Localizer.h', 'platform/text/ParserUtilities.h', 'platform/text/QuotedPrintable.h', 'platform/text/QuotedPrintable.cpp', diff --git a/Source/WebCore/WebCore.pri b/Source/WebCore/WebCore.pri index d2823a4e5..53549a6e6 100644 --- a/Source/WebCore/WebCore.pri +++ b/Source/WebCore/WebCore.pri @@ -102,8 +102,8 @@ INCLUDEPATH += \ INCLUDEPATH += $$WEBCORE_GENERATED_SOURCES_DIR -contains(DEFINES, ENABLE_XSLT=1) { - contains(DEFINES, WTF_USE_LIBXML2=1) { +enable?(XSLT) { + use?(LIBXML2) { mac { INCLUDEPATH += /usr/include/libxml2 LIBS += -lxml2 -lxslt @@ -115,15 +115,15 @@ contains(DEFINES, ENABLE_XSLT=1) { } } -contains(DEFINES, WTF_USE_LIBXML2=1) { +use?(LIBXML2) { PKGCONFIG += libxml-2.0 } -contains(DEFINES, WTF_USE_ZLIB=1) { +use?(ZLIB) { LIBS += -lz } -contains(DEFINES, ENABLE_NETSCAPE_PLUGIN_API=1) { +enable?(NETSCAPE_PLUGIN_API) { unix { mac { INCLUDEPATH += platform/mac @@ -149,56 +149,56 @@ contains(DEFINES, ENABLE_NETSCAPE_PLUGIN_API=1) { } } -contains(DEFINES, ENABLE_ORIENTATION_EVENTS=1)|contains(DEFINES, ENABLE_DEVICE_ORIENTATION=1) { +enable?(ORIENTATION_EVENTS)|enable?(DEVICE_ORIENTATION) { QT += sensors } -contains(DEFINES, WTF_USE_QT_MOBILITY_SYSTEMINFO=1) { +use?(QT_MOBILITY_SYSTEMINFO) { CONFIG *= mobility MOBILITY *= systeminfo } -contains(DEFINES, ENABLE_GAMEPAD=1) { +enable?(GAMEPAD) { INCLUDEPATH += \ $$SOURCE_DIR/platform/linux \ $$SOURCE_DIR/Modules/gamepad PKGCONFIG += libudev } -contains(DEFINES, WTF_USE_GSTREAMER=1) { +use?(GSTREAMER) { DEFINES += ENABLE_GLIB_SUPPORT=1 PKGCONFIG += glib-2.0 gio-2.0 gstreamer-0.10 gstreamer-app-0.10 gstreamer-base-0.10 gstreamer-interfaces-0.10 gstreamer-pbutils-0.10 gstreamer-plugins-base-0.10 } -contains(DEFINES, ENABLE_VIDEO=1) { - contains(DEFINES, WTF_USE_QTKIT=1) { +enable?(VIDEO) { + use?(QTKIT) { INCLUDEPATH += $$SOURCE_DIR/platform/graphics/mac LIBS += -framework AppKit -framework AudioUnit \ -framework AudioToolbox -framework CoreAudio \ -framework QuartzCore -framework QTKit - } else:contains(DEFINES, WTF_USE_GSTREAMER=1) { + } else:use?(GSTREAMER) { INCLUDEPATH += $$SOURCE_DIR/platform/graphics/gstreamer PKGCONFIG += gstreamer-video-0.10 - } else:contains(DEFINES, WTF_USE_QT_MULTIMEDIA=1) { + } else:use?(QT_MULTIMEDIA) { CONFIG *= mobility MOBILITY *= multimedia } } -contains(DEFINES, ENABLE_WEB_AUDIO=1) { - contains(DEFINES, WTF_USE_GSTREAMER=1) { +enable?(WEB_AUDIO) { + use?(GSTREAMER) { DEFINES += WTF_USE_WEBAUDIO_GSTREAMER=1 INCLUDEPATH += $$SOURCE_DIR/platform/audio/gstreamer PKGCONFIG += gstreamer-audio-0.10 gstreamer-fft-0.10 } } -contains(DEFINES, WTF_USE_3D_GRAPHICS=1) { +use?(3D_GRAPHICS) { contains(QT_CONFIG, opengles2):!win32: LIBS += -lEGL mac: LIBS += -framework IOSurface -framework CoreFoundation - linux-*:contains(DEFINES, HAVE_XCOMPOSITE=1): LIBS += -lXcomposite + linux-*:have?(XCOMPOSITE): LIBS += -lXcomposite } !system-sqlite:exists( $${SQLITE3SRCDIR}/sqlite3.c ) { @@ -209,23 +209,9 @@ contains(DEFINES, WTF_USE_3D_GRAPHICS=1) { LIBS += -lsqlite3 } -# Qt5 allows us to use config tests to check for the presence of these libraries -config_libjpeg { - DEFINES += WTF_USE_LIBJPEG=1 - LIBS += -ljpeg -} else { - warning("JPEG library not found! QImageDecoder will decode JPEG images.") -} -config_libpng { - DEFINES += WTF_USE_LIBPNG=1 - LIBS += -lpng -} else { - warning("PNG library not found! QImageDecoder will decode PNG images.") -} -config_libwebp { - DEFINES += WTF_USE_WEBP=1 - LIBS += -lwebp -} +use?(libjpeg): LIBS += -ljpeg +use?(libpng): LIBS += -lpng +use?(webp): LIBS += -lwebp mac { LIBS += -framework Carbon -framework AppKit diff --git a/Source/WebCore/WebCore.vcproj/WebCore.vcproj b/Source/WebCore/WebCore.vcproj/WebCore.vcproj index 2c78609f5..673293571 100755 --- a/Source/WebCore/WebCore.vcproj/WebCore.vcproj +++ b/Source/WebCore/WebCore.vcproj/WebCore.vcproj @@ -38386,6 +38386,30 @@ RelativePath="..\rendering\EllipsisBox.h"
>
</File>
+ <File
+ RelativePath="..\rendering\ExclusionInterval.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rendering\ExclusionInterval.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rendering\ExclusionRectangle.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rendering\ExclusionSRectangle.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rendering\ExclusionShape.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rendering\ExclusionShape.h"
+ >
+ </File>
<File
RelativePath="..\rendering\FilterEffectRenderer.cpp"
>
@@ -51891,10 +51915,6 @@ >
</File>
<File
- RelativePath="..\dom\MemoryInstrumentation.h"
- >
- </File>
- <File
RelativePath="..\dom\MessageChannel.cpp"
>
<FileConfiguration
@@ -63589,6 +63609,14 @@ <File
RelativePath="..\html\InputType.h"
>
+ </File>
+ <File
+ RelativePath="..\html\InputTypeNames.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\html\InputTypeNames.h"
+ >
</File>
<File
RelativePath="..\html\LabelableElement.cpp"
diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj index 84fcad81c..d1a031ba9 100644 --- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj +++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj @@ -511,7 +511,7 @@ 1AAADDA314DB409F00AF64B3 /* ScrollingTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1AAADDA114DB409F00AF64B3 /* ScrollingTree.cpp */; }; 1AAADDA414DB409F00AF64B3 /* ScrollingTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AAADDA214DB409F00AF64B3 /* ScrollingTree.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1AAADDBE14DC640700AF64B3 /* ScrollingTreeState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1AAADDBC14DC640600AF64B3 /* ScrollingTreeState.cpp */; }; - 1AAADDBF14DC640700AF64B3 /* ScrollingTreeState.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AAADDBD14DC640600AF64B3 /* ScrollingTreeState.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 1AAADDBF14DC640700AF64B3 /* ScrollingTreeState.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AAADDBD14DC640600AF64B3 /* ScrollingTreeState.h */; }; 1AAADDDA14DC74EC00AF64B3 /* ScrollingTreeStateMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1AAADDD814DC74EC00AF64B3 /* ScrollingTreeStateMac.mm */; }; 1AAADDE314DC8C8F00AF64B3 /* ScrollingTreeNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1AAADDE114DC8C8F00AF64B3 /* ScrollingTreeNode.cpp */; }; 1AAADDE414DC8C8F00AF64B3 /* ScrollingTreeNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AAADDE214DC8C8F00AF64B3 /* ScrollingTreeNode.h */; }; @@ -1455,7 +1455,6 @@ 4F2D205512EAE7B3005C2874 /* InspectorAgent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4F2D205312EAE7B3005C2874 /* InspectorAgent.cpp */; }; 4F3289B511A42AAB005ABE7E /* InspectorValues.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4F3289B311A42AAB005ABE7E /* InspectorValues.cpp */; }; 4F3289B611A42AAB005ABE7E /* InspectorValues.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F3289B411A42AAB005ABE7E /* InspectorValues.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 4F32BB1B14FA85E800F6C1A3 /* MemoryInstrumentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F32BB1A14FA85AA00F6C1A3 /* MemoryInstrumentation.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4F377FF515FA356A00E5D60D /* WebCoreMemoryInstrumentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F377FF415FA356A00E5D60D /* WebCoreMemoryInstrumentation.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4F4F5FFB11CBD2E100A186BF /* InspectorFrontend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4F4F5FFA11CBD2D200A186BF /* InspectorFrontend.cpp */; }; 4F6FDD641341DEDD001F8EE3 /* InspectorPageAgent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4F6FDD621341DEDD001F8EE3 /* InspectorPageAgent.cpp */; }; @@ -1839,6 +1838,12 @@ 6E67D2A61280E8A4008758F7 /* Extensions3DOpenGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6E67D2A41280E8A4008758F7 /* Extensions3DOpenGL.cpp */; }; 6E67D2A71280E8A4008758F7 /* Extensions3DOpenGL.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E67D2A51280E8A4008758F7 /* Extensions3DOpenGL.h */; }; 6E67D2A91280E8BD008758F7 /* Extensions3D.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E67D2A81280E8BD008758F7 /* Extensions3D.h */; }; + 6E8798BA15F81E4A00BFE4AA /* ExclusionInterval.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6E8798B415F81E4A00BFE4AA /* ExclusionInterval.cpp */; }; + 6E8798BB15F81E4A00BFE4AA /* ExclusionInterval.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E8798B515F81E4A00BFE4AA /* ExclusionInterval.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 6E8798BC15F81E4A00BFE4AA /* ExclusionRectangle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6E8798B615F81E4A00BFE4AA /* ExclusionRectangle.cpp */; }; + 6E8798BD15F81E4A00BFE4AA /* ExclusionRectangle.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E8798B715F81E4A00BFE4AA /* ExclusionRectangle.h */; }; + 6E8798BE15F81E4A00BFE4AA /* ExclusionShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6E8798B815F81E4A00BFE4AA /* ExclusionShape.cpp */; }; + 6E8798BF15F81E4A00BFE4AA /* ExclusionShape.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E8798B915F81E4A00BFE4AA /* ExclusionShape.h */; settings = {ATTRIBUTES = (Private, ); }; }; 6EBC5EAF138B50F200A0CF8A /* JSFloat64Array.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6EBC5EAD138B50F200A0CF8A /* JSFloat64Array.cpp */; }; 6EBC5EB0138B50F200A0CF8A /* JSFloat64Array.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EBC5EAE138B50F200A0CF8A /* JSFloat64Array.h */; }; 6EBF0E4812A8926100DB1709 /* OESTextureFloat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6EBF0E4512A8926100DB1709 /* OESTextureFloat.cpp */; }; @@ -5768,6 +5773,8 @@ C330A22313EC196B0000B45B /* ColorChooser.h in Headers */ = {isa = PBXBuildFile; fileRef = C330A22113EC196B0000B45B /* ColorChooser.h */; settings = {ATTRIBUTES = (Private, ); }; }; C33EE5C414FB49610002095A /* BaseClickableWithKeyInputType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C33EE5C214FB49610002095A /* BaseClickableWithKeyInputType.cpp */; }; C33EE5C514FB49610002095A /* BaseClickableWithKeyInputType.h in Headers */ = {isa = PBXBuildFile; fileRef = C33EE5C314FB49610002095A /* BaseClickableWithKeyInputType.h */; }; + C348612315FDE21E007A1CC9 /* InputTypeNames.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C348612115FDE21E007A1CC9 /* InputTypeNames.cpp */; }; + C348612415FDE21E007A1CC9 /* InputTypeNames.h in Headers */ = {isa = PBXBuildFile; fileRef = C348612215FDE21E007A1CC9 /* InputTypeNames.h */; }; C37CDEBD149EF2030042090D /* ColorChooserClient.h in Headers */ = {isa = PBXBuildFile; fileRef = C37CDEBC149EF2030042090D /* ColorChooserClient.h */; settings = {ATTRIBUTES = (Private, ); }; }; C3CF17A415B0063F00276D39 /* IdTargetObserver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C3CF17A015B0063F00276D39 /* IdTargetObserver.cpp */; }; C3CF17A515B0063F00276D39 /* IdTargetObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CF17A115B0063F00276D39 /* IdTargetObserver.h */; settings = {ATTRIBUTES = (Private, ); }; }; @@ -6224,8 +6231,8 @@ F5122C901547FA1B0028A93B /* PagePopupDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = F5122C8F1547FA1B0028A93B /* PagePopupDriver.h */; }; F5142C69123F12B000F5BD4C /* LocalizedNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = F5142C68123F12B000F5BD4C /* LocalizedNumber.h */; }; F52AD5E41534245F0059FBE6 /* EmptyClients.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F52AD5E31534245F0059FBE6 /* EmptyClients.cpp */; }; - F544F78815CFB2A800AF33A8 /* NumberLocalizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F544F78615CFB2A800AF33A8 /* NumberLocalizer.cpp */; }; - F544F78915CFB2A800AF33A8 /* NumberLocalizer.h in Headers */ = {isa = PBXBuildFile; fileRef = F544F78715CFB2A800AF33A8 /* NumberLocalizer.h */; }; + F544F78815CFB2A800AF33A8 /* Localizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F544F78615CFB2A800AF33A8 /* Localizer.cpp */; }; + F544F78915CFB2A800AF33A8 /* Localizer.h in Headers */ = {isa = PBXBuildFile; fileRef = F544F78715CFB2A800AF33A8 /* Localizer.h */; }; F55B3DAD1251F12D003EF269 /* BaseTextInputType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F55B3D791251F12D003EF269 /* BaseTextInputType.cpp */; }; F55B3DAE1251F12D003EF269 /* BaseTextInputType.h in Headers */ = {isa = PBXBuildFile; fileRef = F55B3D7A1251F12D003EF269 /* BaseTextInputType.h */; }; F55B3DAF1251F12D003EF269 /* ButtonInputType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F55B3D7B1251F12D003EF269 /* ButtonInputType.cpp */; }; @@ -7826,6 +7833,8 @@ 2981CAAD131822EC00D12F2A /* AccessibilityTableHeaderContainer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AccessibilityTableHeaderContainer.cpp; sourceTree = "<group>"; }; 2981CAAE131822EC00D12F2A /* AccessibilityTableRow.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AccessibilityTableRow.cpp; sourceTree = "<group>"; }; 2981CAAF131822EC00D12F2A /* AXObjectCache.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AXObjectCache.cpp; sourceTree = "<group>"; }; + 2985709215CC532D006355CD /* AccessibilityNodeObject.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AccessibilityNodeObject.cpp; sourceTree = "<group>"; }; + 2985709315CC532D006355CD /* AccessibilityNodeObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AccessibilityNodeObject.h; sourceTree = "<group>"; }; 29A309AB1561C99B00BBD8E5 /* RunLoopCF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RunLoopCF.cpp; sourceTree = "<group>"; }; 29A309AE1561CAC400BBD8E5 /* VisitedLinks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VisitedLinks.cpp; sourceTree = "<group>"; }; 29A309AF1561CAC400BBD8E5 /* VisitedLinks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VisitedLinks.h; sourceTree = "<group>"; }; @@ -8615,7 +8624,6 @@ 4F2D205312EAE7B3005C2874 /* InspectorAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorAgent.cpp; sourceTree = "<group>"; }; 4F3289B311A42AAB005ABE7E /* InspectorValues.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorValues.cpp; sourceTree = "<group>"; }; 4F3289B411A42AAB005ABE7E /* InspectorValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorValues.h; sourceTree = "<group>"; }; - 4F32BB1A14FA85AA00F6C1A3 /* MemoryInstrumentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryInstrumentation.h; sourceTree = "<group>"; }; 4F377FF415FA356A00E5D60D /* WebCoreMemoryInstrumentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebCoreMemoryInstrumentation.h; sourceTree = "<group>"; }; 4F4F5FFA11CBD2D200A186BF /* InspectorFrontend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorFrontend.cpp; sourceTree = "<group>"; }; 4F4F5FFC11CBD30100A186BF /* InspectorFrontend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorFrontend.h; sourceTree = "<group>"; }; @@ -9022,6 +9030,12 @@ 6E67D2A41280E8A4008758F7 /* Extensions3DOpenGL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Extensions3DOpenGL.cpp; sourceTree = "<group>"; }; 6E67D2A51280E8A4008758F7 /* Extensions3DOpenGL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Extensions3DOpenGL.h; sourceTree = "<group>"; }; 6E67D2A81280E8BD008758F7 /* Extensions3D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Extensions3D.h; sourceTree = "<group>"; }; + 6E8798B415F81E4A00BFE4AA /* ExclusionInterval.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExclusionInterval.cpp; sourceTree = "<group>"; }; + 6E8798B515F81E4A00BFE4AA /* ExclusionInterval.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExclusionInterval.h; sourceTree = "<group>"; }; + 6E8798B615F81E4A00BFE4AA /* ExclusionRectangle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExclusionRectangle.cpp; sourceTree = "<group>"; }; + 6E8798B715F81E4A00BFE4AA /* ExclusionRectangle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExclusionRectangle.h; sourceTree = "<group>"; }; + 6E8798B815F81E4A00BFE4AA /* ExclusionShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExclusionShape.cpp; sourceTree = "<group>"; }; + 6E8798B915F81E4A00BFE4AA /* ExclusionShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExclusionShape.h; sourceTree = "<group>"; }; 6EBC5D80138B4C4E00A0CF8A /* Float64Array.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = Float64Array.idl; path = canvas/Float64Array.idl; sourceTree = "<group>"; }; 6EBC5EAD138B50F200A0CF8A /* JSFloat64Array.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSFloat64Array.cpp; sourceTree = "<group>"; }; 6EBC5EAE138B50F200A0CF8A /* JSFloat64Array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSFloat64Array.h; sourceTree = "<group>"; }; @@ -13083,6 +13097,8 @@ C330A22113EC196B0000B45B /* ColorChooser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColorChooser.h; sourceTree = "<group>"; }; C33EE5C214FB49610002095A /* BaseClickableWithKeyInputType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BaseClickableWithKeyInputType.cpp; sourceTree = "<group>"; }; C33EE5C314FB49610002095A /* BaseClickableWithKeyInputType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseClickableWithKeyInputType.h; sourceTree = "<group>"; }; + C348612115FDE21E007A1CC9 /* InputTypeNames.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InputTypeNames.cpp; sourceTree = "<group>"; }; + C348612215FDE21E007A1CC9 /* InputTypeNames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InputTypeNames.h; sourceTree = "<group>"; }; C37CDEBC149EF2030042090D /* ColorChooserClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColorChooserClient.h; sourceTree = "<group>"; }; C3CF17A015B0063F00276D39 /* IdTargetObserver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IdTargetObserver.cpp; sourceTree = "<group>"; }; C3CF17A115B0063F00276D39 /* IdTargetObserver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IdTargetObserver.h; sourceTree = "<group>"; }; @@ -13611,8 +13627,8 @@ F523D30302DE4476018635CA /* Range.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Range.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; }; F523D30402DE4476018635CA /* Range.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = Range.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; }; F52AD5E31534245F0059FBE6 /* EmptyClients.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EmptyClients.cpp; sourceTree = "<group>"; }; - F544F78615CFB2A800AF33A8 /* NumberLocalizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NumberLocalizer.cpp; sourceTree = "<group>"; }; - F544F78715CFB2A800AF33A8 /* NumberLocalizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NumberLocalizer.h; sourceTree = "<group>"; }; + F544F78615CFB2A800AF33A8 /* Localizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Localizer.cpp; sourceTree = "<group>"; }; + F544F78715CFB2A800AF33A8 /* Localizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Localizer.h; sourceTree = "<group>"; }; F55B3D791251F12D003EF269 /* BaseTextInputType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BaseTextInputType.cpp; sourceTree = "<group>"; }; F55B3D7A1251F12D003EF269 /* BaseTextInputType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseTextInputType.h; sourceTree = "<group>"; }; F55B3D7B1251F12D003EF269 /* ButtonInputType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ButtonInputType.cpp; sourceTree = "<group>"; }; @@ -14802,6 +14818,8 @@ 76CDD2EF1103DA6600680521 /* AccessibilityMenuListPopup.h */, 29ACB213143E7498006BCA5F /* AccessibilityMockObject.cpp */, 29ACB211143E7128006BCA5F /* AccessibilityMockObject.h */, + 2985709215CC532D006355CD /* AccessibilityNodeObject.cpp */, + 2985709315CC532D006355CD /* AccessibilityNodeObject.h */, 2981CAA5131822EC00D12F2A /* AccessibilityObject.cpp */, 29A812180FBB9C1D00510293 /* AccessibilityObject.h */, A409C982116D0DDD007197BD /* AccessibilityProgressIndicator.cpp */, @@ -16028,6 +16046,9 @@ 85CA975B0A962E5400690CCF /* DOMDocumentType.mm */, 8518DCE70A9CC80C0091B7A6 /* DOMDOMImplementation.h */, 8518DCE80A9CC80D0091B7A6 /* DOMDOMImplementation.mm */, + 52CCA9E515E3F64C0053C77F /* DOMDOMNamedFlowCollection.h */, + 52CCA9E615E3F64C0053C77F /* DOMDOMNamedFlowCollection.mm */, + 52CCA9E715E3F64C0053C77F /* DOMDOMNamedFlowCollectionInternal.h */, 2D9A247015B9C29500D34527 /* DOMDOMSecurityPolicy.h */, 2D9A247215B9C2C700D34527 /* DOMDOMSecurityPolicy.mm */, 2D9A247115B9C29500D34527 /* DOMDOMSecurityPolicyInternal.h */, @@ -16053,9 +16074,6 @@ 8A19592F147EA16E00D1EA61 /* DOMWebKitNamedFlow.h */, 8A195930147EA16E00D1EA61 /* DOMWebKitNamedFlow.mm */, 8A195931147EA16E00D1EA61 /* DOMWebKitNamedFlowInternal.h */, - 52CCA9E515E3F64C0053C77F /* DOMDOMNamedFlowCollection.h */, - 52CCA9E615E3F64C0053C77F /* DOMDOMNamedFlowCollection.mm */, - 52CCA9E715E3F64C0053C77F /* DOMDOMNamedFlowCollectionInternal.h */, ); name = Core; sourceTree = "<group>"; @@ -17631,6 +17649,8 @@ F55B3D8E1251F12D003EF269 /* ImageInputType.h */, 37E3524A12450C5200BAF5D9 /* InputType.cpp */, 37E3524C12450C6600BAF5D9 /* InputType.h */, + C348612115FDE21E007A1CC9 /* InputTypeNames.cpp */, + C348612215FDE21E007A1CC9 /* InputTypeNames.h */, 450CEBEE15073BBE002BB149 /* LabelableElement.cpp */, 450CEBEF15073BBE002BB149 /* LabelableElement.h */, A456FA2411AD4A830020B420 /* LabelsNodeList.cpp */, @@ -18154,9 +18174,6 @@ A75E8B7F0E1DE2B0007F2481 /* filters */ = { isa = PBXGroup; children = ( - 7E12E90D15FA5D3A005E4126 /* CustomFilterMeshGenerator.h */, - 7E12E90E15FA5D3A005E4126 /* CustomFilterMeshGenerator.cpp */, - 509EC10815E848CA00E82581 /* CustomFilterTransformParameter.h */, 49ECEB5C1499790D00CDD3A4 /* arm */, 50D4060F147D49DE00D30BB5 /* CustomFilterCompiledProgram.cpp */, 50D40610147D49DE00D30BB5 /* CustomFilterCompiledProgram.h */, @@ -18164,6 +18181,8 @@ 50987C25157D676D00BDA835 /* CustomFilterGlobalContext.h */, 50D405F7147D31F300D30BB5 /* CustomFilterMesh.cpp */, 50D405F8147D31F300D30BB5 /* CustomFilterMesh.h */, + 7E12E90E15FA5D3A005E4126 /* CustomFilterMeshGenerator.cpp */, + 7E12E90D15FA5D3A005E4126 /* CustomFilterMeshGenerator.h */, 50CC089914C6E99C0017AB51 /* CustomFilterNumberParameter.h */, 50CC0A3814C6F5B10017AB51 /* CustomFilterOperation.cpp */, 50ACE2CA14B5D79300446666 /* CustomFilterOperation.h */, @@ -18173,6 +18192,7 @@ 503D0CA914B5B08700F32F57 /* CustomFilterProgramClient.h */, 50D88CB315BDFDAA001809F4 /* CustomFilterProgramInfo.cpp */, 50D88CB415BDFDAA001809F4 /* CustomFilterProgramInfo.h */, + 509EC10815E848CA00E82581 /* CustomFilterTransformParameter.h */, A29532CD15DD5E1700469EBC /* CustomFilterValidatedProgram.cpp */, A29532CE15DD5E1700469EBC /* CustomFilterValidatedProgram.h */, A1E1154313015C3D0054AC8C /* DistantLightSource.cpp */, @@ -18883,8 +18903,6 @@ A83B79100CCB001B000B0825 /* Core */ = { isa = PBXGroup; children = ( - 52CCA9E015E3F62C0053C77F /* JSDOMNamedFlowCollection.cpp */, - 52CCA9E115E3F62C0053C77F /* JSDOMNamedFlowCollection.h */, 65DF31D809D1C122000BE325 /* JSAttr.cpp */, 65DF31D909D1C123000BE325 /* JSAttr.h */, 93F9B79E0BA6032600854064 /* JSCDATASection.cpp */, @@ -18911,6 +18929,8 @@ BC60D7BF0D29A46300B9918F /* JSDOMCoreException.h */, 65DF31E309D1CC60000BE325 /* JSDOMImplementation.cpp */, 65DF31E409D1CC60000BE325 /* JSDOMImplementation.h */, + 52CCA9E015E3F62C0053C77F /* JSDOMNamedFlowCollection.cpp */, + 52CCA9E115E3F62C0053C77F /* JSDOMNamedFlowCollection.h */, C5137CF011A58378004ADB99 /* JSDOMStringList.cpp */, C5137CF111A58378004ADB99 /* JSDOMStringList.h */, BC64649511D82349006455B0 /* JSDOMStringMap.cpp */, @@ -19878,8 +19898,8 @@ 144FCFDE14EF2509000D17A3 /* FractionalLayoutRect.cpp */, 144FCFDF14EF2509000D17A3 /* FractionalLayoutRect.h */, 144FCE5814EC79E7000D17A3 /* FractionalLayoutSize.h */, - BC23F0DA0DAFF4A4009FDC91 /* GeneratedImage.h */, 4FB390AC15EF61F3007AD51F /* GeneratedImage.cpp */, + BC23F0DA0DAFF4A4009FDC91 /* GeneratedImage.h */, BCE04C890DAFF7A0007A0F41 /* Generator.h */, 2D2FC0561460CD6F00263633 /* GeneratorGeneratedImage.cpp */, 2D2FC0571460CD6F00263633 /* GeneratorGeneratedImage.h */, @@ -19994,8 +20014,8 @@ A5732B0C136A16C4005C8D7C /* LocalizedDate.h */, A5732B0E136A1715005C8D7C /* LocalizedDateNone.cpp */, F5142C68123F12B000F5BD4C /* LocalizedNumber.h */, - F544F78615CFB2A800AF33A8 /* NumberLocalizer.cpp */, - F544F78715CFB2A800AF33A8 /* NumberLocalizer.h */, + F544F78615CFB2A800AF33A8 /* Localizer.cpp */, + F544F78715CFB2A800AF33A8 /* Localizer.h */, BC76AC110DD7AD5C00415F34 /* ParserUtilities.h */, 379E371413736A6600B9E919 /* QuotedPrintable.cpp */, 379E371513736A6600B9E919 /* QuotedPrintable.h */, @@ -21056,9 +21076,9 @@ F523D18402DE42E8018635CA /* css */ = { isa = PBXGroup; children = ( + 93CA4C9C09DF93FA00DF8677 /* maketokenizer */, FBD6AF8415EF21D4008B7110 /* BasicShapeFunctions.cpp */, FBD6AF8515EF21D4008B7110 /* BasicShapeFunctions.h */, - 93CA4C9C09DF93FA00DF8677 /* maketokenizer */, A80E6CDA0A1989CA007FB8C5 /* Counter.h */, 930705C709E0C95F00B17FE4 /* Counter.idl */, CAE9F90D146441F000C245B0 /* CSSAspectRatioValue.cpp */, @@ -21305,6 +21325,12 @@ 9392F14B0AD1861B00691BD4 /* CounterNode.h */, A8CFF6CA0A1561CD000A4234 /* EllipsisBox.cpp */, A8CFF6BD0A156118000A4234 /* EllipsisBox.h */, + 6E8798B415F81E4A00BFE4AA /* ExclusionInterval.cpp */, + 6E8798B515F81E4A00BFE4AA /* ExclusionInterval.h */, + 6E8798B615F81E4A00BFE4AA /* ExclusionRectangle.cpp */, + 6E8798B715F81E4A00BFE4AA /* ExclusionRectangle.h */, + 6E8798B815F81E4A00BFE4AA /* ExclusionShape.cpp */, + 6E8798B915F81E4A00BFE4AA /* ExclusionShape.h */, 31313F631443B35E006E2A90 /* FilterEffectRenderer.cpp */, 31313F641443B35E006E2A90 /* FilterEffectRenderer.h */, A8CFF0480A154F09000A4234 /* FixedTableLayout.cpp */, @@ -21526,9 +21552,6 @@ F523D32402DE4478018635CA /* dom */ = { isa = PBXGroup; children = ( - 52B6C9BF15E3F4DF00690B05 /* DOMNamedFlowCollection.idl */, - 52B6C9C015E3F4DF00690B05 /* NamedFlowCollection.cpp */, - 52B6C9C115E3F4DF00690B05 /* NamedFlowCollection.h */, E1C4DE6D0EA75C650023CCD6 /* ActiveDOMObject.cpp */, E1C4DE680EA75C1E0023CCD6 /* ActiveDOMObject.h */, A8C4A7FC09D563270003AC8D /* Attr.cpp */, @@ -21644,6 +21667,7 @@ 93EEC1E909C2877700C515D1 /* DOMImplementation.idl */, 52B6C9BD15E3F4DF00690B05 /* DOMNamedFlowCollection.cpp */, 52B6C9BE15E3F4DF00690B05 /* DOMNamedFlowCollection.h */, + 52B6C9BF15E3F4DF00690B05 /* DOMNamedFlowCollection.idl */, C55610F011A704EB00B82D27 /* DOMStringList.cpp */, C544274911A57E7A0063A749 /* DOMStringList.h */, C544274A11A57E7A0063A749 /* DOMStringList.idl */, @@ -21722,7 +21746,6 @@ BC9A6144146859D9006057FD /* make_dom_exceptions.pl */, BC9A6145146859D9006057FD /* make_event_factory.pl */, BC9A6146146859D9006057FD /* make_names.pl */, - 4F32BB1A14FA85AA00F6C1A3 /* MemoryInstrumentation.h */, E1ADECCD0E76AD8B004A1A5E /* MessageChannel.cpp */, E1ADECCC0E76AD8B004A1A5E /* MessageChannel.h */, E1ADECD00E76ADAB004A1A5E /* MessageChannel.idl */, @@ -21756,6 +21779,8 @@ C6F08FB91430FE8F00685849 /* MutationRecord.cpp */, C6F08FBA1430FE8F00685849 /* MutationRecord.h */, C6F08FBB1430FE8F00685849 /* MutationRecord.idl */, + 52B6C9C015E3F4DF00690B05 /* NamedFlowCollection.cpp */, + 52B6C9C115E3F4DF00690B05 /* NamedFlowCollection.h */, BCF34A3611A231CD00C71804 /* NamedNodeMap.cpp */, A81872180977D3C0005826D9 /* NamedNodeMap.h */, 85ACA9F90A9B631000671E90 /* NamedNodeMap.idl */, @@ -22347,6 +22372,8 @@ C33EE5C514FB49610002095A /* BaseClickableWithKeyInputType.h in Headers */, F59C96001255B23F000623C0 /* BaseDateAndTimeInputType.h in Headers */, F55B3DAE1251F12D003EF269 /* BaseTextInputType.h in Headers */, + FBD6AF8A15EF25DF008B7110 /* BasicShapeFunctions.h in Headers */, + FBD6AF8C15EF2604008B7110 /* BasicShapes.h in Headers */, BC9462D8107A7B4C00857193 /* BeforeLoadEvent.h in Headers */, AB23A32809BBA7D00067CC53 /* BeforeTextInsertedEvent.h in Headers */, 85031B3D0A44EFC700F992E0 /* BeforeUnloadEvent.h in Headers */, @@ -22492,6 +22519,7 @@ E169803D1133542D00894115 /* CRuntimeObject.h in Headers */, 975CA28B130365F800E99AD9 /* Crypto.h in Headers */, CAE9F910146441F000C245B0 /* CSSAspectRatioValue.h in Headers */, + FBD6AF8815EF25C9008B7110 /* CSSBasicShapes.h in Headers */, E16A84FA14C85CCC002977DF /* CSSBorderImage.h in Headers */, BC274B2F140EBEB200EADFA6 /* CSSBorderImageSliceValue.h in Headers */, 49AE2D8F134EE50C0072920A /* CSSCalculationValue.h in Headers */, @@ -22556,6 +22584,7 @@ 50D40612147D49DE00D30BB5 /* CustomFilterCompiledProgram.h in Headers */, 50987C27157D676D00BDA835 /* CustomFilterGlobalContext.h in Headers */, 50D405FA147D31F300D30BB5 /* CustomFilterMesh.h in Headers */, + 7E12E90F15FA5D3A005E4126 /* CustomFilterMeshGenerator.h in Headers */, 50CC089A14C6E99C0017AB51 /* CustomFilterNumberParameter.h in Headers */, 50ACE2CB14B5D79300446666 /* CustomFilterOperation.h in Headers */, 509CC9FB14C069ED00BBECBD /* CustomFilterParameter.h in Headers */, @@ -23332,6 +23361,9 @@ 148AFDA50AF58360008CC700 /* ExceptionHandlers.h in Headers */, 9767CE0B145ABC13005E64DB /* ExceptionHeaders.h in Headers */, 9767CE0C145ABC13005E64DB /* ExceptionInterfaces.h in Headers */, + 6E8798BB15F81E4A00BFE4AA /* ExclusionInterval.h in Headers */, + 6E8798BD15F81E4A00BFE4AA /* ExclusionRectangle.h in Headers */, + 6E8798BF15F81E4A00BFE4AA /* ExclusionShape.h in Headers */, 6E67D2A91280E8BD008758F7 /* Extensions3D.h in Headers */, 6E67D2A71280E8A4008758F7 /* Extensions3DOpenGL.h in Headers */, 44DAB5B215A623580097C1E4 /* Extensions3DOpenGLCommon.h in Headers */, @@ -23709,6 +23741,7 @@ BCE789161120D6080060ECE5 /* InlineIterator.h in Headers */, BCEA485A097D93020094C9E4 /* InlineTextBox.h in Headers */, 37E3524D12450C6600BAF5D9 /* InputType.h in Headers */, + C348612415FDE21E007A1CC9 /* InputTypeNames.h in Headers */, 93309DEA099E64920056E581 /* InsertIntoTextNodeCommand.h in Headers */, 57CF497514EE36D700ECFF14 /* InsertionPoint.h in Headers */, 93309DEC099E64920056E581 /* InsertLineBreakCommand.h in Headers */, @@ -23861,9 +23894,9 @@ 2E0888D51148848A00AF4265 /* JSDOMFormData.h in Headers */, E1C36C030EB076D6007410BC /* JSDOMGlobalObject.h in Headers */, 65DF31F809D1CC60000BE325 /* JSDOMImplementation.h in Headers */, - 52CCA9E315E3F62C0053C77F /* JSDOMNamedFlowCollection.h in Headers */, A9D248070D757E7D00FDF959 /* JSDOMMimeType.h in Headers */, A9D248090D757E7D00FDF959 /* JSDOMMimeTypeArray.h in Headers */, + 52CCA9E315E3F62C0053C77F /* JSDOMNamedFlowCollection.h in Headers */, 1ACE53E00A8D18810022947D /* JSDOMParser.h in Headers */, A9D247FF0D757E6900FDF959 /* JSDOMPlugin.h in Headers */, A9D248010D757E6900FDF959 /* JSDOMPluginArray.h in Headers */, @@ -24333,6 +24366,7 @@ 2D9066070BE141D400956998 /* LayoutState.h in Headers */, D630E2AC149BF344005B2F93 /* LayoutTestSupport.h in Headers */, BACF290113B2A0D500781F90 /* LayoutTypes.h in Headers */, + 31B801BB15EC58C700CE643D /* LayoutTypesInlineMethods.h in Headers */, 512DD8F50D91E6AF000F89EE /* LegacyWebArchive.h in Headers */, BCE65BEB0EACDF16007E4533 /* Length.h in Headers */, BCFF64910EAD15C200C1D6F7 /* LengthBox.h in Headers */, @@ -24363,6 +24397,7 @@ A5732B0D136A16C4005C8D7C /* LocalizedDate.h in Headers */, F5142C69123F12B000F5BD4C /* LocalizedNumber.h in Headers */, 935207BE09BD410A00F2038D /* LocalizedStrings.h in Headers */, + F544F78915CFB2A800AF33A8 /* Localizer.h in Headers */, BCE1C41B0D982980003B02F2 /* Location.h in Headers */, A8239E0109B3CF8A00B60641 /* Logging.h in Headers */, 656D37410ADBA5DE00A4554D /* MainResourceLoader.h in Headers */, @@ -24406,7 +24441,6 @@ FD671A78159BB07000197559 /* MediaStreamAudioSourceNode.h in Headers */, BCB16C180979C3BD00467741 /* MemoryCache.h in Headers */, 9FFE3E7B11B59C5D0037874E /* MemoryInfo.h in Headers */, - 4F32BB1B14FA85E800F6C1A3 /* MemoryInstrumentation.h in Headers */, 4F8565EA1530356E00FAE776 /* MemoryInstrumentationImpl.h in Headers */, 6571DCC81385E6A400702DD0 /* MemoryPressureHandler.h in Headers */, D630E2AC149BF344005B2F95 /* MemoryUsageSupport.h in Headers */, @@ -24480,7 +24514,6 @@ 1A927FD41416A15B003A83C8 /* nptypes.h in Headers */, 93500F3213FDE3BE0099EC24 /* NSScrollerImpDetails.h in Headers */, F55B3DC81251F12D003EF269 /* NumberInputType.h in Headers */, - F544F78915CFB2A800AF33A8 /* NumberLocalizer.h in Headers */, 1A569D120D7E2B82007C3983 /* objc_class.h in Headers */, 1A569D140D7E2B82007C3983 /* objc_header.h in Headers */, 1A569D150D7E2B82007C3983 /* objc_instance.h in Headers */, @@ -24518,6 +24551,7 @@ E1284AE110447D4500EAEB52 /* PageTransitionEvent.h in Headers */, 51E1ECC30C91C90400DC255B /* PageURLRecord.h in Headers */, FFD5B97B135CC97800D5E92A /* PageVisibilityState.h in Headers */, + 9377ABA015DEFEEF0031FD04 /* Pagination.h in Headers */, 0885067F11DA045B00182B98 /* PaintInfo.h in Headers */, 0885068011DA045B00182B98 /* PaintPhase.h in Headers */, A80E6CFB0A1989CA007FB8C5 /* Pair.h in Headers */, @@ -24635,6 +24669,7 @@ 9392F1420AD185F400691BD4 /* RenderCounter.h in Headers */, BCEA486E097D93020094C9E4 /* RenderDeprecatedFlexibleBox.h in Headers */, D302754A12A5FE84004BD828 /* RenderDetailsMarker.h in Headers */, + 76F2E2EC15F74CEF005FF664 /* RenderDialog.h in Headers */, A76E5F7F135E0DCF00A69837 /* RenderedDocumentMarker.h in Headers */, 9B32CDA913DF7FA900F34D13 /* RenderedPosition.h in Headers */, 0F5B7A5510F65D7A00376302 /* RenderEmbeddedObject.h in Headers */, @@ -24838,6 +24873,7 @@ 0FE71406142170B800DB33BA /* ScrollbarThemeMock.h in Headers */, 5D925B680F64D4DD00B847F0 /* ScrollBehavior.h in Headers */, 1AA84F05143BA7BD0051D153 /* ScrollElasticityController.h in Headers */, + 0F605AED15F94848004DF0C0 /* ScrollingConstraints.h in Headers */, 1AF62EE814DA22A70041556C /* ScrollingCoordinator.h in Headers */, 1AF62F2614DAFEA10041556C /* ScrollingThread.h in Headers */, 1AAADDA414DB409F00AF64B3 /* ScrollingTree.h in Headers */, @@ -25355,6 +25391,7 @@ CD127DEE14F3098400E84779 /* WebCoreFullScreenWindow.h in Headers */, BC53D911114310CC000D817E /* WebCoreJSClientData.h in Headers */, 93F199BB08245E59001E9ABC /* WebCoreKeyboardUIMode.h in Headers */, + 4F377FF515FA356A00E5D60D /* WebCoreMemoryInstrumentation.h in Headers */, 371941971566B37200A276D8 /* WebCoreNSCellExtras.h in Headers */, 934D9BA70B8C1175007B42A9 /* WebCoreNSStringExtras.h in Headers */, C5B4C24D1509236C00A6EF37 /* WebCoreNSURLExtras.h in Headers */, @@ -25468,6 +25505,7 @@ 93309E24099E64920056E581 /* WrapContentsInDummySpanCommand.h in Headers */, FD748AC015BF74ED0059CF0D /* WrapShapeInfo.h in Headers */, 9BAF3B2412C1A39800014BF1 /* WritingDirection.h in Headers */, + 14476AA815DC4BB100305DB2 /* WritingMode.h in Headers */, 6565820209D1508D000E61D7 /* XLinkNames.h in Headers */, 00D0464B13C4D14500326FCC /* XMLCharacterReferenceParser.h in Headers */, 00B9318813BA8DBA0035A948 /* XMLDocumentParser.h in Headers */, @@ -25508,16 +25546,6 @@ E1BE512E0CF6C512002EA959 /* XSLTUnicodeSort.h in Headers */, 977E2E0F12F0FC9C00C13379 /* XSSAuditor.h in Headers */, FD537353137B651800008DCE /* ZeroPole.h in Headers */, - 9377ABA015DEFEEF0031FD04 /* Pagination.h in Headers */, - 14476AA815DC4BB100305DB2 /* WritingMode.h in Headers */, - 31B801BB15EC58C700CE643D /* LayoutTypesInlineMethods.h in Headers */, - FBD6AF8815EF25C9008B7110 /* CSSBasicShapes.h in Headers */, - FBD6AF8A15EF25DF008B7110 /* BasicShapeFunctions.h in Headers */, - FBD6AF8C15EF2604008B7110 /* BasicShapes.h in Headers */, - 76F2E2EC15F74CEF005FF664 /* RenderDialog.h in Headers */, - 0F605AED15F94848004DF0C0 /* ScrollingConstraints.h in Headers */, - 4F377FF515FA356A00E5D60D /* WebCoreMemoryInstrumentation.h in Headers */, - 7E12E90F15FA5D3A005E4126 /* CustomFilterMeshGenerator.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -25964,6 +25992,8 @@ C33EE5C414FB49610002095A /* BaseClickableWithKeyInputType.cpp in Sources */, F59C95FF1255B23F000623C0 /* BaseDateAndTimeInputType.cpp in Sources */, F55B3DAD1251F12D003EF269 /* BaseTextInputType.cpp in Sources */, + FBD6AF8915EF25DB008B7110 /* BasicShapeFunctions.cpp in Sources */, + FBD6AF8D15EF260A008B7110 /* BasicShapes.cpp in Sources */, AB23A32709BBA7D00067CC53 /* BeforeTextInsertedEvent.cpp in Sources */, 85031B3C0A44EFC700F992E0 /* BeforeUnloadEvent.cpp in Sources */, B2C3DA230D006C1D00EF6F26 /* BidiContext.cpp in Sources */, @@ -25976,6 +26006,7 @@ FDC54F041399B0DA008D9117 /* BiquadFilterNode.cpp in Sources */, FD31602612B0267600C1A359 /* BiquadProcessor.cpp in Sources */, A89943290B42338800D7C802 /* BitmapImage.cpp in Sources */, + 377A3A9015EFCE9B0059F5C7 /* BitmapImageCG.cpp in Sources */, 976D6C78122B8A3D001FD1F7 /* Blob.cpp in Sources */, 2EDEF1F3121B0EFC00726DB2 /* BlobData.cpp in Sources */, 2EDEF1F6121B0EFC00726DB2 /* BlobRegistryImpl.cpp in Sources */, @@ -26080,6 +26111,7 @@ E16980491133644700894115 /* CRuntimeObject.cpp in Sources */, 975CA28A130365F800E99AD9 /* Crypto.cpp in Sources */, CAE9F90F146441F000C245B0 /* CSSAspectRatioValue.cpp in Sources */, + FBD6AF8B15EF25E5008B7110 /* CSSBasicShapes.cpp in Sources */, E16A84F914C85CCC002977DF /* CSSBorderImage.cpp in Sources */, BC274B31140EBED800EADFA6 /* CSSBorderImageSliceValue.cpp in Sources */, 49AE2D8E134EE50C0072920A /* CSSCalculationValue.cpp in Sources */, @@ -26136,6 +26168,7 @@ 50D40611147D49DE00D30BB5 /* CustomFilterCompiledProgram.cpp in Sources */, 50987C26157D676D00BDA835 /* CustomFilterGlobalContext.cpp in Sources */, 50D405F9147D31F300D30BB5 /* CustomFilterMesh.cpp in Sources */, + 7E12E91015FA5D3A005E4126 /* CustomFilterMeshGenerator.cpp in Sources */, 50CC0A3914C6F5B10017AB51 /* CustomFilterOperation.cpp in Sources */, 503D0CAA14B5B08700F32F57 /* CustomFilterProgram.cpp in Sources */, 50D88CB515BDFDAA001809F4 /* CustomFilterProgramInfo.cpp in Sources */, @@ -26236,6 +26269,7 @@ 85089CDC0A98C42800A275AA /* DOMDocumentFragment.mm in Sources */, 85CA975D0A962E5400690CCF /* DOMDocumentType.mm in Sources */, 8518DCEA0A9CC80D0091B7A6 /* DOMDOMImplementation.mm in Sources */, + 52CCA9E915E3F64C0053C77F /* DOMDOMNamedFlowCollection.mm in Sources */, 2D9A247315B9C2D100D34527 /* DOMDOMSecurityPolicy.mm in Sources */, 7694565C1214DB630007CBAE /* DOMDOMTokenList.mm in Sources */, 7AABA25914BC613300AA9A11 /* DOMEditor.cpp in Sources */, @@ -26327,6 +26361,7 @@ A9C6E4E70D745E18006442E9 /* DOMMimeTypeArray.cpp in Sources */, 857E0B260AB043460036E447 /* DOMMouseEvent.mm in Sources */, 85C7F5C00AAFB7CD004014DD /* DOMMutationEvent.mm in Sources */, + 52B6C9C215E3F4DF00690B05 /* DOMNamedFlowCollection.cpp in Sources */, 8518DD790A9CF31B0091B7A6 /* DOMNamedNodeMap.mm in Sources */, 853BF4DC0ABB6B55008647BB /* DOMNode.mm in Sources */, 85526C380AB0A17E000302EA /* DOMNodeIterator.mm in Sources */, @@ -26578,6 +26613,9 @@ 973DC63F145A9409002842C2 /* ExceptionCodeDescription.cpp in Sources */, A7CACDB113CE875C00BBBE3F /* ExceptionCodePlaceholder.cpp in Sources */, 148AFDA60AF58360008CC700 /* ExceptionHandlers.mm in Sources */, + 6E8798BA15F81E4A00BFE4AA /* ExclusionInterval.cpp in Sources */, + 6E8798BC15F81E4A00BFE4AA /* ExclusionRectangle.cpp in Sources */, + 6E8798BE15F81E4A00BFE4AA /* ExclusionShape.cpp in Sources */, 6E67D2A61280E8A4008758F7 /* Extensions3DOpenGL.cpp in Sources */, 44DAB5B115A623580097C1E4 /* Extensions3DOpenGLCommon.cpp in Sources */, 7728694E14F8882500F484DC /* EXTTextureFilterAnisotropic.cpp in Sources */, @@ -26686,6 +26724,7 @@ 97205AAF123928CA00B17380 /* FTPDirectoryDocument.cpp in Sources */, 51C81B890C4422F70019ECE3 /* FTPDirectoryParser.cpp in Sources */, 1432E8490C51493F00B1500F /* GCController.cpp in Sources */, + 4FB390AD15EF61F3007AD51F /* GeneratedImage.cpp in Sources */, 2D481F03146B5C6500AA7834 /* GeneratorGeneratedImage.cpp in Sources */, 0720B0A014D3323500642955 /* GenericEventQueue.cpp in Sources */, 9746AF2314F4DDE6003E7A70 /* Geolocation.cpp in Sources */, @@ -26905,6 +26944,7 @@ A8CFF5E40A155A05000A4234 /* InlineFlowBox.cpp in Sources */, BCEA4859097D93020094C9E4 /* InlineTextBox.cpp in Sources */, 37E3524B12450C5200BAF5D9 /* InputType.cpp in Sources */, + C348612315FDE21E007A1CC9 /* InputTypeNames.cpp in Sources */, 93309DE9099E64920056E581 /* InsertIntoTextNodeCommand.cpp in Sources */, 57CF497414EE36D700ECFF14 /* InsertionPoint.cpp in Sources */, 93309DEB099E64920056E581 /* InsertLineBreakCommand.cpp in Sources */, @@ -27082,6 +27122,7 @@ A9D248060D757E7D00FDF959 /* JSDOMMimeType.cpp in Sources */, A9D248080D757E7D00FDF959 /* JSDOMMimeTypeArray.cpp in Sources */, A9C6E6470D7465CA006442E9 /* JSDOMMimeTypeArrayCustom.cpp in Sources */, + 52CCA9E215E3F62C0053C77F /* JSDOMNamedFlowCollection.cpp in Sources */, 1ACE53DF0A8D18810022947D /* JSDOMParser.cpp in Sources */, A9D247FE0D757E6900FDF959 /* JSDOMPlugin.cpp in Sources */, A9D248000D757E6900FDF959 /* JSDOMPluginArray.cpp in Sources */, @@ -27669,6 +27710,7 @@ F5CC42DC12F801CA00D5F7E3 /* LocalizedNumberMac.mm in Sources */, C046E1AC1208A9FE00BA2CF7 /* LocalizedStrings.cpp in Sources */, BC25B52A131C6D3900180E10 /* LocalizedStringsMac.cpp in Sources */, + F544F78815CFB2A800AF33A8 /* Localizer.cpp in Sources */, BCE1C41C0D982981003B02F2 /* Location.cpp in Sources */, A8239E0009B3CF8A00B60641 /* Logging.cpp in Sources */, 1402645E0AFDC19B005919E2 /* LoggingMac.mm in Sources */, @@ -27736,6 +27778,7 @@ D6E528A3149A926D00EFE1F3 /* MutationObserverInterestGroup.cpp in Sources */, D6E276AF14637455001D280A /* MutationObserverRegistration.cpp in Sources */, C6F08FBC1430FE8F00685849 /* MutationRecord.cpp in Sources */, + 52B6C9C515E3F4DF00690B05 /* NamedFlowCollection.cpp in Sources */, BCF34A3711A231CD00C71804 /* NamedNodeMap.cpp in Sources */, A81872240977D3C0005826D9 /* NameNodeList.cpp in Sources */, E10B9B6D0B747599003ED890 /* NativeXPathNSResolver.cpp in Sources */, @@ -27763,7 +27806,6 @@ 1A569D0D0D7E2B82007C3983 /* npruntime.cpp in Sources */, 52F52E1114A0134F00ACC397 /* NSScrollerImpDetails.mm in Sources */, F55B3DC71251F12D003EF269 /* NumberInputType.cpp in Sources */, - F544F78815CFB2A800AF33A8 /* NumberLocalizer.cpp in Sources */, 1A569D130D7E2B82007C3983 /* objc_class.mm in Sources */, 1A569D160D7E2B82007C3983 /* objc_instance.mm in Sources */, 1A569D180D7E2B82007C3983 /* objc_runtime.mm in Sources */, @@ -27880,6 +27922,7 @@ 9392F1440AD185FE00691BD4 /* RenderCounter.cpp in Sources */, BCEA486D097D93020094C9E4 /* RenderDeprecatedFlexibleBox.cpp in Sources */, D302754912A5FE84004BD828 /* RenderDetailsMarker.cpp in Sources */, + 76F2E2EB15F74CEF005FF664 /* RenderDialog.cpp in Sources */, 9B32CDAA13DF7FA900F34D13 /* RenderedPosition.cpp in Sources */, 0F5B7A5410F65D7A00376302 /* RenderEmbeddedObject.cpp in Sources */, A8EA73C30A1900E300A8EF5F /* RenderFieldset.cpp in Sources */, @@ -28044,6 +28087,7 @@ 0FE71405142170B800DB33BA /* ScrollbarThemeMock.cpp in Sources */, 5D925B670F64D4DD00B847F0 /* ScrollBehavior.cpp in Sources */, 1AA84F04143BA7BD0051D153 /* ScrollElasticityController.mm in Sources */, + 0F605AEC15F94848004DF0C0 /* ScrollingConstraints.cpp in Sources */, 1AF62EE714DA22A70041556C /* ScrollingCoordinator.cpp in Sources */, 1AF62EE614DA22A70041556C /* ScrollingCoordinatorMac.mm in Sources */, 3866AF3814F1C17100283D68 /* ScrollingCoordinatorNone.cpp in Sources */, @@ -28371,6 +28415,7 @@ CE7B2DB61586ABAD0098B3FA /* TextAlternativeWithRange.mm in Sources */, 372C00C4129611F1005C9575 /* TextBoundaries.cpp in Sources */, B2AFFC970D00A5DF0030074D /* TextBoundaries.mm in Sources */, + BCD8A5F015F56F2C0098D071 /* TextBreakIterator.cpp in Sources */, B2C3DA370D006C1D00EF6F26 /* TextBreakIteratorICU.cpp in Sources */, B2AFFC980D00A5DF0030074D /* TextBreakIteratorInternalICUMac.mm in Sources */, A7DBF8DD1276919C006B6008 /* TextCheckingHelper.cpp in Sources */, @@ -28598,19 +28643,6 @@ E1BE512D0CF6C512002EA959 /* XSLTUnicodeSort.cpp in Sources */, 977E2E0E12F0FC9C00C13379 /* XSSAuditor.cpp in Sources */, FD537352137B651800008DCE /* ZeroPole.cpp in Sources */, - 52B6C9C215E3F4DF00690B05 /* DOMNamedFlowCollection.cpp in Sources */, - 52B6C9C515E3F4DF00690B05 /* NamedFlowCollection.cpp in Sources */, - 52CCA9E215E3F62C0053C77F /* JSDOMNamedFlowCollection.cpp in Sources */, - 52CCA9E915E3F64C0053C77F /* DOMDOMNamedFlowCollection.mm in Sources */, - FBD6AF8915EF25DB008B7110 /* BasicShapeFunctions.cpp in Sources */, - FBD6AF8B15EF25E5008B7110 /* CSSBasicShapes.cpp in Sources */, - FBD6AF8D15EF260A008B7110 /* BasicShapes.cpp in Sources */, - 4FB390AD15EF61F3007AD51F /* GeneratedImage.cpp in Sources */, - 377A3A9015EFCE9B0059F5C7 /* BitmapImageCG.cpp in Sources */, - BCD8A5F015F56F2C0098D071 /* TextBreakIterator.cpp in Sources */, - 76F2E2EB15F74CEF005FF664 /* RenderDialog.cpp in Sources */, - 0F605AEC15F94848004DF0C0 /* ScrollingConstraints.cpp in Sources */, - 7E12E91015FA5D3A005E4126 /* CustomFilterMeshGenerator.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Source/WebCore/accessibility/AccessibilityObject.h b/Source/WebCore/accessibility/AccessibilityObject.h index ca63f3f1d..9e4181212 100644 --- a/Source/WebCore/accessibility/AccessibilityObject.h +++ b/Source/WebCore/accessibility/AccessibilityObject.h @@ -144,6 +144,7 @@ enum AccessibilityRole { LandmarkMainRole, LandmarkNavigationRole, LandmarkSearchRole, + LegendRole, LinkRole, ListRole, ListBoxRole, diff --git a/Source/WebCore/accessibility/AccessibilityRenderObject.cpp b/Source/WebCore/accessibility/AccessibilityRenderObject.cpp index 87e2f8179..4f295b354 100644 --- a/Source/WebCore/accessibility/AccessibilityRenderObject.cpp +++ b/Source/WebCore/accessibility/AccessibilityRenderObject.cpp @@ -3192,6 +3192,8 @@ AccessibilityRole AccessibilityRenderObject::determineAccessibilityRole() return ListMarkerRole; if (node && node->hasTagName(buttonTag)) return buttonRoleType(); + if (node && node->hasTagName(legendTag)) + return LegendRole; if (m_renderer->isText()) return StaticTextRole; if (cssBox && cssBox->isImage()) { diff --git a/Source/WebCore/accessibility/gtk/AccessibilityObjectAtk.cpp b/Source/WebCore/accessibility/gtk/AccessibilityObjectAtk.cpp index 4cf6979bb..42cf02ed5 100644 --- a/Source/WebCore/accessibility/gtk/AccessibilityObjectAtk.cpp +++ b/Source/WebCore/accessibility/gtk/AccessibilityObjectAtk.cpp @@ -89,7 +89,7 @@ AccessibilityObjectInclusion AccessibilityObject::accessibilityPlatformIncludesO return DefaultBehavior; child = child->firstChild(); - if (child->isLink() || !child->firstAnonymousBlockChild()) + if (child && (child->isLink() || !child->firstAnonymousBlockChild())) return IncludeObject; } diff --git a/Source/WebCore/accessibility/gtk/WebKitAccessibleWrapperAtk.cpp b/Source/WebCore/accessibility/gtk/WebKitAccessibleWrapperAtk.cpp index ec990376f..ec223aa02 100644 --- a/Source/WebCore/accessibility/gtk/WebKitAccessibleWrapperAtk.cpp +++ b/Source/WebCore/accessibility/gtk/WebKitAccessibleWrapperAtk.cpp @@ -99,6 +99,15 @@ static const gchar* webkitAccessibleGetName(AtkObject* object) if (!coreObject->isAccessibilityRenderObject()) return returnString(coreObject->stringValue()); + if (coreObject->isFieldset()) { + AccessibilityObject* label = coreObject->titleUIElement(); + if (label) { + AtkObject* atkObject = label->wrapper(); + if (ATK_IS_TEXT(atkObject)) + return atk_text_get_text(ATK_TEXT(atkObject), 0, -1); + } + } + if (coreObject->isControl()) { AccessibilityObject* label = coreObject->correspondingLabelForControlElement(); if (label) { @@ -166,6 +175,23 @@ static const gchar* webkitAccessibleGetDescription(AtkObject* object) static void setAtkRelationSetFromCoreObject(AccessibilityObject* coreObject, AtkRelationSet* relationSet) { + if (coreObject->isFieldset()) { + AccessibilityObject* label = coreObject->titleUIElement(); + if (label) + atk_relation_set_add_relation_by_type(relationSet, ATK_RELATION_LABELLED_BY, label->wrapper()); + return; + } + + if (coreObject->roleValue() == LegendRole) { + for (AccessibilityObject* parent = coreObject->parentObjectUnignored(); parent; parent = parent->parentObjectUnignored()) { + if (parent->isFieldset()) { + atk_relation_set_add_relation_by_type(relationSet, ATK_RELATION_LABEL_FOR, parent->wrapper()); + break; + } + } + return; + } + if (coreObject->isControl()) { AccessibilityObject* label = coreObject->correspondingLabelForControlElement(); if (label) @@ -519,6 +545,7 @@ static AtkRole atkRole(AccessibilityRole role) case ParagraphRole: return ATK_ROLE_PARAGRAPH; case LabelRole: + case LegendRole: return ATK_ROLE_LABEL; case DivRole: return ATK_ROLE_SECTION; diff --git a/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm b/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm index b509dacd1..26c7aae27 100644 --- a/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm +++ b/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapper.mm @@ -1579,7 +1579,8 @@ static const AccessibilityRoleMap& createAccessibilityRoleMap() { SpinButtonRole, NSAccessibilityIncrementorRole }, { FooterRole, NSAccessibilityGroupRole }, { ToggleButtonRole, NSAccessibilityButtonRole }, - { CanvasRole, NSAccessibilityImageRole } + { CanvasRole, NSAccessibilityImageRole }, + { LegendRole, NSAccessibilityGroupRole } }; AccessibilityRoleMap& roleMap = *new AccessibilityRoleMap; diff --git a/Source/WebCore/bindings/js/BindingState.h b/Source/WebCore/bindings/js/BindingState.h index 9270604d3..0dbabff78 100644 --- a/Source/WebCore/bindings/js/BindingState.h +++ b/Source/WebCore/bindings/js/BindingState.h @@ -44,10 +44,6 @@ typedef JSC::ExecState BindingState; DOMWindow* activeDOMWindow(BindingState*); DOMWindow* firstDOMWindow(BindingState*); -// FIXME: Implement these functions. -inline Frame* activeFrame(BindingState*) { return 0; } -inline Frame* firstFrame(BindingState*) { return 0; } - } #endif diff --git a/Source/WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp b/Source/WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp index 026b1ae1d..fb92cedc9 100644 --- a/Source/WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp +++ b/Source/WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp @@ -94,11 +94,11 @@ void JSCanvasRenderingContext2D::setFillStyle(ExecState* exec, JSValue value) JSValue JSCanvasRenderingContext2D::webkitLineDash(ExecState* exec) const { CanvasRenderingContext2D* context = static_cast<CanvasRenderingContext2D*>(impl()); - const DashArray* dash = context->webkitLineDash(); + const Vector<float>& dash = context->getLineDash(); MarkedArgumentBuffer list; - DashArray::const_iterator end = dash->end(); - for (DashArray::const_iterator it = dash->begin(); it != end; ++it) + Vector<float>::const_iterator end = dash.end(); + for (Vector<float>::const_iterator it = dash.begin(); it != end; ++it) list.append(JSValue(*it)); return constructArray(exec, globalObject(), list); } @@ -108,7 +108,7 @@ void JSCanvasRenderingContext2D::setWebkitLineDash(ExecState* exec, JSValue valu if (!isJSArray(value)) return; - DashArray dash; + Vector<float> dash; JSArray* valueArray = asArray(value); for (unsigned i = 0; i < valueArray->length(); ++i) { float elem = valueArray->getIndex(i).toFloat(exec); diff --git a/Source/WebCore/bindings/js/JSDOMBinding.h b/Source/WebCore/bindings/js/JSDOMBinding.h index 009b27c3a..acfb0d849 100644 --- a/Source/WebCore/bindings/js/JSDOMBinding.h +++ b/Source/WebCore/bindings/js/JSDOMBinding.h @@ -375,6 +375,15 @@ enum ParameterDefaultPolicy { } }; + template<> + struct NativeValueTraits<float> { + static inline bool arrayNativeValue(JSC::ExecState* exec, JSC::JSValue jsValue, float& indexedValue) + { + indexedValue = jsValue.toFloat(exec); + return !exec->hadException(); + } + }; + template <class T> Vector<T> toNativeArray(JSC::ExecState* exec, JSC::JSValue value) { diff --git a/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm b/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm index 94f1a1bce..c29cc5c0f 100644 --- a/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm +++ b/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm @@ -984,7 +984,7 @@ END # Special case for readonly or Replaceable attributes (with a few exceptions). This attempts to ensure that JS wrappers don't get # garbage-collected prematurely when their lifetime is strongly tied to their owner. We accomplish this by inserting a reference to # the newly created wrapper into an internal field of the holder object. - if (!IsNodeSubType($dataNode) && $attrName ne "self" && (IsWrapperType($returnType) && ($attribute->type =~ /^readonly/ || $attribute->signature->extendedAttributes->{"Replaceable"}) + if (!IsNodeSubType($dataNode) && $attrName ne "self" && (IsWrapperType($returnType) && ($attribute->type =~ /^readonly/ || $attribute->signature->extendedAttributes->{"Replaceable"} || $attrName eq "location") && $returnType ne "EventTarget" && $returnType ne "SerializedScriptValue" && $returnType ne "DOMWindow" && $returnType ne "MessagePortArray" && $returnType !~ /SVG/ && $returnType !~ /HTML/ && !IsDOMNodeType($returnType))) { @@ -1009,12 +1009,7 @@ END push(@implContentDecls, " if (wrapper.IsEmpty()) {\n"); push(@implContentDecls, " wrapper = toV8(result.get(), info.Holder(), info.GetIsolate());\n"); push(@implContentDecls, " if (!wrapper.IsEmpty())\n"); - if ($dataNode->name eq "DOMWindow") { - AddToImplIncludes("Frame.h"); - push(@implContentDecls, " V8DOMWrapper::setNamedHiddenWindowReference(imp->frame(), \"${attrName}\", wrapper);\n"); - } else { - push(@implContentDecls, " V8DOMWrapper::setNamedHiddenReference(info.Holder(), \"${attrName}\", wrapper);\n"); - } + push(@implContentDecls, " V8DOMWrapper::setNamedHiddenReference(info.Holder(), \"${attrName}\", wrapper);\n"); push(@implContentDecls, " }\n"); push(@implContentDecls, " return wrapper;\n"); push(@implContentDecls, "}\n\n"); @@ -1603,8 +1598,6 @@ sub GenerateCallWith } if ($codeGenerator->ExtendedAttributeContains($callWith, "ScriptExecutionContext")) { push(@$outputArray, $indent . "ScriptExecutionContext* scriptContext = getScriptExecutionContext();\n"); - push(@$outputArray, $indent . "if (!scriptContext)\n"); - push(@$outputArray, $indent . " return" . ($returnVoid ? "" : " v8Undefined()") . ";\n"); push(@callWithArgs, "scriptContext"); } if ($function and $codeGenerator->ExtendedAttributeContains($callWith, "ScriptArguments")) { @@ -1853,8 +1846,6 @@ END push(@implContent, <<END); ScriptExecutionContext* context = getScriptExecutionContext(); - if (!context) - return throwError(ReferenceError, "${implClassName} constructor's associated context is not available", args.GetIsolate()); END } @@ -2027,11 +2018,7 @@ static v8::Handle<v8::Value> V8${implClassName}ConstructorCallback(const v8::Arg if (ConstructorMode::current() == ConstructorMode::WrapExistingObject) return args.Holder(); - Frame* frame = currentFrame(BindingState::instance()); - if (!frame) - return throwError(ReferenceError, "${implClassName} constructor associated frame is unavailable", args.GetIsolate()); - - Document* document = frame->document(); + Document* document = currentDocument(BindingState::instance()); // Make sure the document is added to the DOM Node map. Otherwise, the ${implClassName} instance // may end up being the only node in the map and get garbage-collected prematurely. @@ -2532,7 +2519,6 @@ sub GenerateImplementation AddToImplIncludes("RuntimeEnabledFeatures.h"); AddToImplIncludes("V8Binding.h"); AddToImplIncludes("V8DOMWrapper.h"); - AddToImplIncludes("V8IsolatedContext.h"); AddIncludesForType($interfaceName); diff --git a/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.cpp b/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.cpp index e4703bc91..00ebd6db8 100644 --- a/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.cpp +++ b/Source/WebCore/bindings/scripts/test/V8/V8Float64Array.cpp @@ -32,7 +32,6 @@ #include "V8DOMWrapper.h" #include "V8Float32Array.h" #include "V8Int32Array.h" -#include "V8IsolatedContext.h" #include <wtf/Float32Array.h> #include <wtf/Float64Array.h> #include <wtf/GetPtr.h> diff --git a/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp b/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp index b996c8155..bdc3ea43c 100644 --- a/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp +++ b/Source/WebCore/bindings/scripts/test/V8/V8TestActiveDOMObject.cpp @@ -28,7 +28,6 @@ #include "RuntimeEnabledFeatures.h" #include "V8Binding.h" #include "V8DOMWrapper.h" -#include "V8IsolatedContext.h" #include "V8Node.h" #include <wtf/UnusedParam.h> diff --git a/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp b/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp index 7c32be6e0..3f30bd516 100644 --- a/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp +++ b/Source/WebCore/bindings/scripts/test/V8/V8TestCustomNamedGetter.cpp @@ -28,7 +28,6 @@ #include "RuntimeEnabledFeatures.h" #include "V8Binding.h" #include "V8DOMWrapper.h" -#include "V8IsolatedContext.h" #include <wtf/UnusedParam.h> namespace WebCore { diff --git a/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.cpp b/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.cpp index b3a3534f2..701b89ac8 100644 --- a/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.cpp +++ b/Source/WebCore/bindings/scripts/test/V8/V8TestEventConstructor.cpp @@ -28,7 +28,6 @@ #include "RuntimeEnabledFeatures.h" #include "V8Binding.h" #include "V8DOMWrapper.h" -#include "V8IsolatedContext.h" #include <wtf/UnusedParam.h> namespace WebCore { diff --git a/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp b/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp index b78369e95..b5965dc92 100644 --- a/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp +++ b/Source/WebCore/bindings/scripts/test/V8/V8TestEventTarget.cpp @@ -30,7 +30,6 @@ #include "V8Collection.h" #include "V8DOMWrapper.h" #include "V8Event.h" -#include "V8IsolatedContext.h" #include "V8Node.h" #include <wtf/UnusedParam.h> diff --git a/Source/WebCore/bindings/scripts/test/V8/V8TestException.cpp b/Source/WebCore/bindings/scripts/test/V8/V8TestException.cpp index d80199d9f..1a6e8399a 100644 --- a/Source/WebCore/bindings/scripts/test/V8/V8TestException.cpp +++ b/Source/WebCore/bindings/scripts/test/V8/V8TestException.cpp @@ -27,7 +27,6 @@ #include "RuntimeEnabledFeatures.h" #include "V8Binding.h" #include "V8DOMWrapper.h" -#include "V8IsolatedContext.h" #include <wtf/UnusedParam.h> namespace WebCore { diff --git a/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp b/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp index c53507671..ff7ba0def 100644 --- a/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp +++ b/Source/WebCore/bindings/scripts/test/V8/V8TestInterface.cpp @@ -31,7 +31,6 @@ #include "TestSupplemental.h" #include "V8Binding.h" #include "V8DOMWrapper.h" -#include "V8IsolatedContext.h" #include "V8Node.h" #include "V8TestObj.h" #include <wtf/GetPtr.h> @@ -163,8 +162,6 @@ static v8::Handle<v8::Value> supplementalMethod2Callback(const v8::Arguments& ar STRING_TO_V8PARAMETER_EXCEPTION_BLOCK(V8Parameter<>, strArg, MAYBE_MISSING_PARAMETER(args, 0, DefaultIsUndefined)); EXCEPTION_BLOCK(TestObj*, objArg, V8TestObj::HasInstance(MAYBE_MISSING_PARAMETER(args, 1, DefaultIsUndefined)) ? V8TestObj::toNative(v8::Handle<v8::Object>::Cast(MAYBE_MISSING_PARAMETER(args, 1, DefaultIsUndefined))) : 0); ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return v8Undefined(); RefPtr<TestObj> result = TestSupplemental::supplementalMethod2(scriptContext, imp, strArg, objArg, ec); if (UNLIKELY(ec)) goto fail; @@ -259,8 +256,6 @@ v8::Handle<v8::Value> V8TestInterface::constructorCallback(const v8::Arguments& STRING_TO_V8PARAMETER_EXCEPTION_BLOCK(V8Parameter<>, str2, MAYBE_MISSING_PARAMETER(args, 1, DefaultIsUndefined)); ScriptExecutionContext* context = getScriptExecutionContext(); - if (!context) - return throwError(ReferenceError, "TestInterface constructor's associated context is not available", args.GetIsolate()); RefPtr<TestInterface> impl = TestInterface::create(context, str1, str2, ec); v8::Handle<v8::Object> wrapper = args.Holder(); diff --git a/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp b/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp index 24c4df698..7b1e77446 100644 --- a/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp +++ b/Source/WebCore/bindings/scripts/test/V8/V8TestMediaQueryListListener.cpp @@ -29,7 +29,6 @@ #include "RuntimeEnabledFeatures.h" #include "V8Binding.h" #include "V8DOMWrapper.h" -#include "V8IsolatedContext.h" #include <wtf/UnusedParam.h> namespace WebCore { diff --git a/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.cpp b/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.cpp index 6e262d43c..162a9a5dc 100644 --- a/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.cpp +++ b/Source/WebCore/bindings/scripts/test/V8/V8TestNamedConstructor.cpp @@ -28,7 +28,6 @@ #include "RuntimeEnabledFeatures.h" #include "V8Binding.h" #include "V8DOMWrapper.h" -#include "V8IsolatedContext.h" #include <wtf/UnusedParam.h> namespace WebCore { @@ -53,11 +52,7 @@ static v8::Handle<v8::Value> V8TestNamedConstructorConstructorCallback(const v8: if (ConstructorMode::current() == ConstructorMode::WrapExistingObject) return args.Holder(); - Frame* frame = currentFrame(BindingState::instance()); - if (!frame) - return throwError(ReferenceError, "TestNamedConstructor constructor associated frame is unavailable", args.GetIsolate()); - - Document* document = frame->document(); + Document* document = currentDocument(BindingState::instance()); // Make sure the document is added to the DOM Node map. Otherwise, the TestNamedConstructor instance // may end up being the only node in the map and get garbage-collected prematurely. diff --git a/Source/WebCore/bindings/scripts/test/V8/V8TestNode.cpp b/Source/WebCore/bindings/scripts/test/V8/V8TestNode.cpp index 5655a8c01..76cacdd97 100644 --- a/Source/WebCore/bindings/scripts/test/V8/V8TestNode.cpp +++ b/Source/WebCore/bindings/scripts/test/V8/V8TestNode.cpp @@ -27,7 +27,6 @@ #include "RuntimeEnabledFeatures.h" #include "V8Binding.h" #include "V8DOMWrapper.h" -#include "V8IsolatedContext.h" #include "V8Node.h" #include <wtf/UnusedParam.h> diff --git a/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp b/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp index 46b415d28..5fd323eee 100644 --- a/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp +++ b/Source/WebCore/bindings/scripts/test/V8/V8TestObj.cpp @@ -43,7 +43,6 @@ #include "V8DOMWrapper.h" #include "V8Document.h" #include "V8Float32Array.h" -#include "V8IsolatedContext.h" #include "V8SVGDocument.h" #include "V8SVGPoint.h" #include "V8ScriptProfile.h" @@ -546,8 +545,6 @@ static v8::Handle<v8::Value> withScriptExecutionContextAttributeAttrGetter(v8::L INC_STATS("DOM.TestObj.withScriptExecutionContextAttribute._get"); TestObj* imp = V8TestObj::toNative(info.Holder()); ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return v8Undefined(); return toV8(imp->withScriptExecutionContextAttribute(scriptContext), info.Holder(), info.GetIsolate()); } @@ -557,8 +554,6 @@ static void withScriptExecutionContextAttributeAttrSetter(v8::Local<v8::String> TestObj* imp = V8TestObj::toNative(info.Holder()); TestObj* v = V8TestObj::HasInstance(value) ? V8TestObj::toNative(v8::Handle<v8::Object>::Cast(value)) : 0; ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return; imp->setWithScriptExecutionContextAttribute(scriptContext, WTF::getPtr(v)); return; } @@ -602,8 +597,6 @@ static v8::Handle<v8::Value> withScriptExecutionContextAttributeRaisesAttrGetter TestObj* imp = V8TestObj::toNative(info.Holder()); ExceptionCode ec = 0; ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return v8Undefined(); RefPtr<TestObj> v = imp->withScriptExecutionContextAttributeRaises(scriptContext, ec); if (UNLIKELY(ec)) return setDOMException(ec, info.GetIsolate()); @@ -617,8 +610,6 @@ static void withScriptExecutionContextAttributeRaisesAttrSetter(v8::Local<v8::St TestObj* v = V8TestObj::HasInstance(value) ? V8TestObj::toNative(v8::Handle<v8::Object>::Cast(value)) : 0; ExceptionCode ec = 0; ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return; imp->setWithScriptExecutionContextAttributeRaises(scriptContext, WTF::getPtr(v), ec); if (UNLIKELY(ec)) setDOMException(ec, info.GetIsolate()); @@ -633,8 +624,6 @@ static v8::Handle<v8::Value> withScriptExecutionContextAndScriptStateAttributeAt if (!state) return v8Undefined(); ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return v8Undefined(); return toV8(imp->withScriptExecutionContextAndScriptStateAttribute(state, scriptContext), info.Holder(), info.GetIsolate()); } @@ -647,8 +636,6 @@ static void withScriptExecutionContextAndScriptStateAttributeAttrSetter(v8::Loca if (!state) return; ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return; imp->setWithScriptExecutionContextAndScriptStateAttribute(state, scriptContext, WTF::getPtr(v)); if (state.hadException()) throwError(state.exception(), info.GetIsolate()); @@ -664,8 +651,6 @@ static v8::Handle<v8::Value> withScriptExecutionContextAndScriptStateAttributeRa if (!state) return v8Undefined(); ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return v8Undefined(); RefPtr<TestObj> v = imp->withScriptExecutionContextAndScriptStateAttributeRaises(state, scriptContext, ec); if (UNLIKELY(ec)) return setDOMException(ec, info.GetIsolate()); @@ -684,8 +669,6 @@ static void withScriptExecutionContextAndScriptStateAttributeRaisesAttrSetter(v8 if (!state) return; ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return; imp->setWithScriptExecutionContextAndScriptStateAttributeRaises(state, scriptContext, WTF::getPtr(v), ec); if (UNLIKELY(ec)) setDOMException(ec, info.GetIsolate()); @@ -702,8 +685,6 @@ static v8::Handle<v8::Value> withScriptExecutionContextAndScriptStateWithSpacesA if (!state) return v8Undefined(); ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return v8Undefined(); return toV8(imp->withScriptExecutionContextAndScriptStateWithSpacesAttribute(state, scriptContext), info.Holder(), info.GetIsolate()); } @@ -716,8 +697,6 @@ static void withScriptExecutionContextAndScriptStateWithSpacesAttributeAttrSette if (!state) return; ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return; imp->setWithScriptExecutionContextAndScriptStateWithSpacesAttribute(state, scriptContext, WTF::getPtr(v)); if (state.hadException()) throwError(state.exception(), info.GetIsolate()); @@ -1311,8 +1290,6 @@ static v8::Handle<v8::Value> withScriptExecutionContextCallback(const v8::Argume INC_STATS("DOM.TestObj.withScriptExecutionContext"); TestObj* imp = V8TestObj::toNative(args.Holder()); ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return v8Undefined(); imp->withScriptExecutionContext(scriptContext); return v8Undefined(); } @@ -1323,8 +1300,6 @@ static v8::Handle<v8::Value> withScriptExecutionContextAndScriptStateCallback(co TestObj* imp = V8TestObj::toNative(args.Holder()); EmptyScriptState state; ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return v8Undefined(); imp->withScriptExecutionContextAndScriptState(&state, scriptContext); if (state.hadException()) return throwError(state.exception(), args.GetIsolate()); @@ -1339,8 +1314,6 @@ static v8::Handle<v8::Value> withScriptExecutionContextAndScriptStateObjExceptio { EmptyScriptState state; ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return v8Undefined(); RefPtr<TestObj> result = imp->withScriptExecutionContextAndScriptStateObjException(&state, scriptContext, ec); if (UNLIKELY(ec)) goto fail; @@ -1358,8 +1331,6 @@ static v8::Handle<v8::Value> withScriptExecutionContextAndScriptStateWithSpacesC TestObj* imp = V8TestObj::toNative(args.Holder()); EmptyScriptState state; ScriptExecutionContext* scriptContext = getScriptExecutionContext(); - if (!scriptContext) - return v8Undefined(); RefPtr<TestObj> result = imp->withScriptExecutionContextAndScriptStateWithSpaces(&state, scriptContext); if (state.hadException()) return throwError(state.exception(), args.GetIsolate()); diff --git a/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp b/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp index ba4c40d56..f8fc5e590 100644 --- a/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp +++ b/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp @@ -32,7 +32,6 @@ #include "SerializedScriptValue.h" #include "V8Binding.h" #include "V8DOMWrapper.h" -#include "V8IsolatedContext.h" #include "V8MessagePort.h" #include <wtf/ArrayBuffer.h> #include <wtf/UnusedParam.h> diff --git a/Source/WebCore/bindings/v8/BindingState.cpp b/Source/WebCore/bindings/v8/BindingState.cpp index c59bb8915..9a3d7081b 100644 --- a/Source/WebCore/bindings/v8/BindingState.cpp +++ b/Source/WebCore/bindings/v8/BindingState.cpp @@ -66,36 +66,9 @@ DOMWindow* firstDOMWindow(BindingState*) return toDOMWindow(v8::Context::GetEntered()); } -Frame* activeFrame(BindingState*) -{ - v8::Handle<v8::Context> context = activeContext(); - if (context.IsEmpty()) - return 0; - return toFrameIfNotDetached(context); -} - -Frame* firstFrame(BindingState*) -{ - v8::Handle<v8::Context> context = v8::Context::GetEntered(); - if (context.IsEmpty()) - return 0; - return toFrameIfNotDetached(context); -} - -Frame* currentFrame(BindingState*) -{ - v8::Handle<v8::Context> context = v8::Context::GetCurrent(); - if (context.IsEmpty()) - return 0; - return toFrameIfNotDetached(context); -} - Document* currentDocument(BindingState*) { - DOMWindow* current = toDOMWindow(v8::Context::GetCurrent()); - if (!current) - return 0; - return current->document(); + return toDOMWindow(v8::Context::GetCurrent())->document(); } void printErrorMessageForFrame(Frame* frame, const String& message) diff --git a/Source/WebCore/bindings/v8/BindingState.h b/Source/WebCore/bindings/v8/BindingState.h index 9564224ea..8eaa4946e 100644 --- a/Source/WebCore/bindings/v8/BindingState.h +++ b/Source/WebCore/bindings/v8/BindingState.h @@ -49,12 +49,8 @@ public: DOMWindow* activeDOMWindow(BindingState*); DOMWindow* firstDOMWindow(BindingState*); -Frame* activeFrame(BindingState*); -Frame* firstFrame(BindingState*); - // FIXME: When implementing this function for JSC, we need to understand if there // are any subtle differences between the currentFrame and the lexicalGlobalObject. -Frame* currentFrame(BindingState*); Document* currentDocument(BindingState*); // FIXME: This function is redundant with the copy in JSDOMBinding.cpp. diff --git a/Source/WebCore/bindings/v8/DOMData.cpp b/Source/WebCore/bindings/v8/DOMData.cpp index 1a63c2f2b..af50a1eca 100644 --- a/Source/WebCore/bindings/v8/DOMData.cpp +++ b/Source/WebCore/bindings/v8/DOMData.cpp @@ -31,7 +31,7 @@ #include "config.h" #include "DOMData.h" #include "V8Binding.h" -#include "V8IsolatedContext.h" +#include "V8DOMWindowShell.h" #include "WebGLContextAttributes.h" #include "WebGLUniformLocation.h" @@ -43,7 +43,7 @@ DOMDataStore& DOMData::getCurrentStore(v8::Isolate* isolate) V8PerIsolateData* data = V8PerIsolateData::current(isolate); if (UNLIKELY(data->domDataStore() != 0)) return *data->domDataStore(); - V8IsolatedContext* context = V8IsolatedContext::getEntered(); + V8DOMWindowShell* context = V8DOMWindowShell::getEntered(); if (UNLIKELY(context != 0)) return *context->world()->domDataStore(); return defaultStore; diff --git a/Source/WebCore/bindings/v8/DOMWrapperWorld.cpp b/Source/WebCore/bindings/v8/DOMWrapperWorld.cpp index 31a0286c4..859e836f2 100644 --- a/Source/WebCore/bindings/v8/DOMWrapperWorld.cpp +++ b/Source/WebCore/bindings/v8/DOMWrapperWorld.cpp @@ -90,13 +90,12 @@ void DOMWrapperWorld::deallocate(DOMWrapperWorld* world) static int temporaryWorldId = DOMWrapperWorld::uninitializedWorldId-1; -PassRefPtr<DOMWrapperWorld> DOMWrapperWorld::getOrCreateIsolatedWorld(int worldId, int extensionGroup) +PassRefPtr<DOMWrapperWorld> DOMWrapperWorld::ensureIsolatedWorld(int worldId, int extensionGroup) { ASSERT(worldId != mainWorldId); - ASSERT(worldId != uninitializedWorldId); WorldMap& map = isolatedWorldMap(); - if (!worldId) + if (worldId == uninitializedWorldId) worldId = temporaryWorldId--; else { WorldMap::iterator i = map.find(worldId); diff --git a/Source/WebCore/bindings/v8/DOMWrapperWorld.h b/Source/WebCore/bindings/v8/DOMWrapperWorld.h index 01125b7f3..9cccd5fc6 100644 --- a/Source/WebCore/bindings/v8/DOMWrapperWorld.h +++ b/Source/WebCore/bindings/v8/DOMWrapperWorld.h @@ -41,12 +41,12 @@ namespace WebCore { // This class represent a collection of DOM wrappers for a specific world. class DOMWrapperWorld : public WTF::RefCountedBase { public: - static const int mainWorldId = -1; - static const int mainWorldExtensionGroup = -1; - static const int uninitializedWorldId = -2; - static const int uninitializedExtensionGroup = -2; + static const int mainWorldId = 0; + static const int mainWorldExtensionGroup = 0; + static const int uninitializedWorldId = -1; + static const int uninitializedExtensionGroup = -1; // If 0 is passed as worldId, the world will be assigned a temporary id instead. - static PassRefPtr<DOMWrapperWorld> getOrCreateIsolatedWorld(int worldId, int extensionGroup); + static PassRefPtr<DOMWrapperWorld> ensureIsolatedWorld(int worldId, int extensionGroup); static bool isolatedWorldsExist() { return isolatedWorldCount; } // FIXME: this is a workaround for a problem in WebViewImpl. // Do not use this anywhere else!! diff --git a/Source/WebCore/bindings/v8/IDBBindingUtilities.cpp b/Source/WebCore/bindings/v8/IDBBindingUtilities.cpp index 19fd91d90..ca62b33dc 100644 --- a/Source/WebCore/bindings/v8/IDBBindingUtilities.cpp +++ b/Source/WebCore/bindings/v8/IDBBindingUtilities.cpp @@ -162,7 +162,9 @@ static PassRefPtr<IDBKey> createIDBKeyFromSerializedValueAndKeyPath(PassRefPtr<S RefPtr<SerializedScriptValue> value = prpValue; - V8AuxiliaryContext context; + v8::HandleScope handleScope; + v8::Context::Scope scope(V8PerIsolateData::current()->ensureAuxiliaryContext()); + v8::Handle<v8::Value> v8Value(value->deserialize()); v8::Handle<v8::Value> v8Key(getNthValueOnKeyPath(v8Value, keyPathElements, keyPathElements.size())); if (v8Key.IsEmpty()) @@ -207,7 +209,9 @@ PassRefPtr<SerializedScriptValue> injectIDBKeyIntoSerializedValue(PassRefPtr<IDB if (!keyPathElements.size()) return 0; - V8AuxiliaryContext context; + v8::HandleScope handleScope; + v8::Context::Scope scope(V8PerIsolateData::current()->ensureAuxiliaryContext()); + v8::Handle<v8::Value> v8Value(value->deserialize()); v8::Handle<v8::Value> parent(ensureNthValueOnKeyPath(v8Value, keyPathElements, keyPathElements.size() - 1)); if (parent.IsEmpty()) diff --git a/Source/WebCore/bindings/v8/NPV8Object.cpp b/Source/WebCore/bindings/v8/NPV8Object.cpp index 02243859e..eb854da98 100644 --- a/Source/WebCore/bindings/v8/NPV8Object.cpp +++ b/Source/WebCore/bindings/v8/NPV8Object.cpp @@ -102,9 +102,6 @@ static void freeV8NPObject(NPObject* npObject) staticV8NPObjectMap()->clear(); } -#ifndef NDEBUG - V8GCController::unregisterGlobalHandle(v8NpObject, v8NpObject->v8Object); -#endif v8NpObject->v8Object.Dispose(); free(v8NpObject); } @@ -176,9 +173,6 @@ NPObject* npCreateV8ScriptObject(NPP npp, v8::Handle<v8::Object> object, DOMWind V8NPObject* v8npObject = reinterpret_cast<V8NPObject*>(_NPN_CreateObject(npp, &V8NPObjectClass)); v8npObject->v8Object = v8::Persistent<v8::Object>::New(object); -#ifndef NDEBUG - V8GCController::registerGlobalHandle(NPOBJECT, v8npObject, v8npObject->v8Object); -#endif v8npObject->rootObject = root; iter->second.append(v8npObject); diff --git a/Source/WebCore/bindings/v8/ScriptController.cpp b/Source/WebCore/bindings/v8/ScriptController.cpp index 7bee97cbd..211ba947a 100644 --- a/Source/WebCore/bindings/v8/ScriptController.cpp +++ b/Source/WebCore/bindings/v8/ScriptController.cpp @@ -62,7 +62,6 @@ #include "V8GCController.h" #include "V8HiddenPropertyName.h" #include "V8HTMLEmbedElement.h" -#include "V8IsolatedContext.h" #include "V8NPObject.h" #include "V8RecursionScope.h" #include "Widget.h" @@ -92,16 +91,6 @@ void ScriptController::setFlags(const char* string, int length) v8::V8::SetFlagsFromString(string, length); } -Frame* ScriptController::retrieveFrameForEnteredContext() -{ - return firstFrame(BindingState::instance()); -} - -Frame* ScriptController::retrieveFrameForCurrentContext() -{ - return currentFrame(BindingState::instance()); -} - bool ScriptController::canAccessFromCurrentOrigin(Frame *frame) { return !v8::Context::InContext() || BindingSecurity::shouldAllowAccessToFrame(BindingState::instance(), frame); @@ -110,7 +99,7 @@ bool ScriptController::canAccessFromCurrentOrigin(Frame *frame) ScriptController::ScriptController(Frame* frame) : m_frame(frame) , m_sourceURL(0) - , m_windowShell(V8DOMWindowShell::create(frame)) + , m_windowShell(V8DOMWindowShell::create(frame, mainThreadNormalWorld())) , m_paused(false) #if ENABLE(NETSCAPE_PLUGIN_API) , m_wrappedWindowScriptNPObject(0) @@ -157,7 +146,7 @@ void ScriptController::resetIsolatedWorlds() { for (IsolatedWorldMap::iterator iter = m_isolatedWorlds.begin(); iter != m_isolatedWorlds.end(); ++iter) { - iter->second->destroy(); + iter->second->destroyIsolatedShell(); } m_isolatedWorlds.clear(); m_isolatedWorldSecurityOrigins.clear(); @@ -324,50 +313,72 @@ ScriptValue ScriptController::evaluate(const ScriptSourceCode& sourceCode) return ScriptValue(object); } -void ScriptController::evaluateInIsolatedWorld(unsigned worldID, const Vector<ScriptSourceCode>& sources, Vector<ScriptValue>* results) +V8DOMWindowShell* ScriptController::ensureIsolatedWorldContext(int worldId, int extensionGroup) { - evaluateInIsolatedWorld(worldID, sources, 0, results); + ASSERT(worldId != DOMWrapperWorld::mainWorldId); + + // Check the map for non-temporary worlds. + if (worldId != DOMWrapperWorld::uninitializedWorldId) { + IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(worldId); + if (iter != m_isolatedWorlds.end()) { + ASSERT(iter->second->world()->worldId() == worldId); + ASSERT(iter->second->world()->extensionGroup() == extensionGroup); + return iter->second; + } + } + + RefPtr<DOMWrapperWorld> world = DOMWrapperWorld::ensureIsolatedWorld(worldId, extensionGroup); + OwnPtr<V8DOMWindowShell> isolatedWorldShell = V8DOMWindowShell::create(m_frame, world); + m_isolatedWorlds.set(world->worldId(), isolatedWorldShell.get()); + return isolatedWorldShell.leakPtr(); } -void ScriptController::evaluateInIsolatedWorld(unsigned worldID, const Vector<ScriptSourceCode>& sources, int extensionGroup, Vector<ScriptValue>* results) +V8DOMWindowShell* ScriptController::existingWindowShellInternal(DOMWrapperWorld* world) { - v8::HandleScope handleScope; + ASSERT(world); - // FIXME: This will need to get reorganized once we have a windowShell for the isolated world. - if (!windowShell()->initializeIfNeeded()) - return; + if (LIKELY(world->isMainWorld())) + return m_windowShell.get(); + + IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world->worldId()); + return iter == m_isolatedWorlds.end() ? 0 : iter->second; +} + +V8DOMWindowShell* ScriptController::windowShell(DOMWrapperWorld* world) +{ + V8DOMWindowShell* shell = existingWindowShellInternal(world); + if (LIKELY(!!shell)) + return shell; + + OwnPtr<V8DOMWindowShell> isolatedWorldShell = V8DOMWindowShell::create(m_frame, world); + m_isolatedWorlds.set(world->worldId(), isolatedWorldShell.get()); + return isolatedWorldShell.leakPtr(); +} + +void ScriptController::evaluateInIsolatedWorld(int worldID, const Vector<ScriptSourceCode>& sources, int extensionGroup, Vector<ScriptValue>* results) +{ + // Except in the test runner, worldID should be non 0 as it conflicts with the mainWorldId. + // FIXME: Change the test runner to perform this swap and make this an ASSERT. + if (UNLIKELY(!worldID)) + worldID = DOMWrapperWorld::uninitializedWorldId; + v8::HandleScope handleScope; v8::Local<v8::Array> v8Results; { v8::HandleScope evaluateHandleScope; - V8IsolatedContext* isolatedContext = 0; - if (worldID > 0) { - IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(worldID); - if (iter != m_isolatedWorlds.end()) - isolatedContext = iter->second; - else { - isolatedContext = new V8IsolatedContext(m_frame, DOMWrapperWorld::getOrCreateIsolatedWorld(worldID, extensionGroup)); - if (isolatedContext->context().IsEmpty()) { - delete isolatedContext; - return; - } - - // FIXME: We should change this to using window shells to match JSC. - m_isolatedWorlds.set(worldID, isolatedContext); - } + V8DOMWindowShell* isolatedWorldShell = ensureIsolatedWorldContext(worldID, extensionGroup); + if (worldID != DOMWrapperWorld::uninitializedWorldId) { IsolatedWorldSecurityOriginMap::iterator securityOriginIter = m_isolatedWorldSecurityOrigins.find(worldID); if (securityOriginIter != m_isolatedWorldSecurityOrigins.end()) - isolatedContext->setSecurityOrigin(securityOriginIter->second); - } else { - isolatedContext = new V8IsolatedContext(m_frame, DOMWrapperWorld::getOrCreateIsolatedWorld(worldID, extensionGroup)); - if (isolatedContext->context().IsEmpty()) { - delete isolatedContext; - return; - } + isolatedWorldShell->setIsolatedWorldSecurityOrigin(securityOriginIter->second); } - v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolatedContext->context()); + isolatedWorldShell->initializeIfNeeded(); + if (isolatedWorldShell->context().IsEmpty()) + return; + + v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolatedWorldShell->context()); v8::Context::Scope contextScope(context); v8::Local<v8::Array> resultArray = v8::Array::New(sources.size()); @@ -378,8 +389,12 @@ void ScriptController::evaluateInIsolatedWorld(unsigned worldID, const Vector<Sc resultArray->Set(i, evaluationResult); } - if (!worldID) - isolatedContext->destroy(); + // Mark temporary shell for weak destruction. + if (worldID == DOMWrapperWorld::uninitializedWorldId) { + int actualWorldId = isolatedWorldShell->world()->worldId(); + m_isolatedWorlds.remove(actualWorldId); + isolatedWorldShell->destroyIsolatedShell(); + } v8Results = evaluateHandleScope.Close(resultArray); } @@ -396,7 +411,7 @@ void ScriptController::setIsolatedWorldSecurityOrigin(int worldID, PassRefPtr<Se m_isolatedWorldSecurityOrigins.set(worldID, securityOrigin); IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(worldID); if (iter != m_isolatedWorlds.end()) - iter->second->setSecurityOrigin(securityOrigin); + iter->second->setIsolatedWorldSecurityOrigin(securityOrigin); } TextPosition ScriptController::eventHandlerPosition() const @@ -413,11 +428,11 @@ void ScriptController::finishedWithEvent(Event* event) v8::Local<v8::Context> ScriptController::currentWorldContext() { - if (V8IsolatedContext* isolatedContext = V8IsolatedContext::getEntered()) { - RefPtr<SharedPersistent<v8::Context> > context = isolatedContext->sharedContext(); - if (m_frame != toFrameIfNotDetached(context->get())) + if (V8DOMWindowShell* isolatedShell = V8DOMWindowShell::getEntered()) { + v8::Persistent<v8::Context> context = isolatedShell->context(); + if (context.IsEmpty() || m_frame != toFrameIfNotDetached(context)) return v8::Local<v8::Context>(); - return v8::Local<v8::Context>::New(context->get()); + return v8::Local<v8::Context>::New(context); } windowShell()->initializeIfNeeded(); return v8::Local<v8::Context>::New(windowShell()->context()); @@ -542,10 +557,13 @@ void ScriptController::getAllWorlds(Vector<RefPtr<DOMWrapperWorld> >& worlds) void ScriptController::evaluateInWorld(const ScriptSourceCode& source, DOMWrapperWorld* world) { + if (world == mainThreadNormalWorld()) { + evaluate(source); + return; + } Vector<ScriptSourceCode> sources; sources.append(source); - // FIXME: Get an ID from the world param. - evaluateInIsolatedWorld(0, sources, 0); + evaluateInIsolatedWorld(world->worldId(), sources, world->extensionGroup(), 0); } V8Extensions& ScriptController::registeredExtensions() @@ -646,14 +664,14 @@ void ScriptController::collectIsolatedContexts(Vector<std::pair<ScriptState*, Se { v8::HandleScope handleScope; for (IsolatedWorldMap::iterator it = m_isolatedWorlds.begin(); it != m_isolatedWorlds.end(); ++it) { - V8IsolatedContext* isolatedContext = it->second; - if (!isolatedContext->securityOrigin()) + V8DOMWindowShell* isolatedWorldShell = it->second; + if (!isolatedWorldShell->isolatedWorldSecurityOrigin()) continue; - v8::Handle<v8::Context> v8Context = isolatedContext->context(); + v8::Handle<v8::Context> v8Context = isolatedWorldShell->context(); if (v8Context.IsEmpty()) continue; ScriptState* scriptState = ScriptState::forContext(v8::Local<v8::Context>::New(v8Context)); - result.append(std::pair<ScriptState*, SecurityOrigin*>(scriptState, isolatedContext->securityOrigin())); + result.append(std::pair<ScriptState*, SecurityOrigin*>(scriptState, isolatedWorldShell->isolatedWorldSecurityOrigin())); } } #endif diff --git a/Source/WebCore/bindings/v8/ScriptController.h b/Source/WebCore/bindings/v8/ScriptController.h index ddf0d4961..040215238 100644 --- a/Source/WebCore/bindings/v8/ScriptController.h +++ b/Source/WebCore/bindings/v8/ScriptController.h @@ -57,20 +57,8 @@ class ScriptSourceCode; class ScriptState; class SecurityOrigin; class V8DOMWindowShell; -class V8IsolatedContext; class Widget; -// Note: although the pointer is raw, the instance is kept alive by a strong -// reference to the v8 context it contains, which is not made weak until we -// call world->destroy(). -// -// FIXME: We want to eventually be holding window shells instead of the -// IsolatedContext directly. -// https://bugs.webkit.org/show_bug.cgi?id=94875 -typedef HashMap<int, V8IsolatedContext*> IsolatedWorldMap; - -typedef HashMap<int, RefPtr<SecurityOrigin> > IsolatedWorldSecurityOriginMap; - typedef WTF::Vector<v8::Extension*> V8Extensions; class ScriptController { @@ -78,9 +66,11 @@ public: ScriptController(Frame*); ~ScriptController(); - // FIXME: This should eventually take DOMWrapperWorld argument. - // https://bugs.webkit.org/show_bug.cgi?id=94875 V8DOMWindowShell* windowShell() const { return m_windowShell.get(); } + V8DOMWindowShell* windowShell(DOMWrapperWorld*); + // FIXME: Replace existingWindowShell with existingWindowShellInternal see comment in V8DOMWindowShell::initializeIfNeeded. + ScriptController* existingWindowShell(DOMWrapperWorld*) { return this; } + V8DOMWindowShell* existingWindowShellInternal(DOMWrapperWorld*); ScriptValue executeScript(const ScriptSourceCode&); ScriptValue executeScript(const String& script, bool forceUserGesture = false); @@ -105,12 +95,6 @@ public: // The caller must hold an execution context. ScriptValue evaluate(const ScriptSourceCode&); - // Evaluate JavaScript in a new isolated world. The script gets its own - // global scope, its own prototypes for intrinsic JavaScript objects (String, - // Array, and so-on), and its own wrappers for all DOM nodes and DOM - // constructors. - void evaluateInIsolatedWorld(unsigned worldID, const Vector<ScriptSourceCode>& sources, Vector<ScriptValue>* results); - // Executes JavaScript in an isolated world. The script gets its own global scope, // its own prototypes for intrinsic JavaScript objects (String, Array, and so-on), // and its own wrappers for all DOM nodes and DOM constructors. @@ -118,22 +102,16 @@ public: // If an isolated world with the specified ID already exists, it is reused. // Otherwise, a new world is created. // - // If the worldID is 0, a new world is always created. + // If the worldID is 0 or DOMWrapperWorld::uninitializedWorldId, a new world is always created. // // FIXME: Get rid of extensionGroup here. - void evaluateInIsolatedWorld(unsigned worldID, const Vector<ScriptSourceCode>& sources, int extensionGroup, Vector<ScriptValue>* results); + void evaluateInIsolatedWorld(int worldID, const Vector<ScriptSourceCode>& sources, int extensionGroup, Vector<ScriptValue>* results); // Associates an isolated world (see above for description) with a security // origin. XMLHttpRequest instances used in that world will be considered // to come from that origin, not the frame's. void setIsolatedWorldSecurityOrigin(int worldID, PassRefPtr<SecurityOrigin>); - // Masquerade 'this' as the windowShell. - // This is a bit of a hack, but provides reasonable compatibility - // with what JSC does as well. - ScriptController* windowShell(DOMWrapperWorld*) { return this; } - ScriptController* existingWindowShell(DOMWrapperWorld*) { return this; } - // Creates a property of the global object of a frame. void bindToWindowObject(Frame*, const String& key, NPObject*); @@ -157,15 +135,6 @@ public: // FIXME: void* is a compile hack. void attachDebugger(void*); - // --- Static methods assume we are running VM in single thread, --- - // --- and there is only one VM instance. --- - - // Returns the frame for the entered context. See comments in - static Frame* retrieveFrameForEnteredContext(); - - // Returns the frame for the current context. See comments in - static Frame* retrieveFrameForCurrentContext(); - // Returns V8 Context. If none exists, creates a new context. // It is potentially slow and consumes memory. static v8::Local<v8::Context> mainWorldContext(Frame*); @@ -217,19 +186,24 @@ public: static int contextDebugId(v8::Handle<v8::Context>); private: + // Note: although the pointer is raw, the instance is kept alive by a strong + // reference to the v8 context it contains, which is not made weak until we + // call world->destroyIsolatedShell(). + typedef HashMap<int, V8DOMWindowShell*> IsolatedWorldMap; + typedef HashMap<int, RefPtr<SecurityOrigin> > IsolatedWorldSecurityOriginMap; + void resetIsolatedWorlds(); Frame* m_frame; const String* m_sourceURL; - // For the moment, we have one of these. Soon we will have one per DOMWrapperWorld. + V8DOMWindowShell* ensureIsolatedWorldContext(int worldId, int extensionGroup); OwnPtr<V8DOMWindowShell> m_windowShell; // The isolated worlds we are tracking for this frame. We hold them alive // here so that they can be used again by future calls to // evaluateInIsolatedWorld(). IsolatedWorldMap m_isolatedWorlds; - IsolatedWorldSecurityOriginMap m_isolatedWorldSecurityOrigins; bool m_paused; diff --git a/Source/WebCore/bindings/v8/SharedPersistent.h b/Source/WebCore/bindings/v8/SharedPersistent.h index 8825bd5ed..2e39a0630 100644 --- a/Source/WebCore/bindings/v8/SharedPersistent.h +++ b/Source/WebCore/bindings/v8/SharedPersistent.h @@ -31,45 +31,28 @@ #ifndef SharedPersistent_h #define SharedPersistent_h +#include "ScopedPersistent.h" #include <v8.h> #include <wtf/PassRefPtr.h> #include <wtf/RefCounted.h> namespace WebCore { - // A shareable reference to a v8 persistent handle. Using a shared - // persistent any number of objects can share a reference to a v8 - // object and when it should no longer be accessible the object's - // owner can clear it. + // FIXME: Remove this class. template <typename T> class SharedPersistent : public RefCounted<SharedPersistent<T> > { public: - void set(v8::Persistent<T> value) - { - m_value = value; - } - v8::Persistent<T> get() - { - return m_value; - } - void disposeHandle() - { - if (!m_value.IsEmpty()) { - m_value.Dispose(); - m_value.Clear(); - } - } - static PassRefPtr<SharedPersistent<T> > create(v8::Persistent<T> value) + static PassRefPtr<SharedPersistent<T> > create(v8::Handle<T> value) { return adoptRef(new SharedPersistent<T>(value)); } - static PassRefPtr<SharedPersistent<T> > create() + inline v8::Persistent<T> get() { - return create(v8::Persistent<T>()); + return m_value.get(); } private: - explicit SharedPersistent(v8::Persistent<T> value) : m_value(value) { } - v8::Persistent<T> m_value; + explicit SharedPersistent(v8::Handle<T> value) : m_value(value) { } + ScopedPersistent<T> m_value; }; } // namespace WebCore diff --git a/Source/WebCore/bindings/v8/V8Binding.cpp b/Source/WebCore/bindings/v8/V8Binding.cpp index f92148656..5c9046fdf 100644 --- a/Source/WebCore/bindings/v8/V8Binding.cpp +++ b/Source/WebCore/bindings/v8/V8Binding.cpp @@ -310,9 +310,9 @@ v8::Local<v8::Context> toV8Context(ScriptExecutionContext* context, const WorldC V8PerContextData* perContextDataForCurrentWorld(Frame* frame) { - V8IsolatedContext* isolatedContext; - if (UNLIKELY(!!(isolatedContext = V8IsolatedContext::getEntered()))) - return isolatedContext->perContextData(); + V8DOMWindowShell* isolatedShell; + if (UNLIKELY(!!(isolatedShell = V8DOMWindowShell::getEntered()))) + return isolatedShell->perContextData(); return frame->script()->windowShell()->perContextData(); } diff --git a/Source/WebCore/bindings/v8/V8Callback.h b/Source/WebCore/bindings/v8/V8Callback.h index 9253647fc..fee18b130 100644 --- a/Source/WebCore/bindings/v8/V8Callback.h +++ b/Source/WebCore/bindings/v8/V8Callback.h @@ -31,6 +31,8 @@ #ifndef V8Callback_h #define V8Callback_h +#include "ExceptionCode.h" +#include "V8Binding.h" #include <v8.h> namespace WebCore { @@ -40,6 +42,34 @@ class ScriptExecutionContext; bool invokeCallback(v8::Persistent<v8::Object> callback, int argc, v8::Handle<v8::Value> argv[], bool& callbackReturnValue, ScriptExecutionContext*); bool invokeCallback(v8::Persistent<v8::Object> callback, v8::Handle<v8::Object> thisObject, int argc, v8::Handle<v8::Value> argv[], bool& callbackReturnValue, ScriptExecutionContext*); +enum CallbackAllowedValueFlag { + CallbackAllowUndefined = 1, + CallbackAllowNull = 1 << 1 +}; + +typedef unsigned CallbackAllowedValueFlags; + +// 'FunctionOnly' is assumed for the created callback. +template <typename V8CallbackType> +PassRefPtr<V8CallbackType> createFunctionOnlyCallback(v8::Local<v8::Value> value, bool& succeeded, v8::Isolate* isolate, CallbackAllowedValueFlags acceptedValues = 0) +{ + succeeded = true; + + if (value->IsUndefined() && (acceptedValues & CallbackAllowUndefined)) + return 0; + + if (value->IsNull() && (acceptedValues & CallbackAllowNull)) + return 0; + + if (!value->IsFunction()) { + succeeded = false; + setDOMException(TYPE_MISMATCH_ERR, isolate); + return 0; + } + + return V8CallbackType::create(value, getScriptExecutionContext()); +} + } // namespace WebCore #endif // V8Callback_h diff --git a/Source/WebCore/bindings/v8/V8DOMWindowShell.cpp b/Source/WebCore/bindings/v8/V8DOMWindowShell.cpp index 8abc9e147..3f595547c 100644 --- a/Source/WebCore/bindings/v8/V8DOMWindowShell.cpp +++ b/Source/WebCore/bindings/v8/V8DOMWindowShell.cpp @@ -37,6 +37,7 @@ #include "DocumentLoader.h" #include "Frame.h" #include "FrameLoaderClient.h" +#include "InspectorInstrumentation.h" #include "MemoryUsageSupport.h" #include "Page.h" #include "PageGroup.h" @@ -170,13 +171,34 @@ static void checkDocumentWrapper(v8::Handle<v8::Object> wrapper, Document* docum ASSERT(!document->isHTMLDocument() || (V8Document::toNative(v8::Handle<v8::Object>::Cast(wrapper->GetPrototype())) == document)); } -PassOwnPtr<V8DOMWindowShell> V8DOMWindowShell::create(Frame* frame) +static void setIsolatedWorldField(V8DOMWindowShell* shell, v8::Local<v8::Context> context) { - return adoptPtr(new V8DOMWindowShell(frame)); + toInnerGlobalObject(context)->SetPointerInInternalField(V8DOMWindow::enteredIsolatedWorldIndex, shell); } -V8DOMWindowShell::V8DOMWindowShell(Frame* frame) +V8DOMWindowShell* V8DOMWindowShell::enteredIsolatedWorldContext() +{ + return static_cast<V8DOMWindowShell*>(toInnerGlobalObject(v8::Context::GetEntered())->GetPointerFromInternalField(V8DOMWindow::enteredIsolatedWorldIndex)); +} + +static void setInjectedScriptContextDebugId(v8::Handle<v8::Context> targetContext, int debugId) +{ + char buffer[32]; + if (debugId == -1) + snprintf(buffer, sizeof(buffer), "injected"); + else + snprintf(buffer, sizeof(buffer), "injected,%d", debugId); + targetContext->SetData(v8::String::New(buffer)); +} + +PassOwnPtr<V8DOMWindowShell> V8DOMWindowShell::create(Frame* frame, PassRefPtr<DOMWrapperWorld> world) +{ + return adoptPtr(new V8DOMWindowShell(frame, world)); +} + +V8DOMWindowShell::V8DOMWindowShell(Frame* frame, PassRefPtr<DOMWrapperWorld> world) : m_frame(frame) + , m_world(world) { } @@ -186,18 +208,41 @@ bool V8DOMWindowShell::isContextInitialized() return !m_context.isEmpty(); } -void V8DOMWindowShell::disposeContext() +void V8DOMWindowShell::destroyIsolatedShell() +{ + disposeContext(true); +} + +static void isolatedContextWeakCallback(v8::Persistent<v8::Value> object, void* parameter) { + // Handle will be disposed in delete. + delete static_cast<V8DOMWindowShell*>(parameter); +} + +void V8DOMWindowShell::disposeContext(bool weak) +{ + ASSERT(!m_context.get().IsWeak()); m_perContextData.clear(); - if (!m_context.isEmpty()) { - m_frame->loader()->client()->willReleaseScriptContext(m_context.get(), 0); + if (m_context.isEmpty()) + return; + + m_frame->loader()->client()->willReleaseScriptContext(m_context.get(), m_world->worldId()); + + if (!weak) m_context.clear(); + else { + ASSERT(!m_world->isMainWorld()); + destroyGlobal(); + m_frame = 0; + m_context.get().MakeWeak(this, isolatedContextWeakCallback); + } - // It's likely that disposing the context has created a lot of - // garbage. Notify V8 about this so it'll have a chance of cleaning - // it up when idle. - bool isMainFrame = m_frame->page() && (m_frame->page()->mainFrame() == m_frame); + // It's likely that disposing the context has created a lot of + // garbage. Notify V8 about this so it'll have a chance of cleaning + // it up when idle. + if (m_world->isMainWorld()) { + bool isMainFrame = m_frame->page() && (m_frame->page()->mainFrame() == m_frame); V8GCForContextDispose::instance().notifyContextDisposed(isMainFrame); } } @@ -284,10 +329,12 @@ bool V8DOMWindowShell::initializeIfNeeded() initializeV8IfNeeded(); - m_context.adopt(createNewContext(m_global.get(), 0, 0)); + createContext(); if (m_context.isEmpty()) return false; + bool isMainWorld = m_world->isMainWorld(); + v8::Local<v8::Context> context = v8::Local<v8::Context>::New(m_context.get()); v8::Context::Scope contextScope(context); @@ -299,47 +346,63 @@ bool V8DOMWindowShell::initializeIfNeeded() } } + // Flag context as isolated. + if (!isMainWorld) { + V8DOMWindowShell* mainWindow = m_frame->script()->windowShell(); + mainWindow->initializeIfNeeded(); + if (!mainWindow->context().IsEmpty()) + setInjectedScriptContextDebugId(m_context.get(), m_frame->script()->contextDebugId(mainWindow->context())); + setIsolatedWorldField(this, context); + } + m_perContextData = V8PerContextData::create(m_context.get()); if (!m_perContextData->init()) { disposeContext(); return false; } - if (!installDOMWindow(context, m_frame->document()->domWindow())) { + if (!installDOMWindow()) { disposeContext(); return false; } - updateDocument(); - - setSecurityToken(); - - if (m_frame->document()) - context->AllowCodeGenerationFromStrings(m_frame->document()->contentSecurityPolicy()->allowEval(0, ContentSecurityPolicy::SuppressReport)); - - m_frame->loader()->client()->didCreateScriptContext(m_context.get(), 0, 0); + if (isMainWorld) { + updateDocument(); + setSecurityToken(); + if (m_frame->document()) + context->AllowCodeGenerationFromStrings(m_frame->document()->contentSecurityPolicy()->allowEval(0, ContentSecurityPolicy::SuppressReport)); + } else { + // Using the default security token means that the canAccess is always + // called, which is slow. + // FIXME: Use tokens where possible. This will mean keeping track of all + // created contexts so that they can all be updated when the + // document domain + // changes. + m_context->UseDefaultSecurityToken(); + } + m_frame->loader()->client()->didCreateScriptContext(m_context.get(), m_world->extensionGroup(), m_world->worldId()); - // FIXME: This is wrong. We should actually do this for the proper world once - // we do isolated worlds the WebCore way. - m_frame->loader()->dispatchDidClearWindowObjectInWorld(0); + if (isMainWorld) { + // FIXME: This call is probably in the wrong spot, but causes a test timeout for http/tests/misc/window-open-then-write.html when removed. + // Additionally, ScriptController::existingWindowShell cannot be correctly implemented until this call is gone. + m_frame->loader()->dispatchDidClearWindowObjectInWorld(0); + } return true; } -v8::Persistent<v8::Context> V8DOMWindowShell::createNewContext(v8::Handle<v8::Object> global, int extensionGroup, int worldId) +void V8DOMWindowShell::createContext() { - v8::Persistent<v8::Context> result; - // The activeDocumentLoader pointer could be 0 during frame shutdown. // FIXME: Can we remove this check? if (!m_frame->loader()->activeDocumentLoader()) - return result; + return; // Create a new environment using an empty template for the shadow // object. Reuse the global object if one has been created earlier. v8::Persistent<v8::ObjectTemplate> globalTemplate = V8DOMWindow::GetShadowObjectTemplate(); if (globalTemplate.IsEmpty()) - return result; + return; // Used to avoid sleep calls in unload handlers. ScriptController::registerExtensionIfNeeded(DateExtension::get()); @@ -354,6 +417,8 @@ v8::Persistent<v8::Context> V8DOMWindowShell::createNewContext(v8::Handle<v8::Ob const V8Extensions& extensions = ScriptController::registeredExtensions(); OwnArrayPtr<const char*> extensionNames = adoptArrayPtr(new const char*[extensions.size()]); int index = 0; + int extensionGroup = m_world->extensionGroup(); + int worldId = m_world->worldId(); for (size_t i = 0; i < extensions.size(); ++i) { // Ensure our date extension is always allowed. if (extensions[i] != DateExtension::get() @@ -363,13 +428,13 @@ v8::Persistent<v8::Context> V8DOMWindowShell::createNewContext(v8::Handle<v8::Ob extensionNames[index++] = extensions[i]->name(); } v8::ExtensionConfiguration extensionConfiguration(index, extensionNames.get()); - result = v8::Context::New(&extensionConfiguration, globalTemplate, global); - return result; + m_context.adopt(v8::Context::New(&extensionConfiguration, globalTemplate, m_global.get())); } -bool V8DOMWindowShell::installDOMWindow(v8::Handle<v8::Context> context, DOMWindow* window) +bool V8DOMWindowShell::installDOMWindow() { + DOMWindow* window = m_frame->document()->domWindow(); v8::Local<v8::Object> windowWrapper = V8ObjectConstructor::newInstance(V8DOMWrapper::constructorForType(&V8DOMWindow::info, window)); if (windowWrapper.IsEmpty()) return false; @@ -393,7 +458,7 @@ bool V8DOMWindowShell::installDOMWindow(v8::Handle<v8::Context> context, DOMWind // outer, inner, and DOMWindow instance all appear to be the same // JavaScript object. // - v8::Handle<v8::Object> innerGlobalObject = toInnerGlobalObject(context); + v8::Handle<v8::Object> innerGlobalObject = toInnerGlobalObject(m_context.get()); V8DOMWrapper::setDOMWrapper(innerGlobalObject, &V8DOMWindow::info, window); innerGlobalObject->SetPrototype(windowWrapper); return true; @@ -401,11 +466,15 @@ bool V8DOMWindowShell::installDOMWindow(v8::Handle<v8::Context> context, DOMWind void V8DOMWindowShell::updateDocumentWrapper(v8::Handle<v8::Object> wrapper) { + ASSERT(m_world->isMainWorld()); m_document.set(wrapper); } void V8DOMWindowShell::updateDocumentProperty() { + if (!m_world->isMainWorld()) + return; + v8::HandleScope handleScope; // FIXME: Should we use a new Local handle here? v8::Context::Scope contextScope(m_context.get()); @@ -434,11 +503,15 @@ void V8DOMWindowShell::updateDocumentProperty() void V8DOMWindowShell::clearDocumentProperty() { ASSERT(!m_context.isEmpty()); + if (!m_world->isMainWorld()) + return; m_context->Global()->ForceDelete(v8::String::New("document")); } void V8DOMWindowShell::setSecurityToken() { + ASSERT(m_world->isMainWorld()); + Document* document = m_frame->document(); // Ask the document's SecurityOrigin to generate a security token. @@ -469,6 +542,7 @@ void V8DOMWindowShell::setSecurityToken() void V8DOMWindowShell::updateDocument() { + ASSERT(m_world->isMainWorld()); if (m_global.isEmpty()) return; if (!initializeIfNeeded()) @@ -494,6 +568,8 @@ static v8::Handle<v8::Value> getter(v8::Local<v8::String> property, const v8::Ac void V8DOMWindowShell::namedItemAdded(HTMLDocument* document, const AtomicString& name) { + ASSERT(m_world->isMainWorld()); + if (!initializeIfNeeded()) return; @@ -507,6 +583,8 @@ void V8DOMWindowShell::namedItemAdded(HTMLDocument* document, const AtomicString void V8DOMWindowShell::namedItemRemoved(HTMLDocument* document, const AtomicString& name) { + ASSERT(m_world->isMainWorld()); + if (document->hasNamedItem(name.impl()) || document->hasExtraNamedItem(name.impl())) return; @@ -523,10 +601,23 @@ void V8DOMWindowShell::namedItemRemoved(HTMLDocument* document, const AtomicStri void V8DOMWindowShell::updateSecurityOrigin() { + ASSERT(m_world->isMainWorld()); if (m_context.isEmpty()) return; v8::HandleScope handleScope; setSecurityToken(); } +void V8DOMWindowShell::setIsolatedWorldSecurityOrigin(PassRefPtr<SecurityOrigin> securityOrigin) +{ + ASSERT(!m_world->isMainWorld()); + // FIXME: Should this be here? + if (!m_isolatedWorldShellSecurityOrigin && !context().IsEmpty() && InspectorInstrumentation::hasFrontends()) { + v8::HandleScope handleScope; + ScriptState* scriptState = ScriptState::forContext(v8::Local<v8::Context>::New(context())); + InspectorInstrumentation::didCreateIsolatedContext(m_frame, scriptState, securityOrigin.get()); + } + m_isolatedWorldShellSecurityOrigin = securityOrigin; +} + } // WebCore diff --git a/Source/WebCore/bindings/v8/V8DOMWindowShell.h b/Source/WebCore/bindings/v8/V8DOMWindowShell.h index c61525738..01d29817f 100644 --- a/Source/WebCore/bindings/v8/V8DOMWindowShell.h +++ b/Source/WebCore/bindings/v8/V8DOMWindowShell.h @@ -31,7 +31,9 @@ #ifndef V8DOMWindowShell_h #define V8DOMWindowShell_h +#include "DOMWrapperWorld.h" #include "ScopedPersistent.h" +#include "SecurityOrigin.h" #include "V8PerContextData.h" #include "WrapperTypeInfo.h" #include <wtf/Forward.h> @@ -51,7 +53,7 @@ class HTMLDocument; // persist between navigations. class V8DOMWindowShell { public: - static PassOwnPtr<V8DOMWindowShell> create(Frame*); + static PassOwnPtr<V8DOMWindowShell> create(Frame*, PassRefPtr<DOMWrapperWorld>); v8::Persistent<v8::Context> context() const { return m_context.get(); } @@ -68,7 +70,6 @@ public: bool isContextInitialized(); v8::Persistent<v8::Context> createNewContext(v8::Handle<v8::Object> global, int extensionGroup, int worldId); - static bool installDOMWindow(v8::Handle<v8::Context> context, DOMWindow*); bool initializeIfNeeded(); void updateDocumentWrapper(v8::Handle<v8::Object> wrapper); @@ -80,10 +81,38 @@ public: V8PerContextData* perContextData() { return m_perContextData.get(); } + DOMWrapperWorld* world() { return m_world.get(); } + + void setIsolatedWorldSecurityOrigin(PassRefPtr<SecurityOrigin>); + SecurityOrigin* isolatedWorldSecurityOrigin() const + { + ASSERT(!m_world->isMainWorld()); + return m_isolatedWorldShellSecurityOrigin.get(); + }; + + // Returns the isolated world associated with + // v8::Context::GetEntered(). Because worlds are isolated, the entire + // JavaScript call stack should be from the same isolated world. + // Returns 0 if the entered context is from the main world. + // + // FIXME: Consider edge cases with DOM mutation events that might + // violate this invariant. + // + // FIXME: This is poorly named after the deletion of isolated contexts. + static V8DOMWindowShell* getEntered() + { + if (!DOMWrapperWorld::isolatedWorldsExist()) + return 0; + if (!v8::Context::InContext()) + return 0; + return enteredIsolatedWorldContext(); + } + + void destroyIsolatedShell(); private: - explicit V8DOMWindowShell(Frame*); + V8DOMWindowShell(Frame*, PassRefPtr<DOMWrapperWorld>); - void disposeContext(); + void disposeContext(bool weak = false); void setSecurityToken(); @@ -94,13 +123,22 @@ private: void updateDocumentProperty(); void clearDocumentProperty(); + void createContext(); + bool installDOMWindow(); + + static V8DOMWindowShell* enteredIsolatedWorldContext(); + Frame* m_frame; + RefPtr<DOMWrapperWorld> m_world; OwnPtr<V8PerContextData> m_perContextData; ScopedPersistent<v8::Context> m_context; ScopedPersistent<v8::Object> m_global; ScopedPersistent<v8::Object> m_document; + + // FIXME: Either remove this or the map in ScriptController. + RefPtr<SecurityOrigin> m_isolatedWorldShellSecurityOrigin; }; } // namespace WebCore diff --git a/Source/WebCore/bindings/v8/V8DOMWrapper.cpp b/Source/WebCore/bindings/v8/V8DOMWrapper.cpp index c94c579ae..fc3ab77a8 100644 --- a/Source/WebCore/bindings/v8/V8DOMWrapper.cpp +++ b/Source/WebCore/bindings/v8/V8DOMWrapper.cpp @@ -121,23 +121,6 @@ void V8DOMWrapper::setNamedHiddenReference(v8::Handle<v8::Object> parent, const parent->SetHiddenValue(V8HiddenPropertyName::hiddenReferenceName(name), child); } -void V8DOMWrapper::setNamedHiddenWindowReference(Frame* frame, const char* name, v8::Handle<v8::Value> jsObject) -{ - // Get DOMWindow - if (!frame) - return; // Object might be detached from window - v8::Handle<v8::Context> context = frame->script()->currentWorldContext(); - if (context.IsEmpty()) - return; - - v8::Handle<v8::Object> global = context->Global(); - // Look for real DOM wrapper. - global = V8DOMWrapper::lookupDOMWrapper(V8DOMWindow::GetTemplate(), global); - ASSERT(!global.IsEmpty()); - - setNamedHiddenReference(global, name, jsObject); -} - WrapperTypeInfo* V8DOMWrapper::domWrapperType(v8::Handle<v8::Object> object) { ASSERT(V8DOMWrapper::maybeDOMWrapper(object)); diff --git a/Source/WebCore/bindings/v8/V8DOMWrapper.h b/Source/WebCore/bindings/v8/V8DOMWrapper.h index a609e3279..e24479a1c 100644 --- a/Source/WebCore/bindings/v8/V8DOMWrapper.h +++ b/Source/WebCore/bindings/v8/V8DOMWrapper.h @@ -37,7 +37,7 @@ #include "NodeFilter.h" #include "V8CustomXPathNSResolver.h" #include "V8DOMMap.h" -#include "V8IsolatedContext.h" +#include "V8DOMWindowShell.h" #include "V8Utilities.h" #include "WrapperTypeInfo.h" #include <v8.h> @@ -110,14 +110,7 @@ namespace WebCore { // Check whether a V8 value is a wrapper of type |classType|. static bool isWrapperOfType(v8::Handle<v8::Value>, WrapperTypeInfo*); - // Proper object lifetime support. - // - // Helper functions to make sure the child object stays alive - // while the parent is alive. Using the name more than once - // overwrites previous references making it possible to free - // old children. static void setNamedHiddenReference(v8::Handle<v8::Object> parent, const char* name, v8::Handle<v8::Value> child); - static void setNamedHiddenWindowReference(Frame*, const char*, v8::Handle<v8::Value>); static v8::Local<v8::Object> instantiateV8Object(WrapperTypeInfo*, void*); @@ -130,7 +123,7 @@ namespace WebCore { return *wrapper; } - V8IsolatedContext* context = V8IsolatedContext::getEntered(); + V8DOMWindowShell* context = V8DOMWindowShell::getEntered(); if (LIKELY(!context)) { v8::Persistent<v8::Object>* wrapper = node->wrapper(); if (!wrapper) diff --git a/Source/WebCore/bindings/v8/V8GCController.cpp b/Source/WebCore/bindings/v8/V8GCController.cpp index 2a882dc76..f9d67531b 100644 --- a/Source/WebCore/bindings/v8/V8GCController.cpp +++ b/Source/WebCore/bindings/v8/V8GCController.cpp @@ -67,63 +67,6 @@ namespace WebCore { -#ifndef NDEBUG -// Keeps track of global handles created (not JS wrappers -// of DOM objects). Often these global handles are source -// of leaks. -// -// If you want to let a C++ object hold a persistent handle -// to a JS object, you should register the handle here to -// keep track of leaks. -// -// When creating a persistent handle, call: -// -// #ifndef NDEBUG -// V8GCController::registerGlobalHandle(type, host, handle); -// #endif -// -// When releasing the handle, call: -// -// #ifndef NDEBUG -// V8GCController::unregisterGlobalHandle(type, host, handle); -// #endif -// - -static GlobalHandleMap& currentGlobalHandleMap() -{ - return V8PerIsolateData::current()->globalHandleMap(); -} - -// The function is the place to set the break point to inspect -// live global handles. Leaks are often come from leaked global handles. -static void enumerateGlobalHandles() -{ - GlobalHandleMap& globalHandleMap = currentGlobalHandleMap(); - for (GlobalHandleMap::iterator it = globalHandleMap.begin(), end = globalHandleMap.end(); it != end; ++it) { - GlobalHandleInfo* info = it->second; - UNUSED_PARAM(info); - v8::Value* handle = it->first; - UNUSED_PARAM(handle); - } -} - -void V8GCController::registerGlobalHandle(GlobalHandleType type, void* host, v8::Persistent<v8::Value> handle) -{ - GlobalHandleMap& globalHandleMap = currentGlobalHandleMap(); - ASSERT(!globalHandleMap.contains(*handle)); - globalHandleMap.set(*handle, new GlobalHandleInfo(host, type)); -} - -void V8GCController::unregisterGlobalHandle(void* host, v8::Persistent<v8::Value> handle) -{ - GlobalHandleMap& globalHandleMap = currentGlobalHandleMap(); - ASSERT(globalHandleMap.contains(*handle)); - GlobalHandleInfo* info = globalHandleMap.take(*handle); - ASSERT(info->m_host == host); - delete info; -} -#endif // ifndef NDEBUG - typedef HashMap<Node*, v8::Object*> DOMNodeMap; typedef HashMap<void*, v8::Object*> DOMObjectMap; @@ -475,11 +418,6 @@ public: int V8GCController::workingSetEstimateMB = 0; -namespace { - - -} // anonymous namespace - void V8GCController::gcEpilogue() { v8::HandleScope scope; @@ -500,8 +438,6 @@ void V8GCController::gcEpilogue() EnsureWeakDOMNodeVisitor weakDOMNodeVisitor; visitDOMNodes(&weakDOMNodeVisitor); - - enumerateGlobalHandles(); #endif #if PLATFORM(CHROMIUM) @@ -536,11 +472,14 @@ void V8GCController::collectGarbage() { v8::HandleScope handleScope; - v8::Persistent<v8::Context> context = v8::Context::New(); - if (context.IsEmpty()) + ScopedPersistent<v8::Context> context; + + context.adopt(v8::Context::New()); + if (context.isEmpty()) return; + { - v8::Context::Scope scope(context); + v8::Context::Scope scope(context.get()); v8::Local<v8::String> source = v8::String::New("if (gc) gc();"); v8::Local<v8::String> name = v8::String::New("gc"); v8::Handle<v8::Script> script = v8::Script::Compile(source, name); @@ -549,7 +488,8 @@ void V8GCController::collectGarbage() script->Run(); } } - context.Dispose(); + + context.clear(); } } // namespace WebCore diff --git a/Source/WebCore/bindings/v8/V8GCController.h b/Source/WebCore/bindings/v8/V8GCController.h index f5f9c3a3a..b050dfc2d 100644 --- a/Source/WebCore/bindings/v8/V8GCController.h +++ b/Source/WebCore/bindings/v8/V8GCController.h @@ -35,54 +35,18 @@ namespace WebCore { -#ifndef NDEBUG - -#define GlobalHandleTypeList(V) \ - V(PROXY) \ - V(NPOBJECT) \ - V(SCHEDULED_ACTION) \ - V(EVENT_LISTENER) \ - V(NODE_FILTER) \ - V(SCRIPTINSTANCE) \ - V(SCRIPTVALUE) \ - V(DATASOURCE) - - - // Host information of persistent handles. - enum GlobalHandleType { -#define ENUM(name) name, - GlobalHandleTypeList(ENUM) -#undef ENUM - }; - - class GlobalHandleInfo { - public: - GlobalHandleInfo(void* host, GlobalHandleType type) : m_host(host), m_type(type) { } - void* m_host; - GlobalHandleType m_type; - }; - -#endif // NDEBUG - - class V8GCController { - public: -#ifndef NDEBUG - // For debugging and leak detection purpose. - static void registerGlobalHandle(GlobalHandleType, void*, v8::Persistent<v8::Value>); - static void unregisterGlobalHandle(void*, v8::Persistent<v8::Value>); -#endif - - static void gcPrologue(); - static void gcEpilogue(); - - static void checkMemoryUsage(); - static void hintForCollectGarbage(); - static void collectGarbage(); - - private: - // Estimate of current working set. - static int workingSetEstimateMB; - }; +class V8GCController { +public: + static void gcPrologue(); + static void gcEpilogue(); + + static void checkMemoryUsage(); + static void hintForCollectGarbage(); + static void collectGarbage(); + +private: + static int workingSetEstimateMB; +}; } diff --git a/Source/WebCore/bindings/v8/V8IsolatedContext.cpp b/Source/WebCore/bindings/v8/V8IsolatedContext.cpp deleted file mode 100644 index 98f8ec918..000000000 --- a/Source/WebCore/bindings/v8/V8IsolatedContext.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2009 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" - -#include "V8IsolatedContext.h" - -#include "Frame.h" -#include "FrameLoaderClient.h" -#include "InspectorInstrumentation.h" -#include "SecurityOrigin.h" -#include "V8DOMWindow.h" -#include "V8PerContextData.h" -#include <wtf/StringExtras.h> - -namespace WebCore { - -V8IsolatedContext* V8IsolatedContext::isolatedContext() -{ - return reinterpret_cast<V8IsolatedContext*>(getGlobalObject(v8::Context::GetEntered())->GetPointerFromInternalField(V8DOMWindow::enteredIsolatedWorldIndex)); -} - -void V8IsolatedContext::contextWeakReferenceCallback(v8::Persistent<v8::Value> object, void* isolatedContext) -{ - // Our context is going away. Time to clean up the world. - V8IsolatedContext* context = static_cast<V8IsolatedContext*>(isolatedContext); - delete context; -} - -static void setInjectedScriptContextDebugId(v8::Handle<v8::Context> targetContext, int debugId) -{ - char buffer[32]; - if (debugId == -1) - snprintf(buffer, sizeof(buffer), "injected"); - else - snprintf(buffer, sizeof(buffer), "injected,%d", debugId); - targetContext->SetData(v8::String::New(buffer)); -} - -V8IsolatedContext::V8IsolatedContext(Frame* frame, PassRefPtr<DOMWrapperWorld> world) - : m_world(world), - m_frame(frame) -{ - v8::HandleScope scope; - v8::Handle<v8::Context> mainWorldContext = frame->script()->windowShell()->context(); - if (mainWorldContext.IsEmpty()) - return; - - // FIXME: We should be creating a new V8DOMWindowShell here instead of riping out the context. - m_context = SharedPersistent<v8::Context>::create(frame->script()->windowShell()->createNewContext(v8::Handle<v8::Object>(), m_world->extensionGroup(), m_world->worldId())); - if (m_context->get().IsEmpty()) - return; - - // Run code in the new context. - v8::Context::Scope contextScope(m_context->get()); - - setInjectedScriptContextDebugId(m_context->get(), ScriptController::contextDebugId(mainWorldContext)); - - getGlobalObject(m_context->get())->SetPointerInInternalField(V8DOMWindow::enteredIsolatedWorldIndex, this); - - m_perContextData = V8PerContextData::create(m_context->get()); - m_perContextData->init(); - - // FIXME: This will go away once we have a windowShell for the isolated world. - frame->script()->windowShell()->installDOMWindow(m_context->get(), m_frame->document()->domWindow()); - - // Using the default security token means that the canAccess is always - // called, which is slow. - // FIXME: Use tokens where possible. This will mean keeping track of all - // created contexts so that they can all be updated when the - // document domain - // changes. - m_context->get()->UseDefaultSecurityToken(); - - m_frame->loader()->client()->didCreateScriptContext(context(), m_world->extensionGroup(), m_world->worldId()); -} - -void V8IsolatedContext::destroy() -{ - m_perContextData.clear(); - m_frame->loader()->client()->willReleaseScriptContext(context(), m_world->worldId()); - m_context->get().MakeWeak(this, &contextWeakReferenceCallback); - m_frame = 0; -} - -V8IsolatedContext::~V8IsolatedContext() -{ - m_context->disposeHandle(); -} - -void V8IsolatedContext::setSecurityOrigin(PassRefPtr<SecurityOrigin> securityOrigin) -{ - if (!m_securityOrigin && InspectorInstrumentation::hasFrontends() && !context().IsEmpty()) { - v8::HandleScope handleScope; - ScriptState* scriptState = ScriptState::forContext(v8::Local<v8::Context>::New(context())); - InspectorInstrumentation::didCreateIsolatedContext(m_frame, scriptState, securityOrigin.get()); - } - m_securityOrigin = securityOrigin; -} - -} // namespace WebCore diff --git a/Source/WebCore/bindings/v8/V8IsolatedContext.h b/Source/WebCore/bindings/v8/V8IsolatedContext.h deleted file mode 100644 index 9d1c2807d..000000000 --- a/Source/WebCore/bindings/v8/V8IsolatedContext.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2009 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef V8IsolatedContext_h -#define V8IsolatedContext_h - -#include "DOMWrapperWorld.h" -#include "ScriptSourceCode.h" // for WebCore::ScriptSourceCode -#include "SharedPersistent.h" -#include "V8Utilities.h" -#include <v8.h> - -namespace WebCore { - -class Frame; -class SecurityOrigin; -class V8PerContextData; - -// V8IsolatedContext -// -// V8IsolatedContext represents a isolated execution environment for -// JavaScript. Each isolated world executes in parallel with the main -// JavaScript world. An isolated world has access to the same DOM data -// structures as the main world but none of the JavaScript pointers. -// -// It is an error to ever share a JavaScript pointer between two isolated -// worlds or between an isolated world and the main world. Because -// isolated worlds have access to the DOM, they need their own DOM wrappers -// to avoid having pointers to the main world's DOM wrappers (which are -// JavaScript objects). -class V8IsolatedContext { -public: - // Creates an isolated world. To destroy it, call destroy(). - // This will delete the isolated world when the context it owns is GC'd. - V8IsolatedContext(Frame*, PassRefPtr<DOMWrapperWorld>); - ~V8IsolatedContext(); - - // Call this to destroy the isolated world. It will be deleted sometime - // after this call, once all script references to the world's context - // have been dropped. - void destroy(); - - // Returns the isolated world associated with - // v8::Context::GetEntered(). Because worlds are isolated, the entire - // JavaScript call stack should be from the same isolated world. - // Returns 0 if the entered context is from the main world. - // - // FIXME: Consider edge cases with DOM mutation events that might - // violate this invariant. - // - static V8IsolatedContext* getEntered() - { - // This is a temporary performance optimization. Essentially, - // GetHiddenValue is too slow for this code path. We need to get the - // V8 team to add a real property to v8::Context for isolated worlds. - // Until then, we optimize the common case of not having any isolated - // worlds at all. - if (!DOMWrapperWorld::isolatedWorldsExist()) - return 0; - if (!v8::Context::InContext()) - return 0; - return isolatedContext(); - } - - v8::Handle<v8::Context> context() { return m_context->get(); } - PassRefPtr<SharedPersistent<v8::Context> > sharedContext() { return m_context; } - - DOMWrapperWorld* world() const { return m_world.get(); } - - SecurityOrigin* securityOrigin() const { return m_securityOrigin.get(); } - void setSecurityOrigin(PassRefPtr<SecurityOrigin>); - - V8PerContextData* perContextData() { return m_perContextData.get(); } - -private: - static v8::Handle<v8::Object> getGlobalObject(v8::Handle<v8::Context> context) - { - return v8::Handle<v8::Object>::Cast(context->Global()->GetPrototype()); - } - - // Called by the garbage collector when our JavaScript context is about - // to be destroyed. - static void contextWeakReferenceCallback(v8::Persistent<v8::Value> object, void* isolatedContext); - - static V8IsolatedContext* isolatedContext(); - - // The underlying v8::Context. This object is keep on the heap as - // long as |m_context| has not been garbage collected. - RefPtr<SharedPersistent<v8::Context> > m_context; - - RefPtr<DOMWrapperWorld> m_world; - - RefPtr<SecurityOrigin> m_securityOrigin; - - Frame* m_frame; - - OwnPtr<V8PerContextData> m_perContextData; -}; - -} // namespace WebCore - -#endif // V8IsolatedContext_h diff --git a/Source/WebCore/bindings/v8/V8LazyEventListener.cpp b/Source/WebCore/bindings/v8/V8LazyEventListener.cpp index c1bbdbf77..cdb00179f 100644 --- a/Source/WebCore/bindings/v8/V8LazyEventListener.cpp +++ b/Source/WebCore/bindings/v8/V8LazyEventListener.cpp @@ -37,6 +37,7 @@ #include "HTMLElement.h" #include "HTMLFormElement.h" #include "Node.h" +#include "ScriptSourceCode.h" #include "V8Binding.h" #include "V8DOMWrapper.h" #include "V8Document.h" @@ -145,16 +146,15 @@ void V8LazyEventListener::prepareListenerObject(ScriptExecutionContext* context) // Call with 4 arguments instead of 3, pass additional null as the last parameter. // By calling the function with 4 arguments, we create a setter on arguments object // which would shadow property "3" on the prototype. - String code = ASCIILiteral("(function() {" \ - "with (this[2]) {" \ - "with (this[1]) {" \ - "with (this[0]) {"); - code.append("return function("); - code.append(m_eventParameterName); - code.append(") {"); - code.append(m_code); - // Insert '\n' otherwise //-style comments could break the handler. - code.append("\n};}}}})"); + String code = "(function() {" + "with (this[2]) {" + "with (this[1]) {" + "with (this[0]) {" + "return function(" + m_eventParameterName + ") {" + + m_code + "\n" // Insert '\n' otherwise //-style comments could break the handler. + "};" + "}}}})"; + v8::Handle<v8::String> codeExternalString = v8ExternalString(code); v8::Handle<v8::Script> script = ScriptSourceCode::compileScript(codeExternalString, m_sourceURL, m_position); @@ -219,14 +219,8 @@ void V8LazyEventListener::prepareListenerObject(ScriptExecutionContext* context) if (!toStringTemplate.IsEmpty()) toStringFunction = toStringTemplate->GetFunction(); if (!toStringFunction.IsEmpty()) { - String toStringResult = ASCIILiteral("function "); - toStringResult.append(m_functionName); - toStringResult.append("("); - toStringResult.append(m_eventParameterName); - toStringResult.append(") {\n "); - toStringResult.append(m_code); - toStringResult.append("\n}"); - wrappedFunction->SetHiddenValue(V8HiddenPropertyName::toStringString(), v8ExternalString(toStringResult)); + String toStringString = "function " + m_functionName + "(" + m_eventParameterName + ") {\n " + m_code + "\n}"; + wrappedFunction->SetHiddenValue(V8HiddenPropertyName::toStringString(), v8ExternalString(toStringString)); wrappedFunction->Set(v8::String::NewSymbol("toString"), toStringFunction); } diff --git a/Source/WebCore/bindings/v8/V8PerIsolateData.cpp b/Source/WebCore/bindings/v8/V8PerIsolateData.cpp index 33028a7ba..a7fc8d620 100644 --- a/Source/WebCore/bindings/v8/V8PerIsolateData.cpp +++ b/Source/WebCore/bindings/v8/V8PerIsolateData.cpp @@ -74,6 +74,13 @@ void V8PerIsolateData::dispose(v8::Isolate* isolate) isolate->SetData(0); } +v8::Handle<v8::FunctionTemplate> V8PerIsolateData::toStringTemplate() +{ + if (m_toStringTemplate.isEmpty()) + m_toStringTemplate.set(v8::FunctionTemplate::New(constructorOfToString)); + return v8::Local<v8::FunctionTemplate>::New(m_toStringTemplate.get()); +} + void V8PerIsolateData::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const { MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::Binding); @@ -107,6 +114,13 @@ void V8PerIsolateData::visitExternalStrings(ExternalStringVisitor* visitor) } #endif +v8::Handle<v8::Context> V8PerIsolateData::ensureAuxiliaryContext() +{ + if (m_auxiliaryContext.isEmpty()) + m_auxiliaryContext.adopt(v8::Context::New()); + return m_auxiliaryContext.get(); +} + v8::Handle<v8::Value> V8PerIsolateData::constructorOfToString(const v8::Arguments& args) { // The DOM constructors' toString functions grab the current toString diff --git a/Source/WebCore/bindings/v8/V8PerIsolateData.h b/Source/WebCore/bindings/v8/V8PerIsolateData.h index 31acf0ee6..fd0a77edd 100644 --- a/Source/WebCore/bindings/v8/V8PerIsolateData.h +++ b/Source/WebCore/bindings/v8/V8PerIsolateData.h @@ -26,6 +26,7 @@ #ifndef V8PerIsolateData_h #define V8PerIsolateData_h +#include "ScopedPersistent.h" #include <v8.h> #include <wtf/HashMap.h> #include <wtf/OwnPtr.h> @@ -47,11 +48,6 @@ class ExternalStringVisitor; typedef WTF::Vector<DOMDataStore*> DOMDataList; -#ifndef NDEBUG -class GlobalHandleInfo; -typedef HashMap<v8::Value*, GlobalHandleInfo*> GlobalHandleMap; -#endif - class V8PerIsolateData { public: static V8PerIsolateData* create(v8::Isolate*); @@ -70,13 +66,7 @@ public: TemplateMap& rawTemplateMap() { return m_rawTemplates; } TemplateMap& templateMap() { return m_templates; } - v8::Persistent<v8::FunctionTemplate>& toStringTemplate() - { - if (m_toStringTemplate.IsEmpty()) - m_toStringTemplate = v8::Persistent<v8::FunctionTemplate>::New(v8::FunctionTemplate::New(constructorOfToString)); - return m_toStringTemplate; - } - + v8::Handle<v8::FunctionTemplate> toStringTemplate(); v8::Persistent<v8::FunctionTemplate>& lazyEventListenerToStringTemplate() { return m_lazyEventListenerToStringTemplate; @@ -91,7 +81,7 @@ public: DOMDataList& allStores() { return m_domDataList; } V8HiddenPropertyName* hiddenPropertyName() { return m_hiddenPropertyName.get(); } - v8::Persistent<v8::Context>& auxiliaryContext() { return m_auxiliaryContext; } + v8::Handle<v8::Context> ensureAuxiliaryContext(); void registerDOMDataStore(DOMDataStore* domDataStore) { @@ -116,8 +106,6 @@ public: int nextDependentRetainedId() { return m_nextDependentRetainedId++; } #ifndef NDEBUG - GlobalHandleMap& globalHandleMap() { return m_globalHandleMap; } - int internalScriptRecursionLevel() const { return m_internalScriptRecursionLevel; } int incrementInternalScriptRecursionLevel() { return ++m_internalScriptRecursionLevel; } int decrementInternalScriptRecursionLevel() { return --m_internalScriptRecursionLevel; } @@ -142,7 +130,7 @@ private: TemplateMap m_rawTemplates; TemplateMap m_templates; - v8::Persistent<v8::FunctionTemplate> m_toStringTemplate; + ScopedPersistent<v8::FunctionTemplate> m_toStringTemplate; v8::Persistent<v8::FunctionTemplate> m_lazyEventListenerToStringTemplate; OwnPtr<StringCache> m_stringCache; OwnPtr<IntegerCache> m_integerCache; @@ -151,7 +139,7 @@ private: DOMDataStore* m_domDataStore; OwnPtr<V8HiddenPropertyName> m_hiddenPropertyName; - v8::Persistent<v8::Context> m_auxiliaryContext; + ScopedPersistent<v8::Context> m_auxiliaryContext; bool m_constructorMode; friend class ConstructorMode; @@ -160,7 +148,6 @@ private: int m_nextDependentRetainedId; #ifndef NDEBUG - GlobalHandleMap m_globalHandleMap; int m_internalScriptRecursionLevel; #endif OwnPtr<GCEventData> m_gcEventData; diff --git a/Source/WebCore/bindings/v8/V8Utilities.cpp b/Source/WebCore/bindings/v8/V8Utilities.cpp index 4621818e6..8c93e8341 100644 --- a/Source/WebCore/bindings/v8/V8Utilities.cpp +++ b/Source/WebCore/bindings/v8/V8Utilities.cpp @@ -48,24 +48,6 @@ namespace WebCore { -V8AuxiliaryContext::V8AuxiliaryContext() -{ - auxiliaryContext()->Enter(); -} - -V8AuxiliaryContext::~V8AuxiliaryContext() -{ - auxiliaryContext()->Exit(); -} - -v8::Persistent<v8::Context>& V8AuxiliaryContext::auxiliaryContext() -{ - v8::Persistent<v8::Context>& context = V8PerIsolateData::current()->auxiliaryContext(); - if (context.IsEmpty()) - context = v8::Context::New(); - return context; -} - // Use an array to hold dependents. It works like a ref-counted scheme. // A value can be added more than once to the DOM object. void createHiddenDependency(v8::Handle<v8::Object> object, v8::Local<v8::Value> value, int cacheIndex) @@ -181,9 +163,4 @@ ScriptExecutionContext* getScriptExecutionContext() return currentDocument(BindingState::instance()); } -void setTypeMismatchException(v8::Isolate* isolate) -{ - setDOMException(TYPE_MISMATCH_ERR, isolate); -} - } // namespace WebCore diff --git a/Source/WebCore/bindings/v8/V8Utilities.h b/Source/WebCore/bindings/v8/V8Utilities.h index d473a3940..4bc56ccaf 100644 --- a/Source/WebCore/bindings/v8/V8Utilities.h +++ b/Source/WebCore/bindings/v8/V8Utilities.h @@ -53,24 +53,6 @@ namespace WebCore { ScriptExecutionContext* getScriptExecutionContext(); - void setTypeMismatchException(v8::Isolate*); - - enum CallbackAllowedValueFlag { - CallbackAllowUndefined = 1, - CallbackAllowNull = 1 << 1 - }; - - typedef unsigned CallbackAllowedValueFlags; - - class V8AuxiliaryContext { - public: - V8AuxiliaryContext(); - virtual ~V8AuxiliaryContext(); - private: - v8::HandleScope m_handleScope; - static v8::Persistent<v8::Context>& auxiliaryContext(); - }; - typedef WTF::Vector<RefPtr<MessagePort>, 1> MessagePortArray; typedef WTF::Vector<RefPtr<ArrayBuffer>, 1> ArrayBufferArray; @@ -81,27 +63,6 @@ namespace WebCore { bool extractTransferables(v8::Local<v8::Value>, MessagePortArray&, ArrayBufferArray&, v8::Isolate*); bool getMessagePortArray(v8::Local<v8::Value>, MessagePortArray&, v8::Isolate*); - // 'FunctionOnly' is assumed for the created callback. - template <typename V8CallbackType> - PassRefPtr<V8CallbackType> createFunctionOnlyCallback(v8::Local<v8::Value> value, bool& succeeded, v8::Isolate* isolate, CallbackAllowedValueFlags acceptedValues = 0) - { - succeeded = true; - - if (value->IsUndefined() && (acceptedValues & CallbackAllowUndefined)) - return 0; - - if (value->IsNull() && (acceptedValues & CallbackAllowNull)) - return 0; - - if (!value->IsFunction()) { - succeeded = false; - setTypeMismatchException(isolate); - return 0; - } - - return V8CallbackType::create(value, getScriptExecutionContext()); - } - } // namespace WebCore #endif // V8Utilities_h diff --git a/Source/WebCore/bindings/v8/WorldContextHandle.cpp b/Source/WebCore/bindings/v8/WorldContextHandle.cpp index 488f3b527..180280abc 100644 --- a/Source/WebCore/bindings/v8/WorldContextHandle.cpp +++ b/Source/WebCore/bindings/v8/WorldContextHandle.cpp @@ -32,7 +32,7 @@ #include "WorldContextHandle.h" #include "ScriptController.h" -#include "V8IsolatedContext.h" +#include "V8DOMWindowShell.h" namespace WebCore { @@ -42,15 +42,22 @@ WorldContextHandle::WorldContextHandle(WorldToUse worldToUse) if (worldToUse == UseMainWorld) return; - if (V8IsolatedContext* context = V8IsolatedContext::getEntered()) - m_context = context->sharedContext(); + V8DOMWindowShell* shell = V8DOMWindowShell::getEntered(); + if (LIKELY(!shell)) { + m_worldToUse = UseMainWorld; + return; + } + + ASSERT(!shell->context().IsEmpty()); + m_context = SharedPersistent<v8::Context>::create(shell->context()); } v8::Local<v8::Context> WorldContextHandle::adjustedContext(ScriptController* script) const { - if (m_worldToUse == UseMainWorld || !m_context || m_context->get().IsEmpty()) + if (m_worldToUse == UseMainWorld) return script->mainWorldContext(); + ASSERT(!m_context->get().IsEmpty()); return v8::Local<v8::Context>::New(m_context->get()); } diff --git a/Source/WebCore/bindings/v8/custom/V8AudioContextCustom.cpp b/Source/WebCore/bindings/v8/custom/V8AudioContextCustom.cpp index 56b12dcdf..01a8ca7bd 100644 --- a/Source/WebCore/bindings/v8/custom/V8AudioContextCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8AudioContextCustom.cpp @@ -49,13 +49,7 @@ v8::Handle<v8::Value> V8AudioContext::constructorCallback(const v8::Arguments& a if (ConstructorMode::current() == ConstructorMode::WrapExistingObject) return args.Holder(); - Frame* frame = currentFrame(BindingState::instance()); - if (!frame) - return throwError(ReferenceError, "AudioContext constructor associated frame is unavailable", args.GetIsolate()); - - Document* document = frame->document(); - if (!document) - return throwError(ReferenceError, "AudioContext constructor associated document is unavailable", args.GetIsolate()); + Document* document = currentDocument(BindingState::instance()); RefPtr<AudioContext> audioContext; diff --git a/Source/WebCore/bindings/v8/custom/V8BlobCustom.cpp b/Source/WebCore/bindings/v8/custom/V8BlobCustom.cpp index ea2a3a1da..0a81a8d66 100644 --- a/Source/WebCore/bindings/v8/custom/V8BlobCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8BlobCustom.cpp @@ -64,10 +64,7 @@ v8::Handle<v8::Value> V8Blob::constructorCallback(const v8::Arguments& args) if (ConstructorMode::current() == ConstructorMode::WrapExistingObject) return args.Holder(); - // Get the script execution context. ScriptExecutionContext* context = getScriptExecutionContext(); - if (!context) - return throwError(ReferenceError, "Blob constructor associated document is unavailable", args.GetIsolate()); if (!args.Length()) { RefPtr<Blob> blob = Blob::create(); diff --git a/Source/WebCore/bindings/v8/custom/V8CustomXPathNSResolver.cpp b/Source/WebCore/bindings/v8/custom/V8CustomXPathNSResolver.cpp index 8eddc6bd8..3a3e9f72f 100644 --- a/Source/WebCore/bindings/v8/custom/V8CustomXPathNSResolver.cpp +++ b/Source/WebCore/bindings/v8/custom/V8CustomXPathNSResolver.cpp @@ -30,6 +30,8 @@ #include "config.h" #include "V8CustomXPathNSResolver.h" +#include "Console.h" +#include "DOMWindow.h" #include "ScriptCallStack.h" #include "ScriptController.h" #include "ScriptExecutionContext.h" @@ -66,14 +68,13 @@ String V8CustomXPathNSResolver::lookupNamespaceURI(const String& prefix) } if (lookupNamespaceURIFunc.IsEmpty() && !m_resolver->IsFunction()) { - if (ScriptExecutionContext* context = getScriptExecutionContext()) - context->addConsoleMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "XPathNSResolver does not have a lookupNamespaceURI method."); + activeDOMWindow(BindingState::instance())->console()->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, "XPathNSResolver does not have a lookupNamespaceURI method."); return String(); } // Catch exceptions from calling the namespace resolver. - v8::TryCatch try_catch; - try_catch.SetVerbose(true); // Print exceptions to console. + v8::TryCatch tryCatch; + tryCatch.SetVerbose(true); // Print exceptions to console. const int argc = 1; v8::Handle<v8::Value> argv[argc] = { v8String(prefix) }; @@ -82,7 +83,7 @@ String V8CustomXPathNSResolver::lookupNamespaceURI(const String& prefix) v8::Handle<v8::Value> retval = ScriptController::callFunctionWithInstrumentation(0, function, m_resolver, argc, argv); // Eat exceptions from namespace resolver and return an empty string. This will most likely cause NAMESPACE_ERR. - if (try_catch.HasCaught()) + if (tryCatch.HasCaught()) return String(); return toWebCoreStringWithNullCheck(retval); diff --git a/Source/WebCore/bindings/v8/custom/V8DocumentCustom.cpp b/Source/WebCore/bindings/v8/custom/V8DocumentCustom.cpp index 591144f8b..781a7b726 100644 --- a/Source/WebCore/bindings/v8/custom/V8DocumentCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8DocumentCustom.cpp @@ -44,9 +44,9 @@ #include "V8CanvasRenderingContext2D.h" #include "V8CustomXPathNSResolver.h" #include "V8DOMImplementation.h" +#include "V8DOMWindowShell.h" #include "V8DOMWrapper.h" #include "V8HTMLDocument.h" -#include "V8IsolatedContext.h" #include "V8Node.h" #include "V8Touch.h" #include "V8TouchList.h" @@ -130,7 +130,7 @@ v8::Handle<v8::Value> toV8(Document* impl, v8::Handle<v8::Object> creationContex v8::Handle<v8::Object> wrapper = V8Document::wrap(impl, creationContext, isolate, forceNewObject); if (wrapper.IsEmpty()) return wrapper; - if (!V8IsolatedContext::getEntered()) { + if (!V8DOMWindowShell::getEntered()) { if (Frame* frame = impl->frame()) frame->script()->windowShell()->updateDocumentWrapper(wrapper); } diff --git a/Source/WebCore/bindings/v8/custom/V8GeolocationCustom.cpp b/Source/WebCore/bindings/v8/custom/V8GeolocationCustom.cpp index 3734a23d5..ec2f54f27 100644 --- a/Source/WebCore/bindings/v8/custom/V8GeolocationCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8GeolocationCustom.cpp @@ -31,6 +31,7 @@ #include "Frame.h" #include "Geolocation.h" #include "V8Binding.h" +#include "V8Callback.h" #include "V8PositionCallback.h" #include "V8PositionErrorCallback.h" #include "V8Utilities.h" diff --git a/Source/WebCore/bindings/v8/custom/V8HTMLDocumentCustom.cpp b/Source/WebCore/bindings/v8/custom/V8HTMLDocumentCustom.cpp index ca397547d..e50a2603e 100644 --- a/Source/WebCore/bindings/v8/custom/V8HTMLDocumentCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8HTMLDocumentCustom.cpp @@ -40,9 +40,9 @@ #include "HTMLNames.h" #include "V8Binding.h" #include "V8DOMWindow.h" +#include "V8DOMWindowShell.h" #include "V8HTMLAllCollection.h" #include "V8HTMLCollection.h" -#include "V8IsolatedContext.h" #include "V8Node.h" #include "V8RecursionScope.h" #include <wtf/text/StringBuilder.h> @@ -119,8 +119,7 @@ v8::Handle<v8::Value> V8HTMLDocument::writeCallback(const v8::Arguments& args) { INC_STATS("DOM.HTMLDocument.write()"); HTMLDocument* htmlDocument = V8HTMLDocument::toNative(args.Holder()); - Frame* frame = activeFrame(BindingState::instance()); - htmlDocument->write(writeHelperGetString(args), frame ? frame->document() : NULL); + htmlDocument->write(writeHelperGetString(args), activeDOMWindow(BindingState::instance())->document()); return v8::Undefined(); } @@ -128,8 +127,7 @@ v8::Handle<v8::Value> V8HTMLDocument::writelnCallback(const v8::Arguments& args) { INC_STATS("DOM.HTMLDocument.writeln()"); HTMLDocument* htmlDocument = V8HTMLDocument::toNative(args.Holder()); - Frame* frame = activeFrame(BindingState::instance()); - htmlDocument->writeln(writeHelperGetString(args), frame ? frame->document() : NULL); + htmlDocument->writeln(writeHelperGetString(args), activeDOMWindow(BindingState::instance())->document()); return v8::Undefined(); } @@ -160,9 +158,7 @@ v8::Handle<v8::Value> V8HTMLDocument::openCallback(const v8::Arguments& args) } } - Frame* frame = activeFrame(BindingState::instance()); - htmlDocument->open(frame ? frame->document() : NULL); - // Return the document. + htmlDocument->open(activeDOMWindow(BindingState::instance())->document()); return args.Holder(); } @@ -187,7 +183,7 @@ v8::Handle<v8::Value> toV8(HTMLDocument* impl, v8::Handle<v8::Object> creationCo v8::Handle<v8::Object> wrapper = V8HTMLDocument::wrap(impl, creationContext, isolate, forceNewObject); if (wrapper.IsEmpty()) return wrapper; - if (!V8IsolatedContext::getEntered()) { + if (!V8DOMWindowShell::getEntered()) { if (Frame* frame = impl->frame()) frame->script()->windowShell()->updateDocumentWrapper(wrapper); } diff --git a/Source/WebCore/bindings/v8/custom/V8HTMLImageElementConstructor.cpp b/Source/WebCore/bindings/v8/custom/V8HTMLImageElementConstructor.cpp index 9e8dfe830..60a84a0cb 100644 --- a/Source/WebCore/bindings/v8/custom/V8HTMLImageElementConstructor.cpp +++ b/Source/WebCore/bindings/v8/custom/V8HTMLImageElementConstructor.cpp @@ -55,14 +55,7 @@ static v8::Handle<v8::Value> v8HTMLImageElementConstructorCallback(const v8::Arg if (ConstructorMode::current() == ConstructorMode::WrapExistingObject) return args.Holder(); - // FIXME: We shouldn't need to go through the Frame to get the Document. - Frame* frame = currentFrame(BindingState::instance()); - if (!frame) - return throwError(ReferenceError, "Image constructor associated frame is unavailable", args.GetIsolate()); - - Document* document = frame->document(); - if (!document) - return throwError(ReferenceError, "Image constructor associated document is unavailable", args.GetIsolate()); + Document* document = currentDocument(BindingState::instance()); // Make sure the document is added to the DOM Node map. Otherwise, the HTMLImageElement instance // may end up being the only node in the map and get garbage-collected prematurely. diff --git a/Source/WebCore/bindings/v8/custom/V8LocationCustom.cpp b/Source/WebCore/bindings/v8/custom/V8LocationCustom.cpp index 45fdce79b..7833ea4bc 100644 --- a/Source/WebCore/bindings/v8/custom/V8LocationCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8LocationCustom.cpp @@ -270,17 +270,4 @@ bool V8Location::namedSecurityCheck(v8::Local<v8::Object> host, v8::Local<v8::Va return BindingSecurity::shouldAllowAccessToFrame(BindingState::instance(), imp->frame(), DoNotReportSecurityError); } -v8::Handle<v8::Value> toV8(Location* impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) -{ - if (!impl) - return v8NullWithCheck(isolate); - v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(impl); - if (wrapper.IsEmpty()) { - wrapper = V8Location::wrap(impl, creationContext, isolate); - if (!wrapper.IsEmpty()) - V8DOMWrapper::setNamedHiddenWindowReference(impl->frame(), "location", wrapper); - } - return wrapper; -} - } // namespace WebCore diff --git a/Source/WebCore/bindings/v8/custom/V8MessageChannelConstructor.cpp b/Source/WebCore/bindings/v8/custom/V8MessageChannelConstructor.cpp index 78cf4f319..c9e6c109c 100644 --- a/Source/WebCore/bindings/v8/custom/V8MessageChannelConstructor.cpp +++ b/Source/WebCore/bindings/v8/custom/V8MessageChannelConstructor.cpp @@ -47,36 +47,28 @@ namespace WebCore { v8::Handle<v8::Value> V8MessageChannel::constructorCallback(const v8::Arguments& args) { INC_STATS("DOM.MessageChannel.Constructor"); - // FIXME: The logic here is almost exact duplicate of V8::constructDOMObject. - // Consider refactoring to reduce duplication. + if (!args.IsConstructCall()) return throwTypeError("DOM object constructor cannot be called as a function.", args.GetIsolate()); if (ConstructorMode::current() == ConstructorMode::WrapExistingObject) return args.Holder(); - // Get the ScriptExecutionContext (WorkerContext or Document) ScriptExecutionContext* context = getScriptExecutionContext(); - if (!context) - return v8::Undefined(); - // Note: it's OK to let this RefPtr go out of scope because we also call - // SetDOMWrapper(), which effectively holds a reference to obj. RefPtr<MessageChannel> obj = MessageChannel::create(context); - v8::Local<v8::Object> messageChannel = args.Holder(); + v8::Local<v8::Object> wrapper = args.Holder(); // Create references from the MessageChannel wrapper to the two // MessagePort wrappers to make sure that the MessagePort wrappers // stay alive as long as the MessageChannel wrapper is around. - V8DOMWrapper::setNamedHiddenReference(messageChannel, "port1", toV8(obj->port1(), args.Holder(), args.GetIsolate())); - V8DOMWrapper::setNamedHiddenReference(messageChannel, "port2", toV8(obj->port2(), args.Holder(), args.GetIsolate())); + V8DOMWrapper::setNamedHiddenReference(wrapper, "port1", toV8(obj->port1(), args.Holder(), args.GetIsolate())); + V8DOMWrapper::setNamedHiddenReference(wrapper, "port2", toV8(obj->port2(), args.Holder(), args.GetIsolate())); - // Setup the standard wrapper object internal fields. - V8DOMWrapper::setDOMWrapper(messageChannel, &info, obj.get()); - V8DOMWrapper::setJSWrapperForDOMObject(obj.release(), messageChannel); - return messageChannel; + V8DOMWrapper::setDOMWrapper(wrapper, &info, obj.get()); + V8DOMWrapper::setJSWrapperForDOMObject(obj.release(), wrapper); + return wrapper; } - } // namespace WebCore diff --git a/Source/WebCore/bindings/v8/custom/V8MutationObserverCustom.cpp b/Source/WebCore/bindings/v8/custom/V8MutationObserverCustom.cpp index d1ce128d9..68f4c7aa5 100644 --- a/Source/WebCore/bindings/v8/custom/V8MutationObserverCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8MutationObserverCustom.cpp @@ -61,8 +61,6 @@ v8::Handle<v8::Value> V8MutationObserver::constructorCallback(const v8::Argument return setDOMException(TYPE_MISMATCH_ERR, args.GetIsolate()); ScriptExecutionContext* context = getScriptExecutionContext(); - if (!context) - return throwError(ReferenceError, "MutationObserver constructor's associated frame unavailable", args.GetIsolate()); RefPtr<MutationCallback> callback = V8MutationCallback::create(arg, context); RefPtr<MutationObserver> observer = MutationObserver::create(callback.release()); diff --git a/Source/WebCore/bindings/v8/custom/V8NotificationCustom.cpp b/Source/WebCore/bindings/v8/custom/V8NotificationCustom.cpp index 7565ffe48..c1f142ce9 100644 --- a/Source/WebCore/bindings/v8/custom/V8NotificationCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8NotificationCustom.cpp @@ -29,6 +29,7 @@ #include "V8Notification.h" #include "ExceptionCode.h" +#include "V8Callback.h" #include "V8NotificationPermissionCallback.h" namespace WebCore { diff --git a/Source/WebCore/bindings/v8/custom/V8SQLTransactionCustom.cpp b/Source/WebCore/bindings/v8/custom/V8SQLTransactionCustom.cpp index 1ce14c10d..593acbb94 100644 --- a/Source/WebCore/bindings/v8/custom/V8SQLTransactionCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8SQLTransactionCustom.cpp @@ -89,8 +89,6 @@ v8::Handle<v8::Value> V8SQLTransaction::executeSqlCallback(const v8::Arguments& SQLTransaction* transaction = V8SQLTransaction::toNative(args.Holder()); ScriptExecutionContext* scriptExecutionContext = getScriptExecutionContext(); - if (!scriptExecutionContext) - return v8::Undefined(); RefPtr<SQLStatementCallback> callback; if (args.Length() > 2 && !isUndefinedOrNull(args[2])) { diff --git a/Source/WebCore/bindings/v8/custom/V8SVGDocumentCustom.cpp b/Source/WebCore/bindings/v8/custom/V8SVGDocumentCustom.cpp index a6f41b6db..da166a7af 100644 --- a/Source/WebCore/bindings/v8/custom/V8SVGDocumentCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8SVGDocumentCustom.cpp @@ -34,7 +34,7 @@ #include "V8SVGDocument.h" #include "Frame.h" -#include "V8IsolatedContext.h" +#include "V8DOMWindowShell.h" namespace WebCore { @@ -45,7 +45,7 @@ v8::Handle<v8::Value> toV8(SVGDocument* impl, v8::Handle<v8::Object> creationCon v8::Handle<v8::Object> wrapper = V8SVGDocument::wrap(impl, creationContext, isolate, forceNewObject); if (wrapper.IsEmpty()) return wrapper; - if (!V8IsolatedContext::getEntered()) { + if (!V8DOMWindowShell::getEntered()) { if (Frame* frame = impl->frame()) frame->script()->windowShell()->updateDocumentWrapper(wrapper); } diff --git a/Source/WebCore/bindings/v8/custom/V8WebSocketCustom.cpp b/Source/WebCore/bindings/v8/custom/V8WebSocketCustom.cpp index 7411dac0d..900a5625e 100644 --- a/Source/WebCore/bindings/v8/custom/V8WebSocketCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8WebSocketCustom.cpp @@ -71,11 +71,7 @@ v8::Handle<v8::Value> V8WebSocket::constructorCallback(const v8::Arguments& args if (urlstring.IsEmpty()) return throwError(SyntaxError, "Empty URL", args.GetIsolate()); - // Get the script execution context. ScriptExecutionContext* context = getScriptExecutionContext(); - if (!context) - return throwError(ReferenceError, "WebSocket constructor's associated frame is not available", args.GetIsolate()); - const KURL& url = context->completeURL(toWebCoreString(urlstring)); RefPtr<WebSocket> webSocket = WebSocket::create(context); diff --git a/Source/WebCore/bindings/v8/custom/V8XMLHttpRequestConstructor.cpp b/Source/WebCore/bindings/v8/custom/V8XMLHttpRequestConstructor.cpp index c0e9c5b92..050b7fb4d 100644 --- a/Source/WebCore/bindings/v8/custom/V8XMLHttpRequestConstructor.cpp +++ b/Source/WebCore/bindings/v8/custom/V8XMLHttpRequestConstructor.cpp @@ -35,7 +35,7 @@ #include "OriginAccessEntry.h" #include "SecurityOrigin.h" #include "V8Binding.h" -#include "V8IsolatedContext.h" +#include "V8DOMWindowShell.h" #include "V8Utilities.h" #include "WorkerContext.h" #include "WorkerContextExecutionProxy.h" @@ -52,16 +52,14 @@ v8::Handle<v8::Value> V8XMLHttpRequest::constructorCallback(const v8::Arguments& if (ConstructorMode::current() == ConstructorMode::WrapExistingObject) return args.Holder(); - // Expect no parameters. - // Allocate a XMLHttpRequest object as its internal field. ScriptExecutionContext* context = getScriptExecutionContext(); - if (!context) - return throwError(ReferenceError, "XMLHttpRequest constructor's associated context is not available", args.GetIsolate()); RefPtr<SecurityOrigin> securityOrigin; - if (V8IsolatedContext* isolatedContext = V8IsolatedContext::getEntered()) - securityOrigin = isolatedContext->securityOrigin(); + if (V8DOMWindowShell* isolatedWorldShell = V8DOMWindowShell::getEntered()) + securityOrigin = isolatedWorldShell->isolatedWorldSecurityOrigin(); + RefPtr<XMLHttpRequest> xmlHttpRequest = XMLHttpRequest::create(context, securityOrigin); + v8::Handle<v8::Object> wrapper = args.Holder(); V8DOMWrapper::setDOMWrapper(wrapper, &info, xmlHttpRequest.get()); V8DOMWrapper::setJSWrapperForActiveDOMObject(xmlHttpRequest.release(), wrapper); diff --git a/Source/WebCore/bindings/v8/custom/V8XMLHttpRequestCustom.cpp b/Source/WebCore/bindings/v8/custom/V8XMLHttpRequestCustom.cpp index 154d67054..8584560b4 100644 --- a/Source/WebCore/bindings/v8/custom/V8XMLHttpRequestCustom.cpp +++ b/Source/WebCore/bindings/v8/custom/V8XMLHttpRequestCustom.cpp @@ -117,10 +117,8 @@ v8::Handle<v8::Value> V8XMLHttpRequest::openCallback(const v8::Arguments& args) String method = toWebCoreString(args[0]); String urlstring = toWebCoreString(args[1]); - ScriptExecutionContext* context = getScriptExecutionContext(); - if (!context) - return v8::Undefined(); + ScriptExecutionContext* context = getScriptExecutionContext(); KURL url = context->completeURL(urlstring); ExceptionCode ec = 0; diff --git a/Source/WebCore/css/CSSAspectRatioValue.cpp b/Source/WebCore/css/CSSAspectRatioValue.cpp index 15292be2e..830f8cf79 100644 --- a/Source/WebCore/css/CSSAspectRatioValue.cpp +++ b/Source/WebCore/css/CSSAspectRatioValue.cpp @@ -36,11 +36,7 @@ namespace WebCore { String CSSAspectRatioValue::customCssText() const { - StringBuilder result; - result.append(String::number(m_numeratorValue)); - result.append("/"); - result.append(String::number(m_denominatorValue)); - return result.toString(); + return String::number(m_numeratorValue) + '/' + String::number(m_denominatorValue); } void CSSAspectRatioValue::reportDescendantMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const diff --git a/Source/WebCore/css/CSSPrimitiveValue.cpp b/Source/WebCore/css/CSSPrimitiveValue.cpp index c1bd02233..5d2a7f7e4 100644 --- a/Source/WebCore/css/CSSPrimitiveValue.cpp +++ b/Source/WebCore/css/CSSPrimitiveValue.cpp @@ -56,65 +56,65 @@ namespace WebCore { static inline bool isValidCSSUnitTypeForDoubleConversion(CSSPrimitiveValue::UnitTypes unitType) { switch (unitType) { - case CSSPrimitiveValue:: CSS_CALC: - case CSSPrimitiveValue:: CSS_CALC_PERCENTAGE_WITH_NUMBER: - case CSSPrimitiveValue:: CSS_CALC_PERCENTAGE_WITH_LENGTH: - case CSSPrimitiveValue:: CSS_CM: - case CSSPrimitiveValue:: CSS_DEG: - case CSSPrimitiveValue:: CSS_DIMENSION: + case CSSPrimitiveValue::CSS_CALC: + case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_NUMBER: + case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_LENGTH: + case CSSPrimitiveValue::CSS_CM: + case CSSPrimitiveValue::CSS_DEG: + case CSSPrimitiveValue::CSS_DIMENSION: #if ENABLE(CSS_IMAGE_RESOLUTION) - case CSSPrimitiveValue:: CSS_DPPX: - case CSSPrimitiveValue:: CSS_DPI: - case CSSPrimitiveValue:: CSS_DPCM: + case CSSPrimitiveValue::CSS_DPPX: + case CSSPrimitiveValue::CSS_DPI: + case CSSPrimitiveValue::CSS_DPCM: #endif - case CSSPrimitiveValue:: CSS_EMS: - case CSSPrimitiveValue:: CSS_EXS: - case CSSPrimitiveValue:: CSS_GRAD: - case CSSPrimitiveValue:: CSS_HZ: - case CSSPrimitiveValue:: CSS_IN: - case CSSPrimitiveValue:: CSS_KHZ: - case CSSPrimitiveValue:: CSS_MM: - case CSSPrimitiveValue:: CSS_MS: - case CSSPrimitiveValue:: CSS_NUMBER: - case CSSPrimitiveValue:: CSS_PERCENTAGE: - case CSSPrimitiveValue:: CSS_PC: - case CSSPrimitiveValue:: CSS_PT: - case CSSPrimitiveValue:: CSS_PX: - case CSSPrimitiveValue:: CSS_RAD: - case CSSPrimitiveValue:: CSS_REMS: - case CSSPrimitiveValue:: CSS_S: - case CSSPrimitiveValue:: CSS_TURN: - case CSSPrimitiveValue:: CSS_VW: - case CSSPrimitiveValue:: CSS_VH: - case CSSPrimitiveValue:: CSS_VMIN: + case CSSPrimitiveValue::CSS_EMS: + case CSSPrimitiveValue::CSS_EXS: + case CSSPrimitiveValue::CSS_GRAD: + case CSSPrimitiveValue::CSS_HZ: + case CSSPrimitiveValue::CSS_IN: + case CSSPrimitiveValue::CSS_KHZ: + case CSSPrimitiveValue::CSS_MM: + case CSSPrimitiveValue::CSS_MS: + case CSSPrimitiveValue::CSS_NUMBER: + case CSSPrimitiveValue::CSS_PERCENTAGE: + case CSSPrimitiveValue::CSS_PC: + case CSSPrimitiveValue::CSS_PT: + case CSSPrimitiveValue::CSS_PX: + case CSSPrimitiveValue::CSS_RAD: + case CSSPrimitiveValue::CSS_REMS: + case CSSPrimitiveValue::CSS_S: + case CSSPrimitiveValue::CSS_TURN: + case CSSPrimitiveValue::CSS_VW: + case CSSPrimitiveValue::CSS_VH: + case CSSPrimitiveValue::CSS_VMIN: return true; - case CSSPrimitiveValue:: CSS_ATTR: - case CSSPrimitiveValue:: CSS_COUNTER: - case CSSPrimitiveValue:: CSS_COUNTER_NAME: + case CSSPrimitiveValue::CSS_ATTR: + case CSSPrimitiveValue::CSS_COUNTER: + case CSSPrimitiveValue::CSS_COUNTER_NAME: #if ENABLE(DASHBOARD_SUPPORT) || ENABLE(WIDGET_REGION) - case CSSPrimitiveValue:: CSS_DASHBOARD_REGION: + case CSSPrimitiveValue::CSS_DASHBOARD_REGION: #endif #if !ENABLE(CSS_IMAGE_RESOLUTION) - case CSSPrimitiveValue:: CSS_DPPX: - case CSSPrimitiveValue:: CSS_DPI: - case CSSPrimitiveValue:: CSS_DPCM: + case CSSPrimitiveValue::CSS_DPPX: + case CSSPrimitiveValue::CSS_DPI: + case CSSPrimitiveValue::CSS_DPCM: #endif - case CSSPrimitiveValue:: CSS_IDENT: - case CSSPrimitiveValue:: CSS_PAIR: - case CSSPrimitiveValue:: CSS_PARSER_HEXCOLOR: - case CSSPrimitiveValue:: CSS_PARSER_IDENTIFIER: - case CSSPrimitiveValue:: CSS_PARSER_INTEGER: - case CSSPrimitiveValue:: CSS_PARSER_OPERATOR: - case CSSPrimitiveValue:: CSS_RECT: - case CSSPrimitiveValue:: CSS_QUAD: - case CSSPrimitiveValue:: CSS_RGBCOLOR: - case CSSPrimitiveValue:: CSS_SHAPE: - case CSSPrimitiveValue:: CSS_STRING: - case CSSPrimitiveValue:: CSS_UNICODE_RANGE: - case CSSPrimitiveValue:: CSS_UNKNOWN: - case CSSPrimitiveValue:: CSS_URI: + case CSSPrimitiveValue::CSS_IDENT: + case CSSPrimitiveValue::CSS_PAIR: + case CSSPrimitiveValue::CSS_PARSER_HEXCOLOR: + case CSSPrimitiveValue::CSS_PARSER_IDENTIFIER: + case CSSPrimitiveValue::CSS_PARSER_INTEGER: + case CSSPrimitiveValue::CSS_PARSER_OPERATOR: + case CSSPrimitiveValue::CSS_RECT: + case CSSPrimitiveValue::CSS_QUAD: + case CSSPrimitiveValue::CSS_RGBCOLOR: + case CSSPrimitiveValue::CSS_SHAPE: + case CSSPrimitiveValue::CSS_STRING: + case CSSPrimitiveValue::CSS_UNICODE_RANGE: + case CSSPrimitiveValue::CSS_UNKNOWN: + case CSSPrimitiveValue::CSS_URI: #if ENABLE(CSS_VARIABLES) - case CSSPrimitiveValue:: CSS_VARIABLE_NAME: + case CSSPrimitiveValue::CSS_VARIABLE_NAME: #endif return false; } @@ -155,9 +155,9 @@ static CSSPrimitiveValue::UnitCategory unitCategory(CSSPrimitiveValue::UnitTypes case CSSPrimitiveValue::CSS_VMIN: return CSSPrimitiveValue::UViewportPercentageLength; #if ENABLE(CSS_IMAGE_RESOLUTION) - case CSSPrimitiveValue:: CSS_DPPX: - case CSSPrimitiveValue:: CSS_DPI: - case CSSPrimitiveValue:: CSS_DPCM: + case CSSPrimitiveValue::CSS_DPPX: + case CSSPrimitiveValue::CSS_DPI: + case CSSPrimitiveValue::CSS_DPCM: return CSSPrimitiveValue::UResolution; #endif default: diff --git a/Source/WebCore/css/MediaQueryEvaluator.cpp b/Source/WebCore/css/MediaQueryEvaluator.cpp index 90c9df286..82e754532 100644 --- a/Source/WebCore/css/MediaQueryEvaluator.cpp +++ b/Source/WebCore/css/MediaQueryEvaluator.cpp @@ -82,7 +82,7 @@ MediaQueryEvaluator::MediaQueryEvaluator(bool mediaFeatureResult) { } -MediaQueryEvaluator:: MediaQueryEvaluator(const String& acceptedMediaType, bool mediaFeatureResult) +MediaQueryEvaluator::MediaQueryEvaluator(const String& acceptedMediaType, bool mediaFeatureResult) : m_mediaType(acceptedMediaType) , m_frame(0) , m_style(0) @@ -90,7 +90,7 @@ MediaQueryEvaluator:: MediaQueryEvaluator(const String& acceptedMediaType, bool { } -MediaQueryEvaluator:: MediaQueryEvaluator(const char* acceptedMediaType, bool mediaFeatureResult) +MediaQueryEvaluator::MediaQueryEvaluator(const char* acceptedMediaType, bool mediaFeatureResult) : m_mediaType(acceptedMediaType) , m_frame(0) , m_style(0) @@ -98,7 +98,7 @@ MediaQueryEvaluator:: MediaQueryEvaluator(const char* acceptedMediaType, bool me { } -MediaQueryEvaluator:: MediaQueryEvaluator(const String& acceptedMediaType, Frame* frame, RenderStyle* style) +MediaQueryEvaluator::MediaQueryEvaluator(const String& acceptedMediaType, Frame* frame, RenderStyle* style) : m_mediaType(acceptedMediaType) , m_frame(frame) , m_style(style) diff --git a/Source/WebCore/css/StyleResolver.cpp b/Source/WebCore/css/StyleResolver.cpp index b55161696..dd8773771 100644 --- a/Source/WebCore/css/StyleResolver.cpp +++ b/Source/WebCore/css/StyleResolver.cpp @@ -1071,6 +1071,9 @@ void StyleResolver::collectMatchingRulesForList(const Vector<RuleData>* rules, i { if (!rules) return; + + TreeScope* treeScope = m_element->treeScope(); + // In some cases we may end up looking up style for random elements in the middle of a recursive tree resolve. // Ancestor identifier filter won't be up-to-date in that case and we can't use the fast path. bool canUseFastReject = m_checker.parentStackIsConsistent(m_parentNode); @@ -1093,7 +1096,6 @@ void StyleResolver::collectMatchingRulesForList(const Vector<RuleData>* rules, i // b) the tree scope allows author rules // c) the rules comes from a scoped style sheet within the same tree scope // d) the rule contains shadow-ID pseudo elements - TreeScope* treeScope = m_element->treeScope(); if (!MatchingUARulesScope::isMatchingUARules() && !treeScope->applyAuthorStyles() #if ENABLE(STYLE_SCOPED) diff --git a/Source/WebCore/dom/EventNames.h b/Source/WebCore/dom/EventNames.h index dc9645014..b3cd846ea 100644 --- a/Source/WebCore/dom/EventNames.h +++ b/Source/WebCore/dom/EventNames.h @@ -229,6 +229,7 @@ namespace WebCore { macro(unmute) \ macro(icechange) \ macro(icecandidate) \ + macro(negotationneeded) \ \ macro(show) \ \ diff --git a/Source/WebCore/dom/WebCoreMemoryInstrumentation.h b/Source/WebCore/dom/WebCoreMemoryInstrumentation.h index c8684bba7..9d688543e 100644 --- a/Source/WebCore/dom/WebCoreMemoryInstrumentation.h +++ b/Source/WebCore/dom/WebCoreMemoryInstrumentation.h @@ -31,9 +31,8 @@ #ifndef WebCoreMemoryInstrumentation_h #define WebCoreMemoryInstrumentation_h -#include "MemoryInstrumentation.h" - #include <wtf/Forward.h> +#include <wtf/MemoryInstrumentation.h> namespace WebCore { diff --git a/Source/WebCore/html/ButtonInputType.cpp b/Source/WebCore/html/ButtonInputType.cpp index 3af472029..d8e42af4b 100644 --- a/Source/WebCore/html/ButtonInputType.cpp +++ b/Source/WebCore/html/ButtonInputType.cpp @@ -31,6 +31,7 @@ #include "config.h" #include "ButtonInputType.h" +#include "InputTypeNames.h" #include <wtf/PassOwnPtr.h> namespace WebCore { diff --git a/Source/WebCore/html/CheckboxInputType.cpp b/Source/WebCore/html/CheckboxInputType.cpp index 02967bbf4..2c6f2b51c 100644 --- a/Source/WebCore/html/CheckboxInputType.cpp +++ b/Source/WebCore/html/CheckboxInputType.cpp @@ -33,6 +33,7 @@ #include "CheckboxInputType.h" #include "HTMLInputElement.h" +#include "InputTypeNames.h" #include "KeyboardEvent.h" #include "LocalizedStrings.h" #include <wtf/PassOwnPtr.h> diff --git a/Source/WebCore/html/ColorInputType.cpp b/Source/WebCore/html/ColorInputType.cpp index 42446768f..7f087de95 100644 --- a/Source/WebCore/html/ColorInputType.cpp +++ b/Source/WebCore/html/ColorInputType.cpp @@ -39,6 +39,7 @@ #include "HTMLDivElement.h" #include "HTMLInputElement.h" #include "HTMLOptionElement.h" +#include "InputTypeNames.h" #include "MouseEvent.h" #include "RenderObject.h" #include "RenderView.h" diff --git a/Source/WebCore/html/DateInputType.cpp b/Source/WebCore/html/DateInputType.cpp index 4c9529c52..4e973da69 100644 --- a/Source/WebCore/html/DateInputType.cpp +++ b/Source/WebCore/html/DateInputType.cpp @@ -35,6 +35,7 @@ #include "DateComponents.h" #include "HTMLInputElement.h" #include "HTMLNames.h" +#include "InputTypeNames.h" #include "KeyboardEvent.h" #include "LocalizedDate.h" #include <wtf/PassOwnPtr.h> diff --git a/Source/WebCore/html/DateTimeInputType.cpp b/Source/WebCore/html/DateTimeInputType.cpp index 78a9184f6..09b423172 100644 --- a/Source/WebCore/html/DateTimeInputType.cpp +++ b/Source/WebCore/html/DateTimeInputType.cpp @@ -34,6 +34,7 @@ #include "DateComponents.h" #include "HTMLInputElement.h" #include "HTMLNames.h" +#include "InputTypeNames.h" #include <wtf/CurrentTime.h> #include <wtf/PassOwnPtr.h> diff --git a/Source/WebCore/html/DateTimeLocalInputType.cpp b/Source/WebCore/html/DateTimeLocalInputType.cpp index 38e449fba..9766b566c 100644 --- a/Source/WebCore/html/DateTimeLocalInputType.cpp +++ b/Source/WebCore/html/DateTimeLocalInputType.cpp @@ -34,6 +34,7 @@ #include "DateComponents.h" #include "HTMLInputElement.h" #include "HTMLNames.h" +#include "InputTypeNames.h" #include <wtf/PassOwnPtr.h> #if ENABLE(INPUT_TYPE_DATETIMELOCAL) diff --git a/Source/WebCore/html/EmailInputType.cpp b/Source/WebCore/html/EmailInputType.cpp index 07b01a047..2395fc82f 100644 --- a/Source/WebCore/html/EmailInputType.cpp +++ b/Source/WebCore/html/EmailInputType.cpp @@ -26,6 +26,7 @@ #include "HTMLInputElement.h" #include "HTMLParserIdioms.h" +#include "InputTypeNames.h" #include "LocalizedStrings.h" #include "RegularExpression.h" #include <wtf/PassOwnPtr.h> diff --git a/Source/WebCore/html/FileInputType.cpp b/Source/WebCore/html/FileInputType.cpp index f7896bab8..89fcc878e 100644 --- a/Source/WebCore/html/FileInputType.cpp +++ b/Source/WebCore/html/FileInputType.cpp @@ -35,6 +35,7 @@ #include "HTMLInputElement.h" #include "HTMLNames.h" #include "Icon.h" +#include "InputTypeNames.h" #include "LocalizedStrings.h" #include "RenderFileUploadControl.h" #include "ScriptController.h" diff --git a/Source/WebCore/html/HiddenInputType.cpp b/Source/WebCore/html/HiddenInputType.cpp index fb6f36a6e..acb55f642 100644 --- a/Source/WebCore/html/HiddenInputType.cpp +++ b/Source/WebCore/html/HiddenInputType.cpp @@ -36,6 +36,7 @@ #include "FormDataList.h" #include "HTMLInputElement.h" #include "HTMLNames.h" +#include "InputTypeNames.h" #include <wtf/PassOwnPtr.h> namespace WebCore { diff --git a/Source/WebCore/html/ImageInputType.cpp b/Source/WebCore/html/ImageInputType.cpp index 110154754..fcb344006 100644 --- a/Source/WebCore/html/ImageInputType.cpp +++ b/Source/WebCore/html/ImageInputType.cpp @@ -29,6 +29,7 @@ #include "HTMLInputElement.h" #include "HTMLNames.h" #include "HTMLParserIdioms.h" +#include "InputTypeNames.h" #include "MouseEvent.h" #include "RenderImage.h" #include <wtf/PassOwnPtr.h> diff --git a/Source/WebCore/html/InputType.cpp b/Source/WebCore/html/InputType.cpp index 69db2aefe..38d79eea8 100644 --- a/Source/WebCore/html/InputType.cpp +++ b/Source/WebCore/html/InputType.cpp @@ -51,6 +51,7 @@ #include "HTMLShadowElement.h" #include "HiddenInputType.h" #include "ImageInputType.h" +#include "InputTypeNames.h" #include "KeyboardEvent.h" #include "LocalizedStrings.h" #include "MonthInputType.h" @@ -1113,150 +1114,4 @@ void InputType::stepUpFromRenderer(int n) } } -namespace InputTypeNames { - -// The type names must be lowercased because they will be the return values of -// input.type and input.type must be lowercase according to DOM Level 2. - -const AtomicString& button() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("button", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& checkbox() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("checkbox", AtomicString::ConstructFromLiteral)); - return name; -} - -#if ENABLE(INPUT_TYPE_COLOR) -const AtomicString& color() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("color", AtomicString::ConstructFromLiteral)); - return name; -} -#endif - -const AtomicString& date() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("date", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& datetime() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("datetime", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& datetimelocal() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("datetime-local", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& email() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("email", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& file() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("file", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& hidden() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("hidden", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& image() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("image", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& month() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("month", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& number() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("number", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& password() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("password", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& radio() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("radio", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& range() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("range", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& reset() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("reset", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& search() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("search", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& submit() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("submit", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& telephone() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("tel", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& text() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("text", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& time() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("time", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& url() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("url", AtomicString::ConstructFromLiteral)); - return name; -} - -const AtomicString& week() -{ - DEFINE_STATIC_LOCAL(AtomicString, name, ("week", AtomicString::ConstructFromLiteral)); - return name; -} - -} // namespace WebCore::InputTypeNames } // namespace WebCore diff --git a/Source/WebCore/html/InputType.h b/Source/WebCore/html/InputType.h index acc776d1b..87a4c12a8 100644 --- a/Source/WebCore/html/InputType.h +++ b/Source/WebCore/html/InputType.h @@ -326,36 +326,6 @@ private: HTMLInputElement* m_element; }; -namespace InputTypeNames { - -const AtomicString& button(); -const AtomicString& checkbox(); -#if ENABLE(INPUT_TYPE_COLOR) -const AtomicString& color(); -#endif -const AtomicString& date(); -const AtomicString& datetime(); -const AtomicString& datetimelocal(); -const AtomicString& email(); -const AtomicString& file(); -const AtomicString& hidden(); -const AtomicString& image(); -const AtomicString& month(); -const AtomicString& number(); -const AtomicString& password(); -const AtomicString& radio(); -const AtomicString& range(); -const AtomicString& reset(); -const AtomicString& search(); -const AtomicString& submit(); -const AtomicString& telephone(); -const AtomicString& text(); -const AtomicString& time(); -const AtomicString& url(); -const AtomicString& week(); - -} // namespace WebCore::InputTypeNames - } // namespace WebCore #endif diff --git a/Source/WebCore/html/InputTypeNames.cpp b/Source/WebCore/html/InputTypeNames.cpp new file mode 100644 index 000000000..8eac7205d --- /dev/null +++ b/Source/WebCore/html/InputTypeNames.cpp @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2012 Apple Inc. All rights reserved. + * Copyright (C) 2010, 2012 Google Inc. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#include "config.h" +#include "InputTypeNames.h" + +namespace WebCore { + +namespace InputTypeNames { + +// The type names must be lowercased because they will be the return values of +// input.type and input.type must be lowercase according to DOM Level 2. + +const AtomicString& button() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("button", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& checkbox() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("checkbox", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& color() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("color", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& date() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("date", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& datetime() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("datetime", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& datetimelocal() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("datetime-local", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& email() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("email", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& file() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("file", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& hidden() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("hidden", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& image() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("image", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& month() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("month", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& number() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("number", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& password() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("password", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& radio() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("radio", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& range() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("range", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& reset() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("reset", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& search() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("search", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& submit() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("submit", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& telephone() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("tel", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& text() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("text", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& time() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("time", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& url() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("url", AtomicString::ConstructFromLiteral)); + return name; +} + +const AtomicString& week() +{ + DEFINE_STATIC_LOCAL(AtomicString, name, ("week", AtomicString::ConstructFromLiteral)); + return name; +} + +} // namespace WebCore::InputTypeNames + +} // namespace WebCore diff --git a/Source/WebCore/html/InputTypeNames.h b/Source/WebCore/html/InputTypeNames.h new file mode 100644 index 000000000..0a94c8b03 --- /dev/null +++ b/Source/WebCore/html/InputTypeNames.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2010, 2012 Google Inc. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + + +#ifndef InputTypeNames_h +#define InputTypeNames_h + +#include <wtf/text/AtomicString.h> + +namespace WebCore { + +namespace InputTypeNames { + +const AtomicString& button(); +const AtomicString& checkbox(); +const AtomicString& color(); +const AtomicString& date(); +const AtomicString& datetime(); +const AtomicString& datetimelocal(); +const AtomicString& email(); +const AtomicString& file(); +const AtomicString& hidden(); +const AtomicString& image(); +const AtomicString& month(); +const AtomicString& number(); +const AtomicString& password(); +const AtomicString& radio(); +const AtomicString& range(); +const AtomicString& reset(); +const AtomicString& search(); +const AtomicString& submit(); +const AtomicString& telephone(); +const AtomicString& text(); +const AtomicString& time(); +const AtomicString& url(); +const AtomicString& week(); + +} + +} // namespace WebCore + +#endif // InputTypeNames_h diff --git a/Source/WebCore/html/MonthInputType.cpp b/Source/WebCore/html/MonthInputType.cpp index 70afa692e..fc672e3ee 100644 --- a/Source/WebCore/html/MonthInputType.cpp +++ b/Source/WebCore/html/MonthInputType.cpp @@ -34,6 +34,7 @@ #include "DateComponents.h" #include "HTMLInputElement.h" #include "HTMLNames.h" +#include "InputTypeNames.h" #include <wtf/CurrentTime.h> #include <wtf/DateMath.h> #include <wtf/MathExtras.h> diff --git a/Source/WebCore/html/NumberInputType.cpp b/Source/WebCore/html/NumberInputType.cpp index 0d66d5676..794545dc9 100644 --- a/Source/WebCore/html/NumberInputType.cpp +++ b/Source/WebCore/html/NumberInputType.cpp @@ -37,6 +37,7 @@ #include "HTMLInputElement.h" #include "HTMLNames.h" #include "HTMLParserIdioms.h" +#include "InputTypeNames.h" #include "KeyboardEvent.h" #include "LocalizedNumber.h" #include "RenderTextControl.h" diff --git a/Source/WebCore/html/PasswordInputType.cpp b/Source/WebCore/html/PasswordInputType.cpp index a64c8e516..5c68c975d 100644 --- a/Source/WebCore/html/PasswordInputType.cpp +++ b/Source/WebCore/html/PasswordInputType.cpp @@ -34,6 +34,7 @@ #include "FormController.h" #include "HTMLInputElement.h" +#include "InputTypeNames.h" #include <wtf/Assertions.h> #include <wtf/PassOwnPtr.h> diff --git a/Source/WebCore/html/RadioInputType.cpp b/Source/WebCore/html/RadioInputType.cpp index 2c16b1a16..076e22a5a 100644 --- a/Source/WebCore/html/RadioInputType.cpp +++ b/Source/WebCore/html/RadioInputType.cpp @@ -25,6 +25,7 @@ #include "Frame.h" #include "HTMLInputElement.h" #include "HTMLNames.h" +#include "InputTypeNames.h" #include "KeyboardEvent.h" #include "LocalizedStrings.h" #include "MouseEvent.h" diff --git a/Source/WebCore/html/RangeInputType.cpp b/Source/WebCore/html/RangeInputType.cpp index 52ab3273b..71b955d6f 100644 --- a/Source/WebCore/html/RangeInputType.cpp +++ b/Source/WebCore/html/RangeInputType.cpp @@ -38,6 +38,7 @@ #include "HTMLInputElement.h" #include "HTMLNames.h" #include "HTMLParserIdioms.h" +#include "InputTypeNames.h" #include "KeyboardEvent.h" #include "MouseEvent.h" #include "PlatformMouseEvent.h" diff --git a/Source/WebCore/html/ResetInputType.cpp b/Source/WebCore/html/ResetInputType.cpp index 457ea4590..8fec0ff75 100644 --- a/Source/WebCore/html/ResetInputType.cpp +++ b/Source/WebCore/html/ResetInputType.cpp @@ -35,6 +35,7 @@ #include "Event.h" #include "HTMLFormElement.h" #include "HTMLInputElement.h" +#include "InputTypeNames.h" #include "LocalizedStrings.h" #include <wtf/PassOwnPtr.h> diff --git a/Source/WebCore/html/SearchInputType.cpp b/Source/WebCore/html/SearchInputType.cpp index 09f079b79..ada23e633 100644 --- a/Source/WebCore/html/SearchInputType.cpp +++ b/Source/WebCore/html/SearchInputType.cpp @@ -33,6 +33,7 @@ #include "HTMLInputElement.h" #include "HTMLNames.h" +#include "InputTypeNames.h" #include "KeyboardEvent.h" #include "RenderSearchField.h" #include "ShadowRoot.h" diff --git a/Source/WebCore/html/SubmitInputType.cpp b/Source/WebCore/html/SubmitInputType.cpp index 937b20051..489d9a1f8 100644 --- a/Source/WebCore/html/SubmitInputType.cpp +++ b/Source/WebCore/html/SubmitInputType.cpp @@ -36,6 +36,7 @@ #include "FormDataList.h" #include "HTMLFormElement.h" #include "HTMLInputElement.h" +#include "InputTypeNames.h" #include "LocalizedStrings.h" #include <wtf/PassOwnPtr.h> diff --git a/Source/WebCore/html/TelephoneInputType.cpp b/Source/WebCore/html/TelephoneInputType.cpp index c1c77f00d..cca0365f5 100644 --- a/Source/WebCore/html/TelephoneInputType.cpp +++ b/Source/WebCore/html/TelephoneInputType.cpp @@ -31,6 +31,7 @@ #include "config.h" #include "TelephoneInputType.h" +#include "InputTypeNames.h" #include <wtf/PassOwnPtr.h> namespace WebCore { diff --git a/Source/WebCore/html/TextInputType.cpp b/Source/WebCore/html/TextInputType.cpp index a36997693..19bdca7fc 100644 --- a/Source/WebCore/html/TextInputType.cpp +++ b/Source/WebCore/html/TextInputType.cpp @@ -31,6 +31,7 @@ #include "config.h" #include "TextInputType.h" +#include "InputTypeNames.h" #include <wtf/PassOwnPtr.h> namespace WebCore { diff --git a/Source/WebCore/html/TimeInputType.cpp b/Source/WebCore/html/TimeInputType.cpp index bbeec4343..edd12e7a6 100644 --- a/Source/WebCore/html/TimeInputType.cpp +++ b/Source/WebCore/html/TimeInputType.cpp @@ -34,6 +34,7 @@ #include "DateComponents.h" #include "HTMLInputElement.h" #include "HTMLNames.h" +#include "InputTypeNames.h" #include <wtf/CurrentTime.h> #include <wtf/DateMath.h> #include <wtf/MathExtras.h> diff --git a/Source/WebCore/html/URLInputType.cpp b/Source/WebCore/html/URLInputType.cpp index 3a913b24b..b4a6d5bbb 100644 --- a/Source/WebCore/html/URLInputType.cpp +++ b/Source/WebCore/html/URLInputType.cpp @@ -32,6 +32,7 @@ #include "URLInputType.h" #include "HTMLInputElement.h" +#include "InputTypeNames.h" #include "LocalizedStrings.h" #include "KURL.h" #include <wtf/PassOwnPtr.h> diff --git a/Source/WebCore/html/WeekInputType.cpp b/Source/WebCore/html/WeekInputType.cpp index c881ae8c1..adbb87591 100644 --- a/Source/WebCore/html/WeekInputType.cpp +++ b/Source/WebCore/html/WeekInputType.cpp @@ -34,6 +34,7 @@ #include "DateComponents.h" #include "HTMLInputElement.h" #include "HTMLNames.h" +#include "InputTypeNames.h" #include <wtf/PassOwnPtr.h> #if ENABLE(INPUT_TYPE_WEEK) diff --git a/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp b/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp index 5414bad09..ef754f597 100644 --- a/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp +++ b/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp @@ -508,40 +508,80 @@ void CanvasRenderingContext2D::setShadowColor(const String& color) applyShadow(); } -const DashArray* CanvasRenderingContext2D::webkitLineDash() const +const Vector<float>& CanvasRenderingContext2D::getLineDash() const { - return &state().m_lineDash; + return state().m_lineDash; } -void CanvasRenderingContext2D::setWebkitLineDash(const DashArray& dash) +static bool lineDashSequenceIsValid(const Vector<float>& dash) { - if (state().m_lineDash == dash) + for (size_t i = 0; i < dash.size(); i++) { + if (!isfinite(dash[i]) || dash[i] < 0) + return false; + } + return true; +} + +void CanvasRenderingContext2D::setLineDash(const Vector<float>& dash) +{ + if (!lineDashSequenceIsValid(dash)) return; + realizeSaves(); modifiableState().m_lineDash = dash; - GraphicsContext* c = drawingContext(); - if (!c) + // Spec requires the concatenation of two copies the dash list when the + // number of elements is odd + if (dash.size() % 2) + modifiableState().m_lineDash.append(dash); + + applyLineDash(); +} + +void CanvasRenderingContext2D::setWebkitLineDash(const Vector<float>& dash) +{ + if (!lineDashSequenceIsValid(dash)) return; - c->setLineDash(state().m_lineDash, state().m_lineDashOffset); + + realizeSaves(); + modifiableState().m_lineDash = dash; + + applyLineDash(); } -float CanvasRenderingContext2D::webkitLineDashOffset() const +float CanvasRenderingContext2D::lineDashOffset() const { return state().m_lineDashOffset; } -void CanvasRenderingContext2D::setWebkitLineDashOffset(float offset) +void CanvasRenderingContext2D::setLineDashOffset(float offset) { - if (!isfinite(offset)) - return; - if (state().m_lineDashOffset == offset) + if (!isfinite(offset) || state().m_lineDashOffset == offset) return; + realizeSaves(); modifiableState().m_lineDashOffset = offset; + applyLineDash(); +} + +float CanvasRenderingContext2D::webkitLineDashOffset() const +{ + return lineDashOffset(); +} + +void CanvasRenderingContext2D::setWebkitLineDashOffset(float offset) +{ + setLineDashOffset(offset); +} + +void CanvasRenderingContext2D::applyLineDash() const +{ GraphicsContext* c = drawingContext(); if (!c) return; - c->setLineDash(state().m_lineDash, state().m_lineDashOffset); + DashArray convertedLineDash(state().m_lineDash.size()); + for (size_t i = 0; i < state().m_lineDash.size(); ++i) + convertedLineDash[i] = static_cast<DashArrayElement>(state().m_lineDash[i]); + c->setLineDash(convertedLineDash, state().m_lineDashOffset); } float CanvasRenderingContext2D::globalAlpha() const @@ -2026,7 +2066,7 @@ String CanvasRenderingContext2D::font() const void CanvasRenderingContext2D::setFont(const String& newFont) { RefPtr<StylePropertySet> parsedStyle = StylePropertySet::create(); - CSSParser(strictToCSSParserMode(!m_usesCSSCompatibilityParseMode)).parseDeclaration(parsedStyle.get(), "font:" + newFont, 0, 0); + CSSParser::parseValue(parsedStyle.get(), CSSPropertyFont, newFont, true, strictToCSSParserMode(!m_usesCSSCompatibilityParseMode), 0); if (parsedStyle->isEmpty()) return; diff --git a/Source/WebCore/html/canvas/CanvasRenderingContext2D.h b/Source/WebCore/html/canvas/CanvasRenderingContext2D.h index cc6d5e80e..95d6d0e43 100644 --- a/Source/WebCore/html/canvas/CanvasRenderingContext2D.h +++ b/Source/WebCore/html/canvas/CanvasRenderingContext2D.h @@ -84,9 +84,12 @@ public: float miterLimit() const; void setMiterLimit(float); - const DashArray* webkitLineDash() const; - void setWebkitLineDash(const DashArray&); + const Vector<float>& getLineDash() const; + void setLineDash(const Vector<float>&); + void setWebkitLineDash(const Vector<float>&); + float lineDashOffset() const; + void setLineDashOffset(float); float webkitLineDashOffset() const; void setWebkitLineDashOffset(float); @@ -250,7 +253,7 @@ private: CompositeOperator m_globalComposite; AffineTransform m_transform; bool m_invertibleCTM; - DashArray m_lineDash; + Vector<float> m_lineDash; float m_lineDashOffset; bool m_imageSmoothingEnabled; @@ -276,6 +279,7 @@ private: State& modifiableState() { ASSERT(!m_unrealizedSaveCount); return m_stateStack.last(); } const State& state() const { return m_stateStack.last(); } + void applyLineDash() const; void setShadow(const FloatSize& offset, float blur, RGBA32 color); void applyShadow(); bool shouldDrawShadows() const; diff --git a/Source/WebCore/html/canvas/CanvasRenderingContext2D.idl b/Source/WebCore/html/canvas/CanvasRenderingContext2D.idl index cffa8dab9..a8569487a 100644 --- a/Source/WebCore/html/canvas/CanvasRenderingContext2D.idl +++ b/Source/WebCore/html/canvas/CanvasRenderingContext2D.idl @@ -74,6 +74,10 @@ module html { attribute float shadowBlur; attribute [TreatNullAs=NullString] DOMString shadowColor; + void setLineDash(in sequence<float> dash); + sequence<float> getLineDash(); + attribute float lineDashOffset; + // FIXME: These attributes should also be implemented for V8. #if !(defined(V8_BINDING) && V8_BINDING) attribute [Custom] Array webkitLineDash; diff --git a/Source/WebCore/html/parser/HTMLPreloadScanner.cpp b/Source/WebCore/html/parser/HTMLPreloadScanner.cpp index 38061ff6f..a75b52e35 100644 --- a/Source/WebCore/html/parser/HTMLPreloadScanner.cpp +++ b/Source/WebCore/html/parser/HTMLPreloadScanner.cpp @@ -30,11 +30,11 @@ #include "CachedResourceLoader.h" #include "Document.h" -#include "InputType.h" #include "HTMLDocumentParser.h" #include "HTMLTokenizer.h" #include "HTMLNames.h" #include "HTMLParserIdioms.h" +#include "InputTypeNames.h" #include "LinkRelAttribute.h" #include "MediaList.h" #include "MediaQueryEvaluator.h" diff --git a/Source/WebCore/html/shadow/DateTimeEditElement.cpp b/Source/WebCore/html/shadow/DateTimeEditElement.cpp index 7ee8216c7..11c162072 100644 --- a/Source/WebCore/html/shadow/DateTimeEditElement.cpp +++ b/Source/WebCore/html/shadow/DateTimeEditElement.cpp @@ -80,7 +80,7 @@ DateTimeEditBuilder::DateTimeEditBuilder(DateTimeEditElement& elemnt, const Step bool DateTimeEditBuilder::build(const String& formatString) { - m_editElement.resetLayout(); + m_editElement.resetFields(); return DateTimeFormat::parse(formatString, *this); } @@ -282,8 +282,9 @@ DateTimeFieldElement* DateTimeEditElement::focusedField() const size_t DateTimeEditElement::focusedFieldIndex() const { + Node* const focusedFieldNode = document()->focusedNode(); for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex) { - if (m_fields[fieldIndex]->focused()) + if (m_fields[fieldIndex] == focusedFieldNode) return fieldIndex; } return invalidFieldIndex; @@ -343,12 +344,11 @@ void DateTimeEditElement::layout(const StepRange& stepRange, const DateComponent DateTimeEditBuilder builder(*this, stepRange, dateValue); const String dateTimeFormat = builder.needSecondField() ? localizedTimeFormatText() : localizedShortTimeFormatText(); - if (!builder.build(dateTimeFormat) || m_fields.isEmpty()) + Node* lastChildToBeRemoved = lastChild(); + if (!builder.build(dateTimeFormat) || m_fields.isEmpty()) { + lastChildToBeRemoved = lastChild(); builder.build(builder.needSecondField() ? "HH:mm:ss" : "HH:mm"); - - RefPtr<SpinButtonElement> spinButton = SpinButtonElement::create(document(), *this); - m_spinButton = spinButton.get(); - appendChild(spinButton); + } if (focusedFieldIndex != invalidFieldIndex) { for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex) { @@ -360,6 +360,18 @@ void DateTimeEditElement::layout(const StepRange& stepRange, const DateComponent if (DateTimeFieldElement* field = fieldAt(std::min(focusedFieldIndex, m_fields.size() - 1))) field->focus(); } + + if (lastChildToBeRemoved) { + for (Node* childNode = firstChild(); childNode; childNode = firstChild()) { + removeChild(childNode); + if (childNode == lastChildToBeRemoved) + break; + } + } + + RefPtr<SpinButtonElement> spinButton = SpinButtonElement::create(document(), *this); + m_spinButton = spinButton.get(); + appendChild(spinButton); } void DateTimeEditElement::readOnlyStateChanged() @@ -367,11 +379,9 @@ void DateTimeEditElement::readOnlyStateChanged() updateUIState(); } -void DateTimeEditElement::resetLayout() +void DateTimeEditElement::resetFields() { m_fields.shrink(0); - m_spinButton = 0; - removeChildren(); } void DateTimeEditElement::defaultEventHandler(Event* event) diff --git a/Source/WebCore/html/shadow/DateTimeEditElement.h b/Source/WebCore/html/shadow/DateTimeEditElement.h index 10c466487..8e6eb11ce 100644 --- a/Source/WebCore/html/shadow/DateTimeEditElement.h +++ b/Source/WebCore/html/shadow/DateTimeEditElement.h @@ -68,7 +68,7 @@ public: void focusByOwner(); void readOnlyStateChanged(); void removeEditControlOwner() { m_editControlOwner = 0; } - void resetLayout(); + void resetFields(); void setEmptyValue(const StepRange&, const DateComponents& dateForReadOnlyField); void setValueAsDate(const StepRange&, const DateComponents&); double valueAsDouble() const; diff --git a/Source/WebCore/html/shadow/MediaControlRootElementChromium.cpp b/Source/WebCore/html/shadow/MediaControlRootElementChromium.cpp index 6b3913bb6..c0cf0a0b1 100644 --- a/Source/WebCore/html/shadow/MediaControlRootElementChromium.cpp +++ b/Source/WebCore/html/shadow/MediaControlRootElementChromium.cpp @@ -29,13 +29,17 @@ #if ENABLE(VIDEO) #include "MediaControlRootElementChromium.h" +#include "CSSValueKeywords.h" #include "HTMLDivElement.h" #include "HTMLMediaElement.h" #include "HTMLNames.h" #include "MediaControlElements.h" #include "MouseEvent.h" #include "Page.h" +#include "RenderMedia.h" #include "RenderTheme.h" +#include "RenderView.h" +#include "StyleResolver.h" #include "Text.h" #if ENABLE(VIDEO_TRACK) @@ -59,6 +63,69 @@ MediaControlElementType MediaControlChromiumEnclosureElement::displayType() cons return MediaControlsPanel; } + +class RenderMediaControlPanelEnclosureElement : public RenderBlock { +public: + RenderMediaControlPanelEnclosureElement(Node*); + +private: + virtual void layout() OVERRIDE; +}; + +RenderMediaControlPanelEnclosureElement::RenderMediaControlPanelEnclosureElement(Node* node) + : RenderBlock(node) +{ +} + +static const int hideTimeDisplayWidth = 350; +static const int hideVolumeDisplayWidth = 275; +static const int hideMuteButtonWidth = 210; +static const int hideFullscreenButtonWidth = 150; +static const int hideTimelineWidth = 100; + +void RenderMediaControlPanelEnclosureElement::layout() +{ + HTMLMediaElement* mediaElement = toParentMediaElement(this); + if (!mediaElement || !mediaElement->renderer()) + return; + + float mediaWidthFloat = toRenderMedia(mediaElement->renderer())->contentBoxRect().width().toFloat(); + int mediaWidth = round(adjustFloatForAbsoluteZoom(mediaWidthFloat, style())); + + MediaControlRootElementChromium* elementShadow = (MediaControlRootElementChromium *) mediaElement->mediaControls(); + + if (mediaWidth < hideTimeDisplayWidth) + elementShadow->hideTimeDisplay(); + else + elementShadow->showTimeDisplay(); + + if (mediaWidth < hideVolumeDisplayWidth) + elementShadow->hideVolumeSlider(); + else + elementShadow->showVolumeSlider(); + + if (mediaWidth < hideMuteButtonWidth) + elementShadow->hideMuteButton(); + else + elementShadow->showMuteButton(); + + if (mediaWidth < hideFullscreenButtonWidth) + elementShadow->hideFullscreenButton(); + else + elementShadow->showFullscreenButton(); + + if (mediaWidth < hideTimelineWidth) + elementShadow->hideTimeline(); + else + elementShadow->showTimeline(); + + if (mediaElement->renderer()->isVideo()) + // Update padding according to video width. + static_cast<MediaControlPanelEnclosureElement*>(node())->updatePadding(mediaWidth); + + RenderBlock::layout(); +} + MediaControlPanelEnclosureElement::MediaControlPanelEnclosureElement(Document* document) : MediaControlChromiumEnclosureElement(document) { @@ -69,12 +136,39 @@ PassRefPtr<MediaControlPanelEnclosureElement> MediaControlPanelEnclosureElement: return adoptRef(new MediaControlPanelEnclosureElement(document)); } +RenderObject* MediaControlPanelEnclosureElement::createRenderer(RenderArena* arena, RenderStyle*) +{ + return new (arena) RenderMediaControlPanelEnclosureElement(this); +} + const AtomicString& MediaControlPanelEnclosureElement::shadowPseudoId() const { DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls-enclosure")); return id; } +// Make sure to keep these values in sync with the ones in mediaControlsChromium.css. +static const int videoControlsHeight = 30; +static const int maxPadding = 5; +static const int minPadding = 0; +static const int minPaddingAtWidth = 160; +static const int decreaseStep = 60; + +void MediaControlPanelEnclosureElement::updatePadding(int mediaWidth) +{ + // Scale padding linearly between minPadding and maxPadding depending on mediaWidth. + float padding = round((mediaWidth - minPaddingAtWidth) / decreaseStep); + if (padding < minPadding) + padding = minPadding; + else if (padding > maxPadding) + padding = maxPadding; + + setInlineStyleProperty(CSSPropertyPaddingRight, padding, CSSPrimitiveValue::CSS_PX); + setInlineStyleProperty(CSSPropertyPaddingBottom, padding, CSSPrimitiveValue::CSS_PX); + setInlineStyleProperty(CSSPropertyPaddingLeft, padding, CSSPrimitiveValue::CSS_PX); + setInlineStyleProperty(CSSPropertyHeight, padding + videoControlsHeight, CSSPrimitiveValue::CSS_PX); +} + MediaControlRootElementChromium::MediaControlRootElementChromium(Document* document) : MediaControls(document) , m_mediaController(0) @@ -94,6 +188,7 @@ MediaControlRootElementChromium::MediaControlRootElementChromium(Document* docum , m_hideFullscreenControlsTimer(this, &MediaControlRootElementChromium::hideFullscreenControlsTimerFired) , m_isMouseOverControls(false) , m_isFullscreen(false) + , m_hiddenTimeDisplay(false) { } @@ -257,16 +352,12 @@ void MediaControlRootElementChromium::reset() float duration = m_mediaController->duration(); m_timeline->setDuration(duration); - m_timeline->show(); m_durationDisplay->setInnerText(page->theme()->formatMediaControlsTime(duration), ASSERT_NO_EXCEPTION); m_durationDisplay->setCurrentValue(duration); - m_timeline->setPosition(m_mediaController->currentTime()); updateTimeDisplay(); - m_panelMuteButton->show(); - if (m_volumeSlider) { if (!m_mediaController->hasAudio()) m_volumeSlider->hide(); @@ -283,19 +374,14 @@ void MediaControlRootElementChromium::reset() m_toggleClosedCaptionsButton->hide(); } - if (m_mediaController->supportsFullscreen() && m_mediaController->hasVideo()) - m_fullscreenButton->show(); - else - m_fullscreenButton->hide(); + showFullscreenButton(); + makeOpaque(); } void MediaControlRootElementChromium::playbackStarted() { m_playButton->updateDisplayType(); - m_timeline->setPosition(m_mediaController->currentTime()); - m_currentTimeDisplay->show(); - m_durationDisplay->hide(); updateTimeDisplay(); if (m_isFullscreen) @@ -304,7 +390,6 @@ void MediaControlRootElementChromium::playbackStarted() void MediaControlRootElementChromium::playbackProgressed() { - m_timeline->setPosition(m_mediaController->currentTime()); updateTimeDisplay(); if (!m_isMouseOverControls && m_mediaController->hasVideo()) @@ -314,7 +399,6 @@ void MediaControlRootElementChromium::playbackProgressed() void MediaControlRootElementChromium::playbackStopped() { m_playButton->updateDisplayType(); - m_timeline->setPosition(m_mediaController->currentTime()); updateTimeDisplay(); makeOpaque(); @@ -330,8 +414,8 @@ void MediaControlRootElementChromium::updateTimeDisplay() if (!page) return; - // After seek, hide duration display and show current time. - if (now > 0) { + // After seek or playback start, hide duration display and show current time. + if (!m_hiddenTimeDisplay && now > 0) { m_currentTimeDisplay->show(); m_durationDisplay->hide(); } @@ -340,6 +424,8 @@ void MediaControlRootElementChromium::updateTimeDisplay() ExceptionCode ec; m_currentTimeDisplay->setInnerText(page->theme()->formatMediaControlsCurrentTime(now, duration), ec); m_currentTimeDisplay->setCurrentValue(now); + + m_timeline->setPosition(m_mediaController->currentTime()); } void MediaControlRootElementChromium::reportedError() @@ -478,6 +564,61 @@ void MediaControlRootElementChromium::showVolumeSlider() m_volumeSlider->show(); } +void MediaControlRootElementChromium::hideVolumeSlider() +{ + m_volumeSlider->hide(); +} + +void MediaControlRootElementChromium::showTimeDisplay() +{ + m_hiddenTimeDisplay = false; + m_durationDisplay->show(); + updateTimeDisplay(); +} + +void MediaControlRootElementChromium::hideTimeDisplay() +{ + m_hiddenTimeDisplay = true; + m_durationDisplay->hide(); + m_currentTimeDisplay->hide(); +} + +void MediaControlRootElementChromium::showMuteButton() +{ + if (!m_mediaController->hasAudio()) + return; + + m_panelMuteButton->show(); +} + +void MediaControlRootElementChromium::hideMuteButton() +{ + m_panelMuteButton->hide(); +} + +void MediaControlRootElementChromium::showFullscreenButton() +{ + if (!m_mediaController->supportsFullscreen() || !m_mediaController->hasVideo()) + return; + + m_fullscreenButton->show(); +} + +void MediaControlRootElementChromium::hideFullscreenButton() +{ + m_fullscreenButton->hide(); +} + +void MediaControlRootElementChromium::showTimeline() +{ + m_timeline->show(); +} + +void MediaControlRootElementChromium::hideTimeline() +{ + m_timeline->hide(); +} + #if ENABLE(VIDEO_TRACK) void MediaControlRootElementChromium::createTextTrackDisplay() { diff --git a/Source/WebCore/html/shadow/MediaControlRootElementChromium.h b/Source/WebCore/html/shadow/MediaControlRootElementChromium.h index 8c2061233..6879dcbf9 100644 --- a/Source/WebCore/html/shadow/MediaControlRootElementChromium.h +++ b/Source/WebCore/html/shadow/MediaControlRootElementChromium.h @@ -74,6 +74,8 @@ private: class MediaControlPanelEnclosureElement : public MediaControlChromiumEnclosureElement { public: static PassRefPtr<MediaControlPanelEnclosureElement> create(Document*); + virtual RenderObject* createRenderer(RenderArena*, RenderStyle*) OVERRIDE; + void updatePadding(int mediaWidth); private: explicit MediaControlPanelEnclosureElement(Document*); @@ -109,6 +111,16 @@ public: void changedClosedCaptionsVisibility(); void showVolumeSlider(); + void hideVolumeSlider(); + void showTimeDisplay(); + void hideTimeDisplay(); + void showMuteButton(); + void hideMuteButton(); + void showFullscreenButton(); + void hideFullscreenButton(); + void showTimeline(); + void hideTimeline(); + void updateTimeDisplay(); void updateStatusDisplay(); @@ -159,6 +171,7 @@ private: Timer<MediaControlRootElementChromium> m_hideFullscreenControlsTimer; bool m_isMouseOverControls; bool m_isFullscreen; + bool m_hiddenTimeDisplay; }; } diff --git a/Source/WebCore/inspector/InspectorInstrumentation.cpp b/Source/WebCore/inspector/InspectorInstrumentation.cpp index 41b7bc81a..f50bdd35e 100644 --- a/Source/WebCore/inspector/InspectorInstrumentation.cpp +++ b/Source/WebCore/inspector/InspectorInstrumentation.cpp @@ -451,13 +451,13 @@ InspectorInstrumentationCookie InspectorInstrumentation::willLayoutImpl(Instrume return InspectorInstrumentationCookie(instrumentingAgents, timelineAgentId); } -void InspectorInstrumentation::didLayoutImpl(const InspectorInstrumentationCookie& cookie) +void InspectorInstrumentation::didLayoutImpl(const InspectorInstrumentationCookie& cookie, RenderObject* root) { if (!cookie.first) return; if (InspectorTimelineAgent* timelineAgent = retrieveTimelineAgent(cookie)) - timelineAgent->didLayout(); + timelineAgent->didLayout(root); if (InspectorPageAgent* pageAgent = cookie.first->inspectorPageAgent()) pageAgent->didLayout(); diff --git a/Source/WebCore/inspector/InspectorInstrumentation.h b/Source/WebCore/inspector/InspectorInstrumentation.h index c25d3722b..2a8cefc3c 100644 --- a/Source/WebCore/inspector/InspectorInstrumentation.h +++ b/Source/WebCore/inspector/InspectorInstrumentation.h @@ -65,6 +65,7 @@ class InspectorTimelineAgent; class InstrumentingAgents; class KURL; class Node; +class RenderObject; class ResourceRequest; class ResourceResponse; class ScriptArguments; @@ -144,7 +145,7 @@ public: static void didCancelFrame(Page*); static void didInvalidateLayout(Frame*); static InspectorInstrumentationCookie willLayout(Frame*); - static void didLayout(const InspectorInstrumentationCookie&); + static void didLayout(const InspectorInstrumentationCookie&, RenderObject*); static void didScroll(Page*); static InspectorInstrumentationCookie willLoadXHR(ScriptExecutionContext*, XMLHttpRequest*); static void didLoadXHR(const InspectorInstrumentationCookie&); @@ -321,7 +322,7 @@ private: static void didCancelFrameImpl(InstrumentingAgents*); static void didInvalidateLayoutImpl(InstrumentingAgents*, Frame*); static InspectorInstrumentationCookie willLayoutImpl(InstrumentingAgents*, Frame*); - static void didLayoutImpl(const InspectorInstrumentationCookie&); + static void didLayoutImpl(const InspectorInstrumentationCookie&, RenderObject*); static void didScrollImpl(InstrumentingAgents*); static InspectorInstrumentationCookie willLoadXHRImpl(InstrumentingAgents*, XMLHttpRequest*, ScriptExecutionContext*); static void didLoadXHRImpl(const InspectorInstrumentationCookie&); @@ -833,12 +834,12 @@ inline InspectorInstrumentationCookie InspectorInstrumentation::willLayout(Frame return InspectorInstrumentationCookie(); } -inline void InspectorInstrumentation::didLayout(const InspectorInstrumentationCookie& cookie) +inline void InspectorInstrumentation::didLayout(const InspectorInstrumentationCookie& cookie, RenderObject* root) { #if ENABLE(INSPECTOR) FAST_RETURN_IF_NO_FRONTENDS(void()); if (cookie.first) - didLayoutImpl(cookie); + didLayoutImpl(cookie, root); #endif } diff --git a/Source/WebCore/inspector/InspectorOverlay.cpp b/Source/WebCore/inspector/InspectorOverlay.cpp index 4fd42da99..5241545e1 100644 --- a/Source/WebCore/inspector/InspectorOverlay.cpp +++ b/Source/WebCore/inspector/InspectorOverlay.cpp @@ -385,7 +385,7 @@ void InspectorOverlay::drawRectHighlight() Highlight highlight; buildRectHighlight(m_page, m_highlightRect.get(), m_rectHighlightConfig, &highlight); - evaluateInOverlay("highlightRect", buildObjectForHighlight(m_page->mainFrame()->view(), highlight)); + evaluateInOverlay("drawRectHighlight", buildObjectForHighlight(m_page->mainFrame()->view(), highlight)); } void InspectorOverlay::drawPausedInDebuggerMessage() diff --git a/Source/WebCore/inspector/InspectorTimelineAgent.cpp b/Source/WebCore/inspector/InspectorTimelineAgent.cpp index ebd7a3551..38410ca6d 100644 --- a/Source/WebCore/inspector/InspectorTimelineAgent.cpp +++ b/Source/WebCore/inspector/InspectorTimelineAgent.cpp @@ -46,6 +46,8 @@ #include "InspectorState.h" #include "InstrumentingAgents.h" #include "IntRect.h" +#include "RenderObject.h" +#include "RenderView.h" #include "ResourceRequest.h" #include "ResourceResponse.h" #include "TimelineRecordFactory.h" @@ -242,8 +244,14 @@ void InspectorTimelineAgent::willLayout(Frame* frame) pushCurrentRecord(InspectorObject::create(), TimelineRecordType::Layout, true, frame); } -void InspectorTimelineAgent::didLayout() +void InspectorTimelineAgent::didLayout(RenderObject* root) { + if (m_recordStack.isEmpty()) + return; + LayoutRect rect = root->frame()->view()->contentsToRootView(root->absoluteBoundingBoxRect()); + TimelineRecordEntry entry = m_recordStack.last(); + ASSERT(entry.type == TimelineRecordType::Layout); + TimelineRecordFactory::addRectData(entry.data.get(), rect); didCompleteCurrentRecord(TimelineRecordType::Layout); } diff --git a/Source/WebCore/inspector/InspectorTimelineAgent.h b/Source/WebCore/inspector/InspectorTimelineAgent.h index 0ea54e28f..e5b0dc9c2 100644 --- a/Source/WebCore/inspector/InspectorTimelineAgent.h +++ b/Source/WebCore/inspector/InspectorTimelineAgent.h @@ -52,6 +52,7 @@ class InspectorPageAgent; class InspectorState; class InstrumentingAgents; class IntRect; +class RenderObject; class ResourceRequest; class ResourceResponse; @@ -98,7 +99,7 @@ public: void didInvalidateLayout(Frame*); void willLayout(Frame*); - void didLayout(); + void didLayout(RenderObject*); void didScheduleStyleRecalculation(Frame*); void willRecalculateStyle(Frame*); diff --git a/Source/WebCore/inspector/MemoryInstrumentationImpl.h b/Source/WebCore/inspector/MemoryInstrumentationImpl.h index 85cbc5e45..9ef0fec14 100644 --- a/Source/WebCore/inspector/MemoryInstrumentationImpl.h +++ b/Source/WebCore/inspector/MemoryInstrumentationImpl.h @@ -31,10 +31,10 @@ #ifndef MemoryInstrumentationImpl_h #define MemoryInstrumentationImpl_h -#include "MemoryInstrumentation.h" #include <wtf/HashMap.h> #include <wtf/HashSet.h> +#include <wtf/MemoryInstrumentation.h> #include <wtf/Vector.h> namespace WebCore { diff --git a/Source/WebCore/inspector/TimelineRecordFactory.cpp b/Source/WebCore/inspector/TimelineRecordFactory.cpp index 4af5f0257..1af580a57 100644 --- a/Source/WebCore/inspector/TimelineRecordFactory.cpp +++ b/Source/WebCore/inspector/TimelineRecordFactory.cpp @@ -173,10 +173,7 @@ PassRefPtr<InspectorObject> TimelineRecordFactory::createReceiveResourceData(con PassRefPtr<InspectorObject> TimelineRecordFactory::createPaintData(const LayoutRect& rect) { RefPtr<InspectorObject> data = InspectorObject::create(); - data->setNumber("x", rect.x()); - data->setNumber("y", rect.y()); - data->setNumber("width", rect.width()); - data->setNumber("height", rect.height()); + addRectData(data.get(), rect); return data.release(); } @@ -209,6 +206,14 @@ PassRefPtr<InspectorObject> TimelineRecordFactory::createAnimationFrameData(int return data.release(); } +void TimelineRecordFactory::addRectData(InspectorObject* data, const LayoutRect& rect) +{ + data->setNumber("x", rect.x()); + data->setNumber("y", rect.y()); + data->setNumber("width", rect.width()); + data->setNumber("height", rect.height()); +} + } // namespace WebCore #endif // ENABLE(INSPECTOR) diff --git a/Source/WebCore/inspector/TimelineRecordFactory.h b/Source/WebCore/inspector/TimelineRecordFactory.h index ea4064a20..f24436abc 100644 --- a/Source/WebCore/inspector/TimelineRecordFactory.h +++ b/Source/WebCore/inspector/TimelineRecordFactory.h @@ -77,6 +77,8 @@ namespace WebCore { static PassRefPtr<InspectorObject> createPaintData(const LayoutRect&); + static void addRectData(InspectorObject*, const LayoutRect&); + static PassRefPtr<InspectorObject> createDecodeImageData(const String& imageType); static PassRefPtr<InspectorObject> createResizeImageData(bool shouldCache); diff --git a/Source/WebCore/inspector/front-end/TimelinePanel.js b/Source/WebCore/inspector/front-end/TimelinePanel.js index d4c0ce6fe..472ace2dd 100644 --- a/Source/WebCore/inspector/front-end/TimelinePanel.js +++ b/Source/WebCore/inspector/front-end/TimelinePanel.js @@ -947,7 +947,8 @@ WebInspector.TimelinePanel.prototype = { { var anchor = this._getPopoverAnchor(e.target); - if (anchor && anchor.row && anchor.row._record.type === "Paint") + const recordType = WebInspector.TimelineModel.RecordType; + if (anchor && anchor.row && (anchor.row._record.type === recordType.Paint || anchor.row._record.type === recordType.Layout)) this._highlightRect(anchor.row._record); else this._hideRectHighlight(); diff --git a/Source/WebCore/inspector/front-end/TimelinePresentationModel.js b/Source/WebCore/inspector/front-end/TimelinePresentationModel.js index a15ce36f3..d00c7cb5e 100644 --- a/Source/WebCore/inspector/front-end/TimelinePresentationModel.js +++ b/Source/WebCore/inspector/front-end/TimelinePresentationModel.js @@ -218,6 +218,12 @@ WebInspector.TimelinePresentationModel.createEventDivider = function(recordType, return eventDivider; } +WebInspector.TimelinePresentationModel._hiddenRecords = { } +WebInspector.TimelinePresentationModel._hiddenRecords[WebInspector.TimelineModel.RecordType.MarkDOMContent] = 1; +WebInspector.TimelinePresentationModel._hiddenRecords[WebInspector.TimelineModel.RecordType.MarkLoad] = 1; +WebInspector.TimelinePresentationModel._hiddenRecords[WebInspector.TimelineModel.RecordType.ScheduleStyleRecalculation] = 1; +WebInspector.TimelinePresentationModel._hiddenRecords[WebInspector.TimelineModel.RecordType.InvalidateLayout] = 1; + WebInspector.TimelinePresentationModel.prototype = { /** * @param {WebInspector.TimelinePresentationModel.Filter} filter @@ -278,13 +284,7 @@ WebInspector.TimelinePresentationModel.prototype = { _innerAddRecord: function(record, parentRecord) { const recordTypes = WebInspector.TimelineModel.RecordType; - const hiddenRecords = [ - recordTypes.MarkDOMContent, - recordTypes.MarkLoad, - recordTypes.ScheduleStyleRecalculation, - recordTypes.InvalidateLayout - ]; - var isHiddenRecord = hiddenRecords.indexOf(record.type) >= 0; + var isHiddenRecord = record.type in WebInspector.TimelinePresentationModel._hiddenRecords; var connectedToOldRecord = false; if (record.type === recordTypes.Time) parentRecord = this._rootRecord; @@ -788,7 +788,7 @@ WebInspector.TimelinePresentationModel.Record.prototype = { callSiteStackTraceLabel = WebInspector.UIString("Layout invalidated"); if (this.stackTrace) { callStackLabel = WebInspector.UIString("Layout forced"); - contentHelper._appendTextRow(WebInspector.UIString("Note"), WebInspector.UIString("Forced synchronous layout is a possible performance bottlenck.")); + contentHelper._appendTextRow(WebInspector.UIString("Note"), WebInspector.UIString("Forced synchronous layout is a possible performance bottleneck.")); } break; case recordTypes.Time: diff --git a/Source/WebCore/inspector/front-end/treeoutline.js b/Source/WebCore/inspector/front-end/treeoutline.js index fd02f4e02..814d33160 100644 --- a/Source/WebCore/inspector/front-end/treeoutline.js +++ b/Source/WebCore/inspector/front-end/treeoutline.js @@ -623,7 +623,6 @@ TreeElement.prototype = { set title(x) { this._title = x; this._setListItemNodeContent(); - this.didChange(); }, get tooltip() { @@ -634,7 +633,6 @@ TreeElement.prototype = { this._tooltip = x; if (this._listItemNode) this._listItemNode.title = x ? x : ""; - this.didChange(); }, get hasChildren() { @@ -656,8 +654,6 @@ TreeElement.prototype = { this._listItemNode.classList.remove("parent"); this.collapse(); } - - this.didChange(); }, get hidden() { @@ -693,21 +689,6 @@ TreeElement.prototype = { this.expand(); }, - _fireDidChange: function() - { - delete this._didChangeTimeoutIdentifier; - }, - - didChange: function() - { - if (!this.treeOutline) - return; - - // Prevent telling the TreeOutline multiple times in a row by delaying it with a timeout. - if (!this._didChangeTimeoutIdentifier) - this._didChangeTimeoutIdentifier = setTimeout(this._fireDidChange.bind(this), 0); - }, - _setListItemNodeContent: function() { if (!this._listItemNode) diff --git a/Source/WebCore/page/FocusController.cpp b/Source/WebCore/page/FocusController.cpp index 0705c0bfa..a6a91cda6 100644 --- a/Source/WebCore/page/FocusController.cpp +++ b/Source/WebCore/page/FocusController.cpp @@ -708,7 +708,7 @@ void FocusController::setContainingWindowIsVisible(bool containingWindowIsVisibl for (HashSet<ScrollableArea*>::const_iterator it = scrollableAreas->begin(), end = scrollableAreas->end(); it != end; ++it) { ScrollableArea* scrollableArea = *it; - ASSERT(scrollableArea->isOnActivePage()); + ASSERT(scrollableArea->scrollbarsCanBeActive() || m_page->shouldSuppressScrollbarAnimations()); contentAreaDidShowOrHide(scrollableArea, containingWindowIsVisible); } diff --git a/Source/WebCore/page/FrameView.cpp b/Source/WebCore/page/FrameView.cpp index f4924f121..d6d6c567e 100644 --- a/Source/WebCore/page/FrameView.cpp +++ b/Source/WebCore/page/FrameView.cpp @@ -1252,7 +1252,7 @@ void FrameView::layout(bool allowSubtree) m_actionScheduler->resume(); } - InspectorInstrumentation::didLayout(cookie); + InspectorInstrumentation::didLayout(cookie, root); m_nestedLayoutCount--; if (m_nestedLayoutCount) @@ -2745,14 +2745,22 @@ void FrameView::setVisibleScrollerThumbRect(const IntRect& scrollerThumb) page->chrome()->client()->notifyScrollerThumbIsVisibleInRect(scrollerThumb); } -bool FrameView::isOnActivePage() const +bool FrameView::scrollbarsCanBeActive() const { if (!m_frame) return false; + if (m_frame->view() != this) return false; + + if (Page* page = m_frame->page()) { + if (page->shouldSuppressScrollbarAnimations()) + return false; + } + if (Document* document = m_frame->document()) return !document->inPageCache(); + return false; } @@ -2838,7 +2846,7 @@ void FrameView::setAnimatorsAreActive() for (HashSet<ScrollableArea*>::const_iterator it = m_scrollableAreas->begin(), end = m_scrollableAreas->end(); it != end; ++it) { ScrollableArea* scrollableArea = *it; - ASSERT(scrollableArea->isOnActivePage()); + ASSERT(scrollableArea->scrollbarsCanBeActive()); scrollableArea->scrollAnimator()->setIsActive(); } } @@ -2857,7 +2865,7 @@ void FrameView::notifyPageThatContentAreaWillPaint() const for (HashSet<ScrollableArea*>::const_iterator it = m_scrollableAreas->begin(), end = m_scrollableAreas->end(); it != end; ++it) { ScrollableArea* scrollableArea = *it; - if (!scrollableArea->isOnActivePage()) + if (!scrollableArea->scrollbarsCanBeActive()) continue; scrollableArea->contentAreaWillPaint(); diff --git a/Source/WebCore/page/FrameView.h b/Source/WebCore/page/FrameView.h index 0756c4978..ceea73ff5 100644 --- a/Source/WebCore/page/FrameView.h +++ b/Source/WebCore/page/FrameView.h @@ -320,6 +320,8 @@ public: virtual IntPoint currentMousePosition() const; + virtual bool scrollbarsCanBeActive() const OVERRIDE; + // FIXME: Remove this method once plugin loading is decoupled from layout. void flushAnyPendingPostLayoutTasks(); @@ -410,7 +412,6 @@ private: virtual void getTickmarks(Vector<IntRect>&) const OVERRIDE; virtual void scrollTo(const IntSize&) OVERRIDE; virtual void setVisibleScrollerThumbRect(const IntRect&) OVERRIDE; - virtual bool isOnActivePage() const OVERRIDE; virtual ScrollableArea* enclosingScrollableArea() const OVERRIDE; virtual IntRect scrollableAreaBoundingBox() const OVERRIDE; virtual bool scrollAnimatorEnabled() const OVERRIDE; diff --git a/Source/WebCore/page/Location.idl b/Source/WebCore/page/Location.idl index 1f1703af6..1bc32a038 100644 --- a/Source/WebCore/page/Location.idl +++ b/Source/WebCore/page/Location.idl @@ -40,8 +40,7 @@ module window { JSCustomDefineOwnProperty, JSCustomNamedGetterOnPrototype, JSCustomDefineOwnPropertyOnPrototype, - OmitConstructor, - V8CustomToJSObject + OmitConstructor ] Location { #if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP attribute [DoNotCheckSecurityOnSetter, CustomSetter, V8Unforgeable] DOMString href; diff --git a/Source/WebCore/page/Page.cpp b/Source/WebCore/page/Page.cpp index 2983808ea..8578d33d2 100644 --- a/Source/WebCore/page/Page.cpp +++ b/Source/WebCore/page/Page.cpp @@ -144,6 +144,7 @@ Page::Page(PageClients& pageClients) , m_mediaVolume(1) , m_pageScaleFactor(1) , m_deviceScaleFactor(1) + , m_suppressScrollbarAnimations(false) , m_javaScriptURLsAreAllowed(true) , m_didLoadUserStyleSheet(false) , m_userStyleSheetModificationTime(0) @@ -693,6 +694,46 @@ void Page::setDeviceScaleFactor(float scaleFactor) pageCache()->markPagesForFullStyleRecalc(this); } +void Page::setShouldSuppressScrollbarAnimations(bool suppressAnimations) +{ + if (suppressAnimations == m_suppressScrollbarAnimations) + return; + + if (!suppressAnimations) { + // If animations are not going to be suppressed anymore, then there is nothing to do here but + // change the cached value. + m_suppressScrollbarAnimations = suppressAnimations; + return; + } + + // On the other hand, if we are going to start suppressing animations, then we need to make sure we + // finish any current scroll animations first. + FrameView* view = mainFrame()->view(); + if (!view) + return; + + view->finishCurrentScrollAnimations(); + + for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) { + FrameView* frameView = frame->view(); + if (!frameView) + continue; + + const HashSet<ScrollableArea*>* scrollableAreas = frameView->scrollableAreas(); + if (!scrollableAreas) + continue; + + for (HashSet<ScrollableArea*>::const_iterator it = scrollableAreas->begin(), end = scrollableAreas->end(); it != end; ++it) { + ScrollableArea* scrollableArea = *it; + ASSERT(scrollableArea->scrollbarsCanBeActive()); + + scrollableArea->finishCurrentScrollAnimations(); + } + } + + m_suppressScrollbarAnimations = suppressAnimations; +} + void Page::setPagination(const Pagination& pagination) { if (m_pagination == pagination) diff --git a/Source/WebCore/page/Page.h b/Source/WebCore/page/Page.h index a218d5d4c..e44b9121d 100644 --- a/Source/WebCore/page/Page.h +++ b/Source/WebCore/page/Page.h @@ -247,6 +247,9 @@ namespace WebCore { float deviceScaleFactor() const { return m_deviceScaleFactor; } void setDeviceScaleFactor(float); + bool shouldSuppressScrollbarAnimations() const { return m_suppressScrollbarAnimations; } + void setShouldSuppressScrollbarAnimations(bool suppressAnimations); + // Page and FrameView both store a Pagination value. Page::pagination() is set only by API, // and FrameView::pagination() is set only by CSS. Page::pagination() will affect all // FrameViews in the page cache, but FrameView::pagination() only affects the current @@ -396,6 +399,8 @@ namespace WebCore { float m_pageScaleFactor; float m_deviceScaleFactor; + bool m_suppressScrollbarAnimations; + Pagination m_pagination; bool m_javaScriptURLsAreAllowed; diff --git a/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp b/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp index 1f60151fd..6d584a866 100644 --- a/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp +++ b/Source/WebCore/page/scrolling/ScrollingCoordinator.cpp @@ -36,6 +36,7 @@ #include "Region.h" #include "RenderView.h" #include "ScrollAnimator.h" +#include "ScrollingTreeState.h" #include <wtf/MainThread.h> #if USE(ACCELERATED_COMPOSITING) @@ -45,7 +46,6 @@ #if ENABLE(THREADED_SCROLLING) #include "ScrollingThread.h" #include "ScrollingTree.h" -#include "ScrollingTreeState.h" #include <wtf/Functional.h> #include <wtf/PassRefPtr.h> #endif @@ -192,7 +192,7 @@ void ScrollingCoordinator::frameViewHasSlowRepaintObjectsDidChange(FrameView* fr if (!coordinatesScrollingForFrameView(frameView)) return; - updateShouldUpdateScrollLayerPositionOnMainThreadReason(); + updateShouldUpdateScrollLayerPositionOnMainThread(); } void ScrollingCoordinator::frameViewFixedObjectsDidChange(FrameView* frameView) @@ -203,7 +203,7 @@ void ScrollingCoordinator::frameViewFixedObjectsDidChange(FrameView* frameView) if (!coordinatesScrollingForFrameView(frameView)) return; - updateShouldUpdateScrollLayerPositionOnMainThreadReason(); + updateShouldUpdateScrollLayerPositionOnMainThread(); } static GraphicsLayer* scrollLayerForFrameView(FrameView* frameView) @@ -232,7 +232,7 @@ void ScrollingCoordinator::frameViewRootLayerDidChange(FrameView* frameView) frameViewLayoutUpdated(frameView); recomputeWheelEventHandlerCount(); - updateShouldUpdateScrollLayerPositionOnMainThreadReason(); + updateShouldUpdateScrollLayerPositionOnMainThread(); setScrollLayer(scrollLayerForFrameView(frameView)); } @@ -359,7 +359,7 @@ void ScrollingCoordinator::recomputeWheelEventHandlerCount() setWheelEventHandlerCount(wheelEventHandlerCount); } -bool ScrollingCoordinator::hasNonLayerViewportConstrainedObjects(FrameView* frameView) +bool ScrollingCoordinator::hasNonLayerFixedObjects(FrameView* frameView) { const FrameView::ViewportConstrainedObjectSet* viewportConstrainedObjects = frameView->viewportConstrainedObjects(); if (!viewportConstrainedObjects) @@ -380,26 +380,15 @@ bool ScrollingCoordinator::hasNonLayerViewportConstrainedObjects(FrameView* fram #endif } -void ScrollingCoordinator::updateShouldUpdateScrollLayerPositionOnMainThreadReason() +void ScrollingCoordinator::updateShouldUpdateScrollLayerPositionOnMainThread() { -#if ENABLE(THREADED_SCROLLING) FrameView* frameView = m_page->mainFrame()->view(); - ReasonForUpdatingScrollLayerPositionOnMainThreadFlags reasonsForUpdatingScrollLayerPositionOnMainThread = (ReasonForUpdatingScrollLayerPositionOnMainThreadFlags)0; - - if (m_forceMainThreadScrollLayerPositionUpdates) - reasonsForUpdatingScrollLayerPositionOnMainThread |= ScrollingTreeState::ForcedOnMainThread; - if (frameView->hasSlowRepaintObjects()) - reasonsForUpdatingScrollLayerPositionOnMainThread |= ScrollingTreeState::HasSlowRepaintObjects; - if (!supportsFixedPositionLayers() && frameView->hasViewportConstrainedObjects()) - reasonsForUpdatingScrollLayerPositionOnMainThread |= ScrollingTreeState::HasNonCompositedViewportConstrainedObjects; - if (supportsFixedPositionLayers() && hasNonLayerViewportConstrainedObjects(frameView)) - reasonsForUpdatingScrollLayerPositionOnMainThread |= ScrollingTreeState::HasNonLayerViewportConstrainedObjects; - if (m_page->mainFrame()->document()->isImageDocument()) - reasonsForUpdatingScrollLayerPositionOnMainThread |= ScrollingTreeState::IsImageDocument; - - setShouldUpdateScrollLayerPositionOnMainThreadReason(reasonsForUpdatingScrollLayerPositionOnMainThread); -#endif + setShouldUpdateScrollLayerPositionOnMainThread(m_forceMainThreadScrollLayerPositionUpdates + || frameView->hasSlowRepaintObjects() + || (!supportsFixedPositionLayers() && frameView->hasViewportConstrainedObjects()) + || (supportsFixedPositionLayers() && hasNonLayerFixedObjects(frameView)) + || m_page->mainFrame()->document()->isImageDocument()); } void ScrollingCoordinator::setForceMainThreadScrollLayerPositionUpdates(bool forceMainThreadScrollLayerPositionUpdates) @@ -408,7 +397,7 @@ void ScrollingCoordinator::setForceMainThreadScrollLayerPositionUpdates(bool for return; m_forceMainThreadScrollLayerPositionUpdates = forceMainThreadScrollLayerPositionUpdates; - updateShouldUpdateScrollLayerPositionOnMainThreadReason(); + updateShouldUpdateScrollLayerPositionOnMainThread(); } #if ENABLE(THREADED_SCROLLING) @@ -446,18 +435,16 @@ void ScrollingCoordinator::setWheelEventHandlerCount(unsigned wheelEventHandlerC scheduleTreeStateCommit(); } -#if ENABLE(THREADED_SCROLLING) -void ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThreadReason(ReasonForUpdatingScrollLayerPositionOnMainThreadFlags reasons) +void ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThread(bool shouldUpdateScrollLayerPositionOnMainThread) { // The FrameView's GraphicsLayer is likely to be out-of-synch with the PlatformLayer // at this point. So we'll update it before we switch back to main thread scrolling // in order to avoid layer positioning bugs. - if (reasons) + if (shouldUpdateScrollLayerPositionOnMainThread) updateMainFrameScrollLayerPosition(); - m_scrollingTreeState->setShouldUpdateScrollLayerPositionOnMainThreadReason(reasons); + m_scrollingTreeState->setShouldUpdateScrollLayerPositionOnMainThread(shouldUpdateScrollLayerPositionOnMainThread); scheduleTreeStateCommit(); } -#endif void ScrollingCoordinator::scheduleTreeStateCommit() { diff --git a/Source/WebCore/page/scrolling/ScrollingCoordinator.h b/Source/WebCore/page/scrolling/ScrollingCoordinator.h index 8bc4b6a75..2ab34b2d2 100644 --- a/Source/WebCore/page/scrolling/ScrollingCoordinator.h +++ b/Source/WebCore/page/scrolling/ScrollingCoordinator.h @@ -34,7 +34,6 @@ #include <wtf/Forward.h> #if ENABLE(THREADED_SCROLLING) -#include "ScrollingTreeState.h" #include <wtf/ThreadSafeRefCounted.h> #include <wtf/Threading.h> #endif @@ -132,8 +131,8 @@ private: explicit ScrollingCoordinator(Page*); void recomputeWheelEventHandlerCount(); - bool hasNonLayerViewportConstrainedObjects(FrameView*); - void updateShouldUpdateScrollLayerPositionOnMainThreadReason(); + bool hasNonLayerFixedObjects(FrameView*); + void updateShouldUpdateScrollLayerPositionOnMainThread(); void setScrollLayer(GraphicsLayer*); void setNonFastScrollableRegion(const Region&); @@ -156,9 +155,7 @@ private: void setScrollParameters(const ScrollParameters&); void setWheelEventHandlerCount(unsigned); -#if ENABLE(THREADED_SCROLLING) - void setShouldUpdateScrollLayerPositionOnMainThreadReason(ReasonForUpdatingScrollLayerPositionOnMainThreadFlags); -#endif + void setShouldUpdateScrollLayerPositionOnMainThread(bool); void updateMainFrameScrollLayerPosition(); diff --git a/Source/WebCore/page/scrolling/ScrollingCoordinatorNone.cpp b/Source/WebCore/page/scrolling/ScrollingCoordinatorNone.cpp index 26c6e530e..b09552d86 100644 --- a/Source/WebCore/page/scrolling/ScrollingCoordinatorNone.cpp +++ b/Source/WebCore/page/scrolling/ScrollingCoordinatorNone.cpp @@ -67,11 +67,9 @@ void ScrollingCoordinator::setWheelEventHandlerCount(unsigned) { } -#if ENABLE(THREADED_SCROLLING) -void ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThreadReason(ReasonForUpdatingScrollLayerPositionOnMainThreadFlags) +void ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThread(bool) { } -#endif bool ScrollingCoordinator::supportsFixedPositionLayers() const { diff --git a/Source/WebCore/page/scrolling/ScrollingTree.cpp b/Source/WebCore/page/scrolling/ScrollingTree.cpp index 690ec9225..ba6a52ac7 100644 --- a/Source/WebCore/page/scrolling/ScrollingTree.cpp +++ b/Source/WebCore/page/scrolling/ScrollingTree.cpp @@ -224,7 +224,7 @@ void ScrollingTree::setScrollingPerformanceLoggingEnabled(bool flag) m_scrollingPerformanceLoggingEnabled = flag; } -bool ScrollingTree::scrollingPerformanceLoggingEnabled() +bool ScrollingTree::scrollingPeformanceLoggingEnabled() { return m_scrollingPerformanceLoggingEnabled; } diff --git a/Source/WebCore/page/scrolling/ScrollingTree.h b/Source/WebCore/page/scrolling/ScrollingTree.h index 40705a0fc..4120e9eac 100644 --- a/Source/WebCore/page/scrolling/ScrollingTree.h +++ b/Source/WebCore/page/scrolling/ScrollingTree.h @@ -98,7 +98,7 @@ public: #endif void setScrollingPerformanceLoggingEnabled(bool flag); - bool scrollingPerformanceLoggingEnabled(); + bool scrollingPeformanceLoggingEnabled(); private: explicit ScrollingTree(ScrollingCoordinator*); diff --git a/Source/WebCore/page/scrolling/ScrollingTreeNode.cpp b/Source/WebCore/page/scrolling/ScrollingTreeNode.cpp index 150ba7213..28402ce16 100644 --- a/Source/WebCore/page/scrolling/ScrollingTreeNode.cpp +++ b/Source/WebCore/page/scrolling/ScrollingTreeNode.cpp @@ -34,7 +34,7 @@ namespace WebCore { ScrollingTreeNode::ScrollingTreeNode(ScrollingTree* scrollingTree) : m_scrollingTree(scrollingTree) - , m_shouldUpdateScrollLayerPositionOnMainThreadReason(0) + , m_shouldUpdateScrollLayerPositionOnMainThread(false) , m_horizontalScrollElasticity(ScrollElasticityNone) , m_verticalScrollElasticity(ScrollElasticityNone) , m_hasEnabledHorizontalScrollbar(false) @@ -56,8 +56,8 @@ void ScrollingTreeNode::update(ScrollingTreeState* state) if (state->changedProperties() & ScrollingTreeState::ContentsSize) m_contentsSize = state->contentsSize(); - if (state->changedProperties() & ScrollingTreeState::ShouldUpdateScrollLayerPositionOnMainThreadReason) - m_shouldUpdateScrollLayerPositionOnMainThreadReason = state->shouldUpdateScrollLayerPositionOnMainThreadReason(); + if (state->changedProperties() & ScrollingTreeState::ShouldUpdateScrollLayerPositionOnMainThread) + m_shouldUpdateScrollLayerPositionOnMainThread = state->shouldUpdateScrollLayerPositionOnMainThread(); if (state->changedProperties() & ScrollingTreeState::HorizontalScrollElasticity) m_horizontalScrollElasticity = state->horizontalScrollElasticity(); diff --git a/Source/WebCore/page/scrolling/ScrollingTreeNode.h b/Source/WebCore/page/scrolling/ScrollingTreeNode.h index 3cad506cd..f69ae9f41 100644 --- a/Source/WebCore/page/scrolling/ScrollingTreeNode.h +++ b/Source/WebCore/page/scrolling/ScrollingTreeNode.h @@ -30,7 +30,6 @@ #include "IntRect.h" #include "ScrollTypes.h" -#include "ScrollingTreeState.h" #include <wtf/PassOwnPtr.h> namespace WebCore { @@ -48,7 +47,7 @@ public: virtual void handleWheelEvent(const PlatformWheelEvent&) = 0; virtual void setScrollPosition(const IntPoint&) = 0; - ReasonForUpdatingScrollLayerPositionOnMainThreadFlags shouldUpdateScrollLayerPositionOnMainThreadReason() const { return m_shouldUpdateScrollLayerPositionOnMainThreadReason; } + bool shouldUpdateScrollLayerPositionOnMainThread() const { return m_shouldUpdateScrollLayerPositionOnMainThread; } protected: explicit ScrollingTreeNode(ScrollingTree*); @@ -75,7 +74,7 @@ private: IntSize m_contentsSize; IntPoint m_scrollOrigin; - ReasonForUpdatingScrollLayerPositionOnMainThreadFlags m_shouldUpdateScrollLayerPositionOnMainThreadReason; + bool m_shouldUpdateScrollLayerPositionOnMainThread; ScrollElasticity m_horizontalScrollElasticity; ScrollElasticity m_verticalScrollElasticity; diff --git a/Source/WebCore/page/scrolling/ScrollingTreeState.cpp b/Source/WebCore/page/scrolling/ScrollingTreeState.cpp index 2334b5958..5eb53abe6 100644 --- a/Source/WebCore/page/scrolling/ScrollingTreeState.cpp +++ b/Source/WebCore/page/scrolling/ScrollingTreeState.cpp @@ -38,7 +38,7 @@ PassOwnPtr<ScrollingTreeState> ScrollingTreeState::create() ScrollingTreeState::ScrollingTreeState() : m_changedProperties(0) , m_wheelEventHandlerCount(0) - , m_shouldUpdateScrollLayerPositionOnMainThreadReason(0) + , m_shouldUpdateScrollLayerPositionOnMainThread(false) , m_horizontalScrollElasticity(ScrollElasticityNone) , m_verticalScrollElasticity(ScrollElasticityNone) , m_hasEnabledHorizontalScrollbar(false) @@ -88,13 +88,13 @@ void ScrollingTreeState::setWheelEventHandlerCount(unsigned wheelEventHandlerCou m_changedProperties |= WheelEventHandlerCount; } -void ScrollingTreeState::setShouldUpdateScrollLayerPositionOnMainThreadReason(ReasonForUpdatingScrollLayerPositionOnMainThreadFlags reasons) +void ScrollingTreeState::setShouldUpdateScrollLayerPositionOnMainThread(bool shouldUpdateScrollLayerPositionOnMainThread) { - if ((bool)m_shouldUpdateScrollLayerPositionOnMainThreadReason == (bool)reasons) + if (m_shouldUpdateScrollLayerPositionOnMainThread == shouldUpdateScrollLayerPositionOnMainThread) return; - m_shouldUpdateScrollLayerPositionOnMainThreadReason = reasons; - m_changedProperties |= ShouldUpdateScrollLayerPositionOnMainThreadReason; + m_shouldUpdateScrollLayerPositionOnMainThread = shouldUpdateScrollLayerPositionOnMainThread; + m_changedProperties |= ShouldUpdateScrollLayerPositionOnMainThread; } void ScrollingTreeState::setHorizontalScrollElasticity(ScrollElasticity horizontalScrollElasticity) diff --git a/Source/WebCore/page/scrolling/ScrollingTreeState.h b/Source/WebCore/page/scrolling/ScrollingTreeState.h index 0f662fd23..3b4a8d68b 100644 --- a/Source/WebCore/page/scrolling/ScrollingTreeState.h +++ b/Source/WebCore/page/scrolling/ScrollingTreeState.h @@ -40,8 +40,6 @@ namespace WebCore { -typedef unsigned ReasonForUpdatingScrollLayerPositionOnMainThreadFlags; - // The ScrollingTreeState object keeps track of the current state of scrolling related properties. // Whenever any properties change, the scrolling coordinator will be informed and will update the state // and schedule a timer that will clone the new state and send it over to the scrolling thread, avoiding locking. @@ -56,7 +54,7 @@ public: ContentsSize = 1 << 1, NonFastScrollableRegion = 1 << 2, WheelEventHandlerCount = 1 << 3, - ShouldUpdateScrollLayerPositionOnMainThreadReason = 1 << 4, + ShouldUpdateScrollLayerPositionOnMainThread = 1 << 4, HorizontalScrollElasticity = 1 << 5, VerticalScrollElasticity = 1 << 6, HasEnabledHorizontalScrollbar = 1 << 7, @@ -68,14 +66,6 @@ public: RequestedScrollPosition = 1 << 13, }; - enum ReasonForUpdatingScrollLayerPositionOnMainThread { - ForcedOnMainThread = 1 << 0, - HasSlowRepaintObjects = 1 << 1, - HasNonCompositedViewportConstrainedObjects = 1 << 2, - HasNonLayerViewportConstrainedObjects = 1 << 3, - IsImageDocument = 1 << 4 - }; - bool hasChangedProperties() const { return m_changedProperties; } unsigned changedProperties() const { return m_changedProperties; } @@ -91,8 +81,8 @@ public: unsigned wheelEventHandlerCount() const { return m_wheelEventHandlerCount; } void setWheelEventHandlerCount(unsigned); - ReasonForUpdatingScrollLayerPositionOnMainThreadFlags shouldUpdateScrollLayerPositionOnMainThreadReason() const { return m_shouldUpdateScrollLayerPositionOnMainThreadReason; } - void setShouldUpdateScrollLayerPositionOnMainThreadReason(ReasonForUpdatingScrollLayerPositionOnMainThreadFlags); + bool shouldUpdateScrollLayerPositionOnMainThread() const { return m_shouldUpdateScrollLayerPositionOnMainThread; } + void setShouldUpdateScrollLayerPositionOnMainThread(bool); ScrollElasticity horizontalScrollElasticity() const { return m_horizontalScrollElasticity; } void setHorizontalScrollElasticity(ScrollElasticity); @@ -136,7 +126,7 @@ private: unsigned m_wheelEventHandlerCount; - ReasonForUpdatingScrollLayerPositionOnMainThreadFlags m_shouldUpdateScrollLayerPositionOnMainThreadReason; + bool m_shouldUpdateScrollLayerPositionOnMainThread; ScrollElasticity m_horizontalScrollElasticity; ScrollElasticity m_verticalScrollElasticity; diff --git a/Source/WebCore/page/scrolling/chromium/ScrollingCoordinatorChromium.cpp b/Source/WebCore/page/scrolling/chromium/ScrollingCoordinatorChromium.cpp index 807decb5f..ef03b989c 100644 --- a/Source/WebCore/page/scrolling/chromium/ScrollingCoordinatorChromium.cpp +++ b/Source/WebCore/page/scrolling/chromium/ScrollingCoordinatorChromium.cpp @@ -223,15 +223,13 @@ void ScrollingCoordinator::setWheelEventHandlerCount(unsigned wheelEventHandlerC m_private->scrollLayer()->setHaveWheelEventHandlers(wheelEventHandlerCount > 0); } -#if ENABLE(THREADED_SCROLLING) -void ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThreadReason(ReasonForUpdatingScrollLayerPositionOnMainThreadFlags reasons) +void ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThread(bool should) { // We won't necessarily get a setScrollLayer() call before this one, so grab the root ourselves. setScrollLayer(scrollLayerForFrameView(m_page->mainFrame()->view())); if (m_private->scrollLayer()) - m_private->scrollLayer()->setShouldScrollOnMainThread(reasons); + m_private->scrollLayer()->setShouldScrollOnMainThread(should); } -#endif bool ScrollingCoordinator::supportsFixedPositionLayers() const { diff --git a/Source/WebCore/page/scrolling/mac/ScrollingTreeMac.mm b/Source/WebCore/page/scrolling/mac/ScrollingTreeMac.mm index 101bbd002..4a6401ca5 100644 --- a/Source/WebCore/page/scrolling/mac/ScrollingTreeMac.mm +++ b/Source/WebCore/page/scrolling/mac/ScrollingTreeMac.mm @@ -62,7 +62,7 @@ void ScrollingTree::updateDebugRootLayer() RetainPtr<CGColorRef> backgroundColor; - if (m_rootNode->shouldUpdateScrollLayerPositionOnMainThreadReason()) + if (m_rootNode->shouldUpdateScrollLayerPositionOnMainThread()) backgroundColor = adoptCF(CGColorCreateGenericRGB(1, 0, 0, .7)); { diff --git a/Source/WebCore/page/scrolling/mac/ScrollingTreeNodeMac.mm b/Source/WebCore/page/scrolling/mac/ScrollingTreeNodeMac.mm index 1194f8981..2e170cc78 100644 --- a/Source/WebCore/page/scrolling/mac/ScrollingTreeNodeMac.mm +++ b/Source/WebCore/page/scrolling/mac/ScrollingTreeNodeMac.mm @@ -37,13 +37,9 @@ #include <wtf/CurrentTime.h> #include <wtf/Deque.h> -#include <wtf/text/StringBuilder.h> -#include <wtf/text/CString.h> namespace WebCore { -static void logThreadedScrollingMode(unsigned reasonsForUpdatingScrollLayerPositionOnMainThread); - PassOwnPtr<ScrollingTreeNode> ScrollingTreeNode::create(ScrollingTree* scrollingTree) { return adoptPtr(new ScrollingTreeNodeMac(scrollingTree)); @@ -74,22 +70,15 @@ void ScrollingTreeNodeMac::update(ScrollingTreeState* state) if (state->changedProperties() & (ScrollingTreeState::ScrollLayer | ScrollingTreeState::ContentsSize | ScrollingTreeState::ViewportRect)) updateMainFramePinState(scrollPosition()); - if ((state->changedProperties() & ScrollingTreeState::ShouldUpdateScrollLayerPositionOnMainThreadReason)) { - unsigned reasonsForUpdatingScrollLayerPositionOnMainThread = this->shouldUpdateScrollLayerPositionOnMainThreadReason(); - - if (reasonsForUpdatingScrollLayerPositionOnMainThread) { - // We're transitioning to the slow "update scroll layer position on the main thread" mode. - // Initialize the probable main thread scroll position with the current scroll layer position. - if (state->changedProperties() & ScrollingTreeState::RequestedScrollPosition) - m_probableMainThreadScrollPosition = state->requestedScrollPosition(); - else { - CGPoint scrollLayerPosition = m_scrollLayer.get().position; - m_probableMainThreadScrollPosition = IntPoint(-scrollLayerPosition.x, -scrollLayerPosition.y); - } + if ((state->changedProperties() & ScrollingTreeState::ShouldUpdateScrollLayerPositionOnMainThread) && shouldUpdateScrollLayerPositionOnMainThread()) { + // We're transitioning to the slow "update scroll layer position on the main thread" mode. + // Initialize the probable main thread scroll position with the current scroll layer position. + if (state->changedProperties() & ScrollingTreeState::RequestedScrollPosition) + m_probableMainThreadScrollPosition = state->requestedScrollPosition(); + else { + CGPoint scrollLayerPosition = m_scrollLayer.get().position; + m_probableMainThreadScrollPosition = IntPoint(-scrollLayerPosition.x, -scrollLayerPosition.y); } - - if (scrollingTree()->scrollingPerformanceLoggingEnabled()) - logThreadedScrollingMode(reasonsForUpdatingScrollLayerPositionOnMainThread); } } @@ -236,7 +225,7 @@ void ScrollingTreeNodeMac::stopSnapRubberbandTimer() IntPoint ScrollingTreeNodeMac::scrollPosition() const { - if (shouldUpdateScrollLayerPositionOnMainThreadReason()) + if (shouldUpdateScrollLayerPositionOnMainThread()) return m_probableMainThreadScrollPosition; CGPoint scrollLayerPosition = m_scrollLayer.get().position; @@ -251,7 +240,7 @@ void ScrollingTreeNodeMac::setScrollPosition(const IntPoint& scrollPosition) setScrollPositionWithoutContentEdgeConstraints(newScrollPosition); - if (scrollingTree()->scrollingPerformanceLoggingEnabled()) + if (scrollingTree()->scrollingPeformanceLoggingEnabled()) logExposedUnfilledArea(); } @@ -259,7 +248,7 @@ void ScrollingTreeNodeMac::setScrollPositionWithoutContentEdgeConstraints(const { updateMainFramePinState(scrollPosition); - if (shouldUpdateScrollLayerPositionOnMainThreadReason()) { + if (shouldUpdateScrollLayerPositionOnMainThread()) { m_probableMainThreadScrollPosition = scrollPosition; scrollingTree()->updateMainFrameScrollPositionAndScrollLayerPosition(scrollPosition); return; @@ -271,7 +260,7 @@ void ScrollingTreeNodeMac::setScrollPositionWithoutContentEdgeConstraints(const void ScrollingTreeNodeMac::setScrollLayerPosition(const IntPoint& position) { - ASSERT(!shouldUpdateScrollLayerPositionOnMainThreadReason()); + ASSERT(!shouldUpdateScrollLayerPositionOnMainThread()); m_scrollLayer.get().position = CGPointMake(-position.x() + scrollOrigin().x(), -position.y() + scrollOrigin().y()); } @@ -341,30 +330,6 @@ void ScrollingTreeNodeMac::logExposedUnfilledArea() WTFLogAlways("SCROLLING: Exposed tileless area. Time: %f Unfilled Pixels: %u\n", WTF::monotonicallyIncreasingTime(), unfilledArea); } -static void logThreadedScrollingMode(unsigned reasonsForUpdatingScrollLayerPositionOnMainThread) -{ - if (reasonsForUpdatingScrollLayerPositionOnMainThread) { - StringBuilder reasonsDescription; - - if (reasonsForUpdatingScrollLayerPositionOnMainThread & ScrollingTreeState::ForcedOnMainThread) - reasonsDescription.append("forced,"); - if (reasonsForUpdatingScrollLayerPositionOnMainThread & ScrollingTreeState::HasSlowRepaintObjects) - reasonsDescription.append("slow-repaint objects,"); - if (reasonsForUpdatingScrollLayerPositionOnMainThread & ScrollingTreeState::HasNonCompositedViewportConstrainedObjects) - reasonsDescription.append("viewport-constrained objects,"); - if (reasonsForUpdatingScrollLayerPositionOnMainThread & ScrollingTreeState::HasNonLayerViewportConstrainedObjects) - reasonsDescription.append("non-layer viewport-constrained objects,"); - if (reasonsForUpdatingScrollLayerPositionOnMainThread & ScrollingTreeState::IsImageDocument) - reasonsDescription.append("image document,"); - - // Strip the trailing comma. - String reasonsDescriptionTrimmed = reasonsDescription.toString().left(reasonsDescription.length() - 1); - - WTFLogAlways("SCROLLING: Switching to main-thread scrolling mode. Time: %f Reason(s): %s\n", WTF::monotonicallyIncreasingTime(), reasonsDescriptionTrimmed.ascii().data()); - } else - WTFLogAlways("SCROLLING: Switching to threaded scrolling mode. Time: %f\n", WTF::monotonicallyIncreasingTime()); -} - } // namespace WebCore #endif // ENABLE(THREADED_SCROLLING) diff --git a/Source/WebCore/platform/LocalizedStrings.cpp b/Source/WebCore/platform/LocalizedStrings.cpp index 01734e1ff..5a7ddf8ba 100644 --- a/Source/WebCore/platform/LocalizedStrings.cpp +++ b/Source/WebCore/platform/LocalizedStrings.cpp @@ -676,12 +676,12 @@ String crashedPluginText() String blockedPluginByContentSecurityPolicyText() { - return WEB_UI_STRING("Blocked Plug-in", "Label text to be used if plugin is blocked by a page's Content Security Policy"); + return WEB_UI_STRING_KEY("Blocked Plug-in", "Blocked Plug-In (Blocked by page's Content Security Policy)", "Label text to be used if plugin is blocked by a page's Content Security Policy"); } String insecurePluginVersionText() { - return WEB_UI_STRING("Blocked Plug-in", "Label text to be used when an insecure plug-in version was blocked from loading"); + return WEB_UI_STRING_KEY("Blocked Plug-in", "Blocked Plug-In (Insecure plug-in)", "Label text to be used when an insecure plug-in version was blocked from loading"); } String multipleFileUploadText(unsigned numberOfFiles) diff --git a/Source/WebCore/platform/ScrollAnimator.h b/Source/WebCore/platform/ScrollAnimator.h index 0c5f32c05..ebef189f3 100644 --- a/Source/WebCore/platform/ScrollAnimator.h +++ b/Source/WebCore/platform/ScrollAnimator.h @@ -83,6 +83,8 @@ public: virtual void contentAreaDidShow() const { } virtual void contentAreaDidHide() const { } + virtual void finishCurrentScrollAnimations() { } + virtual void didAddVerticalScrollbar(Scrollbar*) { } virtual void willRemoveVerticalScrollbar(Scrollbar*) { } virtual void didAddHorizontalScrollbar(Scrollbar*) { } diff --git a/Source/WebCore/platform/ScrollableArea.cpp b/Source/WebCore/platform/ScrollableArea.cpp index b4e7e5591..69bd4f1ea 100644 --- a/Source/WebCore/platform/ScrollableArea.cpp +++ b/Source/WebCore/platform/ScrollableArea.cpp @@ -256,6 +256,12 @@ void ScrollableArea::contentAreaDidHide() const scrollAnimator->contentAreaDidHide(); } +void ScrollableArea::finishCurrentScrollAnimations() const +{ + if (ScrollAnimator* scrollAnimator = existingScrollAnimator()) + scrollAnimator->finishCurrentScrollAnimations(); +} + void ScrollableArea::didAddVerticalScrollbar(Scrollbar* scrollbar) { scrollAnimator()->didAddVerticalScrollbar(scrollbar); diff --git a/Source/WebCore/platform/ScrollableArea.h b/Source/WebCore/platform/ScrollableArea.h index ce255b1b6..c744af6f0 100644 --- a/Source/WebCore/platform/ScrollableArea.h +++ b/Source/WebCore/platform/ScrollableArea.h @@ -81,6 +81,8 @@ public: void contentAreaDidShow() const; void contentAreaDidHide() const; + void finishCurrentScrollAnimations() const; + void didAddVerticalScrollbar(Scrollbar*); void willRemoveVerticalScrollbar(Scrollbar*); virtual void didAddHorizontalScrollbar(Scrollbar*); @@ -147,7 +149,7 @@ public: virtual void scrollbarStyleChanged(int /*newStyle*/, bool /*forceUpdate*/) { } virtual void setVisibleScrollerThumbRect(const IntRect&) { } - virtual bool isOnActivePage() const = 0; + virtual bool scrollbarsCanBeActive() const = 0; // Note that this only returns scrollable areas that can actually be scrolled. virtual ScrollableArea* enclosingScrollableArea() const = 0; diff --git a/Source/WebCore/platform/chromium/FramelessScrollView.cpp b/Source/WebCore/platform/chromium/FramelessScrollView.cpp index c410677cb..b9f8b3ae9 100644 --- a/Source/WebCore/platform/chromium/FramelessScrollView.cpp +++ b/Source/WebCore/platform/chromium/FramelessScrollView.cpp @@ -63,7 +63,7 @@ ScrollableArea* FramelessScrollView::enclosingScrollableArea() const return 0; } -bool FramelessScrollView::isOnActivePage() const +bool FramelessScrollView::scrollbarsCanBeActive() const { return isActive(); } diff --git a/Source/WebCore/platform/chromium/FramelessScrollView.h b/Source/WebCore/platform/chromium/FramelessScrollView.h index ac1eecd1c..d64d2cdfd 100644 --- a/Source/WebCore/platform/chromium/FramelessScrollView.h +++ b/Source/WebCore/platform/chromium/FramelessScrollView.h @@ -77,7 +77,7 @@ namespace WebCore { virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) OVERRIDE; virtual bool isActive() const OVERRIDE; virtual ScrollableArea* enclosingScrollableArea() const OVERRIDE; - virtual bool isOnActivePage() const OVERRIDE; + virtual bool scrollbarsCanBeActive() const OVERRIDE; virtual IntRect scrollableAreaBoundingBox() const OVERRIDE; // Widget public methods: diff --git a/Source/WebCore/platform/chromium/PlatformSupport.h b/Source/WebCore/platform/chromium/PlatformSupport.h index 6e7949e8a..5b02dbf2c 100644 --- a/Source/WebCore/platform/chromium/PlatformSupport.h +++ b/Source/WebCore/platform/chromium/PlatformSupport.h @@ -51,7 +51,6 @@ typedef NPP_t* NPP; #if OS(DARWIN) typedef struct CGFont* CGFontRef; -typedef uintptr_t ATSFontContainerRef; #ifdef __OBJC__ @class NSFont; #else diff --git a/Source/WebCore/platform/chromium/TraceEvent.h b/Source/WebCore/platform/chromium/TraceEvent.h index 89ef85ecd..454f9e9c8 100644 --- a/Source/WebCore/platform/chromium/TraceEvent.h +++ b/Source/WebCore/platform/chromium/TraceEvent.h @@ -403,18 +403,18 @@ // ASYNC_BEGIN event above. The |step| param identifies this step within the // async event. This should be called at the beginning of the next phase of an // asynchronous operation. -#define TRACE_EVENT_ASYNC_BEGIN_STEP0(category, name, id, step) \ +#define TRACE_EVENT_ASYNC_STEP0(category, name, id, step) \ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \ category, name, id, TRACE_EVENT_FLAG_NONE, "step", step) -#define TRACE_EVENT_ASYNC_BEGIN_STEP1(category, name, id, step, \ +#define TRACE_EVENT_ASYNC_STEP1(category, name, id, step, \ arg1_name, arg1_val) \ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \ category, name, id, TRACE_EVENT_FLAG_NONE, "step", step, \ arg1_name, arg1_val) -#define TRACE_EVENT_COPY_ASYNC_BEGIN_STEP0(category, name, id, step) \ +#define TRACE_EVENT_COPY_ASYNC_STEP0(category, name, id, step) \ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \ category, name, id, TRACE_EVENT_FLAG_COPY, "step", step) -#define TRACE_EVENT_COPY_ASYNC_BEGIN_STEP1(category, name, id, step, \ +#define TRACE_EVENT_COPY_ASYNC_STEP1(category, name, id, step, \ arg1_name, arg1_val) \ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \ category, name, id, TRACE_EVENT_FLAG_COPY, "step", step, \ diff --git a/Source/WebCore/platform/efl/RenderThemeEfl.cpp b/Source/WebCore/platform/efl/RenderThemeEfl.cpp index f3dc54c98..4fa1274da 100644 --- a/Source/WebCore/platform/efl/RenderThemeEfl.cpp +++ b/Source/WebCore/platform/efl/RenderThemeEfl.cpp @@ -31,7 +31,7 @@ #include "FontDescription.h" #include "GraphicsContext.h" #include "HTMLInputElement.h" -#include "InputType.h" +#include "InputTypeNames.h" #include "NotImplemented.h" #include "Page.h" #include "PaintInfo.h" diff --git a/Source/WebCore/platform/graphics/DashArray.h b/Source/WebCore/platform/graphics/DashArray.h index 0516584ae..39596d423 100644 --- a/Source/WebCore/platform/graphics/DashArray.h +++ b/Source/WebCore/platform/graphics/DashArray.h @@ -29,11 +29,13 @@ #include <wtf/Vector.h> #if USE(CG) -typedef Vector<CGFloat> DashArray; +typedef CGFloat DashArrayElement; #elif USE(CAIRO) -typedef Vector<double> DashArray; +typedef double DashArrayElement; #else -typedef Vector<float> DashArray; +typedef float DashArrayElement; #endif +typedef Vector<DashArrayElement> DashArray; + #endif // DashArray_h diff --git a/Source/WebCore/platform/graphics/FloatPoint.h b/Source/WebCore/platform/graphics/FloatPoint.h index 90e6c4b6d..58db6bab9 100644 --- a/Source/WebCore/platform/graphics/FloatPoint.h +++ b/Source/WebCore/platform/graphics/FloatPoint.h @@ -154,8 +154,8 @@ public: operator CGPoint() const; #endif -#if (PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)) \ - || (PLATFORM(CHROMIUM) && OS(DARWIN)) +#if (PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))) \ + && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) FloatPoint(const NSPoint&); operator NSPoint() const; #endif diff --git a/Source/WebCore/platform/graphics/FloatRect.h b/Source/WebCore/platform/graphics/FloatRect.h index 725012fd7..161e2780f 100644 --- a/Source/WebCore/platform/graphics/FloatRect.h +++ b/Source/WebCore/platform/graphics/FloatRect.h @@ -199,8 +199,8 @@ public: operator CGRect() const; #endif -#if (PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)) \ - || (PLATFORM(CHROMIUM) && OS(DARWIN)) +#if (PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))) \ + && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) FloatRect(const NSRect&); operator NSRect() const; #endif diff --git a/Source/WebCore/platform/graphics/FloatSize.h b/Source/WebCore/platform/graphics/FloatSize.h index b1d72a58d..c029c5a95 100644 --- a/Source/WebCore/platform/graphics/FloatSize.h +++ b/Source/WebCore/platform/graphics/FloatSize.h @@ -135,8 +135,9 @@ public: operator CGSize() const; #endif -#if (PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)) \ - || (PLATFORM(CHROMIUM) && OS(DARWIN)) || (PLATFORM(QT) && USE(QTKIT)) +#if (PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))) \ + && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) \ + || (PLATFORM(QT) && USE(QTKIT)) explicit FloatSize(const NSSize &); // don't do this implicitly since it's lossy operator NSSize() const; #endif diff --git a/Source/WebCore/platform/graphics/IntRect.h b/Source/WebCore/platform/graphics/IntRect.h index 9a9a7f7e5..eda582d21 100644 --- a/Source/WebCore/platform/graphics/IntRect.h +++ b/Source/WebCore/platform/graphics/IntRect.h @@ -231,8 +231,9 @@ public: operator SkIRect() const; #endif -#if (PLATFORM(MAC) && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES)) \ - || (PLATFORM(CHROMIUM) && OS(DARWIN)) || (PLATFORM(QT) && USE(QTKIT)) +#if (PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))) \ + && !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) \ + || (PLATFORM(QT) && USE(QTKIT)) operator NSRect() const; #endif diff --git a/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceFilters.cpp b/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceFilters.cpp index f0b265971..b8692633b 100644 --- a/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceFilters.cpp +++ b/Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceFilters.cpp @@ -441,6 +441,7 @@ SkBitmap CCRenderSurfaceFilters::apply(const WebKit::WebFilterOperations& filter paint.setImageFilter(zoomFilter.get()); canvas->saveLayer(0, &paint); canvas->drawBitmap(state.source(), 0, 0); + canvas->restore(); break; } case WebKit::WebFilterOperation::FilterTypeBrightness: diff --git a/Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp b/Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp index cb4336b6e..a1d667975 100644 --- a/Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp +++ b/Source/WebCore/platform/graphics/gpu/LoopBlinnPathProcessor.cpp @@ -69,15 +69,15 @@ namespace { String valueToString(const FloatRect& arg) { StringBuilder builder; - builder.append("[FloatRect x="); + builder.appendLiteral("[FloatRect x="); builder.append(String::number(arg.x())); - builder.append(" y="); + builder.appendLiteral(" y="); builder.append(String::number(arg.y())); - builder.append(" maxX="); + builder.appendLiteral(" maxX="); builder.append(String::number(arg.maxX())); - builder.append(" maxY="); + builder.appendLiteral(" maxY="); builder.append(String::number(arg.maxY())); - builder.append("]"); + builder.append(']'); return builder.toString(); } #endif diff --git a/Source/WebCore/platform/graphics/mac/ImageMac.mm b/Source/WebCore/platform/graphics/mac/ImageMac.mm index bc0bcc522..091f2da23 100644 --- a/Source/WebCore/platform/graphics/mac/ImageMac.mm +++ b/Source/WebCore/platform/graphics/mac/ImageMac.mm @@ -89,8 +89,7 @@ CFDataRef BitmapImage::getTIFFRepresentation() unsigned numValidFrames = images.size(); RetainPtr<CFMutableDataRef> data(AdoptCF, CFDataCreateMutable(0, 0)); - // FIXME: Use type kCGImageTypeIdentifierTIFF constant once is becomes available in the API - RetainPtr<CGImageDestinationRef> destination(AdoptCF, CGImageDestinationCreateWithData(data.get(), CFSTR("public.tiff"), numValidFrames, 0)); + RetainPtr<CGImageDestinationRef> destination(AdoptCF, CGImageDestinationCreateWithData(data.get(), kUTTypeTIFF, numValidFrames, 0)); if (!destination) return 0; diff --git a/Source/WebCore/platform/leveldb/LevelDBTransaction.cpp b/Source/WebCore/platform/leveldb/LevelDBTransaction.cpp index 862a5fbfb..26580c210 100644 --- a/Source/WebCore/platform/leveldb/LevelDBTransaction.cpp +++ b/Source/WebCore/platform/leveldb/LevelDBTransaction.cpp @@ -485,6 +485,41 @@ void LevelDBTransaction::notifyIteratorsOfTreeChange() } } +PassOwnPtr<LevelDBWriteOnlyTransaction> LevelDBWriteOnlyTransaction::create(LevelDBDatabase* db) +{ + return adoptPtr(new LevelDBWriteOnlyTransaction(db)); +} + +LevelDBWriteOnlyTransaction::LevelDBWriteOnlyTransaction(LevelDBDatabase* db) + : m_db(db) + , m_writeBatch(LevelDBWriteBatch::create()) + , m_finished(false) +{ +} + +LevelDBWriteOnlyTransaction::~LevelDBWriteOnlyTransaction() +{ + m_writeBatch->clear(); +} + +void LevelDBWriteOnlyTransaction::remove(const LevelDBSlice& key) +{ + ASSERT(!m_finished); + m_writeBatch->remove(key); +} + +bool LevelDBWriteOnlyTransaction::commit() +{ + ASSERT(!m_finished); + + if (!m_db->write(*m_writeBatch)) + return false; + + m_finished = true; + m_writeBatch->clear(); + return true; +} + } // namespace WebCore #endif // USE(LEVELDB) diff --git a/Source/WebCore/platform/leveldb/LevelDBTransaction.h b/Source/WebCore/platform/leveldb/LevelDBTransaction.h index 6d22850c2..80a335d47 100644 --- a/Source/WebCore/platform/leveldb/LevelDBTransaction.h +++ b/Source/WebCore/platform/leveldb/LevelDBTransaction.h @@ -43,6 +43,7 @@ namespace WebCore { class LevelDBDatabase; +class LevelDBWriteBatch; using WTF::AVLTree; @@ -169,6 +170,22 @@ private: HashSet<TransactionIterator*> m_iterators; }; +class LevelDBWriteOnlyTransaction { +public: + static PassOwnPtr<LevelDBWriteOnlyTransaction> create(LevelDBDatabase*); + + ~LevelDBWriteOnlyTransaction(); + void remove(const LevelDBSlice& key); + bool commit(); + +private: + LevelDBWriteOnlyTransaction(LevelDBDatabase*); + + LevelDBDatabase* m_db; + OwnPtr<LevelDBWriteBatch> m_writeBatch; + bool m_finished; +}; + } #endif // USE(LEVELDB) diff --git a/Source/WebCore/platform/mac/ScrollAnimatorMac.h b/Source/WebCore/platform/mac/ScrollAnimatorMac.h index 6d00f259d..75f11d14f 100644 --- a/Source/WebCore/platform/mac/ScrollAnimatorMac.h +++ b/Source/WebCore/platform/mac/ScrollAnimatorMac.h @@ -112,6 +112,8 @@ private: void didEndScrollGesture() const; void mayBeginScrollGesture() const; + virtual void finishCurrentScrollAnimations(); + virtual void didAddVerticalScrollbar(Scrollbar*); virtual void willRemoveVerticalScrollbar(Scrollbar*); virtual void didAddHorizontalScrollbar(Scrollbar*); diff --git a/Source/WebCore/platform/mac/ScrollAnimatorMac.mm b/Source/WebCore/platform/mac/ScrollAnimatorMac.mm index a5b512e84..a0fe1b51c 100644 --- a/Source/WebCore/platform/mac/ScrollAnimatorMac.mm +++ b/Source/WebCore/platform/mac/ScrollAnimatorMac.mm @@ -263,7 +263,7 @@ static NSSize abs(NSSize size) if (!_scrollableArea) return; - if (!_scrollableArea->isOnActivePage()) + if (!_scrollableArea->scrollbarsCanBeActive()) return; _scrollableArea->scrollAnimator()->contentAreaWillPaint(); @@ -739,7 +739,7 @@ void ScrollAnimatorMac::notifyPositionChanged() void ScrollAnimatorMac::contentAreaWillPaint() const { - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (isScrollbarOverlayAPIAvailable()) [m_scrollbarPainterController.get() contentAreaWillDraw]; @@ -747,7 +747,7 @@ void ScrollAnimatorMac::contentAreaWillPaint() const void ScrollAnimatorMac::mouseEnteredContentArea() const { - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (isScrollbarOverlayAPIAvailable()) [m_scrollbarPainterController.get() mouseEnteredContentArea]; @@ -755,7 +755,7 @@ void ScrollAnimatorMac::mouseEnteredContentArea() const void ScrollAnimatorMac::mouseExitedContentArea() const { - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (isScrollbarOverlayAPIAvailable()) [m_scrollbarPainterController.get() mouseExitedContentArea]; @@ -763,7 +763,7 @@ void ScrollAnimatorMac::mouseExitedContentArea() const void ScrollAnimatorMac::mouseMovedInContentArea() const { - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (isScrollbarOverlayAPIAvailable()) [m_scrollbarPainterController.get() mouseMovedInContentArea]; @@ -775,7 +775,7 @@ void ScrollAnimatorMac::mouseEnteredScrollbar(Scrollbar* scrollbar) const if (recommendedScrollerStyle() != NSScrollerStyleLegacy) return; - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (isScrollbarOverlayAPIAvailable()) { @@ -792,7 +792,7 @@ void ScrollAnimatorMac::mouseExitedScrollbar(Scrollbar* scrollbar) const if (recommendedScrollerStyle() != NSScrollerStyleLegacy) return; - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (isScrollbarOverlayAPIAvailable()) { @@ -805,7 +805,7 @@ void ScrollAnimatorMac::mouseExitedScrollbar(Scrollbar* scrollbar) const void ScrollAnimatorMac::willStartLiveResize() { - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (isScrollbarOverlayAPIAvailable()) [m_scrollbarPainterController.get() startLiveResize]; @@ -813,7 +813,7 @@ void ScrollAnimatorMac::willStartLiveResize() void ScrollAnimatorMac::contentsResized() const { - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (isScrollbarOverlayAPIAvailable()) [m_scrollbarPainterController.get() contentAreaDidResize]; @@ -821,7 +821,7 @@ void ScrollAnimatorMac::contentsResized() const void ScrollAnimatorMac::willEndLiveResize() { - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (isScrollbarOverlayAPIAvailable()) [m_scrollbarPainterController.get() endLiveResize]; @@ -829,7 +829,7 @@ void ScrollAnimatorMac::willEndLiveResize() void ScrollAnimatorMac::contentAreaDidShow() const { - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (isScrollbarOverlayAPIAvailable()) [m_scrollbarPainterController.get() windowOrderedIn]; @@ -837,7 +837,7 @@ void ScrollAnimatorMac::contentAreaDidShow() const void ScrollAnimatorMac::contentAreaDidHide() const { - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (isScrollbarOverlayAPIAvailable()) [m_scrollbarPainterController.get() windowOrderedOut]; @@ -845,7 +845,7 @@ void ScrollAnimatorMac::contentAreaDidHide() const void ScrollAnimatorMac::didBeginScrollGesture() const { - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (isScrollbarOverlayAPIAvailable()) [m_scrollbarPainterController.get() beginScrollGesture]; @@ -853,7 +853,7 @@ void ScrollAnimatorMac::didBeginScrollGesture() const void ScrollAnimatorMac::didEndScrollGesture() const { - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (isScrollbarOverlayAPIAvailable()) [m_scrollbarPainterController.get() endScrollGesture]; @@ -861,7 +861,7 @@ void ScrollAnimatorMac::didEndScrollGesture() const void ScrollAnimatorMac::mayBeginScrollGesture() const { - if (!scrollableArea()->isOnActivePage()) + if (!scrollableArea()->scrollbarsCanBeActive()) return; if (!isScrollbarOverlayAPIAvailable()) return; @@ -870,6 +870,13 @@ void ScrollAnimatorMac::mayBeginScrollGesture() const [m_scrollbarPainterController.get() contentAreaScrolled]; } +void ScrollAnimatorMac::finishCurrentScrollAnimations() +{ + if (isScrollbarOverlayAPIAvailable()) { + [m_scrollbarPainterController.get() hideOverlayScrollers]; + } +} + void ScrollAnimatorMac::didAddVerticalScrollbar(Scrollbar* scrollbar) { if (!isScrollbarOverlayAPIAvailable()) @@ -964,7 +971,7 @@ void ScrollAnimatorMac::notifyContentAreaScrolled() // This function is called when a page is going into the page cache, but the page // isn't really scrolling in that case. We should only pass the message on to the // ScrollbarPainterController when we're really scrolling on an active page. - if (scrollableArea()->isOnActivePage()) + if (scrollableArea()->scrollbarsCanBeActive()) sendContentAreaScrolledSoon(); } @@ -1170,7 +1177,7 @@ void ScrollAnimatorMac::updateScrollerStyle() if (!isScrollbarOverlayAPIAvailable()) return; - if (!scrollableArea()->isOnActivePage()) { + if (!scrollableArea()->scrollbarsCanBeActive()) { m_needsScrollerStyleUpdate = true; return; } diff --git a/Source/WebCore/platform/mediastream/RTCPeerConnectionHandlerClient.h b/Source/WebCore/platform/mediastream/RTCPeerConnectionHandlerClient.h index 708f64ed2..33b904260 100644 --- a/Source/WebCore/platform/mediastream/RTCPeerConnectionHandlerClient.h +++ b/Source/WebCore/platform/mediastream/RTCPeerConnectionHandlerClient.h @@ -63,6 +63,7 @@ public: virtual ~RTCPeerConnectionHandlerClient() { } + virtual void negotiationNeeded() = 0; virtual void didGenerateIceCandidate(PassRefPtr<RTCIceCandidateDescriptor>) = 0; virtual void didChangeReadyState(ReadyState) = 0; virtual void didChangeIceState(IceState) = 0; diff --git a/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.cpp b/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.cpp index 4ac4afc44..08a0373e0 100644 --- a/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.cpp +++ b/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.cpp @@ -164,6 +164,11 @@ void RTCPeerConnectionHandlerChromium::stop() m_webHandler->stop(); } +void RTCPeerConnectionHandlerChromium::negotiationNeeded() +{ + m_client->negotiationNeeded(); +} + void RTCPeerConnectionHandlerChromium::didGenerateICECandidate(const WebKit::WebRTCICECandidate& iceCandidate) { m_client->didGenerateIceCandidate(iceCandidate); diff --git a/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.h b/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.h index 848fe3dc9..5f6947174 100644 --- a/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.h +++ b/Source/WebCore/platform/mediastream/chromium/RTCPeerConnectionHandlerChromium.h @@ -67,6 +67,7 @@ public: virtual void stop() OVERRIDE; // WebKit::WebRTCPeerConnectionHandlerClient implementation. + virtual void negotiationNeeded() OVERRIDE; virtual void didGenerateICECandidate(const WebKit::WebRTCICECandidate&) OVERRIDE; virtual void didChangeReadyState(WebKit::WebRTCPeerConnectionHandlerClient::ReadyState) OVERRIDE; virtual void didChangeICEState(WebKit::WebRTCPeerConnectionHandlerClient::ICEState) OVERRIDE; diff --git a/Source/WebCore/platform/network/blackberry/NetworkManager.cpp b/Source/WebCore/platform/network/blackberry/NetworkManager.cpp index 152ea4b29..531af3155 100644 --- a/Source/WebCore/platform/network/blackberry/NetworkManager.cpp +++ b/Source/WebCore/platform/network/blackberry/NetworkManager.cpp @@ -25,6 +25,7 @@ #include "FrameLoaderClientBlackBerry.h" #include "NetworkJob.h" #include "Page.h" +#include "ReadOnlyLatin1String.h" #include "ResourceHandleInternal.h" #include "ResourceRequest.h" #include "SecurityOrigin.h" @@ -77,8 +78,15 @@ bool NetworkManager::startJob(int playerId, const String& pageGroupName, PassRef BlackBerry::Platform::NetworkRequest platformRequest; request.initializePlatformRequest(platformRequest, frame.loader() && frame.loader()->client() && static_cast<FrameLoaderClientBlackBerry*>(frame.loader()->client())->cookiesEnabled(), isInitial, redirectCount); - platformRequest.setReferrer(frame.document()->url().string().utf8().data()); - platformRequest.setSecurityOrigin(frame.document()->securityOrigin()->toRawString().utf8().data()); + + const String& documentUrl = frame.document()->url().string(); + if (!documentUrl.isEmpty()) { + ReadOnlyLatin1String referrer(documentUrl); + platformRequest.setReferrer(referrer.data(), referrer.length()); + } + + ReadOnlyLatin1String securityOrigin(frame.document()->securityOrigin()->toRawString()); + platformRequest.setSecurityOrigin(securityOrigin.data(), securityOrigin.length()); // Attach any applicable auth credentials to the NetworkRequest. AuthenticationChallenge& challenge = guardJob->getInternal()->m_currentWebChallenge; diff --git a/Source/WebCore/platform/network/soup/ResourceResponseSoup.cpp b/Source/WebCore/platform/network/soup/ResourceResponseSoup.cpp index 452108b6a..b7c048fa1 100644 --- a/Source/WebCore/platform/network/soup/ResourceResponseSoup.cpp +++ b/Source/WebCore/platform/network/soup/ResourceResponseSoup.cpp @@ -69,7 +69,7 @@ void ResourceResponse::updateFromSoupMessage(SoupMessage* soupMessage) soup_message_headers_iter_init(&headersIter, soupMessage->response_headers); while (soup_message_headers_iter_next(&headersIter, &headerName, &headerValue)) - m_httpHeaderFields.set(String::fromUTF8(headerName), + m_httpHeaderFields.set(String::fromUTF8WithLatin1Fallback(headerName, strlen(headerName)), String::fromUTF8WithLatin1Fallback(headerValue, strlen(headerValue))); m_soupFlags = soup_message_get_flags(soupMessage); diff --git a/Source/WebCore/platform/text/LocaleICU.cpp b/Source/WebCore/platform/text/LocaleICU.cpp index 0abe12ce3..290b528ca 100644 --- a/Source/WebCore/platform/text/LocaleICU.cpp +++ b/Source/WebCore/platform/text/LocaleICU.cpp @@ -112,7 +112,7 @@ String LocaleICU::decimalTextAttribute(UNumberFormatTextAttribute tag) return String::adopt(buffer); } -void LocaleICU::initializeNumberLocalizerData() +void LocaleICU::initializeLocalizerData() { if (m_didCreateDecimalFormat) return; @@ -136,7 +136,7 @@ void LocaleICU::initializeNumberLocalizerData() symbols.append(decimalSymbol(UNUM_DECIMAL_SEPARATOR_SYMBOL)); symbols.append(decimalSymbol(UNUM_GROUPING_SEPARATOR_SYMBOL)); ASSERT(symbols.size() == DecimalSymbolsSize); - setNumberLocalizerData(symbols, decimalTextAttribute(UNUM_POSITIVE_PREFIX), decimalTextAttribute(UNUM_POSITIVE_SUFFIX), decimalTextAttribute(UNUM_NEGATIVE_PREFIX), decimalTextAttribute(UNUM_NEGATIVE_SUFFIX)); + setLocalizerData(symbols, decimalTextAttribute(UNUM_POSITIVE_PREFIX), decimalTextAttribute(UNUM_POSITIVE_SUFFIX), decimalTextAttribute(UNUM_NEGATIVE_PREFIX), decimalTextAttribute(UNUM_NEGATIVE_SUFFIX)); } bool LocaleICU::initializeShortDateFormat() diff --git a/Source/WebCore/platform/text/LocaleICU.h b/Source/WebCore/platform/text/LocaleICU.h index 70a99c357..0f4022ad7 100644 --- a/Source/WebCore/platform/text/LocaleICU.h +++ b/Source/WebCore/platform/text/LocaleICU.h @@ -32,7 +32,7 @@ #define LocaleICU_h #include "DateComponents.h" -#include "NumberLocalizer.h" +#include "Localizer.h" #include <unicode/udat.h> #include <unicode/unum.h> #include <wtf/Forward.h> @@ -44,7 +44,7 @@ namespace WebCore { // We should use this class only for LocalizedNumberICU.cpp, LocalizedDateICU.cpp, // and LocalizedNumberICUTest.cpp. -class LocaleICU : public NumberLocalizer { +class LocaleICU : public Localizer { public: static PassOwnPtr<LocaleICU> create(const char* localeString); static LocaleICU* currentLocale(); @@ -72,7 +72,7 @@ private: explicit LocaleICU(const char*); String decimalSymbol(UNumberFormatSymbol); String decimalTextAttribute(UNumberFormatTextAttribute); - virtual void initializeNumberLocalizerData() OVERRIDE; + virtual void initializeLocalizerData() OVERRIDE; bool detectSignAndGetDigitRange(const String& input, bool& isNegative, unsigned& startIndex, unsigned& endIndex); unsigned matchedDecimalSymbolIndex(const String& input, unsigned& position); diff --git a/Source/WebCore/platform/text/LocaleWin.cpp b/Source/WebCore/platform/text/LocaleWin.cpp index 67eeddb75..03331c09e 100644 --- a/Source/WebCore/platform/text/LocaleWin.cpp +++ b/Source/WebCore/platform/text/LocaleWin.cpp @@ -723,7 +723,7 @@ const Vector<String>& LocaleWin::timeAMPMLabels() } #endif -void LocaleWin::initializeNumberLocalizerData() +void LocaleWin::initializeLocalizerData() { if (m_didInitializeNumberData) return; @@ -791,7 +791,7 @@ void LocaleWin::initializeNumberLocalizerData() break; } m_didInitializeNumberData = true; - setNumberLocalizerData(symbols, emptyString(), emptyString(), negativePrefix, negativeSuffix); + setLocalizerData(symbols, emptyString(), emptyString(), negativePrefix, negativeSuffix); } } diff --git a/Source/WebCore/platform/text/LocaleWin.h b/Source/WebCore/platform/text/LocaleWin.h index 33666b301..da0a75dad 100644 --- a/Source/WebCore/platform/text/LocaleWin.h +++ b/Source/WebCore/platform/text/LocaleWin.h @@ -31,7 +31,7 @@ #ifndef LocaleWin_h #define LocaleWin_h -#include "NumberLocalizer.h" +#include "Localizer.h" #include <windows.h> #include <wtf/Forward.h> #include <wtf/Vector.h> @@ -42,7 +42,7 @@ namespace WebCore { class DateComponents; struct DateFormatToken; -class LocaleWin : public NumberLocalizer { +class LocaleWin : public Localizer { public: static PassOwnPtr<LocaleWin> create(LCID); static LocaleWin* currentLocale(); @@ -85,8 +85,8 @@ private: #if ENABLE(CALENDAR_PICKER) void ensureWeekDayShortLabels(); #endif - // NumberLocalizer function: - virtual void initializeNumberLocalizerData() OVERRIDE; + // Localizer function: + virtual void initializeLocalizerData() OVERRIDE; LCID m_lcid; int m_baseYear; diff --git a/Source/WebCore/platform/text/NumberLocalizer.cpp b/Source/WebCore/platform/text/Localizer.cpp index 661d9b414..e4a45b727 100644 --- a/Source/WebCore/platform/text/NumberLocalizer.cpp +++ b/Source/WebCore/platform/text/Localizer.cpp @@ -29,17 +29,17 @@ */ #include "config.h" -#include "NumberLocalizer.h" +#include "Localizer.h" #include <wtf/text/StringBuilder.h> namespace WebCore { -NumberLocalizer::~NumberLocalizer() +Localizer::~Localizer() { } -void NumberLocalizer::setNumberLocalizerData(const Vector<String, DecimalSymbolsSize>& symbols, const String& positivePrefix, const String& positiveSuffix, const String& negativePrefix, const String& negativeSuffix) +void Localizer::setLocalizerData(const Vector<String, DecimalSymbolsSize>& symbols, const String& positivePrefix, const String& positiveSuffix, const String& negativePrefix, const String& negativeSuffix) { for (size_t i = 0; i < symbols.size(); ++i) { ASSERT(!symbols[i].isEmpty()); @@ -50,13 +50,13 @@ void NumberLocalizer::setNumberLocalizerData(const Vector<String, DecimalSymbols m_negativePrefix = negativePrefix; m_negativeSuffix = negativeSuffix; ASSERT(!m_positivePrefix.isEmpty() || !m_positiveSuffix.isEmpty() || !m_negativePrefix.isEmpty() || !m_negativeSuffix.isEmpty()); - m_hasNumberLocalizerData = true; + m_hasLocalizerData = true; } -String NumberLocalizer::convertToLocalizedNumber(const String& input) +String Localizer::convertToLocalizedNumber(const String& input) { - initializeNumberLocalizerData(); - if (!m_hasNumberLocalizerData || input.isEmpty()) + initializeLocalizerData(); + if (!m_hasLocalizerData || input.isEmpty()) return input; unsigned i = 0; @@ -111,7 +111,7 @@ static bool matches(const String& text, unsigned position, const String& part) return true; } -bool NumberLocalizer::detectSignAndGetDigitRange(const String& input, bool& isNegative, unsigned& startIndex, unsigned& endIndex) +bool Localizer::detectSignAndGetDigitRange(const String& input, bool& isNegative, unsigned& startIndex, unsigned& endIndex) { startIndex = 0; endIndex = input.length(); @@ -139,7 +139,7 @@ bool NumberLocalizer::detectSignAndGetDigitRange(const String& input, bool& isNe return true; } -unsigned NumberLocalizer::matchedDecimalSymbolIndex(const String& input, unsigned& position) +unsigned Localizer::matchedDecimalSymbolIndex(const String& input, unsigned& position) { for (unsigned symbolIndex = 0; symbolIndex < DecimalSymbolsSize; ++symbolIndex) { if (m_decimalSymbols[symbolIndex].length() && matches(input, position, m_decimalSymbols[symbolIndex])) { @@ -150,11 +150,11 @@ unsigned NumberLocalizer::matchedDecimalSymbolIndex(const String& input, unsigne return DecimalSymbolsSize; } -String NumberLocalizer::convertFromLocalizedNumber(const String& localized) +String Localizer::convertFromLocalizedNumber(const String& localized) { - initializeNumberLocalizerData(); + initializeLocalizerData(); String input = localized.stripWhiteSpace(); - if (!m_hasNumberLocalizerData || input.isEmpty()) + if (!m_hasLocalizerData || input.isEmpty()) return input; bool isNegative; @@ -185,9 +185,9 @@ String NumberLocalizer::convertFromLocalizedNumber(const String& localized) } #if ENABLE(INPUT_TYPE_TIME_MULTIPLE_FIELDS) -String NumberLocalizer::localizedDecimalSeparator() +String Localizer::localizedDecimalSeparator() { - initializeNumberLocalizerData(); + initializeLocalizerData(); return m_decimalSymbols[DecimalSeparatorIndex]; } #endif diff --git a/Source/WebCore/platform/text/NumberLocalizer.h b/Source/WebCore/platform/text/Localizer.h index 21831b2ae..17f4fd524 100644 --- a/Source/WebCore/platform/text/NumberLocalizer.h +++ b/Source/WebCore/platform/text/Localizer.h @@ -23,21 +23,22 @@ * DAMAGE. */ -#ifndef NumberLocalizer_h -#define NumberLocalizer_h +#ifndef Localizer_h +#define Localizer_h #include <wtf/text/WTFString.h> namespace WebCore { -class NumberLocalizer { +class Localizer { public: + static PassOwnPtr<Localizer> create(const AtomicString&); String convertToLocalizedNumber(const String&); String convertFromLocalizedNumber(const String&); #if ENABLE(INPUT_TYPE_TIME_MULTIPLE_FIELDS) String localizedDecimalSeparator(); #endif - virtual ~NumberLocalizer(); + virtual ~Localizer(); protected: enum { @@ -47,9 +48,9 @@ protected: DecimalSymbolsSize }; - NumberLocalizer() : m_hasNumberLocalizerData(false) { } - virtual void initializeNumberLocalizerData() = 0; - void setNumberLocalizerData(const Vector<String, DecimalSymbolsSize>&, const String& positivePrefix, const String& positiveSuffix, const String& negativePrefix, const String& negativeSuffix); + Localizer() : m_hasLocalizerData(false) { } + virtual void initializeLocalizerData() = 0; + void setLocalizerData(const Vector<String, DecimalSymbolsSize>&, const String& positivePrefix, const String& positiveSuffix, const String& negativePrefix, const String& negativeSuffix); private: bool detectSignAndGetDigitRange(const String& input, bool& isNegative, unsigned& startIndex, unsigned& endIndex); @@ -60,7 +61,7 @@ private: String m_positiveSuffix; String m_negativePrefix; String m_negativeSuffix; - bool m_hasNumberLocalizerData; + bool m_hasLocalizerData; }; } diff --git a/Source/WebCore/platform/text/mac/LocaleMac.h b/Source/WebCore/platform/text/mac/LocaleMac.h index 1d81c637a..69c02035c 100644 --- a/Source/WebCore/platform/text/mac/LocaleMac.h +++ b/Source/WebCore/platform/text/mac/LocaleMac.h @@ -31,7 +31,7 @@ #ifndef LocaleMac_h #define LocaleMac_h -#include "NumberLocalizer.h" +#include "Localizer.h" #include <wtf/Forward.h> #include <wtf/RetainPtr.h> #include <wtf/Vector.h> @@ -44,7 +44,7 @@ namespace WebCore { class DateComponents; -class LocaleMac : public NumberLocalizer { +class LocaleMac : public Localizer { public: static PassOwnPtr<LocaleMac> create(const String&); static LocaleMac* currentLocale(); @@ -69,7 +69,7 @@ private: explicit LocaleMac(NSLocale*); explicit LocaleMac(const String&); NSDateFormatter *createShortDateFormatter(); - virtual void initializeNumberLocalizerData() OVERRIDE; + virtual void initializeLocalizerData() OVERRIDE; RetainPtr<NSLocale> m_locale; #if ENABLE(CALENDAR_PICKER) diff --git a/Source/WebCore/platform/text/mac/LocaleMac.mm b/Source/WebCore/platform/text/mac/LocaleMac.mm index 2e7f94c7f..eb9091958 100644 --- a/Source/WebCore/platform/text/mac/LocaleMac.mm +++ b/Source/WebCore/platform/text/mac/LocaleMac.mm @@ -45,6 +45,11 @@ using namespace std; namespace WebCore { +PassOwnPtr<Localizer> Localizer::create(const AtomicString& locale) +{ + return LocaleMac::create(locale.string()); +} + static NSDateFormatter* createDateTimeFormatter(NSLocale* locale, NSDateFormatterStyle dateStyle, NSDateFormatterStyle timeStyle) { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; @@ -270,7 +275,7 @@ const Vector<String>& LocaleMac::timeAMPMLabels() } #endif -void LocaleMac::initializeNumberLocalizerData() +void LocaleMac::initializeLocalizerData() { if (m_didInitializeNumberData) return; @@ -298,7 +303,7 @@ void LocaleMac::initializeNumberLocalizerData() String positiveSuffix([formatter.get() positiveSuffix]); String negativePrefix([formatter.get() negativePrefix]); String negativeSuffix([formatter.get() negativeSuffix]); - setNumberLocalizerData(symbols, positivePrefix, positiveSuffix, negativePrefix, negativeSuffix); + setLocalizerData(symbols, positivePrefix, positiveSuffix, negativePrefix, negativeSuffix); } } diff --git a/Source/WebCore/platform/win/PopupMenuWin.cpp b/Source/WebCore/platform/win/PopupMenuWin.cpp index a86847ddf..b8d7f19fd 100644 --- a/Source/WebCore/platform/win/PopupMenuWin.cpp +++ b/Source/WebCore/platform/win/PopupMenuWin.cpp @@ -741,7 +741,7 @@ IntSize PopupMenuWin::contentsSize() const return m_windowRect.size(); } -bool PopupMenuWin::isOnActivePage() const +bool PopupMenuWin::scrollbarsCanBeActive() const { return m_showPopup; } diff --git a/Source/WebCore/platform/win/PopupMenuWin.h b/Source/WebCore/platform/win/PopupMenuWin.h index 9b6ffa7d3..85cab7639 100644 --- a/Source/WebCore/platform/win/PopupMenuWin.h +++ b/Source/WebCore/platform/win/PopupMenuWin.h @@ -104,7 +104,7 @@ private: virtual int visibleHeight() const OVERRIDE; virtual int visibleWidth() const OVERRIDE; virtual IntSize contentsSize() const OVERRIDE; - virtual bool isOnActivePage() const OVERRIDE; + virtual bool scrollbarsCanBeActive() const OVERRIDE; virtual IntRect scrollableAreaBoundingBox() const OVERRIDE; // NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea. diff --git a/Source/WebCore/rendering/AutoTableLayout.cpp b/Source/WebCore/rendering/AutoTableLayout.cpp index 3a5cb0dda..66ac28f1a 100644 --- a/Source/WebCore/rendering/AutoTableLayout.cpp +++ b/Source/WebCore/rendering/AutoTableLayout.cpp @@ -93,7 +93,7 @@ void AutoTableLayout::recalcColumn(unsigned effCol) case Fixed: // ignore width=0 if (cellLogicalWidth.isPositive() && !columnLayout.logicalWidth.isPercent()) { - LayoutUnit logicalWidth = cell->computeBorderBoxLogicalWidth(cellLogicalWidth.value()); + LayoutUnit logicalWidth = cell->adjustBorderBoxLogicalWidthForBoxSizing(cellLogicalWidth.value()); if (columnLayout.logicalWidth.isFixed()) { // Nav/IE weirdness if ((logicalWidth > columnLayout.logicalWidth.value()) diff --git a/Source/WebCore/rendering/ExclusionInterval.cpp b/Source/WebCore/rendering/ExclusionInterval.cpp new file mode 100644 index 000000000..4e0ef7a98 --- /dev/null +++ b/Source/WebCore/rendering/ExclusionInterval.cpp @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "ExclusionInterval.h" + +#include <wtf/MathExtras.h> + +namespace WebCore { + +struct IntervalX1Comparator { + bool operator() (const ExclusionInterval& i1, const ExclusionInterval& i2) const + { + return i1.x1 < i2.x1; + } +}; + +bool ExclusionInterval::intersect(const ExclusionInterval& i, ExclusionInterval& rv) const +{ + if (x2 < i.x1 || x1 > i.x2) + return false; + rv.x1 = std::max(x1, i.x1); + rv.x2 = std::min(x2, i.x2); + return true; +} + +void sortExclusionIntervals(Vector<ExclusionInterval>& v) +{ + std::sort(v.begin(), v.end(), IntervalX1Comparator()); +} + +void mergeExclusionIntervals(const Vector<ExclusionInterval>& v1, const Vector<ExclusionInterval>& v2, Vector<ExclusionInterval>& rv) +{ + if (!v1.size()) + rv.appendRange(v2.begin(), v2.end()); + else if (!v2.size()) + rv.appendRange(v1.begin(), v1.end()); + else { + Vector<ExclusionInterval> v(v1.size() + v2.size()); + ExclusionInterval* interval = 0; + + std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v.begin(), IntervalX1Comparator()); + + for (size_t i = 0; i < v.size(); i++) { + if (!interval) + interval = &v[i]; + else if (v[i].x1 >= interval->x1 && v[i].x1 <= interval->x2) // FIXME: 1st <= test not needed? + interval->x2 = std::max(interval->x2, v[i].x2); + else { + rv.append(*interval); + interval = &v[i]; + } + } + + if (interval) + rv.append(*interval); + } +} + +void intersectExclusionIntervals(const Vector<ExclusionInterval>& v1, const Vector<ExclusionInterval>& v2, Vector<ExclusionInterval>& rv) +{ + size_t v1Size = v1.size(); + size_t v2Size = v2.size(); + + if (!v1Size || !v2Size) + return; + + ExclusionInterval interval; + bool overlap = false; + size_t i1 = 0; + size_t i2 = 0; + + while (i1 < v1Size && i2 < v2Size) { + ExclusionInterval v12; + if (v1[i1].intersect(v2[i2], v12)) { + if (!overlap || !v12.intersect(interval, interval)) { + if (overlap) + rv.append(interval); + interval = v12; + overlap = true; + } + if (v1[i1].x2 < v2[i2].x2) + i1++; + else + i2++; + } else { + if (overlap) + rv.append(interval); + overlap = false; + if (v1[i1].x1 < v2[i2].x1) + i1++; + else + i2++; + } + } + + if (overlap) + rv.append(interval); +} + +void subtractExclusionIntervals(const Vector<ExclusionInterval>& v1, const Vector<ExclusionInterval>& v2, Vector<ExclusionInterval>& rv) +{ + size_t v1Size = v1.size(); + size_t v2Size = v2.size(); + + if (!v1Size) + return; + + if (!v2Size) + rv.appendRange(v1.begin(), v1.end()); + else { + size_t i1 = 0, i2 = 0; + rv.appendRange(v1.begin(), v1.end()); + + while (i1 < rv.size() && i2 < v2Size) { + ExclusionInterval& interval1 = rv[i1]; + const ExclusionInterval& interval2 = v2[i2]; + + if (interval2.x1 <= interval1.x1 && interval2.x2 >= interval1.x2) + rv.remove(i1); + else if (interval2.x2 < interval1.x1) + i2 += 1; + else if (interval2.x1 > interval1.x2) + i1 += 1; + else if (interval2.x1 > interval1.x1 && interval2.x2 < interval1.x2) { + rv.insert(i1, ExclusionInterval(interval1.x1, interval2.x1)); + interval1.x1 = interval2.x2; + i2 += 1; + } else if (interval2.x1 <= interval1.x1) { + interval1.x1 = interval2.x2; + i2 += 1; + } else { // (interval2.x2 >= interval1.x2) + interval1.x2 = interval2.x1; + i1 += 1; + } + } + } +} + +} // namespace WebCore diff --git a/Source/WebCore/rendering/ExclusionInterval.h b/Source/WebCore/rendering/ExclusionInterval.h new file mode 100644 index 000000000..5d31feb18 --- /dev/null +++ b/Source/WebCore/rendering/ExclusionInterval.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ExclusionInterval_h +#define ExclusionInterval_h + +#include <wtf/Vector.h> + +namespace WebCore { + +struct ExclusionInterval { +public: + float x1; + float x2; + + ExclusionInterval(float x1 = 0, float x2 = 0) + : x1(x1) + , x2(x2) + { + } + + bool intersect(const ExclusionInterval&, ExclusionInterval&) const; +}; + +void sortExclusionIntervals(Vector<ExclusionInterval>&); +void mergeExclusionIntervals(const Vector<ExclusionInterval>&, const Vector<ExclusionInterval>&, Vector<ExclusionInterval>&); +void intersectExclusionIntervals(const Vector<ExclusionInterval>&, const Vector<ExclusionInterval>&, Vector<ExclusionInterval>&); +void subtractExclusionIntervals(const Vector<ExclusionInterval>&, const Vector<ExclusionInterval>&, Vector<ExclusionInterval>&); + +} // namespace WebCore + +#endif // ExclusionInterval_h diff --git a/Source/WebCore/rendering/ExclusionRectangle.cpp b/Source/WebCore/rendering/ExclusionRectangle.cpp new file mode 100644 index 000000000..78f83b055 --- /dev/null +++ b/Source/WebCore/rendering/ExclusionRectangle.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "ExclusionRectangle.h" + +#include <wtf/MathExtras.h> + +namespace WebCore { + +static inline float ellipseXIntercept(float y, float rx, float ry) +{ + ASSERT(ry > 0); + return rx * sqrt(1 - (y*y) / (ry*ry)); +} + +void ExclusionRectangle::getOutsideIntervals(float y1, float y2, Vector<ExclusionInterval>& rv) const +{ + if (y1 > y2) + std::swap(y1, y2); + + if (y2 < m_y || y1 >= m_y + m_height) + return; + + float x1 = m_x; + float x2 = m_x + m_width; + + if (m_ry > 0) { + if (y2 < m_y + m_ry) { + float yi = y2 - m_y - m_ry; + float xi = ellipseXIntercept(yi, m_rx, m_ry); + x1 = m_x + m_rx - xi; + x2 = m_x + m_width - m_rx + xi; + } else if (y1 > m_y + m_height - m_ry) { + float yi = y1 - (m_y + m_height - m_ry); + float xi = ellipseXIntercept(yi, m_rx, m_ry); + x1 = m_x + m_rx - xi; + x2 = m_x + m_width - m_rx + xi; + } + } + + rv.append(ExclusionInterval(x1, x2)); +} + +void ExclusionRectangle::getInsideIntervals(float y1, float y2, Vector<ExclusionInterval>& rv) const +{ + if (y1 > y2) + std::swap(y1, y2); + + if (y1 < m_y || y2 >= m_y + m_height) + return; + + float x1 = m_x; + float x2 = m_x + m_width; + + if (m_ry > 0) { + bool y1InterceptsCorner = y1 < m_y + m_ry; + bool y2InterceptsCorner = y2 > m_y + m_height - m_ry; + float xi = 0; + + if (y1InterceptsCorner && y2InterceptsCorner) { + if (y1 < m_height + 2*m_y - y2) { + float yi = y1 - m_y - m_ry; + xi = ellipseXIntercept(yi, m_rx, m_ry); + } else { + float yi = y2 - (m_y + m_height - m_ry); + xi = ellipseXIntercept(yi, m_rx, m_ry); + } + } else if (y1InterceptsCorner) { + float yi = y1 - m_y - m_ry; + xi = ellipseXIntercept(yi, m_rx, m_ry); + } else if (y2InterceptsCorner) { + float yi = y2 - (m_y + m_height - m_ry); + xi = ellipseXIntercept(yi, m_rx, m_ry); + } + + if (y1InterceptsCorner || y2InterceptsCorner) { + x1 = m_x + m_rx - xi; + x2 = m_x + m_width - m_rx + xi; + } + } + + rv.append(ExclusionInterval(x1, x2)); +} + +} // namespace WebCore diff --git a/Source/WebCore/rendering/ExclusionRectangle.h b/Source/WebCore/rendering/ExclusionRectangle.h new file mode 100644 index 000000000..6af021772 --- /dev/null +++ b/Source/WebCore/rendering/ExclusionRectangle.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ExclusionRectangle_h +#define ExclusionRectangle_h + +#include "ExclusionShape.h" +#include <wtf/Assertions.h> +#include <wtf/Vector.h> + +namespace WebCore { + +class ExclusionRectangle : public ExclusionShape { +public: + ExclusionRectangle(float x, float y, float width, float height, float rx = 0, float ry = 0) + : ExclusionShape() + , m_x(x) + , m_y(y) + , m_width(width) + , m_height(height) + , m_rx(rx) + , m_ry(ry) + { + } + + virtual FloatRect shapeLogicalBoundingBox() const OVERRIDE { return FloatRect(m_x, m_y, m_width, m_height); } + virtual void getOutsideIntervals(float y1, float y2, Vector<ExclusionInterval>&) const OVERRIDE; + virtual void getInsideIntervals(float y1, float y2, Vector<ExclusionInterval>&) const OVERRIDE; + +private: + float m_x; + float m_y; + float m_width; + float m_height; + float m_rx; // corner X radius + float m_ry; // corner Y radius +}; + +} // namespace WebCore + +#endif // ExclusionRectangle_h diff --git a/Source/WebCore/rendering/ExclusionShape.cpp b/Source/WebCore/rendering/ExclusionShape.cpp new file mode 100644 index 000000000..48c88b653 --- /dev/null +++ b/Source/WebCore/rendering/ExclusionShape.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "ExclusionShape.h" + +#include "BasicShapeFunctions.h" +#include "ExclusionRectangle.h" +#include "LengthFunctions.h" +#include "NotImplemented.h" +#include "WindRule.h" +#include <wtf/MathExtras.h> +#include <wtf/OwnPtr.h> +#include <wtf/PassOwnPtr.h> + +namespace WebCore { + +static PassOwnPtr<ExclusionShape> createExclusionRectangle(float x, float y, float width, float height, float rx, float ry) +{ + ASSERT(width >= 0 && height >= 0 && rx >= 0 && ry >= 0); + return adoptPtr(new ExclusionRectangle(x, y, width, height, rx, ry)); +} + +static PassOwnPtr<ExclusionShape> createExclusionCircle(float cx, float cy, float radius) +{ + ASSERT(radius >= 0); + return adoptPtr(new ExclusionRectangle(cx - radius, cy - radius, cx + radius, cy + radius, radius, radius)); +} + +static PassOwnPtr<ExclusionShape> createExclusionEllipse(float cx, float cy, float rx, float ry) +{ + ASSERT(rx >= 0 && ry >= 0); + return adoptPtr(new ExclusionRectangle(cx - rx, cy - ry, cx + rx, cy + ry, rx, ry)); +} + +PassOwnPtr<ExclusionShape> ExclusionShape::createExclusionShape(const BasicShape* wrapShape, float borderBoxLogicalWidth, float borderBoxLogicalHeight) +{ + if (!wrapShape) + return nullptr; + + switch (wrapShape->type()) { + case BasicShape::BASIC_SHAPE_RECTANGLE: { + const BasicShapeRectangle* rectangle = static_cast<const BasicShapeRectangle*>(wrapShape); + Length rx = rectangle->cornerRadiusX(); + Length ry = rectangle->cornerRadiusY(); + return createExclusionRectangle( + floatValueForLength(rectangle->x(), borderBoxLogicalWidth), + floatValueForLength(rectangle->y(), borderBoxLogicalHeight), + floatValueForLength(rectangle->width(), borderBoxLogicalWidth), + floatValueForLength(rectangle->height(), borderBoxLogicalHeight), + rx.isUndefined() ? 0 : floatValueForLength(rx, borderBoxLogicalWidth), + ry.isUndefined() ? 0 : floatValueForLength(ry, borderBoxLogicalHeight) ); + } + + case BasicShape::BASIC_SHAPE_CIRCLE: { + const BasicShapeCircle* circle = static_cast<const BasicShapeCircle*>(wrapShape); + return createExclusionCircle( + floatValueForLength(circle->centerX(), borderBoxLogicalWidth), + floatValueForLength(circle->centerY(), borderBoxLogicalHeight), + floatValueForLength(circle->radius(), std::max(borderBoxLogicalHeight, borderBoxLogicalWidth)) ); + } + + case BasicShape::BASIC_SHAPE_ELLIPSE: { + const BasicShapeEllipse* ellipse = static_cast<const BasicShapeEllipse*>(wrapShape); + return createExclusionEllipse( + floatValueForLength(ellipse->centerX(), borderBoxLogicalWidth), + floatValueForLength(ellipse->centerY(), borderBoxLogicalHeight), + floatValueForLength(ellipse->radiusX(), borderBoxLogicalWidth), + floatValueForLength(ellipse->radiusY(), borderBoxLogicalHeight) ); + } + + case BasicShape::BASIC_SHAPE_POLYGON: + notImplemented(); + } + + ASSERT_NOT_REACHED(); + return nullptr; +} + +} // namespace WebCore diff --git a/Source/WebCore/rendering/ExclusionShape.h b/Source/WebCore/rendering/ExclusionShape.h new file mode 100644 index 000000000..c5de4d705 --- /dev/null +++ b/Source/WebCore/rendering/ExclusionShape.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ExclusionShape_h +#define ExclusionShape_h + +#include "BasicShapes.h" +#include "ExclusionInterval.h" +#include "FloatRect.h" +#include <wtf/PassOwnPtr.h> +#include <wtf/Vector.h> + +namespace WebCore { + +class ExclusionShape { +public: + static PassOwnPtr<ExclusionShape> createExclusionShape(const BasicShape*, float borderBoxLogicalWidth, float borderBoxLogicalHeight); + + virtual ~ExclusionShape() { } + + virtual FloatRect shapeLogicalBoundingBox() const = 0; + virtual void getInsideIntervals(float logicalTop, float logicalBottom, Vector<ExclusionInterval>&) const = 0; + virtual void getOutsideIntervals(float logicalTop, float logicalBottom, Vector<ExclusionInterval>&) const = 0; +}; + +} // namespace WebCore + +#endif // ExclusionShape_h diff --git a/Source/WebCore/rendering/FixedTableLayout.cpp b/Source/WebCore/rendering/FixedTableLayout.cpp index 8649a08d3..33ebcea57 100644 --- a/Source/WebCore/rendering/FixedTableLayout.cpp +++ b/Source/WebCore/rendering/FixedTableLayout.cpp @@ -145,7 +145,7 @@ int FixedTableLayout::calcWidthArray(int) unsigned span = cell->colSpan(); int fixedBorderBoxLogicalWidth = 0; if (logicalWidth.isFixed() && logicalWidth.isPositive()) { - fixedBorderBoxLogicalWidth = cell->computeBorderBoxLogicalWidth(logicalWidth.value()); + fixedBorderBoxLogicalWidth = cell->adjustBorderBoxLogicalWidthForBoxSizing(logicalWidth.value()); logicalWidth.setValue(fixedBorderBoxLogicalWidth); } diff --git a/Source/WebCore/rendering/RenderBlock.cpp b/Source/WebCore/rendering/RenderBlock.cpp index 10216bc00..c2a406156 100755 --- a/Source/WebCore/rendering/RenderBlock.cpp +++ b/Source/WebCore/rendering/RenderBlock.cpp @@ -1402,7 +1402,7 @@ void RenderBlock::computeInitialRegionRangeForBlock() LayoutUnit oldHeight = logicalHeight(); LayoutUnit oldLogicalTop = logicalTop(); setLogicalHeight(MAX_LAYOUT_UNIT / 2); - computeLogicalHeight(); + updateLogicalHeight(); enclosingRenderFlowThread()->setRegionRangeForBox(this, offsetFromLogicalTopOfFirstPage()); setLogicalHeight(oldHeight); setLogicalTop(oldLogicalTop); @@ -1415,12 +1415,12 @@ void RenderBlock::computeRegionRangeForBlock() enclosingRenderFlowThread()->setRegionRangeForBox(this, offsetFromLogicalTopOfFirstPage()); } -bool RenderBlock::recomputeLogicalWidth() +bool RenderBlock::updateLogicalWidthAndColumnWidth() { LayoutUnit oldWidth = logicalWidth(); LayoutUnit oldColumnWidth = desiredColumnWidth(); - computeLogicalWidth(); + updateLogicalWidth(); calcColumnWidth(); return oldWidth != logicalWidth() || oldColumnWidth != desiredColumnWidth(); @@ -1433,7 +1433,7 @@ void RenderBlock::checkForPaginationLogicalHeightChange(LayoutUnit& pageLogicalH if (!pageLogicalHeight) { // We need to go ahead and set our explicit page height if one exists, so that we can // avoid doing two layout passes. - computeLogicalHeight(); + updateLogicalHeight(); LayoutUnit columnHeight = contentLogicalHeight(); if (columnHeight > ZERO_LAYOUT_UNIT) { pageLogicalHeight = columnHeight; @@ -1468,7 +1468,7 @@ void RenderBlock::layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeigh LayoutRepainter repainter(*this, checkForRepaintDuringLayout()); - if (recomputeLogicalWidth()) + if (updateLogicalWidthAndColumnWidth()) relayoutChildren = true; m_overflow.clear(); @@ -1546,7 +1546,7 @@ void RenderBlock::layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeigh // Calculate our new height. LayoutUnit oldHeight = logicalHeight(); LayoutUnit oldClientAfterEdge = clientLogicalBottom(); - computeLogicalHeight(); + updateLogicalHeight(); LayoutUnit newHeight = logicalHeight(); if (oldHeight != newHeight) { if (oldHeight > newHeight && maxFloatLogicalBottom > newHeight && !childrenInline()) { @@ -2652,9 +2652,9 @@ void RenderBlock::layoutPositionedObjects(bool relayoutChildren) bool needsBlockDirectionLocationSetBeforeLayout = r->needsLayout() && view()->layoutState()->needsBlockDirectionLocationSetBeforeLayout(); if (needsBlockDirectionLocationSetBeforeLayout) { if (isHorizontalWritingMode() == r->isHorizontalWritingMode()) - r->computeLogicalHeight(); + r->updateLogicalHeight(); else - r->computeLogicalWidth(); + r->updateLogicalWidth(); oldLogicalTop = logicalTopForChild(r); } @@ -3760,7 +3760,7 @@ RenderBlock::FloatingObject* RenderBlock::insertFloatingObject(RenderBox* o) if (!needsBlockDirectionLocationSetBeforeLayout || isWritingModeRoot()) // We are unsplittable if we're a block flow root. o->layoutIfNeeded(); else { - o->computeLogicalWidth(); + o->updateLogicalWidth(); o->computeAndSetBlockDirectionMargins(this); } setLogicalWidthForFloat(newObj, logicalWidthForChild(o) + marginStartForChild(o) + marginEndForChild(o)); @@ -4652,7 +4652,7 @@ LayoutUnit RenderBlock::getClearDelta(RenderBox* child, LayoutUnit logicalTop) LayoutUnit childOldLogicalTop = child->logicalTop(); child->setLogicalTop(newLogicalTop); - child->computeLogicalWidth(); + child->updateLogicalWidth(); region = regionAtBlockOffset(logicalTopForChild(child)); borderBox = child->borderBoxRectInRegion(region, offsetFromLogicalTopOfFirstPage() + logicalTopForChild(child), DoNotCacheRenderBoxRegionInfo); LayoutUnit childLogicalWidthAtNewLogicalTopOffset = isHorizontalWritingMode() ? borderBox.width() : borderBox.height(); @@ -5552,7 +5552,7 @@ void RenderBlock::computePreferredLogicalWidths() RenderStyle* styleToUse = style(); if (!isTableCell() && styleToUse->logicalWidth().isFixed() && styleToUse->logicalWidth().value() >= 0 && style()->marqueeBehavior() != MALTERNATE && !(isDeprecatedFlexItem() && !styleToUse->logicalWidth().intValue())) - m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = computeContentBoxLogicalWidth(styleToUse->logicalWidth().value()); + m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalWidth().value()); else { m_minPreferredLogicalWidth = 0; m_maxPreferredLogicalWidth = 0; @@ -5584,7 +5584,7 @@ void RenderBlock::computePreferredLogicalWidths() if (isTableCell()) { Length w = toRenderTableCell(this)->styleOrColLogicalWidth(); if (w.isFixed() && w.value() > 0) { - m_maxPreferredLogicalWidth = max(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(w.value())); + m_maxPreferredLogicalWidth = max(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(w.value())); scrollbarWidth = 0; } } @@ -5593,13 +5593,13 @@ void RenderBlock::computePreferredLogicalWidths() } if (styleToUse->logicalMinWidth().isFixed() && styleToUse->logicalMinWidth().value() > 0) { - m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(styleToUse->logicalMinWidth().value())); - m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(styleToUse->logicalMinWidth().value())); + m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalMinWidth().value())); + m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalMinWidth().value())); } if (styleToUse->logicalMaxWidth().isFixed()) { - m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(styleToUse->logicalMaxWidth().value())); - m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(styleToUse->logicalMaxWidth().value())); + m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalMaxWidth().value())); + m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalMaxWidth().value())); } LayoutUnit borderAndPadding = borderAndPaddingLogicalWidth(); @@ -6057,7 +6057,7 @@ void RenderBlock::computeBlockPreferredLogicalWidths() RenderBox* childBox = toRenderBox(child); LayoutUnit oldHeight = childBox->logicalHeight(); childBox->setLogicalHeight(childBox->borderAndPaddingLogicalHeight()); - childBox->computeLogicalHeight(); + childBox->updateLogicalHeight(); childMinPreferredLogicalWidth = childMaxPreferredLogicalWidth = childBox->logicalHeight(); childBox->setLogicalHeight(oldHeight); } else { diff --git a/Source/WebCore/rendering/RenderBlock.h b/Source/WebCore/rendering/RenderBlock.h index a33eeaf5b..a54a4b8e1 100644 --- a/Source/WebCore/rendering/RenderBlock.h +++ b/Source/WebCore/rendering/RenderBlock.h @@ -1009,7 +1009,7 @@ protected: virtual bool requiresColumns(int desiredColumnCount) const; - virtual bool recomputeLogicalWidth(); + virtual bool updateLogicalWidthAndColumnWidth(); virtual bool canCollapseAnonymousBlockChild() const { return true; } diff --git a/Source/WebCore/rendering/RenderBlockLineLayout.cpp b/Source/WebCore/rendering/RenderBlockLineLayout.cpp index c0c3404ad..fe6694437 100755 --- a/Source/WebCore/rendering/RenderBlockLineLayout.cpp +++ b/Source/WebCore/rendering/RenderBlockLineLayout.cpp @@ -1297,8 +1297,8 @@ void RenderBlock::layoutRunsAndFloatsInRange(LineLayoutState& layoutState, Inlin #if ENABLE(CSS_EXCLUSIONS) WrapShapeInfo* wrapShapeInfo = this->wrapShapeInfo(); // Move to the top of the shape inside to begin layout - if (wrapShapeInfo && logicalHeight() < wrapShapeInfo->shapeTop()) - setLogicalHeight(wrapShapeInfo->shapeTop()); + if (wrapShapeInfo && logicalHeight() < wrapShapeInfo->shapeLogicalTop()) + setLogicalHeight(wrapShapeInfo->shapeLogicalTop()); #endif while (!end.atEnd()) { diff --git a/Source/WebCore/rendering/RenderBox.cpp b/Source/WebCore/rendering/RenderBox.cpp index 792b9c28b..446a7f8f1 100644 --- a/Source/WebCore/rendering/RenderBox.cpp +++ b/Source/WebCore/rendering/RenderBox.cpp @@ -707,7 +707,7 @@ LayoutUnit RenderBox::overrideLogicalContentHeight() const return hasOverrideHeight() ? gOverrideHeightMap->get(this) : contentHeight(); } -LayoutUnit RenderBox::computeBorderBoxLogicalWidth(LayoutUnit width) const +LayoutUnit RenderBox::adjustBorderBoxLogicalWidthForBoxSizing(LayoutUnit width) const { LayoutUnit bordersPlusPadding = borderAndPaddingLogicalWidth(); if (style()->boxSizing() == CONTENT_BOX) @@ -715,7 +715,7 @@ LayoutUnit RenderBox::computeBorderBoxLogicalWidth(LayoutUnit width) const return max(width, bordersPlusPadding); } -LayoutUnit RenderBox::computeBorderBoxLogicalHeight(LayoutUnit height) const +LayoutUnit RenderBox::adjustBorderBoxLogicalHeightForBoxSizing(LayoutUnit height) const { LayoutUnit bordersPlusPadding = borderAndPaddingLogicalHeight(); if (style()->boxSizing() == CONTENT_BOX) @@ -723,14 +723,14 @@ LayoutUnit RenderBox::computeBorderBoxLogicalHeight(LayoutUnit height) const return max(height, bordersPlusPadding); } -LayoutUnit RenderBox::computeContentBoxLogicalWidth(LayoutUnit width) const +LayoutUnit RenderBox::adjustContentBoxLogicalWidthForBoxSizing(LayoutUnit width) const { if (style()->boxSizing() == BORDER_BOX) width -= borderAndPaddingLogicalWidth(); return max<LayoutUnit>(0, width); } -LayoutUnit RenderBox::computeContentBoxLogicalHeight(LayoutUnit height) const +LayoutUnit RenderBox::adjustContentBoxLogicalHeightForBoxSizing(LayoutUnit height) const { if (style()->boxSizing() == BORDER_BOX) height -= borderAndPaddingLogicalHeight(); @@ -1244,7 +1244,7 @@ LayoutUnit RenderBox::perpendicularContainingBlockLogicalHeight() const } // Use the content box logical height as specified by the style. - return cb->computeContentBoxLogicalHeight(logicalHeightLength.value()); + return cb->adjustContentBoxLogicalHeightForBoxSizing(logicalHeightLength.value()); } void RenderBox::mapLocalToContainer(RenderBoxModelObject* repaintContainer, TransformState& transformState, MapLocalToContainerFlags mode, bool* wasFixed) const @@ -1615,7 +1615,7 @@ void RenderBox::repaintDuringLayoutIfMoved(const LayoutRect& oldRect) } } -void RenderBox::computeLogicalWidth() +void RenderBox::updateLogicalWidth() { LogicalExtentComputedValues computedValues; computeLogicalWidthInRegion(computedValues); @@ -1732,11 +1732,11 @@ LayoutUnit RenderBox::computeLogicalWidthInRegionUsing(SizeType widthType, Layou ASSERT(!logicalWidth.isUndefined()); if (widthType == MinSize && logicalWidth.isAuto()) - return computeBorderBoxLogicalWidth(0); + return adjustBorderBoxLogicalWidthForBoxSizing(0); if (!logicalWidth.isIntrinsicOrAuto()) { // FIXME: If the containing block flow is perpendicular to our direction we need to use the available logical height instead. - return computeBorderBoxLogicalWidth(valueForLength(logicalWidth, availableLogicalWidth, view())); + return adjustBorderBoxLogicalWidthForBoxSizing(valueForLength(logicalWidth, availableLogicalWidth, view())); } if (logicalWidth.type() == MinContent) @@ -1961,7 +1961,7 @@ static bool shouldFlipBeforeAfterMargins(const RenderStyle* containingBlockStyle return shouldFlip; } -void RenderBox::computeLogicalHeight() +void RenderBox::updateLogicalHeight() { LogicalExtentComputedValues computedValues; computeLogicalHeight(computedValues); @@ -2091,7 +2091,7 @@ LayoutUnit RenderBox::computeLogicalHeightUsing(SizeType heightType, const Lengt { LayoutUnit logicalHeight = computeContentLogicalHeightUsing(heightType, height); if (logicalHeight != -1) - logicalHeight = computeBorderBoxLogicalHeight(logicalHeight); + logicalHeight = adjustBorderBoxLogicalHeightForBoxSizing(logicalHeight); return logicalHeight; } @@ -2100,7 +2100,7 @@ LayoutUnit RenderBox::computeLogicalClientHeight(SizeType heightType, const Leng LayoutUnit heightIncludingScrollbar = computeContentLogicalHeightUsing(heightType, height); if (heightIncludingScrollbar == -1) return -1; - return std::max<LayoutUnit>(0, computeContentBoxLogicalHeight(heightIncludingScrollbar) - scrollbarLogicalHeight()); + return std::max<LayoutUnit>(0, adjustContentBoxLogicalHeightForBoxSizing(heightIncludingScrollbar) - scrollbarLogicalHeight()); } LayoutUnit RenderBox::computeContentLogicalHeightUsing(SizeType heightType, const Length& height) const @@ -2168,20 +2168,20 @@ LayoutUnit RenderBox::computePercentageLogicalHeight(const Length& height) const } } else if (cbstyle->logicalHeight().isFixed()) { // Otherwise we only use our percentage height if our containing block had a specified height. - LayoutUnit contentBoxHeightWithScrollbar = cb->computeContentBoxLogicalHeight(cbstyle->logicalHeight().value()); + LayoutUnit contentBoxHeightWithScrollbar = cb->adjustContentBoxLogicalHeightForBoxSizing(cbstyle->logicalHeight().value()); result = max<LayoutUnit>(0, contentBoxHeightWithScrollbar - cb->scrollbarLogicalHeight()); } else if (cbstyle->logicalHeight().isPercent() && !isOutOfFlowPositionedWithSpecifiedHeight) { // We need to recur and compute the percentage height for our containing block. LayoutUnit heightWithScrollbar = cb->computePercentageLogicalHeight(cbstyle->logicalHeight()); if (heightWithScrollbar != -1) { - LayoutUnit contentBoxHeightWithScrollbar = cb->computeContentBoxLogicalHeight(heightWithScrollbar); + LayoutUnit contentBoxHeightWithScrollbar = cb->adjustContentBoxLogicalHeightForBoxSizing(heightWithScrollbar); result = max<LayoutUnit>(0, contentBoxHeightWithScrollbar - cb->scrollbarLogicalHeight()); } } else if (cb->isRenderView() || (cb->isBody() && document()->inQuirksMode()) || isOutOfFlowPositionedWithSpecifiedHeight) { // Don't allow this to affect the block' height() member variable, since this // can get called while the block is still laying out its kids. LayoutUnit oldHeight = cb->logicalHeight(); - cb->computeLogicalHeight(); + cb->updateLogicalHeight(); result = cb->contentLogicalHeight(); cb->setLogicalHeight(oldHeight); } @@ -2214,15 +2214,15 @@ LayoutUnit RenderBox::computeReplacedLogicalWidthRespectingMinMaxWidth(LayoutUni LayoutUnit RenderBox::computeReplacedLogicalWidthUsing(SizeType sizeType, Length logicalWidth) const { if (sizeType == MinSize && logicalWidth.isAuto()) - return computeContentBoxLogicalWidth(0); + return adjustContentBoxLogicalWidthForBoxSizing(0); switch (logicalWidth.type()) { case Fixed: - return computeContentBoxLogicalWidth(logicalWidth.value()); + return adjustContentBoxLogicalWidthForBoxSizing(logicalWidth.value()); case ViewportPercentageWidth: case ViewportPercentageHeight: case ViewportPercentageMin: - return computeContentBoxLogicalWidth(valueForLength(logicalWidth, 0, view())); + return adjustContentBoxLogicalWidthForBoxSizing(valueForLength(logicalWidth, 0, view())); case Percent: case Calculated: { // FIXME: containingBlockLogicalWidthForContent() is wrong if the replaced element's block-flow is perpendicular to the @@ -2233,7 +2233,7 @@ LayoutUnit RenderBox::computeReplacedLogicalWidthUsing(SizeType sizeType, Length // FIXME: Handle cases when containing block width is calculated or viewport percent. // https://bugs.webkit.org/show_bug.cgi?id=91071 if (cw > 0 || (!cw && (containerLogicalWidth.isFixed() || containerLogicalWidth.isPercent()))) - return computeContentBoxLogicalWidth(minimumValueForLength(logicalWidth, cw)); + return adjustContentBoxLogicalWidthForBoxSizing(minimumValueForLength(logicalWidth, cw)); } // fall through default: @@ -2256,11 +2256,11 @@ LayoutUnit RenderBox::computeReplacedLogicalHeightRespectingMinMaxHeight(LayoutU LayoutUnit RenderBox::computeReplacedLogicalHeightUsing(SizeType sizeType, Length logicalHeight) const { if (sizeType == MinSize && logicalHeight.isAuto()) - return computeContentBoxLogicalHeight(0); + return adjustContentBoxLogicalHeightForBoxSizing(0); switch (logicalHeight.type()) { case Fixed: - return computeContentBoxLogicalHeight(logicalHeight.value()); + return adjustContentBoxLogicalHeightForBoxSizing(logicalHeight.value()); case Percent: case Calculated: { @@ -2276,10 +2276,10 @@ LayoutUnit RenderBox::computeReplacedLogicalHeightUsing(SizeType sizeType, Lengt ASSERT(cb->isRenderBlock()); RenderBlock* block = toRenderBlock(cb); LayoutUnit oldHeight = block->height(); - block->computeLogicalHeight(); - LayoutUnit newHeight = block->computeContentBoxLogicalHeight(block->contentHeight()); + block->updateLogicalHeight(); + LayoutUnit newHeight = block->adjustContentBoxLogicalHeightForBoxSizing(block->contentHeight()); block->setHeight(oldHeight); - return computeContentBoxLogicalHeight(valueForLength(logicalHeight, newHeight)); + return adjustContentBoxLogicalHeightForBoxSizing(valueForLength(logicalHeight, newHeight)); } // FIXME: availableLogicalHeight() is wrong if the replaced element's block-flow is perpendicular to the @@ -2306,12 +2306,12 @@ LayoutUnit RenderBox::computeReplacedLogicalHeightUsing(SizeType sizeType, Lengt cb = cb->containingBlock(); } } - return computeContentBoxLogicalHeight(valueForLength(logicalHeight, availableHeight)); + return adjustContentBoxLogicalHeightForBoxSizing(valueForLength(logicalHeight, availableHeight)); } case ViewportPercentageWidth: case ViewportPercentageHeight: case ViewportPercentageMin: - return computeContentBoxLogicalHeight(valueForLength(logicalHeight, 0, view())); + return adjustContentBoxLogicalHeightForBoxSizing(valueForLength(logicalHeight, 0, view())); default: return intrinsicLogicalHeight(); } @@ -2335,22 +2335,22 @@ LayoutUnit RenderBox::availableLogicalHeightUsing(const Length& h) const if (h.isPercent() && isOutOfFlowPositioned()) { LayoutUnit availableHeight = containingBlockLogicalHeightForPositioned(containingBlock()); - return computeContentBoxLogicalHeight(valueForLength(h, availableHeight)); + return adjustContentBoxLogicalHeightForBoxSizing(valueForLength(h, availableHeight)); } LayoutUnit heightIncludingScrollbar = computeContentLogicalHeightUsing(MainOrPreferredSize, h); if (heightIncludingScrollbar != -1) - return std::max<LayoutUnit>(0, computeContentBoxLogicalHeight(heightIncludingScrollbar) - scrollbarLogicalHeight()); + return std::max<LayoutUnit>(0, adjustContentBoxLogicalHeightForBoxSizing(heightIncludingScrollbar) - scrollbarLogicalHeight()); // FIXME: Check logicalTop/logicalBottom here to correctly handle vertical writing-mode. // https://bugs.webkit.org/show_bug.cgi?id=46500 if (isRenderBlock() && isOutOfFlowPositioned() && style()->height().isAuto() && !(style()->top().isAuto() || style()->bottom().isAuto())) { RenderBlock* block = const_cast<RenderBlock*>(toRenderBlock(this)); LayoutUnit oldHeight = block->logicalHeight(); - block->computeLogicalHeight(); - LayoutUnit newHeight = block->computeContentBoxLogicalHeight(block->contentLogicalHeight()); + block->updateLogicalHeight(); + LayoutUnit newHeight = block->adjustContentBoxLogicalHeightForBoxSizing(block->contentLogicalHeight()); block->setLogicalHeight(oldHeight); - return computeContentBoxLogicalHeight(newHeight); + return adjustContentBoxLogicalHeightForBoxSizing(newHeight); } return containingBlock()->availableLogicalHeight(); @@ -2535,8 +2535,14 @@ static void computeInlineStaticDistance(Length& logicalLeft, Length& logicalRigh void RenderBox::computePositionedLogicalWidth(LogicalExtentComputedValues& computedValues, RenderRegion* region, LayoutUnit offsetFromLogicalTopOfFirstPage) const { if (isReplaced()) { - computePositionedLogicalWidthReplaced(computedValues); // FIXME: Patch for regions when we add replaced element support. - return; + // FIXME: For regions with width auto, we want to compute width using the normal block sizing code. + // For now, regions are replaced elements and this code can be removed once the RenderRegion + // will inherit from RenderBlock instead of RenderReplaced. + // (see https://bugs.webkit.org/show_bug.cgi?id=74132 ) + if (!isRenderRegion() || (isRenderRegion() && shouldComputeSizeAsReplaced())) { + computePositionedLogicalWidthReplaced(computedValues); // FIXME: Patch for regions when we add replaced element support. + return; + } } // QUESTIONS @@ -2717,7 +2723,7 @@ void RenderBox::computePositionedLogicalWidthUsing(SizeType widthSizeType, Lengt // case because the value is not used for any further calculations. logicalLeftValue = valueForLength(logicalLeft, containerLogicalWidth, renderView); - computedValues.m_extent = computeContentBoxLogicalWidth(valueForLength(logicalWidth, containerLogicalWidth, renderView)); + computedValues.m_extent = adjustContentBoxLogicalWidthForBoxSizing(valueForLength(logicalWidth, containerLogicalWidth, renderView)); const LayoutUnit availableSpace = containerLogicalWidth - (logicalLeftValue + computedValues.m_extent + valueForLength(logicalRight, containerLogicalWidth, renderView) + bordersPlusPadding); @@ -2827,7 +2833,7 @@ void RenderBox::computePositionedLogicalWidthUsing(SizeType widthSizeType, Lengt computedValues.m_extent = min(max(preferredMinWidth, availableWidth), preferredWidth); } else if (logicalLeftIsAuto && !logicalWidthIsAuto && !logicalRightIsAuto) { // RULE 4: (solve for left) - computedValues.m_extent = computeContentBoxLogicalWidth(valueForLength(logicalWidth, containerLogicalWidth, renderView)); + computedValues.m_extent = adjustContentBoxLogicalWidthForBoxSizing(valueForLength(logicalWidth, containerLogicalWidth, renderView)); logicalLeftValue = availableSpace - (computedValues.m_extent + valueForLength(logicalRight, containerLogicalWidth, renderView)); } else if (!logicalLeftIsAuto && logicalWidthIsAuto && !logicalRightIsAuto) { // RULE 5: (solve for width) @@ -2836,7 +2842,7 @@ void RenderBox::computePositionedLogicalWidthUsing(SizeType widthSizeType, Lengt } else if (!logicalLeftIsAuto && !logicalWidthIsAuto && logicalRightIsAuto) { // RULE 6: (no need solve for right) logicalLeftValue = valueForLength(logicalLeft, containerLogicalWidth, renderView); - computedValues.m_extent = computeContentBoxLogicalWidth(valueForLength(logicalWidth, containerLogicalWidth, renderView)); + computedValues.m_extent = adjustContentBoxLogicalWidthForBoxSizing(valueForLength(logicalWidth, containerLogicalWidth, renderView)); } } @@ -3043,7 +3049,7 @@ void RenderBox::computePositionedLogicalHeightUsing(SizeType heightSizeType, Len // NOTE: It is not necessary to solve for 'bottom' in the over constrained // case because the value is not used for any further calculations. - logicalHeightValue = computeContentBoxLogicalHeight(valueForLength(logicalHeightLength, containerLogicalHeight, renderView)); + logicalHeightValue = adjustContentBoxLogicalHeightForBoxSizing(valueForLength(logicalHeightLength, containerLogicalHeight, renderView)); logicalTopValue = valueForLength(logicalTop, containerLogicalHeight, renderView); const LayoutUnit availableSpace = containerLogicalHeight - (logicalTopValue + logicalHeightValue + valueForLength(logicalBottom, containerLogicalHeight, renderView) + bordersPlusPadding); @@ -3110,7 +3116,7 @@ void RenderBox::computePositionedLogicalHeightUsing(SizeType heightSizeType, Len logicalHeightValue = contentLogicalHeight; } else if (logicalTopIsAuto && !logicalHeightIsAuto && !logicalBottomIsAuto) { // RULE 4: (solve of top) - logicalHeightValue = computeContentBoxLogicalHeight(valueForLength(logicalHeightLength, containerLogicalHeight, renderView)); + logicalHeightValue = adjustContentBoxLogicalHeightForBoxSizing(valueForLength(logicalHeightLength, containerLogicalHeight, renderView)); logicalTopValue = availableSpace - (logicalHeightValue + valueForLength(logicalBottom, containerLogicalHeight, renderView)); } else if (!logicalTopIsAuto && logicalHeightIsAuto && !logicalBottomIsAuto) { // RULE 5: (solve of height) @@ -3118,7 +3124,7 @@ void RenderBox::computePositionedLogicalHeightUsing(SizeType heightSizeType, Len logicalHeightValue = max<LayoutUnit>(0, availableSpace - (logicalTopValue + valueForLength(logicalBottom, containerLogicalHeight, renderView))); } else if (!logicalTopIsAuto && !logicalHeightIsAuto && logicalBottomIsAuto) { // RULE 6: (no need solve of bottom) - logicalHeightValue = computeContentBoxLogicalHeight(valueForLength(logicalHeightLength, containerLogicalHeight, renderView)); + logicalHeightValue = adjustContentBoxLogicalHeightForBoxSizing(valueForLength(logicalHeightLength, containerLogicalHeight, renderView)); logicalTopValue = valueForLength(logicalTop, containerLogicalHeight, renderView); } } diff --git a/Source/WebCore/rendering/RenderBox.h b/Source/WebCore/rendering/RenderBox.h index ed70a94b8..af3c4624a 100644 --- a/Source/WebCore/rendering/RenderBox.h +++ b/Source/WebCore/rendering/RenderBox.h @@ -299,10 +299,10 @@ public: virtual LayoutSize offsetFromContainer(RenderObject*, const LayoutPoint&, bool* offsetDependsOnPoint = 0) const; - LayoutUnit computeBorderBoxLogicalWidth(LayoutUnit width) const; - LayoutUnit computeBorderBoxLogicalHeight(LayoutUnit height) const; - LayoutUnit computeContentBoxLogicalWidth(LayoutUnit width) const; - LayoutUnit computeContentBoxLogicalHeight(LayoutUnit height) const; + LayoutUnit adjustBorderBoxLogicalWidthForBoxSizing(LayoutUnit width) const; + LayoutUnit adjustBorderBoxLogicalHeightForBoxSizing(LayoutUnit height) const; + LayoutUnit adjustContentBoxLogicalWidthForBoxSizing(LayoutUnit width) const; + LayoutUnit adjustContentBoxLogicalHeightForBoxSizing(LayoutUnit height) const; virtual void borderFitAdjust(LayoutRect&) const { } // Shrink the box in which the border paints if border-fit is set. @@ -364,8 +364,8 @@ public: LayoutUnit containingBlockAvailableLineWidthInRegion(RenderRegion*, LayoutUnit offsetFromLogicalTopOfFirstPage) const; LayoutUnit perpendicularContainingBlockLogicalHeight() const; - virtual void computeLogicalWidth(); - virtual void computeLogicalHeight(); + virtual void updateLogicalWidth(); + virtual void updateLogicalHeight(); void computeLogicalHeight(LogicalExtentComputedValues&) const; RenderBoxRegionInfo* renderBoxRegionInfo(RenderRegion*, LayoutUnit offsetFromLogicalTopOfFirstPage, RenderBoxRegionInfoFlags = CacheRenderBoxRegionInfo) const; @@ -449,11 +449,11 @@ public: bool tryLayoutDoingPositionedMovementOnly() { LayoutUnit oldWidth = width(); - computeLogicalWidth(); + updateLogicalWidth(); // If we shrink to fit our width may have changed, so we still need full layout. if (oldWidth != width()) return false; - computeLogicalHeight(); + updateLogicalHeight(); return true; } diff --git a/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp b/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp index e2fe1cf5c..d6191b2e2 100644 --- a/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp +++ b/Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp @@ -192,7 +192,7 @@ void RenderDeprecatedFlexibleBox::computePreferredLogicalWidths() ASSERT(preferredLogicalWidthsDirty()); if (style()->width().isFixed() && style()->width().value() > 0) - m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = computeContentBoxLogicalWidth(style()->width().value()); + m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = adjustContentBoxLogicalWidthForBoxSizing(style()->width().value()); else { m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = 0; @@ -212,13 +212,13 @@ void RenderDeprecatedFlexibleBox::computePreferredLogicalWidths() } if (style()->minWidth().isFixed() && style()->minWidth().value() > 0) { - m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->minWidth().value())); - m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->minWidth().value())); + m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->minWidth().value())); + m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->minWidth().value())); } if (style()->maxWidth().isFixed()) { - m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->maxWidth().value())); - m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->maxWidth().value())); + m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->maxWidth().value())); + m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->maxWidth().value())); } LayoutUnit borderAndPadding = borderAndPaddingLogicalWidth(); @@ -247,8 +247,8 @@ void RenderDeprecatedFlexibleBox::layoutBlock(bool relayoutChildren, LayoutUnit) LayoutSize previousSize = size(); - computeLogicalWidth(); - computeLogicalHeight(); + updateLogicalWidth(); + updateLogicalHeight(); m_overflow.clear(); @@ -269,7 +269,7 @@ void RenderDeprecatedFlexibleBox::layoutBlock(bool relayoutChildren, LayoutUnit) layoutVerticalBox(relayoutChildren); LayoutUnit oldClientAfterEdge = clientLogicalBottom(); - computeLogicalHeight(); + updateLogicalHeight(); if (previousSize.height() != height()) relayoutChildren = true; @@ -414,7 +414,7 @@ void RenderDeprecatedFlexibleBox::layoutHorizontalBox(bool relayoutChildren) setHeight(height() + toAdd); oldHeight = height(); - computeLogicalHeight(); + updateLogicalHeight(); relayoutChildren = false; if (oldHeight != height()) @@ -447,7 +447,7 @@ void RenderDeprecatedFlexibleBox::layoutHorizontalBox(bool relayoutChildren) // fill the height of a containing box by default. // Now do a layout. LayoutUnit oldChildHeight = child->height(); - child->computeLogicalHeight(); + child->updateLogicalHeight(); if (oldChildHeight != child->height()) child->setChildNeedsLayout(true, MarkOnlyThis); @@ -735,7 +735,7 @@ void RenderDeprecatedFlexibleBox::layoutVerticalBox(bool relayoutChildren) // Now we have to calc our height, so we know how much space we have remaining. oldHeight = height(); - computeLogicalHeight(); + updateLogicalHeight(); if (oldHeight != height()) heightSpecified = true; diff --git a/Source/WebCore/rendering/RenderEmbeddedObject.cpp b/Source/WebCore/rendering/RenderEmbeddedObject.cpp index dcb3cc3b0..1111e299e 100644 --- a/Source/WebCore/rendering/RenderEmbeddedObject.cpp +++ b/Source/WebCore/rendering/RenderEmbeddedObject.cpp @@ -230,8 +230,8 @@ void RenderEmbeddedObject::layout() { ASSERT(needsLayout()); - computeLogicalWidth(); - computeLogicalHeight(); + updateLogicalWidth(); + updateLogicalHeight(); RenderPart::layout(); diff --git a/Source/WebCore/rendering/RenderFileUploadControl.cpp b/Source/WebCore/rendering/RenderFileUploadControl.cpp index de9564456..ce6f278b5 100644 --- a/Source/WebCore/rendering/RenderFileUploadControl.cpp +++ b/Source/WebCore/rendering/RenderFileUploadControl.cpp @@ -184,7 +184,7 @@ void RenderFileUploadControl::computePreferredLogicalWidths() const Font& font = style->font(); if (style->width().isFixed() && style->width().value() > 0) - m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = computeContentBoxLogicalWidth(style->width().value()); + m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = adjustContentBoxLogicalWidthForBoxSizing(style->width().value()); else { // Figure out how big the filename space needs to be for a given number of characters // (using "0" as the nominal character). @@ -201,16 +201,16 @@ void RenderFileUploadControl::computePreferredLogicalWidths() } if (style->minWidth().isFixed() && style->minWidth().value() > 0) { - m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(style->minWidth().value())); - m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(style->minWidth().value())); + m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style->minWidth().value())); + m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style->minWidth().value())); } else if (style->width().isPercent() || (style->width().isAuto() && style->height().isPercent())) m_minPreferredLogicalWidth = 0; else m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth; if (style->maxWidth().isFixed()) { - m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(style->maxWidth().value())); - m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(style->maxWidth().value())); + m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style->maxWidth().value())); + m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style->maxWidth().value())); } int toAdd = borderAndPaddingWidth(); diff --git a/Source/WebCore/rendering/RenderFlexibleBox.cpp b/Source/WebCore/rendering/RenderFlexibleBox.cpp index 9f87cf835..c3a2a5c9a 100644 --- a/Source/WebCore/rendering/RenderFlexibleBox.cpp +++ b/Source/WebCore/rendering/RenderFlexibleBox.cpp @@ -167,7 +167,7 @@ void RenderFlexibleBox::computePreferredLogicalWidths() RenderStyle* styleToUse = style(); // FIXME: This should probably be checking for isSpecified since you should be able to use percentage, calc or viewport relative values for width. if (styleToUse->logicalWidth().isFixed() && styleToUse->logicalWidth().value() > 0) - m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = computeContentBoxLogicalWidth(styleToUse->logicalWidth().value()); + m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalWidth().value()); else { m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = 0; @@ -217,14 +217,14 @@ void RenderFlexibleBox::computePreferredLogicalWidths() // FIXME: This should probably be checking for isSpecified since you should be able to use percentage, calc or viewport relative values for min-width. if (styleToUse->logicalMinWidth().isFixed() && styleToUse->logicalMinWidth().value() > 0) { - m_maxPreferredLogicalWidth = std::max(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(styleToUse->logicalMinWidth().value())); - m_minPreferredLogicalWidth = std::max(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(styleToUse->logicalMinWidth().value())); + m_maxPreferredLogicalWidth = std::max(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalMinWidth().value())); + m_minPreferredLogicalWidth = std::max(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalMinWidth().value())); } // FIXME: This should probably be checking for isSpecified since you should be able to use percentage, calc or viewport relative values for maxWidth. if (styleToUse->logicalMaxWidth().isFixed()) { - m_maxPreferredLogicalWidth = std::min(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(styleToUse->logicalMaxWidth().value())); - m_minPreferredLogicalWidth = std::min(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(styleToUse->logicalMaxWidth().value())); + m_maxPreferredLogicalWidth = std::min(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalMaxWidth().value())); + m_minPreferredLogicalWidth = std::min(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalMaxWidth().value())); } LayoutUnit borderAndPadding = borderAndPaddingLogicalWidth(); @@ -254,7 +254,7 @@ void RenderFlexibleBox::layoutBlock(bool relayoutChildren, LayoutUnit) LayoutSize previousSize = size(); setLogicalHeight(0); - computeLogicalWidth(); + updateLogicalWidth(); m_overflow.clear(); @@ -265,7 +265,7 @@ void RenderFlexibleBox::layoutBlock(bool relayoutChildren, LayoutUnit) layoutFlexItems(*m_orderIterator, lineContexts); LayoutUnit oldClientAfterEdge = clientLogicalBottom(); - computeLogicalHeight(); + updateLogicalHeight(); repositionLogicalHeightDependentFlexItems(*m_orderIterator, lineContexts, oldClientAfterEdge); if (size() != previousSize) @@ -406,7 +406,7 @@ LayoutUnit RenderFlexibleBox::computeMainAxisExtentForChild(RenderBox* child, Si // to figure out the logical height/width. if (isColumnFlow()) return child->computeLogicalClientHeight(sizeType, size); - return child->computeContentBoxLogicalWidth(valueForLength(size, maximumValue, view())); + return child->adjustContentBoxLogicalWidthForBoxSizing(valueForLength(size, maximumValue, view())); } WritingMode RenderFlexibleBox::transformedWritingMode() const @@ -1058,7 +1058,7 @@ void RenderFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons if (style()->flexDirection() == FlowColumnReverse) { // We have to do an extra pass for column-reverse to reposition the flex items since the start depends // on the height of the flexbox, which we only know after we've positioned all the flex items. - computeLogicalHeight(); + updateLogicalHeight(); layoutColumnReverse(children, childSizes, crossAxisOffset, availableFreeSpace); } diff --git a/Source/WebCore/rendering/RenderFlowThread.cpp b/Source/WebCore/rendering/RenderFlowThread.cpp index 059ff4818..82686117a 100644 --- a/Source/WebCore/rendering/RenderFlowThread.cpp +++ b/Source/WebCore/rendering/RenderFlowThread.cpp @@ -166,7 +166,7 @@ void RenderFlowThread::layout() previousRegionLogicalWidth = regionLogicalWidth; } - computeLogicalWidth(); // Called to get the maximum logical width for the region. + updateLogicalWidth(); // Called to get the maximum logical width for the region. LayoutUnit logicalHeight = 0; for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) { @@ -196,7 +196,7 @@ void RenderFlowThread::layout() dispatchRegionLayoutUpdateEvent(); } -void RenderFlowThread::computeLogicalWidth() +void RenderFlowThread::updateLogicalWidth() { LayoutUnit logicalWidth = 0; for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) { @@ -222,7 +222,7 @@ void RenderFlowThread::computeLogicalWidth() } } -void RenderFlowThread::computeLogicalHeight() +void RenderFlowThread::updateLogicalHeight() { LayoutUnit logicalHeight = 0; diff --git a/Source/WebCore/rendering/RenderFlowThread.h b/Source/WebCore/rendering/RenderFlowThread.h index 32803adde..f2a2046d2 100644 --- a/Source/WebCore/rendering/RenderFlowThread.h +++ b/Source/WebCore/rendering/RenderFlowThread.h @@ -73,8 +73,8 @@ public: virtual void removeRegionFromThread(RenderRegion*); const RenderRegionList& renderRegionList() const { return m_regionList; } - virtual void computeLogicalWidth() OVERRIDE; - virtual void computeLogicalHeight() OVERRIDE; + virtual void updateLogicalWidth() OVERRIDE; + virtual void updateLogicalHeight() OVERRIDE; void paintFlowThreadPortionInRegion(PaintInfo&, RenderRegion*, LayoutRect flowThreadPortionRect, LayoutRect flowThreadPortionOverflowRect, const LayoutPoint&) const; bool hitTestFlowThreadPortionInRegion(RenderRegion*, LayoutRect flowThreadPortionRect, LayoutRect flowThreadPortionOverflowRect, const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset) const; diff --git a/Source/WebCore/rendering/RenderGrid.cpp b/Source/WebCore/rendering/RenderGrid.cpp index 6a4519d1f..e282f7f41 100644 --- a/Source/WebCore/rendering/RenderGrid.cpp +++ b/Source/WebCore/rendering/RenderGrid.cpp @@ -76,14 +76,14 @@ void RenderGrid::layoutBlock(bool relayoutChildren, LayoutUnit) LayoutSize previousSize = size(); setLogicalHeight(0); - computeLogicalWidth(); + updateLogicalWidth(); m_overflow.clear(); layoutGridItems(); LayoutUnit oldClientAfterEdge = clientLogicalBottom(); - computeLogicalHeight(); + updateLogicalHeight(); if (size() != previousSize) relayoutChildren = true; diff --git a/Source/WebCore/rendering/RenderHTMLCanvas.cpp b/Source/WebCore/rendering/RenderHTMLCanvas.cpp index 33116989e..5810da230 100644 --- a/Source/WebCore/rendering/RenderHTMLCanvas.cpp +++ b/Source/WebCore/rendering/RenderHTMLCanvas.cpp @@ -89,8 +89,8 @@ void RenderHTMLCanvas::canvasSizeChanged() setPreferredLogicalWidthsDirty(true); LayoutSize oldSize = size(); - computeLogicalWidth(); - computeLogicalHeight(); + updateLogicalWidth(); + updateLogicalHeight(); if (oldSize == size()) return; diff --git a/Source/WebCore/rendering/RenderIFrame.cpp b/Source/WebCore/rendering/RenderIFrame.cpp index 42480a085..c45e8059a 100644 --- a/Source/WebCore/rendering/RenderIFrame.cpp +++ b/Source/WebCore/rendering/RenderIFrame.cpp @@ -43,9 +43,9 @@ RenderIFrame::RenderIFrame(Element* element) { } -void RenderIFrame::computeLogicalHeight() +void RenderIFrame::updateLogicalHeight() { - RenderPart::computeLogicalHeight(); + RenderPart::updateLogicalHeight(); if (!flattenFrame()) return; @@ -61,13 +61,13 @@ void RenderIFrame::computeLogicalHeight() } } -void RenderIFrame::computeLogicalWidth() +void RenderIFrame::updateLogicalWidth() { // When we're seamless, we behave like a block. Thankfully RenderBox has all the right logic for this. if (isSeamless()) - return RenderBox::computeLogicalWidth(); + return RenderBox::updateLogicalWidth(); - RenderPart::computeLogicalWidth(); + RenderPart::updateLogicalWidth(); if (!flattenFrame()) return; @@ -162,7 +162,7 @@ bool RenderIFrame::flattenFrame() const void RenderIFrame::layoutSeamlessly() { - computeLogicalWidth(); + updateLogicalWidth(); // FIXME: Containers set their height to 0 before laying out their kids (as we're doing here) // however, this causes FrameView::layout() to add vertical scrollbars, incorrectly inflating // the resulting contentHeight(). We'll need to make FrameView::layout() smarter. @@ -175,7 +175,7 @@ void RenderIFrame::layoutSeamlessly() FrameView* childFrameView = static_cast<FrameView*>(widget()); if (childFrameView) // Widget should never be null during layout(), but just in case. setLogicalHeight(childFrameView->contentsHeight() + borderTop() + borderBottom()); - computeLogicalHeight(); + updateLogicalHeight(); updateWidgetPosition(); // Notify the Widget of our final height. @@ -190,8 +190,8 @@ void RenderIFrame::layout() ASSERT(needsLayout()); if (flattenFrame()) { - RenderPart::computeLogicalWidth(); - RenderPart::computeLogicalHeight(); + RenderPart::updateLogicalWidth(); + RenderPart::updateLogicalHeight(); layoutWithFlattening(style()->width().isFixed(), style()->height().isFixed()); // FIXME: Is early return really OK here? What about transform/overflow code below? return; @@ -199,9 +199,9 @@ void RenderIFrame::layout() layoutSeamlessly(); // Do not return so as to share the layer and overflow updates below. } else { - computeLogicalWidth(); + updateLogicalWidth(); // No kids to layout as a replaced element. - computeLogicalHeight(); + updateLogicalHeight(); } m_overflow.clear(); diff --git a/Source/WebCore/rendering/RenderIFrame.h b/Source/WebCore/rendering/RenderIFrame.h index 8b93407e3..69e438213 100644 --- a/Source/WebCore/rendering/RenderIFrame.h +++ b/Source/WebCore/rendering/RenderIFrame.h @@ -40,8 +40,8 @@ public: bool isSeamless() const; private: - virtual void computeLogicalHeight() OVERRIDE; - virtual void computeLogicalWidth() OVERRIDE; + virtual void updateLogicalWidth() OVERRIDE; + virtual void updateLogicalHeight() OVERRIDE; virtual LayoutUnit minPreferredLogicalWidth() const OVERRIDE; virtual LayoutUnit maxPreferredLogicalWidth() const OVERRIDE; diff --git a/Source/WebCore/rendering/RenderImage.cpp b/Source/WebCore/rendering/RenderImage.cpp index 1953f5331..404025f6e 100644 --- a/Source/WebCore/rendering/RenderImage.cpp +++ b/Source/WebCore/rendering/RenderImage.cpp @@ -224,8 +224,8 @@ void RenderImage::imageDimensionsChanged(bool imageSizeChanged, const IntRect* r LayoutUnit oldheight = height(); if (!preferredLogicalWidthsDirty()) setPreferredLogicalWidthsDirty(true); - computeLogicalWidth(); - computeLogicalHeight(); + updateLogicalWidth(); + updateLogicalHeight(); if (imageSizeChanged || width() != oldwidth || height() != oldheight) { shouldRepaint = false; diff --git a/Source/WebCore/rendering/RenderLayer.cpp b/Source/WebCore/rendering/RenderLayer.cpp index 271999385..30f759c5d 100644 --- a/Source/WebCore/rendering/RenderLayer.cpp +++ b/Source/WebCore/rendering/RenderLayer.cpp @@ -2210,9 +2210,12 @@ bool RenderLayer::shouldSuspendScrollAnimations() const return view->frameView()->shouldSuspendScrollAnimations(); } -bool RenderLayer::isOnActivePage() const +bool RenderLayer::scrollbarsCanBeActive() const { - return !m_renderer->document()->inPageCache(); + RenderView* view = renderer()->view(); + if (!view) + return false; + return view->frameView()->scrollbarsCanBeActive(); } IntPoint RenderLayer::currentMousePosition() const diff --git a/Source/WebCore/rendering/RenderLayer.h b/Source/WebCore/rendering/RenderLayer.h index 32d41e3ba..7c0953af4 100644 --- a/Source/WebCore/rendering/RenderLayer.h +++ b/Source/WebCore/rendering/RenderLayer.h @@ -805,7 +805,7 @@ private: virtual IntSize overhangAmount() const; virtual IntPoint currentMousePosition() const; virtual bool shouldSuspendScrollAnimations() const; - virtual bool isOnActivePage() const; + virtual bool scrollbarsCanBeActive() const; virtual IntRect scrollableAreaBoundingBox() const OVERRIDE; // Rectangle encompassing the scroll corner and resizer rect. diff --git a/Source/WebCore/rendering/RenderListBox.cpp b/Source/WebCore/rendering/RenderListBox.cpp index db70b08a5..7a2439779 100644 --- a/Source/WebCore/rendering/RenderListBox.cpp +++ b/Source/WebCore/rendering/RenderListBox.cpp @@ -198,7 +198,7 @@ void RenderListBox::computePreferredLogicalWidths() m_maxPreferredLogicalWidth = 0; if (style()->width().isFixed() && style()->width().value() > 0) - m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = computeContentBoxLogicalWidth(style()->width().value()); + m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = adjustContentBoxLogicalWidthForBoxSizing(style()->width().value()); else { m_maxPreferredLogicalWidth = m_optionsWidth + 2 * optionsSpacingHorizontal; if (m_vBar) @@ -206,16 +206,16 @@ void RenderListBox::computePreferredLogicalWidths() } if (style()->minWidth().isFixed() && style()->minWidth().value() > 0) { - m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->minWidth().value())); - m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->minWidth().value())); + m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->minWidth().value())); + m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->minWidth().value())); } else if (style()->width().isPercent() || (style()->width().isAuto() && style()->height().isPercent())) m_minPreferredLogicalWidth = 0; else m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth; if (style()->maxWidth().isFixed()) { - m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->maxWidth().value())); - m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->maxWidth().value())); + m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->maxWidth().value())); + m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->maxWidth().value())); } LayoutUnit toAdd = borderAndPaddingWidth(); @@ -250,14 +250,14 @@ LayoutUnit RenderListBox::listHeight() const return itemHeight() * numItems() - rowSpacing; } -void RenderListBox::computeLogicalHeight() +void RenderListBox::updateLogicalHeight() { int toAdd = borderAndPaddingHeight(); int itemHeight = RenderListBox::itemHeight(); setHeight(itemHeight * size() - rowSpacing + toAdd); - RenderBlock::computeLogicalHeight(); + RenderBlock::updateLogicalHeight(); if (m_vBar) { bool enabled = numVisibleItems() < numItems(); @@ -821,9 +821,12 @@ bool RenderListBox::shouldSuspendScrollAnimations() const return view->frameView()->shouldSuspendScrollAnimations(); } -bool RenderListBox::isOnActivePage() const +bool RenderListBox::scrollbarsCanBeActive() const { - return !document()->inPageCache(); + RenderView* view = this->view(); + if (!view) + return false; + return view->frameView()->scrollbarsCanBeActive(); } ScrollableArea* RenderListBox::enclosingScrollableArea() const diff --git a/Source/WebCore/rendering/RenderListBox.h b/Source/WebCore/rendering/RenderListBox.h index 9a0110efc..d259e767c 100644 --- a/Source/WebCore/rendering/RenderListBox.h +++ b/Source/WebCore/rendering/RenderListBox.h @@ -77,7 +77,7 @@ private: virtual void computePreferredLogicalWidths(); virtual LayoutUnit baselinePosition(FontBaseline, bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const; - virtual void computeLogicalHeight() OVERRIDE; + virtual void updateLogicalHeight() OVERRIDE; virtual void layout(); @@ -119,7 +119,7 @@ private: virtual int visibleWidth() const OVERRIDE; virtual IntPoint currentMousePosition() const OVERRIDE; virtual bool shouldSuspendScrollAnimations() const OVERRIDE; - virtual bool isOnActivePage() const OVERRIDE; + virtual bool scrollbarsCanBeActive() const OVERRIDE; virtual ScrollableArea* enclosingScrollableArea() const OVERRIDE; virtual IntRect scrollableAreaBoundingBox() const OVERRIDE; diff --git a/Source/WebCore/rendering/RenderListMarker.cpp b/Source/WebCore/rendering/RenderListMarker.cpp index 04d8632a8..b4bc59e9f 100644 --- a/Source/WebCore/rendering/RenderListMarker.cpp +++ b/Source/WebCore/rendering/RenderListMarker.cpp @@ -222,7 +222,6 @@ static int toArmenianUnder10000(int number, bool upper, bool addCircumflex, UCha if (int thousands = number / 1000) { if (thousands == 7) { - letters[length++] = 0x0548 + lowerOffset; letters[length++] = 0x0552 + lowerOffset; if (addCircumflex) letters[length++] = 0x0302; diff --git a/Source/WebCore/rendering/RenderMenuList.cpp b/Source/WebCore/rendering/RenderMenuList.cpp index 06367c726..1ab55a602 100644 --- a/Source/WebCore/rendering/RenderMenuList.cpp +++ b/Source/WebCore/rendering/RenderMenuList.cpp @@ -278,21 +278,21 @@ void RenderMenuList::computePreferredLogicalWidths() m_maxPreferredLogicalWidth = 0; if (style()->width().isFixed() && style()->width().value() > 0) - m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = computeContentBoxLogicalWidth(style()->width().value()); + m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = adjustContentBoxLogicalWidthForBoxSizing(style()->width().value()); else m_maxPreferredLogicalWidth = max(m_optionsWidth, theme()->minimumMenuListSize(style())) + m_innerBlock->paddingLeft() + m_innerBlock->paddingRight(); if (style()->minWidth().isFixed() && style()->minWidth().value() > 0) { - m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->minWidth().value())); - m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->minWidth().value())); + m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->minWidth().value())); + m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->minWidth().value())); } else if (style()->width().isPercent() || (style()->width().isAuto() && style()->height().isPercent())) m_minPreferredLogicalWidth = 0; else m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth; if (style()->maxWidth().isFixed()) { - m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->maxWidth().value())); - m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->maxWidth().value())); + m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->maxWidth().value())); + m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->maxWidth().value())); } LayoutUnit toAdd = borderAndPaddingWidth(); diff --git a/Source/WebCore/rendering/RenderMeter.cpp b/Source/WebCore/rendering/RenderMeter.cpp index 497bef91e..b539c0a3a 100644 --- a/Source/WebCore/rendering/RenderMeter.cpp +++ b/Source/WebCore/rendering/RenderMeter.cpp @@ -52,15 +52,15 @@ HTMLMeterElement* RenderMeter::meterElement() const return toHTMLMeterElement(node()->shadowHost()); } -void RenderMeter::computeLogicalWidth() +void RenderMeter::updateLogicalWidth() { - RenderBox::computeLogicalWidth(); + RenderBox::updateLogicalWidth(); setWidth(theme()->meterSizeForBounds(this, pixelSnappedIntRect(frameRect())).width()); } -void RenderMeter::computeLogicalHeight() +void RenderMeter::updateLogicalHeight() { - RenderBox::computeLogicalHeight(); + RenderBox::updateLogicalHeight(); setHeight(theme()->meterSizeForBounds(this, pixelSnappedIntRect(frameRect())).height()); } diff --git a/Source/WebCore/rendering/RenderMeter.h b/Source/WebCore/rendering/RenderMeter.h index b73218598..9051951d1 100644 --- a/Source/WebCore/rendering/RenderMeter.h +++ b/Source/WebCore/rendering/RenderMeter.h @@ -39,8 +39,8 @@ public: virtual void updateFromElement(); private: - virtual void computeLogicalWidth() OVERRIDE; - virtual void computeLogicalHeight() OVERRIDE; + virtual void updateLogicalWidth() OVERRIDE; + virtual void updateLogicalHeight() OVERRIDE; virtual const char* renderName() const { return "RenderMeter"; } virtual bool isMeter() const { return true; } diff --git a/Source/WebCore/rendering/RenderMultiColumnBlock.cpp b/Source/WebCore/rendering/RenderMultiColumnBlock.cpp index 64271a329..221cb4d30 100644 --- a/Source/WebCore/rendering/RenderMultiColumnBlock.cpp +++ b/Source/WebCore/rendering/RenderMultiColumnBlock.cpp @@ -68,9 +68,9 @@ void RenderMultiColumnBlock::computeColumnCountAndWidth() } } -bool RenderMultiColumnBlock::recomputeLogicalWidth() +bool RenderMultiColumnBlock::updateLogicalWidthAndColumnWidth() { - bool relayoutChildren = RenderBlock::recomputeLogicalWidth(); + bool relayoutChildren = RenderBlock::updateLogicalWidthAndColumnWidth(); LayoutUnit oldColumnWidth = m_columnWidth; computeColumnCountAndWidth(); if (m_columnWidth != oldColumnWidth) @@ -81,7 +81,7 @@ bool RenderMultiColumnBlock::recomputeLogicalWidth() void RenderMultiColumnBlock::checkForPaginationLogicalHeightChange(LayoutUnit& /*pageLogicalHeight*/, bool& /*pageLogicalHeightChanged*/, bool& /*hasSpecifiedPageLogicalHeight*/) { // We don't actually update any of the variables. We just subclassed to adjust our column height. - computeLogicalHeight(); + updateLogicalHeight(); LayoutUnit newContentLogicalHeight = contentLogicalHeight(); if (newContentLogicalHeight > ZERO_LAYOUT_UNIT) { // The regions will be invalidated when we lay them out and they change size to diff --git a/Source/WebCore/rendering/RenderMultiColumnBlock.h b/Source/WebCore/rendering/RenderMultiColumnBlock.h index bd9f12afe..58850c334 100644 --- a/Source/WebCore/rendering/RenderMultiColumnBlock.h +++ b/Source/WebCore/rendering/RenderMultiColumnBlock.h @@ -50,7 +50,7 @@ private: virtual const char* renderName() const; - virtual bool recomputeLogicalWidth() OVERRIDE; + virtual bool updateLogicalWidthAndColumnWidth() OVERRIDE; virtual void checkForPaginationLogicalHeightChange(LayoutUnit& pageLogicalHeight, bool& pageLogicalHeightChanged, bool& hasSpecifiedPageLogicalHeight) OVERRIDE; virtual bool relayoutForPagination(bool hasSpecifiedPageLogicalHeight, LayoutUnit pageLogicalHeight, LayoutStateMaintainer&) OVERRIDE; diff --git a/Source/WebCore/rendering/RenderMultiColumnFlowThread.h b/Source/WebCore/rendering/RenderMultiColumnFlowThread.h index c69e65016..363cd0771 100644 --- a/Source/WebCore/rendering/RenderMultiColumnFlowThread.h +++ b/Source/WebCore/rendering/RenderMultiColumnFlowThread.h @@ -39,7 +39,7 @@ public: private: virtual const char* renderName() const OVERRIDE; - virtual void computeLogicalHeight() OVERRIDE {}; // We simply remain at our intrinsic height. + virtual void updateLogicalHeight() OVERRIDE { } // We simply remain at our intrinsic height. }; } // namespace WebCore diff --git a/Source/WebCore/rendering/RenderMultiColumnSet.cpp b/Source/WebCore/rendering/RenderMultiColumnSet.cpp index 369011980..83d1dea50 100644 --- a/Source/WebCore/rendering/RenderMultiColumnSet.cpp +++ b/Source/WebCore/rendering/RenderMultiColumnSet.cpp @@ -51,7 +51,7 @@ LayoutUnit RenderMultiColumnSet::pageLogicalTopForOffset(LayoutUnit offset) cons return portionLogicalTop + columnIndex * computedColumnHeight(); } -void RenderMultiColumnSet::computeLogicalWidth() +void RenderMultiColumnSet::updateLogicalWidth() { // Our logical width starts off matching the column block itself. // This width will be fixed up after the flow thread lays out once it is determined exactly how many @@ -64,7 +64,7 @@ void RenderMultiColumnSet::computeLogicalWidth() setComputedColumnWidthAndCount(parentBlock->columnWidth(), parentBlock->columnCount()); // FIXME: This will eventually vary if we are contained inside regions. } -void RenderMultiColumnSet::computeLogicalHeight() +void RenderMultiColumnSet::updateLogicalHeight() { // Make sure our column height is up to date. RenderMultiColumnBlock* parentBlock = toRenderMultiColumnBlock(parent()); diff --git a/Source/WebCore/rendering/RenderMultiColumnSet.h b/Source/WebCore/rendering/RenderMultiColumnSet.h index a0d1c4536..f8fa37795 100644 --- a/Source/WebCore/rendering/RenderMultiColumnSet.h +++ b/Source/WebCore/rendering/RenderMultiColumnSet.h @@ -62,8 +62,8 @@ public: } private: - virtual void computeLogicalWidth() OVERRIDE; - virtual void computeLogicalHeight() OVERRIDE; + virtual void updateLogicalWidth() OVERRIDE; + virtual void updateLogicalHeight() OVERRIDE; virtual void paintReplaced(PaintInfo&, const LayoutPoint& paintOffset) OVERRIDE; virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation&, const LayoutPoint& accumulatedOffset, HitTestAction) OVERRIDE; diff --git a/Source/WebCore/rendering/RenderRegion.cpp b/Source/WebCore/rendering/RenderRegion.cpp index 80c848bf4..d895cd039 100644 --- a/Source/WebCore/rendering/RenderRegion.cpp +++ b/Source/WebCore/rendering/RenderRegion.cpp @@ -496,4 +496,44 @@ void RenderRegion::clearObjectStyleInRegion(const RenderObject* object) clearObjectStyleInRegion(child); } +// FIXME: when RenderRegion will inherit from RenderBlock instead of RenderReplaced, +// we should overwrite computePreferredLogicalWidths ( see https://bugs.webkit.org/show_bug.cgi?id=74132 ) +LayoutUnit RenderRegion::minPreferredLogicalWidth() const +{ + if (!m_flowThread || !m_isValid) + return RenderReplaced::minPreferredLogicalWidth(); + + // FIXME: Currently, the code handles only the <length> case for min-width. It should also support other values, like percentage, calc + // or viewport relative. + RenderStyle* styleToUse = style(); + LayoutUnit minPreferredLogicalWidth = m_flowThread->minPreferredLogicalWidth(); + + if (styleToUse->logicalMinWidth().isFixed() && styleToUse->logicalMinWidth().value() > 0) + minPreferredLogicalWidth = std::max(minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalMinWidth().value())); + + if (styleToUse->logicalMaxWidth().isFixed()) + minPreferredLogicalWidth = std::min(minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalMaxWidth().value())); + + return minPreferredLogicalWidth + borderAndPaddingLogicalWidth(); +} + +LayoutUnit RenderRegion::maxPreferredLogicalWidth() const +{ + if (!m_flowThread || !m_isValid) + return RenderReplaced::maxPreferredLogicalWidth(); + + // FIXME: Currently, the code handles only the <length> case for max-width. It should also support other values, like percentage, calc + // or viewport relative. + RenderStyle* styleToUse = style(); + LayoutUnit maxPreferredLogicalWidth = m_flowThread->maxPreferredLogicalWidth(); + + if (styleToUse->logicalMinWidth().isFixed() && styleToUse->logicalMinWidth().value() > 0) + maxPreferredLogicalWidth = std::max(maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalMinWidth().value())); + + if (styleToUse->logicalMaxWidth().isFixed()) + maxPreferredLogicalWidth = std::min(maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(styleToUse->logicalMaxWidth().value())); + + return maxPreferredLogicalWidth + borderAndPaddingLogicalWidth(); +} + } // namespace WebCore diff --git a/Source/WebCore/rendering/RenderRegion.h b/Source/WebCore/rendering/RenderRegion.h index 7c9b87fc0..ee04ecc6d 100644 --- a/Source/WebCore/rendering/RenderRegion.h +++ b/Source/WebCore/rendering/RenderRegion.h @@ -100,6 +100,9 @@ public: // height of a single column or page in the set. virtual LayoutUnit pageLogicalWidth() const; virtual LayoutUnit pageLogicalHeight() const; + + virtual LayoutUnit minPreferredLogicalWidth() const OVERRIDE; + virtual LayoutUnit maxPreferredLogicalWidth() const OVERRIDE; // This method represents the logical height of the entire flow thread portion used by the region or set. // For RenderRegions it matches logicalPaginationHeight(), but for sets it is the height of all the pages @@ -111,7 +114,7 @@ public: // page. virtual LayoutUnit pageLogicalTopForOffset(LayoutUnit offset) const; - virtual void expandToEncompassFlowThreadContentsIfNeeded() {}; + virtual void expandToEncompassFlowThreadContentsIfNeeded() { }; // Whether or not this region is a set. virtual bool isRenderRegionSet() const { return false; } @@ -129,6 +132,12 @@ protected: private: virtual const char* renderName() const { return "RenderRegion"; } + // FIXME: these functions should be revisited once RenderRegion inherits from RenderBlock + // instead of RenderReplaced (see https://bugs.webkit.org/show_bug.cgi?id=74132 ) + // When width is auto, use normal block/box sizing code except when inline. + virtual bool isInlineBlockOrInlineTable() const OVERRIDE { return isInline() && style()->logicalWidth().isAuto(); } + virtual bool shouldComputeSizeAsReplaced() const OVERRIDE { return !style()->logicalWidth().isAuto(); } + virtual void insertedIntoTree() OVERRIDE; virtual void willBeRemovedFromTree() OVERRIDE; diff --git a/Source/WebCore/rendering/RenderReplaced.cpp b/Source/WebCore/rendering/RenderReplaced.cpp index bcd967e6a..f765c38c4 100644 --- a/Source/WebCore/rendering/RenderReplaced.cpp +++ b/Source/WebCore/rendering/RenderReplaced.cpp @@ -85,8 +85,8 @@ void RenderReplaced::layout() setHeight(minimumReplacedHeight()); - computeLogicalWidth(); - computeLogicalHeight(); + updateLogicalWidth(); + updateLogicalHeight(); m_overflow.clear(); addVisualEffectOverflow(); diff --git a/Source/WebCore/rendering/RenderSearchField.cpp b/Source/WebCore/rendering/RenderSearchField.cpp index 2704cdc03..4ad458ab7 100644 --- a/Source/WebCore/rendering/RenderSearchField.cpp +++ b/Source/WebCore/rendering/RenderSearchField.cpp @@ -151,13 +151,13 @@ LayoutUnit RenderSearchField::computeControlHeight(LayoutUnit lineHeight, Layout { HTMLElement* resultsButton = resultsButtonElement(); if (RenderBox* resultsRenderer = resultsButton ? resultsButton->renderBox() : 0) { - resultsRenderer->computeLogicalHeight(); + resultsRenderer->updateLogicalHeight(); nonContentHeight = max(nonContentHeight, resultsRenderer->borderAndPaddingHeight() + resultsRenderer->marginHeight()); lineHeight = max(lineHeight, resultsRenderer->height()); } HTMLElement* cancelButton = cancelButtonElement(); if (RenderBox* cancelRenderer = cancelButton ? cancelButton->renderBox() : 0) { - cancelRenderer->computeLogicalHeight(); + cancelRenderer->updateLogicalHeight(); nonContentHeight = max(nonContentHeight, cancelRenderer->borderAndPaddingHeight() + cancelRenderer->marginHeight()); lineHeight = max(lineHeight, cancelRenderer->height()); } diff --git a/Source/WebCore/rendering/RenderSlider.cpp b/Source/WebCore/rendering/RenderSlider.cpp index 1abca2fdb..1214abc09 100644 --- a/Source/WebCore/rendering/RenderSlider.cpp +++ b/Source/WebCore/rendering/RenderSlider.cpp @@ -76,21 +76,21 @@ void RenderSlider::computePreferredLogicalWidths() m_maxPreferredLogicalWidth = 0; if (style()->width().isFixed() && style()->width().value() > 0) - m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = computeContentBoxLogicalWidth(style()->width().value()); + m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = adjustContentBoxLogicalWidthForBoxSizing(style()->width().value()); else m_maxPreferredLogicalWidth = defaultTrackLength * style()->effectiveZoom(); if (style()->minWidth().isFixed() && style()->minWidth().value() > 0) { - m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->minWidth().value())); - m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->minWidth().value())); + m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->minWidth().value())); + m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->minWidth().value())); } else if (style()->width().isPercent() || (style()->width().isAuto() && style()->height().isPercent())) m_minPreferredLogicalWidth = 0; else m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth; if (style()->maxWidth().isFixed()) { - m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->maxWidth().value())); - m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->maxWidth().value())); + m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->maxWidth().value())); + m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->maxWidth().value())); } LayoutUnit toAdd = borderAndPaddingWidth(); diff --git a/Source/WebCore/rendering/RenderTable.cpp b/Source/WebCore/rendering/RenderTable.cpp index 4f25944a6..9b247306a 100644 --- a/Source/WebCore/rendering/RenderTable.cpp +++ b/Source/WebCore/rendering/RenderTable.cpp @@ -212,7 +212,7 @@ void RenderTable::removeCaption(const RenderTableCaption* oldCaption) m_captions.remove(index); } -void RenderTable::computeLogicalWidth() +void RenderTable::updateLogicalWidth() { recalcSectionsIfNeeded(); @@ -346,7 +346,7 @@ void RenderTable::layout() initMaxMarginValues(); LayoutUnit oldLogicalWidth = logicalWidth(); - computeLogicalWidth(); + updateLogicalWidth(); if (logicalWidth() != oldLogicalWidth) { for (unsigned i = 0; i < m_captions.size(); i++) @@ -407,7 +407,7 @@ void RenderTable::layout() setLogicalHeight(logicalHeight() + borderAndPaddingBefore); if (!isOutOfFlowPositioned()) - computeLogicalHeight(); + updateLogicalHeight(); Length logicalHeightLength = style()->logicalHeight(); LayoutUnit computedLogicalHeight = 0; @@ -459,7 +459,7 @@ void RenderTable::layout() } if (isOutOfFlowPositioned()) - computeLogicalHeight(); + updateLogicalHeight(); // table can be containing block of positioned elements. // FIXME: Only pass true if width or height changed. diff --git a/Source/WebCore/rendering/RenderTable.h b/Source/WebCore/rendering/RenderTable.h index 46073c539..2e9ce21fa 100644 --- a/Source/WebCore/rendering/RenderTable.h +++ b/Source/WebCore/rendering/RenderTable.h @@ -261,7 +261,7 @@ private: virtual void setCellLogicalWidths(); - virtual void computeLogicalWidth() OVERRIDE; + virtual void updateLogicalWidth() OVERRIDE; LayoutUnit convertStyleLogicalWidthToComputedWidth(const Length& styleLogicalWidth, LayoutUnit availableWidth); diff --git a/Source/WebCore/rendering/RenderTableCell.cpp b/Source/WebCore/rendering/RenderTableCell.cpp index 05d0ad19a..e49ac10af 100644 --- a/Source/WebCore/rendering/RenderTableCell.cpp +++ b/Source/WebCore/rendering/RenderTableCell.cpp @@ -168,11 +168,11 @@ void RenderTableCell::computePreferredLogicalWidths() } } -void RenderTableCell::computeLogicalWidth() +void RenderTableCell::updateLogicalWidth() { } -void RenderTableCell::updateLogicalWidth(LayoutUnit w) +void RenderTableCell::setCellLogicalWidth(LayoutUnit w) { if (w == logicalWidth()) return; diff --git a/Source/WebCore/rendering/RenderTableCell.h b/Source/WebCore/rendering/RenderTableCell.h index 31ea56f59..f0cb33e51 100644 --- a/Source/WebCore/rendering/RenderTableCell.h +++ b/Source/WebCore/rendering/RenderTableCell.h @@ -76,7 +76,7 @@ public: virtual void computePreferredLogicalWidths(); - void updateLogicalWidth(LayoutUnit); + void setCellLogicalWidth(LayoutUnit); virtual int borderLeft() const; virtual int borderRight() const; @@ -175,7 +175,7 @@ private: virtual void willBeRemovedFromTree() OVERRIDE; - virtual void computeLogicalWidth() OVERRIDE; + virtual void updateLogicalWidth() OVERRIDE; virtual void paintBoxDecorations(PaintInfo&, const LayoutPoint&); virtual void paintMask(PaintInfo&, const LayoutPoint&); diff --git a/Source/WebCore/rendering/RenderTableSection.cpp b/Source/WebCore/rendering/RenderTableSection.cpp index 62379085d..8f084779a 100644 --- a/Source/WebCore/rendering/RenderTableSection.cpp +++ b/Source/WebCore/rendering/RenderTableSection.cpp @@ -294,7 +294,7 @@ void RenderTableSection::setCellLogicalWidths() } cell->repaint(); } - cell->updateLogicalWidth(w); + cell->setCellLogicalWidth(w); } } } diff --git a/Source/WebCore/rendering/RenderTextControl.cpp b/Source/WebCore/rendering/RenderTextControl.cpp index cb7637db3..c0d72cda9 100644 --- a/Source/WebCore/rendering/RenderTextControl.cpp +++ b/Source/WebCore/rendering/RenderTextControl.cpp @@ -144,7 +144,7 @@ int RenderTextControl::scrollbarThickness() const return ScrollbarTheme::theme()->scrollbarThickness(); } -void RenderTextControl::computeLogicalHeight() +void RenderTextControl::updateLogicalHeight() { HTMLElement* innerText = innerTextElement(); ASSERT(innerText); @@ -157,7 +157,7 @@ void RenderTextControl::computeLogicalHeight() setHeight(height() + scrollbarThickness()); } - RenderBlock::computeLogicalHeight(); + RenderBlock::updateLogicalHeight(); } void RenderTextControl::hitInnerTextElement(HitTestResult& result, const LayoutPoint& pointInContainer, const LayoutPoint& accumulatedOffset) @@ -262,7 +262,7 @@ void RenderTextControl::computePreferredLogicalWidths() m_maxPreferredLogicalWidth = 0; if (style()->width().isFixed() && style()->width().value() >= 0) - m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = computeContentBoxLogicalWidth(style()->width().value()); + m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth = adjustContentBoxLogicalWidthForBoxSizing(style()->width().value()); else { // Use average character width. Matches IE. AtomicString family = style()->font().family().family(); @@ -272,16 +272,16 @@ void RenderTextControl::computePreferredLogicalWidths() } if (style()->minWidth().isFixed() && style()->minWidth().value() > 0) { - m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->minWidth().value())); - m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->minWidth().value())); + m_maxPreferredLogicalWidth = max(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->minWidth().value())); + m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->minWidth().value())); } else if (style()->width().isPercent() || (style()->width().isAuto() && style()->height().isPercent())) m_minPreferredLogicalWidth = 0; else m_minPreferredLogicalWidth = m_maxPreferredLogicalWidth; if (style()->maxWidth().isFixed()) { - m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->maxWidth().value())); - m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, computeContentBoxLogicalWidth(style()->maxWidth().value())); + m_maxPreferredLogicalWidth = min(m_maxPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->maxWidth().value())); + m_minPreferredLogicalWidth = min(m_minPreferredLogicalWidth, adjustContentBoxLogicalWidthForBoxSizing(style()->maxWidth().value())); } LayoutUnit toAdd = borderAndPaddingWidth(); diff --git a/Source/WebCore/rendering/RenderTextControl.h b/Source/WebCore/rendering/RenderTextControl.h index 6d0e43af1..4fe4da571 100644 --- a/Source/WebCore/rendering/RenderTextControl.h +++ b/Source/WebCore/rendering/RenderTextControl.h @@ -62,7 +62,7 @@ protected: virtual RenderStyle* textBaseStyle() const = 0; virtual void updateFromElement(); - virtual void computeLogicalHeight() OVERRIDE; + virtual void updateLogicalHeight() OVERRIDE; virtual RenderObject* layoutSpecialExcludedChild(bool relayoutChildren); private: diff --git a/Source/WebCore/rendering/RenderThemeChromiumCommon.cpp b/Source/WebCore/rendering/RenderThemeChromiumCommon.cpp index 68de37b12..9dbf0bd44 100644 --- a/Source/WebCore/rendering/RenderThemeChromiumCommon.cpp +++ b/Source/WebCore/rendering/RenderThemeChromiumCommon.cpp @@ -26,7 +26,8 @@ #include "config.h" #include "RenderThemeChromiumCommon.h" -#include "InputType.h" +#include "FractionalLayoutUnit.h" +#include "InputTypeNames.h" namespace WebCore { diff --git a/Source/WebCore/rendering/RenderView.cpp b/Source/WebCore/rendering/RenderView.cpp index c79c66426..141ea52b6 100644 --- a/Source/WebCore/rendering/RenderView.cpp +++ b/Source/WebCore/rendering/RenderView.cpp @@ -90,13 +90,13 @@ bool RenderView::hitTest(const HitTestRequest& request, HitTestResult& result) return layer()->hitTest(request, result); } -void RenderView::computeLogicalHeight() +void RenderView::updateLogicalHeight() { if (!shouldUsePrintingLayout() && m_frameView) setLogicalHeight(viewLogicalHeight()); } -void RenderView::computeLogicalWidth() +void RenderView::updateLogicalWidth() { if (!shouldUsePrintingLayout() && m_frameView) setLogicalWidth(viewLogicalWidth()); diff --git a/Source/WebCore/rendering/RenderView.h b/Source/WebCore/rendering/RenderView.h index 4848ca9bb..e6d832b97 100644 --- a/Source/WebCore/rendering/RenderView.h +++ b/Source/WebCore/rendering/RenderView.h @@ -58,8 +58,8 @@ public: virtual bool isChildAllowed(RenderObject*, RenderStyle*) const OVERRIDE; virtual void layout() OVERRIDE; - virtual void computeLogicalWidth() OVERRIDE; - virtual void computeLogicalHeight() OVERRIDE; + virtual void updateLogicalWidth() OVERRIDE; + virtual void updateLogicalHeight() OVERRIDE; // FIXME: This override is not needed and should be removed // it only exists to make computePreferredLogicalWidths public. virtual void computePreferredLogicalWidths() OVERRIDE; diff --git a/Source/WebCore/rendering/WrapShapeInfo.cpp b/Source/WebCore/rendering/WrapShapeInfo.cpp index 8ef73c7fc..0a16cc51f 100644 --- a/Source/WebCore/rendering/WrapShapeInfo.cpp +++ b/Source/WebCore/rendering/WrapShapeInfo.cpp @@ -105,37 +105,28 @@ void WrapShapeInfo::computeShapeSize(LayoutUnit logicalWidth, LayoutUnit logical // FIXME: Bug 89993: The wrap shape may come from the parent object BasicShape* shape = m_block->style()->wrapShapeInside(); - ASSERT(shape); - switch (shape->type()) { - case BasicShape::BASIC_SHAPE_RECTANGLE: { - BasicShapeRectangle* rect = static_cast<BasicShapeRectangle *>(shape); - m_shapeLeft = valueForLength(rect->x(), m_logicalWidth); - m_shapeWidth = valueForLength(rect->width(), m_logicalWidth); - m_shapeTop = valueForLength(rect->y(), m_logicalHeight); - m_shapeHeight = valueForLength(rect->height(), m_logicalHeight); - break; - } - // FIXME: Bug 89707: Enable shape inside for non-rectangular shapes - case BasicShape::BASIC_SHAPE_CIRCLE: - case BasicShape::BASIC_SHAPE_ELLIPSE: - case BasicShape::BASIC_SHAPE_POLYGON: { - notImplemented(); - break; - } - } + m_shape = ExclusionShape::createExclusionShape(shape, logicalWidth, logicalHeight); + ASSERT(m_shape); } bool WrapShapeInfo::computeSegmentsForLine(LayoutUnit lineTop) { m_lineTop = lineTop; m_segments.clear(); + if (lineState() == LINE_INSIDE_SHAPE) { - LineSegment segment; - segment.logicalLeft = m_shapeLeft; - segment.logicalRight = m_shapeLeft + m_shapeWidth; - m_segments.append(segment); + ASSERT(m_shape); + + Vector<ExclusionInterval> intervals; + m_shape->getInsideIntervals(lineTop, lineTop, intervals); // FIXME: Bug 95479, workaround for now + for (size_t i = 0; i < intervals.size(); i++) { + LineSegment segment; + segment.logicalLeft = intervals[i].x1; + segment.logicalRight = intervals[i].x2; + m_segments.append(segment); + } } return m_segments.size(); } diff --git a/Source/WebCore/rendering/WrapShapeInfo.h b/Source/WebCore/rendering/WrapShapeInfo.h index a8036d0bb..f996b6419 100644 --- a/Source/WebCore/rendering/WrapShapeInfo.h +++ b/Source/WebCore/rendering/WrapShapeInfo.h @@ -32,7 +32,10 @@ #if ENABLE(CSS_EXCLUSIONS) +#include "ExclusionShape.h" +#include "FloatRect.h" #include "LayoutTypesInlineMethods.h" +#include <wtf/OwnPtr.h> #include <wtf/PassOwnPtr.h> #include <wtf/Vector.h> @@ -64,14 +67,18 @@ public: static void removeWrapShapeInfoForRenderBlock(const RenderBlock*); static bool isWrapShapeInfoEnabledForRenderBlock(const RenderBlock*); - LayoutUnit shapeTop() const { return m_shapeTop; } + LayoutUnit shapeLogicalTop() const + { + ASSERT(m_shape); + return m_shape->shapeLogicalBoundingBox().y(); + } bool hasSegments() const; const SegmentList& segments() const { ASSERT(hasSegments()); return m_segments; } - bool computeSegmentsForLine(LayoutUnit); + bool computeSegmentsForLine(LayoutUnit lineTop); LineState lineState() const; void computeShapeSize(LayoutUnit logicalWidth, LayoutUnit logicalHeight); void dirtyWrapShapeSize() { m_wrapShapeSizeDirty = true; } @@ -80,10 +87,7 @@ private: WrapShapeInfo(RenderBlock*); RenderBlock* m_block; - LayoutUnit m_shapeLeft; - LayoutUnit m_shapeTop; - LayoutUnit m_shapeWidth; - LayoutUnit m_shapeHeight; + OwnPtr<ExclusionShape> m_shape; LayoutUnit m_lineTop; LayoutUnit m_logicalWidth; @@ -95,10 +99,15 @@ private: inline WrapShapeInfo::LineState WrapShapeInfo::lineState() const { - if (m_lineTop < m_shapeTop) + ASSERT(m_shape); + FloatRect shapeBounds = m_shape->shapeLogicalBoundingBox(); + + if (m_lineTop < shapeBounds.y()) return LINE_BEFORE_SHAPE; - if (m_lineTop < m_shapeTop + m_shapeHeight) + + if (m_lineTop < shapeBounds.maxY()) return LINE_INSIDE_SHAPE; + return LINE_AFTER_SHAPE; } diff --git a/Source/WebCore/rendering/svg/RenderSVGForeignObject.cpp b/Source/WebCore/rendering/svg/RenderSVGForeignObject.cpp index acc0c6d36..fe0d9a12b 100644 --- a/Source/WebCore/rendering/svg/RenderSVGForeignObject.cpp +++ b/Source/WebCore/rendering/svg/RenderSVGForeignObject.cpp @@ -105,14 +105,14 @@ const AffineTransform& RenderSVGForeignObject::localToParentTransform() const return m_localToParentTransform; } -void RenderSVGForeignObject::computeLogicalWidth() +void RenderSVGForeignObject::updateLogicalWidth() { // FIXME: Investigate in size rounding issues // FIXME: Remove unnecessary rounding when layout is off ints: webkit.org/b/63656 setWidth(static_cast<int>(roundf(m_viewport.width()))); } -void RenderSVGForeignObject::computeLogicalHeight() +void RenderSVGForeignObject::updateLogicalHeight() { // FIXME: Investigate in size rounding issues // FIXME: Remove unnecessary rounding when layout is off ints: webkit.org/b/63656 diff --git a/Source/WebCore/rendering/svg/RenderSVGForeignObject.h b/Source/WebCore/rendering/svg/RenderSVGForeignObject.h index 0d65d5741..1f37a3fcf 100644 --- a/Source/WebCore/rendering/svg/RenderSVGForeignObject.h +++ b/Source/WebCore/rendering/svg/RenderSVGForeignObject.h @@ -59,8 +59,8 @@ public: virtual void setNeedsTransformUpdate() { m_needsTransformUpdate = true; } private: - virtual void computeLogicalWidth() OVERRIDE; - virtual void computeLogicalHeight() OVERRIDE; + virtual void updateLogicalWidth() OVERRIDE; + virtual void updateLogicalHeight() OVERRIDE; virtual const AffineTransform& localToParentTransform() const; virtual AffineTransform localTransform() const { return m_localTransform; } diff --git a/Source/WebCore/rendering/svg/RenderSVGRoot.cpp b/Source/WebCore/rendering/svg/RenderSVGRoot.cpp index f7115d926..747679266 100644 --- a/Source/WebCore/rendering/svg/RenderSVGRoot.cpp +++ b/Source/WebCore/rendering/svg/RenderSVGRoot.cpp @@ -229,8 +229,8 @@ void RenderSVGRoot::layout() LayoutRepainter repainter(*this, checkForRepaintDuringLayout() && needsLayout); LayoutSize oldSize = size(); - computeLogicalWidth(); - computeLogicalHeight(); + updateLogicalWidth(); + updateLogicalHeight(); buildLocalToBorderBoxTransform(); SVGSVGElement* svg = static_cast<SVGSVGElement*>(node()); diff --git a/Source/WebCore/svg/SVGPointList.cpp b/Source/WebCore/svg/SVGPointList.cpp index be4009a70..2e05960d7 100644 --- a/Source/WebCore/svg/SVGPointList.cpp +++ b/Source/WebCore/svg/SVGPointList.cpp @@ -36,7 +36,7 @@ String SVGPointList::valueAsString() const unsigned size = this->size(); for (unsigned i = 0; i < size; ++i) { if (i > 0) - builder.append(" "); // FIXME: Shouldn't we use commas to seperate? + builder.append(' '); // FIXME: Shouldn't we use commas to seperate? const FloatPoint& point = at(i); builder.append(String::number(point.x()) + ' ' + String::number(point.y())); diff --git a/Source/WebCore/svg/animation/SMILTimeContainer.cpp b/Source/WebCore/svg/animation/SMILTimeContainer.cpp index bdf004f2c..1e4627bc2 100644 --- a/Source/WebCore/svg/animation/SMILTimeContainer.cpp +++ b/Source/WebCore/svg/animation/SMILTimeContainer.cpp @@ -204,18 +204,6 @@ void SMILTimeContainer::sortByPriority(Vector<SVGSMILElement*>& smilElements, SM updateDocumentOrderIndexes(); std::sort(smilElements.begin(), smilElements.end(), PriorityCompare(elapsed)); } - -static bool applyOrderSortFunction(SVGSMILElement* a, SVGSMILElement* b) -{ - if (!a->hasTagName(SVGNames::animateTransformTag) && b->hasTagName(SVGNames::animateTransformTag)) - return true; - return false; -} - -static void sortByApplyOrder(Vector<SVGSMILElement*>& smilElements) -{ - std::sort(smilElements.begin(), smilElements.end(), applyOrderSortFunction); -} void SMILTimeContainer::updateAnimations(SMILTime elapsed, bool seekToTime) { @@ -229,12 +217,11 @@ void SMILTimeContainer::updateAnimations(SMILTime elapsed, bool seekToTime) // FIXME: This should also consider timing relationships between the elements. Dependents // have higher priority. sortByPriority(toAnimate, elapsed); - + // Calculate animation contributions. typedef pair<SVGElement*, QualifiedName> ElementAttributePair; - typedef HashMap<ElementAttributePair, RefPtr<SVGSMILElement> > ResultElementMap; + typedef HashMap<ElementAttributePair, SVGSMILElement*> ResultElementMap; ResultElementMap resultsElements; - HashSet<SVGSMILElement*> contributingElements; for (unsigned n = 0; n < toAnimate.size(); ++n) { SVGSMILElement* animation = toAnimate[n]; ASSERT(animation->timeContainer() == this); @@ -242,7 +229,7 @@ void SMILTimeContainer::updateAnimations(SMILTime elapsed, bool seekToTime) SVGElement* targetElement = animation->targetElement(); if (!targetElement) continue; - + QualifiedName attributeName = animation->attributeName(); if (attributeName == anyQName()) { if (animation->hasTagName(SVGNames::animateMotionTag)) @@ -250,51 +237,36 @@ void SMILTimeContainer::updateAnimations(SMILTime elapsed, bool seekToTime) else continue; } - + // Results are accumulated to the first animation that animates and contributes to a particular element/attribute pair. ElementAttributePair key(targetElement, attributeName); - SVGSMILElement* resultElement = resultsElements.get(key).get(); - bool accumulatedResultElement = false; + SVGSMILElement* resultElement = resultsElements.get(key); if (!resultElement) { if (!animation->hasValidAttributeType()) continue; resultElement = animation; - resultsElements.add(key, resultElement); - accumulatedResultElement = true; - } + } else + ASSERT(resultElement != animation); // This will calculate the contribution from the animation and add it to the resultsElement. - if (animation->progress(elapsed, resultElement, seekToTime)) - contributingElements.add(resultElement); - else if (accumulatedResultElement) - resultsElements.remove(key); + if (animation->progress(elapsed, resultElement, seekToTime) && resultElement == animation) + resultsElements.add(key, resultElement); SMILTime nextFireTime = animation->nextProgressTime(); if (nextFireTime.isFinite()) earliersFireTime = min(nextFireTime, earliersFireTime); } - - Vector<SVGSMILElement*> animationsToApply; - ResultElementMap::iterator end = resultsElements.end(); - for (ResultElementMap::iterator it = resultsElements.begin(); it != end; ++it) { - SVGSMILElement* animation = it->second.get(); - if (contributingElements.contains(animation)) - animationsToApply.append(animation); - } - unsigned animationsToApplySize = animationsToApply.size(); - if (!animationsToApplySize) { + unsigned resultsToApplySize = resultsElements.size(); + if (!resultsToApplySize) { startTimer(earliersFireTime, animationFrameDelay); return; } - // Sort <animateTranform> to be the last one to be applied. <animate> may change transform attribute as - // well (directly or indirectly by modifying <use> x/y) and this way transforms combine properly. - sortByApplyOrder(animationsToApply); - // Apply results to target elements. - for (unsigned i = 0; i < animationsToApplySize; ++i) - animationsToApply[i]->applyResultsToTarget(); + ResultElementMap::iterator end = resultsElements.end(); + for (ResultElementMap::iterator it = resultsElements.begin(); it != end; ++it) + it->second->applyResultsToTarget(); startTimer(earliersFireTime, animationFrameDelay); Document::updateStyleForAllDocuments(); diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog index 9e13907e8..4084fc269 100644 --- a/Source/WebKit/ChangeLog +++ b/Source/WebKit/ChangeLog @@ -1,3 +1,36 @@ +2012-09-11 Raphael Kubo da Costa <rakuco@webkit.org> + + [EFL] Rewrite the EFL-related Find modules + https://bugs.webkit.org/show_bug.cgi?id=95237 + + Reviewed by Kenneth Rohde Christiansen. + + * PlatformEfl.cmake: Stop setting the LINK_FLAGS property and add + libraries and include directories for each Enlightenment + Foundation Library used by the port. + +2012-09-11 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> + + [Qt] Add a configure step to the Qt build system + + This allows building the Qt port using just 'qmake WebKit.pro'. Using + the build-webkit script is still supported, and will add slightly more + logic to the build, such as detecting the need for clean or incremental + builds. + + Internally, the build system now uses a new variable, WEBKIT_CONFIG, for + all things related to configuring the build, such as use/have/enable flags, + and these are translated to defines in default_post. Project files should + no longer check contains(DEFINES,...) to detect features, but use the new + enable?(), use?(), and have?() functions. The no_webkit1 and no_webkit2 + options have been translated into WEBKIT_CONFIG options as well, and can + be checked using build?(). + + Reviewed by Simon Hausmann. + + * WebKit1.pri: + * WebKit1.pro: + 2012-09-06 Crystal Zhang <haizhang@rim.com> [BlackBerry] Implement a color picker diff --git a/Source/WebKit/PlatformEfl.cmake b/Source/WebKit/PlatformEfl.cmake index 84f0240a3..80d1c0736 100644 --- a/Source/WebKit/PlatformEfl.cmake +++ b/Source/WebKit/PlatformEfl.cmake @@ -1,11 +1,3 @@ -LIST(APPEND WebKit_LINK_FLAGS - ${ECORE_X_LDFLAGS} - ${EDJE_LDFLAGS} - ${EFLDEPS_LDFLAGS} - ${EFREET_LDFLAGS} - ${EVAS_LDFLAGS} -) - LIST(APPEND WebKit_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/Source" "${WEBKIT_DIR}/efl/ewk" @@ -16,13 +8,14 @@ LIST(APPEND WebKit_INCLUDE_DIRECTORIES "${WEBCORE_DIR}/platform/graphics/efl" "${WEBCORE_DIR}/platform/network/soup" ${CAIRO_INCLUDE_DIRS} - ${ECORE_X_INCLUDE_DIRS} + ${ECORE_INCLUDE_DIRS} + ${ECORE_EVAS_INCLUDE_DIRS} + ${ECORE_INPUT_INCLUDE_DIRS} ${EDJE_INCLUDE_DIRS} - ${EFLDEPS_INCLUDE_DIRS} ${EFREET_INCLUDE_DIRS} + ${EINA_INCLUDE_DIRS} ${EVAS_INCLUDE_DIRS} - ${EUKIT_INCLUDE_DIRS} - ${EDBUS_INCLUDE_DIRS} + ${HARFBUZZ_INCLUDE_DIRS} ${LIBXML2_INCLUDE_DIR} ${LIBXSLT_INCLUDE_DIR} ${SQLITE_INCLUDE_DIR} @@ -141,12 +134,13 @@ LIST(APPEND WebKit_SOURCES LIST(APPEND WebKit_LIBRARIES ${CAIRO_LIBRARIES} - ${ECORE_X_LIBRARIES} - ${EFLDEPS_LIBRARIES} + ${ECORE_LIBRARIES} + ${ECORE_EVAS_LIBRARIES} + ${ECORE_INPUT_LIBRARIES} ${EFREET_LIBRARIES} - ${EUKIT_LIBRARIES} - ${EDBUS_LIBRARIES} + ${EVAS_LIBRARIES} ${FREETYPE_LIBRARIES} + ${HARFBUZZ_LIBRARIES} ${LIBXML2_LIBRARIES} ${SQLITE_LIBRARIES} ${FONTCONFIG_LIBRARIES} @@ -309,13 +303,6 @@ SET(EWKUnitTests_INCLUDE_DIRECTORIES ${EDJE_INCLUDE_DIRS} ) -SET(EWKUnitTests_LINK_FLAGS - ${ECORE_LDFLAGS} - ${ECORE_EVAS_LDFLAGS} - ${EVAS_LDFLAGS} - ${EDJE_LDFLAGS} -) - IF (ENABLE_GLIB_SUPPORT) LIST(APPEND EWKUnitTests_INCLUDE_DIRECTORIES "${WTF_DIR}/wtf/gobject") LIST(APPEND EWKUnitTests_LIBRARIES @@ -349,7 +336,6 @@ IF (ENABLE_API_TESTS) ADD_TEST(${testName} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${testName}) SET_TESTS_PROPERTIES(${testName} PROPERTIES TIMEOUT 60) TARGET_LINK_LIBRARIES(${testName} ${EWKUnitTests_LIBRARIES} ewkTestUtils) - ADD_TARGET_PROPERTIES(${testName} LINK_FLAGS "${EWKUnitTests_LINK_FLAGS}") SET_TARGET_PROPERTIES(${testName} PROPERTIES FOLDER "WebKit") ENDFOREACH () ENDIF () diff --git a/Source/WebKit/WebKit1.pri b/Source/WebKit/WebKit1.pri index cadb77e14..fa2f6fa34 100644 --- a/Source/WebKit/WebKit1.pri +++ b/Source/WebKit/WebKit1.pri @@ -12,7 +12,7 @@ INCLUDEPATH += \ $$SOURCE_DIR/qt/WebCoreSupport \ $$ROOT_WEBKIT_DIR/Source/WTF/wtf/qt -contains(DEFINES, ENABLE_VIDEO=1):contains(DEFINES, WTF_USE_QTKIT=1) { +enable?(VIDEO):use?(QTKIT) { LIBS += -framework Security -framework IOKit # We can know the Mac OS version by using the Darwin major version @@ -29,21 +29,21 @@ contains(DEFINES, ENABLE_VIDEO=1):contains(DEFINES, WTF_USE_QTKIT=1) { } } -contains(DEFINES, ENABLE_DEVICE_ORIENTATION=1)|contains(DEFINES, ENABLE_ORIENTATION_EVENTS=1) { +enable?(DEVICE_ORIENTATION)|enable?(ORIENTATION_EVENTS) { QT += sensors } -contains(DEFINES, ENABLE_GEOLOCATION=1): QT += location +enable?(GEOLOCATION): QT += location contains(CONFIG, texmap): DEFINES += WTF_USE_TEXTURE_MAPPER=1 -plugin_backend_xlib: PKGCONFIG += x11 +use?(PLUGIN_BACKEND_XLIB): PKGCONFIG += x11 QT += network widgets -contains(DEFINES, HAVE_QTQUICK=1): QT += quick -contains(DEFINES, HAVE_QTPRINTSUPPORT=1): QT += printsupport +have?(QTQUICK): QT += quick +have?(QTPRINTSUPPORT): QT += printsupport -contains(DEFINES, WTF_USE_TEXTURE_MAPPER_GL=1)|contains(DEFINES, ENABLE_WEBGL=1) { +use?(TEXTURE_MAPPER_GL)|enable?(WEBGL) { QT *= opengl # Make sure OpenGL libs are after the webcore lib so MinGW can resolve symbols win32*:!win32-msvc*: LIBS += $$QMAKE_LIBS_OPENGL diff --git a/Source/WebKit/WebKit1.pro b/Source/WebKit/WebKit1.pro index b29b7bd27..ae23c4eca 100644 --- a/Source/WebKit/WebKit1.pro +++ b/Source/WebKit/WebKit1.pro @@ -103,18 +103,18 @@ INCLUDEPATH += \ $$PWD/qt/Api \ $$PWD/qt/WebCoreSupport -contains(DEFINES, ENABLE_VIDEO=1) { - !contains(DEFINES, WTF_USE_QTKIT=1):!contains(DEFINES, WTF_USE_GSTREAMER=1):contains(DEFINES, WTF_USE_QT_MULTIMEDIA=1) { +enable?(VIDEO) { + !use?(QTKIT):!use?(GSTREAMER):use?(QT_MULTIMEDIA) { HEADERS += $$PWD/qt/WebCoreSupport/FullScreenVideoWidget.h SOURCES += $$PWD/qt/WebCoreSupport/FullScreenVideoWidget.cpp } - contains(DEFINES, WTF_USE_QTKIT=1) | contains(DEFINES, WTF_USE_GSTREAMER=1) | contains(DEFINES, WTF_USE_QT_MULTIMEDIA=1) { + use?(QTKIT) | use?(GSTREAMER) | use?(QT_MULTIMEDIA) { HEADERS += $$PWD/qt/WebCoreSupport/FullScreenVideoQt.h SOURCES += $$PWD/qt/WebCoreSupport/FullScreenVideoQt.cpp } - contains(DEFINES, WTF_USE_QTKIT=1) { + use?(QTKIT) { INCLUDEPATH += \ $$PWD/../WebCore/platform/qt/ \ $$PWD/../WebCore/platform/mac/ \ @@ -136,7 +136,7 @@ contains(DEFINES, ENABLE_VIDEO=1) { } } -contains(DEFINES, ENABLE_ICONDATABASE=1) { +enable?(ICONDATABASE) { HEADERS += \ $$PWD/../WebCore/loader/icon/IconDatabaseClient.h \ $$PWD/qt/WebCoreSupport/IconDatabaseClientQt.h @@ -145,12 +145,12 @@ contains(DEFINES, ENABLE_ICONDATABASE=1) { $$PWD/qt/WebCoreSupport/IconDatabaseClientQt.cpp } -contains(DEFINES, ENABLE_GEOLOCATION=1) { +enable?(GEOLOCATION) { HEADERS += \ $$PWD/qt/WebCoreSupport/GeolocationClientQt.h SOURCES += \ $$PWD/qt/WebCoreSupport/GeolocationClientQt.cpp } -contains(DEFINES, WTF_USE_3D_GRAPHICS=1): WEBKIT += angle +use?(3D_GRAPHICS): WEBKIT += angle diff --git a/Source/WebKit/blackberry/Api/InRegionScroller.cpp b/Source/WebKit/blackberry/Api/InRegionScroller.cpp index 6b367b10f..1c1508f7f 100644 --- a/Source/WebKit/blackberry/Api/InRegionScroller.cpp +++ b/Source/WebKit/blackberry/Api/InRegionScroller.cpp @@ -362,7 +362,21 @@ static bool canScrollInnerFrame(Frame* frame) // FIXME: Fix RenderBox::canBeScrolledAndHasScrollableArea method instead. static bool canScrollRenderBox(RenderBox* box) { - if (!box || !box->hasOverflowClip()) + if (!box) + return false; + + // We use this to make non-overflown contents layers to actually + // be overscrollable. + if (box->layer() && box->layer()->usesCompositedScrolling() + && box->layer()->enclosingElement() && box->layer()->enclosingElement()->isElementNode()) { + DEFINE_STATIC_LOCAL(QualifiedName, forceOverscrollAttr, (nullAtom, "data-blackberry-force-overscroll", nullAtom)); + + Element* element = static_cast<Element*>(box->layer()->enclosingElement()); + if (element->fastHasAttribute(forceOverscrollAttr)) + return true; + } + + if (!box->hasOverflowClip()) return false; if (box->scrollsOverflowX() && (box->scrollWidth() != box->clientWidth()) diff --git a/Source/WebKit/blackberry/Api/WebPage.cpp b/Source/WebKit/blackberry/Api/WebPage.cpp index 2052b0e82..8ec9dd7f5 100644 --- a/Source/WebKit/blackberry/Api/WebPage.cpp +++ b/Source/WebKit/blackberry/Api/WebPage.cpp @@ -1486,6 +1486,9 @@ void WebPagePrivate::notifyInRegionScrollStopped() { if (m_inRegionScroller->d->isActive()) { enqueueRenderingOfClippedContentOfScrollableAreaAfterInRegionScrolling(); + // Notify the client side to clear InRegion scrollable areas before we destroy them here. + std::vector<Platform::ScrollViewBase*> emptyInRegionScrollableAreas; + m_client->notifyInRegionScrollableAreasChanged(emptyInRegionScrollableAreas); m_inRegionScroller->d->reset(); } } @@ -4156,7 +4159,7 @@ void WebPagePrivate::setScrollOriginPoint(const Platform::IntPoint& point) m_inRegionScroller->d->calculateInRegionScrollableAreasForPoint(point); if (!m_inRegionScroller->d->activeInRegionScrollableAreas().empty()) - m_client->notifyInRegionScrollingStartingPointChanged(m_inRegionScroller->d->activeInRegionScrollableAreas()); + m_client->notifyInRegionScrollableAreasChanged(m_inRegionScroller->d->activeInRegionScrollableAreas()); } void WebPage::setScrollOriginPoint(const Platform::IntPoint& point) diff --git a/Source/WebKit/blackberry/Api/WebPageClient.h b/Source/WebKit/blackberry/Api/WebPageClient.h index 137c81e87..bd8c73ba4 100644 --- a/Source/WebKit/blackberry/Api/WebPageClient.h +++ b/Source/WebKit/blackberry/Api/WebPageClient.h @@ -101,7 +101,7 @@ public: virtual void notifyRunLayoutTestsFinished() = 0; - virtual void notifyInRegionScrollingStartingPointChanged(const std::vector<Platform::ScrollViewBase*>&) = 0; + virtual void notifyInRegionScrollableAreasChanged(const std::vector<Platform::ScrollViewBase*>&) = 0; virtual void notifyNoMouseMoveOrTouchMoveHandlers() = 0; virtual void notifyDocumentOnLoad(bool) = 0; diff --git a/Source/WebKit/blackberry/ChangeLog b/Source/WebKit/blackberry/ChangeLog index 823f9b8b0..f7418cb77 100644 --- a/Source/WebKit/blackberry/ChangeLog +++ b/Source/WebKit/blackberry/ChangeLog @@ -1,3 +1,158 @@ +2012-09-11 Jinwoo Song <jinwoo7.song@samsung.com> + + Deploy StringBuilder::appendNumber() and StringBuilder::appendLiteral() in more places + https://bugs.webkit.org/show_bug.cgi?id=96344 + + Reviewed by Benjamin Poulain. + + Use StringBuilder::appendNumber() instead of String::number(). Also deploy + StringBuilder::appendLiteral() instead of String::append() in the surrounding code. + + * WebCoreSupport/DatePickerClient.cpp: + (WebCore::DatePickerClient::generateHTML): + * WebCoreSupport/SelectPopupClient.cpp: + (WebCore::SelectPopupClient::generateHTML): + +2012-09-11 Jacky Jiang <zhajiang@rim.com> + + [BlackBerry] InRegion scrollable area dangling pointers were accessed in UI thread + https://bugs.webkit.org/show_bug.cgi?id=96318 + + Reviewed by Antonio Gomes. + + PR: 204066 + Dangling pointers were accessed in UI thread, as the actual InRegion + scrollable areas of WebKit side had been destroyed before that in + WebKit thread after UI thread set scrolling to false. + Notify the client side to clear InRegion scrollable areas before we + destroy them in WebKit side. + + Internally reviewed by Gen Mak and George Staikos. + + * Api/WebPage.cpp: + (BlackBerry::WebKit::WebPagePrivate::notifyInRegionScrollStopped): + (BlackBerry::WebKit::WebPagePrivate::setScrollOriginPoint): + * Api/WebPageClient.h: + +2012-09-11 Mike Fenton <mifenton@rim.com> + + [BlackBerry] Suppress keyboard requests while processing spell checking suggestions. + https://bugs.webkit.org/show_bug.cgi?id=96394 + + Reviewed by Rob Buis. + + Suppress the VKB notification when the touch event + is a spell checking request. + + PR 192925. + + Reviewed Internally by Gen Mak. + + * WebKitSupport/TouchEventHandler.cpp: + (BlackBerry::WebKit::TouchEventHandler::handleTouchPoint): + +2012-09-11 Mike Fenton <mifenton@rim.com> + + [BlackBerry] Colour Dialog popup request should return proper state. + https://bugs.webkit.org/show_bug.cgi?id=96392 + + Reviewed by Rob Buis. + + Return proper state from openColorPopup dependent on + whether the popup actually opened. + + Reviewed Internally by Chris Hutten-Czapski + + * WebKitSupport/InputHandler.cpp: + (BlackBerry::WebKit::InputHandler::openColorPopup): + +2012-09-11 Nima Ghanavatian <nghanavatian@rim.com> + + [BlackBerry] Take account for single words that exceed our client character limit + https://bugs.webkit.org/show_bug.cgi?id=96389 + + Fix to the processing of long single-line text using getRangeForSpellCheckWithFineGranularity. + This was failing if a single word was longer than our maximum allowed limit. + + Internally reviewed by Mike Fenton. + + Reviewed by Rob Buis. + + * WebKitSupport/InputHandler.cpp: + (WebKit): + (BlackBerry::WebKit::InputHandler::getRangeForSpellCheckWithFineGranularity): + +2012-09-11 Arvid Nilsson <anilsson@rim.com> + + [BlackBerry] SelectionHandler drops caret change notifications + https://bugs.webkit.org/show_bug.cgi?id=96378 + + Reviewed by Antonio Gomes. + + The selection handler deliberately drops caret change notifications + while the input handler is processing changes, to avoid displaying + intermediate state during a complex change. + + However, this meant that the client was never informed of the final + caret position. + + Fixed by notifying client about caret change after processing ends, if + one or more caret change notifications were dropped during processing. + + PR #205073 + + Reviewed internally by Mike Fenton. + + * WebKitSupport/InputHandler.cpp: + (BlackBerry::WebKit::InputHandler::setProcessingChange): + (WebKit): + * WebKitSupport/InputHandler.h: + (InputHandler): + * WebKitSupport/SelectionHandler.cpp: + (BlackBerry::WebKit::SelectionHandler::SelectionHandler): + (BlackBerry::WebKit::SelectionHandler::inputHandlerDidFinishProcessingChange): + (WebKit): + (BlackBerry::WebKit::SelectionHandler::selectionPositionChanged): + (BlackBerry::WebKit::SelectionHandler::notifyCaretPositionChangedIfNeeded): + * WebKitSupport/SelectionHandler.h: + (SelectionHandler): + +2012-09-10 Antonio Gomes <agomes@rim.com> + + [BlackBerry] add a way to overscroll non-overflown content + https://bugs.webkit.org/show_bug.cgi?id=96331 + [UxD] Vertical lists should always be scrollable + PR #195305 + + Reviewed by Yong Li. + Internally reviewed by Gen Mak. + + Check if the RenderLayer is composited / hardware acceleratable prior to + check if its contents overflows. If that is the case, check if + our custom data-blackberry-force-overscroll is present. + + That makes it possible for us to align to UX requirements: settings + and CCM panels should be always scrollable. + + * Api/InRegionScroller.cpp: + (BlackBerry::WebKit::canScrollRenderBox): + * WebKitSupport/InRegionScrollableArea.cpp: + (BlackBerry::WebKit::InRegionScrollableArea::InRegionScrollableArea): + +2012-09-10 Genevieve Mak <gmak@rim.com> + + Change -data-blackberry-webworks-context to -data-webworks-context + because not all webworks apps are blackberry apps. + https://bugs.webkit.org/show_bug.cgi?id=96297 + + Reviewed by Antonio Gomes. + + PR #193726 + Rubber Stamped interally by Mike Fenton. + + * WebKitSupport/DOMSupport.cpp: + (BlackBerry::WebKit::DOMSupport::webWorksContext): + 2012-09-09 Arvid Nilsson <anilsson@rim.com> [BlackBerry] Fix flicker due to introduction of the fence extension. diff --git a/Source/WebKit/blackberry/WebCoreSupport/DatePickerClient.cpp b/Source/WebKit/blackberry/WebCoreSupport/DatePickerClient.cpp index 93f7fda26..b652bdf89 100644 --- a/Source/WebKit/blackberry/WebCoreSupport/DatePickerClient.cpp +++ b/Source/WebKit/blackberry/WebCoreSupport/DatePickerClient.cpp @@ -50,28 +50,28 @@ DatePickerClient::~DatePickerClient() void DatePickerClient::generateHTML(BlackBerry::Platform::BlackBerryInputType type, const BlackBerry::WebKit::WebString& value, const BlackBerry::WebKit::WebString& min, const BlackBerry::WebKit::WebString& max, double step) { StringBuilder source; - source.append("<style>\n"); + source.appendLiteral("<style>\n"); // Include CSS file. source.append(popupControlBlackBerryCss, sizeof(popupControlBlackBerryCss)); - source.append("</style>\n<style>"); + source.appendLiteral("</style>\n<style>"); source.append(timeControlBlackBerryCss, sizeof(timeControlBlackBerryCss)); - source.append("</style></head><body>\n"); - source.append("<script>\n"); - source.append("window.addEventListener('load', function () {"); + source.appendLiteral("</style></head><body>\n" + "<script>\n" + "window.addEventListener('load', function () {"); switch (type) { case BlackBerry::Platform::InputTypeDate: - source.append("window.popupcontrol.show(\"Date\", "); + source.appendLiteral("window.popupcontrol.show(\"Date\", "); break; case BlackBerry::Platform::InputTypeTime: - source.append("window.popupcontrol.show(\"Time\", "); + source.appendLiteral("window.popupcontrol.show(\"Time\", "); break; case BlackBerry::Platform::InputTypeDateTime: - source.append("window.popupcontrol.show(\"DateTime\", "); + source.appendLiteral("window.popupcontrol.show(\"DateTime\", "); break; case BlackBerry::Platform::InputTypeDateTimeLocal: - source.append("window.popupcontrol.show(\"DateTimeLocal\", "); + source.appendLiteral("window.popupcontrol.show(\"DateTimeLocal\", "); break; case BlackBerry::Platform::InputTypeMonth: case BlackBerry::Platform::InputTypeWeek: @@ -81,21 +81,21 @@ void DatePickerClient::generateHTML(BlackBerry::Platform::BlackBerryInputType ty if (!value.isEmpty()) source.append("\"" + String(value.impl()) + "\", "); else - source.append("0, "); + source.appendLiteral("0, "); if (!min.isEmpty()) source.append(String(min.impl()) + ", "); else - source.append("0, "); + source.appendLiteral("0, "); if (!max.isEmpty()) source.append(String(max.impl()) + ", "); else - source.append("0, "); + source.appendLiteral("0, "); source.append(String::number(step)); - source.append("); \n }); \n"); + source.appendLiteral("); \n }); \n"); source.append(timeControlBlackBerryJs, sizeof(timeControlBlackBerryJs)); - source.append("</script>\n"); - source.append("</body> </html>\n"); + source.appendLiteral("</script>\n" + "</body> </html>\n"); m_source = source.toString(); } diff --git a/Source/WebKit/blackberry/WebCoreSupport/SelectPopupClient.cpp b/Source/WebKit/blackberry/WebCoreSupport/SelectPopupClient.cpp index 138a6718f..8e71686d1 100644 --- a/Source/WebKit/blackberry/WebCoreSupport/SelectPopupClient.cpp +++ b/Source/WebKit/blackberry/WebCoreSupport/SelectPopupClient.cpp @@ -66,64 +66,70 @@ void SelectPopupClient::generateHTML(bool multiple, int size, const ScopeArray<B const int* itemType, bool* selecteds) { StringBuilder source; - source.append("<style>\n"); + source.appendLiteral("<style>\n"); // Include CSS file. source.append(popupControlBlackBerryCss, sizeof(popupControlBlackBerryCss)); - source.append("</style>\n<style>"); + source.appendLiteral("</style>\n<style>"); source.append(selectControlBlackBerryCss, sizeof(selectControlBlackBerryCss)); - source.append("</style></head><body>\n"); - source.append("<script>\n"); - source.append("window.addEventListener('load', function () {"); + source.appendLiteral("</style></head><body>\n" + "<script>\n" + "window.addEventListener('load', function () {"); if (m_multiple) - source.append("window.select.show(true, "); + source.appendLiteral("window.select.show(true, "); else - source.append("window.select.show(false, "); + source.appendLiteral("window.select.show(false, "); // Add labels. - source.append("["); + source.append('['); for (int i = 0; i < size; i++) { source.append("'" + String(labels[i].impl()).replace('\\', "\\\\").replace('\'', "\\'") + "'"); // Don't append ',' to last element. if (i != size - 1) - source.append(", "); + source.appendLiteral(", "); } - source.append("], "); + source.appendLiteral("], "); // Add enables. - source.append("["); + source.append('['); for (int i = 0; i < size; i++) { - source.append(enableds[i]? "true" : "false"); + if (enableds[i]) + source.appendLiteral("true"); + else + source.appendLiteral("false"); // Don't append ',' to last element. if (i != size - 1) - source.append(", "); + source.appendLiteral(", "); } - source.append("], "); + source.appendLiteral("], "); // Add itemType. - source.append("["); + source.append('['); for (int i = 0; i < size; i++) { - source.append(String::number(itemType[i])); + source.appendNumber(itemType[i]); // Don't append ',' to last element. if (i != size - 1) - source.append(", "); + source.appendLiteral(", "); } - source.append("], "); + source.appendLiteral("], "); // Add selecteds - source.append("["); + source.append('['); for (int i = 0; i < size; i++) { - source.append(selecteds[i]? "true" : "false"); + if (selecteds[i]) + source.appendLiteral("true"); + else + source.appendLiteral("false"); // Don't append ',' to last element. if (i != size - 1) - source.append(", "); + source.appendLiteral(", "); } - source.append("] "); - source.append(", 'Cancel'"); + source.appendLiteral("] " + ", 'Cancel'"); // If multi-select, add OK button for confirm. if (m_multiple) - source.append(", 'OK'"); - source.append("); \n }); \n"); + source.appendLiteral(", 'OK'"); + source.appendLiteral("); \n }); \n"); source.append(selectControlBlackBerryJs, sizeof(selectControlBlackBerryJs)); - source.append("</script>\n"); - source.append("</body> </html>\n"); + source.appendLiteral("</script>\n" + "</body> </html>\n"); m_source = source.toString(); } diff --git a/Source/WebKit/blackberry/WebKitSupport/DOMSupport.cpp b/Source/WebKit/blackberry/WebKitSupport/DOMSupport.cpp index 433b8cdc9..bb0a02851 100644 --- a/Source/WebKit/blackberry/WebKitSupport/DOMSupport.cpp +++ b/Source/WebKit/blackberry/WebKitSupport/DOMSupport.cpp @@ -121,7 +121,7 @@ WTF::String webWorksContext(const WebCore::Element* element) if (!element) return WTF::String(); - DEFINE_STATIC_LOCAL(QualifiedName, webworksContextAttr, (nullAtom, "data-blackberry-webworks-context", nullAtom)); + DEFINE_STATIC_LOCAL(QualifiedName, webworksContextAttr, (nullAtom, "data-webworks-context", nullAtom)); if (element->fastHasAttribute(webworksContextAttr)) return element->fastGetAttribute(webworksContextAttr); diff --git a/Source/WebKit/blackberry/WebKitSupport/InRegionScrollableArea.cpp b/Source/WebKit/blackberry/WebKitSupport/InRegionScrollableArea.cpp index 0e6c95432..f19a9712a 100644 --- a/Source/WebKit/blackberry/WebKitSupport/InRegionScrollableArea.cpp +++ b/Source/WebKit/blackberry/WebKitSupport/InRegionScrollableArea.cpp @@ -94,6 +94,7 @@ InRegionScrollableArea::InRegionScrollableArea(WebPagePrivate* webPage, RenderLa // Both caches below are self-exclusive. if (m_layer->usesCompositedScrolling()) { + m_forceContentToBeVerticallyScrollable = true; m_supportsCompositedScrolling = true; ASSERT(m_layer->backing()->hasScrollingLayer()); m_camouflagedCompositedScrollableLayer = reinterpret_cast<unsigned>(m_layer->backing()->scrollingContentsLayer()->platformLayer()); diff --git a/Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp b/Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp index 7e5d46262..6e8715a5e 100644 --- a/Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp +++ b/Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp @@ -338,6 +338,17 @@ static VirtualKeyboardEnterKeyType keyboardEnterKeyTypeAttribute(const WebCore:: return VKBEnterKeyNotSet; } +void InputHandler::setProcessingChange(bool processingChange) +{ + if (processingChange == m_processingChange) + return; + + m_processingChange = processingChange; + + if (!m_processingChange) + m_webPage->m_selectionHandler->inputHandlerDidFinishProcessingChange(); +} + WTF::String InputHandler::elementText() { if (!isActiveTextEdit()) @@ -927,14 +938,24 @@ void InputHandler::spellCheckBlock(VisibleSelection& visibleSelection, TextCheck PassRefPtr<Range> InputHandler::getRangeForSpellCheckWithFineGranularity(VisiblePosition startPosition, VisiblePosition endPosition) { VisiblePosition endOfCurrentWord = endOfWord(startPosition); - RefPtr<Range> rangeForSpellChecking; - while (endOfCurrentWord != endPosition) { - rangeForSpellChecking = VisibleSelection(startPosition, endOfCurrentWord).toNormalizedRange(); - // If we exceed the MaxSpellCheckingStringLength limit, then go back one word and return this range. - if (rangeForSpellChecking->text().length() >= MaxSpellCheckingStringLength) - return VisibleSelection(startPosition, endOfWord(previousWordPosition(endOfCurrentWord))).toNormalizedRange(); - endOfCurrentWord = endOfWord(nextWordPosition(endOfCurrentWord)); + // Keep iterating until one of our cases is hit, or we've incremented the starting position right to the end. + while (startPosition != endPosition) { + // Check the text length within this range. + if (VisibleSelection(startPosition, endOfCurrentWord).toNormalizedRange()->text().length() >= MaxSpellCheckingStringLength) { + // If this is not the first word, return a Range with end boundary set to the previous word. + if (startOfWord(endOfCurrentWord, LeftWordIfOnBoundary) != startPosition) + return VisibleSelection(startPosition, endOfWord(previousWordPosition(endOfCurrentWord), LeftWordIfOnBoundary)).toNormalizedRange(); + + // Our first word has gone over the character limit. Increment the starting position past an uncheckable word. + startPosition = endOfCurrentWord; + } else if (endOfCurrentWord == endPosition) { + // Return the last segment if the end of our word lies at the end of the range. + return VisibleSelection(startPosition, endPosition).toNormalizedRange(); + } else { + // Increment the current word. + endOfCurrentWord = endOfWord(nextWordPosition(endOfCurrentWord)); + } } return 0; } @@ -980,9 +1001,9 @@ bool InputHandler::openColorPopup(HTMLInputElement* element) // Check if popup already exists, close it if does. m_webPage->m_page->chrome()->client()->closePagePopup(0); + ColorPickerClient* client = new ColorPickerClient(element->value(), m_webPage, element); - m_webPage->m_page->chrome()->client()->openPagePopup(client, WebCore::IntRect()); - return true; + return m_webPage->m_page->chrome()->client()->openPagePopup(client, WebCore::IntRect()); } void InputHandler::setInputValue(const WTF::String& value) diff --git a/Source/WebKit/blackberry/WebKitSupport/InputHandler.h b/Source/WebKit/blackberry/WebKitSupport/InputHandler.h index f0ecb7dfe..e6d3297f7 100644 --- a/Source/WebKit/blackberry/WebKitSupport/InputHandler.h +++ b/Source/WebKit/blackberry/WebKitSupport/InputHandler.h @@ -110,7 +110,7 @@ public: void setPopupListIndexes(int size, const bool* selecteds); bool processingChange() const { return m_processingChange; } - void setProcessingChange(bool processingChange) { m_processingChange = processingChange; } + void setProcessingChange(bool); WTF::String elementText(); diff --git a/Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp b/Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp index 1e150c33e..f289cf5dc 100644 --- a/Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp +++ b/Source/WebKit/blackberry/WebKitSupport/SelectionHandler.cpp @@ -70,6 +70,7 @@ SelectionHandler::SelectionHandler(WebPagePrivate* page) , m_selectionActive(false) , m_caretActive(false) , m_lastUpdatedEndPointIsValid(false) + , m_didSuppressCaretPositionChangedNotification(false) { } @@ -270,6 +271,12 @@ void SelectionHandler::setCaretPosition(const WebCore::IntPoint &position) SelectionLog(LogLevelInfo, "SelectionHandler::setCaretPosition point valid, cursor updated"); } +void SelectionHandler::inputHandlerDidFinishProcessingChange() +{ + if (m_didSuppressCaretPositionChangedNotification) + notifyCaretPositionChangedIfNeeded(); +} + // This function makes sure we are not reducing the selection to a caret selection. static bool shouldExtendSelectionInDirection(const VisibleSelection& selection, unsigned short character) { @@ -853,13 +860,14 @@ void SelectionHandler::selectionPositionChanged(bool forceUpdateWithoutChange) if (m_webPage->m_inputHandler->isInputMode() && m_webPage->m_inputHandler->processingChange()) { m_webPage->m_client->cancelSelectionVisuals(); + + // Since we're not calling notifyCaretPositionChangedIfNeeded now, we have to do so at the end of processing + // to avoid dropping a notification. + m_didSuppressCaretPositionChangedNotification = true; return; } - if (m_caretActive || (m_webPage->m_inputHandler->isInputMode() && m_webPage->focusedOrMainFrame()->selection()->isCaret())) { - // This may update the caret to no longer be active. - caretPositionChanged(); - } + notifyCaretPositionChangedIfNeeded(); // Enter selection mode if selection type is RangeSelection, and disable selection if // selection is active and becomes caret selection. @@ -948,6 +956,17 @@ void SelectionHandler::selectionPositionChanged(bool forceUpdateWithoutChange) SelectionTimingLog(LogLevelInfo, "SelectionHandler::selectionPositionChanged completed at %f", m_timer.elapsed()); } + +void SelectionHandler::notifyCaretPositionChangedIfNeeded() +{ + m_didSuppressCaretPositionChangedNotification = false; + + if (m_caretActive || (m_webPage->m_inputHandler->isInputMode() && m_webPage->focusedOrMainFrame()->selection()->isCaret())) { + // This may update the caret to no longer be active. + caretPositionChanged(); + } +} + // NOTE: This function is not in WebKit coordinates. void SelectionHandler::caretPositionChanged() { diff --git a/Source/WebKit/blackberry/WebKitSupport/SelectionHandler.h b/Source/WebKit/blackberry/WebKitSupport/SelectionHandler.h index 36895e3a5..74f17467d 100644 --- a/Source/WebKit/blackberry/WebKitSupport/SelectionHandler.h +++ b/Source/WebKit/blackberry/WebKitSupport/SelectionHandler.h @@ -71,7 +71,10 @@ public: bool lastUpdatedEndPointIsValid() const { return m_lastUpdatedEndPointIsValid; } + void inputHandlerDidFinishProcessingChange(); + private: + void notifyCaretPositionChangedIfNeeded(); void caretPositionChanged(); void regionForTextQuads(WTF::Vector<WebCore::FloatQuad>&, BlackBerry::Platform::IntRectRegion&, bool shouldClipToVisibleContent = true) const; WebCore::IntRect clippingRectForVisibleContent() const; @@ -89,6 +92,7 @@ private: bool m_selectionActive; bool m_caretActive; bool m_lastUpdatedEndPointIsValid; + bool m_didSuppressCaretPositionChangedNotification; BlackBerry::Platform::IntRectRegion m_lastSelectionRegion; BlackBerry::Platform::StopWatch m_timer; diff --git a/Source/WebKit/blackberry/WebKitSupport/TouchEventHandler.cpp b/Source/WebKit/blackberry/WebKitSupport/TouchEventHandler.cpp index e64a4c5cc..9cb28d8c5 100644 --- a/Source/WebKit/blackberry/WebKitSupport/TouchEventHandler.cpp +++ b/Source/WebKit/blackberry/WebKitSupport/TouchEventHandler.cpp @@ -235,8 +235,10 @@ bool TouchEventHandler::handleTouchPoint(Platform::TouchPoint& point, bool useFa // Apply any suppressed changes. This does not eliminate the need // for the show after the handling of fat finger pressed as it may - // have triggered a state change. - m_webPage->m_inputHandler->processPendingKeyboardVisibilityChange(); + // have triggered a state change. Leave the change suppressed if + // we are triggering spell check options. + if (!shouldRequestSpellCheckOptions) + m_webPage->m_inputHandler->processPendingKeyboardVisibilityChange(); if (shouldSuppressMouseDownOnTouchDown()) handleFatFingerPressed(); diff --git a/Source/WebKit/chromium/ChangeLog b/Source/WebKit/chromium/ChangeLog index 2a621451b..35eb61279 100644 --- a/Source/WebKit/chromium/ChangeLog +++ b/Source/WebKit/chromium/ChangeLog @@ -1,3 +1,229 @@ +2012-09-11 Iain Merrick <husky@chromium.org> + + [chromium] Fix double call to scrollBegin() when handling scroll gesture + https://bugs.webkit.org/show_bug.cgi?id=95322 + + Reviewed by James Robinson. + + WebCompositorInputHandlerImpl::handleGestureFling() calls scrollBegin() on its + client, then if the result is ScrollStarted, it creates a PlatformGestureCurve + object to handle the fling animation. This patch adds a matching scrollEnd() + before the animation starts. + + Now using strict mocks in WebCompositorInputHandlerImplTest, which turns all + unexpected calls into test failures. This ensures that scrollBegin / scrollEnd + happen exactly when we want and at no other times. + + * src/WebCompositorInputHandlerImpl.cpp: + (WebKit::WebCompositorInputHandlerImpl::handleGestureFling): + * tests/WebCompositorInputHandlerImplTest.cpp: + (WebCompositorInputHandlerImplTest): + (WebKit::TEST_F): + +2012-09-11 Peter Beverloo <peter@chromium.org> + + Unreviewed. Rolled DEPS. + + * DEPS: + +2012-09-11 Keishi Hattori <keishi@webkit.org> + + Create Localizer factory method for LocaleMac + https://bugs.webkit.org/show_bug.cgi?id=96355 + + Reviewed by Kent Tamura. + + * tests/LocaleMacTest.cpp: + (testNumberIsReversible): Use Localizer::create. + (testNumbers): + +2012-09-11 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed, rolling out r128150. + http://trac.webkit.org/changeset/128150 + https://bugs.webkit.org/show_bug.cgi?id=96357 + + it broke chromium compilation (Requested by loislo on + #webkit). + + * DEPS: + +2012-09-10 Sheriff Bot <webkit.review.bot@gmail.com> + + Unreviewed. Rolled DEPS. + + * DEPS: + +2012-09-10 Joanmarie Diggs <jdiggs@igalia.com> + + Properly expose <legend> elements to ATs + https://bugs.webkit.org/show_bug.cgi?id=84137 + + Reviewed by Chris Fleizach. + + Created a new WebCore Accessibility Role, LegendRole. Used it to map to + the expected platform role, ATK_ROLE_LABEL. Also established the needed + AtkRelation pair, label-for/labelled-by between the legend and fieldset. + + * public/WebAccessibilityRole.h: added WebAccessibilityRoleLegend + * src/AssertMatchingEnums.cpp: added the assert matching rule for + WebAccessibilityRoleLegend and LegendRole + +2012-09-10 Beth Dakin <bdakin@apple.com> + + https://bugs.webkit.org/show_bug.cgi?id=96158 + Need API to suppress scrollbar animations + -and corresponding- + <rdar://problem/12210972> + + Reviewed by Sam Weinig. + + ScrollableArea::isOnActivePage() has been re-named to + ScrollableArea:: scrollbarsCanBeActive(). + * src/ScrollbarGroup.cpp: + (WebKit::ScrollbarGroup::scrollbarsCanBeActive): + * src/ScrollbarGroup.h: + * tests/GraphicsLayerChromiumTest.cpp: + * tests/ScrollAnimatorNoneTest.cpp: + (MockScrollableArea): + +2012-09-10 Dan Alcantara <dfalcantara@chromium.org> + + [chromium, android] Reloading a page with a different user agent can cause the page to be zoomed in + https://bugs.webkit.org/show_bug.cgi?id=90222 + + Reviewed by Adam Barth. + + When reloading a page with an overridden URL, the page's scroll and zoom + state will be restored once the reload is complete. This is problematic + in situations when switching between mobile and desktop versions of the + same site because it will zoom back in on a random part of alternate page. + This CL just avoids that situation by resetting the zoom and scale whenever + this type of reload occurs. + + Chromium half: https://chromiumcodereview.appspot.com/10889019 + + * public/WebView.h: + (WebView): + * src/WebViewImpl.cpp: + (WebKit::WebViewImpl::resetScrollAndScaleState): + (WebKit): + * src/WebViewImpl.h: + (WebViewImpl): + +2012-09-10 Adam Barth <abarth@chromium.org> + + [V8] V8AuxiliaryContext used by IDB leaks memory + https://bugs.webkit.org/show_bug.cgi?id=96317 + + Reviewed by Tony Chang. + + Call the V8 APIs directly instead of using a helper class. + + * tests/IDBBindingUtilitiesTest.cpp: + (WebCore::TEST): + +2012-09-10 Adam Barth <abarth@chromium.org> + + [V8] Inline firstFrame and currentFrame into their unique callers + https://bugs.webkit.org/show_bug.cgi?id=96309 + + Reviewed by Eric Seidel. + + This patch just lines these WebCore functions because we only call them + from here. + + * src/WebFrameImpl.cpp: + (WebKit::WebFrame::frameForEnteredContext): + (WebKit::WebFrame::frameForCurrentContext): + +2012-09-10 Rick Byers <rbyers@chromium.org> + + [chromium] Add unused GestureTapCancel + https://bugs.webkit.org/show_bug.cgi?id=96183 + + Reviewed by Adam Barth. + + This adds a new 'tap cancel' gesture type. This is temporarily unused, + so that we can change chromium to start sending the gesture type + without breaking anything. + + * public/WebInputEvent.h: + * src/PageWidgetDelegate.cpp: + (WebKit::PageWidgetDelegate::handleInputEvent): + * src/WebInputEventConversion.cpp: + (WebKit::PlatformGestureEventBuilder::PlatformGestureEventBuilder): + * src/WebPopupMenuImpl.cpp: + (WebKit::WebPopupMenuImpl::handleInputEvent): + * src/WebViewImpl.cpp: + (WebKit::WebViewImpl::handleGestureEvent): + +2012-09-10 Mark Pilgrim <pilgrim@chromium.org> + + [Chromium] Define new setSharedWorkerRepository function in preparation for removing WebKitPlatformSupport::sharedWorkerRepository() + https://bugs.webkit.org/show_bug.cgi?id=95861 + + Reviewed by Adam Barth. + + Followup patch to Chromium will call this new function, then we can remove all references to the legacy function on WebKitPlatformSupport. + + * public/WebSharedWorkerRepository.h: + (WebKit): + * src/SharedWorkerRepository.cpp: + (WebKit): + (WebKit::setSharedWorkerRepository): + (WebKit::sharedWorkerRepository): + (WebCore::SharedWorkerRepository::isAvailable): + (WebCore::SharedWorkerRepository::connect): + (WebCore::SharedWorkerRepository::documentDetached): + (WebCore::SharedWorkerRepository::hasSharedWorkers): + +2012-09-10 Catalin Badea <badea@adobe.com> + + webkit build for 64-bit Mac chromium + https://bugs.webkit.org/show_bug.cgi?id=95977 + + Reviewed by Eric Seidel. + + Ensure header completeness and use the correct include order. This fixes a compilation issues noticeable when building chromium for 64-bit Mac. + + * public/mac/WebSubstringUtil.h: + * src/mac/WebSubstringUtil.mm: + +2012-09-10 Adrienne Walker <enne@google.com> + + [chromium] Fix deadlock between WebMediaPlayerClientImpl dtor and PutCurrentFrame + https://bugs.webkit.org/show_bug.cgi?id=96010 + + Reviewed by James Robinson. + + The key fix here is that the destructor no longer has a mutex. + The m_compositingMutex was supposedly protecting races between + ~WebMediaPlayerClientImpl and setVideoFrameProviderClient. The + former is only called from the main thread and the latter is called + from the compositor thread only when the main thread is blocked (and + it already asserts that this is the case). + + In addition, the m_providerMutex in CCVideoLayerImpl prevents the + destruction of WebMediaPlayerClientImpl, thus keeping the frame + acquired via getCurrentFrame alive until putCurrentFrame is called. + These functions are only called by the client, and comments are added + to the interface to better document this. + + To prevent a race between load() and getCurrentFrame/putCurrentFrame + (which are called from different threads) a new m_webMediaPlayerMutex + to replace part of what the old m_compositingMutex was doing. + + * src/WebMediaPlayerClientImpl.cpp: + (WebKit::WebMediaPlayerClientImpl::~WebMediaPlayerClientImpl): + (WebKit::WebMediaPlayerClientImpl::load): + (WebKit::WebMediaPlayerClientImpl::loadInternal): + (WebKit::WebMediaPlayerClientImpl::setVideoFrameProviderClient): + (WebKit::WebMediaPlayerClientImpl::getCurrentFrame): + (WebKit::WebMediaPlayerClientImpl::putCurrentFrame): + * src/WebMediaPlayerClientImpl.h: + (WebMediaPlayerClientImpl): + 2012-09-10 Rick Byers <rbyers@chromium.org> [chromium] Don't use WebGestureEvent.boundingBox for touch adjustment diff --git a/Source/WebKit/chromium/DEPS b/Source/WebKit/chromium/DEPS index d16efe14c..f732b797a 100644 --- a/Source/WebKit/chromium/DEPS +++ b/Source/WebKit/chromium/DEPS @@ -32,7 +32,7 @@ vars = { 'chromium_svn': 'http://src.chromium.org/svn/trunk/src', - 'chromium_rev': '155215' + 'chromium_rev': '155883' } deps = { diff --git a/Source/WebKit/chromium/public/WebAccessibilityRole.h b/Source/WebKit/chromium/public/WebAccessibilityRole.h index db8fbcbd4..d4a4c715a 100644 --- a/Source/WebKit/chromium/public/WebAccessibilityRole.h +++ b/Source/WebKit/chromium/public/WebAccessibilityRole.h @@ -89,6 +89,7 @@ enum WebAccessibilityRole { WebAccessibilityRoleLandmarkMain, WebAccessibilityRoleLandmarkNavigation, WebAccessibilityRoleLandmarkSearch, + WebAccessibilityRoleLegend, WebAccessibilityRoleLink, WebAccessibilityRoleList, WebAccessibilityRoleListBox, diff --git a/Source/WebKit/chromium/public/WebInputEvent.h b/Source/WebKit/chromium/public/WebInputEvent.h index 63ce7131c..916622194 100644 --- a/Source/WebKit/chromium/public/WebInputEvent.h +++ b/Source/WebKit/chromium/public/WebInputEvent.h @@ -116,6 +116,7 @@ public: GestureFlingCancel, GestureTap, GestureTapDown, + GestureTapCancel, GestureDoubleTap, GestureTwoFingerTap, GestureLongPress, @@ -216,6 +217,7 @@ public: || type == GesturePinchUpdate || type == GestureTap || type == GestureTapDown + || type == GestureTapCancel || type == GestureDoubleTap || type == GestureTwoFingerTap || type == GestureLongPress diff --git a/Source/WebKit/chromium/public/WebSharedWorkerRepository.h b/Source/WebKit/chromium/public/WebSharedWorkerRepository.h index 0611b0773..7cce3ad84 100644 --- a/Source/WebKit/chromium/public/WebSharedWorkerRepository.h +++ b/Source/WebKit/chromium/public/WebSharedWorkerRepository.h @@ -54,6 +54,9 @@ public: virtual bool hasSharedWorkers(DocumentID) = 0; }; +// Initializes shared worker support. +WEBKIT_EXPORT void setSharedWorkerRepository(WebSharedWorkerRepository*); + } // namespace WebKit #endif // WebSharedWorkerRepository_h diff --git a/Source/WebKit/chromium/public/WebView.h b/Source/WebKit/chromium/public/WebView.h index 5bb5712fa..b778f296a 100644 --- a/Source/WebKit/chromium/public/WebView.h +++ b/Source/WebKit/chromium/public/WebView.h @@ -257,10 +257,14 @@ public: // overwrites the previously saved scroll and scale state. virtual void saveScrollAndScaleState() = 0; - // Restore the previously saved scroll and scale state. After restroing the + // Restore the previously saved scroll and scale state. After restoring the // state, this function deletes any saved scroll and scale state. virtual void restoreScrollAndScaleState() = 0; + // Reset the scroll and scale state and clobber any previously saved values for + // these parameters. + virtual void resetScrollAndScaleState() = 0; + // Prevent the web page from setting a maximum scale via the viewport meta // tag. This is an accessibility feature that lets folks zoom in to web // pages even if the web page tries to block scaling. diff --git a/Source/WebKit/chromium/public/mac/WebSubstringUtil.h b/Source/WebKit/chromium/public/mac/WebSubstringUtil.h index b21fe21e6..71427639a 100644 --- a/Source/WebKit/chromium/public/mac/WebSubstringUtil.h +++ b/Source/WebKit/chromium/public/mac/WebSubstringUtil.h @@ -31,6 +31,8 @@ #ifndef WebSubstringUtil_h #define WebSubstringUtil_h +#include "../platform/WebCommon.h" + namespace WebKit { class WebFrame; } diff --git a/Source/WebKit/chromium/src/AssertMatchingEnums.cpp b/Source/WebKit/chromium/src/AssertMatchingEnums.cpp index cfaa26bab..c6bf971f1 100644 --- a/Source/WebKit/chromium/src/AssertMatchingEnums.cpp +++ b/Source/WebKit/chromium/src/AssertMatchingEnums.cpp @@ -262,6 +262,7 @@ COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleDocumentRegion, DocumentRegionR COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleUserInterfaceTooltip, UserInterfaceTooltipRole); COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleToggleButton, ToggleButtonRole); COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleCanvas, CanvasRole); +COMPILE_ASSERT_MATCHING_ENUM(WebAccessibilityRoleLegend, LegendRole); COMPILE_ASSERT_MATCHING_ENUM(WebApplicationCacheHost::Uncached, ApplicationCacheHost::UNCACHED); COMPILE_ASSERT_MATCHING_ENUM(WebApplicationCacheHost::Idle, ApplicationCacheHost::IDLE); diff --git a/Source/WebKit/chromium/src/PageWidgetDelegate.cpp b/Source/WebKit/chromium/src/PageWidgetDelegate.cpp index 340e6f1a9..6ad25d953 100644 --- a/Source/WebKit/chromium/src/PageWidgetDelegate.cpp +++ b/Source/WebKit/chromium/src/PageWidgetDelegate.cpp @@ -154,6 +154,7 @@ bool PageWidgetDelegate::handleInputEvent(Page* page, PageWidgetEventHandler& ha case WebInputEvent::GestureFlingCancel: case WebInputEvent::GestureTap: case WebInputEvent::GestureTapDown: + case WebInputEvent::GestureTapCancel: case WebInputEvent::GestureDoubleTap: case WebInputEvent::GestureTwoFingerTap: case WebInputEvent::GestureLongPress: diff --git a/Source/WebKit/chromium/src/ScrollbarGroup.cpp b/Source/WebKit/chromium/src/ScrollbarGroup.cpp index 0e676cb5f..0923e8738 100644 --- a/Source/WebKit/chromium/src/ScrollbarGroup.cpp +++ b/Source/WebKit/chromium/src/ScrollbarGroup.cpp @@ -263,7 +263,7 @@ void ScrollbarGroup::scrollbarStyleChanged(int, bool forceUpdate) m_verticalScrollbar->scrollbarStyleChanged(); } -bool ScrollbarGroup::isOnActivePage() const +bool ScrollbarGroup::scrollbarsCanBeActive() const { return true; } diff --git a/Source/WebKit/chromium/src/ScrollbarGroup.h b/Source/WebKit/chromium/src/ScrollbarGroup.h index b2df772f4..78433f6b9 100644 --- a/Source/WebKit/chromium/src/ScrollbarGroup.h +++ b/Source/WebKit/chromium/src/ScrollbarGroup.h @@ -72,7 +72,7 @@ public: virtual WebCore::IntPoint currentMousePosition() const OVERRIDE; virtual bool shouldSuspendScrollAnimations() const OVERRIDE; virtual void scrollbarStyleChanged(int newStyle, bool forceUpdate) OVERRIDE; - virtual bool isOnActivePage() const OVERRIDE; + virtual bool scrollbarsCanBeActive() const OVERRIDE; virtual WebCore::IntRect scrollableAreaBoundingBox() const OVERRIDE; private: diff --git a/Source/WebKit/chromium/src/SharedWorkerRepository.cpp b/Source/WebKit/chromium/src/SharedWorkerRepository.cpp index d9188ddee..da019b42e 100644 --- a/Source/WebKit/chromium/src/SharedWorkerRepository.cpp +++ b/Source/WebKit/chromium/src/SharedWorkerRepository.cpp @@ -58,6 +58,30 @@ #include <public/WebString.h> #include <public/WebURL.h> +namespace WebKit { + +WebSharedWorkerRepository* s_sharedWorkerRepository = 0; + +void setSharedWorkerRepository(WebSharedWorkerRepository* repository) +{ + s_sharedWorkerRepository = repository; +} + +static WebSharedWorkerRepository* sharedWorkerRepository() +{ + WebSharedWorkerRepository* repository; + + repository = s_sharedWorkerRepository; + if (!repository) { + repository = webKitPlatformSupport()->sharedWorkerRepository(); + setSharedWorkerRepository(repository); + } + + return repository; +} + +} + namespace WebCore { class Document; @@ -194,8 +218,9 @@ void SharedWorkerScriptLoader::connected() bool SharedWorkerRepository::isAvailable() { - // Allow the WebKitPlatformSupport to determine if SharedWorkers are available. - return WebKit::webKitPlatformSupport()->sharedWorkerRepository(); + // Allow the WebKitPlatformSupport to determine if SharedWorkers + // are available. + return WebKit::sharedWorkerRepository(); } static WebSharedWorkerRepository::DocumentID getId(void* document) @@ -206,9 +231,11 @@ static WebSharedWorkerRepository::DocumentID getId(void* document) void SharedWorkerRepository::connect(PassRefPtr<SharedWorker> worker, PassOwnPtr<MessagePortChannel> port, const KURL& url, const String& name, ExceptionCode& ec) { + WebKit::WebSharedWorkerRepository* repository = WebKit::sharedWorkerRepository(); + // This should not be callable unless there's a SharedWorkerRepository for // this context (since isAvailable() should have returned null). - ASSERT(WebKit::webKitPlatformSupport()->sharedWorkerRepository()); + ASSERT(repository); // No nested workers (for now) - connect() should only be called from document context. ASSERT(worker->scriptExecutionContext()->isDocument()); @@ -223,8 +250,7 @@ void SharedWorkerRepository::connect(PassRefPtr<SharedWorker> worker, PassOwnPtr return; } - WebKit::webKitPlatformSupport()->sharedWorkerRepository()->addSharedWorker( - webWorker.get(), getId(document)); + repository->addSharedWorker(webWorker.get(), getId(document)); // The loader object manages its own lifecycle (and the lifecycles of the two worker objects). // It will free itself once loading is completed. @@ -234,9 +260,10 @@ void SharedWorkerRepository::connect(PassRefPtr<SharedWorker> worker, PassOwnPtr void SharedWorkerRepository::documentDetached(Document* document) { - WebSharedWorkerRepository* repo = WebKit::webKitPlatformSupport()->sharedWorkerRepository(); - if (repo) - repo->documentDetached(getId(document)); + WebKit::WebSharedWorkerRepository* repository = WebKit::sharedWorkerRepository(); + + if (repository) + repository->documentDetached(getId(document)); // Stop the creation of any pending SharedWorkers for this context. // FIXME: Need a way to invoke this for WorkerContexts as well when we support for nested workers. @@ -245,11 +272,10 @@ void SharedWorkerRepository::documentDetached(Document* document) bool SharedWorkerRepository::hasSharedWorkers(Document* document) { - WebSharedWorkerRepository* repo = WebKit::webKitPlatformSupport()->sharedWorkerRepository(); - return repo && repo->hasSharedWorkers(getId(document)); -} - + WebKit::WebSharedWorkerRepository* repository = WebKit::sharedWorkerRepository(); + return repository && repository->hasSharedWorkers(getId(document)); +} } // namespace WebCore diff --git a/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp b/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp index 16222ac4f..87d7b2522 100644 --- a/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp +++ b/Source/WebKit/chromium/src/WebCompositorInputHandlerImpl.cpp @@ -205,6 +205,7 @@ WebCompositorInputHandlerImpl::EventDisposition WebCompositorInputHandlerImpl::h WebInputHandlerClient::ScrollStatus scrollStatus = m_inputHandlerClient->scrollBegin(WebPoint(gestureEvent.x, gestureEvent.y), WebInputHandlerClient::ScrollInputTypeGesture); switch (scrollStatus) { case WebInputHandlerClient::ScrollStatusStarted: { + m_inputHandlerClient->scrollEnd(); m_wheelFlingCurve = PlatformGestureCurveFactory::get()->createCurve(gestureEvent.data.flingStart.sourceDevice, FloatPoint(gestureEvent.data.flingStart.velocityX, gestureEvent.data.flingStart.velocityY)); TRACE_EVENT_ASYNC_BEGIN1("cc", "WebCompositorInputHandlerImpl::handleGestureFling::started", this, "curve", m_wheelFlingCurve->debugName()); m_wheelFlingParameters.delta = WebFloatPoint(gestureEvent.data.flingStart.velocityX, gestureEvent.data.flingStart.velocityY); diff --git a/Source/WebKit/chromium/src/WebFrameImpl.cpp b/Source/WebKit/chromium/src/WebFrameImpl.cpp index 4395c6d70..1d187f09e 100644 --- a/Source/WebKit/chromium/src/WebFrameImpl.cpp +++ b/Source/WebKit/chromium/src/WebFrameImpl.cpp @@ -571,16 +571,18 @@ int WebFrame::instanceCount() WebFrame* WebFrame::frameForEnteredContext() { - Frame* frame = - ScriptController::retrieveFrameForEnteredContext(); - return WebFrameImpl::fromFrame(frame); + v8::Handle<v8::Context> context = v8::Context::GetEntered(); + if (context.IsEmpty()) + return 0; + return frameForContext(context); } WebFrame* WebFrame::frameForCurrentContext() { - Frame* frame = - ScriptController::retrieveFrameForCurrentContext(); - return WebFrameImpl::fromFrame(frame); + v8::Handle<v8::Context> context = v8::Context::GetCurrent(); + if (context.IsEmpty()) + return 0; + return frameForContext(context); } #if WEBKIT_USING_V8 diff --git a/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp b/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp index e570dca5a..e75c73947 100644 --- a/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp +++ b/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp @@ -92,9 +92,11 @@ WebMediaPlayer* WebMediaPlayerClientImpl::mediaPlayer() const WebMediaPlayerClientImpl::~WebMediaPlayerClientImpl() { #if USE(ACCELERATED_COMPOSITING) - MutexLocker locker(m_compositingMutex); if (m_videoFrameProviderClient) m_videoFrameProviderClient->stopUsingProvider(); + // No need for a lock here, as getCurrentFrame/putCurrentFrame can't be + // called now that the client is no longer using this provider. Also, load() + // and this destructor are called from the same thread. if (m_webMediaPlayer) m_webMediaPlayer->setStreamTextureClient(0); #endif @@ -312,8 +314,8 @@ void WebMediaPlayerClientImpl::load(const String& url) { m_url = url; + MutexLocker locker(m_webMediaPlayerMutex); if (m_preload == MediaPlayer::None) { - MutexLocker locker(m_compositingMutex); #if ENABLE(WEB_AUDIO) m_audioSourceProvider.wrap(0); // Clear weak reference to m_webMediaPlayer's WebAudioSourceProvider. #endif @@ -325,7 +327,6 @@ void WebMediaPlayerClientImpl::load(const String& url) void WebMediaPlayerClientImpl::loadInternal() { - MutexLocker locker(m_compositingMutex); #if ENABLE(WEB_AUDIO) m_audioSourceProvider.wrap(0); // Clear weak reference to m_webMediaPlayer's WebAudioSourceProvider. #endif @@ -766,7 +767,7 @@ bool WebMediaPlayerClientImpl::acceleratedRenderingInUse() void WebMediaPlayerClientImpl::setVideoFrameProviderClient(WebVideoFrameProvider::Client* client) { - MutexLocker locker(m_compositingMutex); + MutexLocker locker(m_webMediaPlayerMutex); if (m_videoFrameProviderClient) m_videoFrameProviderClient->stopUsingProvider(); m_videoFrameProviderClient = client; @@ -776,8 +777,10 @@ void WebMediaPlayerClientImpl::setVideoFrameProviderClient(WebVideoFrameProvider WebVideoFrame* WebMediaPlayerClientImpl::getCurrentFrame() { - MutexLocker locker(m_compositingMutex); + // This function is called only by the client. + MutexLocker locker(m_webMediaPlayerMutex); ASSERT(!m_currentVideoFrame); + ASSERT(m_videoFrameProviderClient); if (m_webMediaPlayer) m_currentVideoFrame = m_webMediaPlayer->getCurrentFrame(); return m_currentVideoFrame; @@ -785,8 +788,10 @@ WebVideoFrame* WebMediaPlayerClientImpl::getCurrentFrame() void WebMediaPlayerClientImpl::putCurrentFrame(WebVideoFrame* videoFrame) { - MutexLocker locker(m_compositingMutex); + // This function is called only by the client. + MutexLocker locker(m_webMediaPlayerMutex); ASSERT(videoFrame == m_currentVideoFrame); + ASSERT(m_videoFrameProviderClient); if (!videoFrame) return; if (m_webMediaPlayer) diff --git a/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h b/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h index dd170e57c..73eb78fa8 100644 --- a/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h +++ b/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h @@ -197,7 +197,7 @@ private: bool acceleratedRenderingInUse(); #endif - Mutex m_compositingMutex; // Guards m_currentVideoFrame and m_videoFrameProviderClient. + Mutex m_webMediaPlayerMutex; // Guards the m_webMediaPlayer WebCore::MediaPlayer* m_mediaPlayer; OwnPtr<WebMediaPlayer> m_webMediaPlayer; WebVideoFrame* m_currentVideoFrame; diff --git a/Source/WebKit/chromium/src/WebPopupMenuImpl.cpp b/Source/WebKit/chromium/src/WebPopupMenuImpl.cpp index 194dee550..58a2855cd 100644 --- a/Source/WebKit/chromium/src/WebPopupMenuImpl.cpp +++ b/Source/WebKit/chromium/src/WebPopupMenuImpl.cpp @@ -288,6 +288,7 @@ bool WebPopupMenuImpl::handleInputEvent(const WebInputEvent& inputEvent) case WebInputEvent::Undefined: case WebInputEvent::MouseEnter: case WebInputEvent::ContextMenu: + case WebInputEvent::GestureTapCancel: return false; } return false; diff --git a/Source/WebKit/chromium/src/WebViewImpl.cpp b/Source/WebKit/chromium/src/WebViewImpl.cpp index be474d8fa..238b2f920 100644 --- a/Source/WebKit/chromium/src/WebViewImpl.cpp +++ b/Source/WebKit/chromium/src/WebViewImpl.cpp @@ -771,6 +771,10 @@ bool WebViewImpl::handleGestureEvent(const WebGestureEvent& event) PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), event); return mainFrameImpl()->frame()->eventHandler()->handleGestureEvent(platformEvent); } + case WebInputEvent::GestureTapCancel: + // FIXME: Update WebCore to handle this event after chromium has been updated to send it + // http://wkb.ug/96060 + return false; default: ASSERT_NOT_REACHED(); } @@ -2924,6 +2928,18 @@ void WebViewImpl::resetSavedScrollAndScaleState() m_savedScrollOffset = IntSize(); } +void WebViewImpl::resetScrollAndScaleState() +{ + page()->setPageScaleFactor(0, IntPoint()); + m_pageScaleFactorIsSet = false; + + // Clobber saved scales and scroll offsets. + if (FrameView* view = page()->mainFrame()->document()->view()) + view->cacheCurrentScrollPosition(); + resetSavedScrollAndScaleState(); + page()->mainFrame()->loader()->history()->saveDocumentAndScrollState(); +} + WebSize WebViewImpl::fixedLayoutSize() const { if (!page()) diff --git a/Source/WebKit/chromium/src/WebViewImpl.h b/Source/WebKit/chromium/src/WebViewImpl.h index ce5657a2b..11a05d0de 100644 --- a/Source/WebKit/chromium/src/WebViewImpl.h +++ b/Source/WebKit/chromium/src/WebViewImpl.h @@ -227,6 +227,7 @@ public: virtual float maximumPageScaleFactor() const; virtual void saveScrollAndScaleState(); virtual void restoreScrollAndScaleState(); + virtual void resetScrollAndScaleState(); virtual void setIgnoreViewportTagMaximumScale(bool); virtual float deviceScaleFactor() const; diff --git a/Source/WebKit/chromium/src/mac/WebSubstringUtil.mm b/Source/WebKit/chromium/src/mac/WebSubstringUtil.mm index dd9951f83..682da0ef3 100644 --- a/Source/WebKit/chromium/src/mac/WebSubstringUtil.mm +++ b/Source/WebKit/chromium/src/mac/WebSubstringUtil.mm @@ -30,9 +30,10 @@ */ #include "config.h" -#include "WebFrameImpl.h" #include "WebSubstringUtil.h" +#import <Cocoa/Cocoa.h> + #include "ColorMac.h" #include "Document.h" #include "Element.h" @@ -45,10 +46,9 @@ #include "RenderObject.h" #include "RenderStyle.h" #include "TextIterator.h" +#include "WebFrameImpl.h" #include "platform/WebRect.h" -#import <Cocoa/Cocoa.h> - using namespace WebCore; namespace WebKit { diff --git a/Source/WebKit/chromium/tests/GraphicsLayerChromiumTest.cpp b/Source/WebKit/chromium/tests/GraphicsLayerChromiumTest.cpp index cff826eed..e14571c6c 100644 --- a/Source/WebKit/chromium/tests/GraphicsLayerChromiumTest.cpp +++ b/Source/WebKit/chromium/tests/GraphicsLayerChromiumTest.cpp @@ -133,7 +133,7 @@ public: virtual int visibleWidth() const OVERRIDE { return 10; } virtual int visibleHeight() const OVERRIDE { return 10; } virtual IntSize contentsSize() const OVERRIDE { return IntSize(100, 100); } - virtual bool isOnActivePage() const OVERRIDE { return false; } + virtual bool scrollbarsCanBeActive() const OVERRIDE { return false; } virtual ScrollableArea* enclosingScrollableArea() const OVERRIDE { return 0; } virtual IntRect scrollableAreaBoundingBox() const OVERRIDE { return IntRect(); } virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) OVERRIDE { } diff --git a/Source/WebKit/chromium/tests/IDBBindingUtilitiesTest.cpp b/Source/WebKit/chromium/tests/IDBBindingUtilitiesTest.cpp index c1351850d..c2d5e7541 100644 --- a/Source/WebKit/chromium/tests/IDBBindingUtilitiesTest.cpp +++ b/Source/WebKit/chromium/tests/IDBBindingUtilitiesTest.cpp @@ -28,6 +28,7 @@ #include "IDBKey.h" #include "IDBKeyPath.h" #include "SerializedScriptValue.h" +#include "V8PerIsolateData.h" #include "V8Utilities.h" #include <gtest/gtest.h> @@ -91,7 +92,9 @@ void checkKeyPathNumberValue(SerializedScriptValue* value, const String& keyPath TEST(IDBKeyFromValueAndKeyPathTest, TopLevelPropertyStringValue) { - V8AuxiliaryContext v8context; + v8::HandleScope handleScope; + v8::Context::Scope scope(V8PerIsolateData::current()->ensureAuxiliaryContext()); + v8::Local<v8::Object> object = v8::Object::New(); object->Set(v8::String::New("foo"), v8::String::New("zoo")); @@ -103,7 +106,9 @@ TEST(IDBKeyFromValueAndKeyPathTest, TopLevelPropertyStringValue) TEST(IDBKeyFromValueAndKeyPathTest, TopLevelPropertyNumberValue) { - V8AuxiliaryContext v8context; + v8::HandleScope handleScope; + v8::Context::Scope scope(V8PerIsolateData::current()->ensureAuxiliaryContext()); + v8::Local<v8::Object> object = v8::Object::New(); object->Set(v8::String::New("foo"), v8::Number::New(456)); @@ -115,7 +120,9 @@ TEST(IDBKeyFromValueAndKeyPathTest, TopLevelPropertyNumberValue) TEST(IDBKeyFromValueAndKeyPathTest, SubProperty) { - V8AuxiliaryContext v8context; + v8::HandleScope handleScope; + v8::Context::Scope scope(V8PerIsolateData::current()->ensureAuxiliaryContext()); + v8::Local<v8::Object> object = v8::Object::New(); v8::Local<v8::Object> subProperty = v8::Object::New(); subProperty->Set(v8::String::New("bar"), v8::String::New("zee")); @@ -129,7 +136,9 @@ TEST(IDBKeyFromValueAndKeyPathTest, SubProperty) TEST(InjectIDBKeyTest, TopLevelPropertyStringValue) { - V8AuxiliaryContext v8context; + v8::HandleScope handleScope; + v8::Context::Scope scope(V8PerIsolateData::current()->ensureAuxiliaryContext()); + v8::Local<v8::Object> object = v8::Object::New(); object->Set(v8::String::New("foo"), v8::String::New("zoo")); @@ -141,7 +150,9 @@ TEST(InjectIDBKeyTest, TopLevelPropertyStringValue) TEST(InjectIDBKeyTest, SubProperty) { - V8AuxiliaryContext v8context; + v8::HandleScope handleScope; + v8::Context::Scope scope(V8PerIsolateData::current()->ensureAuxiliaryContext()); + v8::Local<v8::Object> object = v8::Object::New(); v8::Local<v8::Object> subProperty = v8::Object::New(); subProperty->Set(v8::String::New("bar"), v8::String::New("zee")); diff --git a/Source/WebKit/chromium/tests/LocaleMacTest.cpp b/Source/WebKit/chromium/tests/LocaleMacTest.cpp index f6b0f6292..eb86a2f68 100644 --- a/Source/WebKit/chromium/tests/LocaleMacTest.cpp +++ b/Source/WebKit/chromium/tests/LocaleMacTest.cpp @@ -221,9 +221,9 @@ TEST_F(LocaleMacTest, decimalSeparator) } #endif -static void testNumberIsReversible(const String& localeString, const char* original, const char* shouldHave = 0) +static void testNumberIsReversible(const AtomicString& localeString, const char* original, const char* shouldHave = 0) { - OwnPtr<LocaleMac> locale = LocaleMac::create(localeString); + OwnPtr<Localizer> locale = Localizer::create(localeString); String localized = locale->convertToLocalizedNumber(original); if (shouldHave) EXPECT_TRUE(localized.contains(shouldHave)); @@ -231,7 +231,7 @@ static void testNumberIsReversible(const String& localeString, const char* origi EXPECT_STREQ(original, converted.utf8().data()); } -void testNumbers(const String& localeString, const char* decimalSeparatorShouldBe = 0) +void testNumbers(const AtomicString& localeString, const char* decimalSeparatorShouldBe = 0) { testNumberIsReversible(localeString, "123456789012345678901234567890"); testNumberIsReversible(localeString, "-123.456", decimalSeparatorShouldBe); diff --git a/Source/WebKit/chromium/tests/ScrollAnimatorNoneTest.cpp b/Source/WebKit/chromium/tests/ScrollAnimatorNoneTest.cpp index e71846adb..83088a312 100644 --- a/Source/WebKit/chromium/tests/ScrollAnimatorNoneTest.cpp +++ b/Source/WebKit/chromium/tests/ScrollAnimatorNoneTest.cpp @@ -68,7 +68,7 @@ public: MOCK_CONST_METHOD1(visibleContentRect, IntRect(bool)); MOCK_CONST_METHOD0(contentsSize, IntSize()); MOCK_CONST_METHOD0(overhangAmount, IntSize()); - MOCK_CONST_METHOD0(isOnActivePage, bool()); + MOCK_CONST_METHOD0(scrollbarsCanBeActive, bool()); MOCK_CONST_METHOD0(scrollableAreaBoundingBox, IntRect()); virtual IntPoint scrollPosition() const OVERRIDE { return IntPoint(); } diff --git a/Source/WebKit/chromium/tests/WebCompositorInputHandlerImplTest.cpp b/Source/WebKit/chromium/tests/WebCompositorInputHandlerImplTest.cpp index 88927a988..49fdbff7d 100644 --- a/Source/WebKit/chromium/tests/WebCompositorInputHandlerImplTest.cpp +++ b/Source/WebKit/chromium/tests/WebCompositorInputHandlerImplTest.cpp @@ -133,9 +133,9 @@ public: } while (0) protected: - MockWebInputHandlerClient m_mockInputHandlerClient; + testing::StrictMock<MockWebInputHandlerClient> m_mockInputHandlerClient; OwnPtr<WebCompositorInputHandlerImpl> m_inputHandler; - MockWebCompositorInputHandlerClient m_mockClient; + testing::StrictMock<MockWebCompositorInputHandlerClient> m_mockClient; WebGestureEvent gesture; WebKitTests::WebCompositorInitializer m_initializer; @@ -255,10 +255,11 @@ TEST_F(WebCompositorInputHandlerImplTest, gestureFlingStarted) EXPECT_CALL(m_mockInputHandlerClient, scrollBegin(testing::_, testing::_)) .WillOnce(testing::Return(WebInputHandlerClient::ScrollStatusStarted)); + EXPECT_CALL(m_mockInputHandlerClient, scrollEnd()); + EXPECT_CALL(m_mockInputHandlerClient, scheduleAnimation()); gesture.type = WebInputEvent::GestureFlingStart; gesture.data.flingStart.velocityX = 10; - EXPECT_CALL(m_mockInputHandlerClient, scheduleAnimation()); m_inputHandler->handleInputEvent(gesture); VERIFY_AND_RESET_MOCKS(); @@ -328,6 +329,7 @@ TEST_F(WebCompositorInputHandlerImplTest, gestureFlingAnimates) EXPECT_CALL(m_mockInputHandlerClient, scheduleAnimation()); EXPECT_CALL(m_mockInputHandlerClient, scrollBegin(testing::_, testing::_)) .WillOnce(testing::Return(WebInputHandlerClient::ScrollStatusStarted)); + EXPECT_CALL(m_mockInputHandlerClient, scrollEnd()); m_inputHandler->handleInputEvent(gesture); testing::Mock::VerifyAndClearExpectations(&m_mockInputHandlerClient); @@ -412,6 +414,7 @@ TEST_F(WebCompositorInputHandlerImplTest, gestureFlingTransferResets) EXPECT_CALL(m_mockInputHandlerClient, scheduleAnimation()); EXPECT_CALL(m_mockInputHandlerClient, scrollBegin(testing::_, testing::_)) .WillOnce(testing::Return(WebInputHandlerClient::ScrollStatusStarted)); + EXPECT_CALL(m_mockInputHandlerClient, scrollEnd()); m_inputHandler->handleInputEvent(gesture); testing::Mock::VerifyAndClearExpectations(&m_mockInputHandlerClient); @@ -491,6 +494,7 @@ TEST_F(WebCompositorInputHandlerImplTest, gestureFlingTransferResets) EXPECT_CALL(m_mockInputHandlerClient, scheduleAnimation()); EXPECT_CALL(m_mockInputHandlerClient, scrollBegin(testing::_, testing::_)) .WillOnce(testing::Return(WebInputHandlerClient::ScrollStatusStarted)); + EXPECT_CALL(m_mockInputHandlerClient, scrollEnd()); m_inputHandler->handleInputEvent(gesture); testing::Mock::VerifyAndClearExpectations(&m_mockInputHandlerClient); diff --git a/Source/WebKit/chromium/tests/WebViewTest.cpp b/Source/WebKit/chromium/tests/WebViewTest.cpp index 4e2553a36..b7ab658de 100644 --- a/Source/WebKit/chromium/tests/WebViewTest.cpp +++ b/Source/WebKit/chromium/tests/WebViewTest.cpp @@ -422,6 +422,45 @@ TEST_F(WebViewTest, SetCompositionFromExistingText) webView->close(); } +TEST_F(WebViewTest, ResetScrollAndScaleState) +{ + URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()), WebString::fromUTF8("hello_world.html")); + WebViewImpl* webViewImpl = static_cast<WebViewImpl*>(FrameTestHelpers::createWebViewAndLoad(m_baseURL + "hello_world.html")); + webViewImpl->resize(WebSize(640, 480)); + EXPECT_EQ(0, webViewImpl->mainFrame()->scrollOffset().width); + EXPECT_EQ(0, webViewImpl->mainFrame()->scrollOffset().height); + + // Make the page scale and scroll with the given paremeters. + webViewImpl->setPageScaleFactor(2.0f, WebPoint(116, 84)); + EXPECT_EQ(2.0f, webViewImpl->pageScaleFactor()); + EXPECT_EQ(116, webViewImpl->mainFrame()->scrollOffset().width); + EXPECT_EQ(84, webViewImpl->mainFrame()->scrollOffset().height); + webViewImpl->page()->mainFrame()->loader()->history()->saveDocumentAndScrollState(); + + // Confirm that restoring the page state restores the parameters. + webViewImpl->setPageScaleFactor(1.5f, WebPoint(16, 24)); + EXPECT_EQ(1.5f, webViewImpl->pageScaleFactor()); + EXPECT_EQ(16, webViewImpl->mainFrame()->scrollOffset().width); + EXPECT_EQ(24, webViewImpl->mainFrame()->scrollOffset().height); + webViewImpl->page()->mainFrame()->loader()->history()->restoreScrollPositionAndViewState(); + EXPECT_EQ(2.0f, webViewImpl->pageScaleFactor()); + EXPECT_EQ(116, webViewImpl->mainFrame()->scrollOffset().width); + EXPECT_EQ(84, webViewImpl->mainFrame()->scrollOffset().height); + webViewImpl->page()->mainFrame()->loader()->history()->saveDocumentAndScrollState(); + + // Confirm that resetting the page state resets both the scale and scroll position, as well + // as overwrites the original parameters that were saved to the HistoryController. + webViewImpl->resetScrollAndScaleState(); + EXPECT_EQ(0.0f, webViewImpl->pageScaleFactor()); + EXPECT_EQ(0, webViewImpl->mainFrame()->scrollOffset().width); + EXPECT_EQ(0, webViewImpl->mainFrame()->scrollOffset().height); + webViewImpl->page()->mainFrame()->loader()->history()->restoreScrollPositionAndViewState(); + EXPECT_EQ(0.0f, webViewImpl->pageScaleFactor()); + EXPECT_EQ(0, webViewImpl->mainFrame()->scrollOffset().width); + EXPECT_EQ(0, webViewImpl->mainFrame()->scrollOffset().height); + webViewImpl->close(); +} + class ContentDetectorClient : public WebViewClient { public: ContentDetectorClient() { reset(); } diff --git a/Source/WebKit/mac/ChangeLog b/Source/WebKit/mac/ChangeLog index ab6273273..91b7ffa14 100644 --- a/Source/WebKit/mac/ChangeLog +++ b/Source/WebKit/mac/ChangeLog @@ -1,3 +1,72 @@ +2012-09-10 Jer Noble <jer.noble@apple.com> + + Unreviewed; rolling out r128081. + http://trac.webkit.org/changeset/128081 + https://bugs.webkit.org/show_bug.cgi?id=96134 + + New test http/tests/media/video-donottrack.html fails to run on Apple test bots. + + * WebCoreSupport/WebFrameLoaderClient.h: + * WebCoreSupport/WebFrameLoaderClient.mm: + * WebView/WebDelegateImplementationCaching.h: + (WebFrameLoadDelegateImplementationCache): + * WebView/WebDelegateImplementationCaching.mm: + * WebView/WebView.mm: + (-[WebView _cacheFrameLoadDelegateImplementations]): + +2012-09-07 Jon Lee <jonlee@apple.com> + + Update notifications to latest spec + https://bugs.webkit.org/show_bug.cgi?id=91726 + <rdar://problem/11910451> + + Reviewed by Alexey Proskuryakov. + + Expose lang and dir. + + * WebView/WebNotification.h: + * WebView/WebNotification.mm: + (-[WebNotification lang]): + (-[WebNotification dir]): + +2012-09-10 Jer Noble <jer.noble@apple.com> + + NSInvalidArgumentException in WebFrameLoaderClient::shouldSendDoNotTrackHTTPHeader() + https://bugs.webkit.org/show_bug.cgi?id=96320 + + Reviewed by Geoffrey Garen. + + Client was being cached as the FrameLoaderClient, but requests were sent to the ResourceLoadClient. + + * WebCoreSupport/WebFrameLoaderClient.mm: + (WebFrameLoaderClient::shouldSendDoNotTrackHTTPHeader): Send the request to the FrameLoadDelegate. + * WebView/WebDelegateImplementationCaching.h: + * WebView/WebDelegateImplementationCaching.mm: + (CallFrameLoadDelegateReturningBoolean): Added. + +2012-09-07 Jer Noble <jer.noble@apple.com> + + <audio> and <video> should send Do Not Track when appropriate + https://bugs.webkit.org/show_bug.cgi?id=96134 + + Reviewed by Eric Carlson. + + Add support for the shouldSendDoNotTrackHTTPHeader by passing the request + on to the WebFrameLoadDelegate. + + * WebCoreSupport/WebFrameLoaderClient.h: + * WebCoreSupport/WebFrameLoaderClient.mm: + (WebFrameLoaderClient::shouldSendDoNotTrackHeader): + Pass the question on to the WebFrameLoadDelegate. + * WebView/WebDelegateImplementationCaching.h: + (WebFrameLoadDelegateImplementationCache): + Add an entry for the delegate's webViewShouldSendDoNotTrackHeader method. + * WebView/WebDelegateImplementationCaching.mm: + (CallResourceLoadDelegateReturningBoolean): Added a 0-parameter overloaded function. + * WebView/WebView.mm: + (-[WebView _cacheFrameLoadDelegateImplementations]): initialize the + cached value for shouldSendDoNotTrackHeaderFunc. + 2012-09-07 Benjamin Poulain <bpoulain@apple.com> Rename the ustring() accessor to string() diff --git a/Source/WebKit/mac/WebView/WebDelegateImplementationCaching.h b/Source/WebKit/mac/WebView/WebDelegateImplementationCaching.h index 6568cc96b..29a43880a 100644 --- a/Source/WebKit/mac/WebView/WebDelegateImplementationCaching.h +++ b/Source/WebKit/mac/WebView/WebDelegateImplementationCaching.h @@ -129,6 +129,8 @@ id CallFrameLoadDelegate(IMP, WebView *, SEL, id, id, id); id CallFrameLoadDelegate(IMP, WebView *, SEL, id, id, id, id); id CallFrameLoadDelegate(IMP, WebView *, SEL, id, NSTimeInterval, id, id); +BOOL CallFrameLoadDelegateReturningBoolean(BOOL, IMP, WebView *, SEL); + id CallResourceLoadDelegate(IMP, WebView *, SEL, id, id); id CallResourceLoadDelegate(IMP, WebView *, SEL, id, id, id); id CallResourceLoadDelegate(IMP, WebView *, SEL, id, id, id, id); diff --git a/Source/WebKit/mac/WebView/WebDelegateImplementationCaching.mm b/Source/WebKit/mac/WebView/WebDelegateImplementationCaching.mm index 8470f5f2b..3c3e3c9b3 100644 --- a/Source/WebKit/mac/WebView/WebDelegateImplementationCaching.mm +++ b/Source/WebKit/mac/WebView/WebDelegateImplementationCaching.mm @@ -475,6 +475,16 @@ id CallFrameLoadDelegate(IMP implementation, WebView *self, SEL selector, id obj return CallDelegate(implementation, self, self->_private->frameLoadDelegate, selector, object1, interval, object2, object3); } +BOOL CallFrameLoadDelegateReturningBoolean(BOOL result, IMP implementation, WebView *self, SEL selector) +{ + @try { + return reinterpret_cast<BOOL (*)(id, SEL, WebView *)>(objc_msgSend)(self->_private->frameLoadDelegate, selector, self); + } @catch(id exception) { + ReportDiscardedDelegateException(selector, exception); + } + return result; +} + id CallResourceLoadDelegate(IMP implementation, WebView *self, SEL selector, id object1, id object2) { return CallDelegate(implementation, self, self->_private->resourceProgressDelegate, selector, object1, object2); diff --git a/Source/WebKit/mac/WebView/WebNotification.h b/Source/WebKit/mac/WebView/WebNotification.h index 49255690b..83ddad6a8 100644 --- a/Source/WebKit/mac/WebView/WebNotification.h +++ b/Source/WebKit/mac/WebView/WebNotification.h @@ -38,6 +38,8 @@ - (NSString *)body; - (NSString *)tag; - (NSString *)iconURL; +- (NSString *)lang; +- (NSString *)dir; - (WebSecurityOrigin *)origin; - (uint64_t)notificationID; diff --git a/Source/WebKit/mac/WebView/WebNotification.mm b/Source/WebKit/mac/WebView/WebNotification.mm index 2b60bfe69..f36c2672f 100644 --- a/Source/WebKit/mac/WebView/WebNotification.mm +++ b/Source/WebKit/mac/WebView/WebNotification.mm @@ -117,6 +117,24 @@ Notification* core(WebNotification *notification) #endif } +- (NSString *)lang +{ +#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS) + return core(self)->lang(); +#else + return nil; +#endif +} + +- (NSString *)dir +{ +#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS) + return core(self)->dir(); +#else + return nil; +#endif +} + - (WebSecurityOrigin *)origin { #if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS) diff --git a/Source/WebKit/qt/ChangeLog b/Source/WebKit/qt/ChangeLog index 1ae43c77a..2f159f65b 100644 --- a/Source/WebKit/qt/ChangeLog +++ b/Source/WebKit/qt/ChangeLog @@ -1,3 +1,56 @@ +2012-09-11 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> + + [Qt] Add a configure step to the Qt build system + + This allows building the Qt port using just 'qmake WebKit.pro'. Using + the build-webkit script is still supported, and will add slightly more + logic to the build, such as detecting the need for clean or incremental + builds. + + Internally, the build system now uses a new variable, WEBKIT_CONFIG, for + all things related to configuring the build, such as use/have/enable flags, + and these are translated to defines in default_post. Project files should + no longer check contains(DEFINES,...) to detect features, but use the new + enable?(), use?(), and have?() functions. The no_webkit1 and no_webkit2 + options have been translated into WEBKIT_CONFIG options as well, and can + be checked using build?(). + + Reviewed by Simon Hausmann. + + * declarative/declarative.pro: + * declarative/public.pri: + * tests/qgraphicswebview/qgraphicswebview.pro: + +2012-09-11 Andras Becsi <andras.becsi@nokia.com> + + [Qt][WK2] Fix the build with recent Qt5 + https://bugs.webkit.org/show_bug.cgi?id=96283 + + Reviewed by Simon Hausmann. + + We should not use deprecated Qt API because doing that results + in build failure since all the deprecated API was disabled + in qtbase (https://codereview.qt-project.org/#change,24890). + + * tests/qgraphicswebview/tst_qgraphicswebview.cpp: + (tst_QGraphicsWebView::widgetsRenderingThroughCache): + (tst_QGraphicsWebView::setPalette): + (tst_QGraphicsWebView::compareCanvasToImage): + * tests/qobjectbridge/tst_qobjectbridge.cpp: + (tst_QObjectBridge::ownership): + * tests/qwebframe/tst_qwebframe.cpp: + (tst_QWebFrame::popupFocus): + (tst_QWebFrame::inputFieldFocus): + (tst_QWebFrame::evaluateWillCauseRepaint): + * tests/qwebpage/tst_qwebpage.cpp: + (Navigation): + (PluginCounterPage): + * tests/qwebview/tst_qwebview.cpp: + (tst_QWebView::reusePage): + (tst_QWebView::focusInputTypes): + (tst_QWebView::setPalette): + (tst_QWebView::renderingAfterMaxAndBack): + 2012-09-09 Emil A Eklund <eae@chromium.org> Rename Node::getRect/getPixelSnappedRect and remove ContainerNode::getRect diff --git a/Source/WebKit/qt/declarative/declarative.pro b/Source/WebKit/qt/declarative/declarative.pro index 04f2298d0..71ed4f14d 100644 --- a/Source/WebKit/qt/declarative/declarative.pro +++ b/Source/WebKit/qt/declarative/declarative.pro @@ -11,7 +11,7 @@ public_api.file = public.pri public_api.makefile = Makefile.declarative.public SUBDIRS += public_api -!no_webkit2 { +build?(webkit2): { experimental_api.file = experimental/experimental.pri experimental_api.makefile = Makefile.declarative.experimental SUBDIRS += experimental_api diff --git a/Source/WebKit/qt/declarative/public.pri b/Source/WebKit/qt/declarative/public.pri index e5c43db06..754284b6c 100644 --- a/Source/WebKit/qt/declarative/public.pri +++ b/Source/WebKit/qt/declarative/public.pri @@ -26,7 +26,7 @@ wince*:LIBS += $$QMAKE_LIBS_GUI QT += webkit webkit-private widgets quick quick-private -contains(DEFINES, HAVE_QQUICK1=1) { +have?(QQUICK1) { SOURCES += qdeclarativewebview.cpp HEADERS += qdeclarativewebview_p.h } @@ -40,7 +40,7 @@ RPATHDIR_RELATIVE_TO_DESTDIR = ../../lib SOURCES += plugin.cpp -!no_webkit2: { +build?(webkit2): { DEFINES += HAVE_WEBKIT2 QT += network } diff --git a/Source/WebKit/qt/tests/qgraphicswebview/qgraphicswebview.pro b/Source/WebKit/qt/tests/qgraphicswebview/qgraphicswebview.pro index 3e9fb1528..78e17a06d 100644 --- a/Source/WebKit/qt/tests/qgraphicswebview/qgraphicswebview.pro +++ b/Source/WebKit/qt/tests/qgraphicswebview/qgraphicswebview.pro @@ -1,6 +1,6 @@ include(../tests.pri) exists($${TARGET}.qrc):RESOURCES += $${TARGET}.qrc -contains(DEFINES, ENABLE_WEBGL=1) { +enable?(WEBGL) { QT += opengl } diff --git a/Source/WebKit/qt/tests/qgraphicswebview/tst_qgraphicswebview.cpp b/Source/WebKit/qt/tests/qgraphicswebview/tst_qgraphicswebview.cpp index 992eb904b..9ae960b9c 100644 --- a/Source/WebKit/qt/tests/qgraphicswebview/tst_qgraphicswebview.cpp +++ b/Source/WebKit/qt/tests/qgraphicswebview/tst_qgraphicswebview.cpp @@ -184,7 +184,7 @@ void tst_QGraphicsWebView::widgetsRenderingThroughCache() scene->addItem(webView); view.setGeometry(QRect(0, 0, 500, 500)); QWidget *const widget = &view; - QTest::qWaitForWindowShown(widget); + QTest::qWaitForWindowExposed(widget); // 1. Reference without tiling. webView->settings()->setAttribute(QWebSettings::TiledBackingStoreEnabled, false); @@ -409,11 +409,11 @@ void tst_QGraphicsWebView::setPalette() QVERIFY(webView1.palette() == palette1); QVERIFY(webView1.page()->palette() == palette1); - QTest::qWaitForWindowShown(&view1); + QTest::qWaitForWindowExposed(&view1); if (!active) { controlView.show(); - QTest::qWaitForWindowShown(&controlView); + QTest::qWaitForWindowExposed(&controlView); QApplication::setActiveWindow(&controlView); activeView = &controlView; controlView.activateWindow(); @@ -464,11 +464,11 @@ void tst_QGraphicsWebView::setPalette() webView2.setPalette(palette2); view2.show(); - QTest::qWaitForWindowShown(&view2); + QTest::qWaitForWindowExposed(&view2); if (!active) { controlView.show(); - QTest::qWaitForWindowShown(&controlView); + QTest::qWaitForWindowExposed(&controlView); QApplication::setActiveWindow(&controlView); activeView = &controlView; controlView.activateWindow(); @@ -610,7 +610,7 @@ void tst_QGraphicsWebView::compareCanvasToImage(const QUrl& url, const QImage& r { GraphicsView view; view.show(); - QTest::qWaitForWindowShown(&view); + QTest::qWaitForWindowExposed(&view); QGraphicsWebView* const graphicsWebView = view.m_webView; graphicsWebView->load(url); @@ -620,7 +620,6 @@ void tst_QGraphicsWebView::compareCanvasToImage(const QUrl& url, const QImage& r QPainter painter(&pixmap); view.render(&painter); } - QApplication::syncX(); const QSize imageSize = reference.size(); diff --git a/Source/WebKit/qt/tests/qobjectbridge/tst_qobjectbridge.cpp b/Source/WebKit/qt/tests/qobjectbridge/tst_qobjectbridge.cpp index 13d98af93..ec9c71286 100644 --- a/Source/WebKit/qt/tests/qobjectbridge/tst_qobjectbridge.cpp +++ b/Source/WebKit/qt/tests/qobjectbridge/tst_qobjectbridge.cpp @@ -2039,7 +2039,7 @@ void tst_QObjectBridge::ownership() { // test ownership { - QWeakPointer<QObject> ptr = new QObject(); + QPointer<QObject> ptr = new QObject(); QVERIFY(ptr); { QWebPage page; @@ -2049,7 +2049,7 @@ void tst_QObjectBridge::ownership() QVERIFY(!ptr); } { - QWeakPointer<QObject> ptr = new QObject(); + QPointer<QObject> ptr = new QObject(); QVERIFY(ptr); QObject* before = ptr.data(); { @@ -2073,7 +2073,7 @@ void tst_QObjectBridge::ownership() QCOMPARE(qvariant_cast<QObject*>(v), (QObject *)0); } { - QWeakPointer<QObject> ptr = new QObject(); + QPointer<QObject> ptr = new QObject(); QVERIFY(ptr); { QWebPage page; @@ -2085,7 +2085,7 @@ void tst_QObjectBridge::ownership() } { QObject* parent = new QObject(); - QWeakPointer<QObject> child = new QObject(parent); + QPointer<QObject> child = new QObject(parent); QVERIFY(child); { QWebPage page; diff --git a/Source/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp b/Source/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp index 4c2d042f8..426893ff9 100644 --- a/Source/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp +++ b/Source/WebKit/qt/tests/qwebframe/tst_qwebframe.cpp @@ -601,7 +601,7 @@ void tst_QWebFrame::popupFocus() // Call setFocus before show to work around http://bugreports.qt.nokia.com/browse/QTBUG-14762 view.setFocus(); view.show(); - QTest::qWaitForWindowShown(&view); + QTest::qWaitForWindowExposed(&view); view.activateWindow(); QTRY_VERIFY(view.hasFocus()); @@ -625,7 +625,7 @@ void tst_QWebFrame::inputFieldFocus() view.setHtml("<html><body><input type=\"text\"></input></body></html>"); view.resize(400, 100); view.show(); - QTest::qWaitForWindowShown(&view); + QTest::qWaitForWindowExposed(&view); view.activateWindow(); view.setFocus(); QTRY_VERIFY(view.hasFocus()); @@ -1027,7 +1027,7 @@ void tst_QWebFrame::evaluateWillCauseRepaint() view.setHtml(html); view.show(); - QTest::qWaitForWindowShown(&view); + QTest::qWaitForWindowExposed(&view); view.page()->mainFrame()->evaluateJavaScript( "document.getElementById('junk').style.display = 'none';"); diff --git a/Source/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp b/Source/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp index 67b45b18e..0099d410a 100644 --- a/Source/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp +++ b/Source/WebKit/qt/tests/qwebpage/tst_qwebpage.cpp @@ -395,7 +395,7 @@ public: TestPage(QObject* parent = 0) : QWebPage(parent) {} struct Navigation { - QWeakPointer<QWebFrame> frame; + QPointer<QWebFrame> frame; QNetworkRequest request; NavigationType type; }; @@ -893,7 +893,7 @@ void tst_QWebPage::createPluginWithPluginsDisabled() class PluginCounterPage : public QWebPage { public: int m_count; - QWeakPointer<QObject> m_widget; + QPointer<QObject> m_widget; QObject* m_pluginParent; PluginCounterPage(QObject* parent = 0) : QWebPage(parent) diff --git a/Source/WebKit/qt/tests/qwebview/tst_qwebview.cpp b/Source/WebKit/qt/tests/qwebview/tst_qwebview.cpp index c1f8ac6a2..8e646e196 100644 --- a/Source/WebKit/qt/tests/qwebview/tst_qwebview.cpp +++ b/Source/WebKit/qt/tests/qwebview/tst_qwebview.cpp @@ -139,7 +139,7 @@ void tst_QWebView::reusePage() QFETCH(QString, html); QWebView* view1 = new QWebView; - QWeakPointer<QWebPage> page = new QWebPage; + QPointer<QWebPage> page = new QWebPage; view1->setPage(page.data()); page.data()->settings()->setAttribute(QWebSettings::PluginsEnabled, true); QWebFrame* mainFrame = page.data()->mainFrame(); @@ -150,14 +150,14 @@ void tst_QWebView::reusePage() } view1->show(); - QTest::qWaitForWindowShown(view1); + QTest::qWaitForWindowExposed(view1); delete view1; QVERIFY(page != 0); // deleting view must not have deleted the page, since it's not a child of view QWebView *view2 = new QWebView; view2->setPage(page.data()); view2->show(); // in Windowless mode, you should still be able to see the plugin here - QTest::qWaitForWindowShown(view2); + QTest::qWaitForWindowExposed(view2); delete view2; delete page.data(); // must not crash @@ -234,7 +234,7 @@ void tst_QWebView::focusInputTypes() { QWebView webView; webView.show(); - QTest::qWaitForWindowShown(&webView); + QTest::qWaitForWindowExposed(&webView); QUrl url("qrc:///resources/input_types.html"); QWebFrame* const mainFrame = webView.page()->mainFrame(); @@ -360,11 +360,11 @@ void tst_QWebView::setPalette() view1.page()->setViewportSize(view1.page()->currentFrame()->contentsSize()); view1.show(); - QTest::qWaitForWindowShown(&view1); + QTest::qWaitForWindowExposed(&view1); if (!active) { controlView.show(); - QTest::qWaitForWindowShown(&controlView); + QTest::qWaitForWindowExposed(&controlView); activeView = &controlView; controlView.activateWindow(); } else { @@ -407,11 +407,11 @@ void tst_QWebView::setPalette() view2.page()->setViewportSize(view2.page()->currentFrame()->contentsSize()); view2.show(); - QTest::qWaitForWindowShown(&view2); + QTest::qWaitForWindowExposed(&view2); if (!active) { controlView.show(); - QTest::qWaitForWindowShown(&controlView); + QTest::qWaitForWindowExposed(&controlView); activeView = &controlView; controlView.activateWindow(); } else { @@ -449,7 +449,7 @@ void tst_QWebView::renderingAfterMaxAndBack() view.page()->settings()->setMaximumPagesInCache(3); - QTest::qWaitForWindowShown(&view); + QTest::qWaitForWindowExposed(&view); QPixmap reference(view.page()->viewportSize()); reference.fill(Qt::red); @@ -470,7 +470,7 @@ void tst_QWebView::renderingAfterMaxAndBack() view.showMaximized(); - QTest::qWaitForWindowShown(&view); + QTest::qWaitForWindowExposed(&view); QPixmap reference2(view.page()->viewportSize()); reference2.fill(Qt::blue); diff --git a/Source/WebKit/win/ChangeLog b/Source/WebKit/win/ChangeLog index c01990047..8a111a006 100644 --- a/Source/WebKit/win/ChangeLog +++ b/Source/WebKit/win/ChangeLog @@ -1,3 +1,19 @@ +2012-09-10 Beth Dakin <bdakin@apple.com> + + https://bugs.webkit.org/show_bug.cgi?id=96158 + Need API to suppress scrollbar animations + -and corresponding- + <rdar://problem/12210972> + + Reviewed by Sam Weinig. + + ScrollableArea::isOnActivePage() has been re-named to + ScrollableArea:: scrollbarsCanBeActive(). + * WebScrollBar.cpp: + (WebScrollBar::scrollbarsCanBeActive): + * WebScrollBar.h: + (WebScrollBar): + 2012-09-10 Dominic Mazzoni <dmazzoni@google.com> AX: Update Windows port accessible role mappings to fix some tests diff --git a/Source/WebKit/win/WebScrollBar.cpp b/Source/WebKit/win/WebScrollBar.cpp index f172196b3..a7e9662eb 100644 --- a/Source/WebKit/win/WebScrollBar.cpp +++ b/Source/WebKit/win/WebScrollBar.cpp @@ -300,7 +300,7 @@ WebCore::IntSize WebScrollBar::contentsSize() const return m_scrollBar->frameRect().size(); } -bool WebScrollBar::isOnActivePage() const +bool WebScrollBar::scrollbarsCanBeActive() const { return true; } diff --git a/Source/WebKit/win/WebScrollBar.h b/Source/WebKit/win/WebScrollBar.h index dfd1ef040..b7f599b93 100644 --- a/Source/WebKit/win/WebScrollBar.h +++ b/Source/WebKit/win/WebScrollBar.h @@ -120,7 +120,7 @@ protected: virtual int visibleHeight() const OVERRIDE; virtual int visibleWidth() const OVERRIDE; virtual WebCore::IntSize contentsSize() const OVERRIDE; - virtual bool isOnActivePage() const OVERRIDE; + virtual bool scrollbarsCanBeActive() const OVERRIDE; virtual WebCore::IntRect scrollableAreaBoundingBox() const OVERRIDE; // FIXME: We should provide a way to set this value. diff --git a/Source/WebKit2/CMakeLists.txt b/Source/WebKit2/CMakeLists.txt index f2ba7471b..16e6eab5c 100644 --- a/Source/WebKit2/CMakeLists.txt +++ b/Source/WebKit2/CMakeLists.txt @@ -604,10 +604,6 @@ TARGET_LINK_LIBRARIES(${WebProcess_EXECUTABLE_NAME} ${WebProcess_LIBRARIES}) SET_TARGET_PROPERTIES(${WebProcess_EXECUTABLE_NAME} PROPERTIES FOLDER "WebKit") SET_TARGET_PROPERTIES(${WebKit2_LIBRARY_NAME} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) -IF (WebKit2_LINK_FLAGS) - ADD_TARGET_PROPERTIES(${WebKit2_LIBRARY_NAME} LINK_FLAGS "${WebKit2_LINK_FLAGS}") - ADD_TARGET_PROPERTIES(${WebProcess_EXECUTABLE_NAME} LINK_FLAGS "${WebKit2_LINK_FLAGS}") -ENDIF () INSTALL(TARGETS ${WebKit2_LIBRARY_NAME} DESTINATION "${LIB_INSTALL_DIR}") INSTALL(TARGETS ${WebProcess_EXECUTABLE_NAME} DESTINATION "${EXEC_INSTALL_DIR}") diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog index 83ca1d8d9..ceaaf2831 100644 --- a/Source/WebKit2/ChangeLog +++ b/Source/WebKit2/ChangeLog @@ -1,3 +1,518 @@ +2012-09-11 Brady Eidson <beidson@apple.com> + + We should wait longer before killing the PluginProcess. + <rdar://problem/12067728> and https://bugs.webkit.org/show_bug.cgi?id=96407 + + Reviewed by Anders Carlsson. + + Currently we kill the PluginProcess 15 seconds after the last plug-in is destroyed. + This is short enough that most users will have the process killed many times during browsing sessions, + which is painful because relaunching the process is I/O and kernel intensive. + + In an ideal world we could keep it around forever until the system tells us resources are running low. + + In reality we do want to kill it occasionally to get a clean slate from any plug-in leaks. + + A reasonable balance for now is to set a minimum lifetime of 30 minutes on the plug-in process and to + extend the termination timer from 15 seconds to 10 minutes. + + * PluginProcess/PluginProcess.cpp: + (WebKit::PluginProcess::PluginProcess): + (WebKit::PluginProcess::initializePluginProcess): + (WebKit::PluginProcess::setMinimumLifetime): + (WebKit): + (WebKit::PluginProcess::minimumLifetimeTimerFired): + * PluginProcess/PluginProcess.h: + (PluginProcess): + + * Shared/Plugins/PluginProcessCreationParameters.cpp: + (WebKit::PluginProcessCreationParameters::encode): + (WebKit::PluginProcessCreationParameters::decode): + * Shared/Plugins/PluginProcessCreationParameters.h: + (PluginProcessCreationParameters): + + * UIProcess/Plugins/PluginProcessProxy.cpp: + (WebKit): + (WebKit::PluginProcessProxy::didFinishLaunching): + +2012-09-11 Jinwoo Song <jinwoo7.song@samsung.com> + + Deploy StringBuilder::appendNumber() and StringBuilder::appendLiteral() in more places + https://bugs.webkit.org/show_bug.cgi?id=96344 + + Reviewed by Benjamin Poulain. + + Use StringBuilder::appendNumber() instead of String::number(). Also deploy + StringBuilder::appendLiteral() instead of String::append() in the surrounding code. + + * Shared/WebMemorySampler.cpp: + (WebKit::WebMemorySampler::appendCurrentMemoryUsageToFile): + * UIProcess/InspectorServer/WebSocketServerConnection.cpp: + (WebKit::WebSocketServerConnection::sendHTTPResponseHeader): + * UIProcess/InspectorServer/qt/WebInspectorServerQt.cpp: + (WebKit::WebInspectorServer::inspectorUrlForPageID): + (WebKit::WebInspectorServer::buildPageList): + +2012-09-11 Anders Carlsson <andersca@apple.com> + + Fix speling error in comment. + + * WebProcess/Plugins/Netscape/NetscapePlugin.cpp: + (WebKit::isTransparentSilverlightBackgroundValue): + +2012-09-11 Raphael Kubo da Costa <rakuco@webkit.org> + + [EFL] Rewrite the EFL-related Find modules + https://bugs.webkit.org/show_bug.cgi?id=95237 + + Reviewed by Kenneth Rohde Christiansen. + + * CMakeLists.txt: Stop setting the LINK_FLAGS property. + * PlatformEfl.cmake: Add libraries and include directories for + each Enlightenment Foundation Library used by the port. + +2012-09-11 Christophe Dumez <christophe.dumez@intel.com> + + [WK2][WKTR] TestRunner needs to implement setApplicationCacheOriginQuota + https://bugs.webkit.org/show_bug.cgi?id=96379 + + Reviewed by Kenneth Rohde Christiansen. + + Add Bundle C API to set the application cache quota for a + given security origin. This is needed by WebKitTestRunner + to implement setApplicationCacheOriginQuota(). + + * WebProcess/InjectedBundle/API/c/WKBundle.cpp: + (WKBundleSetApplicationCacheOriginQuota): + * WebProcess/InjectedBundle/API/c/WKBundlePrivate.h: + * WebProcess/InjectedBundle/InjectedBundle.cpp: + (WebKit::InjectedBundle::setApplicationCacheOriginQuota): + (WebKit): + * WebProcess/InjectedBundle/InjectedBundle.h: + (InjectedBundle): + +2012-09-11 Mikhail Pozdnyakov <mikhail.pozdnyakov@intel.com> + + [WK2][WTR] WebKitTestRunner needs testRunner.setSpatialNavigationEnabled + https://bugs.webkit.org/show_bug.cgi?id=96269 + + Reviewed by Kenneth Rohde Christiansen. + + Added a new setter for spacial navigation enabling to Injected Bundle private API. + + * WebProcess/InjectedBundle/API/c/WKBundle.cpp: + (WKBundleSetSpatialNavigationEnabled): + * WebProcess/InjectedBundle/API/c/WKBundlePrivate.h: + * WebProcess/InjectedBundle/InjectedBundle.cpp: + (WebKit::InjectedBundle::setSpatialNavigationEnabled): + (WebKit): + * WebProcess/InjectedBundle/InjectedBundle.h: + (InjectedBundle): + +2012-09-11 Marcelo Lira <marcelo.lira@openbossa.org> + + [Qt][WK2] Page loading status API lacks a status for intentionally stopped loading + https://bugs.webkit.org/show_bug.cgi?id=83062 + + Reviewed by Tor Arne Vestbø. + + When the loading of a page is intentionally interrupted, the loading + status is set to the new state LoadStoppedStatus. This reflects + reality more accurately because the page was not fully loaded + (a LoadSucceededStatus), and it wasn't an unexpected error + (a LoadFailedStatus). + + * UIProcess/API/qt/qquickwebview.cpp: + (QQuickWebViewPrivate::loadDidStop): + * UIProcess/API/qt/qquickwebview_p.h: + * UIProcess/API/qt/qquickwebview_p_p.h: + (QQuickWebViewPrivate): + * UIProcess/API/qt/tests/publicapi/tst_publicapi.cpp: + * UIProcess/API/qt/tests/qmltests/WebView/tst_loadUrl.qml: + * UIProcess/API/qt/tests/qmltests/common/TestWebView.qml: + * UIProcess/qt/QtWebPageLoadClient.cpp: + (WebKit::QtWebPageLoadClient::dispatchLoadStopped): + (WebKit): + (WebKit::QtWebPageLoadClient::dispatchLoadFailed): + * UIProcess/qt/QtWebPageLoadClient.h: + (QtWebPageLoadClient): + +2012-09-11 Tor Arne Vestbø <tor.arne.vestbo@nokia.com> + + [Qt] Add a configure step to the Qt build system + + This allows building the Qt port using just 'qmake WebKit.pro'. Using + the build-webkit script is still supported, and will add slightly more + logic to the build, such as detecting the need for clean or incremental + builds. + + Internally, the build system now uses a new variable, WEBKIT_CONFIG, for + all things related to configuring the build, such as use/have/enable flags, + and these are translated to defines in default_post. Project files should + no longer check contains(DEFINES,...) to detect features, but use the new + enable?(), use?(), and have?() functions. The no_webkit1 and no_webkit2 + options have been translated into WEBKIT_CONFIG options as well, and can + be checked using build?(). + + Reviewed by Simon Hausmann. + + * Target.pri: + * UIProcess/API/qt/tests/tests.pri: + * WebKit2.pri: + * config.h: + +2012-09-11 Christophe Dumez <christophe.dumez@intel.com> + + [WK2][WKTR] TestRunner needs to implement clearApplicationCacheForOrigin + https://bugs.webkit.org/show_bug.cgi?id=96372 + + Reviewed by Kenneth Rohde Christiansen. + + Add Bundle C API to clear the application cache for a + given origin. This is needed by WebKitTestRunner to + implement clearApplicationCacheForOrigin(). + + * WebProcess/InjectedBundle/API/c/WKBundle.cpp: + (WKBundleClearApplicationCacheForOrigin): + * WebProcess/InjectedBundle/API/c/WKBundlePrivate.h: + * WebProcess/InjectedBundle/InjectedBundle.cpp: + (WebKit::InjectedBundle::clearApplicationCacheForOrigin): + (WebKit): + * WebProcess/InjectedBundle/InjectedBundle.h: + (InjectedBundle): + +2012-09-11 Mikhail Pozdnyakov <mikhail.pozdnyakov@intel.com> + + [WK2][WTR] WebKitTestRunner needs layoutTestController.setMinimumTimerInterval + https://bugs.webkit.org/show_bug.cgi?id=96256 + + Reviewed by Kenneth Rohde Christiansen. + + Added new setter for minimum DOM timer interval to InjectedBundle private API. + + * WebProcess/InjectedBundle/API/c/WKBundle.cpp: + (WKBundleSetMinimumTimerInterval): + * WebProcess/InjectedBundle/API/c/WKBundlePrivate.h: + * WebProcess/InjectedBundle/InjectedBundle.cpp: + (WebKit::InjectedBundle::setMinimumTimerInterval): + (WebKit): + * WebProcess/InjectedBundle/InjectedBundle.h: + (InjectedBundle): + +2012-09-11 Kangil Han <kangil.han@samsung.com> + + [WK2][EFL] Fix compile warnings when enable tiled backing store + https://bugs.webkit.org/show_bug.cgi?id=95342 + + Reviewed by Gyuyoung Kim. + + Fixed compile time warning messages when enable tiled backing store. + + * UIProcess/API/efl/ewk_view.cpp: + (ewk_view_accelerated_compositing_mode_enter): Fixed invalid use of 'EINA_SAFETY_ON_NULL_RETURN_VAL' since it used '!' ahead of evasGl value so it is always null. + * WebProcess/WebPage/CoordinatedGraphics/CoordinatedGraphicsLayer.cpp: + (WebCore::CoordinatedGraphicsLayer::setChildren): Replaced 'int' i with 'unsigned' because its comparing value is 'size_t'. + * WebProcess/WebPage/CoordinatedGraphics/LayerTreeCoordinator.cpp: + (WebKit::LayerTreeCoordinator::renderNextFrame): Replaced 'int' i with 'unsigned' because its comparing value is 'size_t'. + (WebKit::LayerTreeCoordinator::beginContentUpdate): Replaced 'int' i with 'unsigned' because its comparing value is 'size_t'. + +2012-09-11 Byungwoo Lee <bw80.lee@samsung.com> + + [EFL][WK2] WKEinaSharedString needs a function to adopt eina stringshare. + https://bugs.webkit.org/show_bug.cgi?id=96201 + + Reviewed by Kenneth Rohde Christiansen. + + WKEinaSharedString needs a to adopt eina stringshare directly. + + With this adopt function, an instance that is directly created with + eina_stringshare_add() can be easily handled by WKEinaSharedString + without calling eina_stringshare_del() for preventing memory leak. + + * UIProcess/API/cpp/efl/WKEinaSharedString.cpp: + (WKEinaSharedString::adopt): + * UIProcess/API/cpp/efl/WKEinaSharedString.h: + * UIProcess/API/efl/tests/test_ewk2_eina_shared_string.cpp: + (TEST_F): + +2012-09-11 Andras Becsi <andras.becsi@nokia.com> + + [Qt][WK2] Fix the build with recent Qt5 + https://bugs.webkit.org/show_bug.cgi?id=96283 + + Reviewed by Simon Hausmann. + + We should not use deprecated Qt API because doing that results + in build failure since all the deprecated API was disabled + in qtbase (https://codereview.qt-project.org/#change,24890). + + * UIProcess/API/qt/qwebnavigationhistory.cpp: + (QWebNavigationListModel::roleNames): + (QWebNavigationListModel::reset): + * UIProcess/API/qt/qwebnavigationhistory_p.h: + * UIProcess/API/qt/tests/qrawwebview/tst_qrawwebview.cpp: + (WebView::load): + * UIProcess/qt/WebPopupMenuProxyQt.cpp: + (PopupMenuItemModel): + (WebKit::PopupMenuItemModel::PopupMenuItemModel): + (WebKit::PopupMenuItemModel::roleNames): + (WebKit): + +2012-09-11 Christophe Dumez <christophe.dumez@intel.com> + + WTR needs an implementation of applicationCacheDiskUsageForOrigin + https://bugs.webkit.org/show_bug.cgi?id=87188 + + Reviewed by Kenneth Rohde Christiansen. + + Add Bundle private C API to retrieve the application cache + usage for a specific security origin. This is needed by + WebKitTestRunner. + + * WebProcess/InjectedBundle/API/c/WKBundle.cpp: + (WKBundleGetAppCacheUsageForOrigin): + * WebProcess/InjectedBundle/API/c/WKBundlePrivate.h: + * WebProcess/InjectedBundle/InjectedBundle.cpp: + (WebKit::InjectedBundle::appCacheUsageForOrigin): + (WebKit): + * WebProcess/InjectedBundle/InjectedBundle.h: + (InjectedBundle): + +2012-09-11 Zhigang Gong <zhigang.gong@linux.intel.com> + + [EFL][WK2] Add necessary include directory in WebKit2 + https://bugs.webkit.org/show_bug.cgi?id=95173 + + Unreviewed build fix. + + revision r126694: Move TextureMapperGL to use + GraphicsContext3D. modify the TextureMapperGL.h to include + GraphicsContext3D.h. And when enable TEXTURE_MAPPER, + file WebKit2/Shared/ShareableSurface.cpp will include + TextureMapperGL.h then depends on GraphicsContext3D.h + thus it need to add ANGLE director. As currently, this + problem only affect EFL platform, according to Gyuyoung Kim's + suggestion, we add this include dir into EFL private file + PlatformEfl.cmake. Otherwise, the build will fail. + + To trigger this problem by using the following command: + ./Tools/Scripts/build-webkit --efl --3d-rendering --tiled-backing-store + + * CMakeLists.txt: + +2012-09-10 Byungwoo Lee <bw80.lee@samsung.com> + + [EFL][WK2] Build warning : fix warning about extended initializer lists on EWK2UnitTestBase.cpp. + https://bugs.webkit.org/show_bug.cgi?id=95990 + + Reviewed by Gyuyoung Kim. + + Fix build warning about extended initializer lists only available with + -std=c++0x or -std=gnu++0x. + + * UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.cpp: + (EWK2UnitTest::ewk2UnitTestBrowserViewSmartClass): + (EWK2UnitTest): + (EWK2UnitTest::EWK2UnitTestBase::EWK2UnitTestBase): + +2012-09-10 Beth Dakin <bdakin@apple.com> + + https://bugs.webkit.org/show_bug.cgi?id=96158 + Need API to suppress scrollbar animations + -and corresponding- + <rdar://problem/12210972> + + Reviewed by Sam Weinig. + + Add suppressScrollbarAnimations as a WebCreationParameter. + * Shared/WebPageCreationParameters.h: + (WebPageCreationParameters): + + New API. Calls into the web process for the setter but not the + getter. + * UIProcess/API/C/WKPage.cpp: + (WKPageSetSuppressScrollbarAnimations): + (WKPageAreScrollbarAnimationsSuppressed): + * UIProcess/API/C/WKPage.h: + * UIProcess/WebPageProxy.cpp: + (WebKit::WebPageProxy::WebPageProxy): + (WebKit::WebPageProxy::setSuppressScrollbarAnimations): + (WebKit): + (WebKit::WebPageProxy::creationParameters): + * UIProcess/WebPageProxy.h: + (WebPageProxy): + (WebKit::WebPageProxy::areScrollbarAnimationsSuppressed): + * WebProcess/WebPage/WebPage.messages.in: + + Call into WebCore. + * WebProcess/WebPage/WebPage.cpp: + (WebKit::WebPage::setSuppressScrollbarAnimations): + (WebKit): + * WebProcess/WebPage/WebPage.h: + (WebPage): + + This ScrollableArea area function is re-named by this patch in + WebCore. + * WebProcess/Plugins/PDF/BuiltInPDFView.h: + * WebProcess/Plugins/PDF/BuiltInPDFView.mm: + (WebKit::BuiltInPDFView::scrollbarsCanBeActive): + +2012-09-10 James Robinson <jamesr@chromium.org> + + Unreviewed, rolling out r127837. + http://trac.webkit.org/changeset/127837 + https://bugs.webkit.org/show_bug.cgi?id=93898 + + Broke ScrollingCoordinator on chromium + + * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm: + (WebKit::TiledCoreAnimationDrawingArea::updatePreferences): + +2012-09-10 Jer Noble <jer.noble@apple.com> + + Unreviewed; rolling out r128081. + http://trac.webkit.org/changeset/128081 + https://bugs.webkit.org/show_bug.cgi?id=96134 + + New test http/tests/media/video-donottrack.html fails to run on Apple test bots. + + * Shared/APIClientTraits.h: + * WebProcess/InjectedBundle/API/c/WKBundlePage.h: + * WebProcess/InjectedBundle/InjectedBundlePageLoaderClient.cpp: + * WebProcess/InjectedBundle/InjectedBundlePageLoaderClient.h: + (InjectedBundlePageLoaderClient): + * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp: + * WebProcess/WebCoreSupport/WebFrameLoaderClient.h: + (WebFrameLoaderClient): + * WebProcess/qt/QtBuiltinBundlePage.cpp: + (WebKit::QtBuiltinBundlePage::QtBuiltinBundlePage): + +2012-09-07 Jon Lee <jonlee@apple.com> + + Update notifications to latest spec + https://bugs.webkit.org/show_bug.cgi?id=91726 + <rdar://problem/11910451> + + Reviewed by Alexey Proskuryakov. + + Expose lang and dir. + + * UIProcess/API/C/WKNotification.cpp: + (WKNotificationCopyLang): + (WKNotificationCopyDir): + * UIProcess/API/C/WKNotification.h: + * UIProcess/Notifications/WebNotification.cpp: + (WebKit::WebNotification::WebNotification): + * UIProcess/Notifications/WebNotification.h: + (WebKit::WebNotification::create): + (WebKit::WebNotification::lang): + (WebKit::WebNotification::dir): + (WebNotification): + * UIProcess/Notifications/WebNotificationManagerProxy.cpp: + (WebKit::WebNotificationManagerProxy::show): + * UIProcess/Notifications/WebNotificationManagerProxy.h: + (WebNotificationManagerProxy): + * UIProcess/WebPageProxy.cpp: + (WebKit::WebPageProxy::showNotification): + * UIProcess/WebPageProxy.h: + (WebPageProxy): + * UIProcess/WebPageProxy.messages.in: + * WebProcess/Notifications/WebNotificationManager.cpp: + (WebKit::WebNotificationManager::show): + +2012-09-10 Alexey Proskuryakov <ap@apple.com> + + Build fix. + + * UIProcess/WebContext.h: Added a default value for relatedPage argment - if + you don't have one, null is fine. + +2012-09-10 Alexey Proskuryakov <ap@apple.com> + + [WK2] Add an API to open a page in same process + https://bugs.webkit.org/show_bug.cgi?id=96306 + + Reviewed by Anders Carlsson. + + The name "related" inspired by <http://wiki.whatwg.org/wiki/Links_to_Unrelated_Browsing_Contexts>. + + * UIProcess/API/mac/WKView.h: Added an API. It's unwieldy, but I blame + WKBrowsingContextGroup, not the related view. + + * UIProcess/API/mac/WKViewPrivate.h: Matching SPI for clients that mostly use + C APIs. + + * UIProcess/API/mac/WKView.mm: + (-[WKView initWithFrame:processGroup:browsingContextGroup:]): Use new back-end + signature. + (-[WKView initWithFrame:processGroup:browsingContextGroup:relatedToView:]): + Get page from WKView, and call back-end. + (-[WKView initWithFrame:contextRef:pageGroupRef:]): Reimplement existing method + by calling new, more powerful one. + (-[WKView initWithFrame:contextRef:pageGroupRef:relatedToPage:]): Just one change, + pass relatedPage to the context. + + * UIProcess/WebContext.cpp: (WebKit::WebContext::createWebPage): If related page + is not null, use its process. + + * UIProcess/WebContext.h: (WebContext): Updated createWebPage signature. + +2012-09-10 Brady Eidson <beidson@apple.com> + + Javascript in foreground tabs should not wait synchronously for plug-ins to load + <rdar://problem/12067415> and https://bugs.webkit.org/show_bug.cgi?id=96167 + + Reviewed by Geoff Garen. + + Synchronously waiting for initialization to complete when javascript accesses the plug-in script object severely + reduces the effectiveness of having an asynchronous NPP_New. + + Such as with background tabs that have never been viewed, we already have cases where JS calls into the plug-in + element fail because we haven't bothered to initialize the plug-in. + + We get a huge win by expanding that to foreground tabs that simply haven't finished initializing their plug-ins. + + * WebProcess/Plugins/PluginView.cpp: + (WebKit::PluginView::scriptObject): If initialization is not complete just return 0 - They can get at the script object later. + + Remove the notion of "wait for asynchronous initialization" altogether: + * WebProcess/Plugins/Netscape/NetscapePlugin.h: + (NetscapePlugin): + * WebProcess/Plugins/PDF/BuiltInPDFView.h: + (BuiltInPDFView): + * WebProcess/Plugins/Plugin.h: + (Plugin): + * WebProcess/Plugins/PluginProxy.cpp: + * WebProcess/Plugins/PluginProxy.h: + (PluginProxy): + +2012-09-07 Jer Noble <jer.noble@apple.com> + + <audio> and <video> should send Do Not Track when appropriate + https://bugs.webkit.org/show_bug.cgi?id=96134 + + Reviewed by Eric Carlson. + + Add support for the shouldSendDoNotTrackHTTPHeader by passing the request + on to the WebFrameLoadDelegate. + + * Shared/APIClientTraits.cpp: Increment the interfaceSizes for + WKBundlePageLoaderClient by the value of the new functions. + * Shared/APIClientTraits.h: Ditto. + * WebProcess/InjectedBundle/API/c/WKBundlePage.h: Add a new API to + WKBundlePageLoaderClient and bump the version number. + * WebProcess/InjectedBundle/InjectedBundlePageLoaderClient.cpp: + (WebKit::InjectedBundlePageLoaderClient::shouldSendDoNotTrackHTTPHeader): + Pass the question on to the client. + * WebProcess/InjectedBundle/InjectedBundlePageLoaderClient.h: + * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp: + (WebKit::WebFrameLoaderClient::shouldSendDoNotTrackHTTPHeader): + Pass the question on to the bundle. + * WebProcess/WebCoreSupport/WebFrameLoaderClient.h: + * WebProcess/qt/QtBuiltinBundlePage.cpp: + (WebKit::QtBuiltinBundlePage::QtBuiltinBundlePage): + Add an entry for the new function in the Qt loader client. + 2012-09-10 Carlos Garcia Campos <cgarcia@igalia.com> [SOUP] Don't convert to UTF-8 the suggestedFilename passed to Download::decideDestinationWithSuggestedFilename() diff --git a/Source/WebKit2/PlatformEfl.cmake b/Source/WebKit2/PlatformEfl.cmake index b49247fd8..9abc6ec34 100644 --- a/Source/WebKit2/PlatformEfl.cmake +++ b/Source/WebKit2/PlatformEfl.cmake @@ -1,12 +1,3 @@ -LIST(APPEND WebKit2_LINK_FLAGS - ${CAIRO_LDFLAGS} - ${ECORE_X_LDFLAGS} - ${EDJE_LDFLAGS} - ${EFLDEPS_LDFLAGS} - ${EFREET_LDFLAGS} - ${EVAS_LDFLAGS} -) - LIST(APPEND WebKit2_SOURCES Platform/efl/ModuleEfl.cpp Platform/efl/WorkQueueEfl.cpp @@ -142,11 +133,13 @@ LIST(APPEND WebKit2_INCLUDE_DIRECTORIES "${WEBKIT2_DIR}/WebProcess/WebCoreSupport/soup" "${WTF_DIR}/wtf/gobject" ${CAIRO_INCLUDE_DIRS} - ${ECORE_X_INCLUDE_DIRS} + ${ECORE_INCLUDE_DIRS} + ${ECORE_EVAS_INCLUDE_DIRS} ${EDJE_INCLUDE_DIRS} - ${EFLDEPS_INCLUDE_DIRS} ${EFREET_INCLUDE_DIRS} + ${EINA_INCLUDE_DIRS} ${EVAS_INCLUDE_DIRS} + ${HARFBUZZ_INCLUDE_DIRS} ${LIBSOUP_INCLUDE_DIRS} ${LIBXML2_INCLUDE_DIR} ${LIBXSLT_INCLUDE_DIRS} @@ -156,12 +149,22 @@ LIST(APPEND WebKit2_INCLUDE_DIRECTORIES ${WTF_DIR} ) +IF (WTF_USE_3D_GRAPHICS) + LIST(APPEND WebKit2_INCLUDE_DIRECTORIES + "${THIRDPARTY_DIR}/ANGLE/include/GLSLANG" + ) +ENDIF () + LIST(APPEND WebKit2_LIBRARIES ${CAIRO_LIBRARIES} - ${ECORE_X_LIBRARIES} - ${EFLDEPS_LIBRARIES} + ${ECORE_LIBRARIES} + ${ECORE_EVAS_LIBRARIES} + ${EDJE_LIBRARIES} ${EFREET_LIBRARIES} + ${EINA_LIBRARIES} + ${EVAS_LIBRARIES} ${Freetype_LIBRARIES} + ${HARFBUZZ_LIBRARIES} ${LIBXML2_LIBRARIES} ${OPENGL_LIBRARIES} ${SQLITE_LIBRARIES} diff --git a/Source/WebKit2/PluginProcess/PluginProcess.cpp b/Source/WebKit2/PluginProcess/PluginProcess.cpp index 6f868bbf8..1bffafe74 100644 --- a/Source/WebKit2/PluginProcess/PluginProcess.cpp +++ b/Source/WebKit2/PluginProcess/PluginProcess.cpp @@ -73,6 +73,7 @@ PluginProcess& PluginProcess::shared() PluginProcess::PluginProcess() : m_supportsAsynchronousPluginInitialization(false) + , m_minimumLifetimeTimer(RunLoop::main(), this, &PluginProcess::minimumLifetimeTimerFired) #if PLATFORM(MAC) , m_compositingRenderServerPort(MACH_PORT_NULL) #endif @@ -159,6 +160,7 @@ void PluginProcess::initializePluginProcess(const PluginProcessCreationParameter m_pluginPath = parameters.pluginPath; m_supportsAsynchronousPluginInitialization = parameters.supportsAsynchronousPluginInitialization; + setMinimumLifetime(parameters.minimumLifetime); setTerminationTimeout(parameters.terminationTimeout); platformInitialize(parameters); @@ -254,6 +256,21 @@ void PluginProcess::clearSiteData(const Vector<String>& sites, uint64_t flags, u m_connection->send(Messages::PluginProcessProxy::DidClearSiteData(callbackID), 0); } +void PluginProcess::setMinimumLifetime(double lifetime) +{ + if (lifetime <= 0.0) + return; + + disableTermination(); + + m_minimumLifetimeTimer.startOneShot(lifetime); +} + +void PluginProcess::minimumLifetimeTimerFired() +{ + enableTermination(); +} + } // namespace WebKit #endif // ENABLE(PLUGIN_PROCESS) diff --git a/Source/WebKit2/PluginProcess/PluginProcess.h b/Source/WebKit2/PluginProcess/PluginProcess.h index bcbd2003e..5ae4d359e 100644 --- a/Source/WebKit2/PluginProcess/PluginProcess.h +++ b/Source/WebKit2/PluginProcess/PluginProcess.h @@ -86,6 +86,9 @@ private: void clearSiteData(const Vector<String>& sites, uint64_t flags, uint64_t maxAgeInSeconds, uint64_t callbackID); void platformInitialize(const PluginProcessCreationParameters&); + + void setMinimumLifetime(double); + void minimumLifetimeTimerFired(); // The connection to the UI process. RefPtr<CoreIPC::Connection> m_connection; @@ -100,12 +103,14 @@ private: RefPtr<NetscapePluginModule> m_pluginModule; bool m_supportsAsynchronousPluginInitialization; + + WebCore::RunLoop::Timer<PluginProcess> m_minimumLifetimeTimer; #if USE(ACCELERATED_COMPOSITING) && PLATFORM(MAC) // The Mach port used for accelerated compositing. mach_port_t m_compositingRenderServerPort; #endif - + }; } // namespace WebKit diff --git a/Source/WebKit2/Shared/Plugins/PluginProcessCreationParameters.cpp b/Source/WebKit2/Shared/Plugins/PluginProcessCreationParameters.cpp index f325eb6ac..8d3950a4c 100644 --- a/Source/WebKit2/Shared/Plugins/PluginProcessCreationParameters.cpp +++ b/Source/WebKit2/Shared/Plugins/PluginProcessCreationParameters.cpp @@ -41,6 +41,7 @@ void PluginProcessCreationParameters::encode(CoreIPC::ArgumentEncoder* encoder) { encoder->encode(pluginPath); encoder->encode(supportsAsynchronousPluginInitialization); + encoder->encode(minimumLifetime); encoder->encode(terminationTimeout); #if PLATFORM(MAC) @@ -55,6 +56,8 @@ bool PluginProcessCreationParameters::decode(CoreIPC::ArgumentDecoder* decoder, return false; if (!decoder->decode(result.supportsAsynchronousPluginInitialization)) return false; + if (!decoder->decode(result.minimumLifetime)) + return false; if (!decoder->decode(result.terminationTimeout)) return false; #if PLATFORM(MAC) diff --git a/Source/WebKit2/Shared/Plugins/PluginProcessCreationParameters.h b/Source/WebKit2/Shared/Plugins/PluginProcessCreationParameters.h index eaadf1957..1d6d2e09c 100644 --- a/Source/WebKit2/Shared/Plugins/PluginProcessCreationParameters.h +++ b/Source/WebKit2/Shared/Plugins/PluginProcessCreationParameters.h @@ -50,6 +50,7 @@ struct PluginProcessCreationParameters { String pluginPath; bool supportsAsynchronousPluginInitialization; + double minimumLifetime; double terminationTimeout; #if PLATFORM(MAC) diff --git a/Source/WebKit2/Shared/WebMemorySampler.cpp b/Source/WebKit2/Shared/WebMemorySampler.cpp index 6f77843ce..868e84823 100644 --- a/Source/WebKit2/Shared/WebMemorySampler.cpp +++ b/Source/WebKit2/Shared/WebMemorySampler.cpp @@ -177,7 +177,7 @@ void WebMemorySampler::appendCurrentMemoryUsageToFile(PlatformFileHandle& file) statString.append(separator); for (size_t i = 0; i < memoryStats.values.size(); ++i) { statString.append(separator); - statString.append(String::number(memoryStats.values[i])); + statString.appendNumber(memoryStats.values[i]); } } statString.append('\n'); diff --git a/Source/WebKit2/Shared/WebPageCreationParameters.h b/Source/WebKit2/Shared/WebPageCreationParameters.h index 97e88b607..08c3bcd21 100644 --- a/Source/WebKit2/Shared/WebPageCreationParameters.h +++ b/Source/WebKit2/Shared/WebPageCreationParameters.h @@ -67,6 +67,8 @@ struct WebPageCreationParameters { bool useFixedLayout; WebCore::IntSize fixedLayoutSize; + bool suppressScrollbarAnimations; + WebCore::Pagination::Mode paginationMode; bool paginationBehavesLikeColumns; double pageLength; diff --git a/Source/WebKit2/Target.pri b/Source/WebKit2/Target.pri index 8d703671f..629852edc 100644 --- a/Source/WebKit2/Target.pri +++ b/Source/WebKit2/Target.pri @@ -745,7 +745,7 @@ SOURCES += \ WebProcess/qt/WebProcessMainQt.cpp \ WebProcess/qt/WebProcessQt.cpp -contains(DEFINES, HAVE_QTQUICK=1) { +have?(QTQUICK) { QT += qml quick quick-private HEADERS += \ @@ -822,7 +822,7 @@ contains(DEFINES, HAVE_QTQUICK=1) { UIProcess/qt/QtWebIconDatabaseClient.cpp \ UIProcess/qt/QtWebPageUIClient.cpp - contains(DEFINES, ENABLE_INPUT_TYPE_COLOR=1) { + enable?(INPUT_TYPE_COLOR) { HEADERS += \ UIProcess/qt/WebColorChooserProxyQt.h SOURCES += \ @@ -831,7 +831,7 @@ contains(DEFINES, HAVE_QTQUICK=1) { } mac: { - contains(DEFINES, WTF_USE_QTKIT=1) { + use?(QTKIT) { DEFINES += NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES INCLUDEPATH += \ $$PWD/../../WebKitLibraries/ @@ -876,7 +876,7 @@ win32 { } -contains(DEFINES, ENABLE_INSPECTOR_SERVER=1) { +enable?(INSPECTOR_SERVER) { HEADERS += \ UIProcess/InspectorServer/WebInspectorServer.h \ UIProcess/InspectorServer/WebSocketServer.h \ @@ -892,7 +892,7 @@ contains(DEFINES, ENABLE_INSPECTOR_SERVER=1) { UIProcess/InspectorServer/qt/WebSocketServerQt.cpp } -contains(DEFINES, ENABLE_TOUCH_EVENTS=1) { +enable?(TOUCH_EVENTS) { HEADERS += \ Shared/NativeWebTouchEvent.h SOURCES += \ @@ -900,11 +900,11 @@ contains(DEFINES, ENABLE_TOUCH_EVENTS=1) { } -contains(DEFINES, ENABLE_GEOLOCATION=1): QT += location +enable?(GEOLOCATION): QT += location -contains(DEFINES, WTF_USE_3D_GRAPHICS=1): WEBKIT += angle +use?(3D_GRAPHICS): WEBKIT += angle -plugin_backend_xlib { +use?(PLUGIN_BACKEND_XLIB) { DEFINES += XP_UNIX PKGCONFIG += x11 DEFINES += MOZ_X11 diff --git a/Source/WebKit2/UIProcess/API/C/WKNotification.cpp b/Source/WebKit2/UIProcess/API/C/WKNotification.cpp index 26700e1aa..78b09e09e 100644 --- a/Source/WebKit2/UIProcess/API/C/WKNotification.cpp +++ b/Source/WebKit2/UIProcess/API/C/WKNotification.cpp @@ -57,6 +57,16 @@ WKStringRef WKNotificationCopyTag(WKNotificationRef notification) return toCopiedAPI(toImpl(notification)->tag()); } +WKStringRef WKNotificationCopyLang(WKNotificationRef notification) +{ + return toCopiedAPI(toImpl(notification)->lang()); +} + +WKStringRef WKNotificationCopyDir(WKNotificationRef notification) +{ + return toCopiedAPI(toImpl(notification)->dir()); +} + WKSecurityOriginRef WKNotificationGetSecurityOrigin(WKNotificationRef notification) { return toAPI(toImpl(notification)->origin()); diff --git a/Source/WebKit2/UIProcess/API/C/WKNotification.h b/Source/WebKit2/UIProcess/API/C/WKNotification.h index 3f4b1a900..7035ef3f8 100644 --- a/Source/WebKit2/UIProcess/API/C/WKNotification.h +++ b/Source/WebKit2/UIProcess/API/C/WKNotification.h @@ -38,6 +38,8 @@ WK_EXPORT WKStringRef WKNotificationCopyTitle(WKNotificationRef notification); WK_EXPORT WKStringRef WKNotificationCopyBody(WKNotificationRef notification); WK_EXPORT WKStringRef WKNotificationCopyIconURL(WKNotificationRef notification); WK_EXPORT WKStringRef WKNotificationCopyTag(WKNotificationRef notification); +WK_EXPORT WKStringRef WKNotificationCopyLang(WKNotificationRef notification); +WK_EXPORT WKStringRef WKNotificationCopyDir(WKNotificationRef notification); WK_EXPORT WKSecurityOriginRef WKNotificationGetSecurityOrigin(WKNotificationRef notification); WK_EXPORT uint64_t WKNotificationGetID(WKNotificationRef notification); diff --git a/Source/WebKit2/UIProcess/API/C/WKPage.cpp b/Source/WebKit2/UIProcess/API/C/WKPage.cpp index 437179bfb..e24c2d6ef 100644 --- a/Source/WebKit2/UIProcess/API/C/WKPage.cpp +++ b/Source/WebKit2/UIProcess/API/C/WKPage.cpp @@ -340,6 +340,16 @@ bool WKPageHasVerticalScrollbar(WKPageRef pageRef) return toImpl(pageRef)->hasVerticalScrollbar(); } +void WKPageSetSuppressScrollbarAnimations(WKPageRef pageRef, bool suppressAnimations) +{ + toImpl(pageRef)->setSuppressScrollbarAnimations(suppressAnimations); +} + +bool WKPageAreScrollbarAnimationsSuppressed(WKPageRef pageRef) +{ + return toImpl(pageRef)->areScrollbarAnimationsSuppressed(); +} + bool WKPageIsPinnedToLeftSide(WKPageRef pageRef) { return toImpl(pageRef)->isPinnedToLeftSide(); diff --git a/Source/WebKit2/UIProcess/API/C/WKPage.h b/Source/WebKit2/UIProcess/API/C/WKPage.h index f7946080b..5566826d3 100644 --- a/Source/WebKit2/UIProcess/API/C/WKPage.h +++ b/Source/WebKit2/UIProcess/API/C/WKPage.h @@ -422,6 +422,9 @@ WK_EXPORT WKSize WKPageFixedLayoutSize(WKPageRef page); WK_EXPORT bool WKPageHasHorizontalScrollbar(WKPageRef page); WK_EXPORT bool WKPageHasVerticalScrollbar(WKPageRef page); +WK_EXPORT void WKPageSetSuppressScrollbarAnimations(WKPageRef page, bool suppressAnimations); +WK_EXPORT bool WKPageAreScrollbarAnimationsSuppressed(WKPageRef page); + WK_EXPORT bool WKPageIsPinnedToLeftSide(WKPageRef page); WK_EXPORT bool WKPageIsPinnedToRightSide(WKPageRef page); diff --git a/Source/WebKit2/UIProcess/API/cpp/efl/WKEinaSharedString.cpp b/Source/WebKit2/UIProcess/API/cpp/efl/WKEinaSharedString.cpp index ea43df167..d31bfd40e 100644 --- a/Source/WebKit2/UIProcess/API/cpp/efl/WKEinaSharedString.cpp +++ b/Source/WebKit2/UIProcess/API/cpp/efl/WKEinaSharedString.cpp @@ -105,3 +105,10 @@ bool WKEinaSharedString::operator==(const char* str) const { return (!str || !m_string) ? (str == m_string) : !strcmp(m_string, str); } + +WKEinaSharedString WKEinaSharedString::adopt(Eina_Stringshare* string) +{ + WKEinaSharedString sharedString; + sharedString.m_string = static_cast<const char*>(string); + return sharedString; +} diff --git a/Source/WebKit2/UIProcess/API/cpp/efl/WKEinaSharedString.h b/Source/WebKit2/UIProcess/API/cpp/efl/WKEinaSharedString.h index 68d76f4ea..52cfffa0e 100644 --- a/Source/WebKit2/UIProcess/API/cpp/efl/WKEinaSharedString.h +++ b/Source/WebKit2/UIProcess/API/cpp/efl/WKEinaSharedString.h @@ -61,6 +61,8 @@ public: ALWAYS_INLINE size_t length() const { return m_string ? static_cast<size_t>(eina_stringshare_strlen(m_string)) : 0; } + static WKEinaSharedString adopt(Eina_Stringshare*); + private: const char* m_string; }; diff --git a/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp b/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp index 9971b1634..3196d0b27 100644 --- a/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp +++ b/Source/WebKit2/UIProcess/API/efl/ewk_view.cpp @@ -498,7 +498,7 @@ bool ewk_view_accelerated_compositing_mode_enter(const Evas_Object* ewkView) EWK_VIEW_SD_GET_OR_RETURN(ewkView, smartData, false); EWK_VIEW_PRIV_GET_OR_RETURN(smartData, priv, false); - EINA_SAFETY_ON_NULL_RETURN_VAL(!priv->evasGl, false); + EINA_SAFETY_ON_NULL_RETURN_VAL(priv->evasGl, false); Evas* evas = evas_object_evas_get(ewkView); priv->evasGl = evas_gl_new(evas); diff --git a/Source/WebKit2/UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.cpp b/Source/WebKit2/UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.cpp index 8033e2498..54523f046 100644 --- a/Source/WebKit2/UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.cpp +++ b/Source/WebKit2/UIProcess/API/efl/tests/UnitTestUtils/EWK2UnitTestBase.cpp @@ -38,10 +38,16 @@ static void onLoadFinished(void* userData, Evas_Object* webView, void* eventInfo *loadFinished = true; } +static Ewk_View_Smart_Class ewk2UnitTestBrowserViewSmartClass() +{ + static Ewk_View_Smart_Class ewkViewClass = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("Browser_View"); + return ewkViewClass; +} + EWK2UnitTestBase::EWK2UnitTestBase() : m_ecoreEvas(0) , m_webView(0) - , m_ewkViewClass(EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("Browser_View")) + , m_ewkViewClass(ewk2UnitTestBrowserViewSmartClass()) { ewk_view_smart_class_set(&m_ewkViewClass); } diff --git a/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_eina_shared_string.cpp b/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_eina_shared_string.cpp index 7f62e0b1e..c820239a5 100644 --- a/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_eina_shared_string.cpp +++ b/Source/WebKit2/UIProcess/API/efl/tests/test_ewk2_eina_shared_string.cpp @@ -75,6 +75,18 @@ TEST_F(EWK2UnitTestBase, constructFromWKURL) checkString(string, testUrl); } +TEST_F(EWK2UnitTestBase, constructFromEinaStringShare) +{ + WKEinaSharedString string(WKEinaSharedString::adopt(eina_stringshare_add(testString))); + checkString(string, testString); + + string = WKEinaSharedString::adopt(eina_stringshare_add(anotherTestString)); + checkString(string, anotherTestString); + + string = string; + checkString(string, anotherTestString); +} + TEST_F(EWK2UnitTestBase, costructCopy) { WKEinaSharedString string(testString); diff --git a/Source/WebKit2/UIProcess/API/mac/WKView.h b/Source/WebKit2/UIProcess/API/mac/WKView.h index 07105c40b..fec8d6380 100644 --- a/Source/WebKit2/UIProcess/API/mac/WKView.h +++ b/Source/WebKit2/UIProcess/API/mac/WKView.h @@ -39,6 +39,7 @@ WK_EXPORT } - (id)initWithFrame:(NSRect)frame processGroup:(WKProcessGroup *)processGroup browsingContextGroup:(WKBrowsingContextGroup *)browsingContextGroup; +- (id)initWithFrame:(NSRect)frame processGroup:(WKProcessGroup *)processGroup browsingContextGroup:(WKBrowsingContextGroup *)browsingContextGroup relatedToView:(WKView *)relatedView; @property(readonly) WKBrowsingContextController *browsingContextController; diff --git a/Source/WebKit2/UIProcess/API/mac/WKView.mm b/Source/WebKit2/UIProcess/API/mac/WKView.mm index 98e32662a..9d69399d4 100644 --- a/Source/WebKit2/UIProcess/API/mac/WKView.mm +++ b/Source/WebKit2/UIProcess/API/mac/WKView.mm @@ -247,7 +247,12 @@ struct WKViewInterpretKeyEventsParameters { - (id)initWithFrame:(NSRect)frame processGroup:(WKProcessGroup *)processGroup browsingContextGroup:(WKBrowsingContextGroup *)browsingContextGroup { - return [self initWithFrame:frame contextRef:processGroup._contextRef pageGroupRef:browsingContextGroup._pageGroupRef]; + return [self initWithFrame:frame contextRef:processGroup._contextRef pageGroupRef:browsingContextGroup._pageGroupRef relatedToPage:nil]; +} + +- (id)initWithFrame:(NSRect)frame processGroup:(WKProcessGroup *)processGroup browsingContextGroup:(WKBrowsingContextGroup *)browsingContextGroup relatedToView:(WKView *)relatedView +{ + return [self initWithFrame:frame contextRef:processGroup._contextRef pageGroupRef:browsingContextGroup._pageGroupRef relatedToPage:relatedView ? toAPI(relatedView->_data->_page.get()) : nil]; } - (void)dealloc @@ -2986,6 +2991,11 @@ static NSString *pathWithUniqueFilenameForPath(NSString *path) - (id)initWithFrame:(NSRect)frame contextRef:(WKContextRef)contextRef pageGroupRef:(WKPageGroupRef)pageGroupRef { + return [self initWithFrame:frame contextRef:contextRef pageGroupRef:pageGroupRef relatedToPage:nil]; +} + +- (id)initWithFrame:(NSRect)frame contextRef:(WKContextRef)contextRef pageGroupRef:(WKPageGroupRef)pageGroupRef relatedToPage:(WKPageRef)relatedPage +{ self = [super initWithFrame:frame]; if (!self) return nil; @@ -3016,7 +3026,7 @@ static NSString *pathWithUniqueFilenameForPath(NSString *path) _data = [[WKViewData alloc] init]; _data->_pageClient = PageClientImpl::create(self); - _data->_page = toImpl(contextRef)->createWebPage(_data->_pageClient.get(), toImpl(pageGroupRef)); + _data->_page = toImpl(contextRef)->createWebPage(_data->_pageClient.get(), toImpl(pageGroupRef), toImpl(relatedPage)); _data->_page->setIntrinsicDeviceScaleFactor([self _intrinsicDeviceScaleFactor]); _data->_page->initializeWebPage(); #if ENABLE(FULLSCREEN_API) diff --git a/Source/WebKit2/UIProcess/API/mac/WKViewPrivate.h b/Source/WebKit2/UIProcess/API/mac/WKViewPrivate.h index be3c6303e..51578764f 100644 --- a/Source/WebKit2/UIProcess/API/mac/WKViewPrivate.h +++ b/Source/WebKit2/UIProcess/API/mac/WKViewPrivate.h @@ -32,6 +32,7 @@ @property(readonly) WKPageRef pageRef; - (id)initWithFrame:(NSRect)frame contextRef:(WKContextRef)contextRef pageGroupRef:(WKPageGroupRef)pageGroupRef; +- (id)initWithFrame:(NSRect)frame contextRef:(WKContextRef)contextRef pageGroupRef:(WKPageGroupRef)pageGroupRef relatedToPage:(WKPageRef)relatedPage; - (NSPrintOperation *)printOperationWithPrintInfo:(NSPrintInfo *)printInfo forFrame:(WKFrameRef)frameRef; - (BOOL)canChangeFrameLayout:(WKFrameRef)frameRef; diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp index 490b9ba7c..bacae91ec 100644 --- a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp +++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp @@ -323,6 +323,14 @@ void QQuickWebViewPrivate::initialize(WKContextRef contextRef, WKPageGroupRef pa webPageProxy->initializeWebPage(); } +void QQuickWebViewPrivate::loadDidStop() +{ + Q_Q(QQuickWebView); + ASSERT(!q->loading()); + QWebLoadRequest loadRequest(q->url(), QQuickWebView::LoadStoppedStatus); + emit q->loadingChanged(&loadRequest); +} + void QQuickWebViewPrivate::onComponentComplete() { Q_Q(QQuickWebView); diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h index 68e5fca30..5feb4b45a 100644 --- a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h +++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h @@ -96,6 +96,7 @@ public: }; enum LoadStatus { LoadStartedStatus, + LoadStoppedStatus, LoadSucceededStatus, LoadFailedStatus }; diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h index d1d3d9e88..6cc5e8d39 100644 --- a/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h +++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h @@ -79,6 +79,7 @@ public: virtual void loadProgressDidChange(int loadProgress); virtual void backForwardListDidChange(); virtual void loadDidSucceed(); + virtual void loadDidStop(); virtual void loadDidFail(const WebKit::QtWebError& error); virtual void handleMouseEvent(QMouseEvent*); diff --git a/Source/WebKit2/UIProcess/API/qt/qwebnavigationhistory.cpp b/Source/WebKit2/UIProcess/API/qt/qwebnavigationhistory.cpp index b057526e1..0c9f7b856 100644 --- a/Source/WebKit2/UIProcess/API/qt/qwebnavigationhistory.cpp +++ b/Source/WebKit2/UIProcess/API/qt/qwebnavigationhistory.cpp @@ -96,13 +96,12 @@ void QWebNavigationHistoryPrivate::goForwardTo(int index) WKPageGoToBackForwardListItem(m_page.get(), itemRef.get()); } -QWebNavigationListModel::QWebNavigationListModel() - : QAbstractListModel() +QHash<int, QByteArray> QWebNavigationListModel::roleNames() const { QHash<int, QByteArray> roles; roles[QWebNavigationHistory::UrlRole] = "url"; roles[QWebNavigationHistory::TitleRole] = "title"; - setRoleNames(roles); + return roles; } QWebNavigationListModel::~QWebNavigationListModel() @@ -137,6 +136,12 @@ QVariant QWebNavigationListModel::data(const QModelIndex& index, int role) const return QVariant(); } +void QWebNavigationListModel::reset() +{ + beginResetModel(); + endResetModel(); +} + QWebNavigationHistory::QWebNavigationHistory() : QObject() { diff --git a/Source/WebKit2/UIProcess/API/qt/qwebnavigationhistory_p.h b/Source/WebKit2/UIProcess/API/qt/qwebnavigationhistory_p.h index f1a3e572c..84ef867be 100644 --- a/Source/WebKit2/UIProcess/API/qt/qwebnavigationhistory_p.h +++ b/Source/WebKit2/UIProcess/API/qt/qwebnavigationhistory_p.h @@ -48,9 +48,14 @@ public: int rowCount(const QModelIndex& parent = QModelIndex()) const; QVariant data(const QModelIndex& index, int role) const; + QHash<int, QByteArray> roleNames() const; + void reset(); private: - QWebNavigationListModel(); + QWebNavigationListModel() + : QAbstractListModel() + { } + QWebNavigationListModelPrivate* d; friend class QWebNavigationListModelPrivate; friend class QWebNavigationHistory; diff --git a/Source/WebKit2/UIProcess/API/qt/tests/publicapi/tst_publicapi.cpp b/Source/WebKit2/UIProcess/API/qt/tests/publicapi/tst_publicapi.cpp index d0ea1beb8..192e1bb1a 100644 --- a/Source/WebKit2/UIProcess/API/qt/tests/publicapi/tst_publicapi.cpp +++ b/Source/WebKit2/UIProcess/API/qt/tests/publicapi/tst_publicapi.cpp @@ -44,6 +44,7 @@ static QStringList expectedAPI = QStringList() << "QQuickWebView.AcceptRequest --> NavigationRequestAction" << "QQuickWebView.IgnoreRequest --> NavigationRequestAction" << "QQuickWebView.LoadStartedStatus --> LoadStatus" + << "QQuickWebView.LoadStoppedStatus --> LoadStatus" << "QQuickWebView.LoadSucceededStatus --> LoadStatus" << "QQuickWebView.LoadFailedStatus --> LoadStatus" << "QQuickWebView.NoErrorDomain --> ErrorDomain" diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_loadUrl.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_loadUrl.qml index f77c7f87a..0f8f6a1ff 100644 --- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_loadUrl.qml +++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/WebView/tst_loadUrl.qml @@ -120,5 +120,22 @@ TestWebView { verify(webView.waitForLoadSucceeded()) compare(webView.url, url) } + + function test_stopStatus() { + var url = Qt.resolvedUrl("../common/test1.html") + + webView.loadingChanged.connect(function(loadRequest) { + if (loadRequest.status == WebView.LoadStopStatus) { + compare(webView.url, url) + compare(loadRequest.url, url) + } + }) + + webView.url = url + compare(webView.url, url) + webView.stop() + verify(webView.waitForLoadStopped()) + compare(webView.url, url) + } } } diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/TestWebView.qml b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/TestWebView.qml index aa0baae4f..0dd7bccee 100644 --- a/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/TestWebView.qml +++ b/Source/WebKit2/UIProcess/API/qt/tests/qmltests/common/TestWebView.qml @@ -28,6 +28,17 @@ WebView { loadStatus = null return failure } + function waitForLoadStopped() { + var timeout = 5000 + var i = 0 + while (i < timeout && loadStatus != WebView.LoadStoppedStatus) { + testResult.wait(50) + i += 50 + } + var stop = loadStatus == WebView.LoadStoppedStatus + loadStatus = null + return stop + } TestResult { id: testResult } diff --git a/Source/WebKit2/UIProcess/API/qt/tests/qrawwebview/tst_qrawwebview.cpp b/Source/WebKit2/UIProcess/API/qt/tests/qrawwebview/tst_qrawwebview.cpp index 0338ecff6..31102b876 100644 --- a/Source/WebKit2/UIProcess/API/qt/tests/qrawwebview/tst_qrawwebview.cpp +++ b/Source/WebKit2/UIProcess/API/qt/tests/qrawwebview/tst_qrawwebview.cpp @@ -82,7 +82,7 @@ public: void load(const QString& html) { m_frameLoaded = false; - WKPageLoadURL(m_webView->pageRef(), WKURLCreateWithUTF8CString(html.toAscii().data())); + WKPageLoadURL(m_webView->pageRef(), WKURLCreateWithUTF8CString(html.toLocal8Bit().data())); QVERIFY(::waitForSignal(this, SIGNAL(loaded()), 5000)); } diff --git a/Source/WebKit2/UIProcess/API/qt/tests/tests.pri b/Source/WebKit2/UIProcess/API/qt/tests/tests.pri index b87659bf3..a1133530d 100644 --- a/Source/WebKit2/UIProcess/API/qt/tests/tests.pri +++ b/Source/WebKit2/UIProcess/API/qt/tests/tests.pri @@ -7,7 +7,7 @@ INCLUDEPATH += $$PWD SOURCES += ../util.cpp QT += testlib webkit -contains(DEFINES, HAVE_QTQUICK=1) { +have?(QTQUICK) { QT += qml quick quick-private HEADERS += ../bytearraytestdata.h \ ../util.h diff --git a/Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp b/Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp index 57206eb7b..abc805fd7 100644 --- a/Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp +++ b/Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp @@ -99,18 +99,19 @@ void WebSocketServerConnection::sendWebSocketMessage(const String& message) void WebSocketServerConnection::sendHTTPResponseHeader(int statusCode, const String& statusText, const HTTPHeaderMap& headerFields) { StringBuilder builder; - builder.append("HTTP/1.1 "); - builder.append(String::number(statusCode)); - builder.append(" "); + builder.appendLiteral("HTTP/1.1 "); + builder.appendNumber(statusCode); + builder.append(' '); builder.append(statusText); - builder.append("\r\n"); + builder.appendLiteral("\r\n"); HTTPHeaderMap::const_iterator end = headerFields.end(); for (HTTPHeaderMap::const_iterator it = headerFields.begin(); it != end; ++it) { builder.append(it->first); - builder.append(": "); - builder.append(it->second + "\r\n"); + builder.appendLiteral(": "); + builder.append(it->second); + builder.appendLiteral("\r\n"); } - builder.append("\r\n"); + builder.appendLiteral("\r\n"); CString header = builder.toString().latin1(); m_socket->send(header.data(), header.length()); diff --git a/Source/WebKit2/UIProcess/InspectorServer/qt/WebInspectorServerQt.cpp b/Source/WebKit2/UIProcess/InspectorServer/qt/WebInspectorServerQt.cpp index c13fa4cfc..1882586af 100644 --- a/Source/WebKit2/UIProcess/InspectorServer/qt/WebInspectorServerQt.cpp +++ b/Source/WebKit2/UIProcess/InspectorServer/qt/WebInspectorServerQt.cpp @@ -68,34 +68,36 @@ String WebInspectorServer::inspectorUrlForPageID(int pageId) if (pageId <= 0 || serverState() == Closed) return String(); StringBuilder builder; - builder.append("http://"); + builder.appendLiteral("http://"); builder.append(bindAddress()); - builder.append(":"); - builder.append(String::number(port())); + builder.append(':'); + builder.appendNumber(port()); builder.append(remoteInspectorPagePath()); - builder.append(String::number(pageId)); + builder.appendNumber(pageId); return builder.toString(); } void WebInspectorServer::buildPageList(Vector<char>& data, String& contentType) { StringBuilder builder; - builder.append("[ "); + builder.appendLiteral("[ "); ClientMap::iterator end = m_clientMap.end(); for (ClientMap::iterator it = m_clientMap.begin(); it != end; ++it) { WebPageProxy* webPage = it->second->page(); if (it != m_clientMap.begin()) - builder.append(", "); - builder.append("{ \"id\": " + String::number(it->first)); - builder.append(", \"title\": \""); + builder.appendLiteral(", "); + builder.appendLiteral("{ \"id\": "); + builder.appendNumber(it->first); + builder.appendLiteral(", \"title\": \""); builder.append(webPage->pageTitle()); - builder.append("\", \"url\": \""); + builder.appendLiteral("\", \"url\": \""); builder.append(webPage->activeURL()); - builder.append("\", \"inspectorUrl\": \""); - builder.append(remoteInspectorPagePath() + String::number(it->first)); - builder.append("\" }"); + builder.appendLiteral("\", \"inspectorUrl\": \""); + builder.append(remoteInspectorPagePath()); + builder.appendNumber(it->first); + builder.appendLiteral("\" }"); } - builder.append(" ]"); + builder.appendLiteral(" ]"); CString cstr = builder.toString().utf8(); data.append(cstr.data(), cstr.length()); contentType = "application/json; charset=utf-8"; diff --git a/Source/WebKit2/UIProcess/Notifications/WebNotification.cpp b/Source/WebKit2/UIProcess/Notifications/WebNotification.cpp index fb8ddb0a6..3705fb064 100644 --- a/Source/WebKit2/UIProcess/Notifications/WebNotification.cpp +++ b/Source/WebKit2/UIProcess/Notifications/WebNotification.cpp @@ -33,11 +33,13 @@ namespace WebKit { -WebNotification::WebNotification(const String& title, const String& body, const String& iconURL, const String& tag, const String& originString, uint64_t notificationID) +WebNotification::WebNotification(const String& title, const String& body, const String& iconURL, const String& tag, const String& lang, const String& dir, const String& originString, uint64_t notificationID) : m_title(title) , m_body(body) , m_iconURL(iconURL) , m_tag(tag) + , m_lang(lang) + , m_dir(dir) , m_origin(WebSecurityOrigin::createFromString(originString)) , m_notificationID(notificationID) { diff --git a/Source/WebKit2/UIProcess/Notifications/WebNotification.h b/Source/WebKit2/UIProcess/Notifications/WebNotification.h index 3355aab7e..8edccedff 100644 --- a/Source/WebKit2/UIProcess/Notifications/WebNotification.h +++ b/Source/WebKit2/UIProcess/Notifications/WebNotification.h @@ -45,21 +45,23 @@ class WebNotification : public APIObject { public: static const Type APIType = TypeNotification; - static PassRefPtr<WebNotification> create(const String& title, const String& body, const String& iconURL, const String& tag, const String& originString, uint64_t notificationID) + static PassRefPtr<WebNotification> create(const String& title, const String& body, const String& iconURL, const String& tag, const String& lang, const String& dir, const String& originString, uint64_t notificationID) { - return adoptRef(new WebNotification(title, body, iconURL, tag, originString, notificationID)); + return adoptRef(new WebNotification(title, body, iconURL, tag, lang, dir, originString, notificationID)); } const String& title() const { return m_title; } const String& body() const { return m_body; } const String& iconURL() const { return m_iconURL; } const String& tag() const { return m_tag; } + const String& lang() const { return m_lang; } + const String& dir() const { return m_dir; } WebSecurityOrigin* origin() const { return m_origin.get(); } uint64_t notificationID() const { return m_notificationID; } private: - WebNotification(const String& title, const String& body, const String& iconURL, const String& tag, const String& originString, uint64_t notificationID); + WebNotification(const String& title, const String& body, const String& iconURL, const String& tag, const String& lang, const String& dir, const String& originString, uint64_t notificationID); virtual Type type() const { return APIType; } @@ -67,6 +69,8 @@ private: String m_body; String m_iconURL; String m_tag; + String m_lang; + String m_dir; RefPtr<WebSecurityOrigin> m_origin; uint64_t m_notificationID; }; diff --git a/Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.cpp b/Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.cpp index c1246068a..88e2cf1aa 100644 --- a/Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.cpp +++ b/Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.cpp @@ -76,12 +76,12 @@ void WebNotificationManagerProxy::didReceiveMessage(CoreIPC::Connection* connect didReceiveWebNotificationManagerProxyMessage(connection, messageID, arguments); } -void WebNotificationManagerProxy::show(WebPageProxy* page, const String& title, const String& body, const String& iconURL, const String& tag, const String& originString, uint64_t notificationID) +void WebNotificationManagerProxy::show(WebPageProxy* page, const String& title, const String& body, const String& iconURL, const String& tag, const String& lang, const String& dir, const String& originString, uint64_t notificationID) { if (!isNotificationIDValid(notificationID)) return; - RefPtr<WebNotification> notification = WebNotification::create(title, body, iconURL, tag, originString, notificationID); + RefPtr<WebNotification> notification = WebNotification::create(title, body, iconURL, tag, lang, dir, originString, notificationID); m_notifications.set(notificationID, notification); m_provider.show(page, notification.get()); } diff --git a/Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.h b/Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.h index e028d6b93..d61b6f661 100644 --- a/Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.h +++ b/Source/WebKit2/UIProcess/Notifications/WebNotificationManagerProxy.h @@ -60,7 +60,7 @@ public: void initializeProvider(const WKNotificationProvider*); void populateCopyOfNotificationPermissions(HashMap<String, bool>&); - void show(WebPageProxy*, const String& title, const String& body, const String& iconURL, const String& tag, const String& originString, uint64_t notificationID); + void show(WebPageProxy*, const String& title, const String& body, const String& iconURL, const String& tag, const String& lang, const String& dir, const String& originString, uint64_t notificationID); void providerDidShowNotification(uint64_t notificationID); void providerDidClickNotification(uint64_t notificationID); diff --git a/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp b/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp index 7c53b695e..cfdff9efb 100644 --- a/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp +++ b/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp @@ -47,7 +47,8 @@ using namespace WebCore; namespace WebKit { -static const double shutdownTimeout = 15; +static const double minimumLifetime = 30 * 60; +static const double shutdownTimeout = 10 * 60; PassRefPtr<PluginProcessProxy> PluginProcessProxy::create(PluginProcessManager* PluginProcessManager, const PluginModuleInfo& pluginInfo) { @@ -213,6 +214,7 @@ void PluginProcessProxy::didFinishLaunching(ProcessLauncher*, CoreIPC::Connectio parameters.pluginPath = m_pluginInfo.path; + parameters.minimumLifetime = minimumLifetime; parameters.terminationTimeout = shutdownTimeout; platformInitializePluginProcess(parameters); diff --git a/Source/WebKit2/UIProcess/WebContext.cpp b/Source/WebKit2/UIProcess/WebContext.cpp index 0003387d0..fdd363ac6 100644 --- a/Source/WebKit2/UIProcess/WebContext.cpp +++ b/Source/WebKit2/UIProcess/WebContext.cpp @@ -501,20 +501,21 @@ void WebContext::disconnectProcess(WebProcessProxy* process) m_processes.remove(m_processes.find(process)); } -PassRefPtr<WebPageProxy> WebContext::createWebPage(PageClient* pageClient, WebPageGroup* pageGroup) +PassRefPtr<WebPageProxy> WebContext::createWebPage(PageClient* pageClient, WebPageGroup* pageGroup, WebPageProxy* relatedPage) { RefPtr<WebProcessProxy> process; if (m_processModel == ProcessModelSharedSecondaryProcess) { ensureSharedWebProcess(); process = m_processes[0]; } else { - // FIXME (Multi-WebProcess): Add logic for sharing a process. - // <rdar://problem/12218164> window.open() should create pages in the same process. - // <rdar://problem/12239661> Consider limiting the number of web processes in per-tab process model if (m_haveInitialEmptyProcess) { process = m_processes.last(); m_haveInitialEmptyProcess = false; + } else if (relatedPage) { + // Sharing processes, e.g. when creating the page via window.open(). + process = relatedPage->process(); } else { + // FIXME (Multi-WebProcess): <rdar://problem/12239661> Consider limiting the number of web processes in per-tab process model. process = createNewWebProcess(); m_processes.append(process); } diff --git a/Source/WebKit2/UIProcess/WebContext.h b/Source/WebKit2/UIProcess/WebContext.h index a8ddc5f63..dfeff1fa6 100644 --- a/Source/WebKit2/UIProcess/WebContext.h +++ b/Source/WebKit2/UIProcess/WebContext.h @@ -103,7 +103,7 @@ public: // Disconnect the process from the context. void disconnectProcess(WebProcessProxy*); - PassRefPtr<WebPageProxy> createWebPage(PageClient*, WebPageGroup*); + PassRefPtr<WebPageProxy> createWebPage(PageClient*, WebPageGroup*, WebPageProxy* relatedPage = 0); WebProcessProxy* relaunchProcessIfNecessary(); diff --git a/Source/WebKit2/UIProcess/WebPageProxy.cpp b/Source/WebKit2/UIProcess/WebPageProxy.cpp index cd0c6c9a6..4ac6d2243 100644 --- a/Source/WebKit2/UIProcess/WebPageProxy.cpp +++ b/Source/WebKit2/UIProcess/WebPageProxy.cpp @@ -183,6 +183,7 @@ WebPageProxy::WebPageProxy(PageClient* pageClient, PassRefPtr<WebProcessProxy> p , m_drawsTransparentBackground(false) , m_areMemoryCacheClientCallsEnabled(true) , m_useFixedLayout(false) + , m_suppressScrollbarAnimations(false) , m_paginationMode(Pagination::Unpaginated) , m_paginationBehavesLikeColumns(false) , m_pageLength(0) @@ -1502,6 +1503,18 @@ void WebPageProxy::setFixedLayoutSize(const IntSize& size) m_process->send(Messages::WebPage::SetFixedLayoutSize(size), m_pageID); } +void WebPageProxy::setSuppressScrollbarAnimations(bool suppressAnimations) +{ + if (!isValid()) + return; + + if (suppressAnimations == m_suppressScrollbarAnimations) + return; + + m_suppressScrollbarAnimations = suppressAnimations; + m_process->send(Messages::WebPage::SetSuppressScrollbarAnimations(suppressAnimations), m_pageID); +} + void WebPageProxy::setPaginationMode(WebCore::Pagination::Mode mode) { if (mode == m_paginationMode) @@ -3615,6 +3628,7 @@ WebPageCreationParameters WebPageProxy::creationParameters() const parameters.areMemoryCacheClientCallsEnabled = m_areMemoryCacheClientCallsEnabled; parameters.useFixedLayout = m_useFixedLayout; parameters.fixedLayoutSize = m_fixedLayoutSize; + parameters.suppressScrollbarAnimations = m_suppressScrollbarAnimations; parameters.paginationMode = m_paginationMode; parameters.paginationBehavesLikeColumns = m_paginationBehavesLikeColumns; parameters.pageLength = m_pageLength; @@ -3716,9 +3730,9 @@ void WebPageProxy::requestNotificationPermission(uint64_t requestID, const Strin request->deny(); } -void WebPageProxy::showNotification(const String& title, const String& body, const String& iconURL, const String& tag, const String& originString, uint64_t notificationID) +void WebPageProxy::showNotification(const String& title, const String& body, const String& iconURL, const String& tag, const String& lang, const String& dir, const String& originString, uint64_t notificationID) { - m_process->context()->notificationManagerProxy()->show(this, title, body, iconURL, tag, originString, notificationID); + m_process->context()->notificationManagerProxy()->show(this, title, body, iconURL, tag, lang, dir, originString, notificationID); } float WebPageProxy::headerHeight(WebFrameProxy* frame) diff --git a/Source/WebKit2/UIProcess/WebPageProxy.h b/Source/WebKit2/UIProcess/WebPageProxy.h index a4026816d..fd07c6f05 100644 --- a/Source/WebKit2/UIProcess/WebPageProxy.h +++ b/Source/WebKit2/UIProcess/WebPageProxy.h @@ -486,6 +486,9 @@ public: bool hasHorizontalScrollbar() const { return m_mainFrameHasHorizontalScrollbar; } bool hasVerticalScrollbar() const { return m_mainFrameHasVerticalScrollbar; } + void setSuppressScrollbarAnimations(bool); + bool areScrollbarAnimationsSuppressed() const { return m_suppressScrollbarAnimations; } + bool isPinnedToLeftSide() const { return m_mainFrameIsPinnedToLeftSide; } bool isPinnedToRightSide() const { return m_mainFrameIsPinnedToRightSide; } @@ -830,7 +833,7 @@ private: void reattachToWebProcessWithItem(WebBackForwardListItem*); void requestNotificationPermission(uint64_t notificationID, const String& originString); - void showNotification(const String& title, const String& body, const String& iconURL, const String& tag, const String& originString, uint64_t notificationID); + void showNotification(const String& title, const String& body, const String& iconURL, const String& tag, const String& lang, const String& dir, const String& originString, uint64_t notificationID); #if USE(TILED_BACKING_STORE) void pageDidRequestScroll(const WebCore::IntPoint&); @@ -1096,6 +1099,8 @@ private: bool m_useFixedLayout; WebCore::IntSize m_fixedLayoutSize; + bool m_suppressScrollbarAnimations; + WebCore::Pagination::Mode m_paginationMode; bool m_paginationBehavesLikeColumns; double m_pageLength; diff --git a/Source/WebKit2/UIProcess/WebPageProxy.messages.in b/Source/WebKit2/UIProcess/WebPageProxy.messages.in index 2ac9d267f..c541d2c14 100644 --- a/Source/WebKit2/UIProcess/WebPageProxy.messages.in +++ b/Source/WebKit2/UIProcess/WebPageProxy.messages.in @@ -232,7 +232,7 @@ messages -> WebPageProxy { # Notification messages RequestNotificationPermission(uint64_t requestID, WTF::String originIdentifier) - ShowNotification(WTF::String title, WTF::String body, WTF::String iconURL, WTF::String tag, WTF::String originIdentifier, uint64_t notificationID) + ShowNotification(WTF::String title, WTF::String body, WTF::String iconURL, WTF::String tag, WTF::String lang, WTF::String dir, WTF::String originIdentifier, uint64_t notificationID) # Spelling and grammar messages #if USE(UNIFIED_TEXT_CHECKING) diff --git a/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.cpp b/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.cpp index 578faa2c9..0e9c5cfb4 100644 --- a/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.cpp +++ b/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.cpp @@ -90,11 +90,21 @@ void QtWebPageLoadClient::dispatchLoadSucceeded() m_webView->d_func()->loadDidSucceed(); } +void QtWebPageLoadClient::dispatchLoadStopped() +{ + m_webView->d_func()->loadDidStop(); +} + void QtWebPageLoadClient::dispatchLoadFailed(WebFrameProxy* frame, const QtWebError& error) { + if (error.isCancellation()) { + dispatchLoadStopped(); + return; + } + int errorCode = error.errorCode(); - if (error.isCancellation() || errorCode == kWKErrorCodeFrameLoadInterruptedByPolicyChange || errorCode == kWKErrorCodePlugInWillHandleLoad) { + if (errorCode == kWKErrorCodeFrameLoadInterruptedByPolicyChange || errorCode == kWKErrorCodePlugInWillHandleLoad) { // The active url might have changed m_webView->emitUrlChangeIfNeeded(); diff --git a/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.h b/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.h index 68eac0f98..668bac168 100644 --- a/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.h +++ b/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.h @@ -50,6 +50,7 @@ private: void didChangeBackForwardList(); void dispatchLoadSucceeded(); + void dispatchLoadStopped(); void dispatchLoadFailed(WebFrameProxy*, const QtWebError&); diff --git a/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQt.cpp b/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQt.cpp index 32ec1857b..128379f26 100644 --- a/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQt.cpp +++ b/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQt.cpp @@ -55,6 +55,7 @@ public: PopupMenuItemModel(const Vector<WebPopupItem>&, bool multiple); virtual int rowCount(const QModelIndex& parent = QModelIndex()) const { return m_items.size(); } virtual QVariant data(const QModelIndex&, int role = Qt::DisplayRole) const; + virtual QHash<int, QByteArray> roleNames() const; Q_INVOKABLE void select(int); @@ -167,11 +168,15 @@ PopupMenuItemModel::PopupMenuItemModel(const Vector<WebPopupItem>& webPopupItems : m_selectedModelIndex(-1) , m_allowMultiples(multiple) { - static QHash<int, QByteArray> roles = createRoleNamesHash(); - setRoleNames(roles); buildItems(webPopupItems); } +QHash<int, QByteArray> PopupMenuItemModel::roleNames() const +{ + static QHash<int, QByteArray> roles = createRoleNamesHash(); + return roles; +} + QVariant PopupMenuItemModel::data(const QModelIndex& index, int role) const { if (!index.isValid() || index.row() < 0 || index.row() >= m_items.size()) diff --git a/Source/WebKit2/UIProcess/win/WebPopupMenuProxyWin.h b/Source/WebKit2/UIProcess/win/WebPopupMenuProxyWin.h index 1d25373f1..f4104f75f 100644 --- a/Source/WebKit2/UIProcess/win/WebPopupMenuProxyWin.h +++ b/Source/WebKit2/UIProcess/win/WebPopupMenuProxyWin.h @@ -75,7 +75,7 @@ private: virtual int visibleWidth() const OVERRIDE; virtual WebCore::IntSize contentsSize() const OVERRIDE; virtual WebCore::IntRect scrollableAreaBoundingBox() const OVERRIDE; - virtual bool isOnActivePage() const OVERRIDE { return true; } + virtual bool scrollbarsCanBeActive() const OVERRIDE { return true; } // NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea. void scrollTo(int offset); diff --git a/Source/WebKit2/WebKit2.pri b/Source/WebKit2/WebKit2.pri index 916687449..536b779ba 100644 --- a/Source/WebKit2/WebKit2.pri +++ b/Source/WebKit2/WebKit2.pri @@ -75,6 +75,6 @@ linux-*: { LIBS += -lrt } -contains(DEFINES, HAVE_QTQUICK=1): QT += qml quick +have?(QTQUICK): QT += qml quick -contains(DEFINES, ENABLE_GEOLOCATION=1): QT += location +enable?(GEOLOCATION): QT += location diff --git a/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundle.cpp b/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundle.cpp index bd3d0b6ac..14fccdc64 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundle.cpp +++ b/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundle.cpp @@ -191,6 +191,11 @@ void WKBundleSetAuthorAndUserStylesEnabled(WKBundleRef bundleRef, WKBundlePageGr toImpl(bundleRef)->setAuthorAndUserStylesEnabled(toImpl(pageGroupRef), enabled); } +void WKBundleSetSpatialNavigationEnabled(WKBundleRef bundleRef, WKBundlePageGroupRef pageGroupRef, bool enabled) +{ + toImpl(bundleRef)->setSpatialNavigationEnabled(toImpl(pageGroupRef), enabled); +} + void WKBundleAddOriginAccessWhitelistEntry(WKBundleRef bundleRef, WKStringRef sourceOrigin, WKStringRef destinationProtocol, WKStringRef destinationHost, bool allowDestinationSubdomains) { toImpl(bundleRef)->addOriginAccessWhitelistEntry(toImpl(sourceOrigin)->string(), toImpl(destinationProtocol)->string(), toImpl(destinationHost)->string(), allowDestinationSubdomains); @@ -226,11 +231,31 @@ void WKBundleClearApplicationCache(WKBundleRef bundleRef) toImpl(bundleRef)->clearApplicationCache(); } +void WKBundleClearApplicationCacheForOrigin(WKBundleRef bundleRef, WKStringRef origin) +{ + toImpl(bundleRef)->clearApplicationCacheForOrigin(toImpl(origin)->string()); +} + void WKBundleSetAppCacheMaximumSize(WKBundleRef bundleRef, uint64_t size) { toImpl(bundleRef)->setAppCacheMaximumSize(size); } +uint64_t WKBundleGetAppCacheUsageForOrigin(WKBundleRef bundleRef, WKStringRef origin) +{ + return toImpl(bundleRef)->appCacheUsageForOrigin(toImpl(origin)->string()); +} + +void WKBundleSetApplicationCacheOriginQuota(WKBundleRef bundleRef, WKStringRef origin, uint64_t bytes) +{ + return toImpl(bundleRef)->setApplicationCacheOriginQuota(toImpl(origin)->string(), bytes); +} + +void WKBundleSetMinimumTimerInterval(WKBundleRef bundleRef, WKBundlePageGroupRef pageGroupRef, double seconds) +{ + toImpl(bundleRef)->setMinimumTimerInterval(toImpl(pageGroupRef), seconds); +} + int WKBundleNumberOfPages(WKBundleRef bundleRef, WKBundleFrameRef frameRef, double pageWidthInPixels, double pageHeightInPixels) { return toImpl(bundleRef)->numberOfPages(toImpl(frameRef), pageWidthInPixels, pageHeightInPixels); diff --git a/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePrivate.h b/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePrivate.h index ec8c30700..e979791c9 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePrivate.h +++ b/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePrivate.h @@ -66,6 +66,7 @@ WK_EXPORT void WKBundleSetPrivateBrowsingEnabled(WKBundleRef bundle, WKBundlePag WK_EXPORT void WKBundleSetPopupBlockingEnabled(WKBundleRef bundle, WKBundlePageGroupRef pageGroup, bool enabled); WK_EXPORT void WKBundleSwitchNetworkLoaderToNewTestingSession(WKBundleRef bundle); WK_EXPORT void WKBundleSetAuthorAndUserStylesEnabled(WKBundleRef bundle, WKBundlePageGroupRef pageGroup, bool enabled); +WK_EXPORT void WKBundleSetSpatialNavigationEnabled(WKBundleRef bundle, WKBundlePageGroupRef pageGroup, bool enabled); WK_EXPORT void WKBundleAddOriginAccessWhitelistEntry(WKBundleRef bundle, WKStringRef, WKStringRef, WKStringRef, bool); WK_EXPORT void WKBundleRemoveOriginAccessWhitelistEntry(WKBundleRef bundle, WKStringRef, WKStringRef, WKStringRef, bool); WK_EXPORT void WKBundleResetOriginAccessWhitelists(WKBundleRef bundle); @@ -77,6 +78,7 @@ WK_EXPORT void WKBundleSetUserStyleSheetLocation(WKBundleRef bundle, WKBundlePag WK_EXPORT void WKBundleSetWebNotificationPermission(WKBundleRef bundle, WKBundlePageRef page, WKStringRef originStringRef, bool allowed); WK_EXPORT void WKBundleRemoveAllWebNotificationPermissions(WKBundleRef bundle, WKBundlePageRef page); WK_EXPORT uint64_t WKBundleGetWebNotificationID(WKBundleRef bundle, JSContextRef context, JSValueRef notification); +WK_EXPORT void WKBundleSetMinimumTimerInterval(WKBundleRef bundleRef, WKBundlePageGroupRef pageGroupRef, double interval); // UserContent API WK_EXPORT void WKBundleAddUserScript(WKBundleRef bundle, WKBundlePageGroupRef pageGroup, WKBundleScriptWorldRef scriptWorld, WKStringRef source, WKURLRef url, WKArrayRef whitelist, WKArrayRef blacklist, WKUserScriptInjectionTime injectionTime, WKUserContentInjectedFrames injectedFrames); @@ -93,7 +95,10 @@ WK_EXPORT void WKBundleSetDatabaseQuota(WKBundleRef bundle, uint64_t); // Application Cache API WK_EXPORT void WKBundleClearApplicationCache(WKBundleRef bundle); +WK_EXPORT void WKBundleClearApplicationCacheForOrigin(WKBundleRef bundle, WKStringRef origin); WK_EXPORT void WKBundleSetAppCacheMaximumSize(WKBundleRef bundle, uint64_t size); +WK_EXPORT uint64_t WKBundleGetAppCacheUsageForOrigin(WKBundleRef bundle, WKStringRef origin); +WK_EXPORT void WKBundleSetApplicationCacheOriginQuota(WKBundleRef bundle, WKStringRef origin, uint64_t bytes); // Garbage collection API WK_EXPORT void WKBundleGarbageCollectJavaScriptObjects(WKBundleRef bundle); diff --git a/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp b/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp index 2e7c83c1b..cd0634906 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp +++ b/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp @@ -46,6 +46,8 @@ #include "WebProcess.h" #include <JavaScriptCore/APICast.h> #include <JavaScriptCore/JSLock.h> +#include <WebCore/ApplicationCache.h> +#include <WebCore/ApplicationCacheStorage.h> #include <WebCore/Frame.h> #include <WebCore/FrameView.h> #include <WebCore/GCController.h> @@ -292,6 +294,13 @@ void InjectedBundle::setAuthorAndUserStylesEnabled(WebPageGroupProxy* pageGroup, (*iter)->settings()->setAuthorAndUserStylesEnabled(enabled); } +void InjectedBundle::setSpatialNavigationEnabled(WebPageGroupProxy* pageGroup, bool enabled) +{ + const HashSet<Page*>& pages = PageGroup::pageGroup(pageGroup->identifier())->pages(); + for (HashSet<Page*>::iterator iter = pages.begin(); iter != pages.end(); ++iter) + (*iter)->settings()->setSpatialNavigationEnabled(enabled); +} + void InjectedBundle::addOriginAccessWhitelistEntry(const String& sourceOrigin, const String& destinationProtocol, const String& destinationHost, bool allowDestinationSubdomains) { SecurityPolicy::addOriginAccessWhitelistEntry(*SecurityOrigin::createFromString(sourceOrigin), destinationProtocol, destinationHost, allowDestinationSubdomains); @@ -326,11 +335,29 @@ void InjectedBundle::clearApplicationCache() WebApplicationCacheManager::shared().deleteAllEntries(); } +void InjectedBundle::clearApplicationCacheForOrigin(const String& originString) +{ + RefPtr<SecurityOrigin> origin = SecurityOrigin::createFromString(originString); + ApplicationCache::deleteCacheForOrigin(origin.get()); +} + void InjectedBundle::setAppCacheMaximumSize(uint64_t size) { WebApplicationCacheManager::shared().setAppCacheMaximumSize(size); } +uint64_t InjectedBundle::appCacheUsageForOrigin(const String& originString) +{ + RefPtr<SecurityOrigin> origin = SecurityOrigin::createFromString(originString); + return ApplicationCache::diskUsageForOrigin(origin.get()); +} + +void InjectedBundle::setApplicationCacheOriginQuota(const String& originString, uint64_t bytes) +{ + RefPtr<SecurityOrigin> origin = SecurityOrigin::createFromString(originString); + cacheStorage().storeUpdatedQuotaForOrigin(origin.get(), bytes); +} + int InjectedBundle::numberOfPages(WebFrame* frame, double pageWidthInPixels, double pageHeightInPixels) { Frame* coreFrame = frame ? frame->coreFrame() : 0; @@ -550,6 +577,13 @@ void InjectedBundle::setUserStyleSheetLocation(WebPageGroupProxy* pageGroup, con (*iter)->settings()->setUserStyleSheetLocation(KURL(KURL(), location)); } +void InjectedBundle::setMinimumTimerInterval(WebPageGroupProxy* pageGroup, double seconds) +{ + const HashSet<Page*>& pages = PageGroup::pageGroup(pageGroup->identifier())->pages(); + for (HashSet<Page*>::iterator iter = pages.begin(); iter != pages.end(); ++iter) + (*iter)->settings()->setMinDOMTimerInterval(seconds); +} + void InjectedBundle::setWebNotificationPermission(WebPage* page, const String& originString, bool allowed) { #if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS) diff --git a/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.h b/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.h index 57292695d..6e40013df 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.h +++ b/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.h @@ -117,6 +117,7 @@ public: void setPopupBlockingEnabled(WebPageGroupProxy*, bool); void switchNetworkLoaderToNewTestingSession(); void setAuthorAndUserStylesEnabled(WebPageGroupProxy*, bool); + void setSpatialNavigationEnabled(WebPageGroupProxy*, bool); void addOriginAccessWhitelistEntry(const String&, const String&, const String&, bool); void removeOriginAccessWhitelistEntry(const String&, const String&, const String&, bool); void resetOriginAccessWhitelists(); @@ -125,6 +126,7 @@ public: String pageSizeAndMarginsInPixels(WebFrame*, int, int, int, int, int, int, int); bool isPageBoxVisible(WebFrame*, int); void setUserStyleSheetLocation(WebPageGroupProxy*, const String&); + void setMinimumTimerInterval(WebPageGroupProxy*, double seconds); void setWebNotificationPermission(WebPage*, const String& originString, bool allowed); void removeAllWebNotificationPermissions(WebPage*); uint64_t webNotificationID(JSContextRef, JSValueRef); @@ -144,7 +146,10 @@ public: // Application Cache API void clearApplicationCache(); + void clearApplicationCacheForOrigin(const String& origin); void setAppCacheMaximumSize(uint64_t); + uint64_t appCacheUsageForOrigin(const String& origin); + void setApplicationCacheOriginQuota(const String& origin, uint64_t); // Garbage collection API void garbageCollectJavaScriptObjects(); diff --git a/Source/WebKit2/WebProcess/Notifications/WebNotificationManager.cpp b/Source/WebKit2/WebProcess/Notifications/WebNotificationManager.cpp index 2823da7b4..e6e2cd4e3 100644 --- a/Source/WebKit2/WebProcess/Notifications/WebNotificationManager.cpp +++ b/Source/WebKit2/WebProcess/Notifications/WebNotificationManager.cpp @@ -137,9 +137,9 @@ bool WebNotificationManager::show(Notification* notification, WebPage* page) it->second.append(notificationID); #if ENABLE(NOTIFICATIONS) - m_process->connection()->send(Messages::WebPageProxy::ShowNotification(notification->title(), notification->body(), notification->iconURL().string(), notification->tag(), notification->scriptExecutionContext()->securityOrigin()->toString(), notificationID), page->pageID()); + m_process->connection()->send(Messages::WebPageProxy::ShowNotification(notification->title(), notification->body(), notification->iconURL().string(), notification->tag(), notification->lang(), notification->dir(), notification->scriptExecutionContext()->securityOrigin()->toString(), notificationID), page->pageID()); #else - m_process->connection()->send(Messages::WebPageProxy::ShowNotification(notification->title(), notification->body(), notification->iconURL().string(), notification->replaceId(), notification->scriptExecutionContext()->securityOrigin()->toString(), notificationID), page->pageID()); + m_process->connection()->send(Messages::WebPageProxy::ShowNotification(notification->title(), notification->body(), notification->iconURL().string(), notification->replaceId(), notification->lang(), notification->dir(), notification->scriptExecutionContext()->securityOrigin()->toString(), notificationID), page->pageID()); #endif return true; #else diff --git a/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp b/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp index 15e7648da..e37d75269 100644 --- a/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp +++ b/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp @@ -565,7 +565,7 @@ bool NetscapePlugin::allowPopups() const static bool isTransparentSilverlightBackgroundValue(const String& lowercaseBackgroundValue) { // This checks if the background color value is transparent, according to - // the forumat documented at http://msdn.microsoft.com/en-us/library/cc838148(VS.95).aspx + // the format documented at http://msdn.microsoft.com/en-us/library/cc838148(VS.95).aspx if (lowercaseBackgroundValue.startsWith('#')) { if (lowercaseBackgroundValue.length() == 5 && lowercaseBackgroundValue[1] != 'f') { // An 8-bit RGB value with alpha transparency, in the form #ARGB. diff --git a/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h b/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h index 5f93c5747..f0d948b0e 100644 --- a/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h +++ b/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h @@ -55,7 +55,6 @@ public: static PassRefPtr<NetscapePlugin> fromNPP(NPP); // In-process NetscapePlugins don't support asynchronous initialization. - virtual void waitForAsynchronousInitialization() { } virtual bool isBeingAsynchronouslyInitialized() const { return false; } #if PLATFORM(MAC) diff --git a/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.h b/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.h index 9ccd80400..d99d9436d 100644 --- a/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.h +++ b/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.h @@ -51,7 +51,6 @@ public: static WebCore::PluginInfo pluginInfo(); // In-process PDFViews don't support asynchronous initialization. - virtual void waitForAsynchronousInitialization() { } virtual bool isBeingAsynchronouslyInitialized() const { return false; } private: @@ -140,7 +139,7 @@ private: virtual WebCore::IntSize contentsSize() const OVERRIDE; virtual WebCore::Scrollbar* horizontalScrollbar() const OVERRIDE { return m_horizontalScrollbar.get(); } virtual WebCore::Scrollbar* verticalScrollbar() const OVERRIDE { return m_verticalScrollbar.get(); } - virtual bool isOnActivePage() const OVERRIDE; + virtual bool scrollbarsCanBeActive() const OVERRIDE; virtual bool shouldSuspendScrollAnimations() const OVERRIDE { return false; } // If we return true, ScrollAnimatorMac will keep cycling a timer forever, waiting for a good time to animate. virtual void scrollbarStyleChanged(int newStyle, bool forceUpdate) OVERRIDE; // FIXME: Implement the other conversion functions; this one is enough to get scrollbar hit testing working. diff --git a/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.mm b/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.mm index fe7f258b0..9cf8c887b 100644 --- a/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.mm +++ b/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.mm @@ -792,7 +792,7 @@ IntSize BuiltInPDFView::contentsSize() const return m_pdfDocumentSize; } -bool BuiltInPDFView::isOnActivePage() const +bool BuiltInPDFView::scrollbarsCanBeActive() const { return !pluginView()->frame()->document()->inPageCache(); } diff --git a/Source/WebKit2/WebProcess/Plugins/Plugin.h b/Source/WebKit2/WebProcess/Plugins/Plugin.h index b91174f9e..91d234fe6 100644 --- a/Source/WebKit2/WebProcess/Plugins/Plugin.h +++ b/Source/WebKit2/WebProcess/Plugins/Plugin.h @@ -83,8 +83,6 @@ public: // Sets the active plug-in controller and initializes the plug-in. bool initialize(PluginController*, const Parameters&); - // Forces synchronous initialization of a plugin previously initialized asynchronously. - virtual void waitForAsynchronousInitialization() = 0; virtual bool isBeingAsynchronouslyInitialized() const = 0; // Destroys the plug-in. diff --git a/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp b/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp index e380eef94..d3eb28a3b 100644 --- a/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp +++ b/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp @@ -123,14 +123,6 @@ bool PluginProxy::canInitializeAsynchronously() const return controller()->asynchronousPluginInitializationEnabled() && (m_connection->supportsAsynchronousPluginInitialization() || controller()->asynchronousPluginInitializationEnabledForAllPlugins()); } -void PluginProxy::waitForAsynchronousInitialization() -{ - ASSERT(!m_isStarted); - ASSERT(m_waitingOnAsynchronousInitialization); - - initializeSynchronously(); -} - bool PluginProxy::initializeSynchronously() { ASSERT(m_pendingPluginCreationParameters); diff --git a/Source/WebKit2/WebProcess/Plugins/PluginProxy.h b/Source/WebKit2/WebProcess/Plugins/PluginProxy.h index c0ca116b0..c3183bb2b 100644 --- a/Source/WebKit2/WebProcess/Plugins/PluginProxy.h +++ b/Source/WebKit2/WebProcess/Plugins/PluginProxy.h @@ -71,7 +71,6 @@ private: virtual bool initialize(const Parameters&); bool initializeSynchronously(); - virtual void waitForAsynchronousInitialization(); virtual void destroy(); virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect& dirtyRect); virtual PassRefPtr<ShareableBitmap> snapshot(); diff --git a/Source/WebKit2/WebProcess/Plugins/PluginView.cpp b/Source/WebKit2/WebProcess/Plugins/PluginView.cpp index 0a0c6b63d..8f50d8706 100644 --- a/Source/WebKit2/WebProcess/Plugins/PluginView.cpp +++ b/Source/WebKit2/WebProcess/Plugins/PluginView.cpp @@ -550,19 +550,8 @@ JSObject* PluginView::scriptObject(JSGlobalObject* globalObject) if (m_isWaitingForSynchronousInitialization) return 0; - // The plug-in can be null here if it failed to initialize previously. - if (!m_plugin) - return 0; - - // If the plug-in exists but is not initialized then we're still initializing asynchronously. - // We need to wait here until initialization has either succeeded or failed. - if (m_plugin->isBeingAsynchronouslyInitialized()) { - m_isWaitingForSynchronousInitialization = true; - m_plugin->waitForAsynchronousInitialization(); - m_isWaitingForSynchronousInitialization = false; - } - - // The plug-in can be null here if it still failed to initialize. + // We might not have started initialization of the plug-in yet, the plug-in might be in the middle + // of being initializing asynchronously, or initialization might have previously failed. if (!m_isInitialized || !m_plugin) return 0; diff --git a/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/CoordinatedGraphicsLayer.cpp b/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/CoordinatedGraphicsLayer.cpp index 4f176dd86..f2afdb5fb 100644 --- a/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/CoordinatedGraphicsLayer.cpp +++ b/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/CoordinatedGraphicsLayer.cpp @@ -151,7 +151,7 @@ bool CoordinatedGraphicsLayer::setChildren(const Vector<GraphicsLayer*>& childre bool ok = GraphicsLayer::setChildren(children); if (!ok) return false; - for (int i = 0; i < children.size(); ++i) { + for (unsigned i = 0; i < children.size(); ++i) { CoordinatedGraphicsLayer* child = toCoordinatedGraphicsLayer(children[i]); child->setCoordinatedGraphicsLayerClient(m_CoordinatedGraphicsLayerClient); child->didChangeLayerState(); diff --git a/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/LayerTreeCoordinator.cpp b/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/LayerTreeCoordinator.cpp index d02c9abb0..2411051f6 100644 --- a/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/LayerTreeCoordinator.cpp +++ b/Source/WebKit2/WebProcess/WebPage/CoordinatedGraphics/LayerTreeCoordinator.cpp @@ -600,7 +600,7 @@ void LayerTreeCoordinator::renderNextFrame() { m_waitingForUIProcess = false; scheduleLayerFlush(); - for (int i = 0; i < m_updateAtlases.size(); ++i) + for (unsigned i = 0; i < m_updateAtlases.size(); ++i) m_updateAtlases[i]->didSwapBuffers(); } @@ -622,7 +622,7 @@ void LayerTreeCoordinator::purgeBackingStores() PassOwnPtr<WebCore::GraphicsContext> LayerTreeCoordinator::beginContentUpdate(const WebCore::IntSize& size, ShareableBitmap::Flags flags, ShareableSurface::Handle& handle, WebCore::IntPoint& offset) { OwnPtr<WebCore::GraphicsContext> graphicsContext; - for (int i = 0; i < m_updateAtlases.size(); ++i) { + for (unsigned i = 0; i < m_updateAtlases.size(); ++i) { UpdateAtlas* atlas = m_updateAtlases[i].get(); if (atlas->flags() == flags) { // This will return null if there is no available buffer space. diff --git a/Source/WebKit2/WebProcess/WebPage/WebPage.cpp b/Source/WebKit2/WebProcess/WebPage/WebPage.cpp index 8e151818a..eb8067079 100644 --- a/Source/WebKit2/WebProcess/WebPage/WebPage.cpp +++ b/Source/WebKit2/WebProcess/WebPage/WebPage.cpp @@ -1124,6 +1124,11 @@ void WebPage::setFixedLayoutSize(const IntSize& size) view->forceLayout(); } +void WebPage::setSuppressScrollbarAnimations(bool suppressAnimations) +{ + m_page->setShouldSuppressScrollbarAnimations(suppressAnimations); +} + void WebPage::setPaginationMode(uint32_t mode) { Pagination pagination = m_page->pagination(); @@ -3248,7 +3253,7 @@ static bool pageContainsAnyHorizontalScrollbars(Frame* mainFrame) for (HashSet<ScrollableArea*>::const_iterator it = scrollableAreas->begin(), end = scrollableAreas->end(); it != end; ++it) { ScrollableArea* scrollableArea = *it; - if (!scrollableArea->isOnActivePage()) + if (!scrollableArea->scrollbarsCanBeActive()) continue; if (hasEnabledHorizontalScrollbar(scrollableArea)) diff --git a/Source/WebKit2/WebProcess/WebPage/WebPage.h b/Source/WebKit2/WebProcess/WebPage/WebPage.h index a81e4003a..96cb6e1a1 100644 --- a/Source/WebKit2/WebProcess/WebPage/WebPage.h +++ b/Source/WebKit2/WebProcess/WebPage/WebPage.h @@ -309,6 +309,8 @@ public: bool useFixedLayout() const { return m_useFixedLayout; } void setFixedLayoutSize(const WebCore::IntSize&); + void setSuppressScrollbarAnimations(bool); + void setPaginationMode(uint32_t /* WebCore::Pagination::Mode */); void setPaginationBehavesLikeColumns(bool); void setPageLength(double); diff --git a/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in b/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in index e3ff23cad..b6bcace51 100644 --- a/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in +++ b/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in @@ -140,6 +140,8 @@ messages -> WebPage { SetUseFixedLayout(bool fixed) SetFixedLayoutSize(WebCore::IntSize size) + SetSuppressScrollbarAnimations(bool suppressAnimations) + SetPaginationMode(uint32_t mode); SetPaginationBehavesLikeColumns(bool behavesLikeColumns); SetPageLength(double pageLength); diff --git a/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm b/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm index 6c0033493..65660b319 100644 --- a/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm +++ b/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm @@ -208,9 +208,6 @@ void TiledCoreAnimationDrawingArea::setPageOverlayNeedsDisplay(const IntRect& re void TiledCoreAnimationDrawingArea::updatePreferences() { - bool scrollingPerformanceLoggingEnabled = m_webPage->scrollingPerformanceLoggingEnabled(); - ScrollingThread::dispatch(bind(&ScrollingTree::setScrollingPerformanceLoggingEnabled, m_webPage->corePage()->scrollingCoordinator()->scrollingTree(), scrollingPerformanceLoggingEnabled)); - bool showDebugBorders = m_webPage->corePage()->settings()->showDebugBorders(); if (showDebugBorders == !!m_debugInfoLayer) @@ -224,7 +221,10 @@ void TiledCoreAnimationDrawingArea::updatePreferences() m_debugInfoLayer = nullptr; } + bool scrollingPerformanceLoggingEnabled = m_webPage->scrollingPerformanceLoggingEnabled(); + ScrollingThread::dispatch(bind(&ScrollingTree::setDebugRootLayer, m_webPage->corePage()->scrollingCoordinator()->scrollingTree(), m_debugInfoLayer)); + ScrollingThread::dispatch(bind(&ScrollingTree::setScrollingPerformanceLoggingEnabled, m_webPage->corePage()->scrollingCoordinator()->scrollingTree(), scrollingPerformanceLoggingEnabled)); } void TiledCoreAnimationDrawingArea::dispatchAfterEnsuringUpdatedScrollPosition(const Function<void ()>& functionRef) diff --git a/Source/WebKit2/config.h b/Source/WebKit2/config.h index 4bb1f8dec..8072046d3 100644 --- a/Source/WebKit2/config.h +++ b/Source/WebKit2/config.h @@ -108,6 +108,8 @@ static const type& name() \ #define PLUGIN_ARCHITECTURE_WIN 1 #elif PLATFORM(GTK) && (OS(UNIX) && !OS(MAC_OS_X)) #define PLUGIN_ARCHITECTURE_X11 1 +#elif PLATFORM(QT) +// Qt handles this features.prf #else #define PLUGIN_ARCHITECTURE_UNSUPPORTED 1 #endif diff --git a/Source/api.pri b/Source/api.pri index e6b4aec69..da3a08df2 100644 --- a/Source/api.pri +++ b/Source/api.pri @@ -68,13 +68,11 @@ macx { } } -WEBKIT += wtf +WEBKIT += wtf javascriptcore webcore -WEBKIT += javascriptcore +build?(webkit1): WEBKIT += webkit1 -WEBKIT += webcore - -!no_webkit2 { +build?(webkit2) { WEBKIT += webkit2 # Ensure that changes to the WebKit1 and WebKit2 API will trigger a qmake of this @@ -83,9 +81,7 @@ WEBKIT += webcore QMAKE_INTERNAL_INCLUDED_FILES *= WebKit/WebKit1.pro } -!no_webkit1: WEBKIT += webkit1 - -contains(DEFINES, WTF_USE_3D_GRAPHICS=1): WEBKIT += angle +use?(3D_GRAPHICS): WEBKIT += angle qnx { # see: https://bugs.webkit.org/show_bug.cgi?id=93460 diff --git a/Source/cmake/EFLHelpers.cmake b/Source/cmake/EFLHelpers.cmake new file mode 100644 index 000000000..bf8fbf416 --- /dev/null +++ b/Source/cmake/EFLHelpers.cmake @@ -0,0 +1,72 @@ +# - Set of macros and functions that are useful for building the EFL port. +# +# The following functions are currently defined: +# FIND_EFL_LIBRARY(<name> HEADERS <header1> ... HEADER_PREFIXES <prefix1> ... LIBRARY <libname>) +# Looks for the header files inside the given prefix directories, and for the library +# passed to the LIBRARY parameter. +# Two #defines in the form <UPPERCASED_NAME>_VERSION_MAJOR and <UPPERCASED_NAME>_VERSION_MINOR +# are looked for in all the given headers, and the first occurrence is used to build the library's +# version number. +# This function defines the following variables: +# - <UPPERCASED_NAME>_INCLUDE_DIRS: All the directories required by this library's headers. +# - <UPPERCASED_NAME>_LIBRARIES: All the libraries required to link against this library. +# - <UPPERCASED_NAME>_VERSION: The library's version in the format "major.minor". +# +# Copyright (C) 2012 Intel Corporation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS +# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +INCLUDE(CMakeParseArguments) + +FUNCTION(FIND_EFL_LIBRARY _name) + CMAKE_PARSE_ARGUMENTS(PARAM "" "LIBRARY" "HEADERS;HEADER_PREFIXES" ${ARGN}) + + STRING(TOUPPER ${_name} _name_upper) + SET(_version_found FALSE) + + FOREACH (_current_header ${PARAM_HEADERS}) + FIND_PATH(${_current_header}_INCLUDE_DIR NAMES ${_current_header} PATH_SUFFIXES ${PARAM_HEADER_PREFIXES}) + LIST(APPEND ${_name}_INCLUDE_DIRS "${${_current_header}_INCLUDE_DIR}") + + IF (NOT _version_found) + SET (_header_path "${${_current_header}_INCLUDE_DIR}/${_current_header}") + IF (EXISTS ${_header_path}) + FILE(READ "${_header_path}" _header_contents) + + STRING(REGEX MATCH "#define +${_name_upper}_VERSION_MAJOR +([0-9]+)" _dummy "${_header_contents}") + SET(_version_major "${CMAKE_MATCH_1}") + STRING(REGEX MATCH "#define +${_name_upper}_VERSION_MINOR +([0-9]+)" _dummy "${_header_contents}") + SET(_version_minor "${CMAKE_MATCH_1}") + + IF (_version_major AND _version_minor) + SET(_version_found TRUE) + ENDIF () + ENDIF () + ENDIF () + ENDFOREACH () + + FIND_LIBRARY(${_name}_LIBRARIES NAMES ${PARAM_LIBRARY}) + + SET(${_name}_INCLUDE_DIRS ${${_name}_INCLUDE_DIRS} PARENT_SCOPE) + SET(${_name}_LIBRARIES ${${_name}_LIBRARIES} PARENT_SCOPE) + SET(${_name}_VERSION "${_version_major}.${_version_minor}" PARENT_SCOPE) +ENDFUNCTION() diff --git a/Source/cmake/FindEFL.cmake b/Source/cmake/FindEFL.cmake deleted file mode 100644 index 5755e16da..000000000 --- a/Source/cmake/FindEFL.cmake +++ /dev/null @@ -1,28 +0,0 @@ -INCLUDE(FindPkgConfig) - -PKG_CHECK_MODULES (EDJE REQUIRED edje>=1.0.0) -PKG_CHECK_MODULES (ECORE REQUIRED ecore>=1.2.0) -PKG_CHECK_MODULES (ECORE_EVAS REQUIRED ecore-evas>=1.0.0) -PKG_CHECK_MODULES (EFLDEPS REQUIRED - eina>=1.2.0 - evas>=1.0.0 - ecore>=1.2.0 - ecore-file>=1.0.0 - ecore-evas>=1.0.999.59763 - edje>=1.0.0 - eukit>=1.1.0 - edbus>=1.1.0 - ecore-input>=1.0.0 - eeze>=1.2.99 - efreet>=1.0.0) -PKG_CHECK_MODULES (EINA REQUIRED eina>=1.2.0) -PKG_CHECK_MODULES (ECORE_X ecore-x>=1.0.0) -PKG_CHECK_MODULES (EVAS REQUIRED evas>=1.0.0) -PKG_CHECK_MODULES (EUKIT REQUIRED eukit>=1.1.0) -PKG_CHECK_MODULES (EDBUS REQUIRED edbus>=1.1.0) -PKG_CHECK_MODULES (EFREET REQUIRED efreet>=1.0.0) - -FIND_PROGRAM (EDJE_CC_EXECUTABLE edje_cc) -IF (NOT EDJE_CC_EXECUTABLE) - MESSAGE (FATAL_ERROR "edje_cc could not be found") -ENDIF () diff --git a/Source/cmake/FindE_DBus.cmake b/Source/cmake/FindE_DBus.cmake new file mode 100644 index 000000000..5a819987d --- /dev/null +++ b/Source/cmake/FindE_DBus.cmake @@ -0,0 +1,62 @@ +# - Try to find E_DBus +# Once done, this will define +# +# E_DBUS_FOUND - system has E_DBus installed. +# E_DBUS_INCLUDE_DIRS - directories which contain the E_DBus headers. +# E_DBUS_LIBRARIES - libraries required to link against E_DBus. +# +# Optionally, the COMPONENTS keyword can be passed to FIND_PACKAGE() +# and additional E_DBus libraries can be looked for. Currently, the +# following libraries can be searched, and they define the following +# variables if found: +# +# EUKIT - E_DBUS_EUKIT_INCLUDE_DIRS and E_DBUS_EUKIT_LIBRARIES +# +# Copyright (C) 2012 Intel Corporation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS +# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +INCLUDE(EFLHelpers) + +FIND_EFL_LIBRARY(E_DBUS + HEADERS E_DBus.h + HEADER_PREFIXES e_dbus-1 + LIBRARY edbus +) + +# Components. +FIND_EFL_LIBRARY(E_DBUS_EUKIT + HEADERS E_Ukit.h + HEADER_PREFIXES e_dbus-1 + LIBRARY eukit +) + +FOREACH(_component ${E_DBus_FIND_COMPONENTS}) + SET(_e_dbus_component "E_DBUS_${_component}") + STRING(TOUPPER ${_e_dbus_component} _UPPER_NAME) + + LIST(APPEND _E_DBUS_REQUIRED_COMPONENT_VARS ${_UPPER_NAME}_INCLUDE_DIRS ${_UPPER_NAME}_LIBRARIES) +ENDFOREACH() + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(E_DBus REQUIRED_VARS E_DBUS_INCLUDE_DIRS E_DBUS_LIBRARIES ${_E_DBUS_REQUIRED_COMPONENT_VARS} + VERSION_VAR E_DBUS_VERSION) diff --git a/Source/cmake/FindEcore.cmake b/Source/cmake/FindEcore.cmake new file mode 100644 index 000000000..ec76b6585 --- /dev/null +++ b/Source/cmake/FindEcore.cmake @@ -0,0 +1,80 @@ +# - Try to find Ecore +# Once done, this will define +# +# ECORE_FOUND - system has Ecore installed. +# ECORE_INCLUDE_DIRS - directories which contain the Ecore headers. +# ECORE_LIBRARIES - libraries required to link against Ecore. +# +# Optionally, the COMPONENTS keyword can be passed to FIND_PACKAGE() +# and additional Ecore libraries can be looked for. Currently, the +# following libraries can be searched, and they define the following +# variables if found: +# +# EVAS - ECORE_EVAS_INCLUDE_DIRS and ECORE_EVAS_LIBRARIES +# FILE - ECORE_FILE_INCLUDE_DIRS and ECORE_FILE_LIBRARIES +# INPUT - ECORE_INPUT_INCLUDE_DIRS and ECORE_INPUT_LIBRARIES +# X - ECORE_X_INCLUDE_DIRS and ECORE_X_LIBRARIES +# +# Copyright (C) 2012 Intel Corporation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS +# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +INCLUDE(EFLHelpers) + +FIND_EFL_LIBRARY(ECORE + HEADERS Ecore.h + HEADER_PREFIXES ecore-1 + LIBRARY ecore +) + +# Components. +FIND_EFL_LIBRARY(ECORE_EVAS + HEADERS Ecore_Evas.h + HEADER_PREFIXES ecore-1 + LIBRARY ecore_evas +) +FIND_EFL_LIBRARY(ECORE_FILE + HEADERS Ecore_File.h + HEADER_PREFIXES ecore-1 + LIBRARY ecore_file +) +FIND_EFL_LIBRARY(ECORE_INPUT + HEADERS Ecore_Input.h + HEADER_PREFIXES ecore-1 + LIBRARY ecore_input +) +FIND_EFL_LIBRARY(ECORE_X + HEADERS Ecore_X.h + HEADER_PREFIXES ecore-1 + LIBRARY ecore_x +) + +FOREACH(_component ${Ecore_FIND_COMPONENTS}) + SET(_ecore_component "ECORE_${_component}") + STRING(TOUPPER ${_ecore_component} _UPPER_NAME) + + LIST(APPEND _ECORE_REQUIRED_COMPONENT_VARS ${_UPPER_NAME}_INCLUDE_DIRS ${_UPPER_NAME}_LIBRARIES) +ENDFOREACH() + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Ecore REQUIRED_VARS ECORE_INCLUDE_DIRS ECORE_LIBRARIES ${_ECORE_REQUIRED_COMPONENT_VARS} + VERSION_VAR ECORE_VERSION) diff --git a/Source/cmake/FindEdje.cmake b/Source/cmake/FindEdje.cmake new file mode 100644 index 000000000..01ff8d819 --- /dev/null +++ b/Source/cmake/FindEdje.cmake @@ -0,0 +1,46 @@ +# - Try to find Edje +# Once done, this will define +# +# EDJE_FOUND - system has Edje installed. +# EDJE_INCLUDE_DIRS - directories which contain the Edje headers. +# EDJE_LIBRARIES - libraries required to link against Edje. +# EDJE_CC_EXECUTABLE - full path to the `edje_cc' program. +# +# Copyright (C) 2012 Intel Corporation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS +# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +INCLUDE(EFLHelpers) + +FIND_EFL_LIBRARY(EDJE + HEADERS Edje.h + HEADER_PREFIXES edje-1 + LIBRARY edje +) + +FIND_PROGRAM(EDJE_CC_EXECUTABLE + NAMES edje_cc +) + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Edje REQUIRED_VARS EDJE_INCLUDE_DIRS EDJE_LIBRARIES EDJE_CC_EXECUTABLE + VERSION_VAR EDJE_VERSION) diff --git a/Source/cmake/FindEeze.cmake b/Source/cmake/FindEeze.cmake new file mode 100644 index 000000000..93edc4862 --- /dev/null +++ b/Source/cmake/FindEeze.cmake @@ -0,0 +1,41 @@ +# - Try to find Eeze +# Once done, this will define +# +# EEZE_FOUND - system has Eeze installed. +# EEZE_INCLUDE_DIRS - directories which contain the Eeze headers. +# EEZE_LIBRARIES - libraries required to link against Eeze. +# +# Copyright (C) 2012 Intel Corporation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS +# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +INCLUDE(EFLHelpers) + +FIND_EFL_LIBRARY(EEZE + HEADERS Eeze.h + HEADER_PREFIXES eeze-1 + LIBRARY eeze +) + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Eeze REQUIRED_VARS EEZE_INCLUDE_DIRS EEZE_LIBRARIES + VERSION_VAR EEZE_VERSION) diff --git a/Source/cmake/FindEfreet.cmake b/Source/cmake/FindEfreet.cmake new file mode 100644 index 000000000..22d704b29 --- /dev/null +++ b/Source/cmake/FindEfreet.cmake @@ -0,0 +1,41 @@ +# - Try to find Efreet +# Once done, this will define +# +# EFREET_FOUND - system has Efreet installed. +# EFREET_INCLUDE_DIRS - directories which contain the Efreet headers. +# EFREET_LIBRARIES - libraries required to link against Efreet. +# +# Copyright (C) 2012 Intel Corporation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS +# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +INCLUDE(EFLHelpers) + +FIND_EFL_LIBRARY(EFREET + HEADERS Efreet.h + HEADER_PREFIXES efreet-1 + LIBRARY efreet +) + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Efreet REQUIRED_VARS EFREET_INCLUDE_DIRS EFREET_LIBRARIES + VERSION_VAR EFREET_VERSION) diff --git a/Source/cmake/FindEina.cmake b/Source/cmake/FindEina.cmake new file mode 100644 index 000000000..5ac94800c --- /dev/null +++ b/Source/cmake/FindEina.cmake @@ -0,0 +1,41 @@ +# - Try to find Eina +# Once done, this will define +# +# EINA_FOUND - system has Eina installed. +# EINA_INCLUDE_DIRS - directories which contain the Eina headers. +# EINA_LIBRARIES - libraries required to link against Eina. +# +# Copyright (C) 2012 Intel Corporation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS +# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +INCLUDE(EFLHelpers) + +FIND_EFL_LIBRARY(EINA + HEADERS Eina.h eina_main.h + HEADER_PREFIXES eina-1 eina-1/eina + LIBRARY eina +) + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Eina REQUIRED_VARS EINA_INCLUDE_DIRS EINA_LIBRARIES + VERSION_VAR EINA_VERSION) diff --git a/Source/cmake/FindEvas.cmake b/Source/cmake/FindEvas.cmake new file mode 100644 index 000000000..ce75eae0a --- /dev/null +++ b/Source/cmake/FindEvas.cmake @@ -0,0 +1,41 @@ +# - Try to find Evas +# Once done, this will define +# +# EVAS_FOUND - system has Evas installed. +# EVAS_INCLUDE_DIRS - directories which contain the Evas headers. +# EVAS_LIBRARIES - libraries required to link against Evas. +# +# Copyright (C) 2012 Intel Corporation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS +# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +INCLUDE(EFLHelpers) + +FIND_EFL_LIBRARY(EVAS + HEADERS Evas.h + HEADER_PREFIXES evas-1 + LIBRARY evas +) + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Evas REQUIRED_VARS EVAS_INCLUDE_DIRS EVAS_LIBRARIES + VERSION_VAR EVAS_VERSION) diff --git a/Source/cmake/OptionsEfl.cmake b/Source/cmake/OptionsEfl.cmake index 525bf0ffe..e0b026ec1 100644 --- a/Source/cmake/OptionsEfl.cmake +++ b/Source/cmake/OptionsEfl.cmake @@ -8,7 +8,6 @@ ADD_DEFINITIONS(-DWTF_PLATFORM_EFL=1) SET(WTF_PLATFORM_EFL 1) FIND_PACKAGE(Cairo 1.10 REQUIRED) -FIND_PACKAGE(EFL REQUIRED) FIND_PACKAGE(Fontconfig 2.8.0 REQUIRED) FIND_PACKAGE(Sqlite REQUIRED) FIND_PACKAGE(LibXml2 2.6 REQUIRED) @@ -99,14 +98,18 @@ WEBKIT_OPTION_END() OPTION(ENABLE_ECORE_X "Enable Ecore_X specific usage (cursor, bell)" ON) IF (ENABLE_ECORE_X) - IF (ECORE_X_FOUND) - MESSAGE(STATUS "Using Ecore-X to provide extended support.") - ADD_DEFINITIONS(-DHAVE_ECORE_X) - ELSE () - MESSAGE(ERROR "Requested Ecore-X but it was not found!") - ENDIF () + LIST(APPEND ECORE_ADDITIONAL_COMPONENTS X) + ADD_DEFINITIONS(-DHAVE_ECORE_X) ENDIF () +FIND_PACKAGE(Eina 1.2 REQUIRED) +FIND_PACKAGE(Evas 1.0 REQUIRED) +FIND_PACKAGE(Ecore 1.2 COMPONENTS Evas File Input ${ECORE_ADDITIONAL_COMPONENTS}) +FIND_PACKAGE(Edje 1.0 REQUIRED) +FIND_PACKAGE(Eeze 1.2 REQUIRED) +FIND_PACKAGE(Efreet 1.0 REQUIRED) +FIND_PACKAGE(E_DBus 1.1 COMPONENTS EUKit) + FIND_PACKAGE(Freetype REQUIRED) FIND_PACKAGE(HarfBuzz REQUIRED) SET(WTF_USE_FREETYPE 1) diff --git a/Source/tests.pri b/Source/tests.pri index 3c09864b1..c7cacaa24 100644 --- a/Source/tests.pri +++ b/Source/tests.pri @@ -27,7 +27,7 @@ linux-* { SUBDIRS += $$WEBKIT_TESTS_DIR/MIMESniffing } -contains(DEFINES, HAVE_QQUICK1=1): SUBDIRS += $$WEBKIT_TESTS_DIR/qdeclarativewebview +have?(QQUICK1): SUBDIRS += $$WEBKIT_TESTS_DIR/qdeclarativewebview # Benchmarks SUBDIRS += \ @@ -37,14 +37,14 @@ SUBDIRS += \ # WebGL performance tests are disabled temporarily. # https://bugs.webkit.org/show_bug.cgi?id=80503 # -#contains(DEFINES, ENABLE_WEBGL=1) { +#enable?(WEBGL) { # SUBDIRS += $$WEBKIT_TESTS_DIR/benchmarks/webgl #} -!no_webkit2 { +build?(webkit2): { WEBKIT2_TESTS_DIR = $$PWD/WebKit2/UIProcess/API/qt/tests - contains(DEFINES, HAVE_QTQUICK=1):SUBDIRS += \ + have?(QTQUICK):SUBDIRS += \ $$WEBKIT2_TESTS_DIR/inspectorserver \ $$WEBKIT2_TESTS_DIR/publicapi \ $$WEBKIT2_TESTS_DIR/qquickwebview \ |