diff --git a/DEPS b/DEPS index bc4e1fe..a1a7c2c77 100644 --- a/DEPS +++ b/DEPS
@@ -40,7 +40,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '30229ac6282981c28ced8f513c8d09684d9d0581', + 'skia_revision': 'c1b879f11b937142f5478bd3b416b26be93dea23', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -96,7 +96,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': 'f7bb286d01fdbedf1f6dd5921d564ef5f0344cb4', + 'catapult_revision': '49eb11f63eb4d552d634833a01d2710208ba0523', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other.
diff --git a/cc/paint/paint_op_buffer.cc b/cc/paint/paint_op_buffer.cc index a98392a..fa62a41 100644 --- a/cc/paint/paint_op_buffer.cc +++ b/cc/paint/paint_op_buffer.cc
@@ -120,8 +120,12 @@ // in the PaintOpBuffer::Raster function as DisplayItemList calls // into RasterWithAlpha directly. if (op->record->approximateOpCount() == 1) { - op->record->GetFirstOp()->RasterWithAlpha(canvas, alpha); - return; + PaintOp* single_op = op->record->GetFirstOp(); + // RasterWithAlpha only supported for draw ops. + if (single_op->IsDrawOp()) { + single_op->RasterWithAlpha(canvas, alpha); + return; + } } canvas->saveLayerAlpha(nullptr, alpha); @@ -358,14 +362,6 @@ g_raster_alpha_functions[type](this, canvas, alpha); } -DrawDisplayItemListOp::DrawDisplayItemListOp( - scoped_refptr<DisplayItemList> list) - : list(list) {} - -size_t DrawDisplayItemListOp::AdditionalBytesUsed() const { - return list->ApproximateMemoryUsage(); -} - int ClipPathOp::CountSlowPaths() const { return antialias && !path.isConvex() ? 1 : 0; } @@ -412,6 +408,20 @@ AnnotateOp::~AnnotateOp() = default; +DrawDisplayItemListOp::DrawDisplayItemListOp( + scoped_refptr<DisplayItemList> list) + : list(list) {} + +size_t DrawDisplayItemListOp::AdditionalBytesUsed() const { + return list->ApproximateMemoryUsage(); +} + +DrawDisplayItemListOp::DrawDisplayItemListOp(const DrawDisplayItemListOp& op) = + default; + +DrawDisplayItemListOp& DrawDisplayItemListOp::operator=( + const DrawDisplayItemListOp& op) = default; + DrawDisplayItemListOp::~DrawDisplayItemListOp() = default; DrawImageOp::DrawImageOp(const PaintImage& image,
diff --git a/cc/paint/paint_op_buffer.h b/cc/paint/paint_op_buffer.h index b5f60a4d..333a290 100644 --- a/cc/paint/paint_op_buffer.h +++ b/cc/paint/paint_op_buffer.h
@@ -22,14 +22,14 @@ class DisplayItemList; -class ThreadsafeMatrix : public SkMatrix { +class CC_PAINT_EXPORT ThreadsafeMatrix : public SkMatrix { public: explicit ThreadsafeMatrix(const SkMatrix& matrix) : SkMatrix(matrix) { (void)getType(); } }; -class ThreadsafePath : public SkPath { +class CC_PAINT_EXPORT ThreadsafePath : public SkPath { public: explicit ThreadsafePath(const SkPath& path) : SkPath(path) { updateBoundsCache(); @@ -97,7 +97,7 @@ static SkRect kUnsetRect; }; -struct PaintOpWithData : PaintOp { +struct CC_PAINT_EXPORT PaintOpWithData : PaintOp { // Having data is just a helper for ops that have a varying amount of data and // want a way to store that inline. This is for ops that pass in a // void* and a length. @@ -127,13 +127,13 @@ return op + 1; } -struct PaintOpWithDataArrayBase : PaintOpWithData { +struct CC_PAINT_EXPORT PaintOpWithDataArrayBase : PaintOpWithData { // Helper class for static asserts in push functions. using PaintOpWithData::PaintOpWithData; }; template <typename T> -struct PaintOpWithDataArray : PaintOpWithDataArrayBase { +struct CC_PAINT_EXPORT PaintOpWithDataArray : PaintOpWithDataArrayBase { // Paint op that has a T[count] and a char[bytes]. PaintOpWithDataArray(size_t bytes, size_t count) : PaintOpWithDataArrayBase(bytes), count(count) {} @@ -157,7 +157,7 @@ return SkTAddOffset<M>(op + 1, op->bytes); } -struct AnnotateOp final : PaintOp { +struct CC_PAINT_EXPORT AnnotateOp final : PaintOp { enum class AnnotationType { URL, LinkToDestination, @@ -176,7 +176,7 @@ sk_sp<SkData> data; }; -struct ClipPathOp final : PaintOp { +struct CC_PAINT_EXPORT ClipPathOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::ClipPath; ClipPathOp(SkPath path, SkClipOp op, bool antialias) : path(path), op(op), antialias(antialias) {} @@ -188,7 +188,7 @@ bool antialias; }; -struct ClipRectOp final : PaintOp { +struct CC_PAINT_EXPORT ClipRectOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::ClipRect; ClipRectOp(const SkRect& rect, SkClipOp op, bool antialias) : rect(rect), op(op), antialias(antialias) {} @@ -199,7 +199,7 @@ bool antialias; }; -struct ClipRRectOp final : PaintOp { +struct CC_PAINT_EXPORT ClipRRectOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::ClipRRect; ClipRRectOp(const SkRRect& rrect, SkClipOp op, bool antialias) : rrect(rrect), op(op), antialias(antialias) {} @@ -210,7 +210,7 @@ bool antialias; }; -struct ConcatOp final : PaintOp { +struct CC_PAINT_EXPORT ConcatOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::Concat; explicit ConcatOp(const SkMatrix& matrix) : matrix(matrix) {} void Raster(SkCanvas* canvas) const; @@ -218,7 +218,7 @@ ThreadsafeMatrix matrix; }; -struct DrawArcOp final : PaintOp { +struct CC_PAINT_EXPORT DrawArcOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawArc; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -241,7 +241,7 @@ PaintFlags flags; }; -struct DrawCircleOp final : PaintOp { +struct CC_PAINT_EXPORT DrawCircleOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawCircle; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -258,7 +258,7 @@ PaintFlags flags; }; -struct DrawColorOp final : PaintOp { +struct CC_PAINT_EXPORT DrawColorOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawColor; static constexpr bool kIsDrawOp = true; DrawColorOp(SkColor color, SkBlendMode mode) : color(color), mode(mode) {} @@ -268,10 +268,15 @@ SkBlendMode mode; }; -struct DrawDisplayItemListOp final : PaintOp { +struct CC_PAINT_EXPORT DrawDisplayItemListOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawDisplayItemList; static constexpr bool kIsDrawOp = true; explicit DrawDisplayItemListOp(scoped_refptr<DisplayItemList> list); + // Windows wants to generate these when types are exported, so + // provide them here explicitly so that DisplayItemList doesn't have + // to be defined in this header. + DrawDisplayItemListOp(const DrawDisplayItemListOp& op); + DrawDisplayItemListOp& operator=(const DrawDisplayItemListOp& op); ~DrawDisplayItemListOp(); void Raster(SkCanvas* canvas) const; size_t AdditionalBytesUsed() const; @@ -280,7 +285,7 @@ scoped_refptr<DisplayItemList> list; }; -struct DrawDRRectOp final : PaintOp { +struct CC_PAINT_EXPORT DrawDRRectOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawDRRect; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -295,7 +300,7 @@ PaintFlags flags; }; -struct DrawImageOp final : PaintOp { +struct CC_PAINT_EXPORT DrawImageOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawImage; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -312,7 +317,7 @@ PaintFlags flags; }; -struct DrawImageRectOp final : PaintOp { +struct CC_PAINT_EXPORT DrawImageRectOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawImageRect; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -331,7 +336,7 @@ PaintCanvas::SrcRectConstraint constraint; }; -struct DrawIRectOp final : PaintOp { +struct CC_PAINT_EXPORT DrawIRectOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawIRect; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -343,7 +348,7 @@ PaintFlags flags; }; -struct DrawLineOp final : PaintOp { +struct CC_PAINT_EXPORT DrawLineOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawLine; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -363,7 +368,7 @@ PaintFlags flags; }; -struct DrawOvalOp final : PaintOp { +struct CC_PAINT_EXPORT DrawOvalOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawOval; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -375,7 +380,7 @@ PaintFlags flags; }; -struct DrawPathOp final : PaintOp { +struct CC_PAINT_EXPORT DrawPathOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawPath; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -388,7 +393,7 @@ PaintFlags flags; }; -struct DrawPosTextOp final : PaintOpWithDataArray<SkPoint> { +struct CC_PAINT_EXPORT DrawPosTextOp final : PaintOpWithDataArray<SkPoint> { static constexpr PaintOpType kType = PaintOpType::DrawPosText; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -399,7 +404,7 @@ PaintFlags flags; }; -struct DrawRecordOp final : PaintOp { +struct CC_PAINT_EXPORT DrawRecordOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawRecord; static constexpr bool kIsDrawOp = true; explicit DrawRecordOp(sk_sp<const PaintRecord> record); @@ -410,7 +415,7 @@ sk_sp<const PaintRecord> record; }; -struct DrawRectOp final : PaintOp { +struct CC_PAINT_EXPORT DrawRectOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawRect; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -422,7 +427,7 @@ PaintFlags flags; }; -struct DrawRRectOp final : PaintOp { +struct CC_PAINT_EXPORT DrawRRectOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawRRect; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -434,7 +439,7 @@ PaintFlags flags; }; -struct DrawTextOp final : PaintOpWithData { +struct CC_PAINT_EXPORT DrawTextOp final : PaintOpWithData { static constexpr PaintOpType kType = PaintOpType::DrawText; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -447,7 +452,7 @@ PaintFlags flags; }; -struct DrawTextBlobOp final : PaintOp { +struct CC_PAINT_EXPORT DrawTextBlobOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::DrawTextBlob; static constexpr bool kIsDrawOp = true; static constexpr bool kHasPaintFlags = true; @@ -464,17 +469,17 @@ PaintFlags flags; }; -struct NoopOp final : PaintOp { +struct CC_PAINT_EXPORT NoopOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::Noop; void Raster(SkCanvas* canvas) const {} }; -struct RestoreOp final : PaintOp { +struct CC_PAINT_EXPORT RestoreOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::Restore; void Raster(SkCanvas* canvas) const; }; -struct RotateOp final : PaintOp { +struct CC_PAINT_EXPORT RotateOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::Rotate; explicit RotateOp(SkScalar degrees) : degrees(degrees) {} void Raster(SkCanvas* canvas) const; @@ -482,12 +487,12 @@ SkScalar degrees; }; -struct SaveOp final : PaintOp { +struct CC_PAINT_EXPORT SaveOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::Save; void Raster(SkCanvas* canvas) const; }; -struct SaveLayerOp final : PaintOp { +struct CC_PAINT_EXPORT SaveLayerOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::SaveLayer; static constexpr bool kHasPaintFlags = true; SaveLayerOp(const SkRect* bounds, const PaintFlags* flags) @@ -501,7 +506,7 @@ PaintFlags flags; }; -struct SaveLayerAlphaOp final : PaintOp { +struct CC_PAINT_EXPORT SaveLayerAlphaOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::SaveLayerAlpha; SaveLayerAlphaOp(const SkRect* bounds, uint8_t alpha) : bounds(bounds ? *bounds : kUnsetRect), alpha(alpha) {} @@ -511,7 +516,7 @@ uint8_t alpha; }; -struct ScaleOp final : PaintOp { +struct CC_PAINT_EXPORT ScaleOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::Scale; ScaleOp(SkScalar sx, SkScalar sy) : sx(sx), sy(sy) {} void Raster(SkCanvas* canvas) const; @@ -520,7 +525,7 @@ SkScalar sy; }; -struct SetMatrixOp final : PaintOp { +struct CC_PAINT_EXPORT SetMatrixOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::SetMatrix; explicit SetMatrixOp(const SkMatrix& matrix) : matrix(matrix) {} // This is the only op that needs the original ctm of the SkCanvas @@ -534,7 +539,7 @@ ThreadsafeMatrix matrix; }; -struct TranslateOp final : PaintOp { +struct CC_PAINT_EXPORT TranslateOp final : PaintOp { static constexpr PaintOpType kType = PaintOpType::Translate; TranslateOp(SkScalar dx, SkScalar dy) : dx(dx), dy(dy) {} void Raster(SkCanvas* canvas) const;
diff --git a/cc/paint/paint_op_buffer_unittest.cc b/cc/paint/paint_op_buffer_unittest.cc index 5e0bf2aa..a962ab9 100644 --- a/cc/paint/paint_op_buffer_unittest.cc +++ b/cc/paint/paint_op_buffer_unittest.cc
@@ -256,4 +256,77 @@ EXPECT_EQ(draw_flags.getAlpha(), canvas.paint_.getAlpha()); } +// Verify that the save draw restore code works with a single op +// that's not a draw op, and the optimization does not kick in. +TEST(PaintOpBufferTest, SaveDrawRestore_SingleOpNotADrawOp) { + PaintOpBuffer buffer; + + uint8_t alpha = 100; + buffer.push<SaveLayerAlphaOp>(nullptr, alpha); + + buffer.push<NoopOp>(); + buffer.push<RestoreOp>(); + + SaveCountingCanvas canvas; + buffer.playback(&canvas); + + EXPECT_EQ(1, canvas.save_count_); + EXPECT_EQ(1, canvas.restore_count_); +} + +// Test that the save/draw/restore optimization applies if the single op +// is a DrawRecord that itself has a single draw op. +TEST(PaintOpBufferTest, SaveDrawRestore_SingleOpRecordWithSingleOp) { + sk_sp<PaintRecord> record = sk_make_sp<PaintRecord>(); + + PaintFlags draw_flags; + draw_flags.setColor(SK_ColorMAGENTA); + draw_flags.setAlpha(50); + EXPECT_TRUE(draw_flags.SupportsFoldingAlpha()); + SkRect rect = SkRect::MakeXYWH(1, 2, 3, 4); + record->push<DrawRectOp>(rect, draw_flags); + EXPECT_EQ(record->approximateOpCount(), 1); + + PaintOpBuffer buffer; + + uint8_t alpha = 100; + buffer.push<SaveLayerAlphaOp>(nullptr, alpha); + buffer.push<DrawRecordOp>(std::move(record)); + buffer.push<RestoreOp>(); + + SaveCountingCanvas canvas; + buffer.playback(&canvas); + + EXPECT_EQ(0, canvas.save_count_); + EXPECT_EQ(0, canvas.restore_count_); + EXPECT_EQ(rect, canvas.draw_rect_); + + float expected_alpha = alpha * 50 / 255.f; + EXPECT_LE(std::abs(expected_alpha - canvas.paint_.getAlpha()), 1.f); +} + +// The same as the above SingleOpRecord test, but the single op is not +// a draw op. So, there's no way to fold in the save layer optimization. +// Verify that the optimization doesn't apply and that this doesn't crash. +// See: http://crbug.com/712093. +TEST(PaintOpBufferTest, SaveDrawRestore_SingleOpRecordWithSingleNonDrawOp) { + sk_sp<PaintRecord> record = sk_make_sp<PaintRecord>(); + record->push<NoopOp>(); + EXPECT_EQ(record->approximateOpCount(), 1); + EXPECT_FALSE(record->GetFirstOp()->IsDrawOp()); + + PaintOpBuffer buffer; + + uint8_t alpha = 100; + buffer.push<SaveLayerAlphaOp>(nullptr, alpha); + buffer.push<DrawRecordOp>(std::move(record)); + buffer.push<RestoreOp>(); + + SaveCountingCanvas canvas; + buffer.playback(&canvas); + + EXPECT_EQ(1, canvas.save_count_); + EXPECT_EQ(1, canvas.restore_count_); +} + } // namespace cc
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabState.java b/chrome/android/java/src/org/chromium/chrome/browser/TabState.java index 1141e99..6dde2d77 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/TabState.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/TabState.java
@@ -13,6 +13,7 @@ import org.chromium.base.StreamUtil; import org.chromium.base.VisibleForTesting; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.components.sync.SyncConstants; import org.chromium.content.browser.crypto.CipherFactory; import org.chromium.content_public.browser.WebContents; @@ -257,9 +258,9 @@ try { tabState.syncId = stream.readLong(); } catch (EOFException eof) { - tabState.syncId = 0; + tabState.syncId = SyncConstants.INVALID_TAB_NODE_ID; // Could happen if reading a version of TabState without syncId. - Log.w(TAG, "Failed to read syncId from tab state. Assuming syncId is: 0"); + Log.w(TAG, "Failed to read syncId from tab state. Assuming syncId is: -1"); } try { tabState.shouldPreserve = stream.readBoolean();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java index 0932df91..233c85c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfo.java
@@ -4,11 +4,14 @@ package org.chromium.chrome.browser.download; +import android.graphics.Bitmap; + import org.chromium.base.annotations.CalledByNative; import org.chromium.components.offline_items_collection.ContentId; import org.chromium.components.offline_items_collection.LegacyHelpers; import org.chromium.components.offline_items_collection.OfflineItem; import org.chromium.components.offline_items_collection.OfflineItemState; +import org.chromium.components.offline_items_collection.OfflineItemVisuals; import org.chromium.content_public.browser.DownloadState; /** @@ -42,6 +45,7 @@ private final ContentId mContentId; private final boolean mIsOpenable; private final boolean mIsTransient; + private final Bitmap mIcon; private DownloadInfo(Builder builder) { mUrl = builder.mUrl; @@ -74,6 +78,7 @@ } mIsOpenable = builder.mIsOpenable; mIsTransient = builder.mIsTransient; + mIcon = builder.mIcon; } public String getUrl() { @@ -182,12 +187,16 @@ return mIsTransient; } + public Bitmap getIcon() { + return mIcon; + } + /** * Helper method to build a {@link DownloadInfo} from an {@link OfflineItem}. * @param item The {@link OfflineItem} to mimic. * @return A {@link DownloadInfo} containing the relevant fields from {@code item}. */ - public static DownloadInfo fromOfflineItem(OfflineItem item) { + public static DownloadInfo fromOfflineItem(OfflineItem item, OfflineItemVisuals visuals) { int state; switch (item.state) { case OfflineItemState.COMPLETE: @@ -225,6 +234,7 @@ .setBytesReceived(item.receivedBytes) .setPercentCompleted(item.percentCompleted) .setTimeRemainingInMillis(item.timeRemainingMs) + .setIcon(visuals == null ? null : visuals.icon) .build(); } @@ -257,6 +267,7 @@ private ContentId mContentId; private boolean mIsOpenable = true; private boolean mIsTransient; + private Bitmap mIcon; public Builder setUrl(String url) { mUrl = url; @@ -384,6 +395,11 @@ return this; } + public Builder setIcon(Bitmap icon) { + mIcon = icon; + return this; + } + public DownloadInfo build() { return new DownloadInfo(this); } @@ -416,7 +432,8 @@ .setIsOffTheRecord(downloadInfo.isOffTheRecord()) .setIsOfflinePage(downloadInfo.isOfflinePage()) .setState(downloadInfo.state()) - .setLastAccessTime(downloadInfo.getLastAccessTime()); + .setLastAccessTime(downloadInfo.getLastAccessTime()) + .setIcon(downloadInfo.getIcon()); return builder; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java index 21af873..e8a636e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -575,7 +575,7 @@ // Move all regular downloads to pending. Don't propagate the pause because // if native is still working and it triggers an update, then the service will be // restarted. - notifyDownloadPaused(entry.id, !entry.isOffTheRecord, true, entry.isTransient); + notifyDownloadPaused(entry.id, !entry.isOffTheRecord, true, entry.isTransient, null); } } @@ -734,59 +734,67 @@ /** * Adds or updates an in-progress download notification. - * @param id The {@link ContentId} of the download. - * @param fileName File name of the download. - * @param percentage Percentage completed. Value should be between 0 to 100 if - * the percentage can be determined, or -1 if it is unknown. - * @param bytesReceived Total number of bytes received. - * @param timeRemainingInMillis Remaining download time in milliseconds. - * @param startTime Time when download started. - * @param isOffTheRecord Whether the download is off the record. + * @param id The {@link ContentId} of the download. + * @param fileName File name of the download. + * @param percentage Percentage completed. Value should be between 0 to 100 if the + * percentage can be determined, or -1 if it is unknown. + * @param bytesReceived Total number of bytes received. + * @param timeRemainingInMillis Remaining download time in milliseconds. + * @param startTime Time when download started. + * @param isOffTheRecord Whether the download is off the record. * @param canDownloadWhileMetered Whether the download can happen in metered network. - * @param isTransient Whether or not clicking on the download should launch downloads home. + * @param isTransient Whether or not clicking on the download should launch + * downloads home. + * @param icon A {@link Bitmap} to be used as the large icon for display. */ @VisibleForTesting public void notifyDownloadProgress(ContentId id, String fileName, int percentage, long bytesReceived, long timeRemainingInMillis, long startTime, boolean isOffTheRecord, - boolean canDownloadWhileMetered, boolean isTransient) { + boolean canDownloadWhileMetered, boolean isTransient, Bitmap icon) { updateActiveDownloadNotification(id, fileName, percentage, bytesReceived, timeRemainingInMillis, startTime, isOffTheRecord, canDownloadWhileMetered, false, - isTransient); + isTransient, icon); } /** * Adds or updates a pending download notification. - * @param id The {@link ContentId} of the download. - * @param fileName File name of the download. - * @param isOffTheRecord Whether the download is off the record. + * @param id The {@link ContentId} of the download. + * @param fileName File name of the download. + * @param isOffTheRecord Whether the download is off the record. * @param canDownloadWhileMetered Whether the download can happen in metered network. - * @param isTransient Whether or not clicking on the download should launch downloads home. + * @param isTransient Whether or not clicking on the download should launch + * downloads home. + * @param icon A {@link Bitmap} to be used as the large icon for display. */ private void notifyDownloadPending(ContentId id, String fileName, boolean isOffTheRecord, - boolean canDownloadWhileMetered, boolean isTransient) { + boolean canDownloadWhileMetered, boolean isTransient, Bitmap icon) { updateActiveDownloadNotification(id, fileName, DownloadItem.INDETERMINATE_DOWNLOAD_PERCENTAGE, 0, 0, 0, isOffTheRecord, - canDownloadWhileMetered, true, isTransient); + canDownloadWhileMetered, true, isTransient, icon); } /** * Helper method to update the notification for an active download, the download is either in * progress or pending. - * @param id The {@link ContentId} of the download. - * @param fileName File name of the download. - * @param percentage Percentage completed. Value should be between 0 to 100 if - * the percentage can be determined, or -1 if it is unknown. - * @param bytesReceived Total number of bytes received. - * @param timeRemainingInMillis Remaining download time in milliseconds or -1 if it is unknown. - * @param startTime Time when download started. - * @param isOffTheRecord Whether the download is off the record. + * @param id The {@link ContentId} of the download. + * @param fileName File name of the download. + * @param percentage Percentage completed. Value should be between 0 to 100 if the + * percentage can be determined, or -1 if it is unknown. + * @param bytesReceived Total number of bytes received. + * @param timeRemainingInMillis Remaining download time in milliseconds or -1 if it is + * unknown. + * @param startTime Time when download started. + * @param isOffTheRecord Whether the download is off the record. * @param canDownloadWhileMetered Whether the download can happen in metered network. - * @param isDownloadPending Whether the download is pending. - * @param isTransient Whether or not clicking on the download should launch downloads home. + * @param isDownloadPending Whether the download is pending. + * @param isTransient Whether or not clicking on the download should launch + * downloads home. + * @param icon A {@link Bitmap} to be used as the large icon for display. */ private void updateActiveDownloadNotification(ContentId id, String fileName, int percentage, long bytesReceived, long timeRemainingInMillis, long startTime, boolean isOffTheRecord, - boolean canDownloadWhileMetered, boolean isDownloadPending, boolean isTransient) { + boolean canDownloadWhileMetered, boolean isDownloadPending, boolean isTransient, + Bitmap icon) { boolean indeterminate = (percentage == DownloadItem.INDETERMINATE_DOWNLOAD_PERCENTAGE) || isDownloadPending; String contentText = null; @@ -832,6 +840,7 @@ downloadHomeIntent, PendingIntent.FLAG_UPDATE_CURRENT)); } builder.setAutoCancel(false); + if (icon != null) builder.setLargeIcon(icon); Intent pauseIntent = buildActionIntent(mContext, ACTION_DOWNLOAD_PAUSE, id, isOffTheRecord); builder.addAction(R.drawable.ic_pause_white_24dp, @@ -886,18 +895,19 @@ /** * Change a download notification to paused state. - * @param id The {@link ContentId} of the download. - * @param isResumable Whether download can be resumed. + * @param id The {@link ContentId} of the download. + * @param isResumable Whether download can be resumed. * @param isAutoResumable whether download is can be resumed automatically. - * @param isTransient Whether or not clicking on the download should launch downloads home. + * @param isTransient Whether or not clicking on the download should launch downloads home. + * @param icon A {@link Bitmap} to be used as the large icon for display. */ - public void notifyDownloadPaused( - ContentId id, boolean isResumable, boolean isAutoResumable, boolean isTransient) { + public void notifyDownloadPaused(ContentId id, boolean isResumable, boolean isAutoResumable, + boolean isTransient, Bitmap icon) { DownloadSharedPreferenceEntry entry = mDownloadSharedPreferenceHelper.getDownloadSharedPreferenceEntry(id); if (entry == null) return; if (!isResumable) { - notifyDownloadFailed(id, entry.fileName); + notifyDownloadFailed(id, entry.fileName, icon); return; } // If download is already paused, do nothing. @@ -905,7 +915,7 @@ // If download is interrupted due to network disconnection, show download pending state. if (isAutoResumable) { notifyDownloadPending(id, entry.fileName, entry.isOffTheRecord, - entry.canDownloadWhileMetered, isTransient); + entry.canDownloadWhileMetered, isTransient, icon); stopTrackingInProgressDownload(id, true); return; } @@ -923,6 +933,7 @@ downloadHomeIntent, PendingIntent.FLAG_UPDATE_CURRENT)); } builder.setAutoCancel(false); + if (icon != null) builder.setLargeIcon(icon); Intent resumeIntent = buildActionIntent(mContext, ACTION_DOWNLOAD_RESUME, id, entry.isOffTheRecord); @@ -949,19 +960,20 @@ /** * Add a download successful notification. - * @param id The {@link ContentId} of the download. - * @param filePath Full path to the download. - * @param fileName Filename of the download. - * @param systemDownloadId Download ID assigned by system DownloadManager. + * @param id The {@link ContentId} of the download. + * @param filePath Full path to the download. + * @param fileName Filename of the download. + * @param systemDownloadId Download ID assigned by system DownloadManager. * @param isSupportedMimeType Whether the MIME type can be viewed inside browser. - * @param isOpenable Whether or not this download can be opened. - * @return ID of the successful download notification. Used for removing the notification when - * user click on the snackbar. + * @param isOpenable Whether or not this download can be opened. + * @param icon A {@link Bitmap} to be used as the large icon for display. + * @return ID of the successful download notification. Used for removing the + * notification when user click on the snackbar. */ @VisibleForTesting public int notifyDownloadSuccessful(ContentId id, String filePath, String fileName, long systemDownloadId, boolean isOffTheRecord, boolean isSupportedMimeType, - boolean isOpenable) { + boolean isOpenable, Bitmap icon) { int notificationId = getNotificationId(id); ChromeNotificationBuilder builder = buildNotification(R.drawable.offline_pin, fileName, mContext.getResources().getString(R.string.download_notification_completed)); @@ -988,13 +1000,13 @@ builder.setContentIntent(PendingIntent.getBroadcast( mContext, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT)); } - if (mDownloadSuccessLargeIcon == null) { + if (icon == null && mDownloadSuccessLargeIcon == null) { Bitmap bitmap = BitmapFactory.decodeResource( mContext.getResources(), R.drawable.offline_pin); mDownloadSuccessLargeIcon = getLargeNotificationIcon(bitmap); } builder.setDeleteIntent(buildSummaryIconIntent(notificationId)); - builder.setLargeIcon(mDownloadSuccessLargeIcon); + builder.setLargeIcon(icon != null ? icon : mDownloadSuccessLargeIcon); updateNotification(notificationId, builder.build(), id, null); stopTrackingInProgressDownload(id, true); return notificationId; @@ -1002,11 +1014,12 @@ /** * Add a download failed notification. - * @param id The {@link ContentId} of the download. + * @param id The {@link ContentId} of the download. * @param fileName GUID of the download. + * @param icon A {@link Bitmap} to be used as the large icon for display. */ @VisibleForTesting - public void notifyDownloadFailed(ContentId id, String fileName) { + public void notifyDownloadFailed(ContentId id, String fileName, Bitmap icon) { // If the download is not in history db, fileName could be empty. Get it from // SharedPreferences. if (TextUtils.isEmpty(fileName)) { @@ -1020,6 +1033,7 @@ ChromeNotificationBuilder builder = buildNotification(android.R.drawable.stat_sys_download_done, fileName, mContext.getResources().getString(R.string.download_notification_failed)); + if (icon != null) builder.setLargeIcon(icon); builder.setDeleteIntent(buildSummaryIconIntent(notificationId)); updateNotification(notificationId, builder.build(), id, null); stopTrackingInProgressDownload(id, true); @@ -1152,7 +1166,10 @@ // If browser process already goes away, the download should have already paused. Do // nothing in that case. if (!DownloadManagerService.hasDownloadManagerService()) { - notifyDownloadPaused(entry.id, !entry.isOffTheRecord, false, entry.isTransient); + // TODO(dtrainor): Should we spin up native to make sure we have the icon? Or maybe + // build a Java cache for easy access. + notifyDownloadPaused( + entry.id, !entry.isOffTheRecord, false, entry.isTransient, null); hideSummaryNotificationIfNecessary(-1); return; } @@ -1199,11 +1216,15 @@ observer.onDownloadCanceled(entry.id); } } else if (ACTION_DOWNLOAD_PAUSE.equals(intent.getAction())) { - notifyDownloadPaused(entry.id, true, false, entry.isTransient); + // TODO(dtrainor): Consider hitting the delegate and rely on that to update the + // state. + notifyDownloadPaused(entry.id, true, false, entry.isTransient, null); downloadServiceDelegate.pauseDownload(entry.id, entry.isOffTheRecord); } else if (ACTION_DOWNLOAD_RESUME.equals(intent.getAction())) { + // TODO(dtrainor): Consider hitting the delegate and rely on that to update the + // state. notifyDownloadPending(entry.id, entry.fileName, entry.isOffTheRecord, - entry.canDownloadWhileMetered, entry.isTransient); + entry.canDownloadWhileMetered, entry.isTransient, null); downloadServiceDelegate.resumeDownload( entry.id, entry.buildDownloadItem(), true); } else if (ACTION_DOWNLOAD_RESUME_ALL.equals(intent.getAction())) { @@ -1372,7 +1393,7 @@ if (mDownloadsInProgress.contains(entry.id)) continue; notifyDownloadPending(entry.id, entry.fileName, false, entry.canDownloadWhileMetered, - entry.isTransient); + entry.isTransient, null); DownloadServiceDelegate downloadServiceDelegate = getServiceDelegate(entry.id); downloadServiceDelegate.resumeDownload(entry.id, entry.buildDownloadItem(), false); downloadServiceDelegate.destroyServiceDelegate();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java index 8612e0f7..8e9751e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java
@@ -271,25 +271,26 @@ info.getPercentCompleted(), info.getBytesReceived(), info.getTimeRemainingInMillis(), notificationInfo.startTime, info.isOffTheRecord(), notificationInfo.canDownloadWhileMetered, - info.getIsTransient()); + info.getIsTransient(), info.getIcon()); break; case DOWNLOAD_NOTIFICATION_TYPE_PAUSE: mBoundService.notifyDownloadPaused( - info.getContentId(), true, false, info.getIsTransient()); + info.getContentId(), true, false, info.getIsTransient(), info.getIcon()); break; case DOWNLOAD_NOTIFICATION_TYPE_INTERRUPT: mBoundService.notifyDownloadPaused(info.getContentId(), info.isResumable(), - notificationInfo.isAutoResumable, info.getIsTransient()); + notificationInfo.isAutoResumable, info.getIsTransient(), info.getIcon()); break; case DOWNLOAD_NOTIFICATION_TYPE_SUCCESS: final int notificationId = mBoundService.notifyDownloadSuccessful( info.getContentId(), info.getFilePath(), info.getFileName(), notificationInfo.systemDownloadId, info.isOffTheRecord(), - notificationInfo.isSupportedMimeType, info.getIsOpenable()); + notificationInfo.isSupportedMimeType, info.getIsOpenable(), info.getIcon()); onSuccessNotificationShown(notificationInfo, notificationId); break; case DOWNLOAD_NOTIFICATION_TYPE_FAILURE: - mBoundService.notifyDownloadFailed(info.getContentId(), info.getFileName()); + mBoundService.notifyDownloadFailed( + info.getContentId(), info.getFileName(), info.getIcon()); break; case DOWNLOAD_NOTIFICATION_TYPE_CANCEL: mBoundService.notifyDownloadCanceled(info.getContentId());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi.java b/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi.java index 23c7124..637a0ff 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUi.java
@@ -6,29 +6,51 @@ import org.chromium.chrome.browser.download.DownloadInfo; import org.chromium.chrome.browser.download.DownloadItem; -import org.chromium.chrome.browser.download.DownloadManagerService; import org.chromium.chrome.browser.download.DownloadNotifier; import org.chromium.chrome.browser.download.DownloadServiceDelegate; import org.chromium.components.offline_items_collection.ContentId; import org.chromium.components.offline_items_collection.OfflineContentProvider; import org.chromium.components.offline_items_collection.OfflineItem; import org.chromium.components.offline_items_collection.OfflineItemState; +import org.chromium.components.offline_items_collection.OfflineItemVisuals; +import org.chromium.components.offline_items_collection.VisualsCallback; import java.util.ArrayList; +import java.util.HashMap; /** * A glue class that bridges the Profile-attached OfflineContentProvider with the * download notification code (SystemDownloadNotifier and DownloadServiceDelegate). */ public class OfflineContentAggregatorNotificationBridgeUi - implements DownloadServiceDelegate, OfflineContentProvider.Observer { + implements DownloadServiceDelegate, OfflineContentProvider.Observer, VisualsCallback { + // TODO(dtrainor): Should this just be part of the OfflineContentProvider callback guarantee? + private static final OfflineItemVisuals sEmptyOfflineItemVisuals = new OfflineItemVisuals(); + private final OfflineContentProvider mProvider; + private final DownloadNotifier mUi; + + /** Holds a list of {@link OfflineItem} updates that are waiting for visuals. */ + private final HashMap<ContentId, OfflineItem> mOutstandingRequests = new HashMap<>(); + + /** + * Holds a list of {@link OfflineItemVisuals} for all {@link OfflineItem}s that are currently in + * progress. Once an {@link OfflineItem} is no longer in progress it will be removed from this + * cache. + * TODO(dtrainor): Flush this list aggressively if we get onLowMemory/onTrimMemory. + * TODO(dtrainor): Add periodic clean up in case something goes wrong with the underlying + * downloads. + */ + private final HashMap<ContentId, OfflineItemVisuals> mVisualsCache = new HashMap<>(); + /** * Creates a new OfflineContentAggregatorNotificationBridgeUi based on {@code provider}. */ - public OfflineContentAggregatorNotificationBridgeUi(OfflineContentProvider provider) { + public OfflineContentAggregatorNotificationBridgeUi( + OfflineContentProvider provider, DownloadNotifier notifier) { mProvider = provider; + mUi = notifier; mProvider.addObserver(this); } @@ -54,21 +76,35 @@ public void onItemsAdded(ArrayList<OfflineItem> items) { for (int i = 0; i < items.size(); i++) { OfflineItem item = items.get(i); - - // Only update the UI for new OfflineItems that are in progress or pending. - if (item.state == OfflineItemState.IN_PROGRESS - || item.state == OfflineItemState.PENDING) { - visuallyUpdateOfflineItem(item); - } + if (shouldPushNewItemToUi(item)) getVisualsAndUpdateItem(item); } } @Override - public void onItemRemoved(ContentId id) {} + public void onItemRemoved(ContentId id) { + mOutstandingRequests.remove(id); + mVisualsCache.remove(id); + mUi.notifyDownloadCanceled(id); + } @Override public void onItemUpdated(OfflineItem item) { - visuallyUpdateOfflineItem(item); + // Assume that any item sending updates should have them reflected in the UI. + getVisualsAndUpdateItem(item); + } + + // OfflineContentProvider.VisualsCallback implementation. + @Override + public void onVisualsAvailable(ContentId id, OfflineItemVisuals visuals) { + OfflineItem item = mOutstandingRequests.remove(id); + if (item == null) return; + + if (visuals == null) visuals = sEmptyOfflineItemVisuals; + + // Only cache the visuals if the update we are about to push is interesting and we think we + // will need them in the future. + if (shouldCacheVisuals(item)) mVisualsCache.put(id, visuals); + pushItemToUi(item, visuals); } // DownloadServiceDelegate implementation. @@ -90,34 +126,101 @@ @Override public void destroyServiceDelegate() {} - /** - * Calls into the proper {@link DownloadNotifier} by converting an {@link OfflineItem} to a - * {@link DownloadInfo}. - * @param item The {@link OfflineItem} that needs a UI refresh. - */ - private void visuallyUpdateOfflineItem(OfflineItem item) { - DownloadInfo info = DownloadInfo.fromOfflineItem(item); - DownloadNotifier notifier = - DownloadManagerService.getDownloadManagerService().getDownloadNotifier(); + private void getVisualsAndUpdateItem(OfflineItem item) { + if (needsVisualsForUi(item)) { + if (!mVisualsCache.containsKey(item.id)) { + // We don't have any visuals for this item yet. Stash the current OfflineItem and, + // if we haven't already, queue up a request for the visuals. + // TODO(dtrainor): Check if this delay is too much. If so, just send the update + // through and we can push a new notification when the visuals arrive. + boolean requestVisuals = !mOutstandingRequests.containsKey(item.id); + mOutstandingRequests.put(item.id, item); + if (requestVisuals) mProvider.getVisualsForItem(item.id, this); + return; + } + } else { + // We don't need the visuals to show this item at this point. Cancel any requests. + mOutstandingRequests.remove(item.id); + mVisualsCache.remove(item.id); + } + + pushItemToUi(item, mVisualsCache.get(item.id)); + // We will no longer be needing the visuals for this item after this notification. + if (!shouldCacheVisuals(item)) mVisualsCache.remove(item.id); + } + + private void pushItemToUi(OfflineItem item, OfflineItemVisuals visuals) { + DownloadInfo info = DownloadInfo.fromOfflineItem(item, visuals); switch (item.state) { case OfflineItemState.IN_PROGRESS: - notifier.notifyDownloadProgress(info, item.creationTimeMs, item.allowMetered); + mUi.notifyDownloadProgress(info, item.creationTimeMs, item.allowMetered); break; case OfflineItemState.COMPLETE: - notifier.notifyDownloadSuccessful(info, -1L, false, false); + mUi.notifyDownloadSuccessful(info, -1L, false, false); break; case OfflineItemState.CANCELLED: - notifier.notifyDownloadCanceled(item.id); + mUi.notifyDownloadCanceled(item.id); break; case OfflineItemState.INTERRUPTED: // TODO(dtrainor): Push the correct value for auto resume. - notifier.notifyDownloadInterrupted(info, true); + mUi.notifyDownloadInterrupted(info, true); break; case OfflineItemState.PAUSED: - notifier.notifyDownloadPaused(info); + mUi.notifyDownloadPaused(info); + break; + case OfflineItemState.FAILED: + mUi.notifyDownloadFailed(info); + break; + case OfflineItemState.PENDING: + // Not Implemented. break; default: - assert false; + assert false : "Unexpected OfflineItem state."; + } + } + + private boolean needsVisualsForUi(OfflineItem item) { + switch (item.state) { + case OfflineItemState.IN_PROGRESS: + case OfflineItemState.PENDING: + case OfflineItemState.COMPLETE: + case OfflineItemState.INTERRUPTED: + case OfflineItemState.FAILED: + case OfflineItemState.PAUSED: + return true; + case OfflineItemState.CANCELLED: + default: + return false; + } + } + + private boolean shouldPushNewItemToUi(OfflineItem item) { + switch (item.state) { + case OfflineItemState.IN_PROGRESS: + return true; + case OfflineItemState.PENDING: + case OfflineItemState.COMPLETE: + case OfflineItemState.INTERRUPTED: + case OfflineItemState.FAILED: + case OfflineItemState.PAUSED: + case OfflineItemState.CANCELLED: + default: + return false; + } + } + + private boolean shouldCacheVisuals(OfflineItem item) { + switch (item.state) { + case OfflineItemState.IN_PROGRESS: + case OfflineItemState.PENDING: + case OfflineItemState.INTERRUPTED: + case OfflineItemState.PAUSED: + return true; + case OfflineItemState.FAILED: + case OfflineItemState.COMPLETE: + case OfflineItemState.CANCELLED: + default: + return false; } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiFactory.java index c8bf22f..aaf7d86 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiFactory.java
@@ -5,6 +5,8 @@ package org.chromium.chrome.browser.download.items; import org.chromium.base.ThreadUtils; +import org.chromium.chrome.browser.download.DownloadManagerService; +import org.chromium.chrome.browser.download.DownloadNotifier; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.offline_items_collection.OfflineContentProvider; @@ -24,8 +26,10 @@ if (sBridgeUi == null) { Profile profile = Profile.getLastUsedProfile(); OfflineContentProvider provider = OfflineContentAggregatorFactory.forProfile(profile); + DownloadNotifier ui = + DownloadManagerService.getDownloadManagerService().getDownloadNotifier(); - sBridgeUi = new OfflineContentAggregatorNotificationBridgeUi(provider); + sBridgeUi = new OfflineContentAggregatorNotificationBridgeUi(provider, ui); } return sBridgeUi;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java index 060df42bb..0775f97 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -88,6 +88,7 @@ import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; import org.chromium.components.navigation_interception.InterceptNavigationDelegate; import org.chromium.components.security_state.ConnectionSecurityLevel; +import org.chromium.components.sync.SyncConstants; import org.chromium.content.browser.ChildProcessLauncher; import org.chromium.content.browser.ContentView; import org.chromium.content.browser.ContentViewCore; @@ -176,7 +177,7 @@ private SwipeRefreshHandler mSwipeRefreshHandler; /** The sync id of the Tab if session sync is enabled. */ - private int mSyncId; + private int mSyncId = SyncConstants.INVALID_TAB_NODE_ID; /** {@link ContentViewCore} showing the current page, or {@code null} if the tab is frozen. */ private ContentViewCore mContentViewCore;
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index 4115e74..dd854d7 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -1630,6 +1630,7 @@ "junit/src/org/chromium/chrome/browser/cookies/CanonicalCookieTest.java", "junit/src/org/chromium/chrome/browser/crash/LogcatExtractionRunnableUnitTest.java", "junit/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceEntryTest.java", + "junit/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiTest.java", "junit/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtilsTest.java", "junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java", "junit/src/org/chromium/chrome/browser/fullscreen/BrowserStateBrowserControlsVisibilityDelegateTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java index 02b45c9..85650cb 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
@@ -296,7 +296,7 @@ DownloadNotificationService service = bindNotificationService(); ContentId id3 = LegacyHelpers.buildLegacyContentId(false, UUID.randomUUID().toString()); - service.notifyDownloadProgress(id3, "test", 1, 100L, 1L, 1L, true, true, false); + service.notifyDownloadProgress(id3, "test", 1, 100L, 1L, 1L, true, true, false, null); assertEquals(3, getService().getNotificationIds().size()); int lastNotificationId = getService().getLastAddedNotificationId(); Set<String> entries = DownloadManagerService.getStoredDownloadInfo( @@ -305,13 +305,13 @@ ContentId id1 = LegacyHelpers.buildLegacyContentId(false, guid1); service.notifyDownloadSuccessful( - id1, "/path/to/success", "success", 100L, false, false, true); + id1, "/path/to/success", "success", 100L, false, false, true, null); entries = DownloadManagerService.getStoredDownloadInfo( sharedPrefs, DownloadSharedPreferenceHelper.KEY_PENDING_DOWNLOAD_NOTIFICATIONS); assertEquals(2, entries.size()); ContentId id2 = LegacyHelpers.buildLegacyContentId(false, guid2); - service.notifyDownloadFailed(id2, "failed"); + service.notifyDownloadFailed(id2, "failed", null); entries = DownloadManagerService.getStoredDownloadInfo( sharedPrefs, DownloadSharedPreferenceHelper.KEY_PENDING_DOWNLOAD_NOTIFICATIONS); assertEquals(1, entries.size()); @@ -322,7 +322,7 @@ ContentId id4 = LegacyHelpers.buildLegacyContentId(false, UUID.randomUUID().toString()); service.notifyDownloadSuccessful( - id4, "/path/to/success", "success", 100L, false, false, true); + id4, "/path/to/success", "success", 100L, false, false, true, null); assertEquals(3, getService().getNotificationIds().size()); int nextNotificationId = getService().getLastAddedNotificationId(); service.cancelNotification(nextNotificationId, id4); @@ -341,7 +341,8 @@ startNotificationService(); DownloadNotificationService service = bindNotificationService(); ContentId id = LegacyHelpers.buildLegacyContentId(false, UUID.randomUUID().toString()); - service.notifyDownloadSuccessful(id, "/path/to/test", "test", 100L, false, false, true); + service.notifyDownloadSuccessful( + id, "/path/to/test", "test", 100L, false, false, true, null); assertEquals(1, getService().getNotificationIds().size()); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java index 0b260ae5..43e4e9f0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java
@@ -6,6 +6,7 @@ import android.app.Notification; import android.content.Context; +import android.graphics.Bitmap; import android.util.Pair; import org.chromium.base.ThreadUtils; @@ -96,13 +97,13 @@ @Override public int notifyDownloadSuccessful(final ContentId id, final String filePath, final String fileName, final long systemDownloadId, final boolean isOffTheRecord, - final boolean isSupportedMimeType, final boolean isOpenable) { + final boolean isSupportedMimeType, final boolean isOpenable, final Bitmap icon) { return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Integer>() { @Override public Integer call() throws Exception { return MockDownloadNotificationService.super.notifyDownloadSuccessful(id, filePath, - fileName, systemDownloadId, isOffTheRecord, isSupportedMimeType, - isOpenable); + fileName, systemDownloadId, isOffTheRecord, isSupportedMimeType, isOpenable, + icon); } }); } @@ -111,23 +112,23 @@ public void notifyDownloadProgress(final ContentId id, final String fileName, final int percentage, final long bytesReceived, final long timeRemainingInMillis, final long startTime, final boolean isOffTheRecord, - final boolean canDownloadWhileMetered, final boolean isTransient) { + final boolean canDownloadWhileMetered, final boolean isTransient, final Bitmap icon) { ThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override public void run() { MockDownloadNotificationService.super.notifyDownloadProgress(id, fileName, percentage, bytesReceived, timeRemainingInMillis, startTime, isOffTheRecord, - canDownloadWhileMetered, isTransient); + canDownloadWhileMetered, isTransient, icon); } }); } @Override - public void notifyDownloadFailed(final ContentId id, final String fileName) { + public void notifyDownloadFailed(final ContentId id, final String fileName, final Bitmap icon) { ThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override public void run() { - MockDownloadNotificationService.super.notifyDownloadFailed(id, fileName); + MockDownloadNotificationService.super.notifyDownloadFailed(id, fileName, icon); } }); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiTest.java new file mode 100644 index 0000000..2947237 --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiTest.java
@@ -0,0 +1,334 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.download.items; + +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.graphics.Bitmap; + +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatcher; +import org.mockito.ArgumentMatchers; +import org.mockito.InOrder; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.annotation.Config; + +import org.chromium.chrome.browser.download.DownloadInfo; +import org.chromium.chrome.browser.download.DownloadNotifier; +import org.chromium.components.offline_items_collection.ContentId; +import org.chromium.components.offline_items_collection.OfflineContentProvider; +import org.chromium.components.offline_items_collection.OfflineItem; +import org.chromium.components.offline_items_collection.OfflineItemState; +import org.chromium.components.offline_items_collection.OfflineItemVisuals; +import org.chromium.testing.local.LocalRobolectricTestRunner; + +import java.util.ArrayList; +import java.util.List; + +/** + * Unit tests for {@link OfflineContentAggregatorNotifierBridgeUi}. Validate that it interacts with + * both the {@link DownloadNotifier} and the {@link OfflineContentProvider} in expected ways. + */ +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class OfflineContentAggregatorNotificationBridgeUiTest { + /** Helper class to validate that a DownloadInfo has the right ContentId. */ + static class DownloadInfoIdMatcher implements ArgumentMatcher<DownloadInfo> { + private final ContentId mExpectedId; + + public DownloadInfoIdMatcher(ContentId expected) { + mExpectedId = expected; + } + + @Override + public boolean matches(DownloadInfo argument) { + return ((DownloadInfo) argument).getContentId().equals(mExpectedId); + } + + @Override + public String toString() { + return mExpectedId == null ? null : mExpectedId.toString(); + } + } + + @Mock + private OfflineContentProvider mProvider; + + @Mock + private DownloadNotifier mNotifier; + + @Rule + public MockitoRule mMockitoRule = MockitoJUnit.rule(); + + private static OfflineItem buildOfflineItem(ContentId id, @OfflineItemState int state) { + OfflineItem item = new OfflineItem(); + item.id = id; + item.state = state; + return item; + } + + @Test + public void testOnlyInterestingNewItemsGetSentToTheUi() { + OfflineContentAggregatorNotificationBridgeUi bridge = + new OfflineContentAggregatorNotificationBridgeUi(mProvider, mNotifier); + verify(mProvider, times(1)).addObserver(bridge); + + ArrayList<OfflineItem> items = new ArrayList<OfflineItem>() { + { + add(buildOfflineItem(new ContentId("1", "A"), OfflineItemState.IN_PROGRESS)); + add(buildOfflineItem(new ContentId("2", "B"), OfflineItemState.PENDING)); + add(buildOfflineItem(new ContentId("3", "C"), OfflineItemState.COMPLETE)); + add(buildOfflineItem(new ContentId("4", "D"), OfflineItemState.CANCELLED)); + add(buildOfflineItem(new ContentId("5", "E"), OfflineItemState.INTERRUPTED)); + add(buildOfflineItem(new ContentId("6", "F"), OfflineItemState.FAILED)); + add(buildOfflineItem(new ContentId("7", "G"), OfflineItemState.PAUSED)); + } + }; + + bridge.onItemsAvailable(); + bridge.onItemsAdded(items); + + InOrder order = inOrder(mProvider); + order.verify(mProvider, times(1)) + .getVisualsForItem(items.get(0).id /* OfflineItemState.IN_PROGRESS */, bridge); + order.verify(mProvider, never()) + .getVisualsForItem(ArgumentMatchers.any(), ArgumentMatchers.any()); + + bridge.onVisualsAvailable(items.get(0).id, new OfflineItemVisuals()); + + verify(mNotifier, times(1)) + .notifyDownloadProgress(argThat(new DownloadInfoIdMatcher(items.get(0).id)), + ArgumentMatchers.anyLong(), ArgumentMatchers.anyBoolean()); + + bridge.destroy(); + verify(mProvider, times(1)).removeObserver(bridge); + } + + @Test + public void testItemUpdatesGetSentToTheUi() { + OfflineContentAggregatorNotificationBridgeUi bridge = + new OfflineContentAggregatorNotificationBridgeUi(mProvider, mNotifier); + verify(mProvider, times(1)).addObserver(bridge); + + ArrayList<OfflineItem> items = new ArrayList<OfflineItem>() { + { + add(buildOfflineItem(new ContentId("1", "A"), OfflineItemState.IN_PROGRESS)); + add(buildOfflineItem(new ContentId("2", "B"), OfflineItemState.PENDING)); + add(buildOfflineItem(new ContentId("3", "C"), OfflineItemState.COMPLETE)); + add(buildOfflineItem(new ContentId("4", "D"), OfflineItemState.CANCELLED)); + add(buildOfflineItem(new ContentId("5", "E"), OfflineItemState.INTERRUPTED)); + add(buildOfflineItem(new ContentId("6", "F"), OfflineItemState.FAILED)); + add(buildOfflineItem(new ContentId("7", "G"), OfflineItemState.PAUSED)); + } + }; + + bridge.onItemsAvailable(); + for (int i = 0; i < items.size(); i++) bridge.onItemUpdated(items.get(i)); + + verify(mProvider, times(1)).getVisualsForItem(items.get(0).id, bridge); + verify(mProvider, times(1)).getVisualsForItem(items.get(1).id, bridge); + verify(mProvider, times(1)).getVisualsForItem(items.get(2).id, bridge); + verify(mProvider, never()).getVisualsForItem(items.get(3).id, bridge); + verify(mProvider, times(1)).getVisualsForItem(items.get(4).id, bridge); + verify(mProvider, times(1)).getVisualsForItem(items.get(5).id, bridge); + verify(mProvider, times(1)).getVisualsForItem(items.get(6).id, bridge); + + for (int i = 0; i < items.size(); i++) { + bridge.onVisualsAvailable(items.get(i).id, new OfflineItemVisuals()); + } + + verify(mNotifier, times(1)) + .notifyDownloadProgress(argThat(new DownloadInfoIdMatcher(items.get(0).id)), + ArgumentMatchers.anyLong(), ArgumentMatchers.anyBoolean()); + verify(mNotifier, times(1)) + .notifyDownloadSuccessful(argThat(new DownloadInfoIdMatcher(items.get(2).id)), + ArgumentMatchers.anyLong(), ArgumentMatchers.anyBoolean(), + ArgumentMatchers.anyBoolean()); + verify(mNotifier, times(1)) + .notifyDownloadCanceled(items.get(3).id /* OfflineItemState.CANCELLED */); + verify(mNotifier, times(1)) + .notifyDownloadInterrupted(argThat(new DownloadInfoIdMatcher(items.get(4).id)), + ArgumentMatchers.anyBoolean()); + verify(mNotifier, times(1)) + .notifyDownloadFailed(argThat(new DownloadInfoIdMatcher(items.get(5).id))); + verify(mNotifier, times(1)) + .notifyDownloadPaused(argThat(new DownloadInfoIdMatcher(items.get(6).id))); + + bridge.destroy(); + verify(mProvider, times(1)).removeObserver(bridge); + } + + @Test + public void testNullVisuals() { + OfflineContentAggregatorNotificationBridgeUi bridge = + new OfflineContentAggregatorNotificationBridgeUi(mProvider, mNotifier); + verify(mProvider, times(1)).addObserver(bridge); + + OfflineItem item1 = buildOfflineItem(new ContentId("1", "A"), OfflineItemState.IN_PROGRESS); + OfflineItem item2 = buildOfflineItem(new ContentId("2", "B"), OfflineItemState.IN_PROGRESS); + + OfflineItemVisuals visuals1 = new OfflineItemVisuals(); + visuals1.icon = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8); + + bridge.onItemsAvailable(); + bridge.onItemUpdated(item1); + bridge.onItemUpdated(item2); + + verify(mProvider, times(1)).getVisualsForItem(item1.id, bridge); + verify(mProvider, times(1)).getVisualsForItem(item2.id, bridge); + + ArgumentCaptor<DownloadInfo> captor = ArgumentCaptor.forClass(DownloadInfo.class); + + bridge.onVisualsAvailable(item1.id, visuals1); + bridge.onVisualsAvailable(item2.id, null); + verify(mNotifier, times(2)) + .notifyDownloadProgress(captor.capture(), ArgumentMatchers.anyLong(), + ArgumentMatchers.anyBoolean()); + + List<DownloadInfo> capturedInfo = captor.getAllValues(); + Assert.assertEquals(item1.id, capturedInfo.get(0).getContentId()); + Assert.assertEquals(visuals1.icon, capturedInfo.get(0).getIcon()); + Assert.assertEquals(item2.id, capturedInfo.get(1).getContentId()); + Assert.assertEquals(null, capturedInfo.get(1).getIcon()); + + bridge.destroy(); + verify(mProvider, times(1)).removeObserver(bridge); + } + + @Test + public void testRemovedItemsGetRemovedFromTheUi() { + OfflineContentAggregatorNotificationBridgeUi bridge = + new OfflineContentAggregatorNotificationBridgeUi(mProvider, mNotifier); + verify(mProvider, times(1)).addObserver(bridge); + + ContentId id = new ContentId("1", "A"); + + bridge.onItemsAvailable(); + bridge.onItemRemoved(id); + verify(mNotifier, times(1)).notifyDownloadCanceled(id); + + bridge.destroy(); + verify(mProvider, times(1)).removeObserver(bridge); + } + + @Test + public void testRemovedItemsIgnoreVisualsCallback() { + OfflineContentAggregatorNotificationBridgeUi bridge = + new OfflineContentAggregatorNotificationBridgeUi(mProvider, mNotifier); + verify(mProvider, times(1)).addObserver(bridge); + + OfflineItem item = buildOfflineItem(new ContentId("1", "A"), OfflineItemState.IN_PROGRESS); + + bridge.onItemsAvailable(); + bridge.onItemUpdated(item); + verify(mProvider, times(1)).getVisualsForItem(item.id, bridge); + + bridge.onItemRemoved(item.id); + bridge.onVisualsAvailable(item.id, new OfflineItemVisuals()); + InOrder order = inOrder(mNotifier); + order.verify(mNotifier, times(1)).notifyDownloadCanceled(item.id); + order.verifyNoMoreInteractions(); + + bridge.destroy(); + verify(mProvider, times(1)).removeObserver(bridge); + } + + @Test + public void testOnlyRequestsVisualsOnceForMultipleUpdates() { + OfflineContentAggregatorNotificationBridgeUi bridge = + new OfflineContentAggregatorNotificationBridgeUi(mProvider, mNotifier); + verify(mProvider, times(1)).addObserver(bridge); + + OfflineItem item = buildOfflineItem(new ContentId("1", "A"), OfflineItemState.IN_PROGRESS); + + bridge.onItemsAvailable(); + bridge.onItemUpdated(item); + bridge.onItemUpdated(item); + verify(mProvider, times(1)).getVisualsForItem(item.id, bridge); + + bridge.destroy(); + verify(mProvider, times(1)).removeObserver(bridge); + } + + @Test + public void testVisualsAreCachedForInterestingItems() { + OfflineContentAggregatorNotificationBridgeUi bridge = + new OfflineContentAggregatorNotificationBridgeUi(mProvider, mNotifier); + verify(mProvider, times(1)).addObserver(bridge); + + ArrayList<OfflineItem> interestingItems = new ArrayList<OfflineItem>() { + { + add(buildOfflineItem(new ContentId("1", "A"), OfflineItemState.IN_PROGRESS)); + add(buildOfflineItem(new ContentId("2", "B"), OfflineItemState.PENDING)); + add(buildOfflineItem(new ContentId("5", "E"), OfflineItemState.INTERRUPTED)); + add(buildOfflineItem(new ContentId("7", "G"), OfflineItemState.PAUSED)); + } + }; + + ArrayList<OfflineItem> uninterestingItems = new ArrayList<OfflineItem>() { + { + add(buildOfflineItem(new ContentId("3", "C"), OfflineItemState.COMPLETE)); + add(buildOfflineItem(new ContentId("6", "F"), OfflineItemState.FAILED)); + } + }; + + bridge.onItemsAvailable(); + + for (int i = 0; i < interestingItems.size(); i++) { + OfflineItem item = interestingItems.get(i); + bridge.onItemUpdated(item); + bridge.onVisualsAvailable(item.id, null); + bridge.onItemUpdated(item); + verify(mProvider, times(1)).getVisualsForItem(item.id, bridge); + verify(mNotifier, times(2)) + .notifyDownloadProgress(ArgumentMatchers.any(), ArgumentMatchers.anyLong(), + ArgumentMatchers.anyBoolean()); + } + + for (int i = 0; i < uninterestingItems.size(); i++) { + OfflineItem item = uninterestingItems.get(i); + bridge.onItemUpdated(item); + bridge.onVisualsAvailable(item.id, null); + bridge.onItemUpdated(item); + verify(mProvider, times(2)).getVisualsForItem(item.id, bridge); + } + + bridge.destroy(); + verify(mProvider, times(1)).removeObserver(bridge); + } + + @Test + public void testVisualsGetClearedForUninterestingItems() { + OfflineContentAggregatorNotificationBridgeUi bridge = + new OfflineContentAggregatorNotificationBridgeUi(mProvider, mNotifier); + verify(mProvider, times(1)).addObserver(bridge); + + ContentId id = new ContentId("1", "A"); + OfflineItem item1 = buildOfflineItem(id, OfflineItemState.IN_PROGRESS); + OfflineItem item2 = buildOfflineItem(id, OfflineItemState.FAILED); + OfflineItem item3 = buildOfflineItem(id, OfflineItemState.IN_PROGRESS); + + bridge.onItemsAvailable(); + bridge.onItemUpdated(item1); + bridge.onVisualsAvailable(item1.id, new OfflineItemVisuals()); + bridge.onItemUpdated(item2); + bridge.onItemUpdated(item3); + bridge.onVisualsAvailable(item1.id, new OfflineItemVisuals()); + verify(mProvider, times(2)).getVisualsForItem(id, bridge); + + bridge.destroy(); + verify(mProvider, times(1)).removeObserver(bridge); + } +}
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 39b7e244..3e3444d 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -164,8 +164,8 @@ <message name="IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_LABEL" desc="Label for a slider which changes the size of large mouse cursor."> Adjust cursor size </message> - <message name="IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_SMALL_LABEL" desc="Label in the slider which indicates that this side makes the cursor small."> - Small + <message name="IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_DEFAULT_LABEL" desc="Label in the slider which indicates that this side makes the cursor to its default size."> + Default </message> <message name="IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_LARGE_LABEL" desc="Label in the slider which indicates that this side makes the cursor large."> Large
diff --git a/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc b/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc index 94cd27a9..584d9af 100644 --- a/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc +++ b/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.cc
@@ -796,12 +796,6 @@ return true; } -bool BookmarkManagerPrivateCanOpenNewWindowsFunction::RunOnReady() { - bool can_open_new_windows = true; - SetResult(base::MakeUnique<base::Value>(can_open_new_windows)); - return true; -} - bool BookmarkManagerPrivateRemoveTreesFunction::RunOnReady() { if (!EditBookmarksEnabled()) return false;
diff --git a/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.h b/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.h index c67a854..35aedc68 100644 --- a/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.h +++ b/chrome/browser/extensions/api/bookmark_manager_private/bookmark_manager_private_api.h
@@ -330,19 +330,6 @@ bool RunOnReady() override; }; -class BookmarkManagerPrivateCanOpenNewWindowsFunction - : public extensions::BookmarksFunction { - public: - DECLARE_EXTENSION_FUNCTION("bookmarkManagerPrivate.canOpenNewWindows", - BOOKMARKMANAGERPRIVATE_CANOPENNEWWINDOWS) - - protected: - ~BookmarkManagerPrivateCanOpenNewWindowsFunction() override {} - - // ExtensionFunction: - bool RunOnReady() override; -}; - class BookmarkManagerPrivateRemoveTreesFunction : public extensions::BookmarksFunction { public:
diff --git a/chrome/browser/media/router/media_router.h b/chrome/browser/media/router/media_router.h index 570a439..d727876 100644 --- a/chrome/browser/media/router/media_router.h +++ b/chrome/browser/media/router/media_router.h
@@ -33,6 +33,7 @@ namespace media_router { class IssuesObserver; +class MediaRouteController; class MediaRoutesObserver; class MediaSinksObserver; class PresentationConnectionStateObserver; @@ -196,9 +197,15 @@ // there is a change to the media routes, subclass MediaRoutesObserver. virtual std::vector<MediaRoute> GetCurrentRoutes() const = 0; + // Returns a controller for sending media commands to a route. Returns a + // nullptr if no MediaRoute exists for the given |route_id|. + virtual scoped_refptr<MediaRouteController> GetRouteController( + const MediaRoute::Id& route_id) = 0; + private: friend class IssuesObserver; friend class MediaSinksObserver; + friend class MediaRouteController; friend class MediaRoutesObserver; friend class PresentationConnectionStateObserver; friend class RouteMessageObserver; @@ -254,6 +261,12 @@ // stop receiving further updates. virtual void UnregisterRouteMessageObserver( RouteMessageObserver* observer) = 0; + + // Removes the MediaRouteController for |route_id| from the list of + // controllers held by |this|. Called by MediaRouteController when it is + // invalidated. + virtual void DetachRouteController(const MediaRoute::Id& route_id, + MediaRouteController* controller) = 0; }; } // namespace media_router
diff --git a/chrome/browser/media/router/media_router_base.cc b/chrome/browser/media/router/media_router_base.cc index 923afc4..d3ec5e6 100644 --- a/chrome/browser/media/router/media_router_base.cc +++ b/chrome/browser/media/router/media_router_base.cc
@@ -9,6 +9,7 @@ #include "base/memory/ptr_util.h" #include "base/stl_util.h" #include "chrome/browser/chrome_notification_types.h" +#include "chrome/browser/media/router/mojo/media_route_controller.h" #include "chrome/browser/profiles/profile.h" #include "content/public/browser/browser_thread.h" @@ -76,6 +77,11 @@ return internal_routes_observer_->current_routes; } +scoped_refptr<MediaRouteController> MediaRouterBase::GetRouteController( + const MediaRoute::Id& route_id) { + return nullptr; +} + MediaRouterBase::MediaRouterBase() : initialized_(false) {} // static @@ -115,6 +121,14 @@ return internal_routes_observer_->has_route; } +bool MediaRouterBase::IsRouteKnown(const std::string& route_id) const { + const auto& routes = internal_routes_observer_->current_routes; + return std::find_if(routes.begin(), routes.end(), + [&route_id](const MediaRoute& route) { + return route.media_route_id() == route_id; + }) != routes.end(); +} + void MediaRouterBase::Initialize() { DCHECK(!initialized_); // The observer calls virtual methods on MediaRouter; it must be created @@ -138,4 +152,7 @@ internal_routes_observer_.reset(); } +void MediaRouterBase::DetachRouteController(const MediaRoute::Id& route_id, + MediaRouteController* controller) {} + } // namespace media_router
diff --git a/chrome/browser/media/router/media_router_base.h b/chrome/browser/media/router/media_router_base.h index e271003..aa84494 100644 --- a/chrome/browser/media/router/media_router_base.h +++ b/chrome/browser/media/router/media_router_base.h
@@ -34,6 +34,9 @@ std::vector<MediaRoute> GetCurrentRoutes() const override; + scoped_refptr<MediaRouteController> GetRouteController( + const MediaRoute::Id& route_id) override; + protected: FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, PresentationConnectionStateChangedCallback); @@ -59,6 +62,9 @@ // JoinRoute(). bool HasJoinableRoute() const; + // Returns true if there is a route with the ID in the current list of routes. + bool IsRouteKnown(const std::string& route_id) const; + using PresentationConnectionStateChangedCallbacks = base::CallbackList<void( const content::PresentationConnectionStateChangeInfo&)>; @@ -85,6 +91,10 @@ // KeyedService void Shutdown() override; + // MediaRouter + void DetachRouteController(const MediaRoute::Id& route_id, + MediaRouteController* controller) override; + std::unique_ptr<InternalMediaRoutesObserver> internal_routes_observer_; bool initialized_;
diff --git a/chrome/browser/media/router/mock_media_router.h b/chrome/browser/media/router/mock_media_router.h index 84d176418..2a91575a 100644 --- a/chrome/browser/media/router/mock_media_router.h +++ b/chrome/browser/media/router/mock_media_router.h
@@ -15,6 +15,7 @@ #include "chrome/browser/media/router/media_router_base.h" #include "chrome/browser/media/router/media_sink.h" #include "chrome/browser/media/router/media_source.h" +#include "chrome/browser/media/router/mojo/media_route_controller.h" #include "testing/gmock/include/gmock/gmock.h" #include "url/origin.h" @@ -91,6 +92,9 @@ MOCK_CONST_METHOD0(GetCurrentRoutes, std::vector<MediaRoute>()); MOCK_METHOD0(OnIncognitoProfileShutdown, void()); + MOCK_METHOD1( + GetRouteController, + scoped_refptr<MediaRouteController>(const MediaRoute::Id& route_id)); MOCK_METHOD1(OnAddPresentationConnectionStateChangedCallbackInvoked, void(const content::PresentationConnectionStateChangedCallback& callback)); @@ -107,6 +111,9 @@ void(RouteMessageObserver* observer)); MOCK_METHOD1(UnregisterRouteMessageObserver, void(RouteMessageObserver* observer)); + MOCK_METHOD2(DetachRouteController, + void(const MediaRoute::Id& route_id, + MediaRouteController* controller)); private: base::CallbackList<void(
diff --git a/chrome/browser/media/router/mojo/media_route_controller.cc b/chrome/browser/media/router/mojo/media_route_controller.cc index 372d33a7..0fd4f8a 100644 --- a/chrome/browser/media/router/mojo/media_route_controller.cc +++ b/chrome/browser/media/router/mojo/media_route_controller.cc
@@ -6,6 +6,8 @@ #include <utility> +#include "chrome/browser/media/router/media_router.h" + namespace media_router { MediaRouteController::Observer::Observer( @@ -20,7 +22,6 @@ } void MediaRouteController::Observer::InvalidateController() { - controller_->RemoveObserver(this); controller_ = nullptr; OnControllerInvalidated(); } @@ -29,52 +30,87 @@ MediaRouteController::MediaRouteController( const MediaRoute::Id& route_id, - mojom::MediaControllerPtr media_controller) - : route_id_(route_id), media_controller_(std::move(media_controller)) { - DCHECK(media_controller_.is_bound()); - media_controller_.set_connection_error_handler( - base::Bind(&MediaRouteController::Invalidate, base::Unretained(this))); + mojom::MediaControllerPtr mojo_media_controller, + MediaRouter* media_router) + : route_id_(route_id), + mojo_media_controller_(std::move(mojo_media_controller)), + media_router_(media_router), + binding_(this) { + DCHECK(mojo_media_controller_.is_bound()); + DCHECK(media_router); + mojo_media_controller_.set_connection_error_handler(base::Bind( + &MediaRouteController::OnMojoConnectionError, base::Unretained(this))); } void MediaRouteController::Play() { - media_controller_->Play(); + DCHECK(is_valid_); + mojo_media_controller_->Play(); } void MediaRouteController::Pause() { - media_controller_->Pause(); + DCHECK(is_valid_); + mojo_media_controller_->Pause(); } void MediaRouteController::Seek(base::TimeDelta time) { - media_controller_->Seek(time); + DCHECK(is_valid_); + mojo_media_controller_->Seek(time); } void MediaRouteController::SetMute(bool mute) { - media_controller_->SetMute(mute); + DCHECK(is_valid_); + mojo_media_controller_->SetMute(mute); } void MediaRouteController::SetVolume(float volume) { - media_controller_->SetVolume(volume); + DCHECK(is_valid_); + mojo_media_controller_->SetVolume(volume); } void MediaRouteController::OnMediaStatusUpdated(const MediaStatus& status) { + DCHECK(is_valid_); for (Observer& observer : observers_) observer.OnMediaStatusUpdated(status); } void MediaRouteController::Invalidate() { + is_valid_ = false; + binding_.Close(); + mojo_media_controller_.reset(); for (Observer& observer : observers_) observer.InvalidateController(); // |this| is deleted here! } -MediaRouteController::~MediaRouteController() {} +mojom::MediaStatusObserverPtr MediaRouteController::BindObserverPtr() { + DCHECK(is_valid_); + DCHECK(!binding_.is_bound()); + mojom::MediaStatusObserverPtr observer_ptr = + binding_.CreateInterfacePtrAndBind(); + binding_.set_connection_error_handler(base::Bind( + &MediaRouteController::OnMojoConnectionError, base::Unretained(this))); + + return observer_ptr; +} + +MediaRouteController::~MediaRouteController() { + if (is_valid_) + media_router_->DetachRouteController(route_id_, this); +} void MediaRouteController::AddObserver(Observer* observer) { + DCHECK(is_valid_); observers_.AddObserver(observer); } void MediaRouteController::RemoveObserver(Observer* observer) { + DCHECK(is_valid_); observers_.RemoveObserver(observer); } +void MediaRouteController::OnMojoConnectionError() { + media_router_->DetachRouteController(route_id_, this); + Invalidate(); +} + } // namespace media_router
diff --git a/chrome/browser/media/router/mojo/media_route_controller.h b/chrome/browser/media/router/mojo/media_route_controller.h index 81812e99..b8c16e2 100644 --- a/chrome/browser/media/router/mojo/media_route_controller.h +++ b/chrome/browser/media/router/mojo/media_route_controller.h
@@ -15,6 +15,8 @@ namespace media_router { +class MediaRouter; + // A controller for a MediaRoute. Forwards commands for controlling the route to // an out-of-process controller. Notifies its observers whenever there is a // change in the route's MediaStatus. @@ -26,9 +28,9 @@ // // A MediaRouteController instance is destroyed when all its observers dispose // their references to it. When the Mojo connection with the out-of-process -// controller is terminated or has an error, OnControllerInvalidated() will be -// called by the MediaRouter or a Mojo error handler to make observers dispose -// their refptrs. +// controller is terminated or has an error, Invalidate() will be called by the +// MediaRouter or OnMojoConnectionError() to make observers dispose their +// refptrs. class MediaRouteController : public mojom::MediaStatusObserver, public base::RefCounted<MediaRouteController> { public: @@ -66,12 +68,14 @@ }; // Constructs a MediaRouteController that forwards media commands to - // |media_controller|. |media_controller| must be bound to a message pipe. + // |mojo_media_controller|. |media_router| will be notified when the + // MediaRouteController is destroyed via DetachRouteController(). MediaRouteController(const MediaRoute::Id& route_id, - mojom::MediaControllerPtr media_controller); + mojom::MediaControllerPtr mojo_media_controller, + MediaRouter* media_router); // Media controller methods for forwarding commands to a - // mojom::MediaControllerPtr held in |media_controller_|. + // mojom::MediaControllerPtr held in |mojo_media_controller_|. void Play(); void Pause(); void Seek(base::TimeDelta time); @@ -82,11 +86,14 @@ // Notifies |observers_| of a status update. void OnMediaStatusUpdated(const MediaStatus& status) override; - // Called when the connection between |this| and |media_controller_| is no - // longer valid. Notifies |observers_| to dispose their references to |this|. - // |this| gets destroyed when all the references are disposed. + // Notifies |observers_| to dispose their references to the controller. The + // controller gets destroyed when all the references are disposed. void Invalidate(); + // Returns a mojo pointer bound to |this| by |binding_|. This must only be + // called at most once in the lifetime of the controller. + mojom::MediaStatusObserverPtr BindObserverPtr(); + MediaRoute::Id route_id() const { return route_id_; } private: @@ -97,16 +104,30 @@ void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); + // Called when the connection between |this| and the MediaControllerPtr or + // the MediaStatusObserver binding is no longer valid. Notifies + // |media_router_| and |observers_| to dispose their references to |this|. + void OnMojoConnectionError(); + // The ID of the Media Route that |this| controls. const MediaRoute::Id route_id_; // Handle to the mojom::MediaController that receives media commands. - mojom::MediaControllerPtr media_controller_; + mojom::MediaControllerPtr mojo_media_controller_; - // Observers that |this| notifies of status updates. The observers share the - // ownership of |this| through scoped_refptr. + // |media_router_| will be notified when the controller is destroyed. + MediaRouter* const media_router_; + + // The binding to observe the out-of-process provider of status updates. + mojo::Binding<mojom::MediaStatusObserver> binding_; + + // Observers that are notified of status updates. The observers share the + // ownership of the controller through scoped_refptr. base::ObserverList<Observer> observers_; + // This becomes false when the controller is invalidated. + bool is_valid_ = true; + DISALLOW_COPY_AND_ASSIGN(MediaRouteController); };
diff --git a/chrome/browser/media/router/mojo/media_route_controller_unittest.cc b/chrome/browser/media/router/mojo/media_route_controller_unittest.cc index 17487a5..dcfc748 100644 --- a/chrome/browser/media/router/mojo/media_route_controller_unittest.cc +++ b/chrome/browser/media/router/mojo/media_route_controller_unittest.cc
@@ -8,31 +8,21 @@ #include <utility> #include "base/run_loop.h" +#include "chrome/browser/media/router/mock_media_router.h" #include "chrome/browser/media/router/mojo/media_router_mojo_test.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +using ::testing::Mock; using ::testing::StrictMock; namespace media_router { -class MockMediaController : public mojom::MediaController { - public: - MOCK_METHOD0(Play, void()); - MOCK_METHOD0(Pause, void()); - MOCK_METHOD1(SetMute, void(bool mute)); - MOCK_METHOD1(SetVolume, void(float volume)); - MOCK_METHOD1(Seek, void(base::TimeDelta time)); -}; +namespace { -class MockMediaRouteControllerObserver : public MediaRouteController::Observer { - public: - MockMediaRouteControllerObserver( - scoped_refptr<MediaRouteController> controller) - : MediaRouteController::Observer(controller) {} +constexpr char kRouteId[] = "routeId"; - MOCK_METHOD1(OnMediaStatusUpdated, void(const MediaStatus& status)); -}; +} // namespace class MediaRouteControllerTest : public ::testing::Test { public: @@ -43,12 +33,11 @@ mojom::MediaControllerPtr media_controller_ptr; mojom::MediaControllerRequest media_controller_request = mojo::MakeRequest(&media_controller_ptr); - media_controller_binding_ = - base::MakeUnique<mojo::Binding<mojom::MediaController>>( - &mock_media_controller_, std::move(media_controller_request)); + mock_media_controller_.Bind(std::move(media_controller_request)); observer_ = base::MakeUnique<MockMediaRouteControllerObserver>( - new MediaRouteController("routeId", std::move(media_controller_ptr))); + base::MakeShared<MediaRouteController>( + kRouteId, std::move(media_controller_ptr), &router_)); } scoped_refptr<MediaRouteController> GetController() const { @@ -63,9 +52,8 @@ GetController()); } + MockMediaRouter router_; MockMediaController mock_media_controller_; - std::unique_ptr<mojo::Binding<mojom::MediaController>> - media_controller_binding_; std::unique_ptr<MockMediaRouteControllerObserver> observer_; content::TestBrowserThreadBundle test_thread_bundle_; @@ -97,18 +85,52 @@ MediaStatus status; status.title = "test media status"; + // Get a mojo pointer for |controller_|, so that we can notify it of status + // updates via mojo. + mojom::MediaStatusObserverPtr mojo_observer = + GetController()->BindObserverPtr(); + EXPECT_CALL(*observer1, OnMediaStatusUpdated(status)); EXPECT_CALL(*observer2, OnMediaStatusUpdated(status)); - // TODO(takumif): Use a mojom::MediaStatusObserverPtr bound to the controller. - GetController()->OnMediaStatusUpdated(status); + mojo_observer->OnMediaStatusUpdated(status); + base::RunLoop().RunUntilIdle(); observer1.reset(); auto observer3 = CreateObserver(); EXPECT_CALL(*observer2, OnMediaStatusUpdated(status)); EXPECT_CALL(*observer3, OnMediaStatusUpdated(status)); - // TODO(takumif): Use a mojom::MediaStatusObserverPtr bound to the controller. - GetController()->OnMediaStatusUpdated(status); + mojo_observer->OnMediaStatusUpdated(status); + base::RunLoop().RunUntilIdle(); +} + +TEST_F(MediaRouteControllerTest, DestroyControllerOnDisconnect) { + // DetachRouteController() should be called when the connection to + // |mock_media_controller_| is invalidated. + EXPECT_CALL(router_, DetachRouteController(kRouteId, GetController().get())) + .Times(1); + mock_media_controller_.CloseBinding(); + + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(Mock::VerifyAndClearExpectations(&router_)); +} + +TEST_F(MediaRouteControllerTest, DestroyControllerOnNoObservers) { + auto observer1 = CreateObserver(); + auto observer2 = CreateObserver(); + // Get a pointer to the controller to use in EXPECT_CALL(). + MediaRouteController* controller = GetController().get(); + // Get rid of |observer_| and its reference to the controller. + observer_.reset(); + + EXPECT_CALL(router_, DetachRouteController(kRouteId, controller)).Times(0); + observer1.reset(); + + // DetachRouteController() should be called when the controller no longer + // has any observers. + EXPECT_CALL(router_, DetachRouteController(kRouteId, controller)).Times(1); + observer2.reset(); + EXPECT_TRUE(Mock::VerifyAndClearExpectations(&router_)); } } // namespace media_router
diff --git a/chrome/browser/media/router/mojo/media_router.mojom b/chrome/browser/media/router/mojo/media_router.mojom index d5e4409..e993afd 100644 --- a/chrome/browser/media/router/mojo/media_router.mojom +++ b/chrome/browser/media/router/mojo/media_router.mojom
@@ -4,6 +4,8 @@ module media_router.mojom; +import "chrome/browser/media/router/mojo/media_controller.mojom"; +import "chrome/browser/media/router/mojo/media_status.mojom"; import "mojo/common/time.mojom"; import "net/interfaces/ip_address.mojom"; import "url/mojo/origin.mojom"; @@ -80,8 +82,7 @@ string? media_source; // The ID of sink that is rendering the media content. string media_sink_id; - // Human readable description of this route, e.g. - // "Tab casting". + // Human readable description of this route, e.g. "Tab casting". string description; // Specifies that the route is requested locally. bool is_local; @@ -369,6 +370,23 @@ // updated. The sinks are supplied to the MediaRouteProvider so that they can // be used for other operations, such as route creation. ProvideSinks(string provider_name, array<MediaSink> sinks); + + // Creates a controller for the media route with given |route_id| and binds it + // to |media_controller| for receiving media commands. This method returns + // false if such a media route doesn't exist, a controller already exists + // for it, or there was an error while creating a controller. This method must + // close |media_controller| in case of such a failure. |media_controller| + // becomes invalid when the media route is terminated. The created controller + // is destroyed when |media_controller| becomes invalid, after which this + // method can be called again with the same |route_id|. This method also sets + // |observer| to be notified whenever there is a change in the status of the + // media route. + // TODO(takumif): Consider returning an enum instead of a bool to distinguish + // between error conditions for metrics/debugging. + CreateMediaRouteController(string route_id, + MediaController& media_controller, + MediaStatusObserver observer) => + (bool success); }; // Interface for a service which observes state changes across media
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc index bdea137..9d640c64 100644 --- a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc +++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/media/router/media_routes_observer.h" #include "chrome/browser/media/router/media_sinks_observer.h" #include "chrome/browser/media/router/media_source_helper.h" +#include "chrome/browser/media/router/mojo/media_route_controller.h" #include "chrome/browser/media/router/mojo/media_route_provider_util_win.h" #include "chrome/browser/media/router/mojo/media_router_mojo_metrics.h" #include "chrome/browser/media/router/route_message.h" @@ -230,6 +231,7 @@ << "Received routes update without any active observers: " << media_source; } + RemoveInvalidRouteControllers(routes); } void MediaRouterMojoImpl::RouteResponseReceived( @@ -277,9 +279,9 @@ SetWakeReason(MediaRouteProviderWakeReason::CREATE_ROUTE); int tab_id = SessionTabHelper::IdForTab(web_contents); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoCreateRoute, - base::Unretained(this), source_id, sink_id, origin, - tab_id, callbacks, timeout, incognito)); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoCreateRoute, + base::Unretained(this), source_id, sink_id, origin, + tab_id, callbacks, timeout, incognito)); } void MediaRouterMojoImpl::JoinRoute( @@ -303,9 +305,9 @@ SetWakeReason(MediaRouteProviderWakeReason::JOIN_ROUTE); int tab_id = SessionTabHelper::IdForTab(web_contents); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoJoinRoute, - base::Unretained(this), source_id, presentation_id, - origin, tab_id, callbacks, timeout, incognito)); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoJoinRoute, + base::Unretained(this), source_id, presentation_id, + origin, tab_id, callbacks, timeout, incognito)); } void MediaRouterMojoImpl::ConnectRouteByRouteId( @@ -320,25 +322,25 @@ SetWakeReason(MediaRouteProviderWakeReason::CONNECT_ROUTE_BY_ROUTE_ID); int tab_id = SessionTabHelper::IdForTab(web_contents); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoConnectRouteByRouteId, - base::Unretained(this), source_id, route_id, origin, - tab_id, callbacks, timeout, incognito)); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoConnectRouteByRouteId, + base::Unretained(this), source_id, route_id, origin, + tab_id, callbacks, timeout, incognito)); } void MediaRouterMojoImpl::TerminateRoute(const MediaRoute::Id& route_id) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DVLOG(2) << "TerminateRoute " << route_id; SetWakeReason(MediaRouteProviderWakeReason::TERMINATE_ROUTE); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoTerminateRoute, - base::Unretained(this), route_id)); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoTerminateRoute, + base::Unretained(this), route_id)); } void MediaRouterMojoImpl::DetachRoute(const MediaRoute::Id& route_id) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); SetWakeReason(MediaRouteProviderWakeReason::DETACH_ROUTE); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoDetachRoute, - base::Unretained(this), route_id)); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoDetachRoute, + base::Unretained(this), route_id)); } void MediaRouterMojoImpl::SendRouteMessage( @@ -348,8 +350,9 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); SetWakeReason(MediaRouteProviderWakeReason::SEND_SESSION_MESSAGE); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoSendSessionMessage, - base::Unretained(this), route_id, message, callback)); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoSendSessionMessage, + base::Unretained(this), route_id, message, + callback)); } void MediaRouterMojoImpl::SendRouteBinaryMessage( @@ -359,9 +362,9 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); SetWakeReason(MediaRouteProviderWakeReason::SEND_SESSION_BINARY_MESSAGE); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoSendSessionBinaryMessage, - base::Unretained(this), route_id, - base::Passed(std::move(data)), callback)); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoSendSessionBinaryMessage, + base::Unretained(this), route_id, + base::Passed(std::move(data)), callback)); } void MediaRouterMojoImpl::AddIssue(const IssueInfo& issue_info) { @@ -393,9 +396,34 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); SetWakeReason(MediaRouteProviderWakeReason::SEARCH_SINKS); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoSearchSinks, - base::Unretained(this), sink_id, source_id, - search_input, domain, sink_callback)); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoSearchSinks, + base::Unretained(this), sink_id, source_id, + search_input, domain, sink_callback)); +} + +scoped_refptr<MediaRouteController> MediaRouterMojoImpl::GetRouteController( + const MediaRoute::Id& route_id) { + if (!IsRouteKnown(route_id)) + return nullptr; + + auto it = route_controllers_.find(route_id); + if (it != route_controllers_.end()) + return scoped_refptr<MediaRouteController>(it->second); + + mojom::MediaControllerPtr mojo_media_controller; + mojom::MediaControllerRequest mojo_media_controller_request = + mojo::MakeRequest(&mojo_media_controller); + scoped_refptr<MediaRouteController> route_controller = + new MediaRouteController(route_id, std::move(mojo_media_controller), + this); + + SetWakeReason(MediaRouteProviderWakeReason::CREATE_MEDIA_ROUTE_CONTROLLER); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoCreateMediaRouteController, + base::Unretained(this), route_id, + std::move(mojo_media_controller_request), + route_controller->BindObserverPtr())); + route_controllers_.emplace(route_id, route_controller.get()); + return route_controller; } void MediaRouterMojoImpl::ProvideSinks( @@ -434,8 +462,9 @@ // Need to call MRPM to start observing sinks if the query is new. if (is_new_query) { SetWakeReason(MediaRouteProviderWakeReason::START_OBSERVING_MEDIA_SINKS); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStartObservingMediaSinks, - base::Unretained(this), source_id)); + RunOrDefer( + base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaSinks, + base::Unretained(this), source_id)); } else if (sinks_query->cached_sink_list) { observer->OnSinksUpdated(*sinks_query->cached_sink_list, sinks_query->origins); @@ -469,8 +498,8 @@ SetWakeReason(MediaRouteProviderWakeReason::STOP_OBSERVING_MEDIA_SINKS); // The |sinks_queries_| entry will be removed in the immediate or deferred // |DoStopObservingMediaSinks| call. - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStopObservingMediaSinks, - base::Unretained(this), source_id)); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoStopObservingMediaSinks, + base::Unretained(this), source_id)); } else { sinks_queries_.erase(source_id); } @@ -493,8 +522,8 @@ routes_query->observers.AddObserver(observer); if (is_new_query) { SetWakeReason(MediaRouteProviderWakeReason::START_OBSERVING_MEDIA_ROUTES); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStartObservingMediaRoutes, - base::Unretained(this), source_id)); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaRoutes, + base::Unretained(this), source_id)); // The MRPM will call MediaRouterMojoImpl::OnRoutesUpdated() soon, if there // are any existing routes the new observer should be aware of. } else if (routes_query->cached_route_list) { @@ -542,8 +571,8 @@ it->second->observers.RemoveObserver(observer); if (!it->second->observers.might_have_observers()) { SetWakeReason(MediaRouteProviderWakeReason::STOP_OBSERVING_MEDIA_ROUTES); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStopObservingMediaRoutes, - base::Unretained(this), source_id)); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoStopObservingMediaRoutes, + base::Unretained(this), source_id)); } } @@ -596,11 +625,20 @@ message_observers_.erase(route_id); SetWakeReason( MediaRouteProviderWakeReason::STOP_LISTENING_FOR_ROUTE_MESSAGES); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStopListeningForRouteMessages, - base::Unretained(this), route_id)); + RunOrDefer( + base::BindOnce(&MediaRouterMojoImpl::DoStopListeningForRouteMessages, + base::Unretained(this), route_id)); } } +void MediaRouterMojoImpl::DetachRouteController( + const MediaRoute::Id& route_id, + MediaRouteController* controller) { + auto it = route_controllers_.find(route_id); + if (it != route_controllers_.end() && it->second == controller) + route_controllers_.erase(it); +} + void MediaRouterMojoImpl::DoCreateRoute( const MediaSource::Id& source_id, const MediaSink::Id& sink_id, @@ -719,6 +757,21 @@ media_route_provider_->ProvideSinks(provider_name, sinks); } +void MediaRouterMojoImpl::DoCreateMediaRouteController( + const MediaRoute::Id& route_id, + mojom::MediaControllerRequest mojo_media_controller_request, + mojom::MediaStatusObserverPtr mojo_observer) { + DVLOG_WITH_INSTANCE(1) << "DoCreateMediaRouteController"; + if (!mojo_media_controller_request.is_pending() || !mojo_observer.is_bound()) + return; + + media_route_provider_->CreateMediaRouteController( + route_id, std::move(mojo_media_controller_request), + std::move(mojo_observer), + base::Bind(&MediaRouterMojoImpl::OnMediaControllerCreated, + base::Unretained(this), route_id)); +} + void MediaRouterMojoImpl::OnRouteMessagesReceived( const std::string& route_id, const std::vector<RouteMessage>& messages) { @@ -753,8 +806,9 @@ } else { // Sinks are now available. Tell MRPM to start all sink queries again. for (const auto& source_and_query : sinks_queries_) { - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoStartObservingMediaSinks, - base::Unretained(this), source_and_query.first)); + RunOrDefer( + base::BindOnce(&MediaRouterMojoImpl::DoStartObservingMediaSinks, + base::Unretained(this), source_and_query.first)); } } } @@ -850,8 +904,8 @@ routes_queries_.erase(source_id); } -void MediaRouterMojoImpl::EnqueueTask(const base::Closure& closure) { - pending_requests_.push_back(closure); +void MediaRouterMojoImpl::EnqueueTask(base::OnceClosure closure) { + pending_requests_.push_back(std::move(closure)); if (pending_requests_.size() > kMaxPendingRequests) { DLOG_WITH_INSTANCE(ERROR) << "Reached max queue size. Dropping oldest " << "request."; @@ -861,24 +915,24 @@ << pending_requests_.size() << ")"; } -void MediaRouterMojoImpl::RunOrDefer(const base::Closure& request) { +void MediaRouterMojoImpl::RunOrDefer(base::OnceClosure request) { DCHECK(event_page_tracker_); if (media_route_provider_extension_id_.empty()) { DVLOG_WITH_INSTANCE(1) << "Extension ID not known yet."; - EnqueueTask(request); + EnqueueTask(std::move(request)); } else if (event_page_tracker_->IsEventPageSuspended( media_route_provider_extension_id_)) { DVLOG_WITH_INSTANCE(1) << "Waking event page."; - EnqueueTask(request); + EnqueueTask(std::move(request)); AttemptWakeEventPage(); media_route_provider_.reset(); } else if (!media_route_provider_) { DVLOG_WITH_INSTANCE(1) << "Extension is awake, awaiting ProvideMediaRouter " " to be called."; - EnqueueTask(request); + EnqueueTask(std::move(request)); } else { - request.Run(); + std::move(request).Run(); } } @@ -914,8 +968,8 @@ DCHECK(event_page_tracker_); DCHECK(!media_route_provider_extension_id_.empty()); - for (const auto& next_request : pending_requests_) - next_request.Run(); + for (auto& next_request : pending_requests_) + std::move(next_request).Run(); pending_requests_.clear(); } @@ -963,8 +1017,8 @@ return; SetWakeReason(MediaRouteProviderWakeReason::ENABLE_MDNS_DISCOVERY); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoEnsureMdnsDiscoveryEnabled, - base::Unretained(this))); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoEnsureMdnsDiscoveryEnabled, + base::Unretained(this))); should_enable_mdns_discovery_ = true; } @@ -986,14 +1040,35 @@ void MediaRouterMojoImpl::UpdateMediaSinks( const MediaSource::Id& source_id) { SetWakeReason(MediaRouteProviderWakeReason::UPDATE_MEDIA_SINKS); - RunOrDefer(base::Bind(&MediaRouterMojoImpl::DoUpdateMediaSinks, - base::Unretained(this), source_id)); + RunOrDefer(base::BindOnce(&MediaRouterMojoImpl::DoUpdateMediaSinks, + base::Unretained(this), source_id)); } void MediaRouterMojoImpl::DoUpdateMediaSinks( const MediaSource::Id& source_id) { - DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks" << source_id; + DVLOG_WITH_INSTANCE(1) << "DoUpdateMediaSinks: " << source_id; media_route_provider_->UpdateMediaSinks(source_id); } +void MediaRouterMojoImpl::RemoveInvalidRouteControllers( + const std::vector<MediaRoute>& routes) { + auto it = route_controllers_.begin(); + while (it != route_controllers_.end()) { + if (IsRouteKnown(it->first)) { + ++it; + } else { + it->second->Invalidate(); + it = route_controllers_.erase(it); + } + } +} + +void MediaRouterMojoImpl::OnMediaControllerCreated( + const MediaRoute::Id& route_id, + bool success) { + // TODO(takumif): Record success/failure with UMA. + DVLOG_WITH_INSTANCE(1) << "OnMediaControllerCreated: " << route_id + << (success ? " was successful." : " failed."); +} + } // namespace media_router
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.h b/chrome/browser/media/router/mojo/media_router_mojo_impl.h index f3f9d3d..bcfbd50 100644 --- a/chrome/browser/media/router/mojo/media_router_mojo_impl.h +++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.h
@@ -111,6 +111,8 @@ const MediaSinkSearchResponseCallback& sink_callback) override; void ProvideSinks(const std::string& provider_name, const std::vector<MediaSinkInternal>& sinks) override; + scoped_refptr<MediaRouteController> GetRouteController( + const MediaRoute::Id& route_id) override; const std::string& media_route_provider_extension_id() const { return media_route_provider_extension_id_; @@ -144,6 +146,15 @@ FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, RouteMessagesMultipleObservers); FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, HandleIssue); + FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, GetRouteController); + FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, + GetRouteControllerMultipleTimes); + FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, + GetRouteControllerAfterInvalidation); + FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, + GetRouteControllerAfterRouteInvalidation); + FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoImplTest, + FailToCreateRouteController); FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoExtensionTest, DeferredBindingAndSuspension); FRIEND_TEST_ALL_PREFIXES(MediaRouterMojoExtensionTest, @@ -214,11 +225,11 @@ const extensions::Extension& extension); // Enqueues a closure for later execution by ExecutePendingRequests(). - void EnqueueTask(const base::Closure& closure); + void EnqueueTask(base::OnceClosure closure); // Runs a closure if the extension monitored by |extension_monitor_| is // active, or defers it for later execution if the extension is suspended. - void RunOrDefer(const base::Closure& request); + void RunOrDefer(base::OnceClosure request); // Dispatches the Mojo requests queued in |pending_requests_|. void ExecutePendingRequests(); @@ -236,6 +247,8 @@ void UnregisterIssuesObserver(IssuesObserver* observer) override; void RegisterRouteMessageObserver(RouteMessageObserver* observer) override; void UnregisterRouteMessageObserver(RouteMessageObserver* observer) override; + void DetachRouteController(const MediaRoute::Id& route_id, + MediaRouteController* controller) override; // Notifies |observer| of any existing cached routes, if it is still // registered. @@ -285,6 +298,10 @@ const std::string& search_input, const std::string& domain, const MediaSinkSearchResponseCallback& sink_callback); + void DoCreateMediaRouteController( + const MediaRoute::Id& route_id, + mojom::MediaControllerRequest mojo_media_controller_request, + mojom::MediaStatusObserverPtr mojo_observer); void DoProvideSinks(const std::string& provider_name, const std::vector<MediaSinkInternal>& sinks); @@ -378,9 +395,16 @@ void UpdateMediaSinks(const MediaSource::Id& source_id); void DoUpdateMediaSinks(const MediaSource::Id& source_id); + // Invalidates and removes controllers from |route_controllers_| whose media + // routes do not appear in |routes|. + void RemoveInvalidRouteControllers(const std::vector<MediaRoute>& routes); + + // Callback called by MRP's CreateMediaRouteController(). + void OnMediaControllerCreated(const MediaRoute::Id& route_id, bool success); + // Pending requests queued to be executed once component extension // becomes ready. - std::deque<base::Closure> pending_requests_; + std::deque<base::OnceClosure> pending_requests_; std::unordered_map<MediaSource::Id, std::unique_ptr<MediaSinksQuery>> sinks_queries_; @@ -431,6 +455,10 @@ // initial event page wakeup attempt. bool provider_version_was_recorded_ = false; + // Stores route controllers that can be used to send media commands to the + // extension. + std::unordered_map<MediaRoute::Id, MediaRouteController*> route_controllers_; + #if defined(OS_WIN) // A pair of flags to ensure that mDNS discovery is only enabled on Windows // when there will be appropriate context for the user to associate a firewall
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc index 55fc969..7f437f3 100644 --- a/chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc +++ b/chrome/browser/media/router/mojo/media_router_mojo_impl_unittest.cc
@@ -15,7 +15,6 @@ #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" #include "base/run_loop.h" -#include "base/synchronization/waitable_event.h" #include "base/test/histogram_tester.h" #include "base/test/mock_callback.h" #include "base/threading/thread_task_runner_handle.h" @@ -55,6 +54,7 @@ using testing::Pointee; using testing::Return; using testing::ReturnRef; +using testing::Unused; using testing::SaveArg; using testing::Sequence; @@ -89,11 +89,26 @@ return issue_info; } +// Creates a media route whose ID is |kRouteId|. MediaRoute CreateMediaRoute() { return MediaRoute(kRouteId, MediaSource(kSource), kSinkId, kDescription, true, std::string(), true); } +// Creates a media route whose ID is |kRouteId2|. +MediaRoute CreateMediaRoute2() { + return MediaRoute(kRouteId2, MediaSource(kSource), kSinkId, kDescription, + true, std::string(), true); +} + +void OnCreateMediaRouteController( + Unused, + Unused, + Unused, + const mojom::MediaRouteProvider::CreateMediaRouteControllerCallback& cb) { + cb.Run(true); +} + } // namespace class RouteResponseCallbackHandler { @@ -745,7 +760,6 @@ TEST_F(MediaRouterMojoImplTest, RegisterMediaSinksObserverWithAvailabilityChange) { - // When availability is UNAVAILABLE, no calls should be made to MRPM. router()->OnSinkAvailabilityUpdated( mojom::MediaRouter::SinkAvailability::UNAVAILABLE); @@ -1182,16 +1196,17 @@ std::string domain("google.com"); MediaSource media_source(kSource); - EXPECT_CALL( - mock_media_route_provider_, SearchSinks_(kSinkId, kSource, _, _)) - .WillOnce(Invoke([&search_input, &domain]( - const std::string& sink_id, const std::string& source, - const mojom::SinkSearchCriteriaPtr& search_criteria, - const mojom::MediaRouteProvider::SearchSinksCallback& cb) { - EXPECT_EQ(search_input, search_criteria->input); - EXPECT_EQ(domain, search_criteria->domain); - cb.Run(kSinkId2); - })); + EXPECT_CALL(mock_media_route_provider_, + SearchSinksInternal(kSinkId, kSource, _, _)) + .WillOnce( + Invoke([&search_input, &domain]( + const std::string& sink_id, const std::string& source, + const mojom::SinkSearchCriteriaPtr& search_criteria, + const mojom::MediaRouteProvider::SearchSinksCallback& cb) { + EXPECT_EQ(search_input, search_criteria->input); + EXPECT_EQ(domain, search_criteria->domain); + cb.Run(kSinkId2); + })); SinkResponseCallbackHandler sink_handler; EXPECT_CALL(sink_handler, Invoke(kSinkId2)).Times(1); @@ -1223,6 +1238,154 @@ run_loop.RunUntilIdle(); } +TEST_F(MediaRouterMojoImplTest, GetRouteController) { + MockMediaController media_controller; + mojom::MediaStatusObserverPtr route_controller_as_observer; + MediaStatus media_status; + media_status.title = "test title"; + + router()->OnRoutesUpdated({CreateMediaRoute()}, std::string(), + std::vector<std::string>()); + + EXPECT_CALL(mock_media_route_provider_, + CreateMediaRouteControllerInternal(kRouteId, _, _, _)) + .WillOnce(Invoke([&media_controller, &route_controller_as_observer]( + const std::string& route_id, + mojom::MediaControllerRequest& request, + mojom::MediaStatusObserverPtr& observer, + const mojom::MediaRouteProvider:: + CreateMediaRouteControllerCallback& cb) { + media_controller.Bind(std::move(request)); + route_controller_as_observer = std::move(observer); + cb.Run(true); + })); + // GetRouteController() should return a MediaRouteController that is connected + // to the MediaController provided by the MediaRouteProvider, and will also be + // subscribed to MediaStatus updates. + scoped_refptr<MediaRouteController> route_controller = + router()->GetRouteController(kRouteId); + base::RunLoop().RunUntilIdle(); + + // Media commands sent to the MediaRouteController should be forwarded to the + // MediaController created by the MediaRouteProvider. + EXPECT_CALL(media_controller, Play()); + route_controller->Play(); + + // Add an observer to the MediaRouteController. + MockMediaRouteControllerObserver controller_observer(route_controller); + + // The MediaRouteController should be registered with the MediaRouteProvider + // as a MediaStatusObserver, and should also notify its own observers. + EXPECT_CALL(controller_observer, OnMediaStatusUpdated(media_status)); + route_controller_as_observer->OnMediaStatusUpdated(media_status); + + base::RunLoop().RunUntilIdle(); +} + +TEST_F(MediaRouterMojoImplTest, GetRouteControllerMultipleTimes) { + router()->OnRoutesUpdated({CreateMediaRoute(), CreateMediaRoute2()}, + std::string(), std::vector<std::string>()); + + EXPECT_CALL(mock_media_route_provider_, + CreateMediaRouteControllerInternal(kRouteId, _, _, _)) + .WillOnce(Invoke(OnCreateMediaRouteController)); + scoped_refptr<MediaRouteController> route_controller1a = + router()->GetRouteController(kRouteId); + + // Calling GetRouteController() with the same route ID for the second time + // (without destroying the MediaRouteController first) should not result in a + // CreateMediaRouteController() call. + scoped_refptr<MediaRouteController> route_controller1b = + router()->GetRouteController(kRouteId); + + // The same MediaRouteController instance should have been returned. + EXPECT_EQ(route_controller1a.get(), route_controller1b.get()); + + // Calling GetRouteController() with another route ID should result in a + // CreateMediaRouteController() call. + EXPECT_CALL(mock_media_route_provider_, + CreateMediaRouteControllerInternal(kRouteId2, _, _, _)) + .WillOnce(Invoke(OnCreateMediaRouteController)); + scoped_refptr<MediaRouteController> route_controller2 = + router()->GetRouteController(kRouteId2); + + base::RunLoop().RunUntilIdle(); +} + +TEST_F(MediaRouterMojoImplTest, GetRouteControllerAfterInvalidation) { + router()->OnRoutesUpdated({CreateMediaRoute()}, std::string(), + std::vector<std::string>()); + + EXPECT_CALL(mock_media_route_provider_, + CreateMediaRouteControllerInternal(kRouteId, _, _, _)) + .Times(2) + .WillRepeatedly(Invoke(OnCreateMediaRouteController)); + + scoped_refptr<MediaRouteController> route_controller = + router()->GetRouteController(kRouteId); + // Invalidate the MediaRouteController. + route_controller = nullptr; + // Call again with the same route ID. Since we've invalidated the + // MediaRouteController, CreateMediaRouteController() should be called again. + route_controller = router()->GetRouteController(kRouteId); + + base::RunLoop().RunUntilIdle(); +} + +TEST_F(MediaRouterMojoImplTest, GetRouteControllerAfterRouteInvalidation) { + router()->OnRoutesUpdated({CreateMediaRoute(), CreateMediaRoute2()}, + std::string(), std::vector<std::string>()); + + EXPECT_CALL(mock_media_route_provider_, + CreateMediaRouteControllerInternal(kRouteId, _, _, _)) + .WillOnce(Invoke(OnCreateMediaRouteController)); + EXPECT_CALL(mock_media_route_provider_, + CreateMediaRouteControllerInternal(kRouteId2, _, _, _)) + .Times(2) + .WillRepeatedly(Invoke(OnCreateMediaRouteController)); + + MockMediaRouteControllerObserver observer1a( + router()->GetRouteController(kRouteId)); + MockMediaRouteControllerObserver observer2a( + router()->GetRouteController(kRouteId2)); + + // Update the routes list with |kRouteId| but without |kRouteId2|. This should + // remove the controller for |kRouteId2|, resulting in + // CreateMediaRouteController() getting called again for |kRouteId2| below. + router()->OnRoutesUpdated({CreateMediaRoute()}, std::string(), + std::vector<std::string>()); + // Add back |kRouteId2| so that a controller can be created for it. + router()->OnRoutesUpdated({CreateMediaRoute(), CreateMediaRoute2()}, + std::string(), std::vector<std::string>()); + + MockMediaRouteControllerObserver observer1b( + router()->GetRouteController(kRouteId)); + MockMediaRouteControllerObserver observer2b( + router()->GetRouteController(kRouteId2)); + + base::RunLoop().RunUntilIdle(); +} + +TEST_F(MediaRouterMojoImplTest, FailToCreateRouteController) { + router()->OnRoutesUpdated({CreateMediaRoute()}, std::string(), + std::vector<std::string>()); + + EXPECT_CALL(mock_media_route_provider_, + CreateMediaRouteControllerInternal(kRouteId, _, _, _)) + .WillOnce(Invoke( + [](Unused, Unused, Unused, + const mojom::MediaRouteProvider:: + CreateMediaRouteControllerCallback& cb) { cb.Run(false); })); + MockMediaRouteControllerObserver observer( + router()->GetRouteController(kRouteId)); + + // When the MediaRouter is notified that the MediaRouteProvider failed to + // create a controller, the browser-side controller should be invalidated. + EXPECT_CALL(observer, OnControllerInvalidated()); + + base::RunLoop().RunUntilIdle(); +} + class MediaRouterMojoExtensionTest : public ::testing::Test { public: MediaRouterMojoExtensionTest() : process_manager_(nullptr) {}
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_metrics.h b/chrome/browser/media/router/mojo/media_router_mojo_metrics.h index e755b0f..9cc8b616 100644 --- a/chrome/browser/media/router/mojo/media_router_mojo_metrics.h +++ b/chrome/browser/media/router/mojo/media_router_mojo_metrics.h
@@ -44,9 +44,10 @@ UPDATE_MEDIA_SINKS = 16, SEARCH_SINKS = 17, PROVIDE_SINKS = 18, + CREATE_MEDIA_ROUTE_CONTROLLER = 19, // NOTE: Add entries only immediately above this line. - TOTAL_COUNT = 19 + TOTAL_COUNT = 20 }; // The install status of the Media Router component extension.
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_test.cc b/chrome/browser/media/router/mojo/media_router_mojo_test.cc index 305877dd..d88c9649 100644 --- a/chrome/browser/media/router/mojo/media_router_mojo_test.cc +++ b/chrome/browser/media/router/mojo/media_router_mojo_test.cc
@@ -29,6 +29,28 @@ MockEventPageTracker::~MockEventPageTracker() {} +MockMediaController::MockMediaController() : binding_(this) {} + +MockMediaController::~MockMediaController() {} + +void MockMediaController::Bind(mojom::MediaControllerRequest request) { + binding_.Bind(std::move(request)); +} + +mojom::MediaControllerPtr MockMediaController::BindInterfacePtr() { + return binding_.CreateInterfacePtrAndBind(); +} + +void MockMediaController::CloseBinding() { + binding_.Close(); +} + +MockMediaRouteControllerObserver::MockMediaRouteControllerObserver( + scoped_refptr<MediaRouteController> controller) + : MediaRouteController::Observer(controller) {} + +MockMediaRouteControllerObserver::~MockMediaRouteControllerObserver() {} + MediaRouterMojoTest::MediaRouterMojoTest() : mock_media_router_(new MediaRouterMojoImpl(&mock_event_page_tracker_)) { mock_media_router_->Initialize();
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_test.h b/chrome/browser/media/router/mojo/media_router_mojo_test.h index 2538ed6..b90e43e 100644 --- a/chrome/browser/media/router/mojo/media_router_mojo_test.h +++ b/chrome/browser/media/router/mojo/media_router_mojo_test.h
@@ -90,15 +90,28 @@ const std::string& media_source, mojom::SinkSearchCriteriaPtr search_criteria, const SearchSinksCallback& callback) override { - SearchSinks_(sink_id, media_source, search_criteria, callback); + SearchSinksInternal(sink_id, media_source, search_criteria, callback); } - MOCK_METHOD4(SearchSinks_, + MOCK_METHOD4(SearchSinksInternal, void(const std::string& sink_id, const std::string& media_source, mojom::SinkSearchCriteriaPtr& search_criteria, const SearchSinksCallback& callback)); MOCK_METHOD2(ProvideSinks, void(const std::string&, const std::vector<MediaSinkInternal>&)); + void CreateMediaRouteController( + const std::string& route_id, + mojom::MediaControllerRequest media_controller, + mojom::MediaStatusObserverPtr observer, + const CreateMediaRouteControllerCallback& callback) override { + CreateMediaRouteControllerInternal(route_id, media_controller, observer, + callback); + } + MOCK_METHOD4(CreateMediaRouteControllerInternal, + void(const std::string& route_id, + mojom::MediaControllerRequest& media_controller, + mojom::MediaStatusObserverPtr& observer, + const CreateMediaRouteControllerCallback& callback)); private: DISALLOW_COPY_AND_ASSIGN(MockMediaRouteProvider); @@ -115,6 +128,35 @@ const base::Callback<void(bool)>& callback)); }; +class MockMediaController : public mojom::MediaController { + public: + MockMediaController(); + ~MockMediaController(); + + void Bind(mojom::MediaControllerRequest request); + mojom::MediaControllerPtr BindInterfacePtr(); + void CloseBinding(); + + MOCK_METHOD0(Play, void()); + MOCK_METHOD0(Pause, void()); + MOCK_METHOD1(SetMute, void(bool mute)); + MOCK_METHOD1(SetVolume, void(float volume)); + MOCK_METHOD1(Seek, void(base::TimeDelta time)); + + private: + mojo::Binding<mojom::MediaController> binding_; +}; + +class MockMediaRouteControllerObserver : public MediaRouteController::Observer { + public: + MockMediaRouteControllerObserver( + scoped_refptr<MediaRouteController> controller); + ~MockMediaRouteControllerObserver() override; + + MOCK_METHOD1(OnMediaStatusUpdated, void(const MediaStatus& status)); + MOCK_METHOD0(OnControllerInvalidated, void()); +}; + // Tests the API call flow between the MediaRouterMojoImpl and the Media Router // Mojo service in both directions. class MediaRouterMojoTest : public ::testing::Test {
diff --git a/chrome/browser/notifications/notification_platform_bridge_linux.cc b/chrome/browser/notifications/notification_platform_bridge_linux.cc index 1a7d6b24..4f364da 100644 --- a/chrome/browser/notifications/notification_platform_bridge_linux.cc +++ b/chrome/browser/notifications/notification_platform_bridge_linux.cc
@@ -11,6 +11,7 @@ #include "base/stl_util.h" #include "base/strings/nullable_string16.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/task_scheduler/post_task.h" #include "chrome/browser/browser_process.h" @@ -19,6 +20,7 @@ #include "chrome/browser/notifications/notification.h" #include "chrome/browser/notifications/notification_display_service_factory.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/shell_integration_linux.h" #include "content/public/browser/notification_service.h" namespace { @@ -377,10 +379,22 @@ GVariantBuilder hints_builder; g_variant_builder_init(&hints_builder, G_VARIANT_TYPE("a{sv}")); + g_variant_builder_add(&hints_builder, "{sv}", "urgency", g_variant_new_byte(NotificationPriorityToFdoUrgency( notification.priority()))); + std::unique_ptr<base::Environment> env = base::Environment::Create(); + base::FilePath desktop_file( + shell_integration_linux::GetDesktopName(env.get())); + const char kDesktopFileSuffix[] = ".desktop"; + DCHECK(base::EndsWith(desktop_file.value(), kDesktopFileSuffix, + base::CompareCase::SENSITIVE)); + + desktop_file = desktop_file.RemoveFinalExtension(); + g_variant_builder_add(&hints_builder, "{sv}", "desktop-entry", + g_variant_new_string(desktop_file.value().c_str())); + if (!resource_files->icon_file.empty()) { g_variant_builder_add( &hints_builder, "{sv}", "image-path", @@ -392,9 +406,10 @@ const std::string title = base::UTF16ToUTF8(notification.title()); const std::string message = base::UTF16ToUTF8(notification.message()); - GVariant* parameters = - g_variant_new("(susssasa{sv}i)", "", data->dbus_id, "", title.c_str(), - message.c_str(), &actions_builder, &hints_builder, -1); + GVariant* parameters = g_variant_new( + "(susssasa{sv}i)", "" /* app_name passed implicitly via desktop-entry */, + data->dbus_id, "" /* app_icon passed implicitly via desktop-entry */, + title.c_str(), message.c_str(), &actions_builder, &hints_builder, -1); g_dbus_proxy_call(notification_proxy_, "Notify", parameters, G_DBUS_CALL_FLAGS_NONE, -1, data->cancellable, callback, user_data);
diff --git a/chrome/browser/resources/bookmark_manager/js/main.js b/chrome/browser/resources/bookmark_manager/js/main.js index ce341832..423ea4f 100644 --- a/chrome/browser/resources/bookmark_manager/js/main.js +++ b/chrome/browser/resources/bookmark_manager/js/main.js
@@ -44,11 +44,6 @@ var linkController; /** - * New Windows are not allowed in Windows 8 metro mode. - */ -var canOpenNewWindows = true; - -/** * Incognito mode availability can take the following values: , * - 'enabled' for when both normal and incognito modes are available; * - 'disabled' for when incognito mode is disabled; @@ -577,7 +572,7 @@ updateOpenCommand(e, command, 'open_in_new_window', 'open_all_new_window', // Disabled when incognito is forced. - incognitoModeAvailability == 'forced' || !canOpenNewWindows); + incognitoModeAvailability == 'forced'); break; case 'open-incognito-window-command': @@ -1536,10 +1531,6 @@ incognitoModeAvailability = result; }); - chrome.bookmarkManagerPrivate.canOpenNewWindows(function(result) { - canOpenNewWindows = result; - }); - cr.ui.FocusOutlineManager.forDocument(document); initializeSplitter(); bmm.addBookmarkModelListeners();
diff --git a/chrome/browser/resources/md_history/side_bar.html b/chrome/browser/resources/md_history/side_bar.html index 79a5180..d26b03c 100644 --- a/chrome/browser/resources/md_history/side_bar.html +++ b/chrome/browser/resources/md_history/side_bar.html
@@ -67,6 +67,11 @@ color: var(--link-color); } + iron-selector > a[disabled] { + opacity: 0.65; + pointer-events: none; + } + #spacer { flex: 1; } @@ -101,8 +106,11 @@ <paper-ripple></paper-ripple> </a> <div class="separator"></div> - <a href="chrome://settings/clearBrowserData" - on-tap="onClearBrowsingDataTap_" id="clear-browsing-data"> + <a id="clear-browsing-data" + href="chrome://settings/clearBrowserData" + on-tap="onClearBrowsingDataTap_" + disabled$="[[guestSession_]]" + tabindex$="[[computeClearBrowsingDataTabIndex_(guestSession_)]]"> $i18n{clearBrowsingData} <iron-icon icon="cr:open-in-new"></iron-icon> <paper-ripple id="cbd-ripple"></paper-ripple>
diff --git a/chrome/browser/resources/md_history/side_bar.js b/chrome/browser/resources/md_history/side_bar.js index e0f7e13..cfc0b943 100644 --- a/chrome/browser/resources/md_history/side_bar.js +++ b/chrome/browser/resources/md_history/side_bar.js
@@ -13,6 +13,12 @@ notify: true, }, + /** @private */ + guestSession_: { + type: Boolean, + value: loadTimeData.getBoolean('isGuestSession'), + }, + showFooter: Boolean, }, @@ -49,6 +55,14 @@ }, /** + * @return {number} + * @private + */ + computeClearBrowsingDataTabIndex_: function() { + return this.guestSession_ ? -1 : 0; + }, + + /** * Prevent clicks on sidebar items from navigating. These are only links for * accessibility purposes, taps are handled separately by <iron-selector>. * @private
diff --git a/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html b/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html index bcb42c73..887b01975 100644 --- a/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html +++ b/chrome/browser/resources/settings/a11y_page/manage_a11y_page.html
@@ -175,7 +175,8 @@ <div class="start">$i18n{largeMouseCursorSizeLabel}</div> <settings-slider pref="{{prefs.settings.a11y.large_cursor_dip_size}}" - min="25" max="64" label-min="$i18n{largeMouseCursorSizeSmallLabel}" + min="25" max="64" + label-min="$i18n{largeMouseCursorSizeDefaultLabel}" label-max="$i18n{largeMouseCursorSizeLargeLabel}"> </settings-slider> </div>
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc index 3f477f4..a8f59027 100644 --- a/chrome/browser/ui/browser_command_controller.cc +++ b/chrome/browser/ui/browser_command_controller.cc
@@ -798,7 +798,8 @@ command_updater_.UpdateCommandEnabled(IDC_RECENT_TABS_MENU, !guest_session && !profile()->IsOffTheRecord()); - command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, normal_window); + command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, + !guest_session); #if defined(OS_CHROMEOS) command_updater_.UpdateCommandEnabled(IDC_TAKE_SCREENSHOT, true); command_updater_.UpdateCommandEnabled(IDC_TOUCH_HUD_PROJECTION_TOGGLE, true);
diff --git a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc index 311970d8..23196c2 100644 --- a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc +++ b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
@@ -13,6 +13,7 @@ #include "components/sync_sessions/sync_sessions_client.h" #include "components/sync_sessions/synced_window_delegate.h" #include "components/sync_sessions/synced_window_delegates_getter.h" +#include "components/sync_sessions/tab_node_pool.h" #include "content/public/browser/favicon_status.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" @@ -48,7 +49,8 @@ TabContentsSyncedTabDelegate::TabContentsSyncedTabDelegate( content::WebContents* web_contents) - : web_contents_(web_contents), sync_session_id_(0) {} + : web_contents_(web_contents), + sync_session_id_(sync_sessions::TabNodePool::kInvalidTabNodeID) {} TabContentsSyncedTabDelegate::~TabContentsSyncedTabDelegate() {}
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc index d1254b6..3d97561 100644 --- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -126,8 +126,8 @@ {"optionsInMenuLabel", IDS_SETTINGS_OPTIONS_IN_MENU_LABEL}, {"largeMouseCursorLabel", IDS_SETTINGS_LARGE_MOUSE_CURSOR_LABEL}, {"largeMouseCursorSizeLabel", IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_LABEL}, - {"largeMouseCursorSizeSmallLabel", - IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_SMALL_LABEL}, + {"largeMouseCursorSizeDefaultLabel", + IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_DEFAULT_LABEL}, {"largeMouseCursorSizeLargeLabel", IDS_SETTINGS_LARGE_MOUSE_CURSOR_SIZE_LARGE_LABEL}, {"highContrastLabel", IDS_SETTINGS_HIGH_CONTRAST_LABEL},
diff --git a/chrome/browser/win/jumplist.cc b/chrome/browser/win/jumplist.cc index 06f2870..18c7922 100644 --- a/chrome/browser/win/jumplist.cc +++ b/chrome/browser/win/jumplist.cc
@@ -277,6 +277,9 @@ local_recently_closed_pages = data->recently_closed_pages_; } + // Delete the content in JumpListIcons folder and log the results to UMA. + DeleteDirectoryContentAndLogResults(icon_dir, kFileDeleteLimit); + // Create a new JumpList and replace the current JumpList with it. The // jumplist links are updated anyway, while the jumplist icons may not as // mentioned above. @@ -606,13 +609,8 @@ profile_ ? IncognitoModePrefs::GetAvailability(profile_->GetPrefs()) : IncognitoModePrefs::ENABLED; - // Post a task to delete the content in JumpListIcons folder and log the - // results to UMA. - update_jumplisticons_task_runner_->PostTask( - FROM_HERE, base::Bind(&DeleteDirectoryContentAndLogResults, icon_dir_, - kFileDeleteLimit)); - - // Post a task to update the jumplist used by the shell. + // Post a task to update the jumplist in JumpListIcons folder, which consists + // of 1) delete old icons, 2) create new icons, 3) notify the OS. update_jumplisticons_task_runner_->PostTask( FROM_HERE, base::Bind(&RunUpdateJumpList, incognito_availability, app_id_, icon_dir_, base::RetainedRef(jumplist_data_)));
diff --git a/chrome/browser/win/jumplist_file_util.cc b/chrome/browser/win/jumplist_file_util.cc index 7c98704..9dd5b11 100644 --- a/chrome/browser/win/jumplist_file_util.cc +++ b/chrome/browser/win/jumplist_file_util.cc
@@ -125,6 +125,9 @@ void DeleteDirectoryContentAndLogResults(const base::FilePath& path, int max_file_deleted) { + // TODO(chengx): Remove the UMA histogram after fixing http://crbug.com/40407. + SCOPED_UMA_HISTOGRAM_TIMER("WinJumplist.DeleteDirectoryContentDuration"); + DirectoryStatus dir_status = NON_EXIST; // Delete the content in |path|. If |path| doesn't exist, create one.
diff --git a/chrome/common/extensions/api/bookmark_manager_private.json b/chrome/common/extensions/api/bookmark_manager_private.json index ecd66ef..af832b33 100644 --- a/chrome/common/extensions/api/bookmark_manager_private.json +++ b/chrome/common/extensions/api/bookmark_manager_private.json
@@ -209,16 +209,6 @@ ] }, { - "name": "canOpenNewWindows", - "type": "function", - "description": "Whether bookmarks can be opened in new windows.", - "parameters": [ - {"type": "function", "name": "callback", "parameters": [ - {"name": "result", "type": "boolean"} - ]} - ] - }, - { "name": "removeTrees", "type": "function", "description": "Recursively removes list of bookmarks nodes.",
diff --git a/components/arc/common/notifications.mojom b/components/arc/common/notifications.mojom index e515149..ae9a48cc 100644 --- a/components/arc/common/notifications.mojom +++ b/components/arc/common/notifications.mojom
@@ -55,6 +55,15 @@ EXPANDED = 2, }; +// These values represent what shows in an ARC custom notification. +[Extensible, MinVersion=11] +enum ArcNotificationShownContents { + // The normal notification contents are shown. + CONTENTS_SHOWN = 0, + // The notification settings view is shown. + SETTINGS_SHOWN = 1, +}; + struct ArcNotificationData { // Identifier of notification string key; @@ -108,6 +117,9 @@ // Flag if the notification is expandable [MinVersion=10] ArcNotificationExpandState expand_state; + // Flag for what shows in a notification. + [MinVersion=11] + ArcNotificationShownContents shown_contents; }; [MinVersion=2]
diff --git a/components/content_settings/core/browser/content_settings_pref_provider.cc b/components/content_settings/core/browser/content_settings_pref_provider.cc index 3bd173e..4373861 100644 --- a/components/content_settings/core/browser/content_settings_pref_provider.cc +++ b/components/content_settings/core/browser/content_settings_pref_provider.cc
@@ -197,6 +197,8 @@ } void PrefProvider::DiscardObsoletePreferences() { + if (is_incognito_) + return; // These prefs were never stored on iOS/Android so they don't need to be // deleted. #if !defined(OS_IOS)
diff --git a/components/exo/BUILD.gn b/components/exo/BUILD.gn index 3edaf86..389f67c 100644 --- a/components/exo/BUILD.gn +++ b/components/exo/BUILD.gn
@@ -56,6 +56,7 @@ "//cc/ipc:interfaces", "//cc/surfaces", "//device/gamepad", + "//device/gamepad/public/cpp:shared_with_blink", "//gpu", "//gpu/command_buffer/client:gles2_interface", "//skia",
diff --git a/components/exo/gaming_seat.cc b/components/exo/gaming_seat.cc index eed466c..016be14 100644 --- a/components/exo/gaming_seat.cc +++ b/components/exo/gaming_seat.cc
@@ -50,7 +50,7 @@ GamingSeat::ThreadSafeGamepadChangeFetcher> { public: using ProcessGamepadChangesCallback = - base::Callback<void(int index, const blink::WebGamepad)>; + base::Callback<void(int index, const device::Gamepad)>; ThreadSafeGamepadChangeFetcher( const ProcessGamepadChangesCallback& post_gamepad_changes, @@ -120,11 +120,11 @@ DCHECK(fetcher_); - blink::WebGamepads new_state = state_; + device::Gamepads new_state = state_; fetcher_->GetGamepadData( false /* No hardware changed notification from the system */); - for (size_t i = 0; i < blink::WebGamepads::kItemsLengthCap; ++i) { + for (size_t i = 0; i < device::Gamepads::kItemsLengthCap; ++i) { device::PadState& pad_state = pad_states_.get()[i]; // After querying the gamepad clear the state if it did not have it's @@ -171,7 +171,7 @@ std::unique_ptr<device::GamepadDataFetcher> fetcher_; // The current state of all gamepads. - blink::WebGamepads state_; + device::Gamepads state_; // True if a poll has been scheduled. bool has_poll_scheduled_ = false; @@ -216,7 +216,7 @@ gamepad_change_fetcher_->EnablePolling(false); delegate_->OnGamingSeatDestroying(this); - for (size_t i = 0; i < blink::WebGamepads::kItemsLengthCap; ++i) { + for (size_t i = 0; i < device::Gamepads::kItemsLengthCap; ++i) { if (gamepad_delegates_[i]) { gamepad_delegates_[i]->OnRemoved(); } @@ -249,11 +249,11 @@ // GamingSeat, private: void GamingSeat::ProcessGamepadChanges(int index, - const blink::WebGamepad new_pad) { + const device::Gamepad new_pad) { DCHECK(thread_checker_.CalledOnValidThread()); bool send_frame = false; - blink::WebGamepad& pad_state = pad_state_.items[index]; + device::Gamepad& pad_state = pad_state_.items[index]; // Update connection state. GamepadDelegate* delegate = gamepad_delegates_[index]; if (new_pad.connected != pad_state.connected) {
diff --git a/components/exo/gaming_seat.h b/components/exo/gaming_seat.h index d8fcf119..40e44ae 100644 --- a/components/exo/gaming_seat.h +++ b/components/exo/gaming_seat.h
@@ -50,7 +50,7 @@ class ThreadSafeGamepadChangeFetcher; // Processes updates of gamepad data and passes changes on to delegate. - void ProcessGamepadChanges(int index, const blink::WebGamepad new_pad); + void ProcessGamepadChanges(int index, const device::Gamepad new_pad); // Private implementation of methods and resources that are used on the // polling thread. @@ -60,10 +60,10 @@ GamingSeatDelegate* const delegate_; // The delegate instances that all other events are dispatched to. - GamepadDelegate* gamepad_delegates_[blink::WebGamepads::kItemsLengthCap]; + GamepadDelegate* gamepad_delegates_[device::Gamepads::kItemsLengthCap]; // The current state of the gamepad represented by this instance. - blink::WebGamepads pad_state_; + device::Gamepads pad_state_; // ThreadChecker for the origin thread. base::ThreadChecker thread_checker_;
diff --git a/components/exo/gaming_seat_unittest.cc b/components/exo/gaming_seat_unittest.cc index 8b94ca0a..5a7893d 100644 --- a/components/exo/gaming_seat_unittest.cc +++ b/components/exo/gaming_seat_unittest.cc
@@ -47,7 +47,7 @@ GamingSeatTest() {} std::unique_ptr<device::GamepadDataFetcher> MockDataFetcherFactory() { - blink::WebGamepads initial_data; + device::Gamepads initial_data; std::unique_ptr<device::MockGamepadDataFetcher> fetcher( new device::MockGamepadDataFetcher(initial_data)); mock_data_fetcher_ = fetcher.get(); @@ -73,7 +73,7 @@ polling_task_runner_ = nullptr; } - void SetDataAndPostToDelegate(const blink::WebGamepads& new_data) { + void SetDataAndPostToDelegate(const device::Gamepads& new_data) { ASSERT_TRUE(mock_data_fetcher_ != nullptr); mock_data_fetcher_->SetTestData(new_data); // Run one polling cycle, which will post a task to the origin task runner. @@ -132,7 +132,7 @@ EXPECT_CALL(gamepad_delegate2, OnRemoved()).Times(1); } // Gamepad connected. - blink::WebGamepads gamepad_connected; + device::Gamepads gamepad_connected; gamepad_connected.items[0].connected = true; gamepad_connected.items[0].timestamp = 1; SetDataAndPostToDelegate(gamepad_connected); @@ -152,7 +152,7 @@ SetDataAndPostToDelegate(gamepad_connected); // Gamepad disconnected. - blink::WebGamepads all_disconnected; + device::Gamepads all_disconnected; SetDataAndPostToDelegate(all_disconnected); DestroyGamingSeat(gaming_seat_delegate); @@ -182,7 +182,7 @@ .WillOnce(testing::Return(&gamepad_delegate0)) .WillOnce(testing::Return(&gamepad_delegate2)); - blink::WebGamepads gamepad_connected; + device::Gamepads gamepad_connected; gamepad_connected.items[0].connected = true; gamepad_connected.items[0].timestamp = 1; SetDataAndPostToDelegate(gamepad_connected); @@ -192,7 +192,7 @@ SetDataAndPostToDelegate(gamepad_connected); // send axis event to 2 and then 0 - blink::WebGamepads axis_moved; + device::Gamepads axis_moved; axis_moved.items[0].connected = true; axis_moved.items[0].timestamp = 1; axis_moved.items[2].connected = true; @@ -241,7 +241,7 @@ .WillOnce(testing::Return(&gamepad_delegate0)) .WillOnce(testing::Return(&gamepad_delegate2)); - blink::WebGamepads gamepad_connected; + device::Gamepads gamepad_connected; gamepad_connected.items[0].connected = true; gamepad_connected.items[0].timestamp = 1; SetDataAndPostToDelegate(gamepad_connected); @@ -251,7 +251,7 @@ SetDataAndPostToDelegate(gamepad_connected); // send axis event to 2 and then 0 - blink::WebGamepads axis_moved; + device::Gamepads axis_moved; axis_moved.items[0].connected = true; axis_moved.items[0].timestamp = 1; axis_moved.items[2].connected = true;
diff --git a/components/offline_items_collection/core/BUILD.gn b/components/offline_items_collection/core/BUILD.gn index ee5d135..8891fb5 100644 --- a/components/offline_items_collection/core/BUILD.gn +++ b/components/offline_items_collection/core/BUILD.gn
@@ -23,10 +23,13 @@ public_deps = [ "//base", "//components/keyed_service/core", + "//ui/gfx", "//url", ] - deps = [] + deps = [ + "//ui/gfx/geometry", + ] if (is_android) { sources += [ @@ -34,6 +37,8 @@ "android/offline_content_aggregator_bridge.h", "android/offline_item_bridge.cc", "android/offline_item_bridge.h", + "android/offline_item_visuals_bridge.cc", + "android/offline_item_visuals_bridge.h", ] deps += [ ":jni_headers" ] @@ -58,12 +63,15 @@ if (is_android) { android_library("core_java") { java_files = [ + "android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java", + "android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemVisualsBridge.java", "android/java/src/org/chromium/components/offline_items_collection/ContentId.java", "android/java/src/org/chromium/components/offline_items_collection/LegacyHelpers.java", "android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java", "android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java", "android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java", - "android/java/src/org/chromium/components/offline_items_collection/OfflineItemBridge.java", + "android/java/src/org/chromium/components/offline_items_collection/OfflineItemVisuals.java", + "android/java/src/org/chromium/components/offline_items_collection/VisualsCallback.java", ] srcjar_deps = [ ":jni_enums" ] @@ -79,7 +87,8 @@ sources = [ "android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java", - "android/java/src/org/chromium/components/offline_items_collection/OfflineItemBridge.java", + "android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java", + "android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemVisualsBridge.java", ] jni_package = "components/offline_items_collection/core/android"
diff --git a/components/offline_items_collection/core/DEPS b/components/offline_items_collection/core/DEPS index bf267f9..38d6d22e 100644 --- a/components/offline_items_collection/core/DEPS +++ b/components/offline_items_collection/core/DEPS
@@ -4,5 +4,6 @@ "+components/offline_pages", "+jni", "+testing", + "+ui/gfx", "+url", ]
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java index f14368f8..8c3a57e 100644 --- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java +++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java
@@ -4,6 +4,8 @@ package org.chromium.components.offline_items_collection; +import android.os.Handler; + import org.chromium.base.ObserverList; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; @@ -18,6 +20,8 @@ */ @JNINamespace("offline_items_collection::android") public class OfflineContentAggregatorBridge implements OfflineContentProvider { + private final Handler mHandler = new Handler(); + private long mNativeOfflineContentAggregatorBridge; private ObserverList<OfflineContentProvider.Observer> mObservers; private boolean mItemsAvailable; @@ -82,8 +86,22 @@ } @Override - public void addObserver(OfflineContentProvider.Observer observer) { + public void getVisualsForItem(ContentId id, VisualsCallback callback) { + nativeGetVisualsForItem( + mNativeOfflineContentAggregatorBridge, id.namespace, id.id, callback); + } + + @Override + public void addObserver(final OfflineContentProvider.Observer observer) { mObservers.addObserver(observer); + if (!areItemsAvailable()) return; + + mHandler.post(new Runnable() { + @Override + public void run() { + notifyObserverOfItemsReady(observer); + } + }); } @Override @@ -91,6 +109,11 @@ mObservers.removeObserver(observer); } + private void notifyObserverOfItemsReady(Observer observer) { + if (!mObservers.hasObserver(observer)) return; + observer.onItemsAvailable(); + } + // Methods called from C++ via JNI. @CalledByNative private void onItemsAvailable() { @@ -126,6 +149,12 @@ } } + @CalledByNative + private static void onVisualsAvailable( + VisualsCallback callback, String nameSpace, String id, OfflineItemVisuals visuals) { + callback.onVisualsAvailable(new ContentId(nameSpace, id), visuals); + } + /** * Called when the C++ OfflineContentAggregatorBridge is destroyed. This tears down the Java * component of the JNI bridge so that this class, which may live due to other references, no @@ -163,4 +192,6 @@ long nativeOfflineContentAggregatorBridge, String nameSpace, String id); private native ArrayList<OfflineItem> nativeGetAllItems( long nativeOfflineContentAggregatorBridge); + private native void nativeGetVisualsForItem(long nativeOfflineContentAggregatorBridge, + String nameSpace, String id, VisualsCallback callback); } \ No newline at end of file
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java index 7c177a7..14613f3 100644 --- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java +++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentProvider.java
@@ -11,7 +11,8 @@ * (components/offline_items_collection/core/offline_content_provider.h) class. */ public interface OfflineContentProvider { - /** This interface is a Java counterpart to the C++ OfflineContentProvider::Observer + /** + * This interface is a Java counterpart to the C++ OfflineContentProvider::Observer * (components/offline_items_collection/core/offline_content_provider.h) class. */ interface Observer { @@ -52,6 +53,9 @@ /** See OfflineContentProvider::GetAllItems(). */ ArrayList<OfflineItem> getAllItems(); + /** See OfflineContentProvider::GetVisualsForItem(...). */ + void getVisualsForItem(ContentId id, VisualsCallback callback); + /** See OfflineContentProvider::AddObserver(...). */ void addObserver(Observer observer);
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java index 83b6709..c4d734d7 100644 --- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java +++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItem.java
@@ -45,7 +45,7 @@ public int percentCompleted; public long timeRemainingMs; - OfflineItem() { + public OfflineItem() { id = new ContentId(); filter = OfflineItemFilter.FILTER_OTHER; state = OfflineItemState.COMPLETE;
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItemVisuals.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItemVisuals.java new file mode 100644 index 0000000..cb0fcab --- /dev/null +++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItemVisuals.java
@@ -0,0 +1,21 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.offline_items_collection; + +import android.graphics.Bitmap; + +import org.chromium.base.annotations.SuppressFBWarnings; + +/** + * This class is the Java counterpart to the C++ OfflineItemVisuals + * (components/offline_items_collection/core/offline_item.h) class. + * + * For all member variable descriptions see the C++ class. + * TODO(dtrainor): Investigate making all class members for this and the C++ counterpart const. + */ +@SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") +public class OfflineItemVisuals { + public Bitmap icon; +} \ No newline at end of file
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/VisualsCallback.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/VisualsCallback.java new file mode 100644 index 0000000..ec3e129 --- /dev/null +++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/VisualsCallback.java
@@ -0,0 +1,19 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.offline_items_collection; + +import android.support.annotation.Nullable; + +/** + * This interface is a Java counterpart to the C++ base::Callback meant to be used in response + * to {@link OfflineItemVisuals} requests. + */ +public interface VisualsCallback { + /** + * @param id The {@link ContentId} that {@code visuals} is associated with. + * @param visuals The {@link OfflineItemVisuals}, if any, associated with {@code id}. + */ + void onVisualsAvailable(ContentId id, @Nullable OfflineItemVisuals visuals); +} \ No newline at end of file
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItemBridge.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java similarity index 90% rename from components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItemBridge.java rename to components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java index c520928..7f43097 100644 --- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineItemBridge.java +++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemBridge.java
@@ -2,10 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.components.offline_items_collection; +package org.chromium.components.offline_items_collection.bridges; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; +import org.chromium.components.offline_items_collection.OfflineItem; +import org.chromium.components.offline_items_collection.OfflineItemFilter; +import org.chromium.components.offline_items_collection.OfflineItemState; import java.util.ArrayList; @@ -16,7 +19,7 @@ * instances. */ @JNINamespace("offline_items_collection::android") -public class OfflineItemBridge { +public final class OfflineItemBridge { private OfflineItemBridge() {} /**
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemVisualsBridge.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemVisualsBridge.java new file mode 100644 index 0000000..9e4b579 --- /dev/null +++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/bridges/OfflineItemVisualsBridge.java
@@ -0,0 +1,33 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.offline_items_collection.bridges; + +import android.graphics.Bitmap; + +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.JNINamespace; +import org.chromium.components.offline_items_collection.OfflineItemVisuals; + +/** + * The Java counterpart to the C++ class OfflineItemVisualsBridge + * (components/offline_items_collection/core/android/offline_item_visuals_bridge.h). This class has + * no public members or methods and is meant as a private factory to build + * {@link OfflineItemVisuals} instances. + */ +@JNINamespace("offline_items_collection::android") +public final class OfflineItemVisualsBridge { + private OfflineItemVisualsBridge() {} + + /** + * This is a helper method to allow C++ to create an {@link OfflineItemVisuals} object. + * @return The newly created {@link OfflineItemVisuals} based on the input parameters. + */ + @CalledByNative + private static OfflineItemVisuals createOfflineItemVisuals(Bitmap icon) { + OfflineItemVisuals visuals = new OfflineItemVisuals(); + visuals.icon = icon; + return visuals; + } +} \ No newline at end of file
diff --git a/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc b/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc index 70184f9..6088531 100644 --- a/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc +++ b/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc
@@ -5,7 +5,9 @@ #include "components/offline_items_collection/core/android/offline_content_aggregator_bridge.h" #include "base/android/jni_string.h" +#include "base/bind.h" #include "components/offline_items_collection/core/android/offline_item_bridge.h" +#include "components/offline_items_collection/core/android/offline_item_visuals_bridge.h" #include "components/offline_items_collection/core/offline_item.h" #include "jni/OfflineContentAggregatorBridge_jni.h" @@ -14,6 +16,7 @@ using base::android::ConvertUTF8ToJavaString; using base::android::JavaParamRef; using base::android::ScopedJavaLocalRef; +using base::android::ScopedJavaGlobalRef; namespace offline_items_collection { namespace android { @@ -28,6 +31,16 @@ ConvertJavaStringToUTF8(env, j_id)); } +void GetVisualsForItemHelperCallback(ScopedJavaGlobalRef<jobject> j_callback, + const ContentId& id, + const OfflineItemVisuals* visuals) { + JNIEnv* env = AttachCurrentThread(); + Java_OfflineContentAggregatorBridge_onVisualsAvailable( + env, j_callback.obj(), ConvertUTF8ToJavaString(env, id.name_space), + ConvertUTF8ToJavaString(env, id.id), + OfflineItemVisualsBridge::CreateOfflineItemVisuals(env, visuals)); +} + } // namespace // static. @@ -133,6 +146,18 @@ aggregator_->GetAllItems()); } +void OfflineContentAggregatorBridge::GetVisualsForItem( + JNIEnv* env, + const JavaParamRef<jobject>& jobj, + const JavaParamRef<jstring>& j_namespace, + const JavaParamRef<jstring>& j_id, + const JavaParamRef<jobject>& j_callback) { + aggregator_->GetVisualsForItem( + CreateContentId(env, j_namespace, j_id), + base::Bind(&GetVisualsForItemHelperCallback, + ScopedJavaGlobalRef<jobject>(env, j_callback))); +} + void OfflineContentAggregatorBridge::OnItemsAvailable( OfflineContentProvider* provider) { if (java_ref_.is_null())
diff --git a/components/offline_items_collection/core/android/offline_content_aggregator_bridge.h b/components/offline_items_collection/core/android/offline_content_aggregator_bridge.h index 5a291c6f..5a3a8cd 100644 --- a/components/offline_items_collection/core/android/offline_content_aggregator_bridge.h +++ b/components/offline_items_collection/core/android/offline_content_aggregator_bridge.h
@@ -69,6 +69,12 @@ base::android::ScopedJavaLocalRef<jobject> GetAllItems( JNIEnv* env, const base::android::JavaParamRef<jobject>& jobj); + void GetVisualsForItem( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& jobj, + const base::android::JavaParamRef<jstring>& j_namespace, + const base::android::JavaParamRef<jstring>& j_id, + const base::android::JavaParamRef<jobject>& j_callback); private: OfflineContentAggregatorBridge(OfflineContentAggregator* aggregator);
diff --git a/components/offline_items_collection/core/android/offline_item_visuals_bridge.cc b/components/offline_items_collection/core/android/offline_item_visuals_bridge.cc new file mode 100644 index 0000000..a1ff778 --- /dev/null +++ b/components/offline_items_collection/core/android/offline_item_visuals_bridge.cc
@@ -0,0 +1,33 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/offline_items_collection/core/android/offline_item_visuals_bridge.h" + +#include "components/offline_items_collection/core/offline_item.h" +#include "jni/OfflineItemVisualsBridge_jni.h" +#include "ui/gfx/android/java_bitmap.h" +#include "ui/gfx/image/image.h" + +using base::android::ScopedJavaLocalRef; + +namespace offline_items_collection { +namespace android { + +// static +ScopedJavaLocalRef<jobject> OfflineItemVisualsBridge::CreateOfflineItemVisuals( + JNIEnv* env, + const OfflineItemVisuals* const visuals) { + if (!visuals) + return nullptr; + + base::android::ScopedJavaLocalRef<jobject> j_icon; + + if (!visuals->icon.IsEmpty()) + j_icon = gfx::ConvertToJavaBitmap(visuals->icon.ToSkBitmap()); + + return Java_OfflineItemVisualsBridge_createOfflineItemVisuals(env, j_icon); +} + +} // namespace android +} // namespace offline_items_collection
diff --git a/components/offline_items_collection/core/android/offline_item_visuals_bridge.h b/components/offline_items_collection/core/android/offline_item_visuals_bridge.h new file mode 100644 index 0000000..472e34ec --- /dev/null +++ b/components/offline_items_collection/core/android/offline_item_visuals_bridge.h
@@ -0,0 +1,35 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_OFFLINE_ITEMS_COLLECTION_CORE_ANDROID_OFFLINE_ITEM_VISUALS_BRIDGE_H_ +#define COMPONENTS_OFFLINE_ITEMS_COLLECTION_CORE_ANDROID_OFFLINE_ITEM_VISUALS_BRIDGE_H_ + +#include <vector> + +#include "base/android/jni_android.h" +#include "base/android/scoped_java_ref.h" + +namespace offline_items_collection { + +struct OfflineItemVisuals; + +namespace android { + +// A helper class for creating Java OfflineItemVisuals instances from the C++ +// OfflineItemVisuals counterpart. +class OfflineItemVisualsBridge { + public: + // Creates a Java OfflineItemVisuals from |visuals|. + static base::android::ScopedJavaLocalRef<jobject> CreateOfflineItemVisuals( + JNIEnv* env, + const OfflineItemVisuals* const visuals); + + private: + OfflineItemVisualsBridge(); +}; + +} // namespace android +} // namespace offline_items_collection + +#endif // COMPONENTS_OFFLINE_ITEMS_COLLECTION_CORE_ANDROID_OFFLINE_ITEM_VISUALS_BRIDGE_H_
diff --git a/components/offline_items_collection/core/offline_content_aggregator.cc b/components/offline_items_collection/core/offline_content_aggregator.cc index acbfd5a..19eaa57 100644 --- a/components/offline_items_collection/core/offline_content_aggregator.cc +++ b/components/offline_items_collection/core/offline_content_aggregator.cc
@@ -145,6 +145,20 @@ return items; } +void OfflineContentAggregator::GetVisualsForItem( + const ContentId& id, + const VisualsCallback& callback) { + auto it = providers_.find(id.name_space); + + if (it == providers_.end()) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(callback, id, nullptr)); + return; + } + + it->second->GetVisualsForItem(id, callback); +} + void OfflineContentAggregator::AddObserver( OfflineContentProvider::Observer* observer) { DCHECK(observer);
diff --git a/components/offline_items_collection/core/offline_content_aggregator.h b/components/offline_items_collection/core/offline_content_aggregator.h index 0349708..68df568 100644 --- a/components/offline_items_collection/core/offline_content_aggregator.h +++ b/components/offline_items_collection/core/offline_content_aggregator.h
@@ -84,6 +84,8 @@ void ResumeDownload(const ContentId& id) override; const OfflineItem* GetItemById(const ContentId& id) override; OfflineItemList GetAllItems() override; + void GetVisualsForItem(const ContentId& id, + const VisualsCallback& callback) override; void AddObserver(OfflineContentProvider::Observer* observer) override; void RemoveObserver(OfflineContentProvider::Observer* observer) override;
diff --git a/components/offline_items_collection/core/offline_content_aggregator_unittest.cc b/components/offline_items_collection/core/offline_content_aggregator_unittest.cc index 3619340..45d77fd 100644 --- a/components/offline_items_collection/core/offline_content_aggregator_unittest.cc +++ b/components/offline_items_collection/core/offline_content_aggregator_unittest.cc
@@ -299,6 +299,8 @@ EXPECT_CALL(provider2, ResumeDownload(id2)).Times(1); EXPECT_CALL(provider1, PauseDownload(id1)).Times(1); EXPECT_CALL(provider2, PauseDownload(id2)).Times(1); + EXPECT_CALL(provider1, GetVisualsForItem(id1, _)).Times(1); + EXPECT_CALL(provider2, GetVisualsForItem(id2, _)).Times(1); aggregator_.OpenItem(id1); aggregator_.OpenItem(id2); aggregator_.RemoveItem(id1); @@ -309,6 +311,8 @@ aggregator_.ResumeDownload(id2); aggregator_.PauseDownload(id1); aggregator_.PauseDownload(id2); + aggregator_.GetVisualsForItem(id1, OfflineContentProvider::VisualsCallback()); + aggregator_.GetVisualsForItem(id2, OfflineContentProvider::VisualsCallback()); } TEST_F(OfflineContentAggregatorTest, ActionPropagatesAfterInitialize) {
diff --git a/components/offline_items_collection/core/offline_content_provider.h b/components/offline_items_collection/core/offline_content_provider.h index 353a7bc..82af995 100644 --- a/components/offline_items_collection/core/offline_content_provider.h +++ b/components/offline_items_collection/core/offline_content_provider.h
@@ -8,6 +8,7 @@ #include <string> #include <vector> +#include "base/callback.h" #include "base/macros.h" #include "url/gurl.h" @@ -15,6 +16,7 @@ struct ContentId; struct OfflineItem; +struct OfflineItemVisuals; // A provider of a set of OfflineItems that are meant to be exposed to the UI. // The provider is required to notify all observers of OnItemsAvailable when the @@ -23,6 +25,8 @@ class OfflineContentProvider { public: using OfflineItemList = std::vector<OfflineItem>; + using VisualsCallback = + base::Callback<void(const ContentId&, const OfflineItemVisuals*)>; // An observer class that should be notified of relevant changes to the // underlying data source. @@ -44,6 +48,7 @@ // Called when the contents of |item| have been updated and the UI should be // refreshed for that item. + // TODO(dtrainor): Make this take a list of OfflineItems. virtual void OnItemUpdated(const OfflineItem& item) = 0; protected: @@ -79,6 +84,13 @@ // Returns all OfflineItems for this particular provider. virtual OfflineItemList GetAllItems() = 0; + // Asks for an OfflineItemVisuals struct for an OfflineItem represented by + // |id| or |nullptr| if one doesn't exist. The implementer should post any + // replies even if the results are available immediately to prevent reentrancy + // and for consistent behavior. + virtual void GetVisualsForItem(const ContentId& id, + const VisualsCallback& callback) = 0; + // Adds an observer that should be notified of OfflineItem list modifications. // If the provider is already initialized OnItemsAvailable should be scheduled // on this observer (suggested over calling the method directly to avoid
diff --git a/components/offline_items_collection/core/offline_item.cc b/components/offline_items_collection/core/offline_item.cc index 9506bcf7..834938d 100644 --- a/components/offline_items_collection/core/offline_item.cc +++ b/components/offline_items_collection/core/offline_item.cc
@@ -69,4 +69,9 @@ time_remaining_ms == offline_item.time_remaining_ms; } +OfflineItemVisuals::OfflineItemVisuals() = default; +OfflineItemVisuals::OfflineItemVisuals(const OfflineItemVisuals& other) = + default; +OfflineItemVisuals::~OfflineItemVisuals() = default; + } // namespace offline_items_collection
diff --git a/components/offline_items_collection/core/offline_item.h b/components/offline_items_collection/core/offline_item.h index 5c98e94..c588253 100644 --- a/components/offline_items_collection/core/offline_item.h +++ b/components/offline_items_collection/core/offline_item.h
@@ -10,6 +10,7 @@ #include "base/time/time.h" #include "components/offline_items_collection/core/offline_item_filter.h" #include "components/offline_items_collection/core/offline_item_state.h" +#include "ui/gfx/image/image.h" #include "url/gurl.h" namespace offline_items_collection { @@ -133,6 +134,27 @@ int64_t time_remaining_ms; }; +// This struct holds any potentially expensive visuals for an OfflineItem. If +// the front end requires the visuals it will ask for them through the +// OfflineContentProvider interface asynchronously to give the backend time to +// generate them if necessary. +// +// It is not expected that these will change. Currently the UI might cache the +// results of this call. +// TODO(dtrainor): If we run into a scenario where this changes, add a way for +// an OfflineItem update to let us know about an update to the visuals. +struct OfflineItemVisuals { + OfflineItemVisuals(); + OfflineItemVisuals(const OfflineItemVisuals& other); + + ~OfflineItemVisuals(); + + // The icon to use for displaying this item. The icon should be 64dp x 64dp. + // TODO(dtrainor): Suggest icon size based on the icon size supported by the + // current OS. + gfx::Image icon; +}; + } // namespace offline_items_collection #endif // COMPONENTS_OFFLINE_ITEMS_COLLECTION_OFFLINE_ITEM_H_
diff --git a/components/offline_items_collection/core/test_support/mock_offline_content_provider.h b/components/offline_items_collection/core/test_support/mock_offline_content_provider.h index 5e4e0d59..c0c49a4 100644 --- a/components/offline_items_collection/core/test_support/mock_offline_content_provider.h +++ b/components/offline_items_collection/core/test_support/mock_offline_content_provider.h
@@ -44,6 +44,8 @@ MOCK_METHOD1(PauseDownload, void(const ContentId&)); MOCK_METHOD1(ResumeDownload, void(const ContentId&)); MOCK_METHOD1(GetItemById, const OfflineItem*(const ContentId&)); + MOCK_METHOD2(GetVisualsForItem, + void(const ContentId&, const VisualsCallback&)); MOCK_METHOD0(GetAllItems, OfflineItemList()); void AddObserver(Observer* observer) override; void RemoveObserver(Observer* observer) override;
diff --git a/components/offline_items_collection/core/throttled_offline_content_provider.cc b/components/offline_items_collection/core/throttled_offline_content_provider.cc index 1b534c84..ff5b16f 100644 --- a/components/offline_items_collection/core/throttled_offline_content_provider.cc +++ b/components/offline_items_collection/core/throttled_offline_content_provider.cc
@@ -77,6 +77,12 @@ return items; } +void ThrottledOfflineContentProvider::GetVisualsForItem( + const ContentId& id, + const VisualsCallback& callback) { + wrapped_provider_->GetVisualsForItem(id, callback); +} + void ThrottledOfflineContentProvider::AddObserver( OfflineContentProvider::Observer* observer) { DCHECK(observer);
diff --git a/components/offline_items_collection/core/throttled_offline_content_provider.h b/components/offline_items_collection/core/throttled_offline_content_provider.h index b704ffb..ca6b6d6 100644 --- a/components/offline_items_collection/core/throttled_offline_content_provider.h +++ b/components/offline_items_collection/core/throttled_offline_content_provider.h
@@ -43,6 +43,8 @@ // the future. const OfflineItem* GetItemById(const ContentId& id) override; OfflineItemList GetAllItems() override; + void GetVisualsForItem(const ContentId& id, + const VisualsCallback& callback) override; void AddObserver(OfflineContentProvider::Observer* observer) override; void RemoveObserver(OfflineContentProvider::Observer* observer) override;
diff --git a/components/offline_items_collection/core/throttled_offline_content_provider_unittest.cc b/components/offline_items_collection/core/throttled_offline_content_provider_unittest.cc index 414247b..912e930 100644 --- a/components/offline_items_collection/core/throttled_offline_content_provider_unittest.cc +++ b/components/offline_items_collection/core/throttled_offline_content_provider_unittest.cc
@@ -105,15 +105,16 @@ EXPECT_CALL(wrapped_provider_, CancelDownload(id)); EXPECT_CALL(wrapped_provider_, PauseDownload(id)); EXPECT_CALL(wrapped_provider_, ResumeDownload(id)); + EXPECT_CALL(wrapped_provider_, GetVisualsForItem(id, _)); EXPECT_CALL(wrapped_provider_, GetItemById(id)).WillRepeatedly(Return(&item)); EXPECT_CALL(wrapped_provider_, GetAllItems()).WillRepeatedly(Return(items)); - wrapped_provider_.NotifyOnItemsAvailable(); provider_.OpenItem(id); provider_.RemoveItem(id); provider_.CancelDownload(id); provider_.PauseDownload(id); provider_.ResumeDownload(id); + provider_.GetVisualsForItem(id, OfflineContentProvider::VisualsCallback()); EXPECT_EQ(&item, provider_.GetItemById(id)); EXPECT_EQ(items, provider_.GetAllItems()); }
diff --git a/components/sync/android/java/src/org/chromium/components/sync/SyncConstants.java b/components/sync/android/java/src/org/chromium/components/sync/SyncConstants.java index 3491726..6b639dfa8 100644 --- a/components/sync/android/java/src/org/chromium/components/sync/SyncConstants.java +++ b/components/sync/android/java/src/org/chromium/components/sync/SyncConstants.java
@@ -10,5 +10,8 @@ public static final String CHROME_SYNC_OAUTH2_SCOPE = "https://www.googleapis.com/auth/chromesync"; + // This should always have the same value as TabNodePool::kInvalidTabNodeID. + public static final int INVALID_TAB_NODE_ID = -1; + private SyncConstants() {} }
diff --git a/components/sync_sessions/sessions_sync_manager.cc b/components/sync_sessions/sessions_sync_manager.cc index 665929f..f37c1b3 100644 --- a/components/sync_sessions/sessions_sync_manager.cc +++ b/components/sync_sessions/sessions_sync_manager.cc
@@ -110,6 +110,27 @@ return true; } +SyncedSession::DeviceType ProtoDeviceTypeToSyncedSessionDeviceType( + sync_pb::SyncEnums::DeviceType proto_device_type) { + switch (proto_device_type) { + case sync_pb::SyncEnums_DeviceType_TYPE_WIN: + return SyncedSession::TYPE_WIN; + case sync_pb::SyncEnums_DeviceType_TYPE_MAC: + return SyncedSession::TYPE_MACOSX; + case sync_pb::SyncEnums_DeviceType_TYPE_LINUX: + return SyncedSession::TYPE_LINUX; + case sync_pb::SyncEnums_DeviceType_TYPE_CROS: + return SyncedSession::TYPE_CHROMEOS; + case sync_pb::SyncEnums_DeviceType_TYPE_PHONE: + return SyncedSession::TYPE_PHONE; + case sync_pb::SyncEnums_DeviceType_TYPE_TABLET: + return SyncedSession::TYPE_TABLET; + case sync_pb::SyncEnums_DeviceType_TYPE_OTHER: + return SyncedSession::TYPE_OTHER; + } + return SyncedSession::TYPE_OTHER; +} + } // namespace // |local_device| is owned by ProfileSyncService, its lifetime exceeds @@ -229,115 +250,152 @@ void SessionsSyncManager::AssociateWindows( ReloadTabsOption option, syncer::SyncChangeList* change_output) { - const std::string local_tag = current_machine_tag(); - sync_pb::SessionSpecifics specifics; - specifics.set_session_tag(local_tag); - sync_pb::SessionHeader* header_s = specifics.mutable_header(); - SyncedSession* current_session = session_tracker_.GetSession(local_tag); - current_session->modified_time = base::Time::Now(); - header_s->set_client_name(current_session_name_); - header_s->set_device_type(current_device_type_); + // Note that |current_session| is a pointer owned by |session_tracker_|. + // |session_tracker_| will continue to update |current_session| under + // the hood so care must be taken accessing it. In particular, invoking + // ResetSessionTracking(..) will invalidate all the tab data within + // the session, hence why copies of the SyncedSession must be made ahead of + // time. + SyncedSession* current_session = + session_tracker_.GetSession(current_machine_tag()); + current_session->session_name = current_session_name_; + current_session->device_type = + ProtoDeviceTypeToSyncedSessionDeviceType(current_device_type_); + current_session->session_tag = current_machine_tag(); - session_tracker_.ResetSessionTracking(local_tag); SyncedWindowDelegatesGetter::SyncedWindowDelegateMap windows = synced_window_delegates_getter()->GetSyncedWindowDelegates(); - if (option == RELOAD_TABS) { - UMA_HISTOGRAM_COUNTS("Sync.SessionWindows", windows.size()); + // On Android, it's possible to not have any tabbed windows if this is a cold + // start triggered for a custom tab. In that case, the previous session must + // be restored, otherwise it will be lost. On the other hand, if there is at + // least one tabbed window open, it's safe to overwrite the previous session + // entirely. See crbug.com/639009 for more info. + bool found_tabbed_window = false; + for (auto& window_iter_pair : windows) { + if (window_iter_pair.second->IsTypeTabbed()) + found_tabbed_window = true; } - if (windows.size() == 0) { - // Assume that the window hasn't loaded. Attempting to associate now would - // clobber any old windows, so just return. - LOG(ERROR) << "No windows present, see crbug.com/639009"; - return; + + if (found_tabbed_window) { + // Just reset the session tracking. No need to worry about the previous + // session; the current tabbed windows are now the source of truth. + session_tracker_.ResetSessionTracking(current_machine_tag()); + current_session->modified_time = base::Time::Now(); + } else { + DVLOG(1) << "Found no tabbed windows. Reloading " + << current_session->windows.size() + << " windows from previous session."; + + // A copy of the specifics must be made because |current_session| will be + // updated in place and therefore can't be relied on as the source of truth. + sync_pb::SessionHeader header_specifics; + header_specifics.CopyFrom(current_session->ToSessionHeaderProto()); + session_tracker_.ResetSessionTracking(current_machine_tag()); + PopulateSyncedSessionFromSpecifics(current_machine_tag(), header_specifics, + base::Time::Now(), current_session); + + // The tab entities stored in sync have outdated SessionId values. Go + // through and update them to the new SessionIds. + for (auto& win_iter : current_session->windows) { + for (auto& tab : win_iter.second->wrapped_window.tabs) { + int sync_id = TabNodePool::kInvalidTabNodeID; + if (!session_tracker_.GetTabNodeFromLocalTabId(tab->tab_id.id(), + &sync_id) || + sync_id == TabNodePool::kInvalidTabNodeID) { + continue; + } + DVLOG(1) << "Rewriting tab node " << sync_id << " with tab id " + << tab->tab_id.id(); + AppendChangeForExistingTab(sync_id, *tab, change_output); + } + } } - for (auto window_iter_pair : windows) { + + for (auto& window_iter_pair : windows) { const SyncedWindowDelegate* window_delegate = window_iter_pair.second; if (option == RELOAD_TABS) { UMA_HISTOGRAM_COUNTS("Sync.SessionTabs", window_delegate->GetTabCount()); } - // Make sure the window has tabs and a viewable window. The viewable window - // check is necessary because, for example, when a browser is closed the - // destructor is not necessarily run immediately. This means its possible - // for us to get a handle to a browser that is about to be removed. If - // the tab count is 0 or the window is null, the browser is about to be - // deleted, so we ignore it. + // Make sure the window has tabs and a viewable window. The viewable + // window check is necessary because, for example, when a browser is + // closed the destructor is not necessarily run immediately. This means + // its possible for us to get a handle to a browser that is about to be + // removed. If the tab count is 0 or the window is null, the browser is + // about to be deleted, so we ignore it. if (window_delegate->ShouldSync() && window_delegate->GetTabCount() && window_delegate->HasWindow()) { sync_pb::SessionWindow window_s; SessionID::id_type window_id = window_delegate->GetSessionId(); DVLOG(1) << "Associating window " << window_id << " with " << window_delegate->GetTabCount() << " tabs."; - window_s.set_window_id(window_id); - // Note: We don't bother to set selected tab index anymore. We still - // consume it when receiving foreign sessions, as reading it is free, but - // it triggers too many sync cycles with too little value to make setting - // it worthwhile. - if (window_delegate->IsTypeTabbed()) { - window_s.set_browser_type( - sync_pb::SessionWindow_BrowserType_TYPE_TABBED); - } else if (window_delegate->IsTypePopup()) { - window_s.set_browser_type( - sync_pb::SessionWindow_BrowserType_TYPE_POPUP); - } else { - // This is a custom tab within an app. These will not be restored on - // startup if not present. - window_s.set_browser_type( - sync_pb::SessionWindow_BrowserType_TYPE_CUSTOM_TAB); - } bool found_tabs = false; for (int j = 0; j < window_delegate->GetTabCount(); ++j) { SessionID::id_type tab_id = window_delegate->GetTabIdAt(j); SyncedTabDelegate* synced_tab = window_delegate->GetTabAt(j); - // GetTabAt can return a null tab; in that case just skip it. - if (!synced_tab) + // GetTabAt can return a null tab; in that case just skip it. Similarly, + // if for some reason the tab id is invalid, skip it. + if (!synced_tab || !ShouldSyncTabId(tab_id)) continue; - if (!ShouldSyncTabId(tab_id)) { - LOG(ERROR) << "Not syncing invalid tab with id " << tab_id; - continue; - } - // Placeholder tabs are those without WebContents, either because they // were never loaded into memory or they were evicted from memory - // (typically only on Android devices). They only have a tab id, window - // id, and a saved synced id (corresponding to the tab node id). Note - // that only placeholders have this sync id, as it's necessary to - // properly reassociate the tab with the entity that was backing it. + // (typically only on Android devices). They only have a tab id, + // window id, and a saved synced id (corresponding to the tab node + // id). Note that only placeholders have this sync id, as it's + // necessary to properly reassociate the tab with the entity that was + // backing it. if (synced_tab->IsPlaceholderTab()) { // For tabs without WebContents update the |tab_id| and |window_id|, // as it could have changed after a session restore. if (synced_tab->GetSyncId() > TabNodePool::kInvalidTabNodeID) { AssociateRestoredPlaceholderTab(*synced_tab, tab_id, window_id, change_output); + } else { + DVLOG(1) << "Placeholder tab " << tab_id << " has no sync id."; } } else if (RELOAD_TABS == option) { AssociateTab(synced_tab, change_output); } // If the tab was syncable, it would have been added to the tracker - // either by the above Associate[RestoredPlaceholder]Tab call or by the - // OnLocalTabModified method invoking AssociateTab directly. Therefore, - // we can key whether this window has valid tabs based on the tab's - // presence in the tracker. + // either by the above Associate[RestoredPlaceholder]Tab call or by + // the OnLocalTabModified method invoking AssociateTab directly. + // Therefore, we can key whether this window has valid tabs based on + // the tab's presence in the tracker. const sessions::SessionTab* tab = nullptr; - if (session_tracker_.LookupSessionTab(local_tag, tab_id, &tab)) { + if (session_tracker_.LookupSessionTab(current_machine_tag(), tab_id, + &tab)) { found_tabs = true; - window_s.add_tab(tab_id); + + // Update this window's representation in the synced session tracker. + // This is a no-op if called multiple times. + session_tracker_.PutWindowInSession(current_machine_tag(), window_id); + + // Put the tab in the window (must happen after the window is added + // to the session). + session_tracker_.PutTabInWindow(current_machine_tag(), window_id, + tab_id); } } if (found_tabs) { - sync_pb::SessionWindow* header_window = header_s->add_window(); - *header_window = window_s; - - // Update this window's representation in the synced session tracker. - session_tracker_.PutWindowInSession(local_tag, window_id); - BuildSyncedSessionFromSpecifics( - local_tag, window_s, current_session->modified_time, - current_session->windows[window_id].get()); + SyncedSessionWindow* synced_session_window = + current_session->windows[window_id].get(); + if (window_delegate->IsTypeTabbed()) { + synced_session_window->window_type = + sync_pb::SessionWindow_BrowserType_TYPE_TABBED; + } else if (window_delegate->IsTypePopup()) { + synced_session_window->window_type = + sync_pb::SessionWindow_BrowserType_TYPE_POPUP; + } else { + // This is a custom tab within an app. These will not be restored on + // startup if not present. + synced_session_window->window_type = + sync_pb::SessionWindow_BrowserType_TYPE_CUSTOM_TAB; + } } } } @@ -350,7 +408,9 @@ // if the entity specifics are identical (i.e windows, client name did // not change). sync_pb::EntitySpecifics entity; - entity.mutable_session()->CopyFrom(specifics); + entity.mutable_session()->set_session_tag(current_machine_tag()); + entity.mutable_session()->mutable_header()->CopyFrom( + current_session->ToSessionHeaderProto()); syncer::SyncData data = syncer::SyncData::CreateLocalData( current_machine_tag(), current_session_name_, entity); change_output->push_back( @@ -375,10 +435,17 @@ << tab_delegate->GetWindowId(); int tab_node_id = TabNodePool::kInvalidTabNodeID; - bool existing_tab_node = - session_tracker_.GetTabNodeFromLocalTabId(tab_id, &tab_node_id); - CHECK_NE(TabNodePool::kInvalidTabNodeID, tab_node_id) << "crbug.com/673618"; - tab_delegate->SetSyncId(tab_node_id); + bool existing_tab_node = true; + if (session_tracker_.IsLocalTabNodeAssociated(tab_delegate->GetSyncId())) { + tab_node_id = tab_delegate->GetSyncId(); + session_tracker_.ReassociateLocalTab(tab_node_id, tab_id); + } else { + existing_tab_node = + session_tracker_.GetTabNodeFromLocalTabId(tab_id, &tab_node_id); + CHECK_NE(TabNodePool::kInvalidTabNodeID, tab_node_id) << "crbug.com/673618"; + tab_delegate->SetSyncId(tab_node_id); + } + sessions::SessionTab* session_tab = session_tracker_.GetTab(current_machine_tag(), tab_id); @@ -633,6 +700,12 @@ bool SessionsSyncManager::InitFromSyncModel( const syncer::SyncDataList& sync_data, syncer::SyncChangeList* new_changes) { + // Map of all rewritten local ids. Because ids are reset on each restart, + // and id generation happens outside of Sync, all ids from a previous local + // session must be rewritten in order to be valid. + // Key: previous session id. Value: new session id. + std::map<SessionID::id_type, SessionID::id_type> session_id_map; + bool found_current_header = false; int bad_foreign_hash_count = 0; for (syncer::SyncDataList::const_iterator it = sync_data.begin(); @@ -669,9 +742,37 @@ if (specifics.header().has_client_name()) current_session_name_ = specifics.header().client_name(); - // TODO(zea): crbug.com/639009 update the tracker with the specifics - // from the header node as well. This will be necessary to preserve - // the set of open tabs when a custom tab is opened. + // The specifics from the SyncData are immutable. Create a mutable copy + // to hold the rewritten ids. + sync_pb::SessionSpecifics rewritten_specifics(specifics); + + // Go through and generate new tab and window ids as necessary, updating + // the specifics in place. + for (auto& window : + *rewritten_specifics.mutable_header()->mutable_window()) { + session_id_map[window.window_id()] = SessionID().id(); + window.set_window_id(session_id_map[window.window_id()]); + + google::protobuf::RepeatedField<int>* tab_ids = window.mutable_tab(); + for (int i = 0; i < tab_ids->size(); i++) { + auto tab_iter = session_id_map.find(tab_ids->Get(i)); + if (tab_iter == session_id_map.end()) { + // SessionID::SessionID() automatically increments a static + // variable, forcing a new id to be generated each time. + session_id_map[tab_ids->Get(i)] = SessionID().id(); + } + *(tab_ids->Mutable(i)) = session_id_map[tab_ids->Get(i)]; + // Note: the tab id of the SessionTab will be updated when the tab + // node itself is processed. + } + } + + UpdateTrackerWithSpecifics(rewritten_specifics, + remote.GetModifiedTime()); + + DVLOG(1) << "Loaded local header and rewrote " << session_id_map.size() + << " ids."; + } else { if (specifics.has_header() || !specifics.has_tab()) { LOG(WARNING) << "Found more than one session header node with local " @@ -686,12 +787,33 @@ new_changes->push_back(tombstone); } else { // This is a valid old tab node, add it to the tracker and associate - // it. + // it (using the new tab id). DVLOG(1) << "Associating local tab " << specifics.tab().tab_id() << " with node " << specifics.tab_node_id(); - session_tracker_.ReassociateLocalTab(specifics.tab_node_id(), - specifics.tab().tab_id()); - UpdateTrackerWithSpecifics(specifics, remote.GetModifiedTime()); + + // Now file the tab under the new tab id. + SessionID::id_type new_tab_id = kInvalidTabID; + auto iter = session_id_map.find(specifics.tab().tab_id()); + if (iter != session_id_map.end()) { + new_tab_id = iter->second; + } else { + session_id_map[specifics.tab().tab_id()] = SessionID().id(); + new_tab_id = session_id_map[specifics.tab().tab_id()]; + } + DVLOG(1) << "Remapping tab " << specifics.tab().tab_id() << " to " + << new_tab_id; + + // The specifics from the SyncData are immutable. Create a mutable + // copy to hold the rewritten ids. + sync_pb::SessionSpecifics rewritten_specifics(specifics); + rewritten_specifics.mutable_tab()->set_tab_id(new_tab_id); + session_tracker_.ReassociateLocalTab( + rewritten_specifics.tab_node_id(), new_tab_id); + UpdateTrackerWithSpecifics(rewritten_specifics, + remote.GetModifiedTime()); + + session_tracker_.ReassociateLocalTab( + rewritten_specifics.tab_node_id(), new_tab_id); } } } @@ -703,7 +825,7 @@ session_tracker_.LookupAllForeignSessions(&sessions, SyncedSessionTracker::RAW); for (const auto* session : sessions) { - session_tracker_.CleanupForeignSession(session->session_tag); + session_tracker_.CleanupSession(session->session_tag); } UMA_HISTOGRAM_COUNTS_100("Sync.SessionsBadForeignHashOnMergeCount", @@ -730,27 +852,17 @@ // Load (or create) the SyncedSession object for this client. const sync_pb::SessionHeader& header = specifics.header(); - PopulateSessionHeaderFromSpecifics(header, modification_time, session); // Reset the tab/window tracking for this session (must do this before // we start calling PutWindowInSession and PutTabInWindow so that all // unused tabs/windows get cleared by the CleanupSession(...) call). session_tracker_.ResetSessionTracking(session_tag); - // Process all the windows and their tab information. - int num_windows = header.window_size(); - DVLOG(1) << "Populating " << session_tag << " with " << num_windows - << " windows."; + PopulateSyncedSessionFromSpecifics(session_tag, header, modification_time, + session); - for (int i = 0; i < num_windows; ++i) { - const sync_pb::SessionWindow& window_s = header.window(i); - SessionID::id_type window_id = window_s.window_id(); - session_tracker_.PutWindowInSession(session_tag, window_id); - BuildSyncedSessionFromSpecifics(session_tag, window_s, modification_time, - session->windows[window_id].get()); - } // Delete any closed windows and unused tabs as necessary. - session_tracker_.CleanupForeignSession(session_tag); + session_tracker_.CleanupSession(session_tag); } else if (specifics.has_tab()) { const sync_pb::SessionTab& tab_s = specifics.tab(); SessionID::id_type tab_id = tab_s.tab_id(); @@ -822,46 +934,37 @@ } } -// static -void SessionsSyncManager::PopulateSessionHeaderFromSpecifics( +void SessionsSyncManager::PopulateSyncedSessionFromSpecifics( + const std::string& session_tag, const sync_pb::SessionHeader& header_specifics, base::Time mtime, - SyncedSession* session_header) { + SyncedSession* synced_session) { if (header_specifics.has_client_name()) - session_header->session_name = header_specifics.client_name(); + synced_session->session_name = header_specifics.client_name(); if (header_specifics.has_device_type()) { - switch (header_specifics.device_type()) { - case sync_pb::SyncEnums_DeviceType_TYPE_WIN: - session_header->device_type = SyncedSession::TYPE_WIN; - break; - case sync_pb::SyncEnums_DeviceType_TYPE_MAC: - session_header->device_type = SyncedSession::TYPE_MACOSX; - break; - case sync_pb::SyncEnums_DeviceType_TYPE_LINUX: - session_header->device_type = SyncedSession::TYPE_LINUX; - break; - case sync_pb::SyncEnums_DeviceType_TYPE_CROS: - session_header->device_type = SyncedSession::TYPE_CHROMEOS; - break; - case sync_pb::SyncEnums_DeviceType_TYPE_PHONE: - session_header->device_type = SyncedSession::TYPE_PHONE; - break; - case sync_pb::SyncEnums_DeviceType_TYPE_TABLET: - session_header->device_type = SyncedSession::TYPE_TABLET; - break; - case sync_pb::SyncEnums_DeviceType_TYPE_OTHER: - // Intentionally fall-through - default: - session_header->device_type = SyncedSession::TYPE_OTHER; - break; - } + synced_session->device_type = ProtoDeviceTypeToSyncedSessionDeviceType( + header_specifics.device_type()); } - session_header->modified_time = - std::max(mtime, session_header->modified_time); + synced_session->modified_time = + std::max(mtime, synced_session->modified_time); + + // Process all the windows and their tab information. + int num_windows = header_specifics.window_size(); + DVLOG(1) << "Populating " << session_tag << " with " << num_windows + << " windows."; + + for (int i = 0; i < num_windows; ++i) { + const sync_pb::SessionWindow& window_s = header_specifics.window(i); + SessionID::id_type window_id = window_s.window_id(); + session_tracker_.PutWindowInSession(session_tag, window_id); + PopulateSyncedSessionWindowFromSpecifics( + session_tag, window_s, synced_session->modified_time, + synced_session->windows[window_id].get()); + } } // static -void SessionsSyncManager::BuildSyncedSessionFromSpecifics( +void SessionsSyncManager::PopulateSyncedSessionWindowFromSpecifics( const std::string& session_tag, const sync_pb::SessionWindow& specifics, base::Time mtime, @@ -1017,14 +1120,22 @@ session_tracker_.GetTab(current_machine_tag(), new_tab_id); local_tab->window_id.set_id(new_window_id); + AppendChangeForExistingTab(tab_delegate.GetSyncId(), *local_tab, + change_output); +} + +void SessionsSyncManager::AppendChangeForExistingTab( + int sync_id, + const sessions::SessionTab& tab, + syncer::SyncChangeList* change_output) { // Rewrite the specifics based on the reassociated SessionTab to preserve // the new tab and window ids. sync_pb::EntitySpecifics entity; - entity.mutable_session()->CopyFrom(SessionTabToSpecifics( - *local_tab, current_machine_tag(), tab_delegate.GetSyncId())); + entity.mutable_session()->CopyFrom( + SessionTabToSpecifics(tab, current_machine_tag(), sync_id)); syncer::SyncData data = syncer::SyncData::CreateLocalData( - TabNodeIdToTag(current_machine_tag(), tab_delegate.GetSyncId()), - current_session_name_, entity); + TabNodeIdToTag(current_machine_tag(), sync_id), current_session_name_, + entity); change_output->push_back( syncer::SyncChange(FROM_HERE, syncer::SyncChange::ACTION_UPDATE, data)); }
diff --git a/components/sync_sessions/sessions_sync_manager.h b/components/sync_sessions/sessions_sync_manager.h index bf72e9e..80706d86 100644 --- a/components/sync_sessions/sessions_sync_manager.h +++ b/components/sync_sessions/sessions_sync_manager.h
@@ -119,7 +119,7 @@ private: friend class extensions::ExtensionSessionsTest; friend class SessionsSyncManagerTest; - FRIEND_TEST_ALL_PREFIXES(SessionsSyncManagerTest, PopulateSessionHeader); + FRIEND_TEST_ALL_PREFIXES(SessionsSyncManagerTest, PopulateSyncedSession); FRIEND_TEST_ALL_PREFIXES(SessionsSyncManagerTest, PopulateSessionWindow); FRIEND_TEST_ALL_PREFIXES(SessionsSyncManagerTest, ValidTabs); FRIEND_TEST_ALL_PREFIXES(SessionsSyncManagerTest, SetSessionTabFromDelegate); @@ -187,14 +187,15 @@ // Used to populate a session header from the session specifics header // provided. - static void PopulateSessionHeaderFromSpecifics( + void PopulateSyncedSessionFromSpecifics( + const std::string& session_tag, const sync_pb::SessionHeader& header_specifics, base::Time mtime, - SyncedSession* session_header); + SyncedSession* synced_session); - // Builds |session_window| from the session specifics window + // Builds |synced_session_window| from the session specifics window // provided and updates the SessionTracker with foreign session data created. - void BuildSyncedSessionFromSpecifics( + void PopulateSyncedSessionWindowFromSpecifics( const std::string& session_tag, const sync_pb::SessionWindow& specifics, base::Time mtime, @@ -246,6 +247,12 @@ SessionID::id_type new_window_id, syncer::SyncChangeList* change_output); + // Appends an ACTION_UPDATE for a sync tab entity onto |change_output| to + // reflect the contents of |tab|, given the tab node id |sync_id|. + void AppendChangeForExistingTab(int sync_id, + const sessions::SessionTab& tab, + syncer::SyncChangeList* change_output); + // Stops and re-starts syncing to rebuild association mappings. Returns true // when re-starting succeeds. // See |local_tab_pool_out_of_sync_|.
diff --git a/components/sync_sessions/sessions_sync_manager_unittest.cc b/components/sync_sessions/sessions_sync_manager_unittest.cc index 7479a18..bc22ca115 100644 --- a/components/sync_sessions/sessions_sync_manager_unittest.cc +++ b/components/sync_sessions/sessions_sync_manager_unittest.cc
@@ -243,7 +243,7 @@ private: int current_entry_index_ = -1; bool is_supervised_ = false; - int sync_id_ = -1; + int sync_id_ = kInvalidTabID; SessionID tab_id_; SessionID window_id_; std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>> @@ -328,7 +328,7 @@ private: SessionID::id_type session_id_; - int sync_id_; + int sync_id_ = kInvalidTabID; }; class TestSyncedWindowDelegate : public SyncedWindowDelegate { @@ -358,6 +358,10 @@ return false; } + void OverrideWindowTypeToCustomTab() { + window_type_ = sync_pb::SessionWindow_BrowserType_TYPE_CUSTOM_TAB; + } + SyncedTabDelegate* GetTabAt(int index) const override { if (tab_delegates_.find(index) != tab_delegates_.end()) return tab_delegates_.find(index)->second; @@ -387,6 +391,8 @@ SessionID window_id_; sync_pb::SessionWindow_BrowserType window_type_ = sync_pb::SessionWindow_BrowserType_TYPE_TABBED; + std::map<int, SyncedTabDelegate*> tab_overrides_; + std::map<int, SessionID::id_type> tab_id_overrides_; }; class TestSyncedWindowDelegatesGetter : public SyncedWindowDelegatesGetter { @@ -410,6 +416,8 @@ delegates_[delegate->GetSessionId()] = delegate; } + void ClearSyncedWindowDelegates() { delegates_.clear(); } + private: SyncedWindowDelegateMap delegates_; }; @@ -469,7 +477,7 @@ void StartRoutingTo(LocalSessionEventHandler* handler) override { handler_ = handler; } - void Stop() override {} + void Stop() override { handler_ = nullptr; } void NotifyNav(SyncedTabDelegate* tab) { if (handler_) @@ -716,12 +724,45 @@ NavigateTab(delegate, url, base::Time()); } + void ResetWindows() { + window_getter_.ClearSyncedWindowDelegates(); + windows_.clear(); + } + TestSyncedWindowDelegate* AddWindow() { windows_.push_back(base::MakeUnique<TestSyncedWindowDelegate>()); window_getter_.AddSyncedWindowDelegate(windows_.back().get()); return windows_.back().get(); } + syncer::SyncDataList GetDataFromChanges( + const syncer::SyncChangeList& changes) { + syncer::SyncDataList data_list; + for (auto& change : changes) { + syncer::SyncDataLocal change_data(change.sync_data()); + bool found = false; + for (auto&& data : data_list) { + syncer::SyncDataLocal local_data(data); + if (local_data.GetTag() == change_data.GetTag()) { + data = change.sync_data(); + found = true; + break; + } + } + if (!found) + data_list.push_back(change_data); + } + return data_list; + } + + syncer::SyncDataList ConvertToRemote(const syncer::SyncDataList& in) { + syncer::SyncDataList out; + for (auto& data : in) { + out.push_back(CreateRemoteData(data.GetSpecifics())); + } + return out; + } + private: std::unique_ptr<syncer::FakeSyncClient> sync_client_; std::unique_ptr<SyncSessionsClientShim> sessions_client_shim_; @@ -737,41 +778,6 @@ std::unique_ptr<LocalDeviceInfoProviderMock> local_device_; }; -// Test that the SyncSessionManager can properly fill in a SessionHeader. -TEST_F(SessionsSyncManagerTest, PopulateSessionHeader) { - sync_pb::SessionHeader header_s; - header_s.set_client_name("Client 1"); - header_s.set_device_type(sync_pb::SyncEnums_DeviceType_TYPE_WIN); - - SyncedSession session; - base::Time time = base::Time::Now(); - SessionsSyncManager::PopulateSessionHeaderFromSpecifics(header_s, time, - &session); - ASSERT_EQ("Client 1", session.session_name); - ASSERT_EQ(SyncedSession::TYPE_WIN, session.device_type); - ASSERT_EQ(time, session.modified_time); -} - -// Test translation between protobuf types and chrome session types. -TEST_F(SessionsSyncManagerTest, PopulateSessionWindow) { - sync_pb::SessionWindow window_s; - window_s.add_tab(0); - window_s.set_browser_type(sync_pb::SessionWindow_BrowserType_TYPE_TABBED); - window_s.set_selected_tab_index(1); - - SyncedSession* session = manager()->session_tracker_.GetSession(kTag1); - manager()->session_tracker_.PutWindowInSession(kTag1, 0); - manager()->BuildSyncedSessionFromSpecifics(kTag1, window_s, base::Time(), - session->windows[0].get()); - ASSERT_EQ(1U, session->windows[0]->wrapped_window.tabs.size()); - ASSERT_EQ(1, session->windows[0]->wrapped_window.selected_tab_index); - ASSERT_EQ(sessions::SessionWindow::TYPE_TABBED, - session->windows[0]->wrapped_window.type); - ASSERT_EQ(1U, manager()->session_tracker_.num_synced_sessions()); - ASSERT_EQ(1U, manager()->session_tracker_.num_synced_tabs(kTag1)); -} - -// Populate the fake tab delegate with some data and navigation // entries and make sure that setting a SessionTab from it preserves // those entries (and clobbers any existing data). TEST_F(SessionsSyncManagerTest, SetSessionTabFromDelegate) { @@ -952,6 +958,117 @@ EXPECT_TRUE(out[0].sync_data().GetSpecifics().session().has_header()); } +// Ensure that tabbed windows from a previous session are preserved if no +// windows are present on startup. +TEST_F(SessionsSyncManagerTest, PreserveTabbedDataNoWindows) { + syncer::SyncDataList in; + syncer::SyncChangeList out; + + // Set up one tab and start sync with it. + TestSyncedTabDelegate* tab = AddTab(AddWindow()->GetSessionId(), kFoo1); + NavigateTab(tab, kFoo2); + InitWithSyncDataTakeOutput(in, &out); + + // There should be two entities, a header and a tab. + in = GetDataFromChanges(out); + out.clear(); + ASSERT_EQ(2U, in.size()); + + // Resync, using the previous sync data, but with no windows open now. + manager()->StopSyncing(syncer::SESSIONS); + ResetWindows(); + InitWithSyncDataTakeOutput(ConvertToRemote(in), &out); + + // There should be two changes: the rewritten tab (to update the tab id), and + // the rewritten header. + ASSERT_TRUE(ChangeTypeMatches( + out, {SyncChange::ACTION_UPDATE, SyncChange::ACTION_UPDATE})); + VerifyLocalTabChange(out[0], 2, kFoo2); + VerifyLocalHeaderChange(out[1], 1, 1); + + // Verify the tab id of the restored tab is updated and consistent. + int restored_tab_id = + out[0].sync_data().GetSpecifics().session().tab().tab_id(); + // SessionId should be rewritten on restore. + ASSERT_NE(tab->GetSessionId(), restored_tab_id); + ASSERT_EQ( + restored_tab_id, + out[1].sync_data().GetSpecifics().session().header().window(0).tab(0)); +} + +// Ensure that tabbed windows from a previous session are preserved if only +// transient windows are present at startup. +TEST_F(SessionsSyncManagerTest, PreserveTabbedDataCustomTab) { + syncer::SyncDataList in; + syncer::SyncChangeList out; + + // Set up one tab and start sync with it. + TestSyncedWindowDelegate* window = AddWindow(); + TestSyncedTabDelegate* tab = AddTab(window->GetSessionId(), kFoo1); + NavigateTab(tab, kFoo2); + InitWithSyncDataTakeOutput(in, &out); + + // There should be two entities, a header and a tab. + in = GetDataFromChanges(out); + out.clear(); + ASSERT_EQ(2U, in.size()); + + // Resync, using the previous sync data, but with only a custom tab open. + manager()->StopSyncing(syncer::SESSIONS); + window->OverrideWindowTypeToCustomTab(); + SessionID new_window_id; + window->OverrideWindowId(new_window_id.id()); + std::unique_ptr<TestSyncedTabDelegate> custom_tab = + base::MakeUnique<TestSyncedTabDelegate>(); + NavigateTab(custom_tab.get(), kBar1); + window->OverrideTabAt(0, custom_tab.get()); + InitWithSyncDataTakeOutput(ConvertToRemote(in), &out); + + // The previous session should be preserved, and the transient window should + // be synced as a new transient window. This means that the original tab + // node will be updated with its new tab id, a new tab node will be created, + // and the header will be updated to reflect the two windows and two tabs. + ASSERT_TRUE( + ChangeTypeMatches(out, {SyncChange::ACTION_UPDATE, SyncChange::ACTION_ADD, + SyncChange::ACTION_UPDATE})); + VerifyLocalTabChange(out[0], 2, kFoo2); + VerifyLocalTabChange(out[1], 1, kBar1); + VerifyLocalHeaderChange(out[2], 2, 2); + + // The two windows should have different window types. + ASSERT_EQ(sync_pb::SessionWindow::TYPE_CUSTOM_TAB, out[2] + .sync_data() + .GetSpecifics() + .session() + .header() + .window(0) + .browser_type()); + ASSERT_EQ(sync_pb::SessionWindow::TYPE_TABBED, out[2] + .sync_data() + .GetSpecifics() + .session() + .header() + .window(1) + .browser_type()); + + // Verify the tab id of the restored tab is updated and consistent. + int restored_tab_id = + out[0].sync_data().GetSpecifics().session().tab().tab_id(); + // SessionId should be rewritten on restore. + ASSERT_NE(tab->GetSessionId(), restored_tab_id); + ASSERT_EQ( + restored_tab_id, + out[2].sync_data().GetSpecifics().session().header().window(1).tab(0)); + + // Verify the tab id of the custom tab is consistent. + int custom_tab_id = + out[1].sync_data().GetSpecifics().session().tab().tab_id(); + ASSERT_EQ(custom_tab->GetSessionId(), custom_tab_id); + ASSERT_EQ( + custom_tab_id, + out[2].sync_data().GetSpecifics().session().header().window(0).tab(0)); +} + // Tests MergeDataAndStartSyncing with sync data but no local data. TEST_F(SessionsSyncManagerTest, MergeWithInitialForeignSession) { std::vector<SessionID::id_type> tab_list1(std::begin(kTabIds1), @@ -1582,9 +1699,9 @@ sync_pb::SessionSpecifics new_tab( changes[1].sync_data().GetSpecifics().session()); new_tab.set_tab_node_id(tab_node_id + 1); - in.push_back(CreateRemoteData(new_tab)); // New tab node. in.push_back(CreateRemoteData( changes[1].sync_data().GetSpecifics())); // Old tab node. + in.push_back(CreateRemoteData(new_tab)); // New tab node. changes.clear(); // Reassociate (with the same single tab/window open). @@ -2396,12 +2513,12 @@ // The tab entity will be overwritten twice. Once with the information for // tab 1 and then again with the information for tab 2. This will be followed - // by a header change reflecting both tabs. + // by a header change reflecting only the final tab. ASSERT_TRUE( ChangeTypeMatches(out, {SyncChange::ACTION_UPDATE, SyncChange::ACTION_UPDATE, SyncChange::ACTION_UPDATE})); - VerifyLocalHeaderChange(out[2], 2, 2); + VerifyLocalHeaderChange(out[2], 2, 1); VerifyLocalTabChange(out[0], 1, kFoo1); EXPECT_EQ(sync_id, out[0].sync_data().GetSpecifics().session().tab_node_id()); EXPECT_EQ(tab1->GetSessionId(),
diff --git a/components/sync_sessions/synced_session_tracker.cc b/components/sync_sessions/synced_session_tracker.cc index 94e6e9ff..1b61004 100644 --- a/components/sync_sessions/synced_session_tracker.cc +++ b/components/sync_sessions/synced_session_tracker.cc
@@ -221,6 +221,12 @@ void SyncedSessionTracker::PutWindowInSession(const std::string& session_tag, SessionID::id_type window_id) { + if (GetSession(session_tag)->windows.find(window_id) != + GetSession(session_tag)->windows.end()) { + DVLOG(1) << "Window " << window_id << " already added to session " + << session_tag; + return; + } std::unique_ptr<SyncedSessionWindow> window; auto iter = unmapped_windows_[session_tag].find(window_id); @@ -345,9 +351,7 @@ return tab_ptr; } -void SyncedSessionTracker::CleanupForeignSession( - const std::string& session_tag) { - DCHECK_NE(local_session_tag_, session_tag); +void SyncedSessionTracker::CleanupSession(const std::string& session_tag) { CleanupSessionImpl(session_tag); } @@ -365,13 +369,11 @@ bool SyncedSessionTracker::GetTabNodeFromLocalTabId(SessionID::id_type tab_id, int* tab_node_id) { DCHECK(!local_session_tag_.empty()); - // Ensure a placeholder SessionTab is in place, if not already. - // Although we don't need a SessionTab to fulfill this request, this forces - // the - // creation of one if it doesn't already exist. This helps to make sure we're - // tracking this |tab_id| if |local_tab_pool_| is, and everyone's data - // structures - // are kept in sync and as consistent as possible. + // Ensure a placeholder SessionTab is in place, if not already. Although we + // don't need a SessionTab to fulfill this request, this forces the creation + // of one if it doesn't already exist. This helps to make sure we're tracking + // this |tab_id| if |local_tab_pool_| is, and everyone's data structures are + // kept in sync and as consistent as possible. GetTab(local_session_tag_, tab_id); // Ignore result. bool reused_existing_tab =
diff --git a/components/sync_sessions/synced_session_tracker.h b/components/sync_sessions/synced_session_tracker.h index 506d3d0..f032479 100644 --- a/components/sync_sessions/synced_session_tracker.h +++ b/components/sync_sessions/synced_session_tracker.h
@@ -96,10 +96,15 @@ // tabs not owned. void ResetSessionTracking(const std::string& session_tag); + // Deletes those windows and tabs associated with |session_tag| that are no + // longer owned. See ResetSessionTracking(...).. + void CleanupSession(const std::string& session_tag); + // Adds the window with id |window_id| to the session specified by // |session_tag|. If none existed for that session, creates one. Similarly, if // the session did not exist yet, creates it. Ownership of the SessionWindow // remains within the SyncedSessionTracker. + // Attempting to add a window to a session multiple times will have no effect. void PutWindowInSession(const std::string& session_tag, SessionID::id_type window_id); @@ -145,10 +150,6 @@ // Returns true if the session existed and was deleted, false otherwise. bool DeleteForeignSession(const std::string& session_tag); - // Deletes those windows and tabs associated with |session_tag| that are no - // longer owned. See ResetSessionTracking(...).. - void CleanupForeignSession(const std::string& session_tag); - // **** Methods specific to the local session. **** // Set the local session tag. Must be called before any other local session
diff --git a/components/sync_sessions/synced_session_tracker_unittest.cc b/components/sync_sessions/synced_session_tracker_unittest.cc index 9da19516..04cc0fd 100644 --- a/components/sync_sessions/synced_session_tracker_unittest.cc +++ b/components/sync_sessions/synced_session_tracker_unittest.cc
@@ -61,6 +61,10 @@ GetTracker()->PutWindowInSession(kTag, 0); SyncedSession* session = GetTracker()->GetSession(kTag); ASSERT_EQ(1U, session->windows.size()); + + // Doing it again should have no effect. + GetTracker()->PutWindowInSession(kTag, 0); + ASSERT_EQ(1U, session->windows.size()); // Should clean up memory on its own. } @@ -324,7 +328,7 @@ // Window 1 was closed, along with tab 5. GetTracker()->PutTabInWindow(kTag, 0, 6); // No longer unmapped. // Session 2 should not be affected. - GetTracker()->CleanupForeignSession(kTag); + GetTracker()->CleanupSession(kTag); // Verify that only those parts of the session not owned have been removed. ASSERT_EQ(1U, session1->windows.size()); @@ -560,4 +564,38 @@ ASSERT_EQ(1U, GetTabNodePool()->Capacity()); } +TEST_F(SyncedSessionTrackerTest, ReassociateTabMapMismatch) { + std::set<int> free_node_ids; + + // First create the old tab in an unmapped state. + GetTracker()->SetLocalSessionTag(kTag); + EXPECT_FALSE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); + GetTracker()->ReassociateLocalTab(kTabNode, kTab1); + EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); + EXPECT_TRUE(GetTracker()->IsTabUnmappedForTesting(kTab1)); + + // Map an unseen tab to a window, then reassociate the existing tab to the + // mapped tab id. + GetTracker()->ResetSessionTracking(kTag); + EXPECT_TRUE(GetTracker()->IsLocalTabNodeAssociated(kTabNode)); + GetTracker()->PutWindowInSession(kTag, kWindow1); + GetTracker()->PutTabInWindow(kTag, kWindow1, kTab2); + GetTracker()->CleanupLocalTabs(&free_node_ids); + EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); + EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); + GetTracker()->ReassociateLocalTab(kTabNode, kTab2); + EXPECT_TRUE(free_node_ids.empty()); + EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab1)); + EXPECT_FALSE(GetTracker()->IsTabUnmappedForTesting(kTab2)); + + // Now that it's been mapped, it should be accessible both via the + // GetSession as well as GetTab. + SyncedSession* session = GetTracker()->GetSession(kTag); + ASSERT_EQ(GetTracker()->GetTab(kTag, kTab2), + session->windows[kWindow1]->wrapped_window.tabs[0].get()); + ASSERT_EQ(session->tab_node_ids.size(), + session->tab_node_ids.count(kTabNode)); + ASSERT_EQ(1U, GetTabNodePool()->Capacity()); +} + } // namespace sync_sessions
diff --git a/content/browser/DEPS b/content/browser/DEPS index 84b453a3..391e781 100644 --- a/content/browser/DEPS +++ b/content/browser/DEPS
@@ -66,8 +66,6 @@ "+third_party/WebKit/public/platform/WebDragOperation.h", "+third_party/WebKit/public/platform/WebFeaturePolicy.h", "+third_party/WebKit/public/platform/WebFocusType.h", - "+third_party/WebKit/public/platform/WebGamepad.h", - "+third_party/WebKit/public/platform/WebGamepads.h", "+third_party/WebKit/public/platform/WebGestureEvent.h", "+third_party/WebKit/public/platform/WebInputEvent.h", "+third_party/WebKit/public/platform/WebInsecureRequestPolicy.h",
diff --git a/content/browser/child_process_launcher_helper_android.cc b/content/browser/child_process_launcher_helper_android.cc index e6e9341a..a46f2c4 100644 --- a/content/browser/child_process_launcher_helper_android.cc +++ b/content/browser/child_process_launcher_helper_android.cc
@@ -34,6 +34,7 @@ // Stops a child process based on the handle returned from StartChildProcess. void StopChildProcess(base::ProcessHandle handle) { + DCHECK_CURRENTLY_ON(BrowserThread::PROCESS_LAUNCHER); JNIEnv* env = AttachCurrentThread(); DCHECK(env); Java_ChildProcessLauncherHelper_stop(env, static_cast<jint>(handle)); @@ -159,7 +160,8 @@ // static bool ChildProcessLauncherHelper::TerminateProcess( const base::Process& process, int exit_code, bool wait) { - StopChildProcess(process.Handle()); + BrowserThread::PostTask(BrowserThread::PROCESS_LAUNCHER, FROM_HERE, + base::Bind(&StopChildProcess, process.Handle())); return true; }
diff --git a/content/browser/renderer_host/pepper/pepper_gamepad_host.h b/content/browser/renderer_host/pepper/pepper_gamepad_host.h index 6cc2422..c341091f 100644 --- a/content/browser/renderer_host/pepper/pepper_gamepad_host.h +++ b/content/browser/renderer_host/pepper/pepper_gamepad_host.h
@@ -51,9 +51,9 @@ // GamepadConsumer implementation. void OnGamepadConnected(unsigned index, - const blink::WebGamepad& gamepad) override {} + const device::Gamepad& gamepad) override {} void OnGamepadDisconnected(unsigned index, - const blink::WebGamepad& gamepad) override {} + const device::Gamepad& gamepad) override {} private: int32_t OnRequestMemory(ppapi::host::HostMessageContext* context);
diff --git a/content/browser/renderer_host/pepper/pepper_gamepad_host_unittest.cc b/content/browser/renderer_host/pepper/pepper_gamepad_host_unittest.cc index 472a1a7..fa5ef9ee 100644 --- a/content/browser/renderer_host/pepper/pepper_gamepad_host_unittest.cc +++ b/content/browser/renderer_host/pepper/pepper_gamepad_host_unittest.cc
@@ -34,7 +34,7 @@ PepperGamepadHostTest() {} ~PepperGamepadHostTest() override {} - void ConstructService(const blink::WebGamepads& test_data) { + void ConstructService(const device::Gamepads& test_data) { service_.reset(new device::GamepadServiceTestConstructor(test_data)); } @@ -72,13 +72,13 @@ TEST_F(PepperGamepadHostTest, ValidateGamepadsMatch) { // Gamepads. - static_assert(sizeof(ppapi::WebKitGamepads) == sizeof(blink::WebGamepads), + static_assert(sizeof(ppapi::WebKitGamepads) == sizeof(device::Gamepads), "gamepads data must match"); ppapi::WebKitGamepads ppapi_gamepads; - blink::WebGamepads web_gamepads; + device::Gamepads web_gamepads; // See comment below on storage & the EXPECT macro. - size_t webkit_items_length_cap = blink::WebGamepads::kItemsLengthCap; + size_t webkit_items_length_cap = device::Gamepads::kItemsLengthCap; size_t ppapi_items_length_cap = ppapi::WebKitGamepads::kItemsLengthCap; EXPECT_EQ(webkit_items_length_cap, ppapi_items_length_cap); @@ -90,23 +90,23 @@ TEST_F(PepperGamepadHostTest, ValidateGamepadMatch) { // Gamepad. - static_assert(sizeof(ppapi::WebKitGamepad) == sizeof(blink::WebGamepad), + static_assert(sizeof(ppapi::WebKitGamepad) == sizeof(device::Gamepad), "gamepad data must match"); ppapi::WebKitGamepad ppapi_gamepad; - blink::WebGamepad web_gamepad; + device::Gamepad web_gamepad; // Using EXPECT seems to force storage for the parameter, which the constants // in the WebKit/PPAPI headers don't have. So we have to use temporaries // before comparing them. - size_t webkit_id_length_cap = blink::WebGamepad::kIdLengthCap; + size_t webkit_id_length_cap = device::Gamepad::kIdLengthCap; size_t ppapi_id_length_cap = ppapi::WebKitGamepad::kIdLengthCap; EXPECT_EQ(webkit_id_length_cap, ppapi_id_length_cap); - size_t webkit_axes_length_cap = blink::WebGamepad::kAxesLengthCap; + size_t webkit_axes_length_cap = device::Gamepad::kAxesLengthCap; size_t ppapi_axes_length_cap = ppapi::WebKitGamepad::kAxesLengthCap; EXPECT_EQ(webkit_axes_length_cap, ppapi_axes_length_cap); - size_t webkit_buttons_length_cap = blink::WebGamepad::kButtonsLengthCap; + size_t webkit_buttons_length_cap = device::Gamepad::kButtonsLengthCap; size_t ppapi_buttons_length_cap = ppapi::WebKitGamepad::kButtonsLengthCap; EXPECT_EQ(webkit_buttons_length_cap, ppapi_buttons_length_cap); @@ -127,8 +127,8 @@ } TEST_F(PepperGamepadHostTest, WaitForReply) { - blink::WebGamepads default_data; - memset(&default_data, 0, sizeof(blink::WebGamepads)); + device::Gamepads default_data; + memset(&default_data, 0, sizeof(device::Gamepads)); default_data.items[0].connected = true; default_data.items[0].buttons_length = 1; ConstructService(default_data); @@ -153,7 +153,7 @@ EXPECT_EQ(0u, sink().message_count()); // Set a button down and wait for it to be read twice. - blink::WebGamepads button_down_data = default_data; + device::Gamepads button_down_data = default_data; button_down_data.items[0].buttons[0].value = 1.f; button_down_data.items[0].buttons[0].pressed = true; fetcher->SetTestData(button_down_data);
diff --git a/content/common/DEPS b/content/common/DEPS index 48fd8c4..78ec7ec7 100644 --- a/content/common/DEPS +++ b/content/common/DEPS
@@ -19,8 +19,6 @@ "+third_party/WebKit/public/platform/WebFloatPoint.h", "+third_party/WebKit/public/platform/WebFloatRect.h", "+third_party/WebKit/public/platform/WebFocusType.h", - "+third_party/WebKit/public/platform/WebGamepad.h", - "+third_party/WebKit/public/platform/WebGamepads.h", "+third_party/WebKit/public/platform/WebGestureEvent.h", "+third_party/WebKit/public/platform/WebHTTPBody.h", "+third_party/WebKit/public/platform/WebHistoryScrollRestorationType.h",
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildConnectionAllocator.java b/content/public/android/java/src/org/chromium/content/browser/ChildConnectionAllocator.java index 2587232..56230dda 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ChildConnectionAllocator.java +++ b/content/public/android/java/src/org/chromium/content/browser/ChildConnectionAllocator.java
@@ -13,16 +13,15 @@ import org.chromium.base.Log; import org.chromium.base.VisibleForTesting; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.content.app.PrivilegedProcessService; import org.chromium.content.app.SandboxedProcessService; import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; -import java.util.concurrent.ConcurrentHashMap; - -import javax.annotation.concurrent.GuardedBy; /** * This class is responsible for allocating and managing connections to child @@ -39,14 +38,10 @@ private static final String SANDBOXED_SERVICES_NAME_KEY = "org.chromium.content.browser.SANDBOXED_SERVICES_NAME"; - private static final Object sAllocatorLock = new Object(); - // Map from package name to ChildConnectionAllocator. - @GuardedBy("sAllocatorLock") private static Map<String, ChildConnectionAllocator> sSandboxedChildConnectionAllocatorMap; // Allocator used for non-sandboxed services. - @GuardedBy("sAllocatorLock") private static ChildConnectionAllocator sPrivilegedChildConnectionAllocator; // Used by test to override the default sandboxed service settings. @@ -59,47 +54,42 @@ private final String mChildClassName; private final boolean mInSandbox; - private final Object mConnectionLock = new Object(); - // The list of free (not bound) service indices. - @GuardedBy("mConnectionLock") private final ArrayList<Integer> mFreeConnectionIndices; // Each Allocator keeps a queue for the pending spawn data. Once a connection is free, we // dequeue the pending spawn data from the same allocator as the connection. - @GuardedBy("mConnectionLock") private final Queue<ChildSpawnData> mPendingSpawnQueue = new LinkedList<>(); + @SuppressFBWarnings("LI_LAZY_INIT_STATIC") // Method is single thread. public static ChildConnectionAllocator getAllocator( Context context, String packageName, boolean inSandbox) { - synchronized (sAllocatorLock) { - if (!inSandbox) { - if (sPrivilegedChildConnectionAllocator == null) { - sPrivilegedChildConnectionAllocator = new ChildConnectionAllocator(false, - getNumberOfServices(context, false, packageName), - getClassNameOfService(context, false, packageName)); - } - return sPrivilegedChildConnectionAllocator; + assert LauncherThread.runningOnLauncherThread(); + if (!inSandbox) { + if (sPrivilegedChildConnectionAllocator == null) { + sPrivilegedChildConnectionAllocator = new ChildConnectionAllocator(false, + getNumberOfServices(context, false, packageName), + getClassNameOfService(context, false, packageName)); } - - if (sSandboxedChildConnectionAllocatorMap == null) { - sSandboxedChildConnectionAllocatorMap = - new ConcurrentHashMap<String, ChildConnectionAllocator>(); - } - if (!sSandboxedChildConnectionAllocatorMap.containsKey(packageName)) { - Log.w(TAG, - "Create a new ChildConnectionAllocator with package name = %s," - + " inSandbox = true", - packageName); - sSandboxedChildConnectionAllocatorMap.put(packageName, - new ChildConnectionAllocator(true, - getNumberOfServices(context, true, packageName), - getClassNameOfService(context, true, packageName))); - } - return sSandboxedChildConnectionAllocatorMap.get(packageName); - // TODO(pkotwicz|hanxi): Figure out when old allocators should be removed from - // {@code sSandboxedChildConnectionAllocatorMap}. + return sPrivilegedChildConnectionAllocator; } + + if (sSandboxedChildConnectionAllocatorMap == null) { + sSandboxedChildConnectionAllocatorMap = new HashMap<String, ChildConnectionAllocator>(); + } + if (!sSandboxedChildConnectionAllocatorMap.containsKey(packageName)) { + Log.w(TAG, + "Create a new ChildConnectionAllocator with package name = %s," + + " inSandbox = true", + packageName); + sSandboxedChildConnectionAllocatorMap.put(packageName, + new ChildConnectionAllocator(true, + getNumberOfServices(context, true, packageName), + getClassNameOfService(context, true, packageName))); + } + return sSandboxedChildConnectionAllocatorMap.get(packageName); + // TODO(pkotwicz|hanxi): Figure out when old allocators should be removed from + // {@code sSandboxedChildConnectionAllocatorMap}. } private static String getClassNameOfService( @@ -185,60 +175,56 @@ public ChildProcessConnection allocate(ChildSpawnData spawnData, ChildProcessConnection.DeathCallback deathCallback, Bundle childProcessCommonParameters, boolean queueIfNoSlotAvailable) { + assert LauncherThread.runningOnLauncherThread(); assert spawnData.isInSandbox() == mInSandbox; - synchronized (mConnectionLock) { - if (mFreeConnectionIndices.isEmpty()) { - Log.d(TAG, "Ran out of services to allocate."); - if (queueIfNoSlotAvailable) { - mPendingSpawnQueue.add(spawnData); - } - return null; + if (mFreeConnectionIndices.isEmpty()) { + Log.d(TAG, "Ran out of services to allocate."); + if (queueIfNoSlotAvailable) { + mPendingSpawnQueue.add(spawnData); } - int slot = mFreeConnectionIndices.remove(0); - assert mChildProcessConnections[slot] == null; - mChildProcessConnections[slot] = new ChildProcessConnectionImpl(spawnData.getContext(), - slot, mInSandbox, deathCallback, mChildClassName, childProcessCommonParameters, - spawnData.isAlwaysInForeground(), spawnData.getCreationParams()); - Log.d(TAG, "Allocator allocated a connection, sandbox: %b, slot: %d", mInSandbox, slot); - return mChildProcessConnections[slot]; + return null; } + int slot = mFreeConnectionIndices.remove(0); + assert mChildProcessConnections[slot] == null; + mChildProcessConnections[slot] = new ChildProcessConnectionImpl(spawnData.getContext(), + slot, mInSandbox, deathCallback, mChildClassName, childProcessCommonParameters, + spawnData.isAlwaysInForeground(), spawnData.getCreationParams()); + Log.d(TAG, "Allocator allocated a connection, sandbox: %b, slot: %d", mInSandbox, slot); + return mChildProcessConnections[slot]; } // Also return the first ChildSpawnData in the pending queue, if any. public ChildSpawnData free(ChildProcessConnection connection) { - synchronized (mConnectionLock) { - int slot = connection.getServiceNumber(); - if (mChildProcessConnections[slot] != connection) { - int occupier = mChildProcessConnections[slot] == null - ? -1 - : mChildProcessConnections[slot].getServiceNumber(); - Log.e(TAG, - "Unable to find connection to free in slot: %d " - + "already occupied by service: %d", - slot, occupier); - assert false; - } else { - mChildProcessConnections[slot] = null; - assert !mFreeConnectionIndices.contains(slot); - mFreeConnectionIndices.add(slot); - Log.d(TAG, "Allocator freed a connection, sandbox: %b, slot: %d", mInSandbox, slot); - } - return mPendingSpawnQueue.poll(); + assert LauncherThread.runningOnLauncherThread(); + int slot = connection.getServiceNumber(); + if (mChildProcessConnections[slot] != connection) { + int occupier = mChildProcessConnections[slot] == null + ? -1 + : mChildProcessConnections[slot].getServiceNumber(); + Log.e(TAG, + "Unable to find connection to free in slot: %d " + + "already occupied by service: %d", + slot, occupier); + assert false; + } else { + mChildProcessConnections[slot] = null; + assert !mFreeConnectionIndices.contains(slot); + mFreeConnectionIndices.add(slot); + Log.d(TAG, "Allocator freed a connection, sandbox: %b, slot: %d", mInSandbox, slot); } + return mPendingSpawnQueue.poll(); } public boolean isFreeConnectionAvailable() { - synchronized (mConnectionLock) { - return !mFreeConnectionIndices.isEmpty(); - } + assert LauncherThread.runningOnLauncherThread(); + return !mFreeConnectionIndices.isEmpty(); } /** @return the count of connections managed by the allocator */ @VisibleForTesting int allocatedConnectionsCountForTesting() { - synchronized (mConnectionLock) { - return mChildProcessConnections.length - mFreeConnectionIndices.size(); - } + assert LauncherThread.runningOnLauncherThread(); + return mChildProcessConnections.length - mFreeConnectionIndices.size(); } @VisibleForTesting @@ -248,15 +234,13 @@ @VisibleForTesting void enqueuePendingQueueForTesting(ChildSpawnData spawnData) { - synchronized (mConnectionLock) { - mPendingSpawnQueue.add(spawnData); - } + assert LauncherThread.runningOnLauncherThread(); + mPendingSpawnQueue.add(spawnData); } @VisibleForTesting int pendingSpawnsCountForTesting() { - synchronized (mConnectionLock) { - return mPendingSpawnQueue.size(); - } + assert LauncherThread.runningOnLauncherThread(); + return mPendingSpawnQueue.size(); } }
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnection.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnection.java index 0a22ed6..79bb922 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnection.java +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnection.java
@@ -25,6 +25,7 @@ * fully set up. */ interface DeathCallback { + // Called on Launcher thread. void onChildProcessDied(ChildProcessConnection connection); }
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java index de8e0f34..710741b 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessConnectionImpl.java
@@ -16,7 +16,6 @@ import android.os.RemoteException; import org.chromium.base.Log; -import org.chromium.base.ThreadUtils; import org.chromium.base.TraceEvent; import org.chromium.base.VisibleForTesting; import org.chromium.base.process_launcher.ChildProcessCreationParams; @@ -160,83 +159,24 @@ } @Override - public void onServiceConnected(ComponentName className, IBinder service) { - synchronized (mLock) { - // A flag from the parent class ensures we run the post-connection logic only once - // (instead of once per each ChildServiceConnection). - if (mDidOnServiceConnected) { - return; + public void onServiceConnected(ComponentName className, final IBinder service) { + LauncherThread.post(new Runnable() { + @Override + public void run() { + ChildProcessConnectionImpl.this.onServiceConnectedOnLauncherThread(service); } - try { - TraceEvent.begin( - "ChildProcessConnectionImpl.ChildServiceConnection.onServiceConnected"); - mDidOnServiceConnected = true; - mService = IChildProcessService.Stub.asInterface(service); - - StartCallback startCallback = mStartCallback; - mStartCallback = null; - - final boolean bindCheck = - mCreationParams != null && mCreationParams.getBindToCallerCheck(); - boolean boundToUs = false; - try { - boundToUs = bindCheck ? mService.bindToCaller() : true; - } catch (RemoteException ex) { - // Do not trigger the StartCallback here, since the service is already - // dead and the DeathCallback will run from onServiceDisconnected(). - Log.e(TAG, "Failed to bind service to connection.", ex); - return; - } - - if (startCallback != null) { - if (boundToUs) { - startCallback.onChildStarted(); - } else { - startCallback.onChildStartFailed(); - } - } - - if (!boundToUs) { - return; - } - - mServiceConnectComplete = true; - - // Run the setup if the connection parameters have already been provided. If - // not, doConnectionSetupLocked() will be called from setupConnection(). - if (mConnectionParams != null) { - doConnectionSetupLocked(); - } - } finally { - TraceEvent.end( - "ChildProcessConnectionImpl.ChildServiceConnection.onServiceConnected"); - } - } + }); } - // Called on the main thread to notify that the child service did not disconnect gracefully. @Override public void onServiceDisconnected(ComponentName className) { - synchronized (mLock) { - // Ensure that the disconnection logic runs only once (instead of once per each - // ChildServiceConnection). - if (mServiceDisconnected) { - return; + LauncherThread.post(new Runnable() { + @Override + public void run() { + ChildProcessConnectionImpl.this.onServiceDisconnectedOnLauncherThread(); } - // Stash the status of the oom bindings, since stop() will release all bindings. - mWasOomProtected = isCurrentlyOomProtected(); - mServiceDisconnected = true; - Log.w(TAG, "onServiceDisconnected (crash or killed by oom): pid=%d", mPid); - stop(); // We don't want to auto-restart on crash. Let the browser do that. - mDeathCallback.onChildProcessDied(ChildProcessConnectionImpl.this); - // If we have a pending connection callback, we need to communicate the failure to - // the caller. - if (mConnectionCallback != null) { - mConnectionCallback.onConnected(0); - } - mConnectionCallback = null; - } + }); } } @@ -329,8 +269,8 @@ public void start(ChildProcessConnection.StartCallback startCallback) { try { TraceEvent.begin("ChildProcessConnectionImpl.start"); + assert LauncherThread.runningOnLauncherThread(); synchronized (mLock) { - assert !ThreadUtils.runningOnUiThread(); assert mConnectionParams == null : "setupConnection() called before start() in ChildProcessConnectionImpl."; @@ -353,6 +293,7 @@ @Override public void setupConnection(String[] commandLine, FileDescriptorInfo[] filesToBeMapped, @Nullable IBinder callback, ConnectionCallback connectionCallback) { + assert LauncherThread.runningOnLauncherThread(); synchronized (mLock) { assert mConnectionParams == null; if (mServiceDisconnected) { @@ -390,6 +331,84 @@ } } + private void onServiceConnectedOnLauncherThread(IBinder service) { + assert LauncherThread.runningOnLauncherThread(); + synchronized (mLock) { + // A flag from the parent class ensures we run the post-connection logic only once + // (instead of once per each ChildServiceConnection). + if (mDidOnServiceConnected) { + return; + } + try { + TraceEvent.begin( + "ChildProcessConnectionImpl.ChildServiceConnection.onServiceConnected"); + mDidOnServiceConnected = true; + mService = IChildProcessService.Stub.asInterface(service); + + StartCallback startCallback = mStartCallback; + mStartCallback = null; + + final boolean bindCheck = + mCreationParams != null && mCreationParams.getBindToCallerCheck(); + boolean boundToUs = false; + try { + boundToUs = bindCheck ? mService.bindToCaller() : true; + } catch (RemoteException ex) { + // Do not trigger the StartCallback here, since the service is already + // dead and the DeathCallback will run from onServiceDisconnected(). + Log.e(TAG, "Failed to bind service to connection.", ex); + return; + } + + if (startCallback != null) { + if (boundToUs) { + startCallback.onChildStarted(); + } else { + startCallback.onChildStartFailed(); + } + } + + if (!boundToUs) { + return; + } + + mServiceConnectComplete = true; + + // Run the setup if the connection parameters have already been provided. If + // not, doConnectionSetupLocked() will be called from setupConnection(). + if (mConnectionParams != null) { + doConnectionSetupLocked(); + } + } finally { + TraceEvent.end( + "ChildProcessConnectionImpl.ChildServiceConnection.onServiceConnected"); + } + } + } + + private void onServiceDisconnectedOnLauncherThread() { + assert LauncherThread.runningOnLauncherThread(); + synchronized (mLock) { + // Ensure that the disconnection logic runs only once (instead of once per each + // ChildServiceConnection). + if (mServiceDisconnected) { + return; + } + // Stash the status of the oom bindings, since stop() will release all bindings. + mWasOomProtected = isCurrentlyOomProtected(); + mServiceDisconnected = true; + Log.w(TAG, "onServiceDisconnected (crash or killed by oom): pid=%d", mPid); + stop(); // We don't want to auto-restart on crash. Let the browser do that. + mDeathCallback.onChildProcessDied(ChildProcessConnectionImpl.this); + // If we have a pending connection callback, we need to communicate the failure to + // the caller. + if (mConnectionCallback != null) { + mConnectionCallback.onConnected(0); + } + mConnectionCallback = null; + } + } + private void onSetupConnectionResult(int pid) { synchronized (mLock) { mPid = pid;
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java index a4d02a0a..1336d3df 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java
@@ -43,10 +43,12 @@ @VisibleForTesting static ChildProcessConnection allocateConnection( ChildSpawnData spawnData, Bundle childProcessCommonParams, boolean forWarmUp) { + assert LauncherThread.runningOnLauncherThread(); ChildProcessConnection.DeathCallback deathCallback = new ChildProcessConnection.DeathCallback() { @Override public void onChildProcessDied(ChildProcessConnection connection) { + assert LauncherThread.runningOnLauncherThread(); if (connection.getPid() != 0) { stop(connection.getPid()); } else { @@ -133,9 +135,8 @@ private static final long FREE_CONNECTION_DELAY_MILLIS = 1; private static void freeConnection(ChildProcessConnection connection) { - synchronized (sSpareConnectionLock) { - if (connection.equals(sSpareSandboxedConnection)) sSpareSandboxedConnection = null; - } + assert LauncherThread.runningOnLauncherThread(); + if (connection == sSpareSandboxedConnection) clearSpareConnection(); // Freeing a service should be delayed. This is so that we avoid immediately reusing the // freed service (see http://crbug.com/164069): the framework might keep a service process @@ -143,10 +144,19 @@ // is bound at that point, the process is reused and bad things happen (mostly static // variables are set when we don't expect them to). final ChildProcessConnection conn = connection; - ThreadUtils.postOnUiThreadDelayed(new Runnable() { + LauncherThread.postDelayed(new Runnable() { @Override public void run() { - final ChildSpawnData pendingSpawn = freeConnectionAndDequeuePending(conn); + // TODO(jcivelli): it should be safe to pass a null Context here as it is used to + // initialize the ChildConnectionAllocator object and if we are freeing a + // connection, we must have allocated one previously guaranteeing it is already + // initialized. When we consolidate ChildProcessLauncher and + // ChildProcessLauncherHelper, we'll have a context around that we can pass in + // there. + ChildConnectionAllocator allocator = ChildConnectionAllocator.getAllocator( + null /* context */, conn.getPackageName(), conn.isInSandbox()); + assert allocator != null; + final ChildSpawnData pendingSpawn = allocator.free(conn); if (pendingSpawn != null) { LauncherThread.post(new Runnable() { @Override @@ -165,18 +175,6 @@ }, FREE_CONNECTION_DELAY_MILLIS); } - private static ChildSpawnData freeConnectionAndDequeuePending(ChildProcessConnection conn) { - // TODO(jcivelli): it should be safe to pass a null Context here as it is used to initialize - // the ChildConnectionAllocator object and if we are freeing a connection, we must have - // allocated one previously guaranteeing it is already initialized. - // When we consolidate ChildProcessLauncher and ChildProcessLauncherHelper, we'll have a - // context around that we can pass in there. - ChildConnectionAllocator allocator = ChildConnectionAllocator.getAllocator( - null /* context */, conn.getPackageName(), conn.isInSandbox()); - assert allocator != null; - return allocator.free(conn); - } - // Represents an invalid process handle; same as base/process/process.h kNullProcessHandle. private static final int NULL_PROCESS_HANDLE = 0; @@ -184,16 +182,16 @@ private static Map<Integer, ChildProcessConnection> sServiceMap = new ConcurrentHashMap<Integer, ChildProcessConnection>(); - // Lock and monitor for these members {{{ - private static final Object sSpareConnectionLock = new Object(); - // A pre-allocated and pre-bound connection ready for connection setup, or null. + // These variables are used for the warm up sandboxed connection. + // |sSpareSandboxedConnection| is non-null when there is a pending connection. Note it's cleared + // to null again after the connection is used for a real child process. + // |sSpareConnectionStarting| is true if ChildProcessConnection.StartCallback has not fired. + // This is used for a child process allocation to determine if StartCallback should be chained. + // |sSpareConnectionStartCallback| is the chained StartCallback. This is also used to determine + // if there is already a child process launch that's used this this connection. private static ChildProcessConnection sSpareSandboxedConnection; - // If sSpareSandboxedConnection is not null, this indicates whether the service is - // ready for connection setup. Wait on the monitor lock to be notified when this - // state changes. sSpareSandboxedConnection may be null after waiting, if starting - // the service failed. private static boolean sSpareConnectionStarting; - // }}} + private static ChildProcessConnection.StartCallback sSpareConnectionStartCallback; // Manages oom bindings used to bind chind services. private static BindingManager sBindingManager = BindingManagerImpl.createBindingManager(); @@ -268,44 +266,52 @@ LauncherThread.post(new Runnable() { @Override public void run() { - synchronized (sSpareConnectionLock) { - if (sSpareSandboxedConnection == null) { - ChildProcessCreationParams params = ChildProcessCreationParams.getDefault(); - sSpareConnectionStarting = true; + if (sSpareSandboxedConnection != null) return; + ChildProcessCreationParams params = ChildProcessCreationParams.getDefault(); - ChildProcessConnection.StartCallback startCallback = - new ChildProcessConnection.StartCallback() { - @Override - public void onChildStarted() { - synchronized (sSpareConnectionLock) { - sSpareConnectionStarting = false; - sSpareConnectionLock.notify(); - } - } + ChildProcessConnection.StartCallback startCallback = + new ChildProcessConnection.StartCallback() { + @Override + public void onChildStarted() { + assert LauncherThread.runningOnLauncherThread(); + sSpareConnectionStarting = false; + if (sSpareConnectionStartCallback != null) { + sSpareConnectionStartCallback.onChildStarted(); + clearSpareConnection(); + } + // If there is no chained callback, that means nothing has tried to + // use the spare connection yet. It will be cleared when it is used + // for an actual child process launch. + } - @Override - public void onChildStartFailed() { - Log.e(TAG, "Failed to warm up the spare sandbox service"); - synchronized (sSpareConnectionLock) { - sSpareSandboxedConnection = null; - sSpareConnectionStarting = false; - sSpareConnectionLock.notify(); - } - } - }; - ChildSpawnData spawnData = new ChildSpawnData(context, - null /* commandLine */, -1 /* child process id */, - null /* filesToBeMapped */, null /* launchCallback */, - null /* child process callback */, true /* inSandbox */, - SPARE_CONNECTION_ALWAYS_IN_FOREGROUND, params); - sSpareSandboxedConnection = allocateBoundConnection( - spawnData, startCallback, true /* forWarmUp */); - } - } + @Override + public void onChildStartFailed() { + assert LauncherThread.runningOnLauncherThread(); + Log.e(TAG, "Failed to warm up the spare sandbox service"); + if (sSpareConnectionStartCallback != null) { + sSpareConnectionStartCallback.onChildStartFailed(); + } + clearSpareConnection(); + } + }; + ChildSpawnData spawnData = new ChildSpawnData(context, null /* commandLine */, + -1 /* child process id */, null /* filesToBeMapped */, + null /* launchCallback */, null /* child process callback */, + true /* inSandbox */, SPARE_CONNECTION_ALWAYS_IN_FOREGROUND, params); + sSpareSandboxedConnection = + allocateBoundConnection(spawnData, startCallback, true /* forWarmUp */); + sSpareConnectionStarting = sSpareSandboxedConnection != null; } }); } + private static void clearSpareConnection() { + assert LauncherThread.runningOnLauncherThread(); + sSpareSandboxedConnection = null; + sSpareConnectionStarting = false; + sSpareConnectionStartCallback = null; + } + /** * Spawns and connects to a child process. May be called on any thread. It will not block, but * will instead callback to {@link #nativeOnChildProcessStarted} when the connection is @@ -372,48 +378,46 @@ ChildProcessConnection allocatedConnection = null; String packageName = creationParams != null ? creationParams.getPackageName() : context.getPackageName(); - synchronized (sSpareConnectionLock) { - if (inSandbox && sSpareSandboxedConnection != null - && SPARE_CONNECTION_ALWAYS_IN_FOREGROUND == alwaysInForeground - && sSpareSandboxedConnection.getPackageName().equals(packageName) - // Object identity check for getDefault should be enough. The default is - // not supposed to change once set. - && creationParams == ChildProcessCreationParams.getDefault()) { - while (sSpareConnectionStarting) { - try { - sSpareConnectionLock.wait(); - } catch (InterruptedException ex) { + ChildProcessConnection.StartCallback startCallback = + new ChildProcessConnection.StartCallback() { + @Override + public void onChildStarted() {} + + @Override + public void onChildStartFailed() { + assert LauncherThread.runningOnLauncherThread(); + Log.e(TAG, "ChildProcessConnection.start failed, trying again"); + LauncherThread.post(new Runnable() { + @Override + public void run() { + // The child process may already be bound to another client + // (this can happen if multi-process WebView is used in more + // than one process), so try starting the process again. + // This connection that failed to start has not been freed, + // so a new bound connection will be allocated. + startInternal(context, commandLine, childProcessId, + filesToBeMapped, launchCallback, childProcessCallback, + inSandbox, alwaysInForeground, creationParams); + } + }); } - } - allocatedConnection = sSpareSandboxedConnection; - sSpareSandboxedConnection = null; + }; + + if (inSandbox && sSpareSandboxedConnection != null + && sSpareConnectionStartCallback == null + && SPARE_CONNECTION_ALWAYS_IN_FOREGROUND == alwaysInForeground + && sSpareSandboxedConnection.getPackageName().equals(packageName) + // Object identity check for getDefault should be enough. The default is + // not supposed to change once set. + && creationParams == ChildProcessCreationParams.getDefault()) { + allocatedConnection = sSpareSandboxedConnection; + if (sSpareConnectionStarting) { + sSpareConnectionStartCallback = startCallback; + } else { + clearSpareConnection(); } } if (allocatedConnection == null) { - ChildProcessConnection.StartCallback startCallback = - new ChildProcessConnection.StartCallback() { - @Override - public void onChildStarted() {} - - @Override - public void onChildStartFailed() { - Log.e(TAG, "ChildProcessConnection.start failed, trying again"); - LauncherThread.post(new Runnable() { - @Override - public void run() { - // The child process may already be bound to another client - // (this can happen if multi-process WebView is used in more - // than one process), so try starting the process again. - // This connection that failed to start has not been freed, - // so a new bound connection will be allocated. - startInternal(context, commandLine, childProcessId, - filesToBeMapped, launchCallback, - childProcessCallback, inSandbox, alwaysInForeground, - creationParams); - } - }); - } - }; ChildSpawnData spawnData = new ChildSpawnData(context, commandLine, childProcessId, filesToBeMapped, launchCallback, childProcessCallback, inSandbox, @@ -425,8 +429,6 @@ } } - Log.d(TAG, "Setting up connection to process: slot=%d", - allocatedConnection.getServiceNumber()); triggerConnectionSetup(allocatedConnection, commandLine, childProcessId, filesToBeMapped, childProcessCallback, launchCallback); return allocatedConnection; @@ -457,6 +459,7 @@ String[] commandLine, int childProcessId, FileDescriptorInfo[] filesToBeMapped, final IBinder childProcessCallback, final LaunchCallback launchCallback) { assert LauncherThread.runningOnLauncherThread(); + Log.d(TAG, "Setting up connection to process: slot=%d", connection.getServiceNumber()); ChildProcessConnection.ConnectionCallback connectionCallback = new ChildProcessConnection.ConnectionCallback() { @Override @@ -485,6 +488,7 @@ * @param pid The pid (process handle) of the service connection obtained from {@link #start}. */ static void stop(int pid) { + assert LauncherThread.runningOnLauncherThread(); Log.d(TAG, "stopping child connection: pid=%d", pid); ChildProcessConnection connection = sServiceMap.remove(pid); if (connection == null) {
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java index 71d30e88..9d8845b 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java +++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelper.java
@@ -88,9 +88,9 @@ ChildProcessLauncher.getBindingManager().setInForeground(mPid, inForeground); } - // Called on client (UI or IO) thread and launcher thread. @CalledByNative private static void stop(int pid) { + assert LauncherThread.runningOnLauncherThread(); ChildProcessLauncher.stop(pid); }
diff --git a/content/public/android/java/src/org/chromium/content/browser/LauncherThread.java b/content/public/android/java/src/org/chromium/content/browser/LauncherThread.java index 89b4984..622b92b 100644 --- a/content/public/android/java/src/org/chromium/content/browser/LauncherThread.java +++ b/content/public/android/java/src/org/chromium/content/browser/LauncherThread.java
@@ -26,6 +26,10 @@ sHandler.post(r); } + public static void postDelayed(Runnable r, long delayMillis) { + sHandler.postDelayed(r, delayMillis); + } + public static boolean runningOnLauncherThread() { return sHandler.getLooper() == Looper.myLooper(); }
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java index 3ce51ae..ab17b60d 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/ChildProcessLauncherTest.java
@@ -562,48 +562,82 @@ * but doesn't really start the connection to bind a service. It is for testing whether the * connection is allocated properly for different application packages. */ - private ChildProcessConnectionImpl allocateConnection(String packageName) { - // Allocate a new connection. - Context context = getInstrumentation().getTargetContext(); - ChildProcessCreationParams creationParams = - getDefaultChildProcessCreationParams(packageName); - return (ChildProcessConnectionImpl) ChildProcessLauncher.allocateConnection( - new ChildSpawnData(context, null /* commandLine */, 0 /* childProcessId */, - null /* filesToBeMapped */, null /* launchCallback */, - null /* childProcessCallback */, true /* inSandbox */, - false /* alwaysInForeground */, creationParams), - ChildProcessLauncher.createCommonParamsBundle(creationParams), - false /* forWarmUp */); + private ChildProcessConnectionImpl allocateConnection(final String packageName) { + return ChildProcessLauncherTestHelperService.runOnLauncherAndGetResult( + new Callable<ChildProcessConnectionImpl>() { + @Override + public ChildProcessConnectionImpl call() { + // Allocate a new connection. + Context context = getInstrumentation().getTargetContext(); + ChildProcessCreationParams creationParams = + getDefaultChildProcessCreationParams(packageName); + return (ChildProcessConnectionImpl) ChildProcessLauncher.allocateConnection( + new ChildSpawnData(context, null /* commandLine */, + 0 /* childProcessId */, null /* filesToBeMapped */, + null /* launchCallback */, null /* childProcessCallback */, + true /* inSandbox */, false /* alwaysInForeground */, + creationParams), + ChildProcessLauncher.createCommonParamsBundle(creationParams), + false /* forWarmUp */); + } + }); } - private static void enqueuePendingSpawnForTesting(Context context, String[] commandLine, - ChildProcessCreationParams creationParams, boolean inSandbox) { - String packageName = - creationParams != null ? creationParams.getPackageName() : context.getPackageName(); - ChildConnectionAllocator allocator = - ChildConnectionAllocator.getAllocator(context, packageName, inSandbox); - allocator.enqueuePendingQueueForTesting(new ChildSpawnData(context, commandLine, - 1 /* childProcessId */, new FileDescriptorInfo[0], null /* launchCallback */, - null /* childProcessCallback */, true /* inSandbox */, - false /* alwaysInForeground */, creationParams)); + private static void enqueuePendingSpawnForTesting(final Context context, + final String[] commandLine, final ChildProcessCreationParams creationParams, + final boolean inSandbox) { + ChildProcessLauncherTestHelperService.runOnLauncherThreadBlocking(new Runnable() { + @Override + public void run() { + String packageName = creationParams != null ? creationParams.getPackageName() + : context.getPackageName(); + ChildConnectionAllocator allocator = + ChildConnectionAllocator.getAllocator(context, packageName, inSandbox); + allocator.enqueuePendingQueueForTesting(new ChildSpawnData(context, commandLine, + 1 /* childProcessId */, new FileDescriptorInfo[0], + null /* launchCallback */, null /* childProcessCallback */, + true /* inSandbox */, false /* alwaysInForeground */, creationParams)); + } + }); } private static int allocatedSandboxedConnectionsCountForTesting( - Context context, String packageName) { - return ChildConnectionAllocator.getAllocator(context, packageName, true /*isSandboxed */) - .allocatedConnectionsCountForTesting(); + final Context context, final String packageName) { + return ChildProcessLauncherTestHelperService.runOnLauncherAndGetResult( + new Callable<Integer>() { + @Override + public Integer call() { + return ChildConnectionAllocator + .getAllocator(context, packageName, true /*isSandboxed */) + .allocatedConnectionsCountForTesting(); + } + }); } private static ChildProcessConnection[] getSandboxedConnectionArrayForTesting( - Context context, String packageName) { - return ChildConnectionAllocator.getAllocator(context, packageName, true /*isSandboxed */) - .connectionArrayForTesting(); + final Context context, final String packageName) { + return ChildProcessLauncherTestHelperService.runOnLauncherAndGetResult( + new Callable<ChildProcessConnection[]>() { + @Override + public ChildProcessConnection[] call() { + return ChildConnectionAllocator + .getAllocator(context, packageName, true /*isSandboxed */) + .connectionArrayForTesting(); + } + }); } private static int pendingSpawnsCountForTesting( - Context context, String packageName, boolean inSandbox) { - return ChildConnectionAllocator.getAllocator(context, packageName, inSandbox) - .pendingSpawnsCountForTesting(); + final Context context, final String packageName, final boolean inSandbox) { + return ChildProcessLauncherTestHelperService.runOnLauncherAndGetResult( + new Callable<Integer>() { + @Override + public Integer call() { + return ChildConnectionAllocator + .getAllocator(context, packageName, inSandbox) + .pendingSpawnsCountForTesting(); + } + }); } /**
diff --git a/content/public/renderer/renderer_gamepad_provider.h b/content/public/renderer/renderer_gamepad_provider.h index b3b4ce3..723ea1d0 100644 --- a/content/public/renderer/renderer_gamepad_provider.h +++ b/content/public/renderer/renderer_gamepad_provider.h
@@ -10,7 +10,10 @@ namespace blink { class WebGamepadListener; -class WebGamepads; +} + +namespace device { +class Gamepads; } namespace content { @@ -25,7 +28,7 @@ ~RendererGamepadProvider() override {} // Provides latest snapshot of gamepads. - virtual void SampleGamepads(blink::WebGamepads& gamepads) = 0; + virtual void SampleGamepads(device::Gamepads& gamepads) = 0; protected: DISALLOW_COPY_AND_ASSIGN(RendererGamepadProvider);
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index 9d95d274..20c365dd 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -446,6 +446,7 @@ "//content/public/common:service_names", "//crypto:platform", "//device/base/synchronization", + "//device/gamepad/public/cpp:shared_with_blink", "//device/gamepad/public/interfaces", "//device/screen_orientation/public/interfaces", "//device/sensors/public/cpp:full",
diff --git a/content/renderer/DEPS b/content/renderer/DEPS index b74ae72..de7b52d2 100644 --- a/content/renderer/DEPS +++ b/content/renderer/DEPS
@@ -12,6 +12,7 @@ "+content/public/renderer", "+content/child", "+device/base/synchronization", + "+device/gamepad/public/cpp", "+device/gamepad/public/interfaces", "+device/screen_orientation/public/interfaces", "+device/sensors/public",
diff --git a/content/renderer/gamepad_shared_memory_reader.cc b/content/renderer/gamepad_shared_memory_reader.cc index 1e34ea13..cfa756f 100644 --- a/content/renderer/gamepad_shared_memory_reader.cc +++ b/content/renderer/gamepad_shared_memory_reader.cc
@@ -60,7 +60,7 @@ static_cast<GamepadHardwareBuffer*>(memory); } -void GamepadSharedMemoryReader::SampleGamepads(blink::WebGamepads& gamepads) { +void GamepadSharedMemoryReader::SampleGamepads(device::Gamepads& gamepads) { // Blink should have started observing at that point. CHECK(is_observing()); @@ -70,7 +70,7 @@ // // This logic is duplicated in Pepper as well. If you change it, that also // needs to be in sync. See ppapi/proxy/gamepad_resource.cc. - blink::WebGamepads read_into; + device::Gamepads read_into; TRACE_EVENT0("GAMEPAD", "SampleGamepads"); if (!renderer_shared_buffer_handle_.is_valid()) @@ -107,7 +107,7 @@ // gamepads to prevent fingerprinting. The actual data is not cleared. // WebKit will only copy out data into the JS buffers for connected // gamepads so this is sufficient. - for (unsigned i = 0; i < blink::WebGamepads::kItemsLengthCap; i++) + for (unsigned i = 0; i < device::Gamepads::kItemsLengthCap; i++) gamepads.items[i].connected = false; } } @@ -118,7 +118,7 @@ void GamepadSharedMemoryReader::GamepadConnected( int index, - const blink::WebGamepad& gamepad) { + const device::Gamepad& gamepad) { // The browser already checks if the user actually interacted with a device. ever_interacted_with_ = true; @@ -128,7 +128,7 @@ void GamepadSharedMemoryReader::GamepadDisconnected( int index, - const blink::WebGamepad& gamepad) { + const device::Gamepad& gamepad) { if (listener()) listener()->DidDisconnectGamepad(index, gamepad); }
diff --git a/content/renderer/gamepad_shared_memory_reader.h b/content/renderer/gamepad_shared_memory_reader.h index 05369cb..789a785 100644 --- a/content/renderer/gamepad_shared_memory_reader.h +++ b/content/renderer/gamepad_shared_memory_reader.h
@@ -10,14 +10,14 @@ #include "base/macros.h" #include "content/public/renderer/renderer_gamepad_provider.h" #include "device/base/synchronization/shared_memory_seqlock_buffer.h" +#include "device/gamepad/public/cpp/gamepads.h" #include "device/gamepad/public/interfaces/gamepad.mojom.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/system/buffer.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" namespace content { -typedef device::SharedMemorySeqLockBuffer<blink::WebGamepads> +typedef device::SharedMemorySeqLockBuffer<device::Gamepads> GamepadHardwareBuffer; class GamepadSharedMemoryReader : public RendererGamepadProvider, @@ -27,7 +27,7 @@ ~GamepadSharedMemoryReader() override; // RendererGamepadProvider implementation. - void SampleGamepads(blink::WebGamepads& gamepads) override; + void SampleGamepads(device::Gamepads& gamepads) override; void Start(blink::WebPlatformEventListener* listener) override; protected: @@ -37,9 +37,8 @@ private: // device::mojom::GamepadObserver methods. - void GamepadConnected(int index, const blink::WebGamepad& gamepad) override; - void GamepadDisconnected(int index, - const blink::WebGamepad& gamepad) override; + void GamepadConnected(int index, const device::Gamepad& gamepad) override; + void GamepadDisconnected(int index, const device::Gamepad& gamepad) override; mojo::ScopedSharedBufferHandle renderer_shared_buffer_handle_; mojo::ScopedSharedBufferMapping renderer_shared_buffer_mapping_;
diff --git a/content/renderer/pepper/event_conversion.cc b/content/renderer/pepper/event_conversion.cc index dbf6e2c9..452b6ca 100644 --- a/content/renderer/pepper/event_conversion.cc +++ b/content/renderer/pepper/event_conversion.cc
@@ -19,9 +19,9 @@ #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "content/common/input/web_touch_event_traits.h" +#include "device/gamepad/public/cpp/gamepads.h" #include "ppapi/c/pp_input_event.h" #include "ppapi/shared_impl/ppb_input_event_shared.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" #include "third_party/WebKit/public/platform/WebInputEvent.h" #include "third_party/WebKit/public/platform/WebKeyboardEvent.h" #include "third_party/WebKit/public/platform/WebMouseWheelEvent.h"
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc index 433427f..592133d 100644 --- a/content/renderer/pepper/pepper_plugin_instance_impl.cc +++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -61,6 +61,7 @@ #include "content/renderer/render_widget.h" #include "content/renderer/render_widget_fullscreen_pepper.h" #include "content/renderer/sad_plugin.h" +#include "device/gamepad/public/cpp/gamepads.h" #include "ppapi/c/dev/ppp_text_input_dev.h" #include "ppapi/c/pp_rect.h" #include "ppapi/c/ppb_audio_config.h" @@ -98,7 +99,6 @@ #include "third_party/WebKit/public/platform/URLConversion.h" #include "third_party/WebKit/public/platform/WebCursorInfo.h" #include "third_party/WebKit/public/platform/WebFloatRect.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" #include "third_party/WebKit/public/platform/WebInputEvent.h" #include "third_party/WebKit/public/platform/WebKeyboardEvent.h" #include "third_party/WebKit/public/platform/WebMouseEvent.h" @@ -458,9 +458,9 @@ void PepperPluginInstanceImpl::GamepadImpl::Sample( PP_Instance instance, PP_GamepadsSampleData* data) { - blink::WebGamepads webkit_data; - RenderThreadImpl::current()->SampleGamepads(&webkit_data); - ConvertWebKitGamepadData(bit_cast<ppapi::WebKitGamepads>(webkit_data), data); + device::Gamepads gamepads_data; + RenderThreadImpl::current()->SampleGamepads(&gamepads_data); + ppapi::ConvertDeviceGamepadData(gamepads_data, data); } PepperPluginInstanceImpl::PepperPluginInstanceImpl(
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 323ee7d..cc67973 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -122,6 +122,7 @@ #include "content/renderer/service_worker/service_worker_context_client.h" #include "content/renderer/service_worker/service_worker_context_message_filter.h" #include "content/renderer/shared_worker/embedded_shared_worker_stub.h" +#include "device/gamepad/public/cpp/gamepads.h" #include "gin/public/debug.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/shared_memory_limits.h" @@ -2326,7 +2327,7 @@ return shared_worker_context_provider_; } -void RenderThreadImpl::SampleGamepads(blink::WebGamepads* data) { +void RenderThreadImpl::SampleGamepads(device::Gamepads* data) { blink_platform_impl_->SampleGamepads(*data); }
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h index 35c36aa..4ee6d4f7f 100644 --- a/content/renderer/render_thread_impl.h +++ b/content/renderer/render_thread_impl.h
@@ -62,7 +62,6 @@ namespace scheduler { class WebThreadBase; } -class WebGamepads; class WebMediaStreamCenter; class WebMediaStreamCenterClient; } @@ -79,6 +78,10 @@ class TaskGraphRunner; } +namespace device { +class Gamepads; +} + namespace discardable_memory { class ClientDiscardableSharedMemoryManager; } @@ -461,7 +464,7 @@ } // Retrieve current gamepad data. - void SampleGamepads(blink::WebGamepads* data); + void SampleGamepads(device::Gamepads* data); // Called by a RenderWidget when it is created or destroyed. This // allows the process to know when there are no visible widgets.
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc index 1a8a8f6a..91c24cf 100644 --- a/content/renderer/renderer_blink_platform_impl.cc +++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -69,6 +69,7 @@ #include "content/renderer/webclipboard_impl.h" #include "content/renderer/webgraphicscontext3d_provider_impl.h" #include "content/renderer/webpublicsuffixlist_impl.h" +#include "device/gamepad/public/cpp/gamepads.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "gpu/config/gpu_info.h" #include "gpu/ipc/client/gpu_channel_host.h" @@ -90,7 +91,6 @@ #include "third_party/WebKit/public/platform/WebBlobRegistry.h" #include "third_party/WebKit/public/platform/WebDeviceLightListener.h" #include "third_party/WebKit/public/platform/WebFileInfo.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" #include "third_party/WebKit/public/platform/WebMediaStreamCenter.h" #include "third_party/WebKit/public/platform/WebMediaStreamCenterClient.h" #include "third_party/WebKit/public/platform/WebPluginListBuilder.h" @@ -148,8 +148,6 @@ using blink::WebDatabaseObserver; using blink::WebFileInfo; using blink::WebFileSystem; -using blink::WebGamepad; -using blink::WebGamepads; using blink::WebIDBFactory; using blink::WebImageCaptureFrameGrabber; using blink::WebMIDIAccessor; @@ -785,7 +783,7 @@ //------------------------------------------------------------------------------ -void RendererBlinkPlatformImpl::SampleGamepads(WebGamepads& gamepads) { +void RendererBlinkPlatformImpl::SampleGamepads(device::Gamepads& gamepads) { PlatformEventObserverBase* observer = platform_event_observers_.Lookup(blink::kWebPlatformEventTypeGamepad); if (!observer)
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h index 19306dfd..0b3fa167 100644 --- a/content/renderer/renderer_blink_platform_impl.h +++ b/content/renderer/renderer_blink_platform_impl.h
@@ -43,6 +43,7 @@ } namespace device { +class Gamepads; class MotionData; class OrientationData; } @@ -156,7 +157,7 @@ blink::WebMIDIAccessorClient* client) override; blink::WebBlobRegistry* GetBlobRegistry() override; - void SampleGamepads(blink::WebGamepads&) override; + void SampleGamepads(device::Gamepads&) override; blink::WebRTCPeerConnectionHandler* CreateRTCPeerConnectionHandler( blink::WebRTCPeerConnectionHandlerClient* client) override; blink::WebRTCCertificateGenerator* CreateRTCCertificateGenerator() override;
diff --git a/content/shell/renderer/layout_test/blink_test_runner.cc b/content/shell/renderer/layout_test/blink_test_runner.cc index 24b8b70..442b2b8 100644 --- a/content/shell/renderer/layout_test/blink_test_runner.cc +++ b/content/shell/renderer/layout_test/blink_test_runner.cc
@@ -161,7 +161,7 @@ } // RendererGamepadProvider implementation. - void SampleGamepads(blink::WebGamepads& gamepads) override { + void SampleGamepads(device::Gamepads& gamepads) override { controller_->SampleGamepads(gamepads); } void Start(blink::WebPlatformEventListener* listener) override {
diff --git a/content/shell/test_runner/BUILD.gn b/content/shell/test_runner/BUILD.gn index 9cf5bcc..ac15a4027 100644 --- a/content/shell/test_runner/BUILD.gn +++ b/content/shell/test_runner/BUILD.gn
@@ -115,6 +115,7 @@ "//cc/paint", "//content/public/common", "//content/test:test_runner_support", + "//device/gamepad/public/cpp:shared_with_blink", "//device/sensors/public/cpp:full", "//gin", "//gpu",
diff --git a/content/shell/test_runner/DEPS b/content/shell/test_runner/DEPS index f76fc0d7c..4e2248a9 100644 --- a/content/shell/test_runner/DEPS +++ b/content/shell/test_runner/DEPS
@@ -1,6 +1,7 @@ include_rules = [ "+cc", "+content/public/test", + "+device/gamepad/public/cpp", "+device/sensors/public/cpp", "+gin", "+gpu/command_buffer/client",
diff --git a/content/shell/test_runner/gamepad_controller.cc b/content/shell/test_runner/gamepad_controller.cc index fdf8ea3..f58bfa4 100644 --- a/content/shell/test_runner/gamepad_controller.cc +++ b/content/shell/test_runner/gamepad_controller.cc
@@ -18,8 +18,8 @@ #include "v8/include/v8.h" using blink::WebFrame; -using blink::WebGamepad; -using blink::WebGamepads; +using device::Gamepad; +using device::Gamepads; namespace test_runner { @@ -165,8 +165,8 @@ GamepadControllerBindings::Install(weak_factory_.GetWeakPtr(), frame); } -void GamepadController::SampleGamepads(blink::WebGamepads& gamepads) { - memcpy(&gamepads, &gamepads_, sizeof(blink::WebGamepads)); +void GamepadController::SampleGamepads(Gamepads& gamepads) { + memcpy(&gamepads, &gamepads_, sizeof(Gamepads)); } void GamepadController::SetListener(blink::WebGamepadListener* listener) { @@ -174,67 +174,67 @@ } void GamepadController::Connect(int index) { - if (index < 0 || index >= static_cast<int>(WebGamepads::kItemsLengthCap)) + if (index < 0 || index >= static_cast<int>(Gamepads::kItemsLengthCap)) return; gamepads_.items[index].connected = true; } void GamepadController::DispatchConnected(int index) { - if (index < 0 || index >= static_cast<int>(WebGamepads::kItemsLengthCap) || + if (index < 0 || index >= static_cast<int>(Gamepads::kItemsLengthCap) || !gamepads_.items[index].connected) return; - const WebGamepad& pad = gamepads_.items[index]; + const Gamepad& pad = gamepads_.items[index]; if (listener_) listener_->DidConnectGamepad(index, pad); } void GamepadController::Disconnect(int index) { - if (index < 0 || index >= static_cast<int>(WebGamepads::kItemsLengthCap)) + if (index < 0 || index >= static_cast<int>(Gamepads::kItemsLengthCap)) return; - WebGamepad& pad = gamepads_.items[index]; + Gamepad& pad = gamepads_.items[index]; pad.connected = false; if (listener_) listener_->DidDisconnectGamepad(index, pad); } void GamepadController::SetId(int index, const std::string& src) { - if (index < 0 || index >= static_cast<int>(WebGamepads::kItemsLengthCap)) + if (index < 0 || index >= static_cast<int>(Gamepads::kItemsLengthCap)) return; const char* p = src.c_str(); memset(gamepads_.items[index].id, 0, sizeof(gamepads_.items[index].id)); - for (unsigned i = 0; *p && i < WebGamepad::kIdLengthCap - 1; ++i) + for (unsigned i = 0; *p && i < Gamepad::kIdLengthCap - 1; ++i) gamepads_.items[index].id[i] = *p++; } void GamepadController::SetButtonCount(int index, int buttons) { - if (index < 0 || index >= static_cast<int>(WebGamepads::kItemsLengthCap)) + if (index < 0 || index >= static_cast<int>(Gamepads::kItemsLengthCap)) return; - if (buttons < 0 || buttons >= static_cast<int>(WebGamepad::kButtonsLengthCap)) + if (buttons < 0 || buttons >= static_cast<int>(Gamepad::kButtonsLengthCap)) return; gamepads_.items[index].buttons_length = buttons; } void GamepadController::SetButtonData(int index, int button, double data) { - if (index < 0 || index >= static_cast<int>(WebGamepads::kItemsLengthCap)) + if (index < 0 || index >= static_cast<int>(Gamepads::kItemsLengthCap)) return; - if (button < 0 || button >= static_cast<int>(WebGamepad::kButtonsLengthCap)) + if (button < 0 || button >= static_cast<int>(Gamepad::kButtonsLengthCap)) return; gamepads_.items[index].buttons[button].value = data; gamepads_.items[index].buttons[button].pressed = data > 0.1f; } void GamepadController::SetAxisCount(int index, int axes) { - if (index < 0 || index >= static_cast<int>(WebGamepads::kItemsLengthCap)) + if (index < 0 || index >= static_cast<int>(Gamepads::kItemsLengthCap)) return; - if (axes < 0 || axes >= static_cast<int>(WebGamepad::kAxesLengthCap)) + if (axes < 0 || axes >= static_cast<int>(Gamepad::kAxesLengthCap)) return; gamepads_.items[index].axes_length = axes; } void GamepadController::SetAxisData(int index, int axis, double data) { - if (index < 0 || index >= static_cast<int>(WebGamepads::kItemsLengthCap)) + if (index < 0 || index >= static_cast<int>(Gamepads::kItemsLengthCap)) return; - if (axis < 0 || axis >= static_cast<int>(WebGamepad::kAxesLengthCap)) + if (axis < 0 || axis >= static_cast<int>(Gamepad::kAxesLengthCap)) return; gamepads_.items[index].axes[axis] = data; }
diff --git a/content/shell/test_runner/gamepad_controller.h b/content/shell/test_runner/gamepad_controller.h index 36aa1f16..787eec5 100644 --- a/content/shell/test_runner/gamepad_controller.h +++ b/content/shell/test_runner/gamepad_controller.h
@@ -10,7 +10,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "content/shell/test_runner/test_runner_export.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" +#include "device/gamepad/public/cpp/gamepads.h" namespace blink { class WebFrame; @@ -30,7 +30,7 @@ void Reset(); void Install(blink::WebFrame* frame); - void SampleGamepads(blink::WebGamepads& gamepads); + void SampleGamepads(device::Gamepads& gamepads); void SetListener(blink::WebGamepadListener* listener); private: @@ -55,7 +55,7 @@ blink::WebGamepadListener* listener_; - blink::WebGamepads gamepads_; + device::Gamepads gamepads_; // Mapping from gamepad index to connection state. std::map<int, bool> pending_changes_;
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 4410322..1192e99 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -491,6 +491,7 @@ "//content/renderer:for_content_tests", "//content/shell/test_runner:test_runner", "//device/bluetooth", + "//device/gamepad/public/cpp:shared_with_blink", "//device/sensors/public/cpp:full", "//services/ui/public/cpp/gpu", "//skia", @@ -1471,6 +1472,7 @@ "//device/bluetooth:mocks", "//device/gamepad", "//device/gamepad:test_helpers", + "//device/gamepad/public/cpp:shared_with_blink", "//device/sensors/public/cpp:full", "//device/sensors/public/interfaces", "//gin",
diff --git a/content/test/DEPS b/content/test/DEPS index 8ac3763..ef6200b 100644 --- a/content/test/DEPS +++ b/content/test/DEPS
@@ -10,6 +10,7 @@ # Testing utilities can access anything in content/ "+content", "+device/bluetooth", # For WebBluetooth tests + "+device/gamepad/public/cpp", "+device/sensors/public/cpp", # For loading V8's initial snapshot from external files. "+gin/v8_initializer.h",
diff --git a/content/test/layouttest_support.cc b/content/test/layouttest_support.cc index daa6d5cd..8d6a109 100644 --- a/content/test/layouttest_support.cc +++ b/content/test/layouttest_support.cc
@@ -45,7 +45,6 @@ #include "gpu/ipc/service/image_transport_surface.h" #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h" #include "third_party/WebKit/public/platform/WebFloatRect.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" #include "third_party/WebKit/public/platform/WebInputEvent.h" #include "third_party/WebKit/public/platform/WebRect.h" #include "third_party/WebKit/public/platform/scheduler/test/renderer_scheduler_test_support.h" @@ -69,8 +68,6 @@ using device::MotionData; using device::OrientationData; -using blink::WebGamepad; -using blink::WebGamepads; using blink::WebRect; using blink::WebSize;
diff --git a/device/BUILD.gn b/device/BUILD.gn index eba54e2..1542a87 100644 --- a/device/BUILD.gn +++ b/device/BUILD.gn
@@ -90,6 +90,7 @@ "//device/bluetooth/uribeacon", "//device/gamepad", "//device/gamepad:test_helpers", + "//device/gamepad/public/cpp:shared_with_blink", "//device/gamepad/public/interfaces", "//device/gamepad/public/interfaces:gamepad_struct_traits_test", "//device/generic_sensor",
diff --git a/device/gamepad/BUILD.gn b/device/gamepad/BUILD.gn index f9634734..2cbc2e5c 100644 --- a/device/gamepad/BUILD.gn +++ b/device/gamepad/BUILD.gn
@@ -60,6 +60,7 @@ "//base", "//base/third_party/dynamic_annotations", "//device/base/synchronization", + "//device/gamepad/public/cpp:shared_with_blink", "//device/gamepad/public/interfaces", "//mojo/public/cpp/system", "//third_party/WebKit/public:blink_headers", @@ -104,6 +105,7 @@ public_deps = [ ":gamepad", "//base", + "//device/gamepad/public/cpp:shared_with_blink", "//third_party/WebKit/public:blink_headers", ] }
diff --git a/device/gamepad/DEPS b/device/gamepad/DEPS index 299c60a..c80012b5 100644 --- a/device/gamepad/DEPS +++ b/device/gamepad/DEPS
@@ -1,5 +1,3 @@ include_rules = [ "+jni", - "+third_party/WebKit/public/platform/WebGamepad.h", - "+third_party/WebKit/public/platform/WebGamepads.h", ]
diff --git a/device/gamepad/game_controller_data_fetcher_mac.mm b/device/gamepad/game_controller_data_fetcher_mac.mm index 797831c..9be2d8f 100644 --- a/device/gamepad/game_controller_data_fetcher_mac.mm +++ b/device/gamepad/game_controller_data_fetcher_mac.mm
@@ -14,19 +14,16 @@ #import <GameController/GameController.h> -using blink::WebGamepad; -using blink::WebGamepads; - namespace device { namespace { void CopyNSStringAsUTF16LittleEndian(NSString* src, - blink::WebUChar* dest, + UChar* dest, size_t dest_len) { NSData* as16 = [src dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; memset(dest, 0, dest_len); - [as16 getBytes:dest length:dest_len - sizeof(blink::WebUChar)]; + [as16 getBytes:dest length:dest_len - sizeof(UChar)]; } } // namespace @@ -55,7 +52,7 @@ if (!state) continue; - WebGamepad& pad = state->data; + Gamepad& pad = state->data; // This first time we encounter a gamepad, set its name, mapping, and // axes/button counts. This information is static, so it only needs to be
diff --git a/device/gamepad/gamepad_consumer.h b/device/gamepad/gamepad_consumer.h index 7c9201a..f80183d 100644 --- a/device/gamepad/gamepad_consumer.h +++ b/device/gamepad/gamepad_consumer.h
@@ -6,7 +6,7 @@ #define DEVICE_GAMEPAD_GAMEPAD_CONSUMER_H_ #include "device/gamepad/gamepad_export.h" -#include "third_party/WebKit/public/platform/WebGamepad.h" +#include "device/gamepad/public/cpp/gamepad.h" namespace device { @@ -15,10 +15,9 @@ GamepadConsumer(); virtual ~GamepadConsumer(); - virtual void OnGamepadConnected(unsigned index, - const blink::WebGamepad& gamepad) = 0; + virtual void OnGamepadConnected(unsigned index, const Gamepad& gamepad) = 0; virtual void OnGamepadDisconnected(unsigned index, - const blink::WebGamepad& gamepad) = 0; + const Gamepad& gamepad) = 0; }; } // namespace device
diff --git a/device/gamepad/gamepad_monitor.cc b/device/gamepad/gamepad_monitor.cc index 93990d3..c385d18 100644 --- a/device/gamepad/gamepad_monitor.cc +++ b/device/gamepad/gamepad_monitor.cc
@@ -26,13 +26,13 @@ } void GamepadMonitor::OnGamepadConnected(unsigned index, - const blink::WebGamepad& gamepad) { + const Gamepad& gamepad) { if (gamepad_observer_) gamepad_observer_->GamepadConnected(index, gamepad); } void GamepadMonitor::OnGamepadDisconnected(unsigned index, - const blink::WebGamepad& gamepad) { + const Gamepad& gamepad) { if (gamepad_observer_) gamepad_observer_->GamepadDisconnected(index, gamepad); }
diff --git a/device/gamepad/gamepad_monitor.h b/device/gamepad/gamepad_monitor.h index fab371e..5572189e 100644 --- a/device/gamepad/gamepad_monitor.h +++ b/device/gamepad/gamepad_monitor.h
@@ -23,10 +23,8 @@ static void Create(mojom::GamepadMonitorRequest request); // GamepadConsumer implementation. - void OnGamepadConnected(unsigned index, - const blink::WebGamepad& gamepad) override; - void OnGamepadDisconnected(unsigned index, - const blink::WebGamepad& gamepad) override; + void OnGamepadConnected(unsigned index, const Gamepad& gamepad) override; + void OnGamepadDisconnected(unsigned index, const Gamepad& gamepad) override; // mojom::GamepadMonitor implementation. void GamepadStartPolling(
diff --git a/device/gamepad/gamepad_pad_state_provider.cc b/device/gamepad/gamepad_pad_state_provider.cc index afc8beb..8f525cb 100644 --- a/device/gamepad/gamepad_pad_state_provider.cc +++ b/device/gamepad/gamepad_pad_state_provider.cc
@@ -7,10 +7,7 @@ #include <cmath> #include "device/gamepad/gamepad_data_fetcher.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" - -using blink::WebGamepad; -using blink::WebGamepads; +#include "device/gamepad/public/cpp/gamepads.h" namespace device { @@ -21,9 +18,9 @@ } // namespace GamepadPadStateProvider::GamepadPadStateProvider() { - pad_states_.reset(new PadState[WebGamepads::kItemsLengthCap]); + pad_states_.reset(new PadState[Gamepads::kItemsLengthCap]); - for (unsigned i = 0; i < WebGamepads::kItemsLengthCap; ++i) + for (unsigned i = 0; i < Gamepads::kItemsLengthCap; ++i) ClearPadState(pad_states_.get()[i]); } @@ -33,7 +30,7 @@ int source_id) { // Check to see if the device already has a reserved slot PadState* empty_slot = nullptr; - for (size_t i = 0; i < WebGamepads::kItemsLengthCap; ++i) { + for (size_t i = 0; i < Gamepads::kItemsLengthCap; ++i) { PadState& state = pad_states_.get()[i]; if (state.source == source && state.source_id == source_id) { // Retrieving the pad state marks this gamepad as active. @@ -61,13 +58,13 @@ } void GamepadPadStateProvider::MapAndSanitizeGamepadData(PadState* pad_state, - WebGamepad* pad, + Gamepad* pad, bool sanitize) { DCHECK(pad_state); DCHECK(pad); if (!pad_state->data.connected) { - memset(pad, 0, sizeof(WebGamepad)); + memset(pad, 0, sizeof(Gamepad)); return; }
diff --git a/device/gamepad/gamepad_pad_state_provider.h b/device/gamepad/gamepad_pad_state_provider.h index 3ba8342..c4624ba 100644 --- a/device/gamepad/gamepad_pad_state_provider.h +++ b/device/gamepad/gamepad_pad_state_provider.h
@@ -12,7 +12,7 @@ #include "device/gamepad/gamepad_export.h" #include "device/gamepad/gamepad_standard_mappings.h" -#include "third_party/WebKit/public/platform/WebGamepad.h" +#include "device/gamepad/public/cpp/gamepad.h" namespace device { @@ -47,7 +47,7 @@ GamepadActiveState active_state; // Gamepad data, unmapped. - blink::WebGamepad data; + Gamepad data; // Functions to map from device data to standard layout, if available. May // be null if no mapping is available or needed. @@ -59,13 +59,13 @@ // corresponding bit will be set to 1. // If we ever increase the max axis count this will need to be updated. - static_assert(blink::WebGamepad::kAxesLengthCap <= + static_assert(Gamepad::kAxesLengthCap <= std::numeric_limits<uint32_t>::digits, "axis_mask is not large enough"); uint32_t axis_mask; // If we ever increase the max button count this will need to be updated. - static_assert(blink::WebGamepad::kButtonsLengthCap <= + static_assert(Gamepad::kButtonsLengthCap <= std::numeric_limits<uint32_t>::digits, "button_mask is not large enough"); uint32_t button_mask; @@ -87,7 +87,7 @@ void InitializeDataFetcher(GamepadDataFetcher* fetcher); void MapAndSanitizeGamepadData(PadState* pad_state, - blink::WebGamepad* pad, + Gamepad* pad, bool sanitize); // Tracks the state of each gamepad slot.
diff --git a/device/gamepad/gamepad_platform_data_fetcher_android.cc b/device/gamepad/gamepad_platform_data_fetcher_android.cc index d57649ccd..f925b07 100644 --- a/device/gamepad/gamepad_platform_data_fetcher_android.cc +++ b/device/gamepad/gamepad_platform_data_fetcher_android.cc
@@ -16,16 +16,12 @@ #include "jni/GamepadList_jni.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" - using base::android::AttachCurrentThread; using base::android::CheckException; using base::android::ClearException; using base::android::ConvertJavaStringToUTF8; using base::android::JavaParamRef; using base::android::ScopedJavaLocalRef; -using blink::WebGamepad; -using blink::WebGamepads; namespace device { @@ -81,7 +77,7 @@ DCHECK(data_fetcher); GamepadPlatformDataFetcherAndroid* fetcher = reinterpret_cast<GamepadPlatformDataFetcherAndroid*>(data_fetcher); - DCHECK_LT(index, static_cast<int>(blink::WebGamepads::kItemsLengthCap)); + DCHECK_LT(index, static_cast<int>(Gamepads::kItemsLengthCap)); // Do not set gamepad parameters for all the gamepad devices that are not // attached. @@ -93,25 +89,25 @@ if (!state) return; - blink::WebGamepad& pad = state->data; + Gamepad& pad = state->data; // Is this the first time we've seen this device? if (state->active_state == GAMEPAD_NEWLY_ACTIVE) { - // Map the Gamepad DeviceName String to the WebGamepad Id. Ideally it should + // Map the Gamepad DeviceName String to the Gamepad Id. Ideally it should // be mapped to vendor and product information but it is only available at // kernel level and it can not be queried using class // android.hardware.input.InputManager. base::string16 device_name; base::android::ConvertJavaStringToUTF16(env, devicename, &device_name); const size_t name_to_copy = - std::min(device_name.size(), WebGamepad::kIdLengthCap - 1); + std::min(device_name.size(), Gamepad::kIdLengthCap - 1); memcpy(pad.id, device_name.data(), name_to_copy * sizeof(base::string16::value_type)); pad.id[name_to_copy] = 0; base::string16 mapping_name = base::UTF8ToUTF16(mapping ? "standard" : ""); const size_t mapping_to_copy = - std::min(mapping_name.size(), WebGamepad::kMappingLengthCap - 1); + std::min(mapping_name.size(), Gamepad::kMappingLengthCap - 1); memcpy(pad.mapping, mapping_name.data(), mapping_to_copy * sizeof(base::string16::value_type)); pad.mapping[mapping_to_copy] = 0; @@ -123,13 +119,13 @@ std::vector<float> axes; base::android::JavaFloatArrayToFloatVector(env, jaxes, &axes); - // Set WebGamepad axeslength to total number of axes on the gamepad device. + // Set Gamepad axeslength to total number of axes on the gamepad device. // Only return the first axesLengthCap if axeslength captured by GamepadList // is larger than axesLengthCap. pad.axes_length = std::min(static_cast<int>(axes.size()), - static_cast<int>(WebGamepad::kAxesLengthCap)); + static_cast<int>(Gamepad::kAxesLengthCap)); - // Copy axes state to the WebGamepad axes[]. + // Copy axes state to the Gamepad axes[]. for (unsigned int i = 0; i < pad.axes_length; i++) { pad.axes[i] = static_cast<double>(axes[i]); } @@ -137,14 +133,13 @@ std::vector<float> buttons; base::android::JavaFloatArrayToFloatVector(env, jbuttons, &buttons); - // Set WebGamepad buttonslength to total number of axes on the gamepad + // Set Gamepad buttonslength to total number of axes on the gamepad // device. Only return the first buttonsLengthCap if axeslength captured by // GamepadList is larger than buttonsLengthCap. - pad.buttons_length = - std::min(static_cast<int>(buttons.size()), - static_cast<int>(WebGamepad::kButtonsLengthCap)); + pad.buttons_length = std::min(static_cast<int>(buttons.size()), + static_cast<int>(Gamepad::kButtonsLengthCap)); - // Copy buttons state to the WebGamepad buttons[]. + // Copy buttons state to the Gamepad buttons[]. for (unsigned int j = 0; j < pad.buttons_length; j++) { pad.buttons[j].pressed = buttons[j]; pad.buttons[j].value = buttons[j];
diff --git a/device/gamepad/gamepad_platform_data_fetcher_android.h b/device/gamepad/gamepad_platform_data_fetcher_android.h index 760ef9b..158b5cc 100644 --- a/device/gamepad/gamepad_platform_data_fetcher_android.h +++ b/device/gamepad/gamepad_platform_data_fetcher_android.h
@@ -15,7 +15,7 @@ #include "device/gamepad/gamepad_data_fetcher.h" #include "device/gamepad/gamepad_provider.h" #include "device/gamepad/gamepad_standard_mappings.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" +#include "device/gamepad/public/cpp/gamepads.h" namespace device {
diff --git a/device/gamepad/gamepad_platform_data_fetcher_linux.cc b/device/gamepad/gamepad_platform_data_fetcher_linux.cc index bfd23d9..d33f0de7 100644 --- a/device/gamepad/gamepad_platform_data_fetcher_linux.cc +++ b/device/gamepad/gamepad_platform_data_fetcher_linux.cc
@@ -52,7 +52,7 @@ if (!base::StringToInt(str, &tmp_idx)) return false; if (tmp_idx < 0 || - tmp_idx >= static_cast<int>(blink::WebGamepads::kItemsLengthCap)) { + tmp_idx >= static_cast<int>(device::Gamepads::kItemsLengthCap)) { return false; } *index = tmp_idx; @@ -64,9 +64,6 @@ namespace device { -using blink::WebGamepad; -using blink::WebGamepads; - GamepadPlatformDataFetcherLinux::GamepadPlatformDataFetcherLinux() { for (size_t i = 0; i < arraysize(device_fd_); ++i) { device_fd_[i] = -1; @@ -74,7 +71,7 @@ } GamepadPlatformDataFetcherLinux::~GamepadPlatformDataFetcherLinux() { - for (size_t i = 0; i < WebGamepads::kItemsLengthCap; ++i) + for (size_t i = 0; i < Gamepads::kItemsLengthCap; ++i) CloseFileDescriptorIfValid(device_fd_[i]); } @@ -96,7 +93,7 @@ TRACE_EVENT0("GAMEPAD", "GetGamepadData"); // Update our internal state. - for (size_t i = 0; i < WebGamepads::kItemsLengthCap; ++i) { + for (size_t i = 0; i < Gamepads::kItemsLengthCap; ++i) { if (device_fd_[i] >= 0) { ReadDeviceData(i); } @@ -138,7 +135,7 @@ return; } - WebGamepad& pad = state->data; + Gamepad& pad = state->data; GamepadStandardMappingFunction& mapper = state->mapper; const char* vendor_id = udev_device_get_sysattr_value(dev, "id/vendor"); @@ -181,14 +178,14 @@ name_string + base::StringPrintf(" (%sVendor: %s Product: %s)", mapper ? "STANDARD GAMEPAD " : "", vendor_id, product_id); - base::TruncateUTF8ToByteSize(id, WebGamepad::kIdLengthCap - 1, &id); + base::TruncateUTF8ToByteSize(id, Gamepad::kIdLengthCap - 1, &id); base::string16 tmp16 = base::UTF8ToUTF16(id); memset(pad.id, 0, sizeof(pad.id)); tmp16.copy(pad.id, arraysize(pad.id) - 1); if (mapper) { std::string mapping = "standard"; - base::TruncateUTF8ToByteSize(mapping, WebGamepad::kMappingLengthCap - 1, + base::TruncateUTF8ToByteSize(mapping, Gamepad::kMappingLengthCap - 1, &mapping); tmp16 = base::UTF8ToUTF16(mapping); memset(pad.mapping, 0, sizeof(pad.mapping)); @@ -228,8 +225,8 @@ } void GamepadPlatformDataFetcherLinux::ReadDeviceData(size_t index) { - // Linker does not like CHECK_LT(index, WebGamepads::itemsLengthCap). =/ - if (index >= WebGamepads::kItemsLengthCap) { + // Linker does not like CHECK_LT(index, Gamepads::kItemsLengthCap). =/ + if (index >= Gamepads::kItemsLengthCap) { CHECK(false); return; } @@ -241,13 +238,13 @@ int fd = device_fd_[index]; DCHECK_GE(fd, 0); - WebGamepad& pad = state->data; + Gamepad& pad = state->data; js_event event; while (HANDLE_EINTR(read(fd, &event, sizeof(struct js_event))) > 0) { size_t item = event.number; if (event.type & JS_EVENT_AXIS) { - if (item >= WebGamepad::kAxesLengthCap) + if (item >= Gamepad::kAxesLengthCap) continue; pad.axes[item] = event.value / kMaxLinuxAxisValue; @@ -255,7 +252,7 @@ if (item >= pad.axes_length) pad.axes_length = item + 1; } else if (event.type & JS_EVENT_BUTTON) { - if (item >= WebGamepad::kButtonsLengthCap) + if (item >= Gamepad::kButtonsLengthCap) continue; pad.buttons[item].pressed = event.value;
diff --git a/device/gamepad/gamepad_platform_data_fetcher_linux.h b/device/gamepad/gamepad_platform_data_fetcher_linux.h index da22ba3..0d51e27 100644 --- a/device/gamepad/gamepad_platform_data_fetcher_linux.h +++ b/device/gamepad/gamepad_platform_data_fetcher_linux.h
@@ -13,6 +13,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "device/gamepad/gamepad_data_fetcher.h" +#include "device/gamepad/public/cpp/gamepads.h" extern "C" { struct udev_device; @@ -47,7 +48,7 @@ void ReadDeviceData(size_t index); // File descriptor for the /dev/input/js* devices. -1 if not in use. - int device_fd_[blink::WebGamepads::kItemsLengthCap]; + int device_fd_[Gamepads::kItemsLengthCap]; std::unique_ptr<device::UdevLinux> udev_;
diff --git a/device/gamepad/gamepad_platform_data_fetcher_mac.h b/device/gamepad/gamepad_platform_data_fetcher_mac.h index 11808f3..c65cde9e 100644 --- a/device/gamepad/gamepad_platform_data_fetcher_mac.h +++ b/device/gamepad/gamepad_platform_data_fetcher_mac.h
@@ -16,6 +16,7 @@ #include "base/macros.h" #include "build/build_config.h" #include "device/gamepad/gamepad_data_fetcher.h" +#include "device/gamepad/public/cpp/gamepad.h" #if defined(__OBJC__) @class NSArray; @@ -77,13 +78,13 @@ struct AssociatedData { int location_id; IOHIDDeviceRef device_ref; - IOHIDElementRef button_elements[blink::WebGamepad::kButtonsLengthCap]; - IOHIDElementRef axis_elements[blink::WebGamepad::kAxesLengthCap]; - CFIndex axis_minimums[blink::WebGamepad::kAxesLengthCap]; - CFIndex axis_maximums[blink::WebGamepad::kAxesLengthCap]; - CFIndex axis_report_sizes[blink::WebGamepad::kAxesLengthCap]; + IOHIDElementRef button_elements[Gamepad::kButtonsLengthCap]; + IOHIDElementRef axis_elements[Gamepad::kAxesLengthCap]; + CFIndex axis_minimums[Gamepad::kAxesLengthCap]; + CFIndex axis_maximums[Gamepad::kAxesLengthCap]; + CFIndex axis_report_sizes[Gamepad::kAxesLengthCap]; }; - AssociatedData associated_[blink::WebGamepads::kItemsLengthCap]; + AssociatedData associated_[Gamepads::kItemsLengthCap]; DISALLOW_COPY_AND_ASSIGN(GamepadPlatformDataFetcherMac); };
diff --git a/device/gamepad/gamepad_platform_data_fetcher_mac.mm b/device/gamepad/gamepad_platform_data_fetcher_mac.mm index 3e7313e..b091d96 100644 --- a/device/gamepad/gamepad_platform_data_fetcher_mac.mm +++ b/device/gamepad/gamepad_platform_data_fetcher_mac.mm
@@ -18,19 +18,16 @@ #import <Foundation/Foundation.h> #include <IOKit/hid/IOHIDKeys.h> -using blink::WebGamepad; -using blink::WebGamepads; - namespace device { namespace { void CopyNSStringAsUTF16LittleEndian(NSString* src, - blink::WebUChar* dest, + UChar* dest, size_t dest_len) { NSData* as16 = [src dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; memset(dest, 0, dest_len); - [as16 getBytes:dest length:dest_len - sizeof(blink::WebUChar)]; + [as16 getBytes:dest length:dest_len - sizeof(UChar)]; } NSDictionary* DeviceMatching(uint32_t usage_page, uint32_t usage) { @@ -179,7 +176,7 @@ bool GamepadPlatformDataFetcherMac::AddButtonsAndAxes(NSArray* elements, PadState* state, size_t slot) { - WebGamepad& pad = state->data; + Gamepad& pad = state->data; AssociatedData& associated = associated_[slot]; pad.axes_length = 0; @@ -200,13 +197,13 @@ if (IOHIDElementGetType(element) == kIOHIDElementTypeInput_Button && usage_page == kButtonUsagePage) { uint32_t button_index = usage - 1; - if (button_index < WebGamepad::kButtonsLengthCap) { + if (button_index < Gamepad::kButtonsLengthCap) { associated.button_elements[button_index] = element; pad.buttons_length = std::max(pad.buttons_length, button_index + 1); } } else if (IOHIDElementGetType(element) == kIOHIDElementTypeInput_Misc) { uint32_t axis_index = usage - kAxisMinimumUsageNumber; - if (axis_index < WebGamepad::kAxesLengthCap) { + if (axis_index < Gamepad::kAxesLengthCap) { associated.axis_elements[axis_index] = element; pad.axes_length = std::max(pad.axes_length, axis_index + 1); } else { @@ -226,19 +223,19 @@ uint32_t usage_page = IOHIDElementGetUsagePage(element); uint32_t usage = IOHIDElementGetUsage(element); if (IOHIDElementGetType(element) == kIOHIDElementTypeInput_Misc && - usage - kAxisMinimumUsageNumber >= WebGamepad::kAxesLengthCap && + usage - kAxisMinimumUsageNumber >= Gamepad::kAxesLengthCap && usage_page <= kGameControlsUsagePage) { - for (; next_index < WebGamepad::kAxesLengthCap; ++next_index) { + for (; next_index < Gamepad::kAxesLengthCap; ++next_index) { if (associated.axis_elements[next_index] == NULL) break; } - if (next_index < WebGamepad::kAxesLengthCap) { + if (next_index < Gamepad::kAxesLengthCap) { associated.axis_elements[next_index] = element; pad.axes_length = std::max(pad.axes_length, next_index + 1); } } - if (next_index >= WebGamepad::kAxesLengthCap) + if (next_index >= Gamepad::kAxesLengthCap) break; } } @@ -268,19 +265,19 @@ size_t GamepadPlatformDataFetcherMac::GetEmptySlot() { // Find a free slot for this device. - for (size_t slot = 0; slot < WebGamepads::kItemsLengthCap; ++slot) { + for (size_t slot = 0; slot < Gamepads::kItemsLengthCap; ++slot) { if (associated_[slot].device_ref == nullptr) return slot; } - return WebGamepads::kItemsLengthCap; + return Gamepads::kItemsLengthCap; } size_t GamepadPlatformDataFetcherMac::GetSlotForDevice(IOHIDDeviceRef device) { - for (size_t slot = 0; slot < WebGamepads::kItemsLengthCap; ++slot) { + for (size_t slot = 0; slot < Gamepads::kItemsLengthCap; ++slot) { // If we already have this device, and it's already connected, don't do // anything now. if (associated_[slot].device_ref == device) - return WebGamepads::kItemsLengthCap; + return Gamepads::kItemsLengthCap; } return GetEmptySlot(); } @@ -300,7 +297,7 @@ size_t slot = GetSlotForDevice(device); // We can't handle this many connected devices. - if (slot == WebGamepads::kItemsLengthCap) + if (slot == Gamepads::kItemsLengthCap) return; // Clear some state that may have been left behind by previous gamepads @@ -356,11 +353,11 @@ // Find the index for this device. size_t slot; - for (slot = 0; slot < WebGamepads::kItemsLengthCap; ++slot) { + for (slot = 0; slot < Gamepads::kItemsLengthCap; ++slot) { if (associated_[slot].device_ref == device) break; } - DCHECK(slot < WebGamepads::kItemsLengthCap); + DCHECK(slot < Gamepads::kItemsLengthCap); // Leave associated device_ref so that it will be reconnected in the same // location. Simply mark it as disconnected. associated_[slot].location_id = 0; @@ -376,18 +373,18 @@ // Find device slot. size_t slot; - for (slot = 0; slot < WebGamepads::kItemsLengthCap; ++slot) { + for (slot = 0; slot < Gamepads::kItemsLengthCap; ++slot) { if (associated_[slot].device_ref == device) break; } - if (slot == WebGamepads::kItemsLengthCap) + if (slot == Gamepads::kItemsLengthCap) return; PadState* state = GetPadState(associated_[slot].location_id); if (!state) return; - WebGamepad& pad = state->data; + Gamepad& pad = state->data; AssociatedData& associated = associated_[slot]; uint32_t value_length = IOHIDValueGetLength(value); @@ -442,7 +439,7 @@ return; // Loop through and GetPadState to indicate the devices are still connected. - for (size_t slot = 0; slot < WebGamepads::kItemsLengthCap; ++slot) { + for (size_t slot = 0; slot < Gamepads::kItemsLengthCap; ++slot) { if (associated_[slot].device_ref != nullptr) { GetPadState(associated_[slot].location_id); }
diff --git a/device/gamepad/gamepad_platform_data_fetcher_win.cc b/device/gamepad/gamepad_platform_data_fetcher_win.cc index 045460d4..42404e0 100644 --- a/device/gamepad/gamepad_platform_data_fetcher_win.cc +++ b/device/gamepad/gamepad_platform_data_fetcher_win.cc
@@ -16,8 +16,6 @@ namespace device { -using namespace blink; - namespace { // See http://goo.gl/5VSJR. These are not available in all versions of the @@ -38,7 +36,7 @@ return ((value + 32768.f) / 32767.5f) - 1.f; } -const WebUChar* GamepadSubTypeName(BYTE sub_type) { +const UChar* GamepadSubTypeName(BYTE sub_type) { switch (sub_type) { case kDeviceSubTypeGamepad: return L"GAMEPAD"; @@ -65,7 +63,7 @@ } } -const WebUChar* XInputDllFileName() { +const UChar* XInputDllFileName() { // Xinput.h defines filename (XINPUT_DLL) on different Windows versions, but // Xinput.h specifies it in build time. Approach here uses the same values // and it is resolving dll filename based on Windows version it is running on. @@ -114,16 +112,16 @@ if (!state) continue; // No slot available for this gamepad. - WebGamepad& pad = state->data; + Gamepad& pad = state->data; if (state->active_state == GAMEPAD_NEWLY_ACTIVE) { // This is the first time we've seen this device, so do some one-time // initialization pad.connected = true; - swprintf(pad.id, WebGamepad::kIdLengthCap, + swprintf(pad.id, Gamepad::kIdLengthCap, L"Xbox 360 Controller (XInput STANDARD %ls)", GamepadSubTypeName(caps.SubType)); - swprintf(pad.mapping, WebGamepad::kMappingLengthCap, L"standard"); + swprintf(pad.mapping, Gamepad::kMappingLengthCap, L"standard"); } } } @@ -156,7 +154,7 @@ if (!pad_state) return; - WebGamepad& pad = pad_state->data; + Gamepad& pad = pad_state->data; XINPUT_STATE state; memset(&state, 0, sizeof(XINPUT_STATE));
diff --git a/device/gamepad/gamepad_platform_data_fetcher_win.h b/device/gamepad/gamepad_platform_data_fetcher_win.h index df5b5dcd..cedfa195 100644 --- a/device/gamepad/gamepad_platform_data_fetcher_win.h +++ b/device/gamepad/gamepad_platform_data_fetcher_win.h
@@ -25,7 +25,7 @@ #include "base/scoped_native_library.h" #include "device/gamepad/gamepad_data_fetcher.h" #include "device/gamepad/gamepad_standard_mappings.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" +#include "device/gamepad/public/cpp/gamepads.h" namespace device {
diff --git a/device/gamepad/gamepad_provider.cc b/device/gamepad/gamepad_provider.cc index 44d5e5a8..a560aeb 100644 --- a/device/gamepad/gamepad_provider.cc +++ b/device/gamepad/gamepad_provider.cc
@@ -24,9 +24,6 @@ #include "device/gamepad/gamepad_user_gesture.h" #include "mojo/public/cpp/system/platform_handle.h" -using blink::WebGamepad; -using blink::WebGamepads; - namespace device { GamepadProvider::ClosureAndThread::ClosureAndThread( @@ -102,8 +99,8 @@ true /* read_only */); } -void GamepadProvider::GetCurrentGamepadData(WebGamepads* data) { - const WebGamepads* pads = gamepad_shared_buffer_->buffer(); +void GamepadProvider::GetCurrentGamepadData(Gamepads* data) { + const Gamepads* pads = gamepad_shared_buffer_->buffer(); base::AutoLock lock(shared_memory_lock_); *data = *pads; } @@ -227,8 +224,8 @@ bool changed; - ANNOTATE_BENIGN_RACE_SIZED(gamepad_shared_buffer_->buffer(), - sizeof(WebGamepads), "Racey reads are discarded"); + ANNOTATE_BENIGN_RACE_SIZED(gamepad_shared_buffer_->buffer(), sizeof(Gamepads), + "Racey reads are discarded"); { base::AutoLock lock(devices_changed_lock_); @@ -244,12 +241,12 @@ it->GetGamepadData(changed); } - blink::WebGamepads* buffer = gamepad_shared_buffer_->buffer(); + Gamepads* buffer = gamepad_shared_buffer_->buffer(); // Send out disconnect events using the last polled data before we wipe it out // in the mapping step. if (ever_had_user_gesture_) { - for (unsigned i = 0; i < WebGamepads::kItemsLengthCap; ++i) { + for (unsigned i = 0; i < Gamepads::kItemsLengthCap; ++i) { PadState& state = pad_states_.get()[i]; if (!state.active_state && state.source != GAMEPAD_SOURCE_NONE) { @@ -267,7 +264,7 @@ // Acquire the SeqLock. There is only ever one writer to this data. // See gamepad_shared_buffer.h. gamepad_shared_buffer_->WriteBegin(); - for (unsigned i = 0; i < WebGamepads::kItemsLengthCap; ++i) { + for (unsigned i = 0; i < Gamepads::kItemsLengthCap; ++i) { PadState& state = pad_states_.get()[i]; // Must run through the map+sanitize here or CheckForUserGesture may fail. MapAndSanitizeGamepadData(&state, &buffer->items[i], sanitize_); @@ -276,7 +273,7 @@ } if (ever_had_user_gesture_) { - for (unsigned i = 0; i < WebGamepads::kItemsLengthCap; ++i) { + for (unsigned i = 0; i < Gamepads::kItemsLengthCap; ++i) { PadState& state = pad_states_.get()[i]; if (state.active_state) { @@ -312,7 +309,7 @@ void GamepadProvider::OnGamepadConnectionChange(bool connected, int index, - const WebGamepad& pad) { + const Gamepad& pad) { if (connection_change_client_) connection_change_client_->OnGamepadConnectionChange(connected, index, pad); } @@ -322,7 +319,7 @@ if (user_gesture_observers_.empty() && ever_had_user_gesture_) return; - const WebGamepads* pads = gamepad_shared_buffer_->buffer(); + const Gamepads* pads = gamepad_shared_buffer_->buffer(); if (GamepadsHaveUserGesture(*pads)) { ever_had_user_gesture_ = true; for (size_t i = 0; i < user_gesture_observers_.size(); i++) {
diff --git a/device/gamepad/gamepad_provider.h b/device/gamepad/gamepad_provider.h index bc54d94..6dea63ac 100644 --- a/device/gamepad/gamepad_provider.h +++ b/device/gamepad/gamepad_provider.h
@@ -18,10 +18,9 @@ #include "device/gamepad/gamepad_export.h" #include "device/gamepad/gamepad_pad_state_provider.h" #include "device/gamepad/gamepad_shared_buffer.h" +#include "device/gamepad/public/cpp/gamepads.h" #include "mojo/public/cpp/system/buffer.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" - namespace base { class SingleThreadTaskRunner; class Thread; @@ -35,7 +34,7 @@ public: virtual void OnGamepadConnectionChange(bool connected, int index, - const blink::WebGamepad& pad) = 0; + const Gamepad& pad) = 0; }; class DEVICE_GAMEPAD_EXPORT GamepadProvider @@ -63,7 +62,7 @@ void AddGamepadDataFetcher(GamepadDataFetcher* fetcher); void RemoveGamepadDataFetcher(GamepadDataFetcher* fetcher); - void GetCurrentGamepadData(blink::WebGamepads* data); + void GetCurrentGamepadData(Gamepads* data); // Pause and resume the background polling thread. Can be called from any // thread. @@ -101,9 +100,7 @@ void DoPoll(); void ScheduleDoPoll(); - void OnGamepadConnectionChange(bool connected, - int index, - const blink::WebGamepad& pad); + void OnGamepadConnectionChange(bool connected, int index, const Gamepad& pad); // Checks the gamepad state to see if the user has interacted with it. void CheckForUserGesture();
diff --git a/device/gamepad/gamepad_provider_unittest.cc b/device/gamepad/gamepad_provider_unittest.cc index cef3355..d3d581b 100644 --- a/device/gamepad/gamepad_provider_unittest.cc +++ b/device/gamepad/gamepad_provider_unittest.cc
@@ -19,8 +19,6 @@ namespace { -using blink::WebGamepads; - // Helper class to generate and record user gesture callbacks. class UserGestureListener { public: @@ -43,7 +41,7 @@ // Main test fixture class GamepadProviderTest : public testing::Test, public GamepadTestHelper { public: - GamepadProvider* CreateProvider(const WebGamepads& test_data) { + GamepadProvider* CreateProvider(const Gamepads& test_data) { mock_data_fetcher_ = new MockGamepadDataFetcher(test_data); provider_.reset(new GamepadProvider( nullptr, std::unique_ptr<GamepadDataFetcher>(mock_data_fetcher_))); @@ -73,12 +71,12 @@ } void ReadGamepadHardwareBuffer(GamepadHardwareBuffer* buffer, - WebGamepads* output) { - memset(output, 0, sizeof(WebGamepads)); + Gamepads* output) { + memset(output, 0, sizeof(Gamepads)); base::subtle::Atomic32 version; do { version = buffer->seqlock.ReadBegin(); - memcpy(output, &buffer->data, sizeof(WebGamepads)); + memcpy(output, &buffer->data, sizeof(Gamepads)); } while (buffer->seqlock.ReadRetry(version)); } @@ -94,8 +92,8 @@ }; TEST_F(GamepadProviderTest, PollingAccess) { - WebGamepads test_data; - memset(&test_data, 0, sizeof(WebGamepads)); + Gamepads test_data; + memset(&test_data, 0, sizeof(Gamepads)); test_data.items[0].connected = true; test_data.items[0].timestamp = 0; test_data.items[0].buttons_length = 1; @@ -124,7 +122,7 @@ // Wait until the shared memory buffer has been written at least once. WaitForData(buffer); - WebGamepads output; + Gamepads output; ReadGamepadHardwareBuffer(buffer, &output); EXPECT_EQ(1u, output.items[0].buttons_length); @@ -136,7 +134,7 @@ } TEST_F(GamepadProviderTest, ConnectDisconnectMultiple) { - WebGamepads test_data; + Gamepads test_data; test_data.items[0].connected = true; test_data.items[0].timestamp = 0; test_data.items[0].axes_length = 2; @@ -149,7 +147,7 @@ test_data.items[1].axes[0] = 1.f; test_data.items[1].axes[1] = -.5f; - WebGamepads test_data_onedisconnected; + Gamepads test_data_onedisconnected; test_data_onedisconnected.items[1].connected = true; test_data_onedisconnected.items[1].timestamp = 0; test_data_onedisconnected.items[1].axes_length = 2; @@ -175,7 +173,7 @@ // Wait until the shared memory buffer has been written at least once. WaitForData(buffer); - WebGamepads output; + Gamepads output; ReadGamepadHardwareBuffer(buffer, &output); EXPECT_EQ(2u, output.items[0].axes_length); @@ -199,7 +197,7 @@ // Tests that waiting for a user gesture works properly. TEST_F(GamepadProviderTest, UserGesture) { - WebGamepads no_button_data; + Gamepads no_button_data; no_button_data.items[0].connected = true; no_button_data.items[0].timestamp = 0; no_button_data.items[0].buttons_length = 1; @@ -209,7 +207,7 @@ no_button_data.items[0].axes[0] = 0.f; no_button_data.items[0].axes[1] = .4f; - WebGamepads button_down_data = no_button_data; + Gamepads button_down_data = no_button_data; button_down_data.items[0].buttons[0].value = 1.f; button_down_data.items[0].buttons[0].pressed = true; @@ -252,7 +250,7 @@ // Tests that waiting for a user gesture works properly. TEST_F(GamepadProviderTest, Sanitization) { - WebGamepads active_data; + Gamepads active_data; active_data.items[0].connected = true; active_data.items[0].timestamp = 0; active_data.items[0].buttons_length = 1; @@ -261,7 +259,7 @@ active_data.items[0].buttons[0].pressed = true; active_data.items[0].axes[0] = -1.f; - WebGamepads zero_data; + Gamepads zero_data; zero_data.items[0].connected = true; zero_data.items[0].timestamp = 0; zero_data.items[0].buttons_length = 1; @@ -290,7 +288,7 @@ // Wait until the shared memory buffer has been written at least once. WaitForData(buffer); - WebGamepads output; + Gamepads output; ReadGamepadHardwareBuffer(buffer, &output); // Initial data should all be zeroed out due to sanitization, even though the
diff --git a/device/gamepad/gamepad_service.cc b/device/gamepad/gamepad_service.cc index 2fd5354..3335b256 100644 --- a/device/gamepad/gamepad_service.cc +++ b/device/gamepad/gamepad_service.cc
@@ -108,7 +108,7 @@ void GamepadService::OnGamepadConnectionChange(bool connected, int index, - const blink::WebGamepad& pad) { + const Gamepad& pad) { if (connected) { main_thread_task_runner_->PostTask( FROM_HERE, base::Bind(&GamepadService::OnGamepadConnected, @@ -120,8 +120,7 @@ } } -void GamepadService::OnGamepadConnected(int index, - const blink::WebGamepad& pad) { +void GamepadService::OnGamepadConnected(int index, const Gamepad& pad) { DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); for (ConsumerSet::iterator it = consumers_.begin(); it != consumers_.end(); @@ -131,8 +130,7 @@ } } -void GamepadService::OnGamepadDisconnected(int index, - const blink::WebGamepad& pad) { +void GamepadService::OnGamepadDisconnected(int index, const Gamepad& pad) { DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); for (ConsumerSet::iterator it = consumers_.begin(); it != consumers_.end(); @@ -166,10 +164,10 @@ if (!it->did_observe_user_gesture && it->is_active) { const ConsumerInfo& info = *it; info.did_observe_user_gesture = true; - blink::WebGamepads gamepads; + Gamepads gamepads; provider_->GetCurrentGamepadData(&gamepads); - for (unsigned i = 0; i < blink::WebGamepads::kItemsLengthCap; ++i) { - const blink::WebGamepad& pad = gamepads.items[i]; + for (unsigned i = 0; i < Gamepads::kItemsLengthCap; ++i) { + const Gamepad& pad = gamepads.items[i]; if (pad.connected) info.consumer->OnGamepadConnected(i, pad); }
diff --git a/device/gamepad/gamepad_service.h b/device/gamepad/gamepad_service.h index e9ffbe86..c5e4aaf 100644 --- a/device/gamepad/gamepad_service.h +++ b/device/gamepad/gamepad_service.h
@@ -19,10 +19,6 @@ class SingleThreadTaskRunner; } -namespace blink { -class WebGamepad; -} - namespace content { class GamepadServiceTestConstructor; } @@ -83,10 +79,10 @@ void Terminate(); // Called on IO thread when a gamepad is connected. - void OnGamepadConnected(int index, const blink::WebGamepad& pad); + void OnGamepadConnected(int index, const Gamepad& pad); // Called on IO thread when a gamepad is disconnected. - void OnGamepadDisconnected(int index, const blink::WebGamepad& pad); + void OnGamepadDisconnected(int index, const Gamepad& pad); private: friend struct base::DefaultSingletonTraits<GamepadService>; @@ -107,7 +103,7 @@ void OnGamepadConnectionChange(bool connected, int index, - const blink::WebGamepad& pad) override; + const Gamepad& pad) override; void SetSanitizationEnabled(bool sanitize);
diff --git a/device/gamepad/gamepad_service_unittest.cc b/device/gamepad/gamepad_service_unittest.cc index 97ce7813..86aad62 100644 --- a/device/gamepad/gamepad_service_unittest.cc +++ b/device/gamepad/gamepad_service_unittest.cc
@@ -18,21 +18,17 @@ namespace device { namespace { -static const int kNumberOfGamepads = blink::WebGamepads::kItemsLengthCap; +static const int kNumberOfGamepads = Gamepads::kItemsLengthCap; } -using blink::WebGamepads; - class ConnectionListener : public device::GamepadConsumer { public: ConnectionListener() { ClearCounters(); } - void OnGamepadConnected(unsigned index, - const blink::WebGamepad& gamepad) override { + void OnGamepadConnected(unsigned index, const Gamepad& gamepad) override { connected_counter_++; } - void OnGamepadDisconnected(unsigned index, - const blink::WebGamepad& gamepad) override { + void OnGamepadDisconnected(unsigned index, const Gamepad& gamepad) override { disconnected_counter_++; } @@ -71,7 +67,7 @@ device::MockGamepadDataFetcher* fetcher_; GamepadService* service_; std::unique_ptr<ConnectionListener> connection_listener_; - WebGamepads test_data_; + Gamepads test_data_; DISALLOW_COPY_AND_ASSIGN(GamepadServiceTest); };
diff --git a/device/gamepad/gamepad_shared_buffer.cc b/device/gamepad/gamepad_shared_buffer.cc index 66ada77..a8c22161 100644 --- a/device/gamepad/gamepad_shared_buffer.cc +++ b/device/gamepad/gamepad_shared_buffer.cc
@@ -14,7 +14,7 @@ void* mem = shared_memory_.memory(); DCHECK(mem); hardware_buffer_ = new (mem) GamepadHardwareBuffer(); - memset(&(hardware_buffer_->data), 0, sizeof(blink::WebGamepads)); + memset(&(hardware_buffer_->data), 0, sizeof(Gamepads)); } GamepadSharedBuffer::~GamepadSharedBuffer() {} @@ -23,7 +23,7 @@ return &shared_memory_; } -blink::WebGamepads* GamepadSharedBuffer::buffer() { +Gamepads* GamepadSharedBuffer::buffer() { return &(hardware_buffer()->data); }
diff --git a/device/gamepad/gamepad_shared_buffer.h b/device/gamepad/gamepad_shared_buffer.h index b98e9616..1eb7b93 100644 --- a/device/gamepad/gamepad_shared_buffer.h +++ b/device/gamepad/gamepad_shared_buffer.h
@@ -8,7 +8,7 @@ #include "base/memory/shared_memory.h" #include "device/base/synchronization/shared_memory_seqlock_buffer.h" #include "device/gamepad/gamepad_export.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" +#include "device/gamepad/public/cpp/gamepads.h" namespace device { @@ -25,7 +25,7 @@ */ -typedef SharedMemorySeqLockBuffer<blink::WebGamepads> GamepadHardwareBuffer; +typedef SharedMemorySeqLockBuffer<Gamepads> GamepadHardwareBuffer; class DEVICE_GAMEPAD_EXPORT GamepadSharedBuffer { public: @@ -33,7 +33,7 @@ ~GamepadSharedBuffer(); base::SharedMemory* shared_memory(); - blink::WebGamepads* buffer(); + Gamepads* buffer(); GamepadHardwareBuffer* hardware_buffer(); void WriteBegin();
diff --git a/device/gamepad/gamepad_standard_mappings.cc b/device/gamepad/gamepad_standard_mappings.cc index e4aaf69..d467574 100644 --- a/device/gamepad/gamepad_standard_mappings.cc +++ b/device/gamepad/gamepad_standard_mappings.cc
@@ -6,38 +6,37 @@ namespace device { -blink::WebGamepadButton AxisToButton(float input) { +GamepadButton AxisToButton(float input) { float value = (input + 1.f) / 2.f; bool pressed = value > kDefaultButtonPressedThreshold; bool touched = value > 0.0f; - return blink::WebGamepadButton(pressed, touched, value); + return GamepadButton(pressed, touched, value); } -blink::WebGamepadButton AxisNegativeAsButton(float input) { +GamepadButton AxisNegativeAsButton(float input) { float value = (input < -0.5f) ? 1.f : 0.f; bool pressed = value > kDefaultButtonPressedThreshold; bool touched = value > 0.0f; - return blink::WebGamepadButton(pressed, touched, value); + return GamepadButton(pressed, touched, value); } -blink::WebGamepadButton AxisPositiveAsButton(float input) { +GamepadButton AxisPositiveAsButton(float input) { float value = (input > 0.5f) ? 1.f : 0.f; bool pressed = value > kDefaultButtonPressedThreshold; bool touched = value > 0.0f; - return blink::WebGamepadButton(pressed, touched, value); + return GamepadButton(pressed, touched, value); } -blink::WebGamepadButton ButtonFromButtonAndAxis(blink::WebGamepadButton button, - float axis) { +GamepadButton ButtonFromButtonAndAxis(GamepadButton button, float axis) { float value = (axis + 1.f) / 2.f; - return blink::WebGamepadButton(button.pressed, button.touched, value); + return GamepadButton(button.pressed, button.touched, value); } -blink::WebGamepadButton NullButton() { - return blink::WebGamepadButton(false, false, 0.0); +GamepadButton NullButton() { + return GamepadButton(false, false, 0.0); } -void DpadFromAxis(blink::WebGamepad* mapped, float dir) { +void DpadFromAxis(Gamepad* mapped, float dir) { bool up = false; bool right = false; bool down = false;
diff --git a/device/gamepad/gamepad_standard_mappings.h b/device/gamepad/gamepad_standard_mappings.h index b924533..bb31cff 100644 --- a/device/gamepad/gamepad_standard_mappings.h +++ b/device/gamepad/gamepad_standard_mappings.h
@@ -6,13 +6,12 @@ #define DEVICE_GAMEPAD_GAMEPAD_STANDARD_MAPPINGS_H_ #include "base/strings/string_piece.h" -#include "third_party/WebKit/public/platform/WebGamepad.h" +#include "device/gamepad/public/cpp/gamepad.h" namespace device { -typedef void (*GamepadStandardMappingFunction)( - const blink::WebGamepad& original, - blink::WebGamepad* mapped); +typedef void (*GamepadStandardMappingFunction)(const Gamepad& original, + Gamepad* mapped); GamepadStandardMappingFunction GetGamepadStandardMappingFunction( const base::StringPiece& vendor_id, @@ -63,13 +62,12 @@ const float kDefaultButtonPressedThreshold = 30.f / 255.f; // Common mapping functions -blink::WebGamepadButton AxisToButton(float input); -blink::WebGamepadButton AxisNegativeAsButton(float input); -blink::WebGamepadButton AxisPositiveAsButton(float input); -blink::WebGamepadButton ButtonFromButtonAndAxis(blink::WebGamepadButton button, - float axis); -blink::WebGamepadButton NullButton(); -void DpadFromAxis(blink::WebGamepad* mapped, float dir); +GamepadButton AxisToButton(float input); +GamepadButton AxisNegativeAsButton(float input); +GamepadButton AxisPositiveAsButton(float input); +GamepadButton ButtonFromButtonAndAxis(GamepadButton button, float axis); +GamepadButton NullButton(); +void DpadFromAxis(Gamepad* mapped, float dir); } // namespace device
diff --git a/device/gamepad/gamepad_standard_mappings_linux.cc b/device/gamepad/gamepad_standard_mappings_linux.cc index 9de994353..17b8afc 100644 --- a/device/gamepad/gamepad_standard_mappings_linux.cc +++ b/device/gamepad/gamepad_standard_mappings_linux.cc
@@ -11,8 +11,7 @@ namespace { -void MapperXInputStyleGamepad(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperXInputStyleGamepad(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[2]); mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[5]); @@ -32,8 +31,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperXboxOneHidGamepad(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperXboxOneHidGamepad(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; @@ -59,8 +57,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperLakeviewResearch(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperLakeviewResearch(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[2]; mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3]; @@ -80,8 +77,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperPlaystationSixAxis(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperPlaystationSixAxis(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[14]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[13]; @@ -105,8 +101,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperDualshock4(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperDualshock4(const Gamepad& input, Gamepad* mapped) { enum Dualshock4Buttons { DUALSHOCK_BUTTON_TOUCHPAD = BUTTON_INDEX_COUNT, DUALSHOCK_BUTTON_COUNT @@ -138,7 +133,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperIBuffalo(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperIBuffalo(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[1]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[0]; @@ -157,7 +152,7 @@ mapped->axes_length = 2; } -void MapperXGEAR(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperXGEAR(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[2]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1]; @@ -178,8 +173,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperDragonRiseGeneric(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperDragonRiseGeneric(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_DPAD_UP] = AxisNegativeAsButton(input.axes[6]); mapped->buttons[BUTTON_INDEX_DPAD_DOWN] = AxisPositiveAsButton(input.axes[6]); @@ -194,8 +188,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperOnLiveWireless(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperOnLiveWireless(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[2]); mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[5]); @@ -216,7 +209,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperADT1(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperADT1(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[5]); mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[4]); @@ -235,7 +228,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperNvShield(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperNvShield(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[5]); mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[4]); @@ -254,7 +247,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperOUYA(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperOUYA(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[3]; @@ -280,8 +273,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperRazerServal(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperRazerServal(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[5]); mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[4]); @@ -299,7 +291,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperMogaPro(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperMogaPro(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[5]); mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[4]); @@ -317,8 +309,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperSamsung_EI_GP20(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperSamsung_EI_GP20(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
diff --git a/device/gamepad/gamepad_standard_mappings_mac.mm b/device/gamepad/gamepad_standard_mappings_mac.mm index 5fb8f09..27e12ce 100644 --- a/device/gamepad/gamepad_standard_mappings_mac.mm +++ b/device/gamepad/gamepad_standard_mappings_mac.mm
@@ -11,8 +11,7 @@ namespace { -void MapperXbox360Gamepad(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperXbox360Gamepad(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = AxisToButton(input.axes[2]); mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = AxisToButton(input.axes[5]); @@ -31,8 +30,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperXboxOneHidGamepad(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperXboxOneHidGamepad(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; @@ -54,8 +52,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperPlaystationSixAxis(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperPlaystationSixAxis(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[14]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[13]; @@ -91,8 +88,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperDualshock4(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperDualshock4(const Gamepad& input, Gamepad* mapped) { enum Dualshock4Buttons { DUALSHOCK_BUTTON_TOUCHPAD = BUTTON_INDEX_COUNT, DUALSHOCK_BUTTON_COUNT @@ -120,7 +116,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperIBuffalo(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperIBuffalo(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[1]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[0]; @@ -139,8 +135,7 @@ mapped->axes_length = 2; } -void MapperDirectInputStyle(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperDirectInputStyle(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[1]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[2]; @@ -151,8 +146,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperMacallyIShock(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperMacallyIShock(const Gamepad& input, Gamepad* mapped) { enum IShockButtons { ISHOCK_BUTTON_C = BUTTON_INDEX_COUNT, ISHOCK_BUTTON_D, @@ -190,7 +184,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperXGEAR(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperXGEAR(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[2]; mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3]; @@ -206,8 +200,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperSmartJoyPLUS(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperSmartJoyPLUS(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[2]; mapped->buttons[BUTTON_INDEX_TERTIARY] = input.buttons[3]; @@ -224,8 +217,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperDragonRiseGeneric(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperDragonRiseGeneric(const Gamepad& input, Gamepad* mapped) { *mapped = input; DpadFromAxis(mapped, input.axes[9]); mapped->axes[AXIS_INDEX_LEFT_STICK_X] = input.axes[0]; @@ -236,8 +228,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperOnLiveWireless(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperOnLiveWireless(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1]; @@ -260,7 +251,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperADT1(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperADT1(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1]; @@ -282,7 +273,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperNvShield(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperNvShield(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1]; @@ -304,7 +295,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperOUYA(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperOUYA(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[3]; @@ -330,8 +321,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperRazerServal(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperRazerServal(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1]; @@ -352,7 +342,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperMogaPro(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperMogaPro(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
diff --git a/device/gamepad/gamepad_standard_mappings_win.cc b/device/gamepad/gamepad_standard_mappings_win.cc index 1a11227..b73f119 100644 --- a/device/gamepad/gamepad_standard_mappings_win.cc +++ b/device/gamepad/gamepad_standard_mappings_win.cc
@@ -11,8 +11,7 @@ namespace { -void MapperLogitechDualAction(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperLogitechDualAction(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[1]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[2]; @@ -24,8 +23,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void Mapper2Axes8Keys(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void Mapper2Axes8Keys(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[2]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1]; @@ -38,18 +36,17 @@ AxisPositiveAsButton(input.axes[0]); // Missing buttons - mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = blink::WebGamepadButton(); - mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = blink::WebGamepadButton(); - mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = blink::WebGamepadButton(); - mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = blink::WebGamepadButton(); - mapped->buttons[BUTTON_INDEX_META] = blink::WebGamepadButton(); + mapped->buttons[BUTTON_INDEX_LEFT_TRIGGER] = GamepadButton(); + mapped->buttons[BUTTON_INDEX_RIGHT_TRIGGER] = GamepadButton(); + mapped->buttons[BUTTON_INDEX_LEFT_THUMBSTICK] = GamepadButton(); + mapped->buttons[BUTTON_INDEX_RIGHT_THUMBSTICK] = GamepadButton(); + mapped->buttons[BUTTON_INDEX_META] = GamepadButton(); mapped->buttons_length = BUTTON_INDEX_COUNT - 1; mapped->axes_length = 0; } -void MapperDualshock4(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperDualshock4(const Gamepad& input, Gamepad* mapped) { enum Dualshock4Buttons { DUALSHOCK_BUTTON_TOUCHPAD = BUTTON_INDEX_COUNT, DUALSHOCK_BUTTON_COUNT @@ -77,7 +74,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperIBuffalo(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperIBuffalo(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[1]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[0]; @@ -96,8 +93,7 @@ mapped->axes_length = 2; } -void MapperOnLiveWireless(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperOnLiveWireless(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1]; @@ -120,7 +116,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperADT1(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperADT1(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1]; @@ -142,7 +138,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperNvShield(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperNvShield(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1]; @@ -164,7 +160,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperOUYA(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperOUYA(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[3]; @@ -190,8 +186,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperRazerServal(const blink::WebGamepad& input, - blink::WebGamepad* mapped) { +void MapperRazerServal(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1]; @@ -212,7 +207,7 @@ mapped->axes_length = AXIS_INDEX_COUNT; } -void MapperMogaPro(const blink::WebGamepad& input, blink::WebGamepad* mapped) { +void MapperMogaPro(const Gamepad& input, Gamepad* mapped) { *mapped = input; mapped->buttons[BUTTON_INDEX_PRIMARY] = input.buttons[0]; mapped->buttons[BUTTON_INDEX_SECONDARY] = input.buttons[1];
diff --git a/device/gamepad/gamepad_test_helpers.cc b/device/gamepad/gamepad_test_helpers.cc index cd1f5cda..d6e27d47 100644 --- a/device/gamepad/gamepad_test_helpers.cc +++ b/device/gamepad/gamepad_test_helpers.cc
@@ -6,8 +6,7 @@ namespace device { -MockGamepadDataFetcher::MockGamepadDataFetcher( - const blink::WebGamepads& test_data) +MockGamepadDataFetcher::MockGamepadDataFetcher(const Gamepads& test_data) : test_data_(test_data), read_data_(base::WaitableEvent::ResetPolicy::AUTOMATIC, base::WaitableEvent::InitialState::NOT_SIGNALED) {} @@ -22,11 +21,11 @@ { base::AutoLock lock(lock_); - for (unsigned int i = 0; i < blink::WebGamepads::kItemsLengthCap; ++i) { + for (unsigned int i = 0; i < Gamepads::kItemsLengthCap; ++i) { if (test_data_.items[i].connected) { PadState* pad = GetPadState(i); if (pad) - memcpy(&pad->data, &test_data_.items[i], sizeof(blink::WebGamepad)); + memcpy(&pad->data, &test_data_.items[i], sizeof(Gamepad)); } } } @@ -46,7 +45,7 @@ WaitForDataRead(); } -void MockGamepadDataFetcher::SetTestData(const blink::WebGamepads& new_data) { +void MockGamepadDataFetcher::SetTestData(const Gamepads& new_data) { base::AutoLock lock(lock_); test_data_ = new_data; } @@ -56,7 +55,7 @@ GamepadTestHelper::~GamepadTestHelper() {} GamepadServiceTestConstructor::GamepadServiceTestConstructor( - const blink::WebGamepads& test_data) { + const Gamepads& test_data) { data_fetcher_ = new MockGamepadDataFetcher(test_data); gamepad_service_ = new GamepadService(std::unique_ptr<GamepadDataFetcher>(data_fetcher_));
diff --git a/device/gamepad/gamepad_test_helpers.h b/device/gamepad/gamepad_test_helpers.h index b4f8c93..87857c2 100644 --- a/device/gamepad/gamepad_test_helpers.h +++ b/device/gamepad/gamepad_test_helpers.h
@@ -14,7 +14,7 @@ #include "device/gamepad/gamepad_data_fetcher.h" #include "device/gamepad/gamepad_service.h" #include "device/gamepad/gamepad_shared_buffer.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" +#include "device/gamepad/public/cpp/gamepads.h" namespace device { @@ -23,7 +23,7 @@ public: // Initializes the fetcher with the given gamepad data, which will be // returned when the provider queries us. - explicit MockGamepadDataFetcher(const blink::WebGamepads& test_data); + explicit MockGamepadDataFetcher(const Gamepads& test_data); ~MockGamepadDataFetcher() override; @@ -42,11 +42,11 @@ void WaitForDataReadAndCallbacksIssued(); // Updates the test data. - void SetTestData(const blink::WebGamepads& new_data); + void SetTestData(const Gamepads& new_data); private: base::Lock lock_; - blink::WebGamepads test_data_; + Gamepads test_data_; base::WaitableEvent read_data_; DISALLOW_COPY_AND_ASSIGN(MockGamepadDataFetcher); @@ -71,7 +71,7 @@ // global singleton for the gamepad service. class GamepadServiceTestConstructor : public GamepadTestHelper { public: - explicit GamepadServiceTestConstructor(const blink::WebGamepads& test_data); + explicit GamepadServiceTestConstructor(const Gamepads& test_data); ~GamepadServiceTestConstructor() override; GamepadService* gamepad_service() { return gamepad_service_; }
diff --git a/device/gamepad/gamepad_user_gesture.cc b/device/gamepad/gamepad_user_gesture.cc index 3307bbd..b4da5e0 100644 --- a/device/gamepad/gamepad_user_gesture.cc +++ b/device/gamepad/gamepad_user_gesture.cc
@@ -8,7 +8,7 @@ #include <algorithm> -#include "third_party/WebKit/public/platform/WebGamepads.h" +#include "device/gamepad/public/cpp/gamepads.h" namespace { // A big enough deadzone to detect accidental presses. @@ -17,9 +17,9 @@ namespace device { -bool GamepadsHaveUserGesture(const blink::WebGamepads& gamepads) { - for (unsigned int i = 0; i < blink::WebGamepads::kItemsLengthCap; i++) { - const blink::WebGamepad& pad = gamepads.items[i]; +bool GamepadsHaveUserGesture(const Gamepads& gamepads) { + for (unsigned int i = 0; i < Gamepads::kItemsLengthCap; i++) { + const Gamepad& pad = gamepads.items[i]; // If the device is physically connected, then check the buttons and axes // to see if there is currently an intentional user action.
diff --git a/device/gamepad/gamepad_user_gesture.h b/device/gamepad/gamepad_user_gesture.h index d88601f..fa7e73c 100644 --- a/device/gamepad/gamepad_user_gesture.h +++ b/device/gamepad/gamepad_user_gesture.h
@@ -5,15 +5,13 @@ #ifndef DEVICE_GAMEPAD_USER_GESTURE_H_ #define DEVICE_GAMEPAD_USER_GESTURE_H_ -namespace blink { -class WebGamepads; -} - namespace device { +class Gamepads; + // Returns true if any of the gamepads have a button pressed or axis moved // that would be considered a user gesture for interaction. -bool GamepadsHaveUserGesture(const blink::WebGamepads& gamepads); +bool GamepadsHaveUserGesture(const Gamepads& gamepads); } // namespace device
diff --git a/device/gamepad/public/cpp/BUILD.gn b/device/gamepad/public/cpp/BUILD.gn new file mode 100644 index 0000000..fdec85b --- /dev/null +++ b/device/gamepad/public/cpp/BUILD.gn
@@ -0,0 +1,23 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This target contains only those files that are shared by the Device Gamepad +# implementation and all Device Gamepad clients, including Blink. Add a file +# here only if it meets the following constraints: +# (1) It is *necessary* to use the file to consume Device Gamepad (the +# current files define structs that are used as a consistent interpretation of +# shared memory by the Device Gamepad and its clients). +# (2) The file has no dependencies on the STL or Chromium code and will not +# grow them over time (the current files are POD structs and will necessarily +# stay that way due to their above-described purpose). +# Consult {platform-architecture-dev, services-dev}@chromium.org in the case +# of any uncertainty. +source_set("shared_with_blink") { + sources = [ + "gamepad.cc", + "gamepad.h", + "gamepads.h", + ] + # Do not add deps here per the above comment. +}
diff --git a/device/gamepad/public/cpp/gamepad.cc b/device/gamepad/public/cpp/gamepad.cc new file mode 100644 index 0000000..bd5bf4ed --- /dev/null +++ b/device/gamepad/public/cpp/gamepad.cc
@@ -0,0 +1,21 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "device/gamepad/public/cpp/gamepad.h" + +namespace device { + +Gamepad::Gamepad() + : connected(false), + timestamp(0), + axes_length(0), + buttons_length(0), + display_id(0) { + id[0] = 0; + mapping[0] = 0; +} + +Gamepad::Gamepad(const Gamepad& other) = default; + +} // namespace device
diff --git a/device/gamepad/public/cpp/gamepad.h b/device/gamepad/public/cpp/gamepad.h new file mode 100644 index 0000000..c8a7e8bd --- /dev/null +++ b/device/gamepad/public/cpp/gamepad.h
@@ -0,0 +1,115 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef DEVICE_GAMEPAD_PUBLIC_CPP_GAMEPAD_H_ +#define DEVICE_GAMEPAD_PUBLIC_CPP_GAMEPAD_H_ + +#include <stddef.h> + +namespace device { + +#pragma pack(push, 4) + +class GamepadButton { + public: + GamepadButton() : pressed(false), touched(false), value(0.) {} + GamepadButton(bool pressed, bool touched, double value) + : pressed(pressed), touched(touched), value(value) {} + bool pressed; + bool touched; + double value; +}; + +class GamepadVector { + public: + GamepadVector() : not_null(false) {} + + bool not_null; + float x, y, z; +}; + +class GamepadQuaternion { + public: + GamepadQuaternion() : not_null(false) {} + + bool not_null; + float x, y, z, w; +}; + +class GamepadPose { + public: + GamepadPose() : not_null(false) {} + + bool not_null; + + bool has_orientation; + bool has_position; + + GamepadQuaternion orientation; + GamepadVector position; + GamepadVector angular_velocity; + GamepadVector linear_velocity; + GamepadVector angular_acceleration; + GamepadVector linear_acceleration; +}; + +enum class GamepadHand { kNone = 0, kLeft = 1, kRight = 2 }; + +// UTF-16 character type +#if defined(WIN32) +using UChar = wchar_t; +#else +using UChar = unsigned short; +#endif + +// This structure is intentionally POD and fixed size so that it can be shared +// memory between hardware polling threads and the rest of the browser. See +// also gamepads.h. +class Gamepad { + public: + static constexpr size_t kIdLengthCap = 128; + static constexpr size_t kMappingLengthCap = 16; + static constexpr size_t kAxesLengthCap = 16; + static constexpr size_t kButtonsLengthCap = 32; + + Gamepad(); + Gamepad(const Gamepad& other); + + // Is there a gamepad connected at this index? + bool connected; + + // Device identifier (based on manufacturer, model, etc.). + UChar id[kIdLengthCap]; + + // Monotonically increasing value referring to when the data were last + // updated. + unsigned long long timestamp; + + // Number of valid entries in the axes array. + unsigned axes_length; + + // Normalized values representing axes, in the range [-1..1]. + double axes[kAxesLengthCap]; + + // Number of valid entries in the buttons array. + unsigned buttons_length; + + // Button states + GamepadButton buttons[kButtonsLengthCap]; + + // Mapping type (for example "standard") + UChar mapping[kMappingLengthCap]; + + GamepadPose pose; + + GamepadHand hand; + + unsigned display_id; +}; + +#pragma pack(pop) + +} // namespace device + +#endif // DEVICE_GAMEPAD_PUBLIC_CPP_GAMEPAD_H_
diff --git a/device/gamepad/public/cpp/gamepads.h b/device/gamepad/public/cpp/gamepads.h new file mode 100644 index 0000000..e5ebebf --- /dev/null +++ b/device/gamepad/public/cpp/gamepads.h
@@ -0,0 +1,29 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef DEVICE_GAMEPAD_PUBLIC_CPP_GAMEPADS_H_ +#define DEVICE_GAMEPAD_PUBLIC_CPP_GAMEPADS_H_ + +#include "device/gamepad/public/cpp/gamepad.h" + +namespace device { + +#pragma pack(push, 4) + +// This structure is intentionally POD and fixed size so that it can be stored +// in shared memory between hardware polling threads and the rest of the +// browser. +class Gamepads { + public: + static constexpr size_t kItemsLengthCap = 4; + + // Gamepad data for N separate gamepad devices. + Gamepad items[kItemsLengthCap]; +}; + +#pragma pack(pop) + +} // namespace device + +#endif // DEVICE_GAMEPAD_PUBLIC_CPP_GAMEPADS_H_
diff --git a/device/gamepad/public/interfaces/OWNERS b/device/gamepad/public/interfaces/OWNERS index a4ead6e..51ec2e6 100644 --- a/device/gamepad/public/interfaces/OWNERS +++ b/device/gamepad/public/interfaces/OWNERS
@@ -4,3 +4,5 @@ per-file *.mojom=file://ipc/SECURITY_OWNERS per-file *_struct_traits*.*=set noparent per-file *_struct_traits*.*=file://ipc/SECURITY_OWNERS +per-file *.typemap=set noparent +per-file *.typemap=file://ipc/SECURITY_OWNERS
diff --git a/device/gamepad/public/interfaces/gamepad.typemap b/device/gamepad/public/interfaces/gamepad.typemap index 531b5d00..81850d6 100644 --- a/device/gamepad/public/interfaces/gamepad.typemap +++ b/device/gamepad/public/interfaces/gamepad.typemap
@@ -3,7 +3,7 @@ # found in the LICENSE file. mojom = "//device/gamepad/public/interfaces/gamepad.mojom" -public_headers = [ "//third_party/WebKit/public/platform/WebGamepad.h" ] +public_headers = [ "//device/gamepad/public/cpp/gamepad.h" ] traits_headers = [ "//device/gamepad/public/interfaces/gamepad_struct_traits.h" ] sources = [ @@ -15,10 +15,10 @@ ] type_mappings = [ - "device.mojom.Gamepad=blink::WebGamepad", - "device.mojom.GamepadButton=blink::WebGamepadButton", - "device.mojom.GamepadHand=blink::WebGamepadHand", - "device.mojom.GamepadPose=blink::WebGamepadPose[nullable_is_same_type]", - "device.mojom.GamepadQuaternion=blink::WebGamepadQuaternion[nullable_is_same_type]", - "device.mojom.GamepadVector=blink::WebGamepadVector[nullable_is_same_type]", + "device.mojom.Gamepad=device::Gamepad", + "device.mojom.GamepadButton=device::GamepadButton", + "device.mojom.GamepadHand=device::GamepadHand", + "device.mojom.GamepadPose=device::GamepadPose[nullable_is_same_type]", + "device.mojom.GamepadQuaternion=device::GamepadQuaternion[nullable_is_same_type]", + "device.mojom.GamepadVector=device::GamepadVector[nullable_is_same_type]", ]
diff --git a/device/gamepad/public/interfaces/gamepad_struct_traits.cc b/device/gamepad/public/interfaces/gamepad_struct_traits.cc index 3d02a27..2a97cea 100644 --- a/device/gamepad/public/interfaces/gamepad_struct_traits.cc +++ b/device/gamepad/public/interfaces/gamepad_struct_traits.cc
@@ -9,16 +9,16 @@ // static void StructTraits< device::mojom::GamepadQuaternionDataView, - blink::WebGamepadQuaternion>::SetToNull(blink::WebGamepadQuaternion* out) { - memset(out, 0, sizeof(blink::WebGamepadQuaternion)); + device::GamepadQuaternion>::SetToNull(device::GamepadQuaternion* out) { + memset(out, 0, sizeof(device::GamepadQuaternion)); out->not_null = false; } // static bool StructTraits<device::mojom::GamepadQuaternionDataView, - blink::WebGamepadQuaternion>:: + device::GamepadQuaternion>:: Read(device::mojom::GamepadQuaternionDataView data, - blink::WebGamepadQuaternion* out) { + device::GamepadQuaternion* out) { out->not_null = true; out->x = data.x(); out->y = data.y(); @@ -29,17 +29,16 @@ // static void StructTraits<device::mojom::GamepadVectorDataView, - blink::WebGamepadVector>::SetToNull(blink::WebGamepadVector* - out) { - memset(out, 0, sizeof(blink::WebGamepadVector)); + device::GamepadVector>::SetToNull(device::GamepadVector* + out) { + memset(out, 0, sizeof(device::GamepadVector)); out->not_null = false; } // static -bool StructTraits< - device::mojom::GamepadVectorDataView, - blink::WebGamepadVector>::Read(device::mojom::GamepadVectorDataView data, - blink::WebGamepadVector* out) { +bool StructTraits<device::mojom::GamepadVectorDataView, device::GamepadVector>:: + Read(device::mojom::GamepadVectorDataView data, + device::GamepadVector* out) { out->not_null = true; out->x = data.x(); out->y = data.y(); @@ -48,10 +47,9 @@ } // static -bool StructTraits< - device::mojom::GamepadButtonDataView, - blink::WebGamepadButton>::Read(device::mojom::GamepadButtonDataView data, - blink::WebGamepadButton* out) { +bool StructTraits<device::mojom::GamepadButtonDataView, device::GamepadButton>:: + Read(device::mojom::GamepadButtonDataView data, + device::GamepadButton* out) { out->pressed = data.pressed(); out->touched = data.touched(); out->value = data.value(); @@ -60,15 +58,14 @@ // static void StructTraits<device::mojom::GamepadPoseDataView, - blink::WebGamepadPose>::SetToNull(blink::WebGamepadPose* - out) { - memset(out, 0, sizeof(blink::WebGamepadPose)); + device::GamepadPose>::SetToNull(device::GamepadPose* out) { + memset(out, 0, sizeof(device::GamepadPose)); out->not_null = false; } // static -bool StructTraits<device::mojom::GamepadPoseDataView, blink::WebGamepadPose>:: - Read(device::mojom::GamepadPoseDataView data, blink::WebGamepadPose* out) { +bool StructTraits<device::mojom::GamepadPoseDataView, device::GamepadPose>:: + Read(device::mojom::GamepadPoseDataView data, device::GamepadPose* out) { out->not_null = true; if (!data.ReadOrientation(&out->orientation)) { return false; @@ -97,14 +94,14 @@ // static device::mojom::GamepadHand -EnumTraits<device::mojom::GamepadHand, blink::WebGamepadHand>::ToMojom( - blink::WebGamepadHand input) { +EnumTraits<device::mojom::GamepadHand, device::GamepadHand>::ToMojom( + device::GamepadHand input) { switch (input) { - case blink::WebGamepadHand::kGamepadHandNone: + case device::GamepadHand::kNone: return device::mojom::GamepadHand::GamepadHandNone; - case blink::WebGamepadHand::kGamepadHandLeft: + case device::GamepadHand::kLeft: return device::mojom::GamepadHand::GamepadHandLeft; - case blink::WebGamepadHand::kGamepadHandRight: + case device::GamepadHand::kRight: return device::mojom::GamepadHand::GamepadHandRight; } @@ -113,18 +110,18 @@ } // static -bool EnumTraits<device::mojom::GamepadHand, blink::WebGamepadHand>::FromMojom( +bool EnumTraits<device::mojom::GamepadHand, device::GamepadHand>::FromMojom( device::mojom::GamepadHand input, - blink::WebGamepadHand* output) { + device::GamepadHand* output) { switch (input) { case device::mojom::GamepadHand::GamepadHandNone: - *output = blink::WebGamepadHand::kGamepadHandNone; + *output = device::GamepadHand::kNone; return true; case device::mojom::GamepadHand::GamepadHandLeft: - *output = blink::WebGamepadHand::kGamepadHandLeft; + *output = device::GamepadHand::kLeft; return true; case device::mojom::GamepadHand::GamepadHandRight: - *output = blink::WebGamepadHand::kGamepadHandRight; + *output = device::GamepadHand::kRight; return true; } @@ -134,10 +131,10 @@ // static ConstCArray<uint16_t> -StructTraits<device::mojom::GamepadDataView, blink::WebGamepad>::id( - const blink::WebGamepad& r) { +StructTraits<device::mojom::GamepadDataView, device::Gamepad>::id( + const device::Gamepad& r) { size_t id_length = 0; - while (id_length < blink::WebGamepad::kIdLengthCap && r.id[id_length] != 0) { + while (id_length < device::Gamepad::kIdLengthCap && r.id[id_length] != 0) { id_length++; } return {id_length, reinterpret_cast<const uint16_t*>(&r.id[0])}; @@ -145,10 +142,10 @@ // static ConstCArray<uint16_t> -StructTraits<device::mojom::GamepadDataView, blink::WebGamepad>::mapping( - const blink::WebGamepad& r) { +StructTraits<device::mojom::GamepadDataView, device::Gamepad>::mapping( + const device::Gamepad& r) { size_t mapping_length = 0; - while (mapping_length < blink::WebGamepad::kMappingLengthCap && + while (mapping_length < device::Gamepad::kMappingLengthCap && r.mapping[mapping_length] != 0) { mapping_length++; } @@ -156,14 +153,13 @@ } // static -bool StructTraits<device::mojom::GamepadDataView, blink::WebGamepad>::Read( +bool StructTraits<device::mojom::GamepadDataView, device::Gamepad>::Read( device::mojom::GamepadDataView data, - blink::WebGamepad* out) { + device::Gamepad* out) { out->connected = data.connected(); - memset(&out->id[0], 0, - blink::WebGamepad::kIdLengthCap * sizeof(blink::WebUChar)); - CArray<uint16_t> id = {0, blink::WebGamepad::kIdLengthCap, + memset(&out->id[0], 0, device::Gamepad::kIdLengthCap * sizeof(device::UChar)); + CArray<uint16_t> id = {0, device::Gamepad::kIdLengthCap, reinterpret_cast<uint16_t*>(&out->id[0])}; if (!data.ReadId(&id)) { return false; @@ -171,15 +167,15 @@ out->timestamp = data.timestamp(); - CArray<double> axes = {0, blink::WebGamepad::kAxesLengthCap, &out->axes[0]}; + CArray<double> axes = {0, device::Gamepad::kAxesLengthCap, &out->axes[0]}; if (!data.ReadAxes(&axes)) { return false; } // static_cast is safe when "data.ReadAxes(&axes)" above returns true. out->axes_length = static_cast<unsigned>(axes.size); - CArray<blink::WebGamepadButton> buttons = { - 0, blink::WebGamepad::kButtonsLengthCap, &out->buttons[0]}; + CArray<device::GamepadButton> buttons = { + 0, device::Gamepad::kButtonsLengthCap, &out->buttons[0]}; if (!data.ReadButtons(&buttons)) { return false; } @@ -187,8 +183,8 @@ out->buttons_length = static_cast<unsigned>(buttons.size); memset(&out->mapping[0], 0, - blink::WebGamepad::kMappingLengthCap * sizeof(blink::WebUChar)); - CArray<uint16_t> mapping = {0, blink::WebGamepad::kMappingLengthCap, + device::Gamepad::kMappingLengthCap * sizeof(device::UChar)); + CArray<uint16_t> mapping = {0, device::Gamepad::kMappingLengthCap, reinterpret_cast<uint16_t*>(&out->mapping[0])}; if (!data.ReadMapping(&mapping)) { return false; @@ -198,7 +194,7 @@ return false; } - blink::WebGamepadHand hand; + device::GamepadHand hand; if (!data.ReadHand(&hand)) { return false; }
diff --git a/device/gamepad/public/interfaces/gamepad_struct_traits.h b/device/gamepad/public/interfaces/gamepad_struct_traits.h index b0a334e..9d02f52 100644 --- a/device/gamepad/public/interfaces/gamepad_struct_traits.h +++ b/device/gamepad/public/interfaces/gamepad_struct_traits.h
@@ -7,113 +7,107 @@ #include <stddef.h> +#include "device/gamepad/public/cpp/gamepad.h" #include "device/gamepad/public/interfaces/gamepad.mojom.h" #include "mojo/public/cpp/bindings/array_traits_carray.h" #include "mojo/public/cpp/bindings/struct_traits.h" -#include "third_party/WebKit/public/platform/WebGamepad.h" namespace mojo { template <> struct StructTraits<device::mojom::GamepadQuaternionDataView, - blink::WebGamepadQuaternion> { - static bool IsNull(const blink::WebGamepadQuaternion& r) { - return !r.not_null; - } - static void SetToNull(blink::WebGamepadQuaternion* out); - static float x(const blink::WebGamepadQuaternion& r) { return r.x; } - static float y(const blink::WebGamepadQuaternion& r) { return r.y; } - static float z(const blink::WebGamepadQuaternion& r) { return r.z; } - static float w(const blink::WebGamepadQuaternion& r) { return r.w; } + device::GamepadQuaternion> { + static bool IsNull(const device::GamepadQuaternion& r) { return !r.not_null; } + static void SetToNull(device::GamepadQuaternion* out); + static float x(const device::GamepadQuaternion& r) { return r.x; } + static float y(const device::GamepadQuaternion& r) { return r.y; } + static float z(const device::GamepadQuaternion& r) { return r.z; } + static float w(const device::GamepadQuaternion& r) { return r.w; } static bool Read(device::mojom::GamepadQuaternionDataView data, - blink::WebGamepadQuaternion* out); + device::GamepadQuaternion* out); }; template <> struct StructTraits<device::mojom::GamepadVectorDataView, - blink::WebGamepadVector> { - static bool IsNull(const blink::WebGamepadVector& r) { return !r.not_null; } - static void SetToNull(blink::WebGamepadVector* out); - static float x(const blink::WebGamepadVector& r) { return r.x; } - static float y(const blink::WebGamepadVector& r) { return r.y; } - static float z(const blink::WebGamepadVector& r) { return r.z; } + device::GamepadVector> { + static bool IsNull(const device::GamepadVector& r) { return !r.not_null; } + static void SetToNull(device::GamepadVector* out); + static float x(const device::GamepadVector& r) { return r.x; } + static float y(const device::GamepadVector& r) { return r.y; } + static float z(const device::GamepadVector& r) { return r.z; } static bool Read(device::mojom::GamepadVectorDataView data, - blink::WebGamepadVector* out); + device::GamepadVector* out); }; template <> struct StructTraits<device::mojom::GamepadButtonDataView, - blink::WebGamepadButton> { - static bool pressed(const blink::WebGamepadButton& r) { return r.pressed; } - static bool touched(const blink::WebGamepadButton& r) { return r.touched; } - static double value(const blink::WebGamepadButton& r) { return r.value; } + device::GamepadButton> { + static bool pressed(const device::GamepadButton& r) { return r.pressed; } + static bool touched(const device::GamepadButton& r) { return r.touched; } + static double value(const device::GamepadButton& r) { return r.value; } static bool Read(device::mojom::GamepadButtonDataView data, - blink::WebGamepadButton* out); + device::GamepadButton* out); }; template <> -struct StructTraits<device::mojom::GamepadPoseDataView, blink::WebGamepadPose> { - static bool IsNull(const blink::WebGamepadPose& r) { return !r.not_null; } - static void SetToNull(blink::WebGamepadPose* out); - static const blink::WebGamepadQuaternion& orientation( - const blink::WebGamepadPose& r) { +struct StructTraits<device::mojom::GamepadPoseDataView, device::GamepadPose> { + static bool IsNull(const device::GamepadPose& r) { return !r.not_null; } + static void SetToNull(device::GamepadPose* out); + static const device::GamepadQuaternion& orientation( + const device::GamepadPose& r) { return r.orientation; } - static const blink::WebGamepadVector& position( - const blink::WebGamepadPose& r) { + static const device::GamepadVector& position(const device::GamepadPose& r) { return r.position; } - static const blink::WebGamepadVector& angular_velocity( - const blink::WebGamepadPose& r) { + static const device::GamepadVector& angular_velocity( + const device::GamepadPose& r) { return r.angular_velocity; } - static const blink::WebGamepadVector& linear_velocity( - const blink::WebGamepadPose& r) { + static const device::GamepadVector& linear_velocity( + const device::GamepadPose& r) { return r.linear_velocity; } - static const blink::WebGamepadVector& angular_acceleration( - const blink::WebGamepadPose& r) { + static const device::GamepadVector& angular_acceleration( + const device::GamepadPose& r) { return r.angular_acceleration; } - static const blink::WebGamepadVector& linear_acceleration( - const blink::WebGamepadPose& r) { + static const device::GamepadVector& linear_acceleration( + const device::GamepadPose& r) { return r.linear_acceleration; } static bool Read(device::mojom::GamepadPoseDataView data, - blink::WebGamepadPose* out); + device::GamepadPose* out); }; template <> -struct EnumTraits<device::mojom::GamepadHand, blink::WebGamepadHand> { - static device::mojom::GamepadHand ToMojom(blink::WebGamepadHand input); +struct EnumTraits<device::mojom::GamepadHand, device::GamepadHand> { + static device::mojom::GamepadHand ToMojom(device::GamepadHand input); static bool FromMojom(device::mojom::GamepadHand input, - blink::WebGamepadHand* output); + device::GamepadHand* output); }; template <> -struct StructTraits<device::mojom::GamepadDataView, blink::WebGamepad> { - static bool connected(const blink::WebGamepad& r) { return r.connected; } - static uint64_t timestamp(const blink::WebGamepad& r) { return r.timestamp; } - static ConstCArray<double> axes(const blink::WebGamepad& r) { +struct StructTraits<device::mojom::GamepadDataView, device::Gamepad> { + static bool connected(const device::Gamepad& r) { return r.connected; } + static uint64_t timestamp(const device::Gamepad& r) { return r.timestamp; } + static ConstCArray<double> axes(const device::Gamepad& r) { return {r.axes_length, &r.axes[0]}; } - static ConstCArray<blink::WebGamepadButton> buttons( - const blink::WebGamepad& r) { + static ConstCArray<device::GamepadButton> buttons(const device::Gamepad& r) { return {r.buttons_length, &r.buttons[0]}; } - static const blink::WebGamepadPose& pose(const blink::WebGamepad& r) { + static const device::GamepadPose& pose(const device::Gamepad& r) { return r.pose; } - static const blink::WebGamepadHand& hand(const blink::WebGamepad& r) { + static const device::GamepadHand& hand(const device::Gamepad& r) { return r.hand; } - static uint32_t display_id(const blink::WebGamepad& r) { - return r.display_id; - } + static uint32_t display_id(const device::Gamepad& r) { return r.display_id; } - static ConstCArray<uint16_t> id(const blink::WebGamepad& r); - static ConstCArray<uint16_t> mapping(const blink::WebGamepad& r); - static bool Read(device::mojom::GamepadDataView data, blink::WebGamepad* out); + static ConstCArray<uint16_t> id(const device::Gamepad& r); + static ConstCArray<uint16_t> mapping(const device::Gamepad& r); + static bool Read(device::mojom::GamepadDataView data, device::Gamepad* out); }; } // namespace mojo
diff --git a/device/gamepad/public/interfaces/gamepad_struct_traits_unittest.cc b/device/gamepad/public/interfaces/gamepad_struct_traits_unittest.cc index e3b59f1..f1c5c27c 100644 --- a/device/gamepad/public/interfaces/gamepad_struct_traits_unittest.cc +++ b/device/gamepad/public/interfaces/gamepad_struct_traits_unittest.cc
@@ -4,11 +4,11 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" +#include "device/gamepad/public/cpp/gamepad.h" #include "device/gamepad/public/interfaces/gamepad_struct_traits_test.mojom.h" #include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/interface_request.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/WebKit/public/platform/WebGamepad.h" namespace device { @@ -21,21 +21,21 @@ GamepadPose_Null = 3, }; -blink::WebGamepad GetWebGamepadInstance(GamepadTestDataType type) { - blink::WebGamepadButton wgb(true, false, 1.0f); +Gamepad GetWebGamepadInstance(GamepadTestDataType type) { + GamepadButton wgb(true, false, 1.0f); - blink::WebGamepadVector wgv; - memset(&wgv, 0, sizeof(blink::WebGamepadVector)); + GamepadVector wgv; + memset(&wgv, 0, sizeof(GamepadVector)); wgv.not_null = true; wgv.x = wgv.y = wgv.z = 1.0f; - blink::WebGamepadQuaternion wgq; - memset(&wgq, 0, sizeof(blink::WebGamepadQuaternion)); + GamepadQuaternion wgq; + memset(&wgq, 0, sizeof(GamepadQuaternion)); wgq.not_null = true; wgq.x = wgq.y = wgq.z = wgq.w = 2.0f; - blink::WebGamepadPose wgp; - memset(&wgp, 0, sizeof(blink::WebGamepadPose)); + GamepadPose wgp; + memset(&wgp, 0, sizeof(GamepadPose)); if (type == GamepadPose_Null) { wgp.not_null = false; } else if (type == GamepadCommon) { @@ -55,57 +55,56 @@ wgp.angular_acceleration = wgv; } - blink::WebUChar wch[blink::WebGamepad::kMappingLengthCap] = { + UChar wch[Gamepad::kMappingLengthCap] = { 1, 8, 9, 127, 128, 1024, 1025, 1949, 2047, 2048, 16383, 16384, 20000, 32767, 32768, 65535}; - blink::WebGamepad send; - memset(&send, 0, sizeof(blink::WebGamepad)); + Gamepad send; + memset(&send, 0, sizeof(Gamepad)); send.connected = true; - for (size_t i = 0; i < blink::WebGamepad::kMappingLengthCap; i++) { + for (size_t i = 0; i < Gamepad::kMappingLengthCap; i++) { send.id[i] = send.mapping[i] = wch[i]; } send.timestamp = 1234567890123456789ULL; send.axes_length = 0U; - for (size_t i = 0; i < blink::WebGamepad::kAxesLengthCap; i++) { + for (size_t i = 0; i < Gamepad::kAxesLengthCap; i++) { send.axes_length++; send.axes[i] = 1.0; } send.buttons_length = 0U; - for (size_t i = 0; i < blink::WebGamepad::kButtonsLengthCap; i++) { + for (size_t i = 0; i < Gamepad::kButtonsLengthCap; i++) { send.buttons_length++; send.buttons[i] = wgb; } send.pose = wgp; - send.hand = blink::WebGamepadHand::kGamepadHandRight; + send.hand = GamepadHand::kRight; send.display_id = static_cast<unsigned short>(16); return send; } -bool isWebGamepadButtonEqual(const blink::WebGamepadButton& lhs, - const blink::WebGamepadButton& rhs) { +bool isWebGamepadButtonEqual(const GamepadButton& lhs, + const GamepadButton& rhs) { return (lhs.pressed == rhs.pressed && lhs.touched == rhs.touched && lhs.value == rhs.value); } -bool isWebGamepadVectorEqual(const blink::WebGamepadVector& lhs, - const blink::WebGamepadVector& rhs) { +bool isWebGamepadVectorEqual(const GamepadVector& lhs, + const GamepadVector& rhs) { return ((lhs.not_null == false && rhs.not_null == false) || (lhs.not_null == rhs.not_null && lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z)); } -bool isWebGamepadQuaternionEqual(const blink::WebGamepadQuaternion& lhs, - const blink::WebGamepadQuaternion& rhs) { +bool isWebGamepadQuaternionEqual(const GamepadQuaternion& lhs, + const GamepadQuaternion& rhs) { return ((lhs.not_null == false && rhs.not_null == false) || (lhs.not_null == rhs.not_null && lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z && lhs.w == rhs.w)); } -bool isWebGamepadPoseEqual(const blink::WebGamepadPose& lhs, - const blink::WebGamepadPose& rhs) { +bool isWebGamepadPoseEqual(const GamepadPose& lhs, const GamepadPose& rhs) { if (lhs.not_null == false && rhs.not_null == false) { return true; } @@ -131,8 +130,7 @@ return true; } -bool isWebGamepadEqual(const blink::WebGamepad& send, - const blink::WebGamepad& echo) { +bool isWebGamepadEqual(const Gamepad& send, const Gamepad& echo) { if (send.connected != echo.connected || send.timestamp != echo.timestamp || send.axes_length != echo.axes_length || send.buttons_length != echo.buttons_length || @@ -140,22 +138,22 @@ send.display_id != echo.display_id) { return false; } - for (size_t i = 0; i < blink::WebGamepad::kIdLengthCap; i++) { + for (size_t i = 0; i < Gamepad::kIdLengthCap; i++) { if (send.id[i] != echo.id[i]) { return false; } } - for (size_t i = 0; i < blink::WebGamepad::kAxesLengthCap; i++) { + for (size_t i = 0; i < Gamepad::kAxesLengthCap; i++) { if (send.axes[i] != echo.axes[i]) { return false; } } - for (size_t i = 0; i < blink::WebGamepad::kButtonsLengthCap; i++) { + for (size_t i = 0; i < Gamepad::kButtonsLengthCap; i++) { if (!isWebGamepadButtonEqual(send.buttons[i], echo.buttons[i])) { return false; } } - for (size_t i = 0; i < blink::WebGamepad::kMappingLengthCap; i++) { + for (size_t i = 0; i < Gamepad::kMappingLengthCap; i++) { if (send.mapping[i] != echo.mapping[i]) { return false; } @@ -163,9 +161,9 @@ return true; } -void ExpectWebGamepad(const blink::WebGamepad& send, +void ExpectWebGamepad(const Gamepad& send, const base::Closure& closure, - const blink::WebGamepad& echo) { + const Gamepad& echo) { EXPECT_EQ(true, isWebGamepadEqual(send, echo)); closure.Run(); } @@ -173,61 +171,57 @@ } // namespace class GamepadStructTraitsTest : public testing::Test, - public device::mojom::GamepadStructTraitsTest { + public mojom::GamepadStructTraitsTest { protected: GamepadStructTraitsTest() : binding_(this) {} - void PassGamepad(const blink::WebGamepad& send, + void PassGamepad(const Gamepad& send, const PassGamepadCallback& callback) override { callback.Run(send); } - device::mojom::GamepadStructTraitsTestPtr GetGamepadStructTraitsTestProxy() { + mojom::GamepadStructTraitsTestPtr GetGamepadStructTraitsTestProxy() { return binding_.CreateInterfacePtrAndBind(); } private: base::MessageLoop message_loop_; - mojo::Binding<device::mojom::GamepadStructTraitsTest> binding_; + mojo::Binding<mojom::GamepadStructTraitsTest> binding_; DISALLOW_COPY_AND_ASSIGN(GamepadStructTraitsTest); }; TEST_F(GamepadStructTraitsTest, GamepadCommon) { - blink::WebGamepad send = GetWebGamepadInstance(GamepadCommon); + Gamepad send = GetWebGamepadInstance(GamepadCommon); base::RunLoop loop; - device::mojom::GamepadStructTraitsTestPtr proxy = - GetGamepadStructTraitsTestProxy(); + mojom::GamepadStructTraitsTestPtr proxy = GetGamepadStructTraitsTestProxy(); proxy->PassGamepad(send, base::Bind(&ExpectWebGamepad, send, loop.QuitClosure())); loop.Run(); } TEST_F(GamepadStructTraitsTest, GamepadPose_HasOrientation) { - blink::WebGamepad send = GetWebGamepadInstance(GamepadPose_HasOrientation); + Gamepad send = GetWebGamepadInstance(GamepadPose_HasOrientation); base::RunLoop loop; - device::mojom::GamepadStructTraitsTestPtr proxy = - GetGamepadStructTraitsTestProxy(); + mojom::GamepadStructTraitsTestPtr proxy = GetGamepadStructTraitsTestProxy(); proxy->PassGamepad(send, base::Bind(&ExpectWebGamepad, send, loop.QuitClosure())); loop.Run(); } TEST_F(GamepadStructTraitsTest, GamepadPose_HasPosition) { - blink::WebGamepad send = GetWebGamepadInstance(GamepadPose_HasPosition); + Gamepad send = GetWebGamepadInstance(GamepadPose_HasPosition); base::RunLoop loop; - device::mojom::GamepadStructTraitsTestPtr proxy = - GetGamepadStructTraitsTestProxy(); + mojom::GamepadStructTraitsTestPtr proxy = GetGamepadStructTraitsTestProxy(); proxy->PassGamepad(send, base::Bind(&ExpectWebGamepad, send, loop.QuitClosure())); loop.Run(); } TEST_F(GamepadStructTraitsTest, GamepadPose_Null) { - blink::WebGamepad send = GetWebGamepadInstance(GamepadPose_Null); + Gamepad send = GetWebGamepadInstance(GamepadPose_Null); base::RunLoop loop; - device::mojom::GamepadStructTraitsTestPtr proxy = - GetGamepadStructTraitsTestProxy(); + mojom::GamepadStructTraitsTestPtr proxy = GetGamepadStructTraitsTestProxy(); proxy->PassGamepad(send, base::Bind(&ExpectWebGamepad, send, loop.QuitClosure())); loop.Run();
diff --git a/device/gamepad/raw_input_data_fetcher_win.cc b/device/gamepad/raw_input_data_fetcher_win.cc index 27cc164f..132e93e 100644 --- a/device/gamepad/raw_input_data_fetcher_win.cc +++ b/device/gamepad/raw_input_data_fetcher_win.cc
@@ -12,8 +12,6 @@ namespace device { -using namespace blink; - namespace { float NormalizeAxis(long value, long min, long max) { @@ -160,7 +158,7 @@ if (!state) continue; - WebGamepad& pad = state->data; + Gamepad& pad = state->data; pad.timestamp = gamepad->report_id; pad.buttons_length = gamepad->buttons_length; @@ -216,7 +214,7 @@ controllers_[device_handle] = gamepad; - WebGamepad& pad = state->data; + Gamepad& pad = state->data; pad.connected = true; std::string vendor = base::StringPrintf("%04x", gamepad->vendor_id); @@ -225,13 +223,13 @@ state->axis_mask = 0; state->button_mask = 0; - swprintf(pad.id, WebGamepad::kIdLengthCap, + swprintf(pad.id, Gamepad::kIdLengthCap, L"%ls (%lsVendor: %04x Product: %04x)", gamepad->id, state->mapper ? L"STANDARD GAMEPAD " : L"", gamepad->vendor_id, gamepad->product_id); if (state->mapper) - swprintf(pad.mapping, WebGamepad::kMappingLengthCap, L"standard"); + swprintf(pad.mapping, Gamepad::kMappingLengthCap, L"standard"); else pad.mapping[0] = 0; } @@ -336,7 +334,7 @@ } if (!got_product_string) - swprintf(gamepad_info->id, WebGamepad::kIdLengthCap, L"Unknown Gamepad"); + swprintf(gamepad_info->id, Gamepad::kIdLengthCap, L"Unknown Gamepad"); // Query device capabilities. result = GetRawInputDeviceInfo(hDevice, RIDI_PREPARSEDDATA, NULL, &size); @@ -371,10 +369,10 @@ DCHECK_EQ(HIDP_STATUS_SUCCESS, status); for (uint32_t i = 0; i < count; ++i) { - if (button_caps[i].Range.UsageMin <= WebGamepad::kButtonsLengthCap && + if (button_caps[i].Range.UsageMin <= Gamepad::kButtonsLengthCap && button_caps[i].UsagePage == kButtonUsagePage) { uint32_t max_index = - std::min(WebGamepad::kButtonsLengthCap, + std::min(Gamepad::kButtonsLengthCap, static_cast<size_t>(button_caps[i].Range.UsageMax)); gamepad_info->buttons_length = std::max(gamepad_info->buttons_length, max_index); @@ -392,7 +390,7 @@ for (UINT i = 0; i < count; i++) { uint32_t axis_index = axes_caps[i].Range.UsageMin - kAxisMinimumUsageNumber; - if (axis_index < WebGamepad::kAxesLengthCap) { + if (axis_index < Gamepad::kAxesLengthCap) { gamepad_info->axes[axis_index].caps = axes_caps[i]; gamepad_info->axes[axis_index].value = 0; gamepad_info->axes[axis_index].active = true; @@ -409,13 +407,13 @@ uint32_t next_index = 0; for (UINT i = 0; i < count; i++) { uint32_t usage = axes_caps[i].Range.UsageMin - kAxisMinimumUsageNumber; - if (usage >= WebGamepad::kAxesLengthCap && + if (usage >= Gamepad::kAxesLengthCap && axes_caps[i].UsagePage <= kGameControlsUsagePage) { - for (; next_index < WebGamepad::kAxesLengthCap; ++next_index) { + for (; next_index < Gamepad::kAxesLengthCap; ++next_index) { if (!gamepad_info->axes[next_index].active) break; } - if (next_index < WebGamepad::kAxesLengthCap) { + if (next_index < Gamepad::kAxesLengthCap) { gamepad_info->axes[next_index].caps = axes_caps[i]; gamepad_info->axes[next_index].value = 0; gamepad_info->axes[next_index].active = true; @@ -426,7 +424,7 @@ } } - if (next_index >= WebGamepad::kAxesLengthCap) + if (next_index >= Gamepad::kAxesLengthCap) break; } } @@ -468,8 +466,7 @@ for (uint32_t j = 0; j < buttons_length; j++) { int32_t button_index = usages[j].Usage - 1; if (usages[j].UsagePage == kButtonUsagePage && button_index >= 0 && - button_index < - static_cast<int>(blink::WebGamepad::kButtonsLengthCap)) { + button_index < static_cast<int>(Gamepad::kButtonsLengthCap)) { gamepad_info->buttons[button_index] = true; } }
diff --git a/device/gamepad/raw_input_data_fetcher_win.h b/device/gamepad/raw_input_data_fetcher_win.h index 1c13e15..62ae812 100644 --- a/device/gamepad/raw_input_data_fetcher_win.h +++ b/device/gamepad/raw_input_data_fetcher_win.h
@@ -24,7 +24,7 @@ #include "build/build_config.h" #include "device/gamepad/gamepad_data_fetcher.h" #include "device/gamepad/gamepad_standard_mappings.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" +#include "device/gamepad/public/cpp/gamepad.h" namespace device { @@ -49,13 +49,13 @@ uint32_t vendor_id; uint32_t product_id; - wchar_t id[blink::WebGamepad::kIdLengthCap]; + wchar_t id[Gamepad::kIdLengthCap]; uint32_t buttons_length; - bool buttons[blink::WebGamepad::kButtonsLengthCap]; + bool buttons[Gamepad::kButtonsLengthCap]; uint32_t axes_length; - RawGamepadAxis axes[blink::WebGamepad::kAxesLengthCap]; + RawGamepadAxis axes[Gamepad::kAxesLengthCap]; }; class RawInputDataFetcher : public GamepadDataFetcher,
diff --git a/device/gamepad/xbox_data_fetcher_mac.mm b/device/gamepad/xbox_data_fetcher_mac.mm index f4a235a..f0057c37 100644 --- a/device/gamepad/xbox_data_fetcher_mac.mm +++ b/device/gamepad/xbox_data_fetcher_mac.mm
@@ -17,8 +17,6 @@ #include "base/logging.h" #include "base/mac/foundation_util.h" -using blink::WebGamepad; - namespace device { namespace { @@ -228,11 +226,11 @@ } void CopyNSStringAsUTF16LittleEndian(NSString* src, - blink::WebUChar* dest, + UChar* dest, size_t dest_len) { NSData* as16 = [src dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; memset(dest, 0, dest_len); - [as16 getBytes:dest length:dest_len - sizeof(blink::WebUChar)]; + [as16 getBytes:dest length:dest_len - sizeof(UChar)]; } } // namespace @@ -811,7 +809,7 @@ if (!state) return; // No available slot for this device - WebGamepad& pad = state->data; + Gamepad& pad = state->data; for (size_t i = 0; i < 6; i++) { pad.buttons[i].pressed = data.buttons[i];
diff --git a/device/vr/BUILD.gn b/device/vr/BUILD.gn index 552b8c9..97903c48 100644 --- a/device/vr/BUILD.gn +++ b/device/vr/BUILD.gn
@@ -78,6 +78,7 @@ deps += [ "//device/gamepad", + "//device/gamepad/public/cpp:shared_with_blink", "//third_party/WebKit/public:blink_headers", ] ldflags = [ "-landroid" ]
diff --git a/device/vr/DEPS b/device/vr/DEPS index c1e426f..eca72cd 100644 --- a/device/vr/DEPS +++ b/device/vr/DEPS
@@ -1,7 +1,7 @@ include_rules = [ + "+device/gamepad/public/cpp/gamepads.h", "+gpu/command_buffer/common/mailbox_holder.h", "+jni", - "+third_party/WebKit/public/platform/WebGamepads.h", "+third_party/WebKit/public/platform/modules/vr/vr_service.mojom.h", "+third_party/gvr-android-sdk/src", "+third_party/openvr/src/headers/openvr.h",
diff --git a/device/vr/android/gvr/gvr_gamepad_data_fetcher.cc b/device/vr/android/gvr/gvr_gamepad_data_fetcher.cc index a18b6c6..8d0bb87 100644 --- a/device/vr/android/gvr/gvr_gamepad_data_fetcher.cc +++ b/device/vr/android/gvr/gvr_gamepad_data_fetcher.cc
@@ -6,18 +6,16 @@ #include "base/memory/ptr_util.h" #include "base/strings/utf_string_conversions.h" +#include "device/gamepad/public/cpp/gamepads.h" #include "device/vr/android/gvr/gvr_gamepad_data_provider.h" #include "device/vr/vr_types.h" -#include "third_party/WebKit/public/platform/WebGamepads.h" namespace device { namespace { -void CopyToWebUString(blink::WebUChar* dest, - size_t dest_length, - base::string16 src) { - static_assert(sizeof(base::string16::value_type) == sizeof(blink::WebUChar), +void CopyToUString(UChar* dest, size_t dest_length, base::string16 src) { + static_assert(sizeof(base::string16::value_type) == sizeof(UChar), "Mismatched string16/WebUChar size."); const size_t str_to_copy = std::min(src.size(), dest_length - 1); @@ -27,8 +25,6 @@ } // namespace -using namespace blink; - GvrGamepadDataFetcher::Factory::Factory(GvrGamepadDataProvider* data_provider, unsigned int display_id) : data_provider_(data_provider), display_id_(display_id) { @@ -85,22 +81,22 @@ // TODO(bajones): ensure consistency? GvrGamepadData provided_data = gamepad_data_; - WebGamepad& pad = state->data; + Gamepad& pad = state->data; if (state->active_state == GAMEPAD_NEWLY_ACTIVE) { // This is the first time we've seen this device, so do some one-time // initialization pad.connected = true; - CopyToWebUString(pad.id, WebGamepad::kIdLengthCap, - base::UTF8ToUTF16("Daydream Controller")); - CopyToWebUString(pad.mapping, WebGamepad::kMappingLengthCap, - base::UTF8ToUTF16("")); + CopyToUString(pad.id, Gamepad::kIdLengthCap, + base::UTF8ToUTF16("Daydream Controller")); + CopyToUString(pad.mapping, Gamepad::kMappingLengthCap, + base::UTF8ToUTF16("")); pad.buttons_length = 1; pad.axes_length = 2; pad.display_id = display_id_; pad.hand = - provided_data.right_handed ? kGamepadHandRight : kGamepadHandLeft; + provided_data.right_handed ? GamepadHand::kRight : GamepadHand::kLeft; } pad.timestamp = provided_data.timestamp;
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index d8a35fad..34432585 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -300,7 +300,7 @@ DOWNLOADS_SEARCH, FONTSETTINGS_CLEARFONT, WINDOWS_UPDATE, - BOOKMARKMANAGERPRIVATE_CANOPENNEWWINDOWS, + DELETED_BOOKMARKMANAGERPRIVATE_CANOPENNEWWINDOWS, SERIAL_FLUSH, BROWSERACTION_SETTITLE, BOOKMARKMANAGERPRIVATE_CANEDIT,
diff --git a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm index 8e7f12f..e954fb9 100644 --- a/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm +++ b/ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.mm
@@ -9,6 +9,7 @@ #include "components/sync_sessions/sync_sessions_client.h" #include "components/sync_sessions/synced_window_delegate.h" #include "components/sync_sessions/synced_window_delegates_getter.h" +#include "components/sync_sessions/tab_node_pool.h" #include "ios/chrome/browser/sessions/ios_chrome_session_tab_helper.h" #include "ios/web/public/favicon_status.h" #include "ios/web/public/navigation_item.h" @@ -36,7 +37,8 @@ } // namespace IOSChromeSyncedTabDelegate::IOSChromeSyncedTabDelegate(web::WebState* web_state) - : web_state_(web_state), sync_session_id_(0) {} + : web_state_(web_state), + sync_session_id_(sync_sessions::TabNodePool::kInvalidTabNodeID) {} IOSChromeSyncedTabDelegate::~IOSChromeSyncedTabDelegate() {}
diff --git a/ppapi/shared_impl/DEPS b/ppapi/shared_impl/DEPS index 7f786933..d6ff4c0 100644 --- a/ppapi/shared_impl/DEPS +++ b/ppapi/shared_impl/DEPS
@@ -1,5 +1,6 @@ include_rules = [ "+base", + "+device/gamepad/public/cpp", "+gpu", "+media/audio", "+media/base",
diff --git a/ppapi/shared_impl/ppb_gamepad_shared.cc b/ppapi/shared_impl/ppb_gamepad_shared.cc index 4ee0dd9..12b732e 100644 --- a/ppapi/shared_impl/ppb_gamepad_shared.cc +++ b/ppapi/shared_impl/ppb_gamepad_shared.cc
@@ -8,10 +8,13 @@ #include <algorithm> +#include "device/gamepad/public/cpp/gamepads.h" + namespace ppapi { const size_t WebKitGamepads::kItemsLengthCap; +// TODO: Remove this function and use ConvertDeviceGamepadData() instead. void ConvertWebKitGamepadData(const WebKitGamepads& webkit_data, PP_GamepadsSampleData* output_data) { output_data->length = WebKitGamepads::kItemsLengthCap; @@ -34,4 +37,26 @@ } } +void ConvertDeviceGamepadData(const device::Gamepads& device_data, + PP_GamepadsSampleData* output_data) { + output_data->length = device::Gamepads::kItemsLengthCap; + for (unsigned i = 0; i < device::Gamepads::kItemsLengthCap; ++i) { + PP_GamepadSampleData& output_pad = output_data->items[i]; + const device::Gamepad& device_pad = device_data.items[i]; + output_pad.connected = device_pad.connected ? PP_TRUE : PP_FALSE; + if (device_pad.connected) { + static_assert(sizeof(output_pad.id) == sizeof(device_pad.id), + "id size does not match"); + memcpy(output_pad.id, device_pad.id, sizeof(output_pad.id)); + output_pad.timestamp = static_cast<double>(device_pad.timestamp); + output_pad.axes_length = device_pad.axes_length; + for (unsigned j = 0; j < device_pad.axes_length; ++j) + output_pad.axes[j] = static_cast<float>(device_pad.axes[j]); + output_pad.buttons_length = device_pad.buttons_length; + for (unsigned j = 0; j < device_pad.buttons_length; ++j) + output_pad.buttons[j] = static_cast<float>(device_pad.buttons[j].value); + } + } +} + } // namespace ppapi
diff --git a/ppapi/shared_impl/ppb_gamepad_shared.h b/ppapi/shared_impl/ppb_gamepad_shared.h index df95fab..24f3cb0 100644 --- a/ppapi/shared_impl/ppb_gamepad_shared.h +++ b/ppapi/shared_impl/ppb_gamepad_shared.h
@@ -12,6 +12,10 @@ #include "ppapi/c/ppb_gamepad.h" #include "ppapi/shared_impl/ppapi_shared_export.h" +namespace device { +class Gamepads; +} + namespace ppapi { // TODO(brettw) when we remove the non-IPC-based gamepad implementation, this @@ -119,6 +123,10 @@ const WebKitGamepads& webkit_data, PP_GamepadsSampleData* output_data); +PPAPI_SHARED_EXPORT void ConvertDeviceGamepadData( + const device::Gamepads& device_data, + PP_GamepadsSampleData* output_data); + } // namespace ppapi #endif // PPAPI_SHARED_IMPL_PPB_GAMEPAD_SHARED_H_
diff --git a/third_party/WebKit/LayoutTests/SlowTests b/third_party/WebKit/LayoutTests/SlowTests index 8de123bb..5ff05d4 100644 --- a/third_party/WebKit/LayoutTests/SlowTests +++ b/third_party/WebKit/LayoutTests/SlowTests
@@ -393,6 +393,3 @@ # which can be very slow. crbug.com/678498 external/wpt/service-workers/service-worker/foreign-fetch-cors.https.html [ Slow ] crbug.com/678496 external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Slow ] - -# Slow on Debug -crbug.com/710864 [ Debug ] editing/execCommand/delete-non-editable-range-crash.html [ Slow ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index fdd5d99..9617b96 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2014,7 +2014,6 @@ crbug.com/711529 http/tests/streams/piping/multiple-propagation.https.html [ Timeout ] # ====== New tests from wpt-importer added here ====== -crbug.com/626703 external/wpt/streams/writable-streams/properties.sharedworker.html [ Timeout ] crbug.com/626703 external/wpt/XMLHttpRequest/getresponseheader-chunked-trailer.htm [ Failure ] crbug.com/626703 external/wpt/XMLHttpRequest/anonymous-mode-unsupported.htm [ Failure ] crbug.com/626703 external/wpt/XMLHttpRequest/open-after-setrequestheader.htm [ Failure ] @@ -2064,15 +2063,11 @@ crbug.com/626703 external/wpt/streams/readable-streams/pipe-through.sharedworker.html [ Timeout ] crbug.com/626703 external/wpt/streams/readable-streams/tee.sharedworker.html [ Timeout ] crbug.com/626703 external/wpt/streams/readable-streams/templated.sharedworker.html [ Timeout ] -crbug.com/626703 external/wpt/streams/writable-streams/aborting.sharedworker.html [ Timeout ] crbug.com/626703 external/wpt/streams/writable-streams/bad-strategies.sharedworker.html [ Timeout ] crbug.com/626703 external/wpt/streams/writable-streams/bad-underlying-sinks.sharedworker.html [ Timeout ] crbug.com/626703 external/wpt/streams/writable-streams/brand-checks.sharedworker.html [ Timeout ] crbug.com/626703 external/wpt/streams/writable-streams/byte-length-queuing-strategy.sharedworker.html [ Timeout ] -crbug.com/626703 external/wpt/streams/writable-streams/close.sharedworker.html [ Timeout ] -crbug.com/626703 external/wpt/streams/writable-streams/constructor.sharedworker.html [ Timeout ] crbug.com/626703 external/wpt/streams/writable-streams/count-queuing-strategy.sharedworker.html [ Timeout ] -crbug.com/626703 external/wpt/streams/writable-streams/error.sharedworker.html [ Timeout ] crbug.com/626703 external/wpt/streams/writable-streams/general.sharedworker.html [ Timeout ] crbug.com/626703 external/wpt/streams/writable-streams/reentrant-strategy.sharedworker.html [ Timeout ] crbug.com/626703 external/wpt/streams/writable-streams/start.sharedworker.html [ Timeout ] @@ -2188,7 +2183,6 @@ crbug.com/626703 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1251.html [ Timeout ] crbug.com/626703 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1252.html [ Timeout ] crbug.com/626703 [ Android Mac ] external/wpt/pointerevents/pointerevent_disabled_form_control-manual.html [ Timeout ] -crbug.com/626703 external/wpt/streams/readable-streams/floating-point-total-queue-size.sharedworker.html [ Timeout ] crbug.com/626703 external/wpt/streams/writable-streams/floating-point-total-queue-size.dedicatedworker.html [ Timeout ] crbug.com/626703 external/wpt/streams/writable-streams/floating-point-total-queue-size.sharedworker.html [ Timeout ] crbug.com/626703 external/wpt/mediacapture-streams/MediaStreamTrack-end-manual.https.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json index 2499a4e..51c1ff34 100644 --- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json +++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -31,12 +31,240 @@ {} ] ], + "css/CSS2/floats-clear/floating-replaced-height-008.xht": [ + [ + "/css/CSS2/floats-clear/floating-replaced-height-008.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-108.xht": [ + [ + "/css/CSS2/floats-clear/floats-108.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-109.xht": [ + [ + "/css/CSS2/floats-clear/floats-109.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-110.xht": [ + [ + "/css/CSS2/floats-clear/floats-110.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-126.xht": [ + [ + "/css/CSS2/floats-clear/floats-126.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-127.xht": [ + [ + "/css/CSS2/floats-clear/floats-127.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-128.xht": [ + [ + "/css/CSS2/floats-clear/floats-128.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-129.xht": [ + [ + "/css/CSS2/floats-clear/floats-129.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-130.xht": [ + [ + "/css/CSS2/floats-clear/floats-130.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-131.xht": [ + [ + "/css/CSS2/floats-clear/floats-131.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-137.xht": [ + [ + "/css/CSS2/floats-clear/floats-137.xht", + {} + ] + ], "css/CSS2/linebox/inline-formatting-context-010b.xht": [ [ "/css/CSS2/linebox/inline-formatting-context-010b.xht", {} ] ], + "css/CSS2/normal-flow/inline-block-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-002.xht", + {} + ] + ], + "css/CSS2/normal-flow/inline-block-003.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-003.xht", + {} + ] + ], + "css/CSS2/normal-flow/inline-block-004.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-004.xht", + {} + ] + ], + "css/CSS2/normal-flow/inline-block-005.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-005.xht", + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-height-008.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-height-008.xht", + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-height-008.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-height-008.xht", + {} + ] + ], + "css/CSS2/normal-flow/inlines-003.xht": [ + [ + "/css/CSS2/normal-flow/inlines-003.xht", + {} + ] + ], + "css/CSS2/normal-flow/inlines-004.xht": [ + [ + "/css/CSS2/normal-flow/inlines-004.xht", + {} + ] + ], + "css/CSS2/normal-flow/inlines-005.xht": [ + [ + "/css/CSS2/normal-flow/inlines-005.xht", + {} + ] + ], + "css/CSS2/normal-flow/inlines-006.xht": [ + [ + "/css/CSS2/normal-flow/inlines-006.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-inline-001.xht": [ + [ + "/css/CSS2/positioning/abspos-inline-001.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-inline-002.xht": [ + [ + "/css/CSS2/positioning/abspos-inline-002.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-inline-003.xht": [ + [ + "/css/CSS2/positioning/abspos-inline-003.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-inline-004.xht": [ + [ + "/css/CSS2/positioning/abspos-inline-004.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-inline-005.xht": [ + [ + "/css/CSS2/positioning/abspos-inline-005.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-inline-006.xht": [ + [ + "/css/CSS2/positioning/abspos-inline-006.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-paged-001.xht": [ + [ + "/css/CSS2/positioning/abspos-paged-001.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-paged-002.xht": [ + [ + "/css/CSS2/positioning/abspos-paged-002.xht", + {} + ] + ], + "css/CSS2/positioning/position-004.xht": [ + [ + "/css/CSS2/positioning/position-004.xht", + {} + ] + ], + "css/CSS2/positioning/position-fixed-003.xht": [ + [ + "/css/CSS2/positioning/position-fixed-003.xht", + {} + ] + ], + "css/CSS2/positioning/position-fixed-004.xht": [ + [ + "/css/CSS2/positioning/position-fixed-004.xht", + {} + ] + ], + "css/CSS2/positioning/position-fixed-005.xht": [ + [ + "/css/CSS2/positioning/position-fixed-005.xht", + {} + ] + ], + "css/CSS2/positioning/position-relative-020.xht": [ + [ + "/css/CSS2/positioning/position-relative-020.xht", + {} + ] + ], + "css/CSS2/positioning/position-relative-021.xht": [ + [ + "/css/CSS2/positioning/position-relative-021.xht", + {} + ] + ], + "css/CSS2/positioning/position-relative-022.xht": [ + [ + "/css/CSS2/positioning/position-relative-022.xht", + {} + ] + ], + "css/CSS2/positioning/position-relative-034.xht": [ + [ + "/css/CSS2/positioning/position-relative-034.xht", + {} + ] + ], + "css/CSS2/positioning/position-relative-036.xht": [ + [ + "/css/CSS2/positioning/position-relative-036.xht", + {} + ] + ], "css/css-flexbox-1/interactive/flexbox_interactive_break-after-column-item.html": [ [ "/css/css-flexbox-1/interactive/flexbox_interactive_break-after-column-item.html", @@ -6681,6 +6909,2166 @@ {} ] ], + "css/CSS2/floats-clear/adjacent-floats-001.xht": [ + [ + "/css/CSS2/floats-clear/adjacent-floats-001.xht", + [ + [ + "/css/CSS2/floats-clear/adjacent-floats-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-001.xht": [ + [ + "/css/CSS2/floats-clear/clear-001.xht", + [ + [ + "/css/CSS2/floats-clear/clear-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-002.xht": [ + [ + "/css/CSS2/floats-clear/clear-002.xht", + [ + [ + "/css/CSS2/floats-clear/clear-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-003.xht": [ + [ + "/css/CSS2/floats-clear/clear-003.xht", + [ + [ + "/css/CSS2/floats-clear/clear-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-004.xht": [ + [ + "/css/CSS2/floats-clear/clear-004.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-005.xht": [ + [ + "/css/CSS2/floats-clear/clear-005.xht", + [ + [ + "/css/CSS2/floats-clear/clear-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-000.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-000.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-000-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-001.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-001.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-002.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-002.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-003.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-003.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-004.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-004.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-005.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-005.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-006.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-006.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-007.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-007.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-008.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-008.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-009.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-009.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-009-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-012.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-012.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-013.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-013.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-009-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-014.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-014.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-015.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-015.xht", + [ + [ + "/css/CSS2/floats-clear/clear-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-clearance-calculation-001.xht": [ + [ + "/css/CSS2/floats-clear/clear-clearance-calculation-001.xht", + [ + [ + "/css/CSS2/floats-clear/clear-clearance-calculation-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-clearance-calculation-002.xht": [ + [ + "/css/CSS2/floats-clear/clear-clearance-calculation-002.xht", + [ + [ + "/css/CSS2/floats-clear/clear-clearance-calculation-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-clearance-calculation-003.xht": [ + [ + "/css/CSS2/floats-clear/clear-clearance-calculation-003.xht", + [ + [ + "/css/CSS2/floats-clear/clear-clearance-calculation-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-clearance-calculation-004.xht": [ + [ + "/css/CSS2/floats-clear/clear-clearance-calculation-004.xht", + [ + [ + "/css/CSS2/floats-clear/clear-clearance-calculation-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-clearance-calculation-005.xht": [ + [ + "/css/CSS2/floats-clear/clear-clearance-calculation-005.xht", + [ + [ + "/css/CSS2/floats-clear/clear-clearance-calculation-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-default-inheritance-001.xht": [ + [ + "/css/CSS2/floats-clear/clear-default-inheritance-001.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-float-001.xht": [ + [ + "/css/CSS2/floats-clear/clear-float-001.xht", + [ + [ + "/css/CSS2/floats-clear/clear-float-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-float-002.xht": [ + [ + "/css/CSS2/floats-clear/clear-float-002.xht", + [ + [ + "/css/CSS2/floats-clear/clear-float-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-float-003.xht": [ + [ + "/css/CSS2/floats-clear/clear-float-003.xht", + [ + [ + "/css/CSS2/floats-clear/clear-float-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-float-004.xht": [ + [ + "/css/CSS2/floats-clear/clear-float-004.xht", + [ + [ + "/css/CSS2/floats-clear/clear-float-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-float-005.xht": [ + [ + "/css/CSS2/floats-clear/clear-float-005.xht", + [ + [ + "/css/CSS2/floats-clear/clear-float-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-float-006.xht": [ + [ + "/css/CSS2/floats-clear/clear-float-006.xht", + [ + [ + "/css/CSS2/floats-clear/clear-float-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-float-007.xht": [ + [ + "/css/CSS2/floats-clear/clear-float-007.xht", + [ + [ + "/css/CSS2/floats-clear/adjacent-floats-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-float-008.xht": [ + [ + "/css/CSS2/floats-clear/clear-float-008.xht", + [ + [ + "/css/CSS2/floats-clear/adjacent-floats-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-float-009.xht": [ + [ + "/css/CSS2/floats-clear/clear-float-009.xht", + [ + [ + "/css/CSS2/floats-clear/clear-float-009-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-initial-001.xht": [ + [ + "/css/CSS2/floats-clear/clear-initial-001.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clear-inline-001.xht": [ + [ + "/css/CSS2/floats-clear/clear-inline-001.xht", + [ + [ + "/css/CSS2/floats-clear/clear-inline-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/clearance-006.xht": [ + [ + "/css/CSS2/floats-clear/clearance-006.xht", + [ + [ + "/css/CSS2/floats-clear/clearance-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-003.xht": [ + [ + "/css/CSS2/floats-clear/float-003.xht", + [ + [ + "/css/CSS2/floats-clear/float-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-005.xht": [ + [ + "/css/CSS2/floats-clear/float-005.xht", + [ + [ + "/css/CSS2/floats-clear/float-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-006.xht": [ + [ + "/css/CSS2/floats-clear/float-006.xht", + [ + [ + "/css/CSS2/floats-clear/float-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-001.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-001.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-001a.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-001a.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-002.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-002.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-003.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-003.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-004.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-004.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-004a.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-004a.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-005.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-005.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-006.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-006.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-007.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-007.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-008.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-008.xht", + [ + [ + "/css/CSS2/floats-clear/float-applies-to-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-008a.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-008a.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-009.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-009.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-012.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-012.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-013.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-013.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-014.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-014.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-015.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-015.xht", + [ + [ + "/css/CSS2/reference/float-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-height-001.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-height-001.xht", + [ + [ + "/css/CSS2/floats-clear/float-non-replaced-height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-001.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-001.xht", + [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-002.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-002.xht", + [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-003.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-003.xht", + [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-004.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-004.xht", + [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-005.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-005.xht", + [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-007.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-007.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-008.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-008.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-009.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-009.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-010.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-010.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-011.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-011.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-012.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-012.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-height-001.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-height-001.xht", + [ + [ + "/css/CSS2/floats-clear/float-replaced-height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-height-002.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-height-002.xht", + [ + [ + "/css/CSS2/floats-clear/float-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-height-003.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-height-003.xht", + [ + [ + "/css/CSS2/floats-clear/float-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-height-004.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-height-004.xht", + [ + [ + "/css/CSS2/floats-clear/float-replaced-height-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-height-005.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-height-005.xht", + [ + [ + "/css/CSS2/floats-clear/float-replaced-height-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-height-006.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-height-006.xht", + [ + [ + "/css/CSS2/floats-clear/float-replaced-height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-height-007.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-height-007.xht", + [ + [ + "/css/CSS2/floats-clear/float-replaced-height-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-001.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-width-001.xht", + [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-002.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-width-002.xht", + [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-003.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-width-003.xht", + [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-004.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-width-004.xht", + [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-005.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-width-005.xht", + [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-006.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-width-006.xht", + [ + [ + "/css/CSS2/floats-clear/float-replaced-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-007.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-width-007.xht", + [ + [ + "/css/CSS2/floats-clear/float-replaced-width-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-008.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-width-008.xht", + [ + [ + "/css/CSS2/floats-clear/float-replaced-width-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-009.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-width-009.xht", + [ + [ + "/css/CSS2/floats-clear/float-replaced-width-009-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-011.xht": [ + [ + "/css/CSS2/floats-clear/float-replaced-width-011.xht", + [ + [ + "/css/CSS2/floats-clear/float-replaced-width-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-001.xht": [ + [ + "/css/CSS2/floats-clear/floats-001.xht", + [ + [ + "/css/CSS2/floats-clear/floats-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-002.xht": [ + [ + "/css/CSS2/floats-clear/floats-002.xht", + [ + [ + "/css/CSS2/floats-clear/floats-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-003.xht": [ + [ + "/css/CSS2/floats-clear/floats-003.xht", + [ + [ + "/css/CSS2/floats-clear/adjacent-floats-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-004.xht": [ + [ + "/css/CSS2/floats-clear/floats-004.xht", + [ + [ + "/css/CSS2/floats-clear/floats-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-005.xht": [ + [ + "/css/CSS2/floats-clear/floats-005.xht", + [ + [ + "/css/CSS2/floats-clear/floats-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-006.xht": [ + [ + "/css/CSS2/floats-clear/floats-006.xht", + [ + [ + "/css/CSS2/floats-clear/floats-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-007.xht": [ + [ + "/css/CSS2/floats-clear/floats-007.xht", + [ + [ + "/css/CSS2/floats-clear/floats-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-008.xht": [ + [ + "/css/CSS2/floats-clear/floats-008.xht", + [ + [ + "/css/CSS2/floats-clear/clear-float-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-009.xht": [ + [ + "/css/CSS2/floats-clear/floats-009.xht", + [ + [ + "/css/CSS2/floats-clear/floats-009-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-014.xht": [ + [ + "/css/CSS2/floats-clear/floats-014.xht", + [ + [ + "/css/CSS2/floats-clear/floats-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-015.xht": [ + [ + "/css/CSS2/floats-clear/floats-015.xht", + [ + [ + "/css/CSS2/floats-clear/floats-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-019.xht": [ + [ + "/css/CSS2/floats-clear/floats-019.xht", + [ + [ + "/css/CSS2/floats-clear/floats-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-022.xht": [ + [ + "/css/CSS2/floats-clear/floats-022.xht", + [ + [ + "/css/CSS2/floats-clear/floats-022-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-023.xht": [ + [ + "/css/CSS2/floats-clear/floats-023.xht", + [ + [ + "/css/CSS2/floats-clear/floats-023-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-024.xht": [ + [ + "/css/CSS2/floats-clear/floats-024.xht", + [ + [ + "/css/CSS2/floats-clear/floats-024-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-025.xht": [ + [ + "/css/CSS2/floats-clear/floats-025.xht", + [ + [ + "/css/CSS2/floats-clear/floats-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-026.xht": [ + [ + "/css/CSS2/floats-clear/floats-026.xht", + [ + [ + "/css/CSS2/floats-clear/floats-026-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-027.xht": [ + [ + "/css/CSS2/floats-clear/floats-027.xht", + [ + [ + "/css/CSS2/floats-clear/floats-027-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-028.xht": [ + [ + "/css/CSS2/floats-clear/floats-028.xht", + [ + [ + "/css/CSS2/floats-clear/floats-028-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-029.xht": [ + [ + "/css/CSS2/floats-clear/floats-029.xht", + [ + [ + "/css/CSS2/floats-clear/floats-029-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-030.xht": [ + [ + "/css/CSS2/floats-clear/floats-030.xht", + [ + [ + "/css/CSS2/floats-clear/floats-030-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-031.xht": [ + [ + "/css/CSS2/floats-clear/floats-031.xht", + [ + [ + "/css/CSS2/floats-clear/floats-031-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-036.xht": [ + [ + "/css/CSS2/floats-clear/floats-036.xht", + [ + [ + "/css/CSS2/floats-clear/floats-036-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-038.xht": [ + [ + "/css/CSS2/floats-clear/floats-038.xht", + [ + [ + "/css/CSS2/floats-clear/floats-038-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-039.xht": [ + [ + "/css/CSS2/floats-clear/floats-039.xht", + [ + [ + "/css/CSS2/floats-clear/floats-038-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-040.xht": [ + [ + "/css/CSS2/floats-clear/floats-040.xht", + [ + [ + "/css/CSS2/floats-clear/floats-038-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-041.xht": [ + [ + "/css/CSS2/floats-clear/floats-041.xht", + [ + [ + "/css/CSS2/floats-clear/floats-041-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-043.xht": [ + [ + "/css/CSS2/floats-clear/floats-043.xht", + [ + [ + "/css/CSS2/floats-clear/floats-043-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-101.xht": [ + [ + "/css/CSS2/floats-clear/floats-101.xht", + [ + [ + "/css/CSS2/floats-clear/floats-101-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-111.xht": [ + [ + "/css/CSS2/floats-clear/floats-111.xht", + [ + [ + "/css/CSS2/floats-clear/floats-111-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-112.xht": [ + [ + "/css/CSS2/floats-clear/floats-112.xht", + [ + [ + "/css/CSS2/floats-clear/floats-112-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-113.xht": [ + [ + "/css/CSS2/floats-clear/floats-113.xht", + [ + [ + "/css/CSS2/floats-clear/floats-113-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-114.xht": [ + [ + "/css/CSS2/floats-clear/floats-114.xht", + [ + [ + "/css/CSS2/floats-clear/floats-114-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-115.xht": [ + [ + "/css/CSS2/floats-clear/floats-115.xht", + [ + [ + "/css/CSS2/floats-clear/floats-115-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-116.xht": [ + [ + "/css/CSS2/floats-clear/floats-116.xht", + [ + [ + "/css/CSS2/floats-clear/floats-116-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-117.xht": [ + [ + "/css/CSS2/floats-clear/floats-117.xht", + [ + [ + "/css/CSS2/floats-clear/floats-116-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-118.xht": [ + [ + "/css/CSS2/floats-clear/floats-118.xht", + [ + [ + "/css/CSS2/floats-clear/floats-118-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-119.xht": [ + [ + "/css/CSS2/floats-clear/floats-119.xht", + [ + [ + "/css/CSS2/floats-clear/floats-119-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-120.xht": [ + [ + "/css/CSS2/floats-clear/floats-120.xht", + [ + [ + "/css/CSS2/floats-clear/floats-119-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-121.xht": [ + [ + "/css/CSS2/floats-clear/floats-121.xht", + [ + [ + "/css/CSS2/floats-clear/floats-121-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-122.xht": [ + [ + "/css/CSS2/floats-clear/floats-122.xht", + [ + [ + "/css/CSS2/floats-clear/floats-122-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-123.xht": [ + [ + "/css/CSS2/floats-clear/floats-123.xht", + [ + [ + "/css/CSS2/floats-clear/floats-123-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-124.xht": [ + [ + "/css/CSS2/floats-clear/floats-124.xht", + [ + [ + "/css/CSS2/floats-clear/floats-124-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-125.xht": [ + [ + "/css/CSS2/floats-clear/floats-125.xht", + [ + [ + "/css/CSS2/floats-clear/floats-125-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-132.xht": [ + [ + "/css/CSS2/floats-clear/floats-132.xht", + [ + [ + "/css/CSS2/floats-clear/floats-132-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-133.xht": [ + [ + "/css/CSS2/floats-clear/floats-133.xht", + [ + [ + "/css/CSS2/floats-clear/floats-133-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-134.xht": [ + [ + "/css/CSS2/floats-clear/floats-134.xht", + [ + [ + "/css/CSS2/floats-clear/floats-133-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-135.xht": [ + [ + "/css/CSS2/floats-clear/floats-135.xht", + [ + [ + "/css/CSS2/floats-clear/floats-135-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-136.xht": [ + [ + "/css/CSS2/floats-clear/floats-136.xht", + [ + [ + "/css/CSS2/floats-clear/floats-136-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-138.xht": [ + [ + "/css/CSS2/floats-clear/floats-138.xht", + [ + [ + "/css/CSS2/floats-clear/floats-138-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-139.xht": [ + [ + "/css/CSS2/floats-clear/floats-139.xht", + [ + [ + "/css/CSS2/floats-clear/floats-139-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-141.xht": [ + [ + "/css/CSS2/floats-clear/floats-141.xht", + [ + [ + "/css/CSS2/floats-clear/floats-141-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-142.xht": [ + [ + "/css/CSS2/floats-clear/floats-142.xht", + [ + [ + "/css/CSS2/floats-clear/floats-142-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-143.xht": [ + [ + "/css/CSS2/floats-clear/floats-143.xht", + [ + [ + "/css/CSS2/floats-clear/floats-143-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-144.xht": [ + [ + "/css/CSS2/floats-clear/floats-144.xht", + [ + [ + "/css/CSS2/floats-clear/floats-144-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-145.xht": [ + [ + "/css/CSS2/floats-clear/floats-145.xht", + [ + [ + "/css/CSS2/floats-clear/floats-145-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-146.xht": [ + [ + "/css/CSS2/floats-clear/floats-146.xht", + [ + [ + "/css/CSS2/floats-clear/floats-146-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-147.xht": [ + [ + "/css/CSS2/floats-clear/floats-147.xht", + [ + [ + "/css/CSS2/floats-clear/floats-147-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-149.xht": [ + [ + "/css/CSS2/floats-clear/floats-149.xht", + [ + [ + "/css/CSS2/floats-clear/floats-149-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-150.xht": [ + [ + "/css/CSS2/floats-clear/floats-150.xht", + [ + [ + "/css/CSS2/floats-clear/floats-150-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-152.xht": [ + [ + "/css/CSS2/floats-clear/floats-152.xht", + [ + [ + "/css/CSS2/floats-clear/floats-150-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-153.xht": [ + [ + "/css/CSS2/floats-clear/floats-153.xht", + [ + [ + "/css/CSS2/floats-clear/floats-153-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-154.xht": [ + [ + "/css/CSS2/floats-clear/floats-154.xht", + [ + [ + "/css/CSS2/floats-clear/floats-154-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-bfc-001.xht": [ + [ + "/css/CSS2/floats-clear/floats-bfc-001.xht", + [ + [ + "/css/CSS2/floats-clear/floats-bfc-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/floats-bfc-002.xht": [ + [ + "/css/CSS2/floats-clear/floats-bfc-002.xht", + [ + [ + "/css/CSS2/floats-clear/floats-bfc-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-018.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-018.xht", + [ + [ + "/css/CSS2/floats-clear/clearance-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-023.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-023.xht", + [ + [ + "/css/CSS2/floats-clear/clearance-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-024.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-024.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-024-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-027.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-027.xht", + [ + [ + "/css/CSS2/floats-clear/clearance-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-031.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-031.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-031-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-033.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-033.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-034.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-034.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-035.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-035.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-121.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-121.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-121-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-122.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-122.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-121-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-123.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-123.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-123-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-125.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-125.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-125-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-134.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-134.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-134-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-135.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-135.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-135-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-142.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-142.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-142-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-157.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-157.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-157-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-158.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-158.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-158-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-165.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-165.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-165-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-166.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-166.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-165-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-002.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-002.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-003.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-003.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-008.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-008.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-009.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-009.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-012.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-012.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-012-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-013.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-013.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-012-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-014.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-014.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-015.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-015.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-015-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-016.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-016.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-016-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-017.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-017.xht", + [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-017-ref.xht", + "==" + ] + ], + {} + ] + ], "css/CSS2/floats/floats-placement-vertical-001a.xht": [ [ "/css/CSS2/floats/floats-placement-vertical-001a.xht", @@ -9325,6 +11713,14454 @@ {} ] ], + "css/CSS2/normal-flow/block-formatting-context-height-001.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-context-height-001.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-context-height-002.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-context-height-002.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-context-height-003.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-context-height-003.xht", + [ + [ + "/css/CSS2/normal-flow/block-formatting-context-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-001.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-001.xht", + [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-003.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-003.xht", + [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-004.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-004.xht", + [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-005.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-005.xht", + [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-006.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-006.xht", + [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-007.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-007.xht", + [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-008.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-008.xht", + [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-009.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-009.xht", + [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-010.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-010.xht", + [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-011.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-011.xht", + [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-012.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-012.xht", + [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-015.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-015.xht", + [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-015-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-016.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-016.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-append-001.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-append-001.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-append-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-append-002.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-append-002.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-append-002-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-empty-001.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-empty-001.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-empty-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-empty-002.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-empty-002.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-empty-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-empty-003.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-empty-003.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-empty-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-empty-004.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-empty-004.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-empty-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-float-between-001.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-float-between-001.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-float-between-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001a.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001a.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001b.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001b.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001c.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001c.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001d.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001d.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001e.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001e.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001f.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001f.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001g.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001g.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001h.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001h.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001i.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001i.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001j.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001j.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001k.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001k.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001l.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001l.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-002a.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002a.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-002b.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002b.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-002c.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002c.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-002d.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002d.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-002e.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002e.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-002f.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002f.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-002g.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002g.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-002h.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002h.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-002i.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002i.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-003.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-003.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-003-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-004.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-004.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-004-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-006.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-006.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-006-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-007.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-007.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-007-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-008a.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-008a.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-008-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-008b.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-008b.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-008c.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-008c.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-009.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-009.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-009-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-010.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-010.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-010-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-011.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-011.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-011-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-012.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-012.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-012-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-013.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-013.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-013-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-014.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-014.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-014-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-015.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-015.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-015-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-016a.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-016a.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-016-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-016b.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-016b.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-016-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-017.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-017.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-margins-001a.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-margins-001a.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-margins-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-margins-001b.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-margins-001b.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-margins-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-margins-002a.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-margins-002a.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-margins-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-margins-002b.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-margins-002b.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-margins-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-nested-001.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-nested-001.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-nested-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-nested-002.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-nested-002.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-nested-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-percents-001.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-percents-001.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-percents-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-000.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-000.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-000-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-001.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-001.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-001-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-002.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-002.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-003.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-003.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-003-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-004.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-004.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-004-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-005.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-005.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-005-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-006.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-006.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-006-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-whitespace-001a.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-whitespace-001a.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-whitespace-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-whitespace-001b.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-whitespace-001b.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-whitespace-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-001.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-001.xht", + [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-005.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-005.xht", + [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-011.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-011.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-013.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-013.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-width-001.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-001.xht", + [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-width-003.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-003.xht", + [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-width-004.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-004.xht", + [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-width-005.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-005.xht", + [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-width-006.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-006.xht", + [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-width-007.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-007.xht", + [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-height-001.xht": [ + [ + "/css/CSS2/normal-flow/block-replaced-height-001.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-height-002.xht": [ + [ + "/css/CSS2/normal-flow/block-replaced-height-002.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-height-004.xht": [ + [ + "/css/CSS2/normal-flow/block-replaced-height-004.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-height-005.xht": [ + [ + "/css/CSS2/normal-flow/block-replaced-height-005.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-height-006.xht": [ + [ + "/css/CSS2/normal-flow/block-replaced-height-006.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-height-007.xht": [ + [ + "/css/CSS2/normal-flow/block-replaced-height-007.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-width-002.xht": [ + [ + "/css/CSS2/normal-flow/block-replaced-width-002.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-width-006.xht": [ + [ + "/css/CSS2/normal-flow/block-replaced-width-006.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-011.xht": [ + [ + "/css/CSS2/normal-flow/blocks-011.xht", + [ + [ + "/css/CSS2/normal-flow/blocks-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-012.xht": [ + [ + "/css/CSS2/normal-flow/blocks-012.xht", + [ + [ + "/css/CSS2/normal-flow/blocks-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-013.xht": [ + [ + "/css/CSS2/normal-flow/blocks-013.xht", + [ + [ + "/css/CSS2/normal-flow/blocks-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-014.xht": [ + [ + "/css/CSS2/normal-flow/blocks-014.xht", + [ + [ + "/css/CSS2/normal-flow/blocks-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-015.xht": [ + [ + "/css/CSS2/normal-flow/blocks-015.xht", + [ + [ + "/css/CSS2/normal-flow/blocks-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-016.xht": [ + [ + "/css/CSS2/normal-flow/blocks-016.xht", + [ + [ + "/css/CSS2/normal-flow/blocks-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-017.xht": [ + [ + "/css/CSS2/normal-flow/blocks-017.xht", + [ + [ + "/css/CSS2/tables/reference/table-margin-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-018.xht": [ + [ + "/css/CSS2/normal-flow/blocks-018.xht", + [ + [ + "/css/CSS2/normal-flow/blocks-018-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-019.xht": [ + [ + "/css/CSS2/normal-flow/blocks-019.xht", + [ + [ + "/css/CSS2/normal-flow/blocks-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-020.xht": [ + [ + "/css/CSS2/normal-flow/blocks-020.xht", + [ + [ + "/css/CSS2/normal-flow/blocks-020-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-021.xht": [ + [ + "/css/CSS2/normal-flow/blocks-021.xht", + [ + [ + "/css/CSS2/normal-flow/blocks-020-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-022.xht": [ + [ + "/css/CSS2/normal-flow/blocks-022.xht", + [ + [ + "/css/CSS2/normal-flow/blocks-020-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-025.xht": [ + [ + "/css/CSS2/normal-flow/blocks-025.xht", + [ + [ + "/css/CSS2/normal-flow/blocks-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/blocks-026.xht": [ + [ + "/css/CSS2/normal-flow/blocks-026.xht", + [ + [ + "/css/CSS2/normal-flow/blocks-026-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-001.xht": [ + [ + "/css/CSS2/normal-flow/height-001.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-002.xht": [ + [ + "/css/CSS2/normal-flow/height-002.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-003.xht": [ + [ + "/css/CSS2/normal-flow/height-003.xht", + [ + [ + "/css/CSS2/normal-flow/height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-004.xht": [ + [ + "/css/CSS2/normal-flow/height-004.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-005.xht": [ + [ + "/css/CSS2/normal-flow/height-005.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-006.xht": [ + [ + "/css/CSS2/normal-flow/height-006.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-007.xht": [ + [ + "/css/CSS2/normal-flow/height-007.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-012.xht": [ + [ + "/css/CSS2/normal-flow/height-012.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-013.xht": [ + [ + "/css/CSS2/normal-flow/height-013.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-015.xht": [ + [ + "/css/CSS2/normal-flow/height-015.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-016.xht": [ + [ + "/css/CSS2/normal-flow/height-016.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-017.xht": [ + [ + "/css/CSS2/normal-flow/height-017.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-018.xht": [ + [ + "/css/CSS2/normal-flow/height-018.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-023.xht": [ + [ + "/css/CSS2/normal-flow/height-023.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-024.xht": [ + [ + "/css/CSS2/normal-flow/height-024.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-025.xht": [ + [ + "/css/CSS2/normal-flow/height-025.xht", + [ + [ + "/css/CSS2/normal-flow/height-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-026.xht": [ + [ + "/css/CSS2/normal-flow/height-026.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-027.xht": [ + [ + "/css/CSS2/normal-flow/height-027.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-028.xht": [ + [ + "/css/CSS2/normal-flow/height-028.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-029.xht": [ + [ + "/css/CSS2/normal-flow/height-029.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-034.xht": [ + [ + "/css/CSS2/normal-flow/height-034.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-035.xht": [ + [ + "/css/CSS2/normal-flow/height-035.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-037.xht": [ + [ + "/css/CSS2/normal-flow/height-037.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-038.xht": [ + [ + "/css/CSS2/normal-flow/height-038.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-039.xht": [ + [ + "/css/CSS2/normal-flow/height-039.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-040.xht": [ + [ + "/css/CSS2/normal-flow/height-040.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-045.xht": [ + [ + "/css/CSS2/normal-flow/height-045.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-046.xht": [ + [ + "/css/CSS2/normal-flow/height-046.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-048.xht": [ + [ + "/css/CSS2/normal-flow/height-048.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-049.xht": [ + [ + "/css/CSS2/normal-flow/height-049.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-050.xht": [ + [ + "/css/CSS2/normal-flow/height-050.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-051.xht": [ + [ + "/css/CSS2/normal-flow/height-051.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-056.xht": [ + [ + "/css/CSS2/normal-flow/height-056.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-057.xht": [ + [ + "/css/CSS2/normal-flow/height-057.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-058.xht": [ + [ + "/css/CSS2/normal-flow/height-058.xht", + [ + [ + "/css/CSS2/normal-flow/height-058-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-059.xht": [ + [ + "/css/CSS2/normal-flow/height-059.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-060.xht": [ + [ + "/css/CSS2/normal-flow/height-060.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-061.xht": [ + [ + "/css/CSS2/normal-flow/height-061.xht", + [ + [ + "/css/CSS2/normal-flow/height-061-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-062.xht": [ + [ + "/css/CSS2/normal-flow/height-062.xht", + [ + [ + "/css/CSS2/normal-flow/height-061-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-067.xht": [ + [ + "/css/CSS2/normal-flow/height-067.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-068.xht": [ + [ + "/css/CSS2/normal-flow/height-068.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-069.xht": [ + [ + "/css/CSS2/normal-flow/height-069.xht", + [ + [ + "/css/CSS2/normal-flow/height-069-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-070.xht": [ + [ + "/css/CSS2/normal-flow/height-070.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-071.xht": [ + [ + "/css/CSS2/normal-flow/height-071.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-072.xht": [ + [ + "/css/CSS2/normal-flow/height-072.xht", + [ + [ + "/css/CSS2/normal-flow/height-072-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-073.xht": [ + [ + "/css/CSS2/normal-flow/height-073.xht", + [ + [ + "/css/CSS2/normal-flow/height-072-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-078.xht": [ + [ + "/css/CSS2/normal-flow/height-078.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-079.xht": [ + [ + "/css/CSS2/normal-flow/height-079.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-080.xht": [ + [ + "/css/CSS2/normal-flow/height-080.xht", + [ + [ + "/css/CSS2/normal-flow/height-080-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-081.xht": [ + [ + "/css/CSS2/normal-flow/height-081.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-082.xht": [ + [ + "/css/CSS2/normal-flow/height-082.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-083.xht": [ + [ + "/css/CSS2/normal-flow/height-083.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-084.xht": [ + [ + "/css/CSS2/normal-flow/height-084.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-089.xht": [ + [ + "/css/CSS2/normal-flow/height-089.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-090.xht": [ + [ + "/css/CSS2/normal-flow/height-090.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-091.xht": [ + [ + "/css/CSS2/normal-flow/height-091.xht", + [ + [ + "/css/CSS2/normal-flow/height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-092.xht": [ + [ + "/css/CSS2/normal-flow/height-092.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-093.xht": [ + [ + "/css/CSS2/normal-flow/height-093.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-094.xht": [ + [ + "/css/CSS2/normal-flow/height-094.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-095.xht": [ + [ + "/css/CSS2/normal-flow/height-095.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-100.xht": [ + [ + "/css/CSS2/normal-flow/height-100.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-101.xht": [ + [ + "/css/CSS2/normal-flow/height-101.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-102.xht": [ + [ + "/css/CSS2/normal-flow/height-102.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-103.xht": [ + [ + "/css/CSS2/normal-flow/height-103.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-104.xht": [ + [ + "/css/CSS2/normal-flow/height-104.xht", + [ + [ + "/css/CSS2/normal-flow/height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-111.xht": [ + [ + "/css/CSS2/normal-flow/height-111.xht", + [ + [ + "/css/CSS2/normal-flow/height-111-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-112.xht": [ + [ + "/css/CSS2/normal-flow/height-112.xht", + [ + [ + "/css/CSS2/normal-flow/height-112-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-113.xht": [ + [ + "/css/CSS2/normal-flow/height-113.xht", + [ + [ + "/css/CSS2/normal-flow/height-113-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-114.xht": [ + [ + "/css/CSS2/normal-flow/height-114.xht", + [ + [ + "/css/CSS2/normal-flow/height-114-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-004.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-004.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-005.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-005.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-006.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-006.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-007.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-007.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-008.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-008.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-009.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-009.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-012.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-012.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-013.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-013.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-014.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-014.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-015.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-015.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-016.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-016.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-inherit-001.xht": [ + [ + "/css/CSS2/normal-flow/height-inherit-001.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-percentage-001.xht": [ + [ + "/css/CSS2/normal-flow/height-percentage-001.xht", + [ + [ + "/css/CSS2/normal-flow/height-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-percentage-002.xht": [ + [ + "/css/CSS2/normal-flow/height-percentage-002.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-percentage-003.xht": [ + [ + "/css/CSS2/normal-flow/height-percentage-003.xht", + [ + [ + "/css/CSS2/normal-flow/height-percentage-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-percentage-004.xht": [ + [ + "/css/CSS2/normal-flow/height-percentage-004.xht", + [ + [ + "/css/CSS2/normal-flow/height-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/height-percentage-005.xht": [ + [ + "/css/CSS2/normal-flow/height-percentage-005.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-000.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-000.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-000-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-height-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-height-001.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-height-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-height-002.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-non-replaced-height-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-non-replaced-height-001.xht", + [ + [ + "/css/CSS2/normal-flow/height-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-non-replaced-height-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-non-replaced-height-002.xht", + [ + [ + "/css/CSS2/normal-flow/height-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-non-replaced-width-001.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-non-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-non-replaced-width-002.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-non-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-003.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-non-replaced-width-003.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-004.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-non-replaced-width-004.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-height-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-height-001.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-height-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-height-002.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-height-003.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-height-003.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-height-004.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-height-004.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-height-005.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-height-005.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-height-006.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-height-006.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-height-007.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-height-007.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-height-009.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-height-009.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003b-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-width-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-width-001.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-width-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-width-002.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-width-003.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-width-003.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-width-006.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-width-006.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-width-007.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-width-007.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003a-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-width-008.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-width-008.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003c-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-valign-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-valign-001.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-valign-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-valign-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-valign-002.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-valign-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-width-001a.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-width-001a.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-width-001b.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-width-001b.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-width-002a.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-width-002a.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-width-002b.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-width-002b.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-zorder-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-zorder-001.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-zorder-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-zorder-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-zorder-002.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-zorder-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-zorder-003.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-zorder-003.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-zorder-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-zorder-004.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-zorder-004.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-zorder-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-block-zorder-005.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-zorder-005.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-zorder-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-non-replaced-height-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-non-replaced-height-002.xht", + [ + [ + "/css/CSS2/normal-flow/inline-non-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-non-replaced-height-003.xht": [ + [ + "/css/CSS2/normal-flow/inline-non-replaced-height-003.xht", + [ + [ + "/css/CSS2/normal-flow/inline-non-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-non-replaced-width-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-non-replaced-width-001.xht", + [ + [ + "/css/CSS2/normal-flow/inline-non-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-non-replaced-width-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-non-replaced-width-002.xht", + [ + [ + "/css/CSS2/normal-flow/inline-non-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-height-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-height-001.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-height-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-height-002.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-height-003.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-height-003.xht", + [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-height-004.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-height-004.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-height-005.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-height-005.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-height-006.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-height-006.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-height-007.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-height-007.xht", + [ + [ + "/css/CSS2/normal-flow/block-replaced-height-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-height-009.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-height-009.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003b-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-height-010.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-height-010.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-height-011.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-height-011.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-001.xht", + [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-002.xht", + [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-003.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-003.xht", + [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-006.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-006.xht", + [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-008.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-008.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003a-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-009.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-009.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003c-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-011.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-011.xht", + [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-012.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-012.xht", + [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-012-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-013.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-013.xht", + [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-012-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-014.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-014.xht", + [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-015.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-015.xht", + [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-016.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-016.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-017.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-017.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-002a.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-002a.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-002b.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-002b.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-003.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-003.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-height-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-height-001.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-height-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-height-002.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-valign-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-valign-001.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-valign-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-width-001a.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-width-001a.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-width-001b.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-width-001b.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-width-002a.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-width-002a.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-width-002b.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-width-002b.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-zorder-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-zorder-001.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-zorder-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-zorder-002.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-zorder-002.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-zorder-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-zorder-003.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-zorder-003.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-zorder-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-zorder-004.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-zorder-004.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-zorder-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inline-table-zorder-005.xht": [ + [ + "/css/CSS2/normal-flow/inline-table-zorder-005.xht", + [ + [ + "/css/CSS2/normal-flow/inline-table-zorder-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inlines-002.xht": [ + [ + "/css/CSS2/normal-flow/inlines-002.xht", + [ + [ + "/css/CSS2/normal-flow/inlines-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inlines-013.xht": [ + [ + "/css/CSS2/normal-flow/inlines-013.xht", + [ + [ + "/css/CSS2/normal-flow/inlines-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inlines-016.xht": [ + [ + "/css/CSS2/normal-flow/inlines-016.xht", + [ + [ + "/css/CSS2/normal-flow/inlines-016-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inlines-017.xht": [ + [ + "/css/CSS2/normal-flow/inlines-017.xht", + [ + [ + "/css/CSS2/normal-flow/inlines-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/inlines-020.xht": [ + [ + "/css/CSS2/normal-flow/inlines-020.xht", + [ + [ + "/css/CSS2/normal-flow/inlines-020-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-001.xht": [ + [ + "/css/CSS2/normal-flow/max-height-001.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-002.xht": [ + [ + "/css/CSS2/normal-flow/max-height-002.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-003.xht": [ + [ + "/css/CSS2/normal-flow/max-height-003.xht", + [ + [ + "/css/CSS2/normal-flow/height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-004.xht": [ + [ + "/css/CSS2/normal-flow/max-height-004.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-005.xht": [ + [ + "/css/CSS2/normal-flow/max-height-005.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-006.xht": [ + [ + "/css/CSS2/normal-flow/max-height-006.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-007.xht": [ + [ + "/css/CSS2/normal-flow/max-height-007.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-012.xht": [ + [ + "/css/CSS2/normal-flow/max-height-012.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-013.xht": [ + [ + "/css/CSS2/normal-flow/max-height-013.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-015.xht": [ + [ + "/css/CSS2/normal-flow/max-height-015.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-016.xht": [ + [ + "/css/CSS2/normal-flow/max-height-016.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-017.xht": [ + [ + "/css/CSS2/normal-flow/max-height-017.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-018.xht": [ + [ + "/css/CSS2/normal-flow/max-height-018.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-023.xht": [ + [ + "/css/CSS2/normal-flow/max-height-023.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-024.xht": [ + [ + "/css/CSS2/normal-flow/max-height-024.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-025.xht": [ + [ + "/css/CSS2/normal-flow/max-height-025.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-026.xht": [ + [ + "/css/CSS2/normal-flow/max-height-026.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-027.xht": [ + [ + "/css/CSS2/normal-flow/max-height-027.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-028.xht": [ + [ + "/css/CSS2/normal-flow/max-height-028.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-029.xht": [ + [ + "/css/CSS2/normal-flow/max-height-029.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-034.xht": [ + [ + "/css/CSS2/normal-flow/max-height-034.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-035.xht": [ + [ + "/css/CSS2/normal-flow/max-height-035.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-036.xht": [ + [ + "/css/CSS2/normal-flow/max-height-036.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-036-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-037.xht": [ + [ + "/css/CSS2/normal-flow/max-height-037.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-038.xht": [ + [ + "/css/CSS2/normal-flow/max-height-038.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-039.xht": [ + [ + "/css/CSS2/normal-flow/max-height-039.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-040.xht": [ + [ + "/css/CSS2/normal-flow/max-height-040.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-045.xht": [ + [ + "/css/CSS2/normal-flow/max-height-045.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-046.xht": [ + [ + "/css/CSS2/normal-flow/max-height-046.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-047.xht": [ + [ + "/css/CSS2/normal-flow/max-height-047.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-047-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-048.xht": [ + [ + "/css/CSS2/normal-flow/max-height-048.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-049.xht": [ + [ + "/css/CSS2/normal-flow/max-height-049.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-050.xht": [ + [ + "/css/CSS2/normal-flow/max-height-050.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-051.xht": [ + [ + "/css/CSS2/normal-flow/max-height-051.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-056.xht": [ + [ + "/css/CSS2/normal-flow/max-height-056.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-057.xht": [ + [ + "/css/CSS2/normal-flow/max-height-057.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-058.xht": [ + [ + "/css/CSS2/normal-flow/max-height-058.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-058-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-059.xht": [ + [ + "/css/CSS2/normal-flow/max-height-059.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-060.xht": [ + [ + "/css/CSS2/normal-flow/max-height-060.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-061.xht": [ + [ + "/css/CSS2/normal-flow/max-height-061.xht", + [ + [ + "/css/CSS2/normal-flow/height-061-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-062.xht": [ + [ + "/css/CSS2/normal-flow/max-height-062.xht", + [ + [ + "/css/CSS2/normal-flow/height-061-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-067.xht": [ + [ + "/css/CSS2/normal-flow/max-height-067.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-068.xht": [ + [ + "/css/CSS2/normal-flow/max-height-068.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-069.xht": [ + [ + "/css/CSS2/normal-flow/max-height-069.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-069-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-070.xht": [ + [ + "/css/CSS2/normal-flow/max-height-070.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-071.xht": [ + [ + "/css/CSS2/normal-flow/max-height-071.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-072.xht": [ + [ + "/css/CSS2/normal-flow/max-height-072.xht", + [ + [ + "/css/CSS2/normal-flow/height-072-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-073.xht": [ + [ + "/css/CSS2/normal-flow/max-height-073.xht", + [ + [ + "/css/CSS2/normal-flow/height-072-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-078.xht": [ + [ + "/css/CSS2/normal-flow/max-height-078.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-079.xht": [ + [ + "/css/CSS2/normal-flow/max-height-079.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-080.xht": [ + [ + "/css/CSS2/normal-flow/max-height-080.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-081.xht": [ + [ + "/css/CSS2/normal-flow/max-height-081.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-082.xht": [ + [ + "/css/CSS2/normal-flow/max-height-082.xht", + [ + [ + "/css/CSS2/normal-flow/height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-083.xht": [ + [ + "/css/CSS2/normal-flow/max-height-083.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-084.xht": [ + [ + "/css/CSS2/normal-flow/max-height-084.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-089.xht": [ + [ + "/css/CSS2/normal-flow/max-height-089.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-090.xht": [ + [ + "/css/CSS2/normal-flow/max-height-090.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-091.xht": [ + [ + "/css/CSS2/normal-flow/max-height-091.xht", + [ + [ + "/css/CSS2/normal-flow/height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-092.xht": [ + [ + "/css/CSS2/normal-flow/max-height-092.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-093.xht": [ + [ + "/css/CSS2/normal-flow/max-height-093.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-094.xht": [ + [ + "/css/CSS2/normal-flow/max-height-094.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-095.xht": [ + [ + "/css/CSS2/normal-flow/max-height-095.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-100.xht": [ + [ + "/css/CSS2/normal-flow/max-height-100.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-101.xht": [ + [ + "/css/CSS2/normal-flow/max-height-101.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-102.xht": [ + [ + "/css/CSS2/normal-flow/max-height-102.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-103.xht": [ + [ + "/css/CSS2/normal-flow/max-height-103.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-104.xht": [ + [ + "/css/CSS2/normal-flow/max-height-104.xht", + [ + [ + "/css/CSS2/normal-flow/height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-107.xht": [ + [ + "/css/CSS2/normal-flow/max-height-107.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-107-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-110.xht": [ + [ + "/css/CSS2/normal-flow/max-height-110.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-110-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-005.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-005.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-006.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-006.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-008.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-008.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-009.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-009.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-012.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-012.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-013.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-013.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-014.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-014.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-015.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-015.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-016.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-016.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-percentage-001.xht": [ + [ + "/css/CSS2/normal-flow/max-height-percentage-001.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-percentage-002.xht": [ + [ + "/css/CSS2/normal-flow/max-height-percentage-002.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-percentage-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-height-percentage-003.xht": [ + [ + "/css/CSS2/normal-flow/max-height-percentage-003.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-001.xht": [ + [ + "/css/CSS2/normal-flow/max-width-001.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-002.xht": [ + [ + "/css/CSS2/normal-flow/max-width-002.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-003.xht": [ + [ + "/css/CSS2/normal-flow/max-width-003.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-004.xht": [ + [ + "/css/CSS2/normal-flow/max-width-004.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-005.xht": [ + [ + "/css/CSS2/normal-flow/max-width-005.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-006.xht": [ + [ + "/css/CSS2/normal-flow/max-width-006.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-007.xht": [ + [ + "/css/CSS2/normal-flow/max-width-007.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-012.xht": [ + [ + "/css/CSS2/normal-flow/max-width-012.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-013.xht": [ + [ + "/css/CSS2/normal-flow/max-width-013.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-015.xht": [ + [ + "/css/CSS2/normal-flow/max-width-015.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-016.xht": [ + [ + "/css/CSS2/normal-flow/max-width-016.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-017.xht": [ + [ + "/css/CSS2/normal-flow/max-width-017.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-018.xht": [ + [ + "/css/CSS2/normal-flow/max-width-018.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-023.xht": [ + [ + "/css/CSS2/normal-flow/max-width-023.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-024.xht": [ + [ + "/css/CSS2/normal-flow/max-width-024.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-025.xht": [ + [ + "/css/CSS2/normal-flow/max-width-025.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-026.xht": [ + [ + "/css/CSS2/normal-flow/max-width-026.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-027.xht": [ + [ + "/css/CSS2/normal-flow/max-width-027.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-028.xht": [ + [ + "/css/CSS2/normal-flow/max-width-028.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-029.xht": [ + [ + "/css/CSS2/normal-flow/max-width-029.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-034.xht": [ + [ + "/css/CSS2/normal-flow/max-width-034.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-035.xht": [ + [ + "/css/CSS2/normal-flow/max-width-035.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-036.xht": [ + [ + "/css/CSS2/normal-flow/max-width-036.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-036-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-037.xht": [ + [ + "/css/CSS2/normal-flow/max-width-037.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-038.xht": [ + [ + "/css/CSS2/normal-flow/max-width-038.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-039.xht": [ + [ + "/css/CSS2/normal-flow/max-width-039.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-040.xht": [ + [ + "/css/CSS2/normal-flow/max-width-040.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-045.xht": [ + [ + "/css/CSS2/normal-flow/max-width-045.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-046.xht": [ + [ + "/css/CSS2/normal-flow/max-width-046.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-047.xht": [ + [ + "/css/CSS2/normal-flow/max-width-047.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-047-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-048.xht": [ + [ + "/css/CSS2/normal-flow/max-width-048.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-049.xht": [ + [ + "/css/CSS2/normal-flow/max-width-049.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-050.xht": [ + [ + "/css/CSS2/normal-flow/max-width-050.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-051.xht": [ + [ + "/css/CSS2/normal-flow/max-width-051.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-056.xht": [ + [ + "/css/CSS2/normal-flow/max-width-056.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-057.xht": [ + [ + "/css/CSS2/normal-flow/max-width-057.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-058.xht": [ + [ + "/css/CSS2/normal-flow/max-width-058.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-059.xht": [ + [ + "/css/CSS2/normal-flow/max-width-059.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-060.xht": [ + [ + "/css/CSS2/normal-flow/max-width-060.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-061.xht": [ + [ + "/css/CSS2/normal-flow/max-width-061.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-061-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-062.xht": [ + [ + "/css/CSS2/normal-flow/max-width-062.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-061-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-067.xht": [ + [ + "/css/CSS2/normal-flow/max-width-067.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-068.xht": [ + [ + "/css/CSS2/normal-flow/max-width-068.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-069.xht": [ + [ + "/css/CSS2/normal-flow/max-width-069.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-069-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-070.xht": [ + [ + "/css/CSS2/normal-flow/max-width-070.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-071.xht": [ + [ + "/css/CSS2/normal-flow/max-width-071.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-072.xht": [ + [ + "/css/CSS2/normal-flow/max-width-072.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-072-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-073.xht": [ + [ + "/css/CSS2/normal-flow/max-width-073.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-072-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-078.xht": [ + [ + "/css/CSS2/normal-flow/max-width-078.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-079.xht": [ + [ + "/css/CSS2/normal-flow/max-width-079.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-080.xht": [ + [ + "/css/CSS2/normal-flow/max-width-080.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-081.xht": [ + [ + "/css/CSS2/normal-flow/max-width-081.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-082.xht": [ + [ + "/css/CSS2/normal-flow/max-width-082.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-083.xht": [ + [ + "/css/CSS2/normal-flow/max-width-083.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-084.xht": [ + [ + "/css/CSS2/normal-flow/max-width-084.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-089.xht": [ + [ + "/css/CSS2/normal-flow/max-width-089.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-090.xht": [ + [ + "/css/CSS2/normal-flow/max-width-090.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-091.xht": [ + [ + "/css/CSS2/normal-flow/max-width-091.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-092.xht": [ + [ + "/css/CSS2/normal-flow/max-width-092.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-093.xht": [ + [ + "/css/CSS2/normal-flow/max-width-093.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-094.xht": [ + [ + "/css/CSS2/normal-flow/max-width-094.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-095.xht": [ + [ + "/css/CSS2/normal-flow/max-width-095.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-100.xht": [ + [ + "/css/CSS2/normal-flow/max-width-100.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-101.xht": [ + [ + "/css/CSS2/normal-flow/max-width-101.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-102.xht": [ + [ + "/css/CSS2/normal-flow/max-width-102.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-103.xht": [ + [ + "/css/CSS2/normal-flow/max-width-103.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-104.xht": [ + [ + "/css/CSS2/normal-flow/max-width-104.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-105.xht": [ + [ + "/css/CSS2/normal-flow/max-width-105.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-105-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-106.xht": [ + [ + "/css/CSS2/normal-flow/max-width-106.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-105-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-107.xht": [ + [ + "/css/CSS2/normal-flow/max-width-107.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-107-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-110.xht": [ + [ + "/css/CSS2/normal-flow/max-width-110.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-001.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-001.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-002.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-002.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-003.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-003.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-004.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-004.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-005.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-005.xht", + [ + [ + "/css/reference/pass_if_square_96px_black.html", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-006.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-006.xht", + [ + [ + "/css/reference/pass_if_square_96px_black.html", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-007.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-007.xht", + [ + [ + "/css/reference/pass_if_square_96px_black.html", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-008.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-008.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-009.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-009.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-012.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-012.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-013.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-013.xht", + [ + [ + "/css/reference/pass_if_square_96px_black.html", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-014.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-014.xht", + [ + [ + "/css/reference/pass_if_square_96px_black.html", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-015.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-015.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-016.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-016.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-percentage-001.xht": [ + [ + "/css/CSS2/normal-flow/max-width-percentage-001.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/max-width-percentage-002.xht": [ + [ + "/css/CSS2/normal-flow/max-width-percentage-002.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-001.xht": [ + [ + "/css/CSS2/normal-flow/min-height-001.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-002.xht": [ + [ + "/css/CSS2/normal-flow/min-height-002.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-003.xht": [ + [ + "/css/CSS2/normal-flow/min-height-003.xht", + [ + [ + "/css/CSS2/normal-flow/height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-004.xht": [ + [ + "/css/CSS2/normal-flow/min-height-004.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-005.xht": [ + [ + "/css/CSS2/normal-flow/min-height-005.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-006.xht": [ + [ + "/css/CSS2/normal-flow/min-height-006.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-007.xht": [ + [ + "/css/CSS2/normal-flow/min-height-007.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-012.xht": [ + [ + "/css/CSS2/normal-flow/min-height-012.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-013.xht": [ + [ + "/css/CSS2/normal-flow/min-height-013.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-015.xht": [ + [ + "/css/CSS2/normal-flow/min-height-015.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-016.xht": [ + [ + "/css/CSS2/normal-flow/min-height-016.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-017.xht": [ + [ + "/css/CSS2/normal-flow/min-height-017.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-018.xht": [ + [ + "/css/CSS2/normal-flow/min-height-018.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-023.xht": [ + [ + "/css/CSS2/normal-flow/min-height-023.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-024.xht": [ + [ + "/css/CSS2/normal-flow/min-height-024.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-025.xht": [ + [ + "/css/CSS2/normal-flow/min-height-025.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-026.xht": [ + [ + "/css/CSS2/normal-flow/min-height-026.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-027.xht": [ + [ + "/css/CSS2/normal-flow/min-height-027.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-028.xht": [ + [ + "/css/CSS2/normal-flow/min-height-028.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-029.xht": [ + [ + "/css/CSS2/normal-flow/min-height-029.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-034.xht": [ + [ + "/css/CSS2/normal-flow/min-height-034.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-035.xht": [ + [ + "/css/CSS2/normal-flow/min-height-035.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-036.xht": [ + [ + "/css/CSS2/normal-flow/min-height-036.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-036-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-037.xht": [ + [ + "/css/CSS2/normal-flow/min-height-037.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-038.xht": [ + [ + "/css/CSS2/normal-flow/min-height-038.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-039.xht": [ + [ + "/css/CSS2/normal-flow/min-height-039.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-040.xht": [ + [ + "/css/CSS2/normal-flow/min-height-040.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-045.xht": [ + [ + "/css/CSS2/normal-flow/min-height-045.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-046.xht": [ + [ + "/css/CSS2/normal-flow/min-height-046.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-047.xht": [ + [ + "/css/CSS2/normal-flow/min-height-047.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-047-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-048.xht": [ + [ + "/css/CSS2/normal-flow/min-height-048.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-049.xht": [ + [ + "/css/CSS2/normal-flow/min-height-049.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-050.xht": [ + [ + "/css/CSS2/normal-flow/min-height-050.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-051.xht": [ + [ + "/css/CSS2/normal-flow/min-height-051.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-056.xht": [ + [ + "/css/CSS2/normal-flow/min-height-056.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-057.xht": [ + [ + "/css/CSS2/normal-flow/min-height-057.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-058.xht": [ + [ + "/css/CSS2/normal-flow/min-height-058.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-058-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-059.xht": [ + [ + "/css/CSS2/normal-flow/min-height-059.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-060.xht": [ + [ + "/css/CSS2/normal-flow/min-height-060.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-061.xht": [ + [ + "/css/CSS2/normal-flow/min-height-061.xht", + [ + [ + "/css/CSS2/normal-flow/height-061-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-062.xht": [ + [ + "/css/CSS2/normal-flow/min-height-062.xht", + [ + [ + "/css/CSS2/normal-flow/height-061-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-067.xht": [ + [ + "/css/CSS2/normal-flow/min-height-067.xht", + [ + [ + "/css/CSS2/normal-flow/min-height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-068.xht": [ + [ + "/css/CSS2/normal-flow/min-height-068.xht", + [ + [ + "/css/CSS2/normal-flow/min-height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-069.xht": [ + [ + "/css/CSS2/normal-flow/min-height-069.xht", + [ + [ + "/css/CSS2/normal-flow/height-069-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-070.xht": [ + [ + "/css/CSS2/normal-flow/min-height-070.xht", + [ + [ + "/css/CSS2/normal-flow/min-height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-071.xht": [ + [ + "/css/CSS2/normal-flow/min-height-071.xht", + [ + [ + "/css/CSS2/normal-flow/min-height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-072.xht": [ + [ + "/css/CSS2/normal-flow/min-height-072.xht", + [ + [ + "/css/CSS2/normal-flow/height-072-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-073.xht": [ + [ + "/css/CSS2/normal-flow/min-height-073.xht", + [ + [ + "/css/CSS2/normal-flow/height-072-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-078.xht": [ + [ + "/css/CSS2/normal-flow/min-height-078.xht", + [ + [ + "/css/CSS2/normal-flow/min-height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-079.xht": [ + [ + "/css/CSS2/normal-flow/min-height-079.xht", + [ + [ + "/css/CSS2/normal-flow/min-height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-080.xht": [ + [ + "/css/CSS2/normal-flow/min-height-080.xht", + [ + [ + "/css/CSS2/normal-flow/height-080-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-081.xht": [ + [ + "/css/CSS2/normal-flow/min-height-081.xht", + [ + [ + "/css/CSS2/normal-flow/min-height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-082.xht": [ + [ + "/css/CSS2/normal-flow/min-height-082.xht", + [ + [ + "/css/CSS2/normal-flow/min-height-067-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-083.xht": [ + [ + "/css/CSS2/normal-flow/min-height-083.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-084.xht": [ + [ + "/css/CSS2/normal-flow/min-height-084.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-089.xht": [ + [ + "/css/CSS2/normal-flow/min-height-089.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-090.xht": [ + [ + "/css/CSS2/normal-flow/min-height-090.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-091.xht": [ + [ + "/css/CSS2/normal-flow/min-height-091.xht", + [ + [ + "/css/CSS2/normal-flow/height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-092.xht": [ + [ + "/css/CSS2/normal-flow/min-height-092.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-093.xht": [ + [ + "/css/CSS2/normal-flow/min-height-093.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-094.xht": [ + [ + "/css/CSS2/normal-flow/min-height-094.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-095.xht": [ + [ + "/css/CSS2/normal-flow/min-height-095.xht", + [ + [ + "/css/CSS2/normal-flow/height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-100.xht": [ + [ + "/css/CSS2/normal-flow/min-height-100.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-101.xht": [ + [ + "/css/CSS2/normal-flow/min-height-101.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-102.xht": [ + [ + "/css/CSS2/normal-flow/min-height-102.xht", + [ + [ + "/css/CSS2/normal-flow/height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-103.xht": [ + [ + "/css/CSS2/normal-flow/min-height-103.xht", + [ + [ + "/css/CSS2/normal-flow/height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-104.xht": [ + [ + "/css/CSS2/normal-flow/min-height-104.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-107-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-105.xht": [ + [ + "/css/CSS2/normal-flow/min-height-105.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-110-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-106.xht": [ + [ + "/css/CSS2/normal-flow/min-height-106.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-107-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-111.xht": [ + [ + "/css/CSS2/normal-flow/min-height-111.xht", + [ + [ + "/css/CSS2/normal-flow/min-height-111-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-112.xht": [ + [ + "/css/CSS2/normal-flow/min-height-112.xht", + [ + [ + "/css/CSS2/normal-flow/min-height-111-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-005.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-005.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-006.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-006.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-008.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-008.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-009.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-009.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-012.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-012.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-015.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-015.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-percentage-001.xht": [ + [ + "/css/CSS2/normal-flow/min-height-percentage-001.xht", + [ + [ + "/css/CSS2/normal-flow/max-height-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-percentage-002.xht": [ + [ + "/css/CSS2/normal-flow/min-height-percentage-002.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-height-percentage-003.xht": [ + [ + "/css/CSS2/normal-flow/min-height-percentage-003.xht", + [ + [ + "/css/CSS2/normal-flow/min-height-percentage-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-001.xht": [ + [ + "/css/CSS2/normal-flow/min-width-001.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-002.xht": [ + [ + "/css/CSS2/normal-flow/min-width-002.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-003.xht": [ + [ + "/css/CSS2/normal-flow/min-width-003.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-004.xht": [ + [ + "/css/CSS2/normal-flow/min-width-004.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-005.xht": [ + [ + "/css/CSS2/normal-flow/min-width-005.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-006.xht": [ + [ + "/css/CSS2/normal-flow/min-width-006.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-007.xht": [ + [ + "/css/CSS2/normal-flow/min-width-007.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-012.xht": [ + [ + "/css/CSS2/normal-flow/min-width-012.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-013.xht": [ + [ + "/css/CSS2/normal-flow/min-width-013.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-015.xht": [ + [ + "/css/CSS2/normal-flow/min-width-015.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-016.xht": [ + [ + "/css/CSS2/normal-flow/min-width-016.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-017.xht": [ + [ + "/css/CSS2/normal-flow/min-width-017.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-018.xht": [ + [ + "/css/CSS2/normal-flow/min-width-018.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-023.xht": [ + [ + "/css/CSS2/normal-flow/min-width-023.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-024.xht": [ + [ + "/css/CSS2/normal-flow/min-width-024.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-025.xht": [ + [ + "/css/CSS2/normal-flow/min-width-025.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-026.xht": [ + [ + "/css/CSS2/normal-flow/min-width-026.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-027.xht": [ + [ + "/css/CSS2/normal-flow/min-width-027.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-028.xht": [ + [ + "/css/CSS2/normal-flow/min-width-028.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-029.xht": [ + [ + "/css/CSS2/normal-flow/min-width-029.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-034.xht": [ + [ + "/css/CSS2/normal-flow/min-width-034.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-035.xht": [ + [ + "/css/CSS2/normal-flow/min-width-035.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-036.xht": [ + [ + "/css/CSS2/normal-flow/min-width-036.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-036-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-037.xht": [ + [ + "/css/CSS2/normal-flow/min-width-037.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-038.xht": [ + [ + "/css/CSS2/normal-flow/min-width-038.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-039.xht": [ + [ + "/css/CSS2/normal-flow/min-width-039.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-040.xht": [ + [ + "/css/CSS2/normal-flow/min-width-040.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-045.xht": [ + [ + "/css/CSS2/normal-flow/min-width-045.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-046.xht": [ + [ + "/css/CSS2/normal-flow/min-width-046.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-047.xht": [ + [ + "/css/CSS2/normal-flow/min-width-047.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-047-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-048.xht": [ + [ + "/css/CSS2/normal-flow/min-width-048.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-049.xht": [ + [ + "/css/CSS2/normal-flow/min-width-049.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-050.xht": [ + [ + "/css/CSS2/normal-flow/min-width-050.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-051.xht": [ + [ + "/css/CSS2/normal-flow/min-width-051.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-056.xht": [ + [ + "/css/CSS2/normal-flow/min-width-056.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-057.xht": [ + [ + "/css/CSS2/normal-flow/min-width-057.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-058.xht": [ + [ + "/css/CSS2/normal-flow/min-width-058.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-059.xht": [ + [ + "/css/CSS2/normal-flow/min-width-059.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-060.xht": [ + [ + "/css/CSS2/normal-flow/min-width-060.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-061.xht": [ + [ + "/css/CSS2/normal-flow/min-width-061.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-061-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-062.xht": [ + [ + "/css/CSS2/normal-flow/min-width-062.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-061-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-067.xht": [ + [ + "/css/CSS2/normal-flow/min-width-067.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-068.xht": [ + [ + "/css/CSS2/normal-flow/min-width-068.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-069.xht": [ + [ + "/css/CSS2/normal-flow/min-width-069.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-069-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-070.xht": [ + [ + "/css/CSS2/normal-flow/min-width-070.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-071.xht": [ + [ + "/css/CSS2/normal-flow/min-width-071.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-072.xht": [ + [ + "/css/CSS2/normal-flow/min-width-072.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-072-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-073.xht": [ + [ + "/css/CSS2/normal-flow/min-width-073.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-072-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-078.xht": [ + [ + "/css/CSS2/normal-flow/min-width-078.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-079.xht": [ + [ + "/css/CSS2/normal-flow/min-width-079.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-080.xht": [ + [ + "/css/CSS2/normal-flow/min-width-080.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-081.xht": [ + [ + "/css/CSS2/normal-flow/min-width-081.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-082.xht": [ + [ + "/css/CSS2/normal-flow/min-width-082.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-083.xht": [ + [ + "/css/CSS2/normal-flow/min-width-083.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-084.xht": [ + [ + "/css/CSS2/normal-flow/min-width-084.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-089.xht": [ + [ + "/css/CSS2/normal-flow/min-width-089.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-090.xht": [ + [ + "/css/CSS2/normal-flow/min-width-090.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-091.xht": [ + [ + "/css/CSS2/normal-flow/min-width-091.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-092.xht": [ + [ + "/css/CSS2/normal-flow/min-width-092.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-093.xht": [ + [ + "/css/CSS2/normal-flow/min-width-093.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-094.xht": [ + [ + "/css/CSS2/normal-flow/min-width-094.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-095.xht": [ + [ + "/css/CSS2/normal-flow/min-width-095.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-100.xht": [ + [ + "/css/CSS2/normal-flow/min-width-100.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-101.xht": [ + [ + "/css/CSS2/normal-flow/min-width-101.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-102.xht": [ + [ + "/css/CSS2/normal-flow/min-width-102.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-103.xht": [ + [ + "/css/CSS2/normal-flow/min-width-103.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-001.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-001.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-002.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-002.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-003.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-003.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-004.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-004.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-005.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-005.xht", + [ + [ + "/css/reference/pass_if_square_96px_black.html", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-006.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-006.xht", + [ + [ + "/css/reference/pass_if_square_96px_black.html", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-007.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-007.xht", + [ + [ + "/css/reference/pass_if_square_96px_black.html", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-008.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-008.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-009.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-009.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-012.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-012.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-013.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-013.xht", + [ + [ + "/css/reference/pass_if_square_96px_black.html", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-014.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-014.xht", + [ + [ + "/css/reference/pass_if_square_96px_black.html", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-015.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-015.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-016.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-016.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-percentage-001.xht": [ + [ + "/css/CSS2/normal-flow/min-width-percentage-001.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/min-width-percentage-002.xht": [ + [ + "/css/CSS2/normal-flow/min-width-percentage-002.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/replaced-intrinsic-001.xht": [ + [ + "/css/CSS2/normal-flow/replaced-intrinsic-001.xht", + [ + [ + "/css/CSS2/normal-flow/replaced-intrinsic-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/replaced-intrinsic-002.xht": [ + [ + "/css/CSS2/normal-flow/replaced-intrinsic-002.xht", + [ + [ + "/css/CSS2/normal-flow/replaced-intrinsic-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/replaced-intrinsic-003.xht": [ + [ + "/css/CSS2/normal-flow/replaced-intrinsic-003.xht", + [ + [ + "/css/CSS2/normal-flow/replaced-intrinsic-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/replaced-intrinsic-004.xht": [ + [ + "/css/CSS2/normal-flow/replaced-intrinsic-004.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/replaced-intrinsic-005.xht": [ + [ + "/css/CSS2/normal-flow/replaced-intrinsic-005.xht", + [ + [ + "/css/CSS2/normal-flow/replaced-intrinsic-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/root-box-001.xht": [ + [ + "/css/CSS2/normal-flow/root-box-001.xht", + [ + [ + "/css/CSS2/normal-flow/root-box-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/table-in-inline-001.xht": [ + [ + "/css/CSS2/normal-flow/table-in-inline-001.xht", + [ + [ + "/css/CSS2/normal-flow/table-in-inline-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-001.xht": [ + [ + "/css/CSS2/normal-flow/width-001.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-002.xht": [ + [ + "/css/CSS2/normal-flow/width-002.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-003.xht": [ + [ + "/css/CSS2/normal-flow/width-003.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-004.xht": [ + [ + "/css/CSS2/normal-flow/width-004.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-005.xht": [ + [ + "/css/CSS2/normal-flow/width-005.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-006.xht": [ + [ + "/css/CSS2/normal-flow/width-006.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-007.xht": [ + [ + "/css/CSS2/normal-flow/width-007.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-012.xht": [ + [ + "/css/CSS2/normal-flow/width-012.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-013.xht": [ + [ + "/css/CSS2/normal-flow/width-013.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-015.xht": [ + [ + "/css/CSS2/normal-flow/width-015.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-016.xht": [ + [ + "/css/CSS2/normal-flow/width-016.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-017.xht": [ + [ + "/css/CSS2/normal-flow/width-017.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-018.xht": [ + [ + "/css/CSS2/normal-flow/width-018.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-023.xht": [ + [ + "/css/CSS2/normal-flow/width-023.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-024.xht": [ + [ + "/css/CSS2/normal-flow/width-024.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-025.xht": [ + [ + "/css/CSS2/normal-flow/width-025.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-026.xht": [ + [ + "/css/CSS2/normal-flow/width-026.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-027.xht": [ + [ + "/css/CSS2/normal-flow/width-027.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-028.xht": [ + [ + "/css/CSS2/normal-flow/width-028.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-029.xht": [ + [ + "/css/CSS2/normal-flow/width-029.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-034.xht": [ + [ + "/css/CSS2/normal-flow/width-034.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-035.xht": [ + [ + "/css/CSS2/normal-flow/width-035.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-036.xht": [ + [ + "/css/CSS2/normal-flow/width-036.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-036-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-037.xht": [ + [ + "/css/CSS2/normal-flow/width-037.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-038.xht": [ + [ + "/css/CSS2/normal-flow/width-038.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-039.xht": [ + [ + "/css/CSS2/normal-flow/width-039.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-040.xht": [ + [ + "/css/CSS2/normal-flow/width-040.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-045.xht": [ + [ + "/css/CSS2/normal-flow/width-045.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-046.xht": [ + [ + "/css/CSS2/normal-flow/width-046.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-047.xht": [ + [ + "/css/CSS2/normal-flow/width-047.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-047-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-048.xht": [ + [ + "/css/CSS2/normal-flow/width-048.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-049.xht": [ + [ + "/css/CSS2/normal-flow/width-049.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-050.xht": [ + [ + "/css/CSS2/normal-flow/width-050.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-051.xht": [ + [ + "/css/CSS2/normal-flow/width-051.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-056.xht": [ + [ + "/css/CSS2/normal-flow/width-056.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-057.xht": [ + [ + "/css/CSS2/normal-flow/width-057.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-058.xht": [ + [ + "/css/CSS2/normal-flow/width-058.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-059.xht": [ + [ + "/css/CSS2/normal-flow/width-059.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-060.xht": [ + [ + "/css/CSS2/normal-flow/width-060.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-061.xht": [ + [ + "/css/CSS2/normal-flow/width-061.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-061-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-062.xht": [ + [ + "/css/CSS2/normal-flow/width-062.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-061-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-067.xht": [ + [ + "/css/CSS2/normal-flow/width-067.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-068.xht": [ + [ + "/css/CSS2/normal-flow/width-068.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-069.xht": [ + [ + "/css/CSS2/normal-flow/width-069.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-069-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-070.xht": [ + [ + "/css/CSS2/normal-flow/width-070.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-071.xht": [ + [ + "/css/CSS2/normal-flow/width-071.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-072.xht": [ + [ + "/css/CSS2/normal-flow/width-072.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-072-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-073.xht": [ + [ + "/css/CSS2/normal-flow/width-073.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-072-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-078.xht": [ + [ + "/css/CSS2/normal-flow/width-078.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-079.xht": [ + [ + "/css/CSS2/normal-flow/width-079.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-080.xht": [ + [ + "/css/CSS2/normal-flow/width-080.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-081.xht": [ + [ + "/css/CSS2/normal-flow/width-081.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-082.xht": [ + [ + "/css/CSS2/normal-flow/width-082.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-083.xht": [ + [ + "/css/CSS2/normal-flow/width-083.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-084.xht": [ + [ + "/css/CSS2/normal-flow/width-084.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-089.xht": [ + [ + "/css/CSS2/normal-flow/width-089.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-090.xht": [ + [ + "/css/CSS2/normal-flow/width-090.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-091.xht": [ + [ + "/css/CSS2/normal-flow/width-091.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-092.xht": [ + [ + "/css/CSS2/normal-flow/width-092.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-093.xht": [ + [ + "/css/CSS2/normal-flow/width-093.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-094.xht": [ + [ + "/css/CSS2/normal-flow/width-094.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-095.xht": [ + [ + "/css/CSS2/normal-flow/width-095.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-100.xht": [ + [ + "/css/CSS2/normal-flow/width-100.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-101.xht": [ + [ + "/css/CSS2/normal-flow/width-101.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-102.xht": [ + [ + "/css/CSS2/normal-flow/width-102.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-103.xht": [ + [ + "/css/CSS2/normal-flow/width-103.xht", + [ + [ + "/css/CSS2/normal-flow/width-103-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-104.xht": [ + [ + "/css/CSS2/normal-flow/width-104.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-001.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-001.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-002.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-002.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-003.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-003.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-004.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-004.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-005.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-005.xht", + [ + [ + "/css/reference/pass_if_square_96px_black.html", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-006.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-006.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-007.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-007.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-008.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-008.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-009.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-009.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-012.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-012.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-013.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-013.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-014.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-014.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-015.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-015.xht", + [ + [ + "/css/CSS2/reference/ref-filled-black-96px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-016.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-016.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-inherit-001.xht": [ + [ + "/css/CSS2/normal-flow/width-inherit-001.xht", + [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-non-replaced-inline-001.xht": [ + [ + "/css/CSS2/normal-flow/width-non-replaced-inline-001.xht", + [ + [ + "/css/CSS2/normal-flow/width-non-replaced-inline-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-percentage-001.xht": [ + [ + "/css/CSS2/normal-flow/width-percentage-001.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/width-percentage-002.xht": [ + [ + "/css/CSS2/normal-flow/width-percentage-002.xht", + [ + [ + "/css/CSS2/normal-flow/max-width-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-002.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-002.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-003.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-003.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-004.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-004.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-005.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-005.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-006.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-006.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-007.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-007.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-008.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-008.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-009.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-009.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-009-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-010.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-010.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-011.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-011.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-012.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-012.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-002.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-002.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-003.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-003.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-004.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-004.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-005.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-005.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-006.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-006.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-007.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-007.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-008.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-008.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-009.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-009.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-009-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-010.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-010.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-011.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-011.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-012.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-012.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-001.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-001.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-002.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-002.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-003.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-003.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-004.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-004.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-005.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-005.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-006.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-006.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-007.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-007.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-008.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-008.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-010.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-010.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-011.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-011.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-012.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-012.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-013.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-013.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-014.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-014.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-015.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-015.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-015-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-016.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-016.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-017.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-017.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-018.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-018.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-019.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-019.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-020.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-020.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-021.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-021.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-021-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-022.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-022.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-021-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-023.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-023.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-021-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-024.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-024.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-021-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-025.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-025.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-026.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-026.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-026-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-027.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-027.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-001.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-001.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-002.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-002.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-003.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-003.xht", + [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-004.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-004.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-005.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-005.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-006.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-006.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-007.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-007.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-008.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-008.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-009.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-009.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-010.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-010.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-010-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-011.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-011.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-012.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-012.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-012-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-013.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-013.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-014.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-014.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-016.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-016.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-017.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-017.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-010-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-018.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-018.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-019.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-019.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-012-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-020.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-020.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-021.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-021.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-022.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-022.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-023.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-023.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-024.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-024.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-010-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-025.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-025.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-026.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-026.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-012-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-027.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-027.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-028.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-028.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-029.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-029.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-030.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-030.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-031.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-031.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-010-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-032.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-032.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-033.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-033.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-012-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-034.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-034.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-035.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-035.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-height-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-036.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-height-036.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-001.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-001.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-002.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-002.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-003.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-003a.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003a.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003a-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-003b.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003b.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003b-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-003c.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003c.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003c-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-004.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-004.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-006.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-006.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-008.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-008.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-009.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-009.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-010.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-010.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-011.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-011.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-013.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-013.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-015.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-015.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-015-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-020.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-020.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-020-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-022.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-022.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-022-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-023.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-023.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-023-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-024.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-024.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-024-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-025.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-025.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-027.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-027.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-027-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-029.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-029.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-022-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-030.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-030.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-023-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-031.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-031.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-024-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-032.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-032.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-034.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-034.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-020-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-036.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-036.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-036-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-037.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-037.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-037-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-038.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-038.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-038-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-039.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-039.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-039-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-041.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-041.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-041-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-043.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-043.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-036-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-048.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-048.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-041-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-050.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-050.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-036-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-051.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-051.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-037-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-052.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-052.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-038-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-053.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-053.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-039-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-055.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-055.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-041-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-057.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-057.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-036-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-062.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-062.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-041-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-064.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-064.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-036-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-065.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-065.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-037-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-066.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-066.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-038-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-067.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-067.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-039-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-069.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-069.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-041-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-071.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-071.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-036-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-076.xht": [ + [ + "/css/CSS2/positioning/absolute-replaced-width-076.xht", + [ + [ + "/css/CSS2/positioning/absolute-replaced-width-041-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-001.xht": [ + [ + "/css/CSS2/positioning/abspos-001.xht", + [ + [ + "/css/CSS2/positioning/abspos-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-002.xht": [ + [ + "/css/CSS2/positioning/abspos-002.xht", + [ + [ + "/css/CSS2/positioning/abspos-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-007.xht": [ + [ + "/css/CSS2/positioning/abspos-007.xht", + [ + [ + "/css/CSS2/positioning/abspos-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-008.xht": [ + [ + "/css/CSS2/positioning/abspos-008.xht", + [ + [ + "/css/CSS2/positioning/abspos-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-009.xht": [ + [ + "/css/CSS2/positioning/abspos-009.xht", + [ + [ + "/css/CSS2/positioning/abspos-009-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-011.xht": [ + [ + "/css/CSS2/positioning/abspos-011.xht", + [ + [ + "/css/CSS2/positioning/abspos-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-012.xht": [ + [ + "/css/CSS2/positioning/abspos-012.xht", + [ + [ + "/css/CSS2/positioning/abspos-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-013.xht": [ + [ + "/css/CSS2/positioning/abspos-013.xht", + [ + [ + "/css/CSS2/positioning/abspos-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-014.xht": [ + [ + "/css/CSS2/positioning/abspos-014.xht", + [ + [ + "/css/CSS2/positioning/abspos-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-015.xht": [ + [ + "/css/CSS2/positioning/abspos-015.xht", + [ + [ + "/css/CSS2/positioning/abspos-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-016.xht": [ + [ + "/css/CSS2/positioning/abspos-016.xht", + [ + [ + "/css/CSS2/positioning/abspos-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-017.xht": [ + [ + "/css/CSS2/positioning/abspos-017.xht", + [ + [ + "/css/CSS2/positioning/abspos-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-018.xht": [ + [ + "/css/CSS2/positioning/abspos-018.xht", + [ + [ + "/css/CSS2/positioning/abspos-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-019.xht": [ + [ + "/css/CSS2/positioning/abspos-019.xht", + [ + [ + "/css/CSS2/positioning/abspos-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-020.xht": [ + [ + "/css/CSS2/positioning/abspos-020.xht", + [ + [ + "/css/CSS2/positioning/abspos-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-022.xht": [ + [ + "/css/CSS2/positioning/abspos-022.xht", + [ + [ + "/css/CSS2/positioning/abspos-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-024.xht": [ + [ + "/css/CSS2/positioning/abspos-024.xht", + [ + [ + "/css/CSS2/positioning/abspos-024-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-025.xht": [ + [ + "/css/CSS2/positioning/abspos-025.xht", + [ + [ + "/css/CSS2/positioning/abspos-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-026.xht": [ + [ + "/css/CSS2/positioning/abspos-026.xht", + [ + [ + "/css/CSS2/positioning/abspos-025-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-027.xht": [ + [ + "/css/CSS2/positioning/abspos-027.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-028.xht": [ + [ + "/css/CSS2/positioning/abspos-028.xht", + [ + [ + "/css/CSS2/positioning/abspos-028-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-containing-block-001.xht": [ + [ + "/css/CSS2/positioning/abspos-containing-block-001.xht", + [ + [ + "/css/CSS2/positioning/abspos-containing-block-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-containing-block-002.xht": [ + [ + "/css/CSS2/positioning/abspos-containing-block-002.xht", + [ + [ + "/css/CSS2/positioning/abspos-containing-block-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-containing-block-003.xht": [ + [ + "/css/CSS2/positioning/abspos-containing-block-003.xht", + [ + [ + "/css/CSS2/positioning/abspos-containing-block-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-containing-block-004.xht": [ + [ + "/css/CSS2/positioning/abspos-containing-block-004.xht", + [ + [ + "/css/CSS2/positioning/abspos-containing-block-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-containing-block-005.xht": [ + [ + "/css/CSS2/positioning/abspos-containing-block-005.xht", + [ + [ + "/css/CSS2/positioning/abspos-containing-block-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-containing-block-006.xht": [ + [ + "/css/CSS2/positioning/abspos-containing-block-006.xht", + [ + [ + "/css/CSS2/positioning/abspos-containing-block-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-containing-block-007.xht": [ + [ + "/css/CSS2/positioning/abspos-containing-block-007.xht", + [ + [ + "/css/CSS2/positioning/abspos-containing-block-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-containing-block-008.xht": [ + [ + "/css/CSS2/positioning/abspos-containing-block-008.xht", + [ + [ + "/css/CSS2/positioning/abspos-containing-block-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-containing-block-009.xht": [ + [ + "/css/CSS2/positioning/abspos-containing-block-009.xht", + [ + [ + "/css/CSS2/positioning/abspos-containing-block-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-containing-block-010.xht": [ + [ + "/css/CSS2/positioning/abspos-containing-block-010.xht", + [ + [ + "/css/CSS2/positioning/abspos-containing-block-010-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-001.xht": [ + [ + "/css/CSS2/positioning/abspos-overflow-001.xht", + [ + [ + "/css/CSS2/positioning/abspos-overflow-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-002.xht": [ + [ + "/css/CSS2/positioning/abspos-overflow-002.xht", + [ + [ + "/css/CSS2/positioning/abspos-overflow-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-003.xht": [ + [ + "/css/CSS2/positioning/abspos-overflow-003.xht", + [ + [ + "/css/CSS2/positioning/abspos-overflow-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-004.xht": [ + [ + "/css/CSS2/positioning/abspos-overflow-004.xht", + [ + [ + "/css/CSS2/positioning/abspos-overflow-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-005.xht": [ + [ + "/css/CSS2/positioning/abspos-overflow-005.xht", + [ + [ + "/css/CSS2/positioning/abspos-overflow-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-006.xht": [ + [ + "/css/CSS2/positioning/abspos-overflow-006.xht", + [ + [ + "/css/CSS2/positioning/abspos-overflow-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-007.xht": [ + [ + "/css/CSS2/positioning/abspos-overflow-007.xht", + [ + [ + "/css/CSS2/positioning/abspos-overflow-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-008.xht": [ + [ + "/css/CSS2/positioning/abspos-overflow-008.xht", + [ + [ + "/css/CSS2/positioning/abspos-overflow-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-009.xht": [ + [ + "/css/CSS2/positioning/abspos-overflow-009.xht", + [ + [ + "/css/CSS2/positioning/abspos-overflow-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-010.xht": [ + [ + "/css/CSS2/positioning/abspos-overflow-010.xht", + [ + [ + "/css/CSS2/positioning/abspos-overflow-010-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-011.xht": [ + [ + "/css/CSS2/positioning/abspos-overflow-011.xht", + [ + [ + "/css/CSS2/positioning/abspos-overflow-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-012.xht": [ + [ + "/css/CSS2/positioning/abspos-overflow-012.xht", + [ + [ + "/css/CSS2/positioning/abspos-overflow-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-width-001.xht": [ + [ + "/css/CSS2/positioning/abspos-width-001.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-width-002.xht": [ + [ + "/css/CSS2/positioning/abspos-width-002.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-width-003.xht": [ + [ + "/css/CSS2/positioning/abspos-width-003.xht", + [ + [ + "/css/CSS2/reference/ref-if-there-is-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-width-004.xht": [ + [ + "/css/CSS2/positioning/abspos-width-004.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/abspos-width-005.xht": [ + [ + "/css/CSS2/positioning/abspos-width-005.xht", + [ + [ + "/css/CSS2/positioning/abspos-width-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-004.xht": [ + [ + "/css/CSS2/positioning/bottom-004.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-005.xht": [ + [ + "/css/CSS2/positioning/bottom-005.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-006.xht": [ + [ + "/css/CSS2/positioning/bottom-006.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-007.xht": [ + [ + "/css/CSS2/positioning/bottom-007.xht", + [ + [ + "/css/CSS2/positioning/bottom-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-008.xht": [ + [ + "/css/CSS2/positioning/bottom-008.xht", + [ + [ + "/css/CSS2/positioning/bottom-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-016.xht": [ + [ + "/css/CSS2/positioning/bottom-016.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-017.xht": [ + [ + "/css/CSS2/positioning/bottom-017.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-018.xht": [ + [ + "/css/CSS2/positioning/bottom-018.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-019.xht": [ + [ + "/css/CSS2/positioning/bottom-019.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-020.xht": [ + [ + "/css/CSS2/positioning/bottom-020.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-028.xht": [ + [ + "/css/CSS2/positioning/bottom-028.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-029.xht": [ + [ + "/css/CSS2/positioning/bottom-029.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-030.xht": [ + [ + "/css/CSS2/positioning/bottom-030.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-031.xht": [ + [ + "/css/CSS2/positioning/bottom-031.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-032.xht": [ + [ + "/css/CSS2/positioning/bottom-032.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-040.xht": [ + [ + "/css/CSS2/positioning/bottom-040.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-041.xht": [ + [ + "/css/CSS2/positioning/bottom-041.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-042.xht": [ + [ + "/css/CSS2/positioning/bottom-042.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-043.xht": [ + [ + "/css/CSS2/positioning/bottom-043.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-044.xht": [ + [ + "/css/CSS2/positioning/bottom-044.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-052.xht": [ + [ + "/css/CSS2/positioning/bottom-052.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-053.xht": [ + [ + "/css/CSS2/positioning/bottom-053.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-054.xht": [ + [ + "/css/CSS2/positioning/bottom-054.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-055.xht": [ + [ + "/css/CSS2/positioning/bottom-055.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-056.xht": [ + [ + "/css/CSS2/positioning/bottom-056.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-064.xht": [ + [ + "/css/CSS2/positioning/bottom-064.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-065.xht": [ + [ + "/css/CSS2/positioning/bottom-065.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-066.xht": [ + [ + "/css/CSS2/positioning/bottom-066.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-067.xht": [ + [ + "/css/CSS2/positioning/bottom-067.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-068.xht": [ + [ + "/css/CSS2/positioning/bottom-068.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-076.xht": [ + [ + "/css/CSS2/positioning/bottom-076.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-077.xht": [ + [ + "/css/CSS2/positioning/bottom-077.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-078.xht": [ + [ + "/css/CSS2/positioning/bottom-078.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-079.xht": [ + [ + "/css/CSS2/positioning/bottom-079.xht", + [ + [ + "/css/CSS2/positioning/bottom-079-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-080.xht": [ + [ + "/css/CSS2/positioning/bottom-080.xht", + [ + [ + "/css/CSS2/positioning/bottom-079-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-088.xht": [ + [ + "/css/CSS2/positioning/bottom-088.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-089.xht": [ + [ + "/css/CSS2/positioning/bottom-089.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-090.xht": [ + [ + "/css/CSS2/positioning/bottom-090.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-091.xht": [ + [ + "/css/CSS2/positioning/bottom-091.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-092.xht": [ + [ + "/css/CSS2/positioning/bottom-092.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-100.xht": [ + [ + "/css/CSS2/positioning/bottom-100.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-101.xht": [ + [ + "/css/CSS2/positioning/bottom-101.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-102.xht": [ + [ + "/css/CSS2/positioning/bottom-102.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-103.xht": [ + [ + "/css/CSS2/positioning/bottom-103.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-104.xht": [ + [ + "/css/CSS2/positioning/bottom-104.xht", + [ + [ + "/css/CSS2/positioning/bottom-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-109.xht": [ + [ + "/css/CSS2/positioning/bottom-109.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-110.xht": [ + [ + "/css/CSS2/positioning/bottom-110.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-111.xht": [ + [ + "/css/CSS2/positioning/bottom-111.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-112.xht": [ + [ + "/css/CSS2/positioning/bottom-112.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-113.xht": [ + [ + "/css/CSS2/positioning/bottom-113.xht", + [ + [ + "/css/CSS2/positioning/bottom-113-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-001.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-001.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-002.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-002.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-003.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-003.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-004.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-004.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-005.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-005.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-006.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-006.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-007.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-007.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-009.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-009.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-012.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-012.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-013.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-013.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-014.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-014.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-015.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-015.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-offset-001.xht": [ + [ + "/css/CSS2/positioning/bottom-offset-001.xht", + [ + [ + "/css/CSS2/positioning/bottom-offset-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-offset-002.xht": [ + [ + "/css/CSS2/positioning/bottom-offset-002.xht", + [ + [ + "/css/CSS2/positioning/bottom-offset-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-offset-003.xht": [ + [ + "/css/CSS2/positioning/bottom-offset-003.xht", + [ + [ + "/css/CSS2/positioning/bottom-offset-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/bottom-offset-percentage-001.xht": [ + [ + "/css/CSS2/positioning/bottom-offset-percentage-001.xht", + [ + [ + "/css/CSS2/positioning/bottom-offset-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/dynamic-top-change-001.xht": [ + [ + "/css/CSS2/positioning/dynamic-top-change-001.xht", + [ + [ + "/css/CSS2/positioning/dynamic-top-change-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/dynamic-top-change-002.xht": [ + [ + "/css/CSS2/positioning/dynamic-top-change-002.xht", + [ + [ + "/css/CSS2/positioning/dynamic-top-change-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/dynamic-top-change-003.xht": [ + [ + "/css/CSS2/positioning/dynamic-top-change-003.xht", + [ + [ + "/css/CSS2/positioning/dynamic-top-change-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/dynamic-top-change-004.xht": [ + [ + "/css/CSS2/positioning/dynamic-top-change-004.xht", + [ + [ + "/css/CSS2/positioning/dynamic-top-change-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-004.xht": [ + [ + "/css/CSS2/positioning/left-004.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-005.xht": [ + [ + "/css/CSS2/positioning/left-005.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-006.xht": [ + [ + "/css/CSS2/positioning/left-006.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-007.xht": [ + [ + "/css/CSS2/positioning/left-007.xht", + [ + [ + "/css/CSS2/positioning/left-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-008.xht": [ + [ + "/css/CSS2/positioning/left-008.xht", + [ + [ + "/css/CSS2/positioning/left-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-016.xht": [ + [ + "/css/CSS2/positioning/left-016.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-017.xht": [ + [ + "/css/CSS2/positioning/left-017.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-018.xht": [ + [ + "/css/CSS2/positioning/left-018.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-019.xht": [ + [ + "/css/CSS2/positioning/left-019.xht", + [ + [ + "/css/CSS2/reference/ref-black-96px-square-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-020.xht": [ + [ + "/css/CSS2/positioning/left-020.xht", + [ + [ + "/css/CSS2/reference/ref-black-96px-square-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-028.xht": [ + [ + "/css/CSS2/positioning/left-028.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-029.xht": [ + [ + "/css/CSS2/positioning/left-029.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-030.xht": [ + [ + "/css/CSS2/positioning/left-030.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-031.xht": [ + [ + "/css/CSS2/positioning/left-031.xht", + [ + [ + "/css/CSS2/positioning/left-031-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-032.xht": [ + [ + "/css/CSS2/positioning/left-032.xht", + [ + [ + "/css/CSS2/positioning/left-031-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-040.xht": [ + [ + "/css/CSS2/positioning/left-040.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-041.xht": [ + [ + "/css/CSS2/positioning/left-041.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-042.xht": [ + [ + "/css/CSS2/positioning/left-042.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-043.xht": [ + [ + "/css/CSS2/positioning/left-043.xht", + [ + [ + "/css/CSS2/reference/ref-black-96px-square-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-044.xht": [ + [ + "/css/CSS2/positioning/left-044.xht", + [ + [ + "/css/CSS2/reference/ref-black-96px-square-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-052.xht": [ + [ + "/css/CSS2/positioning/left-052.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-053.xht": [ + [ + "/css/CSS2/positioning/left-053.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-054.xht": [ + [ + "/css/CSS2/positioning/left-054.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-055.xht": [ + [ + "/css/CSS2/positioning/left-055.xht", + [ + [ + "/css/CSS2/reference/ref-black-96px-square-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-056.xht": [ + [ + "/css/CSS2/positioning/left-056.xht", + [ + [ + "/css/CSS2/reference/ref-black-96px-square-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-064.xht": [ + [ + "/css/CSS2/positioning/left-064.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-065.xht": [ + [ + "/css/CSS2/positioning/left-065.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-066.xht": [ + [ + "/css/CSS2/positioning/left-066.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-067.xht": [ + [ + "/css/CSS2/positioning/left-067.xht", + [ + [ + "/css/CSS2/reference/ref-black-96px-square-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-068.xht": [ + [ + "/css/CSS2/positioning/left-068.xht", + [ + [ + "/css/CSS2/reference/ref-black-96px-square-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-076.xht": [ + [ + "/css/CSS2/positioning/left-076.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-077.xht": [ + [ + "/css/CSS2/positioning/left-077.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-078.xht": [ + [ + "/css/CSS2/positioning/left-078.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-079.xht": [ + [ + "/css/CSS2/positioning/left-079.xht", + [ + [ + "/css/CSS2/positioning/left-079-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-080.xht": [ + [ + "/css/CSS2/positioning/left-080.xht", + [ + [ + "/css/CSS2/positioning/left-079-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-088.xht": [ + [ + "/css/CSS2/positioning/left-088.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-089.xht": [ + [ + "/css/CSS2/positioning/left-089.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-090.xht": [ + [ + "/css/CSS2/positioning/left-090.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-091.xht": [ + [ + "/css/CSS2/positioning/left-091.xht", + [ + [ + "/css/CSS2/reference/ref-black-96px-square-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-092.xht": [ + [ + "/css/CSS2/positioning/left-092.xht", + [ + [ + "/css/CSS2/reference/ref-black-96px-square-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-100.xht": [ + [ + "/css/CSS2/positioning/left-100.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-101.xht": [ + [ + "/css/CSS2/positioning/left-101.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-102.xht": [ + [ + "/css/CSS2/positioning/left-102.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-103.xht": [ + [ + "/css/CSS2/positioning/left-103.xht", + [ + [ + "/css/CSS2/reference/ref-black-96px-square-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-104.xht": [ + [ + "/css/CSS2/positioning/left-104.xht", + [ + [ + "/css/CSS2/reference/ref-black-96px-square-no-red.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-109.xht": [ + [ + "/css/CSS2/positioning/left-109.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-110.xht": [ + [ + "/css/CSS2/positioning/left-110.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-111.xht": [ + [ + "/css/CSS2/positioning/left-111.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-112.xht": [ + [ + "/css/CSS2/positioning/left-112.xht", + [ + [ + "/css/CSS2/positioning/left-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-113.xht": [ + [ + "/css/CSS2/positioning/left-113.xht", + [ + [ + "/css/CSS2/positioning/left-113-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-applies-to-001.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-001.xht", + [ + [ + "/css/CSS2/positioning/left-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-applies-to-002.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-002.xht", + [ + [ + "/css/CSS2/positioning/left-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-applies-to-003.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-003.xht", + [ + [ + "/css/CSS2/positioning/left-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-applies-to-004.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-004.xht", + [ + [ + "/css/CSS2/positioning/left-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-applies-to-005.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-005.xht", + [ + [ + "/css/CSS2/positioning/left-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-applies-to-006.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-006.xht", + [ + [ + "/css/CSS2/positioning/left-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-applies-to-007.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-007.xht", + [ + [ + "/css/CSS2/positioning/left-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-applies-to-009.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-009.xht", + [ + [ + "/css/CSS2/positioning/left-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-applies-to-012.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-012.xht", + [ + [ + "/css/CSS2/positioning/left-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-applies-to-013.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-013.xht", + [ + [ + "/css/CSS2/positioning/left-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-applies-to-014.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-014.xht", + [ + [ + "/css/CSS2/positioning/left-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-applies-to-015.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-015.xht", + [ + [ + "/css/CSS2/positioning/left-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-offset-001.xht": [ + [ + "/css/CSS2/positioning/left-offset-001.xht", + [ + [ + "/css/CSS2/positioning/left-offset-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-offset-002.xht": [ + [ + "/css/CSS2/positioning/left-offset-002.xht", + [ + [ + "/css/CSS2/positioning/left-offset-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-offset-003.xht": [ + [ + "/css/CSS2/positioning/left-offset-003.xht", + [ + [ + "/css/CSS2/positioning/left-offset-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-offset-percentage-001.xht": [ + [ + "/css/CSS2/positioning/left-offset-percentage-001.xht", + [ + [ + "/css/CSS2/positioning/left-offset-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/left-offset-percentage-002.xht": [ + [ + "/css/CSS2/positioning/left-offset-percentage-002.xht", + [ + [ + "/css/CSS2/positioning/left-offset-percentage-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-006.xht": [ + [ + "/css/CSS2/positioning/position-006.xht", + [ + [ + "/css/CSS2/positioning/position-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-absolute-001.xht": [ + [ + "/css/CSS2/positioning/position-absolute-001.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-absolute-002.xht": [ + [ + "/css/CSS2/positioning/position-absolute-002.xht", + [ + [ + "/css/CSS2/positioning/position-absolute-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-absolute-003.xht": [ + [ + "/css/CSS2/positioning/position-absolute-003.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-absolute-004.xht": [ + [ + "/css/CSS2/positioning/position-absolute-004.xht", + [ + [ + "/css/CSS2/positioning/position-absolute-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-absolute-006.xht": [ + [ + "/css/CSS2/positioning/position-absolute-006.xht", + [ + [ + "/css/CSS2/positioning/position-absolute-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-absolute-007.xht": [ + [ + "/css/CSS2/positioning/position-absolute-007.xht", + [ + [ + "/css/CSS2/positioning/position-absolute-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-absolute-008.xht": [ + [ + "/css/CSS2/positioning/position-absolute-008.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-applies-to-001.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-001.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-applies-to-002.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-002.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-applies-to-003.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-003.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-applies-to-004.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-004.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-applies-to-005.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-005.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-applies-to-006.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-006.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-applies-to-007.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-007.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-applies-to-009.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-009.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-applies-to-012.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-012.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-applies-to-013.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-013.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-applies-to-014.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-014.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-applies-to-015.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-015.xht", + [ + [ + "/css/CSS2/positioning/bottom-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-fixed-001.xht": [ + [ + "/css/CSS2/positioning/position-fixed-001.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-fixed-007.xht": [ + [ + "/css/CSS2/positioning/position-fixed-007.xht", + [ + [ + "/css/CSS2/positioning/position-fixed-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-001.xht": [ + [ + "/css/CSS2/positioning/position-relative-001.xht", + [ + [ + "/css/CSS2/positioning/position-relative-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-003.xht": [ + [ + "/css/CSS2/positioning/position-relative-003.xht", + [ + [ + "/css/CSS2/positioning/position-relative-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-004.xht": [ + [ + "/css/CSS2/positioning/position-relative-004.xht", + [ + [ + "/css/CSS2/positioning/position-relative-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-005.xht": [ + [ + "/css/CSS2/positioning/position-relative-005.xht", + [ + [ + "/css/CSS2/positioning/position-relative-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-006.xht": [ + [ + "/css/CSS2/positioning/position-relative-006.xht", + [ + [ + "/css/CSS2/positioning/position-relative-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-007.xht": [ + [ + "/css/CSS2/positioning/position-relative-007.xht", + [ + [ + "/css/CSS2/positioning/position-relative-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-009.xht": [ + [ + "/css/CSS2/positioning/position-relative-009.xht", + [ + [ + "/css/CSS2/positioning/position-relative-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-010.xht": [ + [ + "/css/CSS2/positioning/position-relative-010.xht", + [ + [ + "/css/CSS2/positioning/position-relative-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-013.xht": [ + [ + "/css/CSS2/positioning/position-relative-013.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-014.xht": [ + [ + "/css/CSS2/positioning/position-relative-014.xht", + [ + [ + "/css/CSS2/positioning/position-relative-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-015.xht": [ + [ + "/css/CSS2/positioning/position-relative-015.xht", + [ + [ + "/css/CSS2/positioning/position-relative-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-016.xht": [ + [ + "/css/CSS2/positioning/position-relative-016.xht", + [ + [ + "/css/CSS2/positioning/position-relative-016-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-017.xht": [ + [ + "/css/CSS2/positioning/position-relative-017.xht", + [ + [ + "/css/CSS2/positioning/position-relative-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-018.xht": [ + [ + "/css/CSS2/positioning/position-relative-018.xht", + [ + [ + "/css/CSS2/positioning/position-relative-018-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-019.xht": [ + [ + "/css/CSS2/positioning/position-relative-019.xht", + [ + [ + "/css/CSS2/positioning/position-relative-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-027.xht": [ + [ + "/css/CSS2/positioning/position-relative-027.xht", + [ + [ + "/css/CSS2/positioning/position-relative-027-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-028.xht": [ + [ + "/css/CSS2/positioning/position-relative-028.xht", + [ + [ + "/css/CSS2/positioning/position-relative-028-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-029.xht": [ + [ + "/css/CSS2/positioning/position-relative-029.xht", + [ + [ + "/css/CSS2/positioning/position-relative-028-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-030.xht": [ + [ + "/css/CSS2/positioning/position-relative-030.xht", + [ + [ + "/css/CSS2/positioning/position-relative-030-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-031.xht": [ + [ + "/css/CSS2/positioning/position-relative-031.xht", + [ + [ + "/css/CSS2/positioning/position-relative-031-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-032.xht": [ + [ + "/css/CSS2/positioning/position-relative-032.xht", + [ + [ + "/css/CSS2/positioning/position-relative-032-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-033.xht": [ + [ + "/css/CSS2/positioning/position-relative-033.xht", + [ + [ + "/css/CSS2/positioning/position-relative-033-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-035.xht": [ + [ + "/css/CSS2/positioning/position-relative-035.xht", + [ + [ + "/css/CSS2/positioning/position-relative-035-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-037.xht": [ + [ + "/css/CSS2/positioning/position-relative-037.xht", + [ + [ + "/css/CSS2/positioning/position-relative-037-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-038.xht": [ + [ + "/css/CSS2/positioning/position-relative-038.xht", + [ + [ + "/css/CSS2/positioning/position-relative-038-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-relative-nested-001.xht": [ + [ + "/css/CSS2/positioning/position-relative-nested-001.xht", + [ + [ + "/css/CSS2/positioning/position-relative-nested-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/position-static-001.xht": [ + [ + "/css/CSS2/positioning/position-static-001.xht", + [ + [ + "/css/CSS2/positioning/position-static-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/positioning-float-001.xht": [ + [ + "/css/CSS2/positioning/positioning-float-001.xht", + [ + [ + "/css/CSS2/positioning/positioning-float-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/positioning-float-002.xht": [ + [ + "/css/CSS2/positioning/positioning-float-002.xht", + [ + [ + "/css/CSS2/positioning/positioning-float-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/relpos-calcs-001.xht": [ + [ + "/css/CSS2/positioning/relpos-calcs-001.xht", + [ + [ + "/css/CSS2/positioning/relpos-calcs-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/relpos-calcs-002.xht": [ + [ + "/css/CSS2/positioning/relpos-calcs-002.xht", + [ + [ + "/css/CSS2/positioning/relpos-calcs-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/relpos-calcs-003.xht": [ + [ + "/css/CSS2/positioning/relpos-calcs-003.xht", + [ + [ + "/css/CSS2/positioning/relpos-calcs-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/relpos-calcs-004.xht": [ + [ + "/css/CSS2/positioning/relpos-calcs-004.xht", + [ + [ + "/css/CSS2/positioning/relpos-calcs-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/relpos-calcs-005.xht": [ + [ + "/css/CSS2/positioning/relpos-calcs-005.xht", + [ + [ + "/css/CSS2/positioning/relpos-calcs-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/relpos-calcs-006.xht": [ + [ + "/css/CSS2/positioning/relpos-calcs-006.xht", + [ + [ + "/css/CSS2/positioning/relpos-calcs-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/relpos-calcs-007.xht": [ + [ + "/css/CSS2/positioning/relpos-calcs-007.xht", + [ + [ + "/css/CSS2/positioning/relpos-calcs-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-004.xht": [ + [ + "/css/CSS2/positioning/right-004.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-005.xht": [ + [ + "/css/CSS2/positioning/right-005.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-006.xht": [ + [ + "/css/CSS2/positioning/right-006.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-007.xht": [ + [ + "/css/CSS2/positioning/right-007.xht", + [ + [ + "/css/CSS2/positioning/right-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-008.xht": [ + [ + "/css/CSS2/positioning/right-008.xht", + [ + [ + "/css/CSS2/positioning/right-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-016.xht": [ + [ + "/css/CSS2/positioning/right-016.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-017.xht": [ + [ + "/css/CSS2/positioning/right-017.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-018.xht": [ + [ + "/css/CSS2/positioning/right-018.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-019.xht": [ + [ + "/css/CSS2/positioning/right-019.xht", + [ + [ + "/css/CSS2/positioning/right-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-020.xht": [ + [ + "/css/CSS2/positioning/right-020.xht", + [ + [ + "/css/CSS2/positioning/right-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-028.xht": [ + [ + "/css/CSS2/positioning/right-028.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-029.xht": [ + [ + "/css/CSS2/positioning/right-029.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-030.xht": [ + [ + "/css/CSS2/positioning/right-030.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-031.xht": [ + [ + "/css/CSS2/positioning/right-031.xht", + [ + [ + "/css/CSS2/positioning/right-031-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-032.xht": [ + [ + "/css/CSS2/positioning/right-032.xht", + [ + [ + "/css/CSS2/positioning/right-031-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-040.xht": [ + [ + "/css/CSS2/positioning/right-040.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-041.xht": [ + [ + "/css/CSS2/positioning/right-041.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-042.xht": [ + [ + "/css/CSS2/positioning/right-042.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-043.xht": [ + [ + "/css/CSS2/positioning/right-043.xht", + [ + [ + "/css/CSS2/positioning/right-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-044.xht": [ + [ + "/css/CSS2/positioning/right-044.xht", + [ + [ + "/css/CSS2/positioning/right-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-052.xht": [ + [ + "/css/CSS2/positioning/right-052.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-053.xht": [ + [ + "/css/CSS2/positioning/right-053.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-054.xht": [ + [ + "/css/CSS2/positioning/right-054.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-055.xht": [ + [ + "/css/CSS2/positioning/right-055.xht", + [ + [ + "/css/CSS2/positioning/right-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-056.xht": [ + [ + "/css/CSS2/positioning/right-056.xht", + [ + [ + "/css/CSS2/positioning/right-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-064.xht": [ + [ + "/css/CSS2/positioning/right-064.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-065.xht": [ + [ + "/css/CSS2/positioning/right-065.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-066.xht": [ + [ + "/css/CSS2/positioning/right-066.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-067.xht": [ + [ + "/css/CSS2/positioning/right-067.xht", + [ + [ + "/css/CSS2/positioning/right-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-068.xht": [ + [ + "/css/CSS2/positioning/right-068.xht", + [ + [ + "/css/CSS2/positioning/right-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-076.xht": [ + [ + "/css/CSS2/positioning/right-076.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-077.xht": [ + [ + "/css/CSS2/positioning/right-077.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-078.xht": [ + [ + "/css/CSS2/positioning/right-078.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-079.xht": [ + [ + "/css/CSS2/positioning/right-079.xht", + [ + [ + "/css/CSS2/positioning/right-079-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-080.xht": [ + [ + "/css/CSS2/positioning/right-080.xht", + [ + [ + "/css/CSS2/positioning/right-079-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-088.xht": [ + [ + "/css/CSS2/positioning/right-088.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-089.xht": [ + [ + "/css/CSS2/positioning/right-089.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-090.xht": [ + [ + "/css/CSS2/positioning/right-090.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-091.xht": [ + [ + "/css/CSS2/positioning/right-091.xht", + [ + [ + "/css/CSS2/positioning/right-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-092.xht": [ + [ + "/css/CSS2/positioning/right-092.xht", + [ + [ + "/css/CSS2/positioning/right-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-100.xht": [ + [ + "/css/CSS2/positioning/right-100.xht", + [ + [ + "/css/CSS2/positioning/right-100-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-101.xht": [ + [ + "/css/CSS2/positioning/right-101.xht", + [ + [ + "/css/CSS2/positioning/right-100-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-102.xht": [ + [ + "/css/CSS2/positioning/right-102.xht", + [ + [ + "/css/CSS2/positioning/right-100-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-103.xht": [ + [ + "/css/CSS2/positioning/right-103.xht", + [ + [ + "/css/CSS2/positioning/right-103-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-104.xht": [ + [ + "/css/CSS2/positioning/right-104.xht", + [ + [ + "/css/CSS2/positioning/right-103-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-109.xht": [ + [ + "/css/CSS2/positioning/right-109.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-110.xht": [ + [ + "/css/CSS2/positioning/right-110.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-111.xht": [ + [ + "/css/CSS2/positioning/right-111.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-112.xht": [ + [ + "/css/CSS2/positioning/right-112.xht", + [ + [ + "/css/CSS2/positioning/right-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-113.xht": [ + [ + "/css/CSS2/positioning/right-113.xht", + [ + [ + "/css/CSS2/positioning/right-103-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-applies-to-001.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-001.xht", + [ + [ + "/css/CSS2/positioning/right-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-applies-to-002.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-002.xht", + [ + [ + "/css/CSS2/positioning/right-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-applies-to-003.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-003.xht", + [ + [ + "/css/CSS2/positioning/right-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-applies-to-004.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-004.xht", + [ + [ + "/css/CSS2/positioning/right-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-applies-to-005.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-005.xht", + [ + [ + "/css/CSS2/positioning/right-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-applies-to-006.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-006.xht", + [ + [ + "/css/CSS2/positioning/right-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-applies-to-007.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-007.xht", + [ + [ + "/css/CSS2/positioning/right-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-applies-to-009.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-009.xht", + [ + [ + "/css/CSS2/positioning/right-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-applies-to-012.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-012.xht", + [ + [ + "/css/CSS2/positioning/right-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-applies-to-013.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-013.xht", + [ + [ + "/css/CSS2/positioning/right-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-applies-to-014.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-014.xht", + [ + [ + "/css/CSS2/positioning/right-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-applies-to-015.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-015.xht", + [ + [ + "/css/CSS2/positioning/right-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-offset-001.xht": [ + [ + "/css/CSS2/positioning/right-offset-001.xht", + [ + [ + "/css/CSS2/positioning/right-offset-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-offset-002.xht": [ + [ + "/css/CSS2/positioning/right-offset-002.xht", + [ + [ + "/css/CSS2/positioning/left-offset-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-offset-003.xht": [ + [ + "/css/CSS2/positioning/right-offset-003.xht", + [ + [ + "/css/CSS2/positioning/right-offset-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-offset-004.xht": [ + [ + "/css/CSS2/positioning/right-offset-004.xht", + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/right-offset-percentage-001.xht": [ + [ + "/css/CSS2/positioning/right-offset-percentage-001.xht", + [ + [ + "/css/CSS2/positioning/right-offset-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-004.xht": [ + [ + "/css/CSS2/positioning/top-004.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-005.xht": [ + [ + "/css/CSS2/positioning/top-005.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-006.xht": [ + [ + "/css/CSS2/positioning/top-006.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-007.xht": [ + [ + "/css/CSS2/positioning/top-007.xht", + [ + [ + "/css/CSS2/positioning/top-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-008.xht": [ + [ + "/css/CSS2/positioning/top-008.xht", + [ + [ + "/css/CSS2/positioning/top-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-016.xht": [ + [ + "/css/CSS2/positioning/top-016.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-017.xht": [ + [ + "/css/CSS2/positioning/top-017.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-018.xht": [ + [ + "/css/CSS2/positioning/top-018.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-019.xht": [ + [ + "/css/CSS2/positioning/top-019.xht", + [ + [ + "/css/CSS2/positioning/top-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-020.xht": [ + [ + "/css/CSS2/positioning/top-020.xht", + [ + [ + "/css/CSS2/positioning/top-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-028.xht": [ + [ + "/css/CSS2/positioning/top-028.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-029.xht": [ + [ + "/css/CSS2/positioning/top-029.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-030.xht": [ + [ + "/css/CSS2/positioning/top-030.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-031.xht": [ + [ + "/css/CSS2/positioning/top-031.xht", + [ + [ + "/css/CSS2/positioning/top-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-032.xht": [ + [ + "/css/CSS2/positioning/top-032.xht", + [ + [ + "/css/CSS2/positioning/top-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-040.xht": [ + [ + "/css/CSS2/positioning/top-040.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-041.xht": [ + [ + "/css/CSS2/positioning/top-041.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-042.xht": [ + [ + "/css/CSS2/positioning/top-042.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-043.xht": [ + [ + "/css/CSS2/positioning/top-043.xht", + [ + [ + "/css/CSS2/positioning/top-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-044.xht": [ + [ + "/css/CSS2/positioning/top-044.xht", + [ + [ + "/css/CSS2/positioning/top-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-052.xht": [ + [ + "/css/CSS2/positioning/top-052.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-053.xht": [ + [ + "/css/CSS2/positioning/top-053.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-054.xht": [ + [ + "/css/CSS2/positioning/top-054.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-055.xht": [ + [ + "/css/CSS2/positioning/top-055.xht", + [ + [ + "/css/CSS2/positioning/top-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-056.xht": [ + [ + "/css/CSS2/positioning/top-056.xht", + [ + [ + "/css/CSS2/positioning/top-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-064.xht": [ + [ + "/css/CSS2/positioning/top-064.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-065.xht": [ + [ + "/css/CSS2/positioning/top-065.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-066.xht": [ + [ + "/css/CSS2/positioning/top-066.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-067.xht": [ + [ + "/css/CSS2/positioning/top-067.xht", + [ + [ + "/css/CSS2/positioning/top-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-068.xht": [ + [ + "/css/CSS2/positioning/top-068.xht", + [ + [ + "/css/CSS2/positioning/top-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-076.xht": [ + [ + "/css/CSS2/positioning/top-076.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-077.xht": [ + [ + "/css/CSS2/positioning/top-077.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-078.xht": [ + [ + "/css/CSS2/positioning/top-078.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-079.xht": [ + [ + "/css/CSS2/positioning/top-079.xht", + [ + [ + "/css/CSS2/positioning/top-079-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-080.xht": [ + [ + "/css/CSS2/positioning/top-080.xht", + [ + [ + "/css/CSS2/positioning/top-079-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-088.xht": [ + [ + "/css/CSS2/positioning/top-088.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-089.xht": [ + [ + "/css/CSS2/positioning/top-089.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-090.xht": [ + [ + "/css/CSS2/positioning/top-090.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-091.xht": [ + [ + "/css/CSS2/positioning/top-091.xht", + [ + [ + "/css/CSS2/positioning/top-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-092.xht": [ + [ + "/css/CSS2/positioning/top-092.xht", + [ + [ + "/css/CSS2/positioning/top-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-100.xht": [ + [ + "/css/CSS2/positioning/top-100.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-101.xht": [ + [ + "/css/CSS2/positioning/top-101.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-102.xht": [ + [ + "/css/CSS2/positioning/top-102.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-103.xht": [ + [ + "/css/CSS2/positioning/top-103.xht", + [ + [ + "/css/CSS2/positioning/top-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-104.xht": [ + [ + "/css/CSS2/positioning/top-104.xht", + [ + [ + "/css/CSS2/positioning/top-019-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-109.xht": [ + [ + "/css/CSS2/positioning/top-109.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-110.xht": [ + [ + "/css/CSS2/positioning/top-110.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-111.xht": [ + [ + "/css/CSS2/positioning/top-111.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-112.xht": [ + [ + "/css/CSS2/positioning/top-112.xht", + [ + [ + "/css/CSS2/reference/ref-no-vert-space-between.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-113.xht": [ + [ + "/css/CSS2/positioning/top-113.xht", + [ + [ + "/css/CSS2/positioning/top-113-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-applies-to-001.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-001.xht", + [ + [ + "/css/CSS2/positioning/top-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-applies-to-002.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-002.xht", + [ + [ + "/css/CSS2/positioning/top-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-applies-to-003.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-003.xht", + [ + [ + "/css/CSS2/positioning/top-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-applies-to-004.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-004.xht", + [ + [ + "/css/CSS2/positioning/top-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-applies-to-005.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-005.xht", + [ + [ + "/css/CSS2/positioning/top-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-applies-to-006.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-006.xht", + [ + [ + "/css/CSS2/positioning/top-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-applies-to-007.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-007.xht", + [ + [ + "/css/CSS2/positioning/top-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-applies-to-009.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-009.xht", + [ + [ + "/css/CSS2/positioning/top-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-applies-to-012.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-012.xht", + [ + [ + "/css/CSS2/positioning/top-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-applies-to-013.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-013.xht", + [ + [ + "/css/CSS2/positioning/top-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-applies-to-014.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-014.xht", + [ + [ + "/css/CSS2/positioning/top-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-applies-to-015.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-015.xht", + [ + [ + "/css/CSS2/positioning/top-applies-to-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-offset-001.xht": [ + [ + "/css/CSS2/positioning/top-offset-001.xht", + [ + [ + "/css/CSS2/positioning/bottom-offset-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-offset-002.xht": [ + [ + "/css/CSS2/positioning/top-offset-002.xht", + [ + [ + "/css/CSS2/positioning/bottom-offset-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-offset-003.xht": [ + [ + "/css/CSS2/positioning/top-offset-003.xht", + [ + [ + "/css/CSS2/positioning/top-offset-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-offset-percentage-001.xht": [ + [ + "/css/CSS2/positioning/top-offset-percentage-001.xht", + [ + [ + "/css/CSS2/positioning/top-offset-percentage-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/positioning/top-offset-percentage-002.xht": [ + [ + "/css/CSS2/positioning/top-offset-percentage-002.xht", + [ + [ + "/css/CSS2/positioning/left-offset-percentage-002-ref.xht", + "==" + ] + ], + {} + ] + ], "css/css-align-3/distribution-values/space-evenly-001.html": [ [ "/css/css-align-3/distribution-values/space-evenly-001.html", @@ -37687,6 +54523,510 @@ {} ] ], + "css/CSS2/normal-flow/block-in-inline-append-002-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-append-002-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-append-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-append-002-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-append-002-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-append-002-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-001-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-002-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-002-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-002-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-003-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-003-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-003-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-003-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-003-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-004-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-004-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-004-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-004-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-004-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-006-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-006-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-006-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-006-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-006-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-007-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-007-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-007-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-007-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-007-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-007-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-008-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-008-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-008-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-008-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-008-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-008-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-009-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-009-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-009-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-009-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-009-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-009-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-010-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-010-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-010-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-010-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-010-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-010-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-011-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-011-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-011-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-011-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-011-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-011-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-012-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-012-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-012-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-012-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-012-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-012-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-013-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-013-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-013-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-013-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-013-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-013-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-014-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-014-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-014-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-014-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-014-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-014-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-015-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-015-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-015-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-015-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-015-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-015-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-016-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-016-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-016-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-016-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-016-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-insert-016-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-001-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-001-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-001-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-001-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-001-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-001-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-003-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-003-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-003-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-003-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-003-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-003-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-004-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-004-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-004-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-004-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-004-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-004-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-005-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-005-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-005-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-005-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-005-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-005-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-006-nosplit-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-006-nosplit-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-006-ref.xht", + "==" + ] + ], + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-006-ref.xht": [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-006-ref.xht", + [ + [ + "/css/CSS2/normal-flow/block-in-inline-remove-006-nosplit-ref.xht", + "==" + ] + ], + {} + ] + ], "html/dom/elements/global-attributes/dir_auto-N-EN-ref.html": [ [ "/html/dom/elements/global-attributes/dir_auto-N-EN-ref.html", @@ -40680,6 +58020,806 @@ {} ] ], + "css/CSS2/floats-clear/adjacent-floats-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-000-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-008-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-applies-to-009-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-clearance-calculation-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-clearance-calculation-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-clearance-calculation-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-clearance-calculation-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-clearance-calculation-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-float-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-float-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-float-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-float-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-float-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-float-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-float-009-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clear-inline-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/clearance-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-008-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-height-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-height-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-height-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-height-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-height-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-height-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-height-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-007-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-008-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-009-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/float-replaced-width-011-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-007-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-009-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-014-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-019-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-022-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-023-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-024-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-025-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-026-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-027-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-028-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-029-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-030-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-031-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-036-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-038-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-041-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-043-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-101-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-111-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-112-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-113-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-114-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-115-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-116-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-118-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-119-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-121-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-122-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-123-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-124-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-125-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-132-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-133-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-135-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-136-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-138-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-139-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-141-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-142-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-143-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-144-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-145-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-146-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-147-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-149-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-150-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-153-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-154-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/floats-bfc-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-024-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-031-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-121-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-123-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-125-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-134-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-135-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-142-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-157-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-158-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-165-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-012-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-014-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-015-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-016-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-017-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/1x1-green.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/1x1-lime.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/1x1-maroon.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/1x1-navy.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/1x1-red.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/1x1-white.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/60x60-gg-rr.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/60x60-green.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/60x60-red.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/a-green.css": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/b-green.css": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/black15x15.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/blue15x15.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/c-red.css": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/cat.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/clear-clearance-calculation-001.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/clear-clearance-calculation-002.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/clear-clearance-calculation-003.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/diamond.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/floats-005.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/green-rectangle-50wideBy10tall.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/green15x15.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/margin-collapse-2em-space.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/margin-collapse-4em-space.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/pattern-grg-rgr-grg.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/pattern-grg-rrg-rgg.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/pattern-rgr-grg-rgr.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/pattern-tr.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/ring.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/ruler-v-100px-200px-300px.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/square-purple.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/square-teal.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/square-white.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/swatch-blue.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/swatch-green.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/swatch-lime.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/swatch-orange.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/swatch-purple.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/swatch-red.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/swatch-white.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/swatch-yellow.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/test-bl.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/test-br.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/test-outer.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/test-tl.png": [ + [ + {} + ] + ], + "css/CSS2/floats-clear/support/test-tr.png": [ + [ + {} + ] + ], "css/CSS2/floats/floats-placement-vertical-001-ref.xht": [ [ {} @@ -41155,6 +59295,1811 @@ {} ] ], + "css/CSS2/normal-flow/block-formatting-context-height-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-008-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-011-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-015-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-append-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-empty-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-empty-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-empty-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-empty-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-float-between-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-insert-017-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-margins-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-margins-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-nested-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-nested-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-percents-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-000-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-remove-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-in-inline-whitespace-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-009-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-width-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-width-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-width-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-width-007-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-height-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-height-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-height-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-height-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-height-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-width-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-width-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/blocks-011-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/blocks-013-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/blocks-014-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/blocks-018-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/blocks-019-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/blocks-020-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/blocks-025-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/blocks-026-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-025-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-058-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-061-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-067-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-069-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-072-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-080-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-111-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-112-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-113-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-114-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-percentage-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/height-percentage-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-000-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-height-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-height-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-height-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-width-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-width-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-width-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-width-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-valign-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-valign-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-width-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-width-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-zorder-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-zorder-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-block-zorder-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-non-replaced-height-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-non-replaced-width-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-011-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-012-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-014-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-table-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-table-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-table-height-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-table-height-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-table-valign-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-table-width-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-table-width-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-table-zorder-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-table-zorder-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inline-table-zorder-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inlines-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inlines-013-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inlines-016-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inlines-017-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/inlines-020-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-height-025-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-height-036-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-height-047-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-height-058-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-height-069-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-height-107-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-height-110-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-height-percentage-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-height-percentage-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-width-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-width-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-width-025-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-width-036-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-width-047-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-width-061-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-width-069-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-width-072-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-width-105-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-width-107-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/max-width-percentage-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/min-height-067-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/min-height-111-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/min-height-percentage-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/replaced-intrinsic-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/replaced-intrinsic-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/replaced-intrinsic-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/replaced-intrinsic-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/root-box-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/1x1-gray.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/1x1-green.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/1x1-red.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/1x1-white.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/60x60-green.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/black96x96.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/blue15x15.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/blue96x96.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/cat.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/diamond.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/green-rectangle-50wideBy10tall.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/green15x15.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/green200x200.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/intrinsic-ratio.svg": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/margin-collapse-2em-space.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/pattern-grg-rgr-grg.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/pattern-rgr-grg-rgr.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-intrinsic-001.svg": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-intrinsic-002.svg": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-intrinsic-003.svg": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-intrinsic-004.svg": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-intrinsic-005.svg": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-1.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-10.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-11.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-12.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-13.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-14.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-15.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-16.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-17.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-18.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-19.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-2.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-3.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-4.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-5.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-6.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-7.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-8.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max-9.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/replaced-min-max.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/ring.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/swatch-aqua.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/swatch-blue.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/swatch-green.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/swatch-orange.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/swatch-red.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/swatch-teal.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/test-bl.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/test-br.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/test-tl.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/support/test-tr.png": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/table-in-inline-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/width-103-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/normal-flow/width-non-replaced-inline-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-007-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-008-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-009-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-007-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-008-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-009-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-008-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-015-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-021-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-025-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-026-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-007-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-008-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-010-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-011-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-012-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-013-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-height-014-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-003a-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-003b-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-003c-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-015-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-020-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-022-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-023-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-024-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-025-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-027-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-036-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-037-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-038-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-039-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/absolute-replaced-width-041-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-007-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-008-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-009-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-011-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-013-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-024-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-025-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-028-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-containing-block-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-containing-block-010-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-010-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-overflow-011-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/abspos-width-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/bottom-007-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/bottom-019-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/bottom-079-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/bottom-113-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/bottom-offset-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/bottom-offset-percentage-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/dynamic-top-change-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/dynamic-top-change-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/left-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/left-007-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/left-031-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/left-079-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/left-113-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/left-applies-to-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/left-offset-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/left-offset-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/left-offset-percentage-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/left-offset-percentage-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-006-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-absolute-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-absolute-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-absolute-007-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-fixed-007-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-005-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-014-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-016-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-018-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-027-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-028-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-030-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-031-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-032-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-033-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-035-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-037-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-038-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-relative-nested-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/position-static-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/positioning-float-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/positioning-float-002-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/relpos-calcs-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/right-004-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/right-007-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/right-019-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/right-031-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/right-079-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/right-100-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/right-103-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/right-applies-to-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/right-offset-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/right-offset-percentage-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/100x100-lime.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/100x100-red.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/1x1-green.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/1x1-lime.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/1x1-maroon.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/1x1-navy.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/1x1-red.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/1x1-white.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/60x60-gg-rr.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/60x60-green.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/60x60-red.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/a-green.css": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/b-green.css": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/black15x15.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/blue15x15.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/blue96x96.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/c-red.css": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/cat.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/diamond.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/green-rectangle-50wideBy10tall.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/green15x15.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/green_box.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/pattern-grg-rrg-rgg.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/pattern-tr.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/red_box.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/ring.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/square-purple.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/square-teal.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/square-white.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/swatch-blue.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/swatch-green.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/swatch-lime.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/swatch-orange.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/swatch-red.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/swatch-white.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/swatch-yellow.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/test-bl.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/test-br.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/test-outer.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/test-tl.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/support/test-tr.png": [ + [ + {} + ] + ], + "css/CSS2/positioning/top-007-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/top-019-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/top-079-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/top-113-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/top-applies-to-001-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/top-offset-003-ref.xht": [ + [ + {} + ] + ], + "css/CSS2/positioning/top-offset-percentage-001-ref.xht": [ + [ + {} + ] + ], "css/CSS2/reference/60x60-green.html": [ [ {} @@ -62030,6 +81975,16 @@ {} ] ], + "html/rendering/non-replaced-elements/the-page/support/body-marginwidth-marginheight.html": [ + [ + {} + ] + ], + "html/rendering/non-replaced-elements/the-page/support/body-topmargin-leftmargin.html": [ + [ + {} + ] + ], "html/rendering/non-replaced-elements/the-page/test-body.xhtml": [ [ {} @@ -89717,6 +109672,18 @@ {} ] ], + "html/rendering/non-replaced-elements/the-page/iframe-body-margin-attributes.html": [ + [ + "/html/rendering/non-replaced-elements/the-page/iframe-body-margin-attributes.html", + {} + ] + ], + "html/rendering/non-replaced-elements/the-page/iframe-marginwidth-marginheight.html": [ + [ + "/html/rendering/non-replaced-elements/the-page/iframe-marginwidth-marginheight.html", + {} + ] + ], "html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-auto.html": [ [ "/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-img-auto.html", @@ -110607,6 +130574,132 @@ ] }, "visual": { + "css/CSS2/floats-clear/clear-applies-to-010.xht": [ + [ + "/css/CSS2/floats-clear/clear-applies-to-010.xht", + {} + ] + ], + "css/CSS2/floats-clear/float-001.xht": [ + [ + "/css/CSS2/floats-clear/float-001.xht", + {} + ] + ], + "css/CSS2/floats-clear/float-002.xht": [ + [ + "/css/CSS2/floats-clear/float-002.xht", + {} + ] + ], + "css/CSS2/floats-clear/float-004.xht": [ + [ + "/css/CSS2/floats-clear/float-004.xht", + {} + ] + ], + "css/CSS2/floats-clear/float-applies-to-010.xht": [ + [ + "/css/CSS2/floats-clear/float-applies-to-010.xht", + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-006.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-006.xht", + {} + ] + ], + "css/CSS2/floats-clear/float-non-replaced-width-013.xht": [ + [ + "/css/CSS2/floats-clear/float-non-replaced-width-013.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-016.xht": [ + [ + "/css/CSS2/floats-clear/floats-016.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-020.xht": [ + [ + "/css/CSS2/floats-clear/floats-020.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-021.xht": [ + [ + "/css/CSS2/floats-clear/floats-021.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-037.xht": [ + [ + "/css/CSS2/floats-clear/floats-037.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-102.xht": [ + [ + "/css/CSS2/floats-clear/floats-102.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-103.xht": [ + [ + "/css/CSS2/floats-clear/floats-103.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-104.xht": [ + [ + "/css/CSS2/floats-clear/floats-104.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-105.xht": [ + [ + "/css/CSS2/floats-clear/floats-105.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-106.xht": [ + [ + "/css/CSS2/floats-clear/floats-106.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-140.xht": [ + [ + "/css/CSS2/floats-clear/floats-140.xht", + {} + ] + ], + "css/CSS2/floats-clear/floats-151.xht": [ + [ + "/css/CSS2/floats-clear/floats-151.xht", + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-164.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-164.xht", + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-005.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-005.xht", + {} + ] + ], + "css/CSS2/floats-clear/margin-collapse-clear-011.xht": [ + [ + "/css/CSS2/floats-clear/margin-collapse-clear-011.xht", + {} + ] + ], "css/CSS2/linebox/inline-formatting-context-010.xht": [ [ "/css/CSS2/linebox/inline-formatting-context-010.xht", @@ -110907,6 +131000,666 @@ {} ] ], + "css/CSS2/normal-flow/block-formatting-contexts-013.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-013.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-formatting-contexts-014.xht": [ + [ + "/css/CSS2/normal-flow/block-formatting-contexts-014.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-002.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-002.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-003.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-003.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-004.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-004.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-006.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-006.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-007.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-007.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-008.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-008.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-009.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-009.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-010.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-010.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-012.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-012.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-014.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-014.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-015.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-015.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-height-016.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-height-016.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-width-002.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-002.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-non-replaced-width-008.xht": [ + [ + "/css/CSS2/normal-flow/block-non-replaced-width-008.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-height-003.xht": [ + [ + "/css/CSS2/normal-flow/block-replaced-height-003.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-width-001.xht": [ + [ + "/css/CSS2/normal-flow/block-replaced-width-001.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-width-003.xht": [ + [ + "/css/CSS2/normal-flow/block-replaced-width-003.xht", + {} + ] + ], + "css/CSS2/normal-flow/block-replaced-width-004.xht": [ + [ + "/css/CSS2/normal-flow/block-replaced-width-004.xht", + {} + ] + ], + "css/CSS2/normal-flow/blocks-027.xht": [ + [ + "/css/CSS2/normal-flow/blocks-027.xht", + {} + ] + ], + "css/CSS2/normal-flow/blocks-028.xht": [ + [ + "/css/CSS2/normal-flow/blocks-028.xht", + {} + ] + ], + "css/CSS2/normal-flow/height-014.xht": [ + [ + "/css/CSS2/normal-flow/height-014.xht", + {} + ] + ], + "css/CSS2/normal-flow/height-036.xht": [ + [ + "/css/CSS2/normal-flow/height-036.xht", + {} + ] + ], + "css/CSS2/normal-flow/height-047.xht": [ + [ + "/css/CSS2/normal-flow/height-047.xht", + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-001.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-001.xht", + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-002.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-002.xht", + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-003.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-003.xht", + {} + ] + ], + "css/CSS2/normal-flow/height-applies-to-010.xht": [ + [ + "/css/CSS2/normal-flow/height-applies-to-010.xht", + {} + ] + ], + "css/CSS2/normal-flow/inline-block-001.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-001.xht", + {} + ] + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-005.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-non-replaced-width-005.xht", + {} + ] + ], + "css/CSS2/normal-flow/inline-block-replaced-width-004.xht": [ + [ + "/css/CSS2/normal-flow/inline-block-replaced-width-004.xht", + {} + ] + ], + "css/CSS2/normal-flow/inline-replaced-width-004.xht": [ + [ + "/css/CSS2/normal-flow/inline-replaced-width-004.xht", + {} + ] + ], + "css/CSS2/normal-flow/inlines-001.xht": [ + [ + "/css/CSS2/normal-flow/inlines-001.xht", + {} + ] + ], + "css/CSS2/normal-flow/inlines-007.xht": [ + [ + "/css/CSS2/normal-flow/inlines-007.xht", + {} + ] + ], + "css/CSS2/normal-flow/inlines-009.xht": [ + [ + "/css/CSS2/normal-flow/inlines-009.xht", + {} + ] + ], + "css/CSS2/normal-flow/inlines-010.xht": [ + [ + "/css/CSS2/normal-flow/inlines-010.xht", + {} + ] + ], + "css/CSS2/normal-flow/inlines-011.xht": [ + [ + "/css/CSS2/normal-flow/inlines-011.xht", + {} + ] + ], + "css/CSS2/normal-flow/inlines-012.xht": [ + [ + "/css/CSS2/normal-flow/inlines-012.xht", + {} + ] + ], + "css/CSS2/normal-flow/inlines-014.xht": [ + [ + "/css/CSS2/normal-flow/inlines-014.xht", + {} + ] + ], + "css/CSS2/normal-flow/inlines-015.xht": [ + [ + "/css/CSS2/normal-flow/inlines-015.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-height-014.xht": [ + [ + "/css/CSS2/normal-flow/max-height-014.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-height-105.xht": [ + [ + "/css/CSS2/normal-flow/max-height-105.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-height-106.xht": [ + [ + "/css/CSS2/normal-flow/max-height-106.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-height-108.xht": [ + [ + "/css/CSS2/normal-flow/max-height-108.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-height-109.xht": [ + [ + "/css/CSS2/normal-flow/max-height-109.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-height-111.xht": [ + [ + "/css/CSS2/normal-flow/max-height-111.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-001.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-001.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-002.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-002.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-003.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-003.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-004.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-004.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-007.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-007.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-height-applies-to-010.xht": [ + [ + "/css/CSS2/normal-flow/max-height-applies-to-010.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-height-max-width-001.xht": [ + [ + "/css/CSS2/normal-flow/max-height-max-width-001.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-width-014.xht": [ + [ + "/css/CSS2/normal-flow/max-width-014.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-width-108.xht": [ + [ + "/css/CSS2/normal-flow/max-width-108.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-width-applies-to-010.xht": [ + [ + "/css/CSS2/normal-flow/max-width-applies-to-010.xht", + {} + ] + ], + "css/CSS2/normal-flow/max-width-percentage-003.xht": [ + [ + "/css/CSS2/normal-flow/max-width-percentage-003.xht", + {} + ] + ], + "css/CSS2/normal-flow/min-height-014.xht": [ + [ + "/css/CSS2/normal-flow/min-height-014.xht", + {} + ] + ], + "css/CSS2/normal-flow/min-height-113.xht": [ + [ + "/css/CSS2/normal-flow/min-height-113.xht", + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-001.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-001.xht", + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-002.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-002.xht", + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-003.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-003.xht", + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-004.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-004.xht", + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-007.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-007.xht", + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-010.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-010.xht", + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-013.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-013.xht", + {} + ] + ], + "css/CSS2/normal-flow/min-height-applies-to-014.xht": [ + [ + "/css/CSS2/normal-flow/min-height-applies-to-014.xht", + {} + ] + ], + "css/CSS2/normal-flow/min-width-014.xht": [ + [ + "/css/CSS2/normal-flow/min-width-014.xht", + {} + ] + ], + "css/CSS2/normal-flow/min-width-applies-to-010.xht": [ + [ + "/css/CSS2/normal-flow/min-width-applies-to-010.xht", + {} + ] + ], + "css/CSS2/normal-flow/min-width-percentage-003.xht": [ + [ + "/css/CSS2/normal-flow/min-width-percentage-003.xht", + {} + ] + ], + "css/CSS2/normal-flow/replaced-elements-001.xht": [ + [ + "/css/CSS2/normal-flow/replaced-elements-001.xht", + {} + ] + ], + "css/CSS2/normal-flow/replaced-intrinsic-ratio-001.xht": [ + [ + "/css/CSS2/normal-flow/replaced-intrinsic-ratio-001.xht", + {} + ] + ], + "css/CSS2/normal-flow/replaced-min-max-001.xht": [ + [ + "/css/CSS2/normal-flow/replaced-min-max-001.xht", + {} + ] + ], + "css/CSS2/normal-flow/width-014.xht": [ + [ + "/css/CSS2/normal-flow/width-014.xht", + {} + ] + ], + "css/CSS2/normal-flow/width-applies-to-010.xht": [ + [ + "/css/CSS2/normal-flow/width-applies-to-010.xht", + {} + ] + ], + "css/CSS2/normal-flow/width-replaced-element-001.xht": [ + [ + "/css/CSS2/normal-flow/width-replaced-element-001.xht", + {} + ] + ], + "css/CSS2/normal-flow/width-undefined-001.xht": [ + [ + "/css/CSS2/normal-flow/width-undefined-001.xht", + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-height-001.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-height-001.xht", + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-001.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-max-height-001.xht", + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-009.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-009.xht", + {} + ] + ], + "css/CSS2/positioning/absolute-non-replaced-width-028.xht": [ + [ + "/css/CSS2/positioning/absolute-non-replaced-width-028.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-003.xht": [ + [ + "/css/CSS2/positioning/abspos-003.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-004.xht": [ + [ + "/css/CSS2/positioning/abspos-004.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-006.xht": [ + [ + "/css/CSS2/positioning/abspos-006.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-010.xht": [ + [ + "/css/CSS2/positioning/abspos-010.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-023.xht": [ + [ + "/css/CSS2/positioning/abspos-023.xht", + {} + ] + ], + "css/CSS2/positioning/abspos-zero-width-001.xht": [ + [ + "/css/CSS2/positioning/abspos-zero-width-001.xht", + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-008.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-008.xht", + {} + ] + ], + "css/CSS2/positioning/bottom-applies-to-010.xht": [ + [ + "/css/CSS2/positioning/bottom-applies-to-010.xht", + {} + ] + ], + "css/CSS2/positioning/dynamic-top-change-005.xht": [ + [ + "/css/CSS2/positioning/dynamic-top-change-005.xht", + {} + ] + ], + "css/CSS2/positioning/dynamic-top-change-005a.xht": [ + [ + "/css/CSS2/positioning/dynamic-top-change-005a.xht", + {} + ] + ], + "css/CSS2/positioning/dynamic-top-change-005b.xht": [ + [ + "/css/CSS2/positioning/dynamic-top-change-005b.xht", + {} + ] + ], + "css/CSS2/positioning/left-applies-to-008.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-008.xht", + {} + ] + ], + "css/CSS2/positioning/left-applies-to-010.xht": [ + [ + "/css/CSS2/positioning/left-applies-to-010.xht", + {} + ] + ], + "css/CSS2/positioning/position-001.xht": [ + [ + "/css/CSS2/positioning/position-001.xht", + {} + ] + ], + "css/CSS2/positioning/position-002.xht": [ + [ + "/css/CSS2/positioning/position-002.xht", + {} + ] + ], + "css/CSS2/positioning/position-003.xht": [ + [ + "/css/CSS2/positioning/position-003.xht", + {} + ] + ], + "css/CSS2/positioning/position-005.xht": [ + [ + "/css/CSS2/positioning/position-005.xht", + {} + ] + ], + "css/CSS2/positioning/position-absolute-005.xht": [ + [ + "/css/CSS2/positioning/position-absolute-005.xht", + {} + ] + ], + "css/CSS2/positioning/position-applies-to-008.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-008.xht", + {} + ] + ], + "css/CSS2/positioning/position-applies-to-010.xht": [ + [ + "/css/CSS2/positioning/position-applies-to-010.xht", + {} + ] + ], + "css/CSS2/positioning/position-fixed-002.xht": [ + [ + "/css/CSS2/positioning/position-fixed-002.xht", + {} + ] + ], + "css/CSS2/positioning/position-fixed-006.xht": [ + [ + "/css/CSS2/positioning/position-fixed-006.xht", + {} + ] + ], + "css/CSS2/positioning/position-relative-002.xht": [ + [ + "/css/CSS2/positioning/position-relative-002.xht", + {} + ] + ], + "css/CSS2/positioning/position-relative-008.xht": [ + [ + "/css/CSS2/positioning/position-relative-008.xht", + {} + ] + ], + "css/CSS2/positioning/right-applies-to-008.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-008.xht", + {} + ] + ], + "css/CSS2/positioning/right-applies-to-010.xht": [ + [ + "/css/CSS2/positioning/right-applies-to-010.xht", + {} + ] + ], + "css/CSS2/positioning/top-applies-to-008.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-008.xht", + {} + ] + ], + "css/CSS2/positioning/top-applies-to-010.xht": [ + [ + "/css/CSS2/positioning/top-applies-to-010.xht", + {} + ] + ], "css/css-align-3/ttwf-reftest-alignContent.html": [ [ "/css/css-align-3/ttwf-reftest-alignContent.html", @@ -117466,6 +138219,1494 @@ "f060b356887b9ceb49be019634657b847bfffe81", "reftest" ], + "css/CSS2/floats-clear/adjacent-floats-001-ref.xht": [ + "5c57364aaca7482f6347f9653affccf85fa5c935", + "support" + ], + "css/CSS2/floats-clear/adjacent-floats-001.xht": [ + "a1b16dd5548c5b358564fa723ee30dd0b872aa46", + "reftest" + ], + "css/CSS2/floats-clear/clear-001-ref.xht": [ + "6c2495de89220792494f6e57450135d2b9be050b", + "support" + ], + "css/CSS2/floats-clear/clear-001.xht": [ + "b07684e1e844584e770def827685d9952155d169", + "reftest" + ], + "css/CSS2/floats-clear/clear-002-ref.xht": [ + "1a18f9aed9b3fe797e5320f2dc0c772b5082580c", + "support" + ], + "css/CSS2/floats-clear/clear-002.xht": [ + "3efc32b0b782fa4a725a482085aabfc0fd43bb2c", + "reftest" + ], + "css/CSS2/floats-clear/clear-003-ref.xht": [ + "d213cc7828020c92323c22c169d6abfa632147cb", + "support" + ], + "css/CSS2/floats-clear/clear-003.xht": [ + "bfc432fb8c1974fa06f822f2bca5c8e69d7d0a46", + "reftest" + ], + "css/CSS2/floats-clear/clear-004.xht": [ + "0151fa897be8d06b2bb40e60c546099c17837501", + "reftest" + ], + "css/CSS2/floats-clear/clear-005.xht": [ + "4bb55db3c05ae1f52b6320491577cc40f99a59a0", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-000-ref.xht": [ + "5691b2e615b308024ea804cf5fcc7aba5de29313", + "support" + ], + "css/CSS2/floats-clear/clear-applies-to-000.xht": [ + "2dc32509c17699bb7287aa9c9181e6402a934b06", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-001-ref.xht": [ + "2c2c251a504a61b68b842d8b8094d199f8c20989", + "support" + ], + "css/CSS2/floats-clear/clear-applies-to-001.xht": [ + "a6c3bb0a1bbca536c0d23df8de7906d76981a2ae", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-002.xht": [ + "2bf1c41d86b6be46a603e6c7232f30b89b6e4314", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-003.xht": [ + "d6597f1cca4edf480fd2cf09881468478d3a7856", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-004.xht": [ + "2867e8ebbad570ede7c140b7c337d136842d544f", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-005.xht": [ + "317765ef98865d4b747343bbdceaa0067622c95a", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-006.xht": [ + "219b8036031a751f4af2027d57e8da8f8d84fc13", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-007.xht": [ + "44e224d33e89dedf91662088387094cb8a28dd36", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-008-ref.xht": [ + "db9d3c111a4f01fd54c04de57aa592ee0a2babb1", + "support" + ], + "css/CSS2/floats-clear/clear-applies-to-008.xht": [ + "4dea511a4f95e4b3084a224e992ffc87957a0d28", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-009-ref.xht": [ + "4d7489aea5a0897829752cf16c3f63f0960ee701", + "support" + ], + "css/CSS2/floats-clear/clear-applies-to-009.xht": [ + "bb915f40c4905b88abe895bd30d1dd4c857fed7d", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-010.xht": [ + "ec79a46ae6b338e177461f6b898c58d215e5974a", + "visual" + ], + "css/CSS2/floats-clear/clear-applies-to-012.xht": [ + "1e8e5c96d43520b6cdbf20232009a706648414e8", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-013.xht": [ + "c7ce105057e1cfcd994dee6065cb3d2e538f7f2f", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-014.xht": [ + "3747bd4e504f9de6a5f847737b92ece728564e43", + "reftest" + ], + "css/CSS2/floats-clear/clear-applies-to-015.xht": [ + "ffd42110f1371e82f9884160d3dde43f154aa638", + "reftest" + ], + "css/CSS2/floats-clear/clear-clearance-calculation-001-ref.xht": [ + "38dc6bdb5cdec0611acc7fa222979de76c796aea", + "support" + ], + "css/CSS2/floats-clear/clear-clearance-calculation-001.xht": [ + "604ff7544ddb66a34717f614be1359a506cbcaef", + "reftest" + ], + "css/CSS2/floats-clear/clear-clearance-calculation-002-ref.xht": [ + "1912e9e78a26b572cbbf776e9cf4b55a5e7f0ea6", + "support" + ], + "css/CSS2/floats-clear/clear-clearance-calculation-002.xht": [ + "ae6a8d7cee0d889454b2e9dfca93b629eb4f99f8", + "reftest" + ], + "css/CSS2/floats-clear/clear-clearance-calculation-003-ref.xht": [ + "a64578c46819fbad64eb583ec4f2b992b28a01c5", + "support" + ], + "css/CSS2/floats-clear/clear-clearance-calculation-003.xht": [ + "b0c4b3387baa86f4b4013bb0ffe7b44ee2f923ee", + "reftest" + ], + "css/CSS2/floats-clear/clear-clearance-calculation-004-ref.xht": [ + "daba104d86f23dbb486b4477a5293d4e11350c4a", + "support" + ], + "css/CSS2/floats-clear/clear-clearance-calculation-004.xht": [ + "7166bf096895fc073dc2285385c15e34fe5d1c9e", + "reftest" + ], + "css/CSS2/floats-clear/clear-clearance-calculation-005-ref.xht": [ + "99407caf4d52f8325372dd421c84da02365033b1", + "support" + ], + "css/CSS2/floats-clear/clear-clearance-calculation-005.xht": [ + "151e4c7acdd319fd9b21ce9ab9560ae40d115218", + "reftest" + ], + "css/CSS2/floats-clear/clear-default-inheritance-001.xht": [ + "c320b0ba95c492ee8119fbd654d95d010c7a2cfc", + "reftest" + ], + "css/CSS2/floats-clear/clear-float-001-ref.xht": [ + "a5686af1c117aff87785a1804be077d8c8f41fbd", + "support" + ], + "css/CSS2/floats-clear/clear-float-001.xht": [ + "10843f7b123b0c5de662a2bbce42d8d00639a71a", + "reftest" + ], + "css/CSS2/floats-clear/clear-float-002-ref.xht": [ + "43df6ec1d0062e132e6ed4f69c72fa7cf16873b9", + "support" + ], + "css/CSS2/floats-clear/clear-float-002.xht": [ + "739c603450fcff7df89843f1a5128bce21bc26a0", + "reftest" + ], + "css/CSS2/floats-clear/clear-float-003-ref.xht": [ + "4c2037d444d94a475e664c5d32722049c1c44587", + "support" + ], + "css/CSS2/floats-clear/clear-float-003.xht": [ + "46d53552bdfb0b5996ca0814b04b01ddbf9c96b5", + "reftest" + ], + "css/CSS2/floats-clear/clear-float-004-ref.xht": [ + "0d45e895553985c5c41e3f63e47ed83833bff5b1", + "support" + ], + "css/CSS2/floats-clear/clear-float-004.xht": [ + "f0591fed9a6e3c96862526bde074ffe4e30ba03b", + "reftest" + ], + "css/CSS2/floats-clear/clear-float-005-ref.xht": [ + "988583df99fef8b171a5997430fb20cd94533859", + "support" + ], + "css/CSS2/floats-clear/clear-float-005.xht": [ + "4bbf226386cf9c56f0b9b74cab4b1941dd66a2a0", + "reftest" + ], + "css/CSS2/floats-clear/clear-float-006-ref.xht": [ + "34174dc02ecbbce6ead09b237542a42ac0538f03", + "support" + ], + "css/CSS2/floats-clear/clear-float-006.xht": [ + "37d4ab0ef79bc65fbe4d930f25517e30bd5cac21", + "reftest" + ], + "css/CSS2/floats-clear/clear-float-007.xht": [ + "7553fcb6d46e52ff7a9d11859990b17218f50579", + "reftest" + ], + "css/CSS2/floats-clear/clear-float-008.xht": [ + "8819bd19433a8ec2e0c876d80ce0adcf87e77ec3", + "reftest" + ], + "css/CSS2/floats-clear/clear-float-009-ref.xht": [ + "ef673f706c8e985ddc9dc0f7afb22380dc41203f", + "support" + ], + "css/CSS2/floats-clear/clear-float-009.xht": [ + "a160ebbe56d0268c32f0322300f99ee099f13120", + "reftest" + ], + "css/CSS2/floats-clear/clear-initial-001.xht": [ + "54d8434692ea6f46f5d55e65460ace5d12826cb3", + "reftest" + ], + "css/CSS2/floats-clear/clear-inline-001-ref.xht": [ + "6548ff7f35f7f4a56d5f7d18126e00b80c378ac7", + "support" + ], + "css/CSS2/floats-clear/clear-inline-001.xht": [ + "3f902ea05caf3cb71e978749bd47b120d10366e2", + "reftest" + ], + "css/CSS2/floats-clear/clearance-006-ref.xht": [ + "2305823fd342085286fe1f5e0cdb27d7cd6fe436", + "support" + ], + "css/CSS2/floats-clear/clearance-006.xht": [ + "102e45db8912a0fbb4aa7831bf402ea5e4f2669b", + "reftest" + ], + "css/CSS2/floats-clear/float-001.xht": [ + "acf9104ee5dd298614fdd09c1fefc84c5c644008", + "visual" + ], + "css/CSS2/floats-clear/float-002.xht": [ + "cfc8209d10b914a4a455d003d468b09437b25c48", + "visual" + ], + "css/CSS2/floats-clear/float-003-ref.xht": [ + "c2f6aa86a06b51f111f1b5d8699c0c3c53ac3394", + "support" + ], + "css/CSS2/floats-clear/float-003.xht": [ + "485f681c3bbef85819d33735251480022b06f3d8", + "reftest" + ], + "css/CSS2/floats-clear/float-004.xht": [ + "c313104928ac368f3481c2c32cc05079a9ab864d", + "visual" + ], + "css/CSS2/floats-clear/float-005-ref.xht": [ + "364c60585636e66a518ceec5ad8fd6147ca6d31e", + "support" + ], + "css/CSS2/floats-clear/float-005.xht": [ + "7bf920d5b1509aedbe86033c3049d71627ee6948", + "reftest" + ], + "css/CSS2/floats-clear/float-006-ref.xht": [ + "afc4980a2a170ed373dd32aae5e50f6f238f5e23", + "support" + ], + "css/CSS2/floats-clear/float-006.xht": [ + "992f088f3c2cf7b207a8a269102856c6e46467b3", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-001.xht": [ + "80a71b4a1c6dc32f3f4cbbe8940bb3832e4eedff", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-001a.xht": [ + "92b55e464c3cc956bbc34704d0bbc8897158f805", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-002.xht": [ + "60e6a62ea464ee578f1e14bf3043ff0440a5bca7", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-003.xht": [ + "999df4d344c35981ba2b3d3521390cd1559ac03e", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-004.xht": [ + "117eff46fc336874e981b08176005327d239d6e8", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-004a.xht": [ + "c39e50049bf9456072db26bdf8a603b745062ce7", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-005.xht": [ + "e24e9d5eab247594ae276d372979eb7a9f68f178", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-006.xht": [ + "6504a06940fa996ae0f2b195fde4b04feabcd519", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-007.xht": [ + "4261e76d469f2d45c56bcc536fec58d8860eefc4", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-008-ref.xht": [ + "659238329fb18ea5614ed6334f37f30f1fed9d2f", + "support" + ], + "css/CSS2/floats-clear/float-applies-to-008.xht": [ + "7324b707a78a81f274a9c8f3cacc33f5126918ee", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-008a.xht": [ + "271a75b03272a904f022080a5a6648b127331a50", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-009.xht": [ + "032dcae217bf014b2bc43f34be12555c01957902", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-010.xht": [ + "ffcafe8c7c8c44407dd62ea4e99aab8b01458da3", + "visual" + ], + "css/CSS2/floats-clear/float-applies-to-012.xht": [ + "fb1f1ca067f5c5d97c0ce468c66083fc086a7104", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-013.xht": [ + "76a6cfccd1bfd2a9b609a9728daf709c0f1954cc", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-014.xht": [ + "044607844309a2e3133372655012b8ed3be55be2", + "reftest" + ], + "css/CSS2/floats-clear/float-applies-to-015.xht": [ + "5a4dffb5c3be3546cfe23350946b3ca2e3767a77", + "reftest" + ], + "css/CSS2/floats-clear/float-non-replaced-height-001-ref.xht": [ + "bc608854902e8c16718be34f58ff0c374e361947", + "support" + ], + "css/CSS2/floats-clear/float-non-replaced-height-001.xht": [ + "b2a4fce26a8ed32041ba9adc3814b0c746bacef0", + "reftest" + ], + "css/CSS2/floats-clear/float-non-replaced-width-001-ref.xht": [ + "f15d27fc36c4600edbced0bc961f408c5d495e80", + "support" + ], + "css/CSS2/floats-clear/float-non-replaced-width-001.xht": [ + "718125cc104fb32648ddf9f0097986b2d386c95b", + "reftest" + ], + "css/CSS2/floats-clear/float-non-replaced-width-002-ref.xht": [ + "10d86107cdd78f68a2f39ac79e7175a372a23572", + "support" + ], + "css/CSS2/floats-clear/float-non-replaced-width-002.xht": [ + "0cca35485233e5d0974047f0c01f72b42c4b8c22", + "reftest" + ], + "css/CSS2/floats-clear/float-non-replaced-width-003-ref.xht": [ + "5008f2e094b524dae424d9314c01226de14b188a", + "support" + ], + "css/CSS2/floats-clear/float-non-replaced-width-003.xht": [ + "6c8862390442df8b60e07bf1f48c04f9b9cf6f91", + "reftest" + ], + "css/CSS2/floats-clear/float-non-replaced-width-004.xht": [ + "fb471f85500cdaf4a063fca1066ed0b833e4d5a5", + "reftest" + ], + "css/CSS2/floats-clear/float-non-replaced-width-005.xht": [ + "ff04b51c42c6a72856433a71ddfa6a29da035cc7", + "reftest" + ], + "css/CSS2/floats-clear/float-non-replaced-width-006.xht": [ + "d7b934bafc9e312e86e981b2d6ac3d0bd5a3b2aa", + "visual" + ], + "css/CSS2/floats-clear/float-non-replaced-width-007.xht": [ + "a1f6f25715b86e3a24e4293b361c4a4e8c03302a", + "reftest" + ], + "css/CSS2/floats-clear/float-non-replaced-width-008.xht": [ + "3ef3f47e2120c888a994a1b690ff6aec2aec291d", + "reftest" + ], + "css/CSS2/floats-clear/float-non-replaced-width-009.xht": [ + "6d92285d8ecb27eda7ee6ab86897a3f8fd661144", + "reftest" + ], + "css/CSS2/floats-clear/float-non-replaced-width-010.xht": [ + "57e59b4945da6c9188efd7c08a5ab0376762c711", + "reftest" + ], + "css/CSS2/floats-clear/float-non-replaced-width-011.xht": [ + "9b5d3bffd54506ff4475ed05858abdab793da5d1", + "reftest" + ], + "css/CSS2/floats-clear/float-non-replaced-width-012.xht": [ + "4331d7fd862eb524503db8758628f674cb56394c", + "reftest" + ], + "css/CSS2/floats-clear/float-non-replaced-width-013.xht": [ + "f2bb07328ced2b37427d65664009388f3c3adc03", + "visual" + ], + "css/CSS2/floats-clear/float-replaced-height-001-ref.xht": [ + "e46b6c6ef19a2332bae9bfbea7a3385b28eef172", + "support" + ], + "css/CSS2/floats-clear/float-replaced-height-001.xht": [ + "910e51992429442ff2cf621d46c905b9ffbc6566", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-height-002-ref.xht": [ + "74d977f254e77cf112bb19a8eb3586a5a46ebf33", + "support" + ], + "css/CSS2/floats-clear/float-replaced-height-002.xht": [ + "676fb51dd3468136fcc9030bea2de04a422ffc04", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-height-003-ref.xht": [ + "b4fc7f30ff98fa0f99d6e7ca623371c5c3000a88", + "support" + ], + "css/CSS2/floats-clear/float-replaced-height-003.xht": [ + "82cb4ee3f3fb622b41ab63924a19734c68b7c038", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-height-004-ref.xht": [ + "d0fcdbd228c30cec3e862733f4a6cdc5116e586f", + "support" + ], + "css/CSS2/floats-clear/float-replaced-height-004.xht": [ + "6f0bb571af4345e533d61fd965e38433d0af0110", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-height-005-ref.xht": [ + "91bdc286a6cc57dc357be05d9191ddb04aea740a", + "support" + ], + "css/CSS2/floats-clear/float-replaced-height-005.xht": [ + "a69913be4a4caa3a26c9ef9d4da8e1eb5225fc68", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-height-006-ref.xht": [ + "07745e2c4046e12d378654493a6f7fcafd4f6842", + "support" + ], + "css/CSS2/floats-clear/float-replaced-height-006.xht": [ + "1e619004f51f6df32b55bec8bbb04956e7e27a19", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-height-007.xht": [ + "e82dd3058548abdfbb6553fa219f21175ce4d0d1", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-width-001.xht": [ + "24b779eab670598dcca8ef70b2917df0efbb4825", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-width-002.xht": [ + "e6888a31cfe2350040bdca346891667cf5fecac2", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-width-003.xht": [ + "b469c4241666733b4f1b02a4bcc6fd517e01b787", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-width-004.xht": [ + "a0d81927898309bc06cd05ba0c734a5613a135ee", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-width-005.xht": [ + "2b4b9f0ab305d00aacb94d052699b8ed7a0cb888", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-width-006-ref.xht": [ + "2638cc38d65d182dcd9bacf1cdeba01823027fe9", + "support" + ], + "css/CSS2/floats-clear/float-replaced-width-006.xht": [ + "003cd06746833af9bb70f71a4e27a489aca652e9", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-width-007-ref.xht": [ + "4641dfa3623e2c33b30c295ee2f462824210654d", + "support" + ], + "css/CSS2/floats-clear/float-replaced-width-007.xht": [ + "4e300be1a7bd5f55c5dba09a71ceef61b7c8b85d", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-width-008-ref.xht": [ + "949d420b3cbf2e4b0e895fb3fc46da1f693f21a2", + "support" + ], + "css/CSS2/floats-clear/float-replaced-width-008.xht": [ + "21f5cd24c9a3860dfc886cec763d5b46ec2cf44b", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-width-009-ref.xht": [ + "ed396bb4658f6eb1a1459f0190e6c3b9e8f10ca8", + "support" + ], + "css/CSS2/floats-clear/float-replaced-width-009.xht": [ + "1080860341411577ec8d848b250d9be050e03a93", + "reftest" + ], + "css/CSS2/floats-clear/float-replaced-width-011-ref.xht": [ + "bb4ad80d3e8c88006b58ef775da437c5692a3f03", + "support" + ], + "css/CSS2/floats-clear/float-replaced-width-011.xht": [ + "bb9200d385f60241146e8ef1907ce7eca00326bb", + "reftest" + ], + "css/CSS2/floats-clear/floating-replaced-height-008.xht": [ + "57e16c3ba789fe05c42861f6dbc00c77a3f549c9", + "manual" + ], + "css/CSS2/floats-clear/floats-001-ref.xht": [ + "527ba6bcbc5f276597ddde453578c0cfb6dc8815", + "support" + ], + "css/CSS2/floats-clear/floats-001.xht": [ + "d6ec0f14051f895ea108a41faf2a61726a31c387", + "reftest" + ], + "css/CSS2/floats-clear/floats-002-ref.xht": [ + "31b852792c4de942712ad0a7712d65a3cf6bb1a7", + "support" + ], + "css/CSS2/floats-clear/floats-002.xht": [ + "c601d9af4f0a068acb93600989c1a3fa736ce6af", + "reftest" + ], + "css/CSS2/floats-clear/floats-003.xht": [ + "d939984e2e50417abb85ea91f86f7da6e8c147db", + "reftest" + ], + "css/CSS2/floats-clear/floats-004-ref.xht": [ + "af114f6feda77ace9c4921dcf437cd1af29e8b94", + "support" + ], + "css/CSS2/floats-clear/floats-004.xht": [ + "9181ee6e3c1a59a2ae82714ac5388d2e13992700", + "reftest" + ], + "css/CSS2/floats-clear/floats-005-ref.xht": [ + "8ad9b3d7a713505eacf19fbfdac9ece71bf8d1a2", + "support" + ], + "css/CSS2/floats-clear/floats-005.xht": [ + "6ffbb19f8f4892ae4c2c86db9bc2a15983332b68", + "reftest" + ], + "css/CSS2/floats-clear/floats-006-ref.xht": [ + "54539fd127c057686970872fccfdaf9404a7af9d", + "support" + ], + "css/CSS2/floats-clear/floats-006.xht": [ + "28f3d3a8215bc284f4b1a260d0350515fb780b71", + "reftest" + ], + "css/CSS2/floats-clear/floats-007-ref.xht": [ + "4c5051a59198e2c19fff7dcfdd81357bffd21281", + "support" + ], + "css/CSS2/floats-clear/floats-007.xht": [ + "620d3f50c67978f62b04de65797494cb0184845e", + "reftest" + ], + "css/CSS2/floats-clear/floats-008.xht": [ + "2ace9765b6a1f848bccd3d737d9c0df3d1d82493", + "reftest" + ], + "css/CSS2/floats-clear/floats-009-ref.xht": [ + "e8b0758787c95d5927a53c6f26f75a0c473a8262", + "support" + ], + "css/CSS2/floats-clear/floats-009.xht": [ + "2e88cd5364b4ff0006c8cb0dd36c3dcfb1ec6985", + "reftest" + ], + "css/CSS2/floats-clear/floats-014-ref.xht": [ + "d75c7e744db83453d92a1cc65add0e778bbf3ae2", + "support" + ], + "css/CSS2/floats-clear/floats-014.xht": [ + "b17b199c348255a35abedcfc93f072dfbecce58a", + "reftest" + ], + "css/CSS2/floats-clear/floats-015.xht": [ + "b75cd6ea23ce008ff169c0934ed12ee2a2682ee2", + "reftest" + ], + "css/CSS2/floats-clear/floats-016.xht": [ + "625f29fee8a4729aee6e6811300f7b1bae6eeda8", + "visual" + ], + "css/CSS2/floats-clear/floats-019-ref.xht": [ + "6f8733991ff92912d85a81e895b67b86e150210f", + "support" + ], + "css/CSS2/floats-clear/floats-019.xht": [ + "6fd66501481ff75b1ef3a929b91849c7ed48bd98", + "reftest" + ], + "css/CSS2/floats-clear/floats-020.xht": [ + "ae78a5faaf6b2a1402a4425da959549926ab3cd0", + "visual" + ], + "css/CSS2/floats-clear/floats-021.xht": [ + "b63e4673a418a8e39420f4f722db6c43b31ac0d7", + "visual" + ], + "css/CSS2/floats-clear/floats-022-ref.xht": [ + "770cb1168e6d5e8c36b970cd899318688c12a5b0", + "support" + ], + "css/CSS2/floats-clear/floats-022.xht": [ + "8458c0f49e496ab892bd7ab3db8480fdac07cdfe", + "reftest" + ], + "css/CSS2/floats-clear/floats-023-ref.xht": [ + "7392385c3a96d025419467416eb7b41e25d92276", + "support" + ], + "css/CSS2/floats-clear/floats-023.xht": [ + "06ccc3f6fc4fa02d70df291f938558411f5ca061", + "reftest" + ], + "css/CSS2/floats-clear/floats-024-ref.xht": [ + "9645872665472215ba5ba88e5db1b54f3e9a1481", + "support" + ], + "css/CSS2/floats-clear/floats-024.xht": [ + "f4190715237982e4c756c43726ff12a0c35ba2e9", + "reftest" + ], + "css/CSS2/floats-clear/floats-025-ref.xht": [ + "a43560768748a92b6822217fcf27adfc2f95fab4", + "support" + ], + "css/CSS2/floats-clear/floats-025.xht": [ + "1e32b731164dac6d2cd78023e002d4fa5320a25d", + "reftest" + ], + "css/CSS2/floats-clear/floats-026-ref.xht": [ + "cbd0ee570f6b2be455865c1f61df32f31a6261c5", + "support" + ], + "css/CSS2/floats-clear/floats-026.xht": [ + "a9cb5387ca8bad90b35b24339f5d6fad51776f1b", + "reftest" + ], + "css/CSS2/floats-clear/floats-027-ref.xht": [ + "a08c2d96f4106954849c2497cee2dfff3fc4abdd", + "support" + ], + "css/CSS2/floats-clear/floats-027.xht": [ + "7bd8c3f950264ba3d8c2ccf55aa14e2be260837f", + "reftest" + ], + "css/CSS2/floats-clear/floats-028-ref.xht": [ + "48c364f5ffbd8426889479a03e530d602cd41b49", + "support" + ], + "css/CSS2/floats-clear/floats-028.xht": [ + "1f83cd725b3fdb0aca8d5fa4f660ceae14e48ef6", + "reftest" + ], + "css/CSS2/floats-clear/floats-029-ref.xht": [ + "69a4f9ec44300b8ffb9cf7e7e6848562d5357777", + "support" + ], + "css/CSS2/floats-clear/floats-029.xht": [ + "af3df61e61859ad105fd85419e7b64bad0c21ac9", + "reftest" + ], + "css/CSS2/floats-clear/floats-030-ref.xht": [ + "b0aff623c53042049fb32807584cd08a97762c10", + "support" + ], + "css/CSS2/floats-clear/floats-030.xht": [ + "8d6ba76bb5e96c84d3eb235c9b5d2dcf0e466b1d", + "reftest" + ], + "css/CSS2/floats-clear/floats-031-ref.xht": [ + "255762824017be2105eea03268a1267f38db0b87", + "support" + ], + "css/CSS2/floats-clear/floats-031.xht": [ + "50ff31c4020f17c0153b0342f75888abc09d295f", + "reftest" + ], + "css/CSS2/floats-clear/floats-036-ref.xht": [ + "5c69b8814fd1285e78e18916f717f41dd19fcfd6", + "support" + ], + "css/CSS2/floats-clear/floats-036.xht": [ + "8cfcf886e5410936904b8494db5f7358b3322cab", + "reftest" + ], + "css/CSS2/floats-clear/floats-037.xht": [ + "ce852e51a34eb0f6f6bd3bfc6a970dd7d69e44cb", + "visual" + ], + "css/CSS2/floats-clear/floats-038-ref.xht": [ + "0a6256011e0824a3d705a5d5702098776239820c", + "support" + ], + "css/CSS2/floats-clear/floats-038.xht": [ + "8edad8efe4fd3e221e13dc928561949456b92a77", + "reftest" + ], + "css/CSS2/floats-clear/floats-039.xht": [ + "811fb2738d646df14cc8c4069f93e9e18cf00750", + "reftest" + ], + "css/CSS2/floats-clear/floats-040.xht": [ + "70733be32fb2bf1a9a07cdb2a507e066d3e147f7", + "reftest" + ], + "css/CSS2/floats-clear/floats-041-ref.xht": [ + "04a785190d601519cf801a67635bf9c1a9c1cf6f", + "support" + ], + "css/CSS2/floats-clear/floats-041.xht": [ + "9c2aa3364ff328a5f8f18a3ae87a46878bc22fb9", + "reftest" + ], + "css/CSS2/floats-clear/floats-043-ref.xht": [ + "5e6b62e86fb2c673b9010586e02e43b9d5c7d2d4", + "support" + ], + "css/CSS2/floats-clear/floats-043.xht": [ + "363bfb0e1c99252b8ae23fb8ea2b5bc2fe7f5cf1", + "reftest" + ], + "css/CSS2/floats-clear/floats-101-ref.xht": [ + "cb277e6859b3ef37f00328052fec1d8b2ec7dd34", + "support" + ], + "css/CSS2/floats-clear/floats-101.xht": [ + "00e2a99f81f8f91d2174e8b6b7bfead5b09a6a17", + "reftest" + ], + "css/CSS2/floats-clear/floats-102.xht": [ + "a691c3da4e0ec25eefc888f4f05312fb62bcde81", + "visual" + ], + "css/CSS2/floats-clear/floats-103.xht": [ + "41da9df46756a3665687fb98b999b862b529db96", + "visual" + ], + "css/CSS2/floats-clear/floats-104.xht": [ + "2c6f2b4db1410e078648f979599b57f1c8fb8cec", + "visual" + ], + "css/CSS2/floats-clear/floats-105.xht": [ + "b18a299ed7768dbb430671870ca85b751dfcdfa5", + "visual" + ], + "css/CSS2/floats-clear/floats-106.xht": [ + "2922d71f52b844d942de9fc56135c7c8786c4ddc", + "visual" + ], + "css/CSS2/floats-clear/floats-108.xht": [ + "fe037d26c2222499ee8d35deaa97c2161e72ee63", + "manual" + ], + "css/CSS2/floats-clear/floats-109.xht": [ + "46677daa2a6288a742131c492b117fd331420f0a", + "manual" + ], + "css/CSS2/floats-clear/floats-110.xht": [ + "198a50997ed99694ed19d0fda7004ddb575faede", + "manual" + ], + "css/CSS2/floats-clear/floats-111-ref.xht": [ + "11235d53e9afcdba04f841829caca5e5fd18089f", + "support" + ], + "css/CSS2/floats-clear/floats-111.xht": [ + "15efaa755c7fbec0a7baaa783847e56761e0eefa", + "reftest" + ], + "css/CSS2/floats-clear/floats-112-ref.xht": [ + "f9314d73022505a03544b4b6e20ba3a3bca39cd1", + "support" + ], + "css/CSS2/floats-clear/floats-112.xht": [ + "d4829cb357d446584f4a6c5b40db9a3ec9ae66f7", + "reftest" + ], + "css/CSS2/floats-clear/floats-113-ref.xht": [ + "ae41690981c5d9f71248e7093a6b83221957d748", + "support" + ], + "css/CSS2/floats-clear/floats-113.xht": [ + "15f1353f94d28d9920c09330855bae4142f990d1", + "reftest" + ], + "css/CSS2/floats-clear/floats-114-ref.xht": [ + "c28db6a325ea4f020a92edd34fb5a137b6606fbd", + "support" + ], + "css/CSS2/floats-clear/floats-114.xht": [ + "36f8a2de9ecf1c0d7addd4e43b0fc33d711c9da2", + "reftest" + ], + "css/CSS2/floats-clear/floats-115-ref.xht": [ + "d12dbd88182a1ddd14bd571c022d59bcef08e6fc", + "support" + ], + "css/CSS2/floats-clear/floats-115.xht": [ + "e665be89f571d12a1b7faafe0c260446f7fdfed6", + "reftest" + ], + "css/CSS2/floats-clear/floats-116-ref.xht": [ + "1045d2260b123d56b94bca3a374962a341b15c76", + "support" + ], + "css/CSS2/floats-clear/floats-116.xht": [ + "b62b024decdae44a83e1c51786c92d1436d44dd2", + "reftest" + ], + "css/CSS2/floats-clear/floats-117.xht": [ + "fc95b22afe6cc371ff3e3dab20552eb228e3b1f7", + "reftest" + ], + "css/CSS2/floats-clear/floats-118-ref.xht": [ + "58649e962c69d02e5bea44a6fb4649bda9a6333e", + "support" + ], + "css/CSS2/floats-clear/floats-118.xht": [ + "9e26fdfa475bb731c4e6e54e03f3f2a3ec8742b5", + "reftest" + ], + "css/CSS2/floats-clear/floats-119-ref.xht": [ + "2a43f64088839dabedd6cb557ff4a98d8838f35a", + "support" + ], + "css/CSS2/floats-clear/floats-119.xht": [ + "935b8a251b1dd6db24bada4a52f4aaad8e967765", + "reftest" + ], + "css/CSS2/floats-clear/floats-120.xht": [ + "372909c75b19476d63229114d2b29767b10df86d", + "reftest" + ], + "css/CSS2/floats-clear/floats-121-ref.xht": [ + "0f21a40ff6cc4f8a2c850b5b186bc734d506d805", + "support" + ], + "css/CSS2/floats-clear/floats-121.xht": [ + "fe2e25cf1d93ba009733597f5469994c69f8bc28", + "reftest" + ], + "css/CSS2/floats-clear/floats-122-ref.xht": [ + "b31776eb682d706189db8f781133436cda345dc8", + "support" + ], + "css/CSS2/floats-clear/floats-122.xht": [ + "4ea65a067c78a40e84731c60d1dea0ee5d172828", + "reftest" + ], + "css/CSS2/floats-clear/floats-123-ref.xht": [ + "3b8e520bef1effed4f4ae7cd8bb5466b942523d5", + "support" + ], + "css/CSS2/floats-clear/floats-123.xht": [ + "3d3d6c22b9fe8dfeaf4757e4fc1e8ba82ac49e1a", + "reftest" + ], + "css/CSS2/floats-clear/floats-124-ref.xht": [ + "154a535ed78c97bb35a34d735fb02173fb7f1a6d", + "support" + ], + "css/CSS2/floats-clear/floats-124.xht": [ + "87c88f1e192505df13716b2fd5a4bbfac408262f", + "reftest" + ], + "css/CSS2/floats-clear/floats-125-ref.xht": [ + "163d932565b149dd9a8a44b03e62f9f8f5b0164c", + "support" + ], + "css/CSS2/floats-clear/floats-125.xht": [ + "b0779a74b42f88fc7795712e85bdced607ab3ed2", + "reftest" + ], + "css/CSS2/floats-clear/floats-126.xht": [ + "e2046dbe6ec4bb76023c64414f6f571cffe39344", + "manual" + ], + "css/CSS2/floats-clear/floats-127.xht": [ + "3d5c63f9fb78ef2541bc667d828f58c07c9659b1", + "manual" + ], + "css/CSS2/floats-clear/floats-128.xht": [ + "cadfff52c6c11585d8a42ebaff9485f3b5895f07", + "manual" + ], + "css/CSS2/floats-clear/floats-129.xht": [ + "e2652084d8f683276287c4d2913826355d3be913", + "manual" + ], + "css/CSS2/floats-clear/floats-130.xht": [ + "86742f4dddc43ee0499a486795144ea0740fd38b", + "manual" + ], + "css/CSS2/floats-clear/floats-131.xht": [ + "904d274568fd2d8e0f77a726c50b344873f10fc0", + "manual" + ], + "css/CSS2/floats-clear/floats-132-ref.xht": [ + "fd1154b9188b4b3405e245e34a7ffb9952effe67", + "support" + ], + "css/CSS2/floats-clear/floats-132.xht": [ + "d898ba05237adc32f511fbd3d4a60cbcff96e88d", + "reftest" + ], + "css/CSS2/floats-clear/floats-133-ref.xht": [ + "708d2d764ef2a8c5f3f5c0bbe8fd4cc0f6344376", + "support" + ], + "css/CSS2/floats-clear/floats-133.xht": [ + "8deea1e91abd82539d941632ebaacc1d905617df", + "reftest" + ], + "css/CSS2/floats-clear/floats-134.xht": [ + "c2590d1334b1c9abc4afabfd12632eadfa87a2db", + "reftest" + ], + "css/CSS2/floats-clear/floats-135-ref.xht": [ + "bc16e5f0ae0bb08efa8089e754ca8cdc6aabfa71", + "support" + ], + "css/CSS2/floats-clear/floats-135.xht": [ + "4b3ee663d2484272bc39d6237fbb95c839c8a324", + "reftest" + ], + "css/CSS2/floats-clear/floats-136-ref.xht": [ + "de63ee2e15bbb2e3086038f951714f21d624a62a", + "support" + ], + "css/CSS2/floats-clear/floats-136.xht": [ + "ac2c84981e819cafb5bc85d45fd382e4cdad8ad2", + "reftest" + ], + "css/CSS2/floats-clear/floats-137.xht": [ + "0d85b6c1a08260dadaaad0f0fd58243a2f7d428b", + "manual" + ], + "css/CSS2/floats-clear/floats-138-ref.xht": [ + "8db6e0905ba670b80f20aa80e44962cceadf5297", + "support" + ], + "css/CSS2/floats-clear/floats-138.xht": [ + "416ab6558d85bf6087c1470558b60dc5cce4bc23", + "reftest" + ], + "css/CSS2/floats-clear/floats-139-ref.xht": [ + "4328a5a8c163199208c78b9112dbe5a087aa0c28", + "support" + ], + "css/CSS2/floats-clear/floats-139.xht": [ + "02c9d4f87b0a46c6c95ee1b09c996be7c935efb2", + "reftest" + ], + "css/CSS2/floats-clear/floats-140.xht": [ + "9dd24bcc3d4b94cc676854345e8121d20185eee3", + "visual" + ], + "css/CSS2/floats-clear/floats-141-ref.xht": [ + "62a010e2903be58b8dacc01c971666f7d1fed802", + "support" + ], + "css/CSS2/floats-clear/floats-141.xht": [ + "eb39779bd34ab81479a836fb234f6b2bb4b4a24a", + "reftest" + ], + "css/CSS2/floats-clear/floats-142-ref.xht": [ + "c490ec1a4858afd6f7bfd46bba0bcaf0298c9797", + "support" + ], + "css/CSS2/floats-clear/floats-142.xht": [ + "d9b3e7bdf39f05b1292628657db5e20f9fc3b138", + "reftest" + ], + "css/CSS2/floats-clear/floats-143-ref.xht": [ + "7713f31704c7bec118a066048eeb0163730f2bbe", + "support" + ], + "css/CSS2/floats-clear/floats-143.xht": [ + "8cae4019514dc9018bd744670e0fc856a55d874a", + "reftest" + ], + "css/CSS2/floats-clear/floats-144-ref.xht": [ + "c784578d353d0663da810c74342218868dd47553", + "support" + ], + "css/CSS2/floats-clear/floats-144.xht": [ + "26fa9d1f7bcd324ec9b68492be9bf3f7379d2ae1", + "reftest" + ], + "css/CSS2/floats-clear/floats-145-ref.xht": [ + "59847ff890f965b94a96e8087cd3d7c62f76bd6a", + "support" + ], + "css/CSS2/floats-clear/floats-145.xht": [ + "a3bd1f9808695d677be22afe3da06a700270424d", + "reftest" + ], + "css/CSS2/floats-clear/floats-146-ref.xht": [ + "4a422448189fbd7ca1b7cfb90af55890ffa4f380", + "support" + ], + "css/CSS2/floats-clear/floats-146.xht": [ + "52fffa988e08b5915ebb3f4674f7e241924a5625", + "reftest" + ], + "css/CSS2/floats-clear/floats-147-ref.xht": [ + "650aec32660760ae2050efda0bba7c1a912dda42", + "support" + ], + "css/CSS2/floats-clear/floats-147.xht": [ + "ab03645635dd0aa93cfe2b326f09548b433d71c0", + "reftest" + ], + "css/CSS2/floats-clear/floats-149-ref.xht": [ + "a9d946ea815d3ff67108dd1d27cfc337c26f7487", + "support" + ], + "css/CSS2/floats-clear/floats-149.xht": [ + "ed449c88750ff99f345327ed96d87b3e621ba34f", + "reftest" + ], + "css/CSS2/floats-clear/floats-150-ref.xht": [ + "5746a474c454cd0f6cd855fc4c560b4c3b254cc6", + "support" + ], + "css/CSS2/floats-clear/floats-150.xht": [ + "ecad06167429651d16fde87f6739a96dcf8afe93", + "reftest" + ], + "css/CSS2/floats-clear/floats-151.xht": [ + "f981a2f2079da3bafc4953d705fe4a61360edc33", + "visual" + ], + "css/CSS2/floats-clear/floats-152.xht": [ + "6ddf3b3788b460b20f2c1c2228622384a0e91d71", + "reftest" + ], + "css/CSS2/floats-clear/floats-153-ref.xht": [ + "2ffbbec7eb23a66795e9c5ff0fdd0d08ac7c886f", + "support" + ], + "css/CSS2/floats-clear/floats-153.xht": [ + "7867fdaf4815cd6953017e2c2b2be17a5311a34e", + "reftest" + ], + "css/CSS2/floats-clear/floats-154-ref.xht": [ + "18ff0ce46bfb19742895503dbdce6ec141ec075a", + "support" + ], + "css/CSS2/floats-clear/floats-154.xht": [ + "3d2b7ca6b76f545b0fce68825765aca69661be30", + "reftest" + ], + "css/CSS2/floats-clear/floats-bfc-001-ref.xht": [ + "e50bf966d2d429030ff6af56df3dce9214d42585", + "support" + ], + "css/CSS2/floats-clear/floats-bfc-001.xht": [ + "4963afc83dd877ba3b8caabd118e8c3a67d3e401", + "reftest" + ], + "css/CSS2/floats-clear/floats-bfc-002.xht": [ + "e82c2df323829b38fb05a677e733f01b916ebceb", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-018.xht": [ + "18d8707bc32ca492f64a67e6db21390032ff3dc5", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-023.xht": [ + "affacd4ed7b72865f2442822cc7db4c3842cf800", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-024-ref.xht": [ + "1603e2a5bfdf70808ee53b64b057c09143854667", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-024.xht": [ + "838183fb3a044a6b2b96f77a2ef88cbc0e7c7156", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-027.xht": [ + "9a32902d09ea0770eff16add7758a744ee1b88bc", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-031-ref.xht": [ + "2c45106f309d7da16fd8570922f4c62ab66754e8", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-031.xht": [ + "58f636d5ba3f45f4f65f3fa03c8532814558541f", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-033.xht": [ + "b3f5e3de9834fa373c32f2b85892b98bf3959225", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-034.xht": [ + "4f8d08de857afabcf3a7499deb7aa501b2754742", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-035.xht": [ + "18e4cf02bb728a4d4d6d3fca75ed2d1d5cfa3a7a", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-121-ref.xht": [ + "5f72429ad39550d0a548d9c8c0d30db94fea5486", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-121.xht": [ + "524f61e58e3b716d95e9da6d1ce8daa1652992b2", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-122.xht": [ + "77eff6ef541099e5006c73b5cb2a489eee34b85e", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-123-ref.xht": [ + "b3c76bf3875cefa8e9ba05f50410443e97136e09", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-123.xht": [ + "4f645d785aa4e58407cb991adb92ea8d6b9acb50", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-125-ref.xht": [ + "7734b0c3a229038d82b9ee5c123035d89eac76ca", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-125.xht": [ + "7cdeefb65523555d50a9f9b3b58338620b390374", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-134-ref.xht": [ + "f6adc124767927734fb8a09bb8e6c54e5e1ebf4a", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-134.xht": [ + "e09c59bdd66b2e4f51fd581d0cc6581586ec3397", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-135-ref.xht": [ + "5839b1fb3535a8971c8dbcf752874054ecef2240", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-135.xht": [ + "220973732db3725bf0aeb6457a31d4753dee59b5", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-142-ref.xht": [ + "f60fe2df191038b8c9b77420637618a46546838f", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-142.xht": [ + "ef8bf28552fbd19637c187a29128c731a66314aa", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-157-ref.xht": [ + "a1d1e30ffbba3ba02dab993ed6f1c133f204d855", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-157.xht": [ + "f3d53d9b44bf140335ea2a3c2fe90bb7edd34f83", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-158-ref.xht": [ + "d2e16b2928906aaf7bb799cab38d13f7506ea911", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-158.xht": [ + "1ae09652de72bcb0d3cad1837e835711128e1a52", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-164.xht": [ + "ac8281739daaeea19fb892671b79db9349e25afe", + "visual" + ], + "css/CSS2/floats-clear/margin-collapse-165-ref.xht": [ + "824804a39a8fff78126fba939bbd90e1d52c4d92", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-165.xht": [ + "4b7de145dddbc95791771d579c8bea590ab04bc7", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-166.xht": [ + "46601c3b82b181c17bcfef831f7c85e37eb3717d", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-clear-002-ref.xht": [ + "42eebc89bcb2b128e1a3903da3884ede8760a3fb", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-clear-002.xht": [ + "b6987e36eab6eee1c151e44f9a509a1b9d83aeb4", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-clear-003-ref.xht": [ + "cc5c20e92332985170d7730af76b4a602ee39b5a", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-clear-003.xht": [ + "c4b086649d752df28db53fbcc3cde51c56a18d69", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-clear-005.xht": [ + "8f5fa6840cda286fc051a55a774929d1a4621c87", + "visual" + ], + "css/CSS2/floats-clear/margin-collapse-clear-008.xht": [ + "ad90f8e6d71e48ceaa544eca5f1bb20268ba2b24", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-clear-009.xht": [ + "be8397af02636bf3a9b64ef2271c5ac3e8885a15", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-clear-011.xht": [ + "7eb4d2d51ad914f13fee4d4c24d5dbbd31b8d4c0", + "visual" + ], + "css/CSS2/floats-clear/margin-collapse-clear-012-ref.xht": [ + "b50cad7e1d959927ba6d29709a2e09819acece2a", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-clear-012.xht": [ + "78e404a853bab4b33c0a30e818f5e25638ec9f3d", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-clear-013.xht": [ + "7ac25706546f27b0fbd6acf98f83e9522db027a2", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-clear-014-ref.xht": [ + "69c2e44b5ba51719df1d1c36ea8cc66f58634e94", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-clear-014.xht": [ + "ef6e207a912acc31ff243a38c0f941320ec20a36", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-clear-015-ref.xht": [ + "95fa53416cbb0c6587145931ad92c0baf67022b5", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-clear-015.xht": [ + "adcc00ced7ac8aed4c9da212f26f73b9c6f31b87", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-clear-016-ref.xht": [ + "122c0486d28783e9233d065a14bef9864f85e8fe", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-clear-016.xht": [ + "dc99a8db71f8d5a377e11080d2febc979c1f49b5", + "reftest" + ], + "css/CSS2/floats-clear/margin-collapse-clear-017-ref.xht": [ + "d9d0dc6f27cb42c0dd0e7df606d5040dd779478d", + "support" + ], + "css/CSS2/floats-clear/margin-collapse-clear-017.xht": [ + "b4347b446723cc1bfd3476c457858a780064e001", + "reftest" + ], + "css/CSS2/floats-clear/support/1x1-green.png": [ + "51e7b6974a09eda6cb31337717c5eaeb9c44b443", + "support" + ], + "css/CSS2/floats-clear/support/1x1-lime.png": [ + "b040eb633a35c0648ad72a2902361faf25bc419d", + "support" + ], + "css/CSS2/floats-clear/support/1x1-maroon.png": [ + "f78757e5ebe897bd618d100718385c84e00f2369", + "support" + ], + "css/CSS2/floats-clear/support/1x1-navy.png": [ + "a3fd80b2c79866fd343e18eef5a51ed6e835e53e", + "support" + ], + "css/CSS2/floats-clear/support/1x1-red.png": [ + "b8da86921d04ba42f42b0a60b03c5c2172f58c2b", + "support" + ], + "css/CSS2/floats-clear/support/1x1-white.png": [ + "71b246439f915ad21c7d39414d9f85c8ed73b4ca", + "support" + ], + "css/CSS2/floats-clear/support/60x60-gg-rr.png": [ + "e4843d42a26189132e1bdd53e8618521330baeca", + "support" + ], + "css/CSS2/floats-clear/support/60x60-green.png": [ + "2f8eb2409b0a18e0bff90725ec7eedc16e7be448", + "support" + ], + "css/CSS2/floats-clear/support/60x60-red.png": [ + "415b835abaaab822aab11880354296e7356bbb0a", + "support" + ], + "css/CSS2/floats-clear/support/a-green.css": [ + "a9716c222274ba868bfd06c05e28cb7762d93245", + "support" + ], + "css/CSS2/floats-clear/support/b-green.css": [ + "eb78a4d12f35b4249051826ea000c53d04df80b7", + "support" + ], + "css/CSS2/floats-clear/support/black15x15.png": [ + "9252cae16138e45c07796fa5a10b6100ae703eaa", + "support" + ], + "css/CSS2/floats-clear/support/blue15x15.png": [ + "eb48032c07bfeb1d3b6be6e5c9c34d2fe2180767", + "support" + ], + "css/CSS2/floats-clear/support/c-red.css": [ + "dc288b7aa49b57e0abf803741e78582ba5ceffdb", + "support" + ], + "css/CSS2/floats-clear/support/cat.png": [ + "461fd17b274662b88500cdf42bab7f3b79e6019d", + "support" + ], + "css/CSS2/floats-clear/support/clear-clearance-calculation-001.png": [ + "751cf5ea84ee7f290ece1d21416b7ba2411d7b64", + "support" + ], + "css/CSS2/floats-clear/support/clear-clearance-calculation-002.png": [ + "4365e9d91a7adce13f1b6c6b0ce7236f3c7b39e6", + "support" + ], + "css/CSS2/floats-clear/support/clear-clearance-calculation-003.png": [ + "497ac5f66b07db992fa81f8aa2a8649759f746dd", + "support" + ], + "css/CSS2/floats-clear/support/diamond.png": [ + "4a136dfe39879f33f627a6de92f1e43fe8af7b94", + "support" + ], + "css/CSS2/floats-clear/support/floats-005.png": [ + "f7e9b48ae8c03a11d8d3ddf08803a59d9a4d8249", + "support" + ], + "css/CSS2/floats-clear/support/green-rectangle-50wideBy10tall.png": [ + "4793a81fb04b63524970d8906c4ca0fc4e8571db", + "support" + ], + "css/CSS2/floats-clear/support/green15x15.png": [ + "de1830c21195763f7327f270b14b6d50dfdfb21d", + "support" + ], + "css/CSS2/floats-clear/support/margin-collapse-2em-space.png": [ + "75f181cc9321b22549e3bc48b57c53d7d551b060", + "support" + ], + "css/CSS2/floats-clear/support/margin-collapse-4em-space.png": [ + "5dfa7d6e144452fb3a167f11643587878b17a02a", + "support" + ], + "css/CSS2/floats-clear/support/pattern-grg-rgr-grg.png": [ + "cfb6ecc271c296c69b133a81f350a777b608bea4", + "support" + ], + "css/CSS2/floats-clear/support/pattern-grg-rrg-rgg.png": [ + "27080d4df556f59d4b501e03f2847bd9da5756a9", + "support" + ], + "css/CSS2/floats-clear/support/pattern-rgr-grg-rgr.png": [ + "c100a35c361205932c506f1b3399753b91e4c45e", + "support" + ], + "css/CSS2/floats-clear/support/pattern-tr.png": [ + "c1e687deee7b79ae091f2b42c4f6cff430076444", + "support" + ], + "css/CSS2/floats-clear/support/ring.png": [ + "11dd9e78a68b2fc5eb69c401920b43070751a569", + "support" + ], + "css/CSS2/floats-clear/support/ruler-v-100px-200px-300px.png": [ + "4ee6d6fe9c3fcae985bc53203f5e8ed99f2a2e12", + "support" + ], + "css/CSS2/floats-clear/support/square-purple.png": [ + "ef0619128f22e05920930420b7d96f91f860d904", + "support" + ], + "css/CSS2/floats-clear/support/square-teal.png": [ + "92efae44b710cf1ddd9ba96e593dae03fb2519c4", + "support" + ], + "css/CSS2/floats-clear/support/square-white.png": [ + "2f93fcc1462ba32b9b7899e5e78c869e529e68ee", + "support" + ], + "css/CSS2/floats-clear/support/swatch-blue.png": [ + "e79958e10feeeed3db88dee9bae9ea80055593c5", + "support" + ], + "css/CSS2/floats-clear/support/swatch-green.png": [ + "c51a03a807743f59e3027371ccfbd8e80235a485", + "support" + ], + "css/CSS2/floats-clear/support/swatch-lime.png": [ + "ee2cc3dcd6d8dda7c0e4ef3bbc7e63c74118211d", + "support" + ], + "css/CSS2/floats-clear/support/swatch-orange.png": [ + "10768a5177b772013e628c7397ae64725057295d", + "support" + ], + "css/CSS2/floats-clear/support/swatch-purple.png": [ + "c3bc3e851fbac9c05aba6357c6caeca0ee06cb4b", + "support" + ], + "css/CSS2/floats-clear/support/swatch-red.png": [ + "eedea3e9a99c18f5fc2de3796be2c6f9da2ea07d", + "support" + ], + "css/CSS2/floats-clear/support/swatch-white.png": [ + "5bccb1922de065e551d7d106e6493bb91040f3da", + "support" + ], + "css/CSS2/floats-clear/support/swatch-yellow.png": [ + "9cc73897c2e1fc45f5224d81d02a6b87bf72b1fa", + "support" + ], + "css/CSS2/floats-clear/support/test-bl.png": [ + "16e4eaa4864c10e72433e575f59c9b67763fe06a", + "support" + ], + "css/CSS2/floats-clear/support/test-br.png": [ + "37f65e7a21d9b9b2daa508f193b8f665c58a1ce9", + "support" + ], + "css/CSS2/floats-clear/support/test-outer.png": [ + "a0b8dfa40065b27f1d939ce0aab39ada3933c574", + "support" + ], + "css/CSS2/floats-clear/support/test-tl.png": [ + "956e5156fd8c0e75b1c0f3b8b3b900b653663f74", + "support" + ], + "css/CSS2/floats-clear/support/test-tr.png": [ + "078e1dd6dd61d36cec239ed75d02051f61fe60a5", + "support" + ], "css/CSS2/floats/floats-placement-vertical-001-ref.xht": [ "219c3d13a6859b58907f35df0a5602ba215a0335", "support" @@ -118934,6 +141175,6982 @@ "b7c7725481ac65f637548740e9f7eb5dc257e9cc", "reftest" ], + "css/CSS2/normal-flow/block-formatting-context-height-001.xht": [ + "6339215a18ef36150d8da77ab2a76442f7007e05", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-context-height-002.xht": [ + "2cd6830bf630d9ceff5c1c1ac9d52d453e8621bf", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-context-height-003-ref.xht": [ + "3a442ad16db2cc2af90f6e7f71c8828c6e824179", + "support" + ], + "css/CSS2/normal-flow/block-formatting-context-height-003.xht": [ + "919f860afaf7b0734bd28e5fad96ce30e64bf1bc", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-contexts-001-ref.xht": [ + "18f8fc40f06857207320c44154f9a66cc81e194b", + "support" + ], + "css/CSS2/normal-flow/block-formatting-contexts-001.xht": [ + "d522d5d764ecf3b2ba265e698fc1536a872ec4ea", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-contexts-003-ref.xht": [ + "8b925c1e8d4e55cfe576a5f3d7e8b01b95144d20", + "support" + ], + "css/CSS2/normal-flow/block-formatting-contexts-003.xht": [ + "e67dadc22067156134477b277f00c8214d9d74f9", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-contexts-004-ref.xht": [ + "8d2eaf897270d63cfecbb4f0c77cbc93b9c2e536", + "support" + ], + "css/CSS2/normal-flow/block-formatting-contexts-004.xht": [ + "160f8debd3b904c0b317ea480e0e077ca51de4b1", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-contexts-005-ref.xht": [ + "f51a03ea1e1f0823930e9964a31ba342f63b9d58", + "support" + ], + "css/CSS2/normal-flow/block-formatting-contexts-005.xht": [ + "6f9e8d158aed149104066dc33abc57161702647b", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-contexts-006-ref.xht": [ + "35647e71bc0805d97374b09a401a61885a3eac2e", + "support" + ], + "css/CSS2/normal-flow/block-formatting-contexts-006.xht": [ + "a5891bb8cf59c0048c3a1a4462a126b54b2afc71", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-contexts-007.xht": [ + "a1f3925d1ca8d4e1814ed41d41249b3cbd8002cd", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-contexts-008-ref.xht": [ + "adf08e66cbf2ca336fe9eb8acbb318f6f7d00a54", + "support" + ], + "css/CSS2/normal-flow/block-formatting-contexts-008.xht": [ + "83a11a70aad53f297fb78fd7cf38b542a4fc9a3e", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-contexts-009.xht": [ + "2c84fe645d87153f6bf826fdf434c2dacb6a8ce8", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-contexts-010.xht": [ + "fcb2f62aa95bf83c58c72690360b2143b633d3cc", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-contexts-011-ref.xht": [ + "e4e86937b6658c533b983a4033d31f51bd8d9368", + "support" + ], + "css/CSS2/normal-flow/block-formatting-contexts-011.xht": [ + "db292485df6fd8cb05a04de941235e3728e1ffdd", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-contexts-012.xht": [ + "aba098a32a65d916f3f83b884acc0407367e9ca4", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-contexts-013.xht": [ + "849071df6c413cda84dc1c0dd9ba349d68dd997f", + "visual" + ], + "css/CSS2/normal-flow/block-formatting-contexts-014.xht": [ + "5f0d0023140e5462e5ee64e0a36b743891433ecc", + "visual" + ], + "css/CSS2/normal-flow/block-formatting-contexts-015-ref.xht": [ + "4fe40ddd1be7ec0d4fc7549066338940d1523a22", + "support" + ], + "css/CSS2/normal-flow/block-formatting-contexts-015.xht": [ + "81870b55617a073fda2882cfe1c64b3c5a39575d", + "reftest" + ], + "css/CSS2/normal-flow/block-formatting-contexts-016.xht": [ + "a70dd3b650d298719a9381137844e8040ddf2f38", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-append-001-ref.xht": [ + "03c3a5ffc4772ab8c5723e8bfbf801d4742a5c41", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-append-001.xht": [ + "2a3fd0b90b76247dbfbccac0afd1a54cf3e66520", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-append-002-nosplit-ref.xht": [ + "082239f87db731c3e805c646ffa4cba7b362e5dc", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-append-002-ref.xht": [ + "2cd82357c237f9c457d25d4d8878f8c6a43d50eb", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-append-002.xht": [ + "1d389ce4b9d8c841adc8ffacd47eadd63a0c84f6", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-empty-001-ref.xht": [ + "6bef69d1061f9398cb1f972c71c5744f699b6722", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-empty-001.xht": [ + "1d833c39e8d431bbf7558a0e8d79fb78bf2cbe7b", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-empty-002-ref.xht": [ + "34f425f7c6c00164df5486287e078d68428e99b2", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-empty-002.xht": [ + "f4b9adc26cc4a5ec256aa3c02f32d641f05dcc0e", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-empty-003-ref.xht": [ + "153ca194690f7d95199d2cff83f631dd1d81b7fb", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-empty-003.xht": [ + "77576f657227994b27d62fab7c3553ddeedd1a77", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-empty-004-ref.xht": [ + "d22bd70935ea5ef88f04b64d00c83d2dbae975cd", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-empty-004.xht": [ + "76b24dffa8eb713270340a9347e5f42f89eaa85b", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-float-between-001-ref.xht": [ + "25b2c3e03aeeeb07f5a7869a60147f662922329f", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-float-between-001.xht": [ + "c145a5e80cb20aa98c4dd4e4340e27f3be21ca4f", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001-nosplit-ref.xht": [ + "0586ede23a68a92a2d2b95c04398f54a62e5cd3f", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001-ref.xht": [ + "0955dde95c423ff4ad99361071bfa376a98366db", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001a.xht": [ + "0d6f0ffa7aade92ac7eae879d458e2513b4986cd", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001b.xht": [ + "2aa595e9ab4408bc5b64acd5ec7e7d1b20c9e766", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001c.xht": [ + "0194addbb9194f2950907788493fb4997c1fe5f7", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001d.xht": [ + "f011e579b1ef35cf433c2387d121e116ae7d6e8b", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001e.xht": [ + "14ec81c850b4e5b56bc323c16d95ce82d9171342", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001f.xht": [ + "84f74205694faff52e5529b9176ff3da89ba4f7a", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001g.xht": [ + "a85a18f7834b4cb43a5b41ef5b1147822157b25e", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001h.xht": [ + "dece82f52ea38f5b348f2ea694e3f6a47f1e4a19", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001i.xht": [ + "1629649b9934f5721a57861a56b7db8806f11232", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001j.xht": [ + "b9cbdfe43d3ccbad63ed076d014f4cd3759ad32a", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001k.xht": [ + "c6231330ddc5d6295d5af0f2d6c4d19e9df19983", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-001l.xht": [ + "b89859f2adb77bec4bcea6f041ca1923fdcac72f", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-002-nosplit-ref.xht": [ + "b8d524338b6479c71390860dcdeb6dd13f439c74", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-002-ref.xht": [ + "21ac17a83131007bcd8c7114d91c380ec7b95ada", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-002a.xht": [ + "58d794cec2e8c06e532ec38dc4b890f7ddc47b6d", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-002b.xht": [ + "e42ba14a83d24475b918068ff059ebd9f947c87b", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-002c.xht": [ + "c9696b7361a22dd50a5e84e31fba665946263802", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-002d.xht": [ + "fe4793b180d8f057d9f377e8337b7d0d1df680ba", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-002e.xht": [ + "228474f6f1dd03d6a5aa9b6bcbb5bd63d7f91e55", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-002f.xht": [ + "8557cd05dfa47f381365c6a41c73a36d213828d8", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-002g.xht": [ + "eeef7893925e56bc0c097c9ca7e74adb6a0b4687", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-002h.xht": [ + "1bb4ccbed9dec6d57d43cfeb880c4c1be2309b8c", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-002i.xht": [ + "4f76b85a2f5da44ebc91252cad000402e211d7f6", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-003-nosplit-ref.xht": [ + "9414c3ea7b1a91bac44240f43fc624aa63c412d7", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-003-ref.xht": [ + "60471cea3986f99e72cbadefa92b8dd415ff8ad1", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-003.xht": [ + "32f682dfe5538855bc56f0b7345f46ea498a4036", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-004-nosplit-ref.xht": [ + "fac85f4c5dbf09af5446b7111cd74f5a2fc64b34", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-004-ref.xht": [ + "1f725626fff5a62081084d4ff37c3827931c2973", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-004.xht": [ + "1964357e75e2687ea5f3189c116da55554ff000b", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-006-nosplit-ref.xht": [ + "1bdb083fb0e65dfc6dac3c8e6846905d38cd24a5", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-006-ref.xht": [ + "8d4c3f9bc78ecbe0be4c90fd75e38939cfa67011", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-006.xht": [ + "8202fa73921593271f05afe1e3d960ea97b36fda", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-007-nosplit-ref.xht": [ + "19f73966c41a99a4993ba50d24cfeecc9d800baa", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-007-ref.xht": [ + "b879ba220fb21ca8bbf3dbae76a434d9785a2d46", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-007.xht": [ + "5c767fb859dcc8b6750d53bbd8db4d0c2a02b013", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-008-nosplit-ref.xht": [ + "c53abd4445e105a271ebb5caf195394ce8e106e5", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-008-ref.xht": [ + "81c485f42ced405c37bd697533d918bbbd8a6386", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-008a.xht": [ + "bd22460a7ee1999f06b22a1aac853077cd993886", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-008b.xht": [ + "d9953cc446266a33572bbe1a4ff0050a70c2eb6c", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-008c.xht": [ + "3cfa0f15eb1f8360922785ea7838cb74bde087d7", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-009-nosplit-ref.xht": [ + "957635d92fd32911ef57a995761ceb50a8a1c423", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-009-ref.xht": [ + "c802e981db831ffb9ccb96e4cfafe80a2c2a514c", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-009.xht": [ + "73a3f9f4c833dd365a6ba95f96639b8158463fb3", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-010-nosplit-ref.xht": [ + "34d28ef29366c23ebaee58f48b93026a44e0c1d8", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-010-ref.xht": [ + "ac401819024125453f41e40412fbc81784e3a6f9", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-010.xht": [ + "17d6e2e71c1b0d3f7b8d354af733d440af8b6509", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-011-nosplit-ref.xht": [ + "19780320ee0f127fa0b281fdff5d47407f3141bc", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-011-ref.xht": [ + "38d3ed9a0067021ca74960c3cf04e80858de4b5d", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-011.xht": [ + "721384c8e7b3535c1fca08b7f1f733732ee7d1ac", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-012-nosplit-ref.xht": [ + "d81eefb376a1baec20a80633ae899068db2a71ac", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-012-ref.xht": [ + "c0b776d16701bbc5c3d3646abf81f37dc25abc1e", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-012.xht": [ + "eb2d778b0b0120c5e573eb413d6d0e4bf72d5735", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-013-nosplit-ref.xht": [ + "7473259fc89250d9be98be5b02ff201fdd2d76cc", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-013-ref.xht": [ + "78d0362bfc099d69fd55b78ee288d52251698a7e", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-013.xht": [ + "afe8fc12cb2e5cb194867cc9cae102cb2ca333c4", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-014-nosplit-ref.xht": [ + "5e0e2a9b21cfb8b908e78221115647ac76f0079c", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-014-ref.xht": [ + "4263310408e2785b3757f7e8d9f3362f73eaeb66", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-014.xht": [ + "e7bc0254701d862bc1b57760f4c0e46c6b150ca6", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-015-nosplit-ref.xht": [ + "c1a081c53cbc6aa5fab9463a907b044e21a33bc7", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-015-ref.xht": [ + "5f420ccf1841ec75bec0aad6e5ee3f01229638bd", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-015.xht": [ + "040335f4c438adf0853b2e9a79877c07697ba51c", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-016-nosplit-ref.xht": [ + "71442651fdf26262d45ba0a47c38f042033b62d8", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-016-ref.xht": [ + "a0e2c28a69beeff7e260d570c1adb8c4ca26d65a", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-insert-016a.xht": [ + "8313de13ed077cadb423582ed33aad02a60f81ac", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-016b.xht": [ + "9d7ea9c94bbb29b5c901ed4c054967fd4d7ae994", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-insert-017-ref.xht": [ + "f27bbc36fa2131fc0aac868ebd5526898925407f", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-insert-017.xht": [ + "4f1466e3da206a293d71eeb741631df9ac2eab0c", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-margins-001-ref.xht": [ + "ee47fbc1321c52d1479407d9e18dca6e7267a8ea", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-margins-001a.xht": [ + "d7b463ce6dc9590cc6b5b0d950ceaaef7b3d3d40", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-margins-001b.xht": [ + "9066ecaa7ad90c4ebafa72b53883f514021e852c", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-margins-002-ref.xht": [ + "5fcd971623c0d69c612c9ebeccf814ab8371deff", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-margins-002a.xht": [ + "2423c53d5057a149e14dd9a82f1cebe13b1725ef", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-margins-002b.xht": [ + "ea25453f00be593ec5c784755f75b5ef56c61662", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-nested-001-ref.xht": [ + "5d58cfe20981b4ae79945e3707359b0b6fb61a7e", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-nested-001.xht": [ + "b930b05c51c1e566e3077845f27fe111c474d98a", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-nested-002-ref.xht": [ + "839b6221c535d1f830ea5b348a6e48e4279abbc3", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-nested-002.xht": [ + "630ef33cd66dabb49d719871bbac134171f581e6", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-percents-001-ref.xht": [ + "8f953b3b941eb077491d4ec644778da93934b736", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-percents-001.xht": [ + "0096a1aec469c6b8dc352b2cf287521ee19f75c1", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-remove-000-ref.xht": [ + "7b03f641ec3dd3001e1cf764e87269d823f2ac0b", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-remove-000.xht": [ + "bfd1f77ce979074b7605337048adfdd297f57d34", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-remove-001-nosplit-ref.xht": [ + "aa96c213bea50849c5a545cac31774d6ee4329a9", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-remove-001-ref.xht": [ + "50c38dd084f7f8c5b328b072b0e41730254c0f55", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-remove-001.xht": [ + "0eda7b89b1608782c7992c2e6386e924cb4a543c", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-remove-002-ref.xht": [ + "faf61d5b1c4992db05bfac96a20f13c9b3987a42", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-remove-002.xht": [ + "37fdda3e745a36edc18b33752d6fe7e750d20843", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-remove-003-nosplit-ref.xht": [ + "673cbea48a9934754574b047319452d6b6c4d5f6", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-remove-003-ref.xht": [ + "d959b98e1c45cbc1ea195135e13cfccee1795e3e", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-remove-003.xht": [ + "11fcff7d378cc948f585f964a6a51228fb91e42e", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-remove-004-nosplit-ref.xht": [ + "73a2e36a7e10d11dd85368225b53881e24a36d2d", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-remove-004-ref.xht": [ + "9d720332342cc626884a29aba93218bd56bcff3f", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-remove-004.xht": [ + "1e709ff0ec241627aaeea298659f0b33a34bc89c", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-remove-005-nosplit-ref.xht": [ + "54bdabf5ec811b76a74560cde4ee6010e86c8275", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-remove-005-ref.xht": [ + "42469d7cec7772ac30f4a6ba6c3cc378f189a307", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-remove-005.xht": [ + "6e4049a2a8b6a0adfe93b7801c1b61d06c1b7617", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-remove-006-nosplit-ref.xht": [ + "e0dc693efbb6a3df8686c506b2b6f5784d3bb075", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-remove-006-ref.xht": [ + "f75d77efc95dc5b9d2dd5b577d0da35aad652129", + "reftest_node" + ], + "css/CSS2/normal-flow/block-in-inline-remove-006.xht": [ + "42abc5959e404cff13853d6180ce677b3b6ef997", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-whitespace-001-ref.xht": [ + "e4327e8a07e9d01355d75b0a0e53149855a1abd7", + "support" + ], + "css/CSS2/normal-flow/block-in-inline-whitespace-001a.xht": [ + "c02306a51f3de6912db0059b5b6cbeff54c27c86", + "reftest" + ], + "css/CSS2/normal-flow/block-in-inline-whitespace-001b.xht": [ + "f3b57958b2e1cc01e4dbec2059c664b8e5884592", + "reftest" + ], + "css/CSS2/normal-flow/block-non-replaced-height-001-ref.xht": [ + "f0b8599bd66f04c0dcf11119e90a4e1fe0009f40", + "support" + ], + "css/CSS2/normal-flow/block-non-replaced-height-001.xht": [ + "6be912cc93de309e98e9b1d675f139170df9075a", + "reftest" + ], + "css/CSS2/normal-flow/block-non-replaced-height-002.xht": [ + "5d7d43bc946951f25e39f5daa50df039d2ff4cc2", + "visual" + ], + "css/CSS2/normal-flow/block-non-replaced-height-003.xht": [ + "008427da98e649d4d6f5f089f829bf9ab94ec22a", + "visual" + ], + "css/CSS2/normal-flow/block-non-replaced-height-004.xht": [ + "c2e5b2de37dacf1f9a31f1d37ffc08254e47166a", + "visual" + ], + "css/CSS2/normal-flow/block-non-replaced-height-005-ref.xht": [ + "10f5a0f44131e4842aaf600b4d507898f173e0d3", + "support" + ], + "css/CSS2/normal-flow/block-non-replaced-height-005.xht": [ + "f3de88bd4bea6fb07078515613413f287f97a6cb", + "reftest" + ], + "css/CSS2/normal-flow/block-non-replaced-height-006.xht": [ + "8519056bc7aee798977bfdf166398271beaed8f2", + "visual" + ], + "css/CSS2/normal-flow/block-non-replaced-height-007.xht": [ + "79008d16b3135b7c211ce065ee16b5ec1eb9198c", + "visual" + ], + "css/CSS2/normal-flow/block-non-replaced-height-008.xht": [ + "0e596535095adadeb938df5a5f200a65c60e2914", + "visual" + ], + "css/CSS2/normal-flow/block-non-replaced-height-009-ref.xht": [ + "cb2ef7a1730b9a337a2485c723c501a6ccae413f", + "support" + ], + "css/CSS2/normal-flow/block-non-replaced-height-009.xht": [ + "78ce78dcbfeb856a8358fe09bf2c287eed090a2d", + "visual" + ], + "css/CSS2/normal-flow/block-non-replaced-height-010.xht": [ + "ccf20cc8ac74d85e494244d2b7e4dc054e2f8f1a", + "visual" + ], + "css/CSS2/normal-flow/block-non-replaced-height-011.xht": [ + "a3d2bae42b049d44c9e49d93438a515fed75edf0", + "reftest" + ], + "css/CSS2/normal-flow/block-non-replaced-height-012.xht": [ + "2d0feba8f0f27e37ff2e78bafd939659212e8fdb", + "visual" + ], + "css/CSS2/normal-flow/block-non-replaced-height-013.xht": [ + "fa18a0f7874aea34cce328804a569a12df9b1228", + "reftest" + ], + "css/CSS2/normal-flow/block-non-replaced-height-014.xht": [ + "f8dbc3dcb2c628068c961aff6119912e7e7aeed1", + "visual" + ], + "css/CSS2/normal-flow/block-non-replaced-height-015.xht": [ + "dcef482413b67558e64706c6614b64984fd9a4eb", + "visual" + ], + "css/CSS2/normal-flow/block-non-replaced-height-016.xht": [ + "5fa1c0740ef7cd78f6c439c721ac7df98f5a71f9", + "visual" + ], + "css/CSS2/normal-flow/block-non-replaced-width-001-ref.xht": [ + "6050751b7a561ddf4a43b378608088101142901e", + "support" + ], + "css/CSS2/normal-flow/block-non-replaced-width-001.xht": [ + "56e1bbbe0760c3b1cfde1a07fdccbc250a1941c9", + "reftest" + ], + "css/CSS2/normal-flow/block-non-replaced-width-002.xht": [ + "bbec2294b9cfa2efcc61aa750255d0b951a4ae87", + "visual" + ], + "css/CSS2/normal-flow/block-non-replaced-width-003.xht": [ + "083709a7a05c35b0c9644c1a09a9816d9f0db643", + "reftest" + ], + "css/CSS2/normal-flow/block-non-replaced-width-004-ref.xht": [ + "240dc6e443df88682b95fce2236a0a406b920194", + "support" + ], + "css/CSS2/normal-flow/block-non-replaced-width-004.xht": [ + "1e5f8a3c5a98881786cb5eda409c9647ad8130f2", + "reftest" + ], + "css/CSS2/normal-flow/block-non-replaced-width-005-ref.xht": [ + "b8009da8ddd5e0f4343bd78ec8fdc4c1f476c6d9", + "support" + ], + "css/CSS2/normal-flow/block-non-replaced-width-005.xht": [ + "c74a2b60b83a2fddc56fa45db931cc50ae1715ab", + "reftest" + ], + "css/CSS2/normal-flow/block-non-replaced-width-006.xht": [ + "f5a9394d7d30ceb41c2ba213c6e03006061ac661", + "reftest" + ], + "css/CSS2/normal-flow/block-non-replaced-width-007-ref.xht": [ + "63fc5b7c8ab3b02560b46c34a3af6f02b44a80ed", + "support" + ], + "css/CSS2/normal-flow/block-non-replaced-width-007.xht": [ + "576c5437e46b263cae380f16adafc8c887e433ed", + "reftest" + ], + "css/CSS2/normal-flow/block-non-replaced-width-008.xht": [ + "79b1804fe17f9d5d8c64573ebe5dd248aee8f89a", + "visual" + ], + "css/CSS2/normal-flow/block-replaced-height-001-ref.xht": [ + "37b18d0429a6cb5608398329687b1fa85fdc7e8e", + "support" + ], + "css/CSS2/normal-flow/block-replaced-height-001.xht": [ + "e06af81a0e8f3593bd7caa703e5a63c2c9f00064", + "reftest" + ], + "css/CSS2/normal-flow/block-replaced-height-002-ref.xht": [ + "f42492c135aeff7c2fc882fcefeccbbc5959f1d0", + "support" + ], + "css/CSS2/normal-flow/block-replaced-height-002.xht": [ + "9be1ef0797b6d22cea7ba146efb765a289d50b73", + "reftest" + ], + "css/CSS2/normal-flow/block-replaced-height-003.xht": [ + "bba232931e1cefd483f573a69d85d58cf94429ad", + "visual" + ], + "css/CSS2/normal-flow/block-replaced-height-004-ref.xht": [ + "78fd58a0e41ee8c7b2a293bce427edd84fc2a881", + "support" + ], + "css/CSS2/normal-flow/block-replaced-height-004.xht": [ + "5f0d36bea5e99a780899e5d1d72ca8939860562b", + "reftest" + ], + "css/CSS2/normal-flow/block-replaced-height-005-ref.xht": [ + "817662389eb29eb20721e1e2ba7a744d1a25293c", + "support" + ], + "css/CSS2/normal-flow/block-replaced-height-005.xht": [ + "0ffe5556a37b095363bb2fc7a80ed0ec69bade90", + "reftest" + ], + "css/CSS2/normal-flow/block-replaced-height-006-ref.xht": [ + "2b44563ee5c5a397a5b165e7ce1b42ead71600bd", + "support" + ], + "css/CSS2/normal-flow/block-replaced-height-006.xht": [ + "96624c82b3c23ec6d3f0e6626b50f060fd360baa", + "reftest" + ], + "css/CSS2/normal-flow/block-replaced-height-007.xht": [ + "b78ab30da667ef3b2199e5d1a900c1e4bf149231", + "reftest" + ], + "css/CSS2/normal-flow/block-replaced-width-001.xht": [ + "a928c098d4ee94909c65f355811de63063a7b54e", + "visual" + ], + "css/CSS2/normal-flow/block-replaced-width-002-ref.xht": [ + "cea3e66d7feadc25c0a511761099551b25c9aee2", + "support" + ], + "css/CSS2/normal-flow/block-replaced-width-002.xht": [ + "bcb5d5788e93b3beae3478cc85b186ed57d9b2d0", + "reftest" + ], + "css/CSS2/normal-flow/block-replaced-width-003.xht": [ + "92760240ba151b81cf3d010adb047f22e12ae3fe", + "visual" + ], + "css/CSS2/normal-flow/block-replaced-width-004.xht": [ + "4ff887088bb28a38ebde29d8df55ceb8f33d936a", + "visual" + ], + "css/CSS2/normal-flow/block-replaced-width-006-ref.xht": [ + "1d5bf757f40b0b64526f5a5e2044c24c86173abe", + "support" + ], + "css/CSS2/normal-flow/block-replaced-width-006.xht": [ + "c1c3492f6e38fbb49ea975a5e0e03293411f597d", + "reftest" + ], + "css/CSS2/normal-flow/blocks-011-ref.xht": [ + "1c44dcaf82cc7182bbf5e66a2b30599d4f45e9bc", + "support" + ], + "css/CSS2/normal-flow/blocks-011.xht": [ + "fbf018e174d30366c0daa46add4e883706774687", + "reftest" + ], + "css/CSS2/normal-flow/blocks-012.xht": [ + "043ffead5811291711c4ccab0fea821d59ee6cc4", + "reftest" + ], + "css/CSS2/normal-flow/blocks-013-ref.xht": [ + "17ed77546b3c705a1d75ff879fb4533dbfd7b746", + "support" + ], + "css/CSS2/normal-flow/blocks-013.xht": [ + "28c17ebddc657f28d5cd057e8e86e15f6ecb98c0", + "reftest" + ], + "css/CSS2/normal-flow/blocks-014-ref.xht": [ + "36f6f89c53883851b0826f78d3a7f9ec2cf3e9ca", + "support" + ], + "css/CSS2/normal-flow/blocks-014.xht": [ + "91729944af73f78008cce3d95245e1c9169d656b", + "reftest" + ], + "css/CSS2/normal-flow/blocks-015.xht": [ + "f54d89665132240a3d1613d63c1569dbe961a66e", + "reftest" + ], + "css/CSS2/normal-flow/blocks-016.xht": [ + "7b09c50b9d2b454cb01573251872bcb466c027ba", + "reftest" + ], + "css/CSS2/normal-flow/blocks-017.xht": [ + "362bc530774ff25fadc211edb31f97760796cfc0", + "reftest" + ], + "css/CSS2/normal-flow/blocks-018-ref.xht": [ + "e844599b19d77a17e831d42eff03050d0aa07c15", + "support" + ], + "css/CSS2/normal-flow/blocks-018.xht": [ + "76d91ce8d6a004905e62bc345a01bb4ab3563a42", + "reftest" + ], + "css/CSS2/normal-flow/blocks-019-ref.xht": [ + "384097b911a22b2e353c7b32952a7e21434793a2", + "support" + ], + "css/CSS2/normal-flow/blocks-019.xht": [ + "f5cbaa9c165cc53354a29c70a6f8ecee30c4f04f", + "reftest" + ], + "css/CSS2/normal-flow/blocks-020-ref.xht": [ + "60eb69c74cd4f0648195286795b1c5895e04c780", + "support" + ], + "css/CSS2/normal-flow/blocks-020.xht": [ + "d27d91558fb0329ba7fc969d6d97475bcab6eb7e", + "reftest" + ], + "css/CSS2/normal-flow/blocks-021.xht": [ + "bfc7988ed569f244321566e4f98a3f41e5d621c9", + "reftest" + ], + "css/CSS2/normal-flow/blocks-022.xht": [ + "d342486663652acc0a24fe0672c66354ef93b285", + "reftest" + ], + "css/CSS2/normal-flow/blocks-025-ref.xht": [ + "4d2cba87e412defd1e4d22de09a53b9c880c2d34", + "support" + ], + "css/CSS2/normal-flow/blocks-025.xht": [ + "0bcd86ff0c5348c00d1934b3b050d927b31d55ec", + "reftest" + ], + "css/CSS2/normal-flow/blocks-026-ref.xht": [ + "ca3ff590e715ab027ef5a0b59fe46ddbef5230cc", + "support" + ], + "css/CSS2/normal-flow/blocks-026.xht": [ + "278b3ac2e50541d708a4a432082d8e32e1e50f31", + "reftest" + ], + "css/CSS2/normal-flow/blocks-027.xht": [ + "b73d5f538b0e68edbc38a26aad9a582048c8fe9a", + "visual" + ], + "css/CSS2/normal-flow/blocks-028.xht": [ + "9504db8cd151d03d893ebaa65e664463a7212e35", + "visual" + ], + "css/CSS2/normal-flow/height-001-ref.xht": [ + "2dc2e2695397e97f50ff17f22091a0975a6a5dd2", + "support" + ], + "css/CSS2/normal-flow/height-001.xht": [ + "3ceb9a5320bac49f0b08eef25b24689101cd06d2", + "reftest" + ], + "css/CSS2/normal-flow/height-002.xht": [ + "a732d5198faf21563f5840b71c7da6b3d53bce73", + "reftest" + ], + "css/CSS2/normal-flow/height-003-ref.xht": [ + "4ce04bcd935860dd2ccf5a4905b886ed6398adc3", + "support" + ], + "css/CSS2/normal-flow/height-003.xht": [ + "3e560d3755f8dba7981a26ff41df5c581f0bb568", + "reftest" + ], + "css/CSS2/normal-flow/height-004.xht": [ + "78fa2f207f49c5bbd14dd744768b64b4e06caf7c", + "reftest" + ], + "css/CSS2/normal-flow/height-005.xht": [ + "a787bf4d3bb5578036c4cccb8487cd6b2fdffe90", + "reftest" + ], + "css/CSS2/normal-flow/height-006-ref.xht": [ + "378ab28391f26e02560cf65673042c364c2589f7", + "support" + ], + "css/CSS2/normal-flow/height-006.xht": [ + "fcde8ed465a76ed1cfac7fbb8f324e4bf583c509", + "reftest" + ], + "css/CSS2/normal-flow/height-007.xht": [ + "bb2903f0d9ce20ca8f137fc82ab529b8214cdaa9", + "reftest" + ], + "css/CSS2/normal-flow/height-012.xht": [ + "e7a0ec7454d165fbd21b2679a67ac8a41b178b46", + "reftest" + ], + "css/CSS2/normal-flow/height-013.xht": [ + "865e59b998d98f4378099316c9a15773329bd3d5", + "reftest" + ], + "css/CSS2/normal-flow/height-014.xht": [ + "750398ff5a4f49dacf05b254540b8d769183a071", + "visual" + ], + "css/CSS2/normal-flow/height-015.xht": [ + "0f3dc99c43b676f7cf3f1f889b9b0b5b849d01b5", + "reftest" + ], + "css/CSS2/normal-flow/height-016.xht": [ + "6195cc9b89d529fe87c7f909f56823caa811ee5b", + "reftest" + ], + "css/CSS2/normal-flow/height-017.xht": [ + "d77a298699704a5a9fc021dc6e8406d3c14fc549", + "reftest" + ], + "css/CSS2/normal-flow/height-018.xht": [ + "32478b16d83d231b1897fe99114940e7a9911d48", + "reftest" + ], + "css/CSS2/normal-flow/height-023.xht": [ + "633399a56d65a22a71348fe9bfea7996a53a06ea", + "reftest" + ], + "css/CSS2/normal-flow/height-024.xht": [ + "7310ae91b8e7846446d8e034e8e70a5e48d7ca11", + "reftest" + ], + "css/CSS2/normal-flow/height-025-ref.xht": [ + "d68392788eea0497b2925fcc3f2e0d70c23516a6", + "support" + ], + "css/CSS2/normal-flow/height-025.xht": [ + "0edf9e33a22147967d087c9e55be48c64f44846c", + "reftest" + ], + "css/CSS2/normal-flow/height-026.xht": [ + "29441e5c69f40b308f20e34b40847a142dce29bc", + "reftest" + ], + "css/CSS2/normal-flow/height-027.xht": [ + "12ab9735782cea014bb94754715d8c14ad30419f", + "reftest" + ], + "css/CSS2/normal-flow/height-028.xht": [ + "48b3d5e1dbd9c238452a4818a0b53aca1f70762f", + "reftest" + ], + "css/CSS2/normal-flow/height-029.xht": [ + "2396683b64eabc6fe003541bd46baeed98e19476", + "reftest" + ], + "css/CSS2/normal-flow/height-034.xht": [ + "2c4e18d0f74bdaefa3044b48baefff9355eac419", + "reftest" + ], + "css/CSS2/normal-flow/height-035.xht": [ + "0148d41ae1d5f2075adfe0ce7e32dff70fccac7b", + "reftest" + ], + "css/CSS2/normal-flow/height-036.xht": [ + "aecaec798534d7ceb5a259e2adb703398b5104a5", + "visual" + ], + "css/CSS2/normal-flow/height-037.xht": [ + "8087048e30a3e31ad1b25a15a9888314c98ac763", + "reftest" + ], + "css/CSS2/normal-flow/height-038.xht": [ + "0a44a869aebbaea36e4f3470f1ffc5ab0820a337", + "reftest" + ], + "css/CSS2/normal-flow/height-039.xht": [ + "7466b619e52a884b7ceed6cc336746eb3652d34e", + "reftest" + ], + "css/CSS2/normal-flow/height-040.xht": [ + "3900861a538eef85657b410290b2e7d7b83f2a7e", + "reftest" + ], + "css/CSS2/normal-flow/height-045.xht": [ + "4cc20067d9406754ad8e3fed0f541c4a76851990", + "reftest" + ], + "css/CSS2/normal-flow/height-046.xht": [ + "eac9503d3df982614ac729aa6ae6fb1c417e4aa3", + "reftest" + ], + "css/CSS2/normal-flow/height-047.xht": [ + "9d7d490eea1594220409c7fb40997516e6e0901c", + "visual" + ], + "css/CSS2/normal-flow/height-048.xht": [ + "cda106e758b224c451531f87e95a1521e26cc846", + "reftest" + ], + "css/CSS2/normal-flow/height-049.xht": [ + "f10b7426a06d9eb7a61a39acbf3c6e0657c4ef91", + "reftest" + ], + "css/CSS2/normal-flow/height-050.xht": [ + "9c24d58cf14e4b5722c747a69fe18d083bbee385", + "reftest" + ], + "css/CSS2/normal-flow/height-051.xht": [ + "efec966a85c57690f31b95b8d076938e91acbd6c", + "reftest" + ], + "css/CSS2/normal-flow/height-056.xht": [ + "b6d81ade6514638351c66ee82c59ee98445ac397", + "reftest" + ], + "css/CSS2/normal-flow/height-057.xht": [ + "8034b23cfe0d5109342a939f4a0c1fd09d641bc9", + "reftest" + ], + "css/CSS2/normal-flow/height-058-ref.xht": [ + "3d431e0270668dcad9b4cd5dda25018b7fa0b58f", + "support" + ], + "css/CSS2/normal-flow/height-058.xht": [ + "8344cf467b804c5f14b454a94a872da8daedf304", + "reftest" + ], + "css/CSS2/normal-flow/height-059.xht": [ + "19bf993a3071bdb0c366b690858d1e8ee440b901", + "reftest" + ], + "css/CSS2/normal-flow/height-060.xht": [ + "3cad011d1552fae81104cb63d6063d137bc1fb58", + "reftest" + ], + "css/CSS2/normal-flow/height-061-ref.xht": [ + "542e12bc35bdce838799f8778cebd9b8ad935567", + "support" + ], + "css/CSS2/normal-flow/height-061.xht": [ + "0f82327cf371b6777a969a65169b5c267dc41d10", + "reftest" + ], + "css/CSS2/normal-flow/height-062.xht": [ + "73f5868c4de94e1393e800b05a6e1f1f09b1c027", + "reftest" + ], + "css/CSS2/normal-flow/height-067-ref.xht": [ + "28894e3c1891417a7b47a39e1a56c65a4360be12", + "support" + ], + "css/CSS2/normal-flow/height-067.xht": [ + "0d4e7ebe89fffb080b6f334280a4d37cf7b3b4e1", + "reftest" + ], + "css/CSS2/normal-flow/height-068.xht": [ + "378215da3765c3982073cd3819a4885c87a21e1e", + "reftest" + ], + "css/CSS2/normal-flow/height-069-ref.xht": [ + "eb77af0d13229c6c5b184b99e996a5f2746d6a3e", + "support" + ], + "css/CSS2/normal-flow/height-069.xht": [ + "b98d63f411454d4f3b046a4923865fe544508d16", + "reftest" + ], + "css/CSS2/normal-flow/height-070.xht": [ + "5746cd6cfb155b268f476b846abe6fb117da234d", + "reftest" + ], + "css/CSS2/normal-flow/height-071.xht": [ + "211de6fc85e6280bb65abdb1be83a6c9379b6ae2", + "reftest" + ], + "css/CSS2/normal-flow/height-072-ref.xht": [ + "982a57e61b255b06cf81a0e154c00a0ddb5d77fd", + "support" + ], + "css/CSS2/normal-flow/height-072.xht": [ + "c577a151aeab1c0b8f4cac7279d3ef958057f312", + "reftest" + ], + "css/CSS2/normal-flow/height-073.xht": [ + "816e1615d378e60ef3d2de6b7036e75846e4b1b1", + "reftest" + ], + "css/CSS2/normal-flow/height-078.xht": [ + "64e14a777fc737a5eb047af2f38e4d962116c69e", + "reftest" + ], + "css/CSS2/normal-flow/height-079.xht": [ + "5a658733671a8c6cfa4b7fb17712f8af9dc16cc7", + "reftest" + ], + "css/CSS2/normal-flow/height-080-ref.xht": [ + "d68392788eea0497b2925fcc3f2e0d70c23516a6", + "support" + ], + "css/CSS2/normal-flow/height-080.xht": [ + "73076bad218ad076cc0304ef7cecf2c05ef6e8fa", + "reftest" + ], + "css/CSS2/normal-flow/height-081.xht": [ + "07343a7599f0bdcb71d9bd21d0c2d9780da55cc5", + "reftest" + ], + "css/CSS2/normal-flow/height-082.xht": [ + "d0cbab613e38b2ac708778ac850408d4935d3658", + "reftest" + ], + "css/CSS2/normal-flow/height-083.xht": [ + "80643ae280e8150c1749c72cf9cc432c1dd654e4", + "reftest" + ], + "css/CSS2/normal-flow/height-084.xht": [ + "610e277b2c89d495107b3308d9c3d38cf9198fbb", + "reftest" + ], + "css/CSS2/normal-flow/height-089.xht": [ + "90783f30cc01dc2548cbd09fe330c607fef63477", + "reftest" + ], + "css/CSS2/normal-flow/height-090.xht": [ + "5b01403af25b4465b041d71290921471066f55fa", + "reftest" + ], + "css/CSS2/normal-flow/height-091.xht": [ + "5b4bcf18d7f3bd9810d6f664be2c77cda7e372c5", + "reftest" + ], + "css/CSS2/normal-flow/height-092.xht": [ + "3ae9561fcbfb9abe5c2fabd9cb1efd1133478c28", + "reftest" + ], + "css/CSS2/normal-flow/height-093.xht": [ + "df0f4e70ce4079eb230b6907da2ec3dae0661c19", + "reftest" + ], + "css/CSS2/normal-flow/height-094.xht": [ + "87bcef7d2bb8c890a524e27acc8f0f964161a2e5", + "reftest" + ], + "css/CSS2/normal-flow/height-095.xht": [ + "af3f5ed0ae7422ad4e8b65f1265a024b161ff5c3", + "reftest" + ], + "css/CSS2/normal-flow/height-100.xht": [ + "373f0b64d5b10e772f72ae52a2d33dc172aa9a3e", + "reftest" + ], + "css/CSS2/normal-flow/height-101.xht": [ + "36925c10083fffc0bc5d2f6dcb1de338dc1119c1", + "reftest" + ], + "css/CSS2/normal-flow/height-102.xht": [ + "dd102f3cb29d258ba086d9c4599b64310d7a2e7c", + "reftest" + ], + "css/CSS2/normal-flow/height-103.xht": [ + "0123f81ad2ff21c3610e8780972e0122ce89d964", + "reftest" + ], + "css/CSS2/normal-flow/height-104.xht": [ + "761bd77308642e29eb809614443012b30a72fd99", + "reftest" + ], + "css/CSS2/normal-flow/height-111-ref.xht": [ + "133414879b8aa3f4b1b385d414ed18fb1d8a9a1b", + "support" + ], + "css/CSS2/normal-flow/height-111.xht": [ + "10b721c5ace1c712844fdfab47b1d880764bd2fc", + "reftest" + ], + "css/CSS2/normal-flow/height-112-ref.xht": [ + "dc84df5c36956804bb1a56f98514c700a05a0850", + "support" + ], + "css/CSS2/normal-flow/height-112.xht": [ + "3b8f75c93f7efa9bbab8d659272c5085cda46a23", + "reftest" + ], + "css/CSS2/normal-flow/height-113-ref.xht": [ + "c7664817a7c05b436af07bf3b0d4a28ea8fef6e5", + "support" + ], + "css/CSS2/normal-flow/height-113.xht": [ + "9ccd017c2848b54379463d2403edfe07fa5ea9dd", + "reftest" + ], + "css/CSS2/normal-flow/height-114-ref.xht": [ + "37e3f1c9826efbc41b630e37999292385d685ebd", + "support" + ], + "css/CSS2/normal-flow/height-114.xht": [ + "cd3604caa00255aa23969408c983957151abba7f", + "reftest" + ], + "css/CSS2/normal-flow/height-applies-to-001.xht": [ + "2c6f12e99d854b435ce32392552d40e54a008fcc", + "visual" + ], + "css/CSS2/normal-flow/height-applies-to-002.xht": [ + "6923e822992fc25ebc6555ca415323fcba7e2fcc", + "visual" + ], + "css/CSS2/normal-flow/height-applies-to-003.xht": [ + "e53ab578071f2433783e99e234334449f8c96944", + "visual" + ], + "css/CSS2/normal-flow/height-applies-to-004.xht": [ + "358ea4e8ca670d3862c801d9576431391c5f51fb", + "reftest" + ], + "css/CSS2/normal-flow/height-applies-to-005.xht": [ + "c336048a3ccd8db4bacc27b0d27793668359096e", + "reftest" + ], + "css/CSS2/normal-flow/height-applies-to-006.xht": [ + "fb43525b6d930dceffdb9aa33e911368f6599a37", + "reftest" + ], + "css/CSS2/normal-flow/height-applies-to-007.xht": [ + "3b0b581e4821ecd1b4c2952680fa42aeddb1894f", + "reftest" + ], + "css/CSS2/normal-flow/height-applies-to-008.xht": [ + "841b1fc2f0a55a21e80b44bfca6f59617af7f746", + "reftest" + ], + "css/CSS2/normal-flow/height-applies-to-009.xht": [ + "a1aae9471c6ef3a91ede17f77ad6b387af1bf9ae", + "reftest" + ], + "css/CSS2/normal-flow/height-applies-to-010.xht": [ + "35c046ad618c7bf437f40e82e6c282d0037b9aae", + "visual" + ], + "css/CSS2/normal-flow/height-applies-to-012.xht": [ + "7907119a8a04e26cd1d2c9cdf693b69e4cc89664", + "reftest" + ], + "css/CSS2/normal-flow/height-applies-to-013.xht": [ + "3ceac10a106298d74c3f03c41479b2fdc4134159", + "reftest" + ], + "css/CSS2/normal-flow/height-applies-to-014.xht": [ + "c33cbfd3366c06c14e5ff7b0857b1527b88d2fc0", + "reftest" + ], + "css/CSS2/normal-flow/height-applies-to-015.xht": [ + "1c632d1fb331f2c51feb96f185d06b487f8701ba", + "reftest" + ], + "css/CSS2/normal-flow/height-applies-to-016.xht": [ + "2e0922ea3aecbdd026766732dd324251a6adbd3e", + "reftest" + ], + "css/CSS2/normal-flow/height-inherit-001.xht": [ + "fda6ceaafbe490f62085a14ff8c083f403516112", + "reftest" + ], + "css/CSS2/normal-flow/height-percentage-001-ref.xht": [ + "17e6e0867b3f86f8c8aa1c1de5aabbb299d7d559", + "support" + ], + "css/CSS2/normal-flow/height-percentage-001.xht": [ + "26365dfc2c60a30d77477d88dd65f76ff76adc06", + "reftest" + ], + "css/CSS2/normal-flow/height-percentage-002.xht": [ + "c12decf00a17dc989e35acbf44b398a50bf692eb", + "reftest" + ], + "css/CSS2/normal-flow/height-percentage-003-ref.xht": [ + "8c90dbdd12538da9cd76cf396333402c111240ef", + "support" + ], + "css/CSS2/normal-flow/height-percentage-003.xht": [ + "319b1c9c9d59ec846dc868c232db53060ffd5381", + "reftest" + ], + "css/CSS2/normal-flow/height-percentage-004.xht": [ + "771a733eacd9bc905ac738ec8695acf16ad61f32", + "reftest" + ], + "css/CSS2/normal-flow/height-percentage-005.xht": [ + "d95500bd5b09acdbb2c7d895b0c52ef90f415cd4", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-000-ref.xht": [ + "dc3c64445e4916314016b3ff9c8396f04d4019a7", + "support" + ], + "css/CSS2/normal-flow/inline-block-000.xht": [ + "1272e3b673e9eedb7cfca0c2b835405ba5369d4b", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-001.xht": [ + "f6b03f5a6e64ac8dfedde177a75fd986976c4315", + "visual" + ], + "css/CSS2/normal-flow/inline-block-002.xht": [ + "6aa217a2259ea4b3fff58c7daf08d961668af34c", + "manual" + ], + "css/CSS2/normal-flow/inline-block-003.xht": [ + "b4b840068f3be1670720f23d227c7f29d54e4338", + "manual" + ], + "css/CSS2/normal-flow/inline-block-004.xht": [ + "e2bc9ca6277d18cd47851bc8f0b13a489516e3e8", + "manual" + ], + "css/CSS2/normal-flow/inline-block-005.xht": [ + "52968744f726ed1b65440b96f0e660a526f782a5", + "manual" + ], + "css/CSS2/normal-flow/inline-block-height-001-ref.xht": [ + "dcdb06d376765bdc237fc2e5d726fa6e737f5a2b", + "support" + ], + "css/CSS2/normal-flow/inline-block-height-001.xht": [ + "2be9dc7b2a60c285d8803190bc9ecde5a413b0a9", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-height-002-ref.xht": [ + "e75d3bc8d0bae645f9737d4a7ce76aee7467c07b", + "support" + ], + "css/CSS2/normal-flow/inline-block-height-002.xht": [ + "d763c7e1232af7c2770ca3fd8dd6b00a7da3702e", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-non-replaced-height-001.xht": [ + "e60f09c54dbe77b593844d3bf22aaff9065d3799", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-non-replaced-height-002.xht": [ + "4938a71e887651f0b8ebf4ee312f4350edc279ba", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-001-ref.xht": [ + "f511a7ba8d77027a043693a788dcd1e420c43b97", + "support" + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-001.xht": [ + "d5d32dc32592a3f69ba8b317d49e4fd023892def", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-002-ref.xht": [ + "612e72691531e9b0dcf05ef57cae9f2d9309b152", + "support" + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-002.xht": [ + "220222df72a7b5fe9e446a07cc19dc988c251de6", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-003.xht": [ + "1d3b007ebf5e081b78a0ea308be014514fe32f51", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-004.xht": [ + "eb412b3f3966755869727acfc2996630d446c136", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-non-replaced-width-005.xht": [ + "a9ce62ee19362850f09b72a059088048171f86c7", + "visual" + ], + "css/CSS2/normal-flow/inline-block-replaced-height-001.xht": [ + "45197ab93159b2edfaee5b17e69312e565fe09aa", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-replaced-height-002.xht": [ + "a39057ce4be49ec772c697d42926724a00c2f6ff", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-replaced-height-003-ref.xht": [ + "4646ea93db13c8d1bcfaca8bd5433e64dfd2c499", + "support" + ], + "css/CSS2/normal-flow/inline-block-replaced-height-003.xht": [ + "efb96bcb5766a6fdd7ebddeb90aaab6c57aff200", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-replaced-height-004.xht": [ + "140aea47e8092472fe3bdc7f39a02d64774111f0", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-replaced-height-005.xht": [ + "88cadd1e4b0957e5eb342eab8d114d32987ab2f4", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-replaced-height-006.xht": [ + "4ec9ade5b17f73196fc78157c1f91c74c7389925", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-replaced-height-007.xht": [ + "df271d3b20dc7ebd031ed3a3bcb51e0267fe31ad", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-replaced-height-008.xht": [ + "803b17c654bfc2c8b946ff9a5b21807024a6dfb2", + "manual" + ], + "css/CSS2/normal-flow/inline-block-replaced-height-009.xht": [ + "85b090f05680f4b1607933e183d14e598c4bc47f", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-replaced-width-001-ref.xht": [ + "82257408d5d7af0c3095cdcac70e009744c38047", + "support" + ], + "css/CSS2/normal-flow/inline-block-replaced-width-001.xht": [ + "aef5583d1a63bf1ba0069895d275e15b4621a98f", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-replaced-width-002-ref.xht": [ + "12711843edd716cbc0ca275b9de201ed58cb414c", + "support" + ], + "css/CSS2/normal-flow/inline-block-replaced-width-002.xht": [ + "f327b413e7df8f6238b14f22470ff22257eb623e", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-replaced-width-003-ref.xht": [ + "148b6634420f2ebe423da89c6ced6a03015712e8", + "support" + ], + "css/CSS2/normal-flow/inline-block-replaced-width-003.xht": [ + "5e3889cadf9f90885e7197f7a1f0b6bab3d01b82", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-replaced-width-004.xht": [ + "0ed048c02c1eb987e4c5318a534dfb8b346f7b71", + "visual" + ], + "css/CSS2/normal-flow/inline-block-replaced-width-006-ref.xht": [ + "44a7a19d15014586c6e12acd1a47e6ac21d1b59d", + "support" + ], + "css/CSS2/normal-flow/inline-block-replaced-width-006.xht": [ + "f443400c33fe75cccbf4eb9cc5959ed47560d997", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-replaced-width-007.xht": [ + "575ea552b5a7660dee8f8706363fac5edf5c0a0c", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-replaced-width-008.xht": [ + "bc67d9b62a07a1859b77527f2776776b15c1654a", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-valign-001-ref.xht": [ + "c773e1facaddf902760acbb268ea4468f5a29882", + "support" + ], + "css/CSS2/normal-flow/inline-block-valign-001.xht": [ + "3a43e4ceb49c4a323b47f88af8920b7dcb24aa13", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-valign-002-ref.xht": [ + "5002dfab844b7e39e054e5c516a04601fa2e077c", + "support" + ], + "css/CSS2/normal-flow/inline-block-valign-002.xht": [ + "b889484e6ebb44169b4158fbb852602ec6b1058d", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-width-001-ref.xht": [ + "776941247c27354b1880c245e1cb662dda3a4d5d", + "support" + ], + "css/CSS2/normal-flow/inline-block-width-001a.xht": [ + "7e3bc81b3d5192936f7c5786645a495ead8e07c7", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-width-001b.xht": [ + "788a6097b9cf0c7f824dc328fc0bc7e64d6936c4", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-width-002-ref.xht": [ + "ceab9762938a67c22a0f340da40144f51542d2c1", + "support" + ], + "css/CSS2/normal-flow/inline-block-width-002a.xht": [ + "08191dd367d3af669c666691ce58cc94df36d4dd", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-width-002b.xht": [ + "5376b155a2dfb2f9e0160e7d6e667b5d01ccd404", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-zorder-001-ref.xht": [ + "982126be967418e018bbf2eb7b9835992668779e", + "support" + ], + "css/CSS2/normal-flow/inline-block-zorder-001.xht": [ + "1b843e76b249edc8a37783589377e16ae05d47e8", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-zorder-002.xht": [ + "4b93c96ad336200c037162530fd23b7c37cbce63", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-zorder-003-ref.xht": [ + "a9169b3b383a0dbf0f45a588617220ecbb701548", + "support" + ], + "css/CSS2/normal-flow/inline-block-zorder-003.xht": [ + "0e9bb06a15b0bbfb29864f66fded71d0444ac077", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-zorder-004-ref.xht": [ + "b3623adc68191dcbc8c06eae766fd309c0960271", + "support" + ], + "css/CSS2/normal-flow/inline-block-zorder-004.xht": [ + "bc83837b1ede38b410efbc79b669d76959439227", + "reftest" + ], + "css/CSS2/normal-flow/inline-block-zorder-005.xht": [ + "bbbd99fb665ca37c990e0aad43530383e8720584", + "reftest" + ], + "css/CSS2/normal-flow/inline-non-replaced-height-002-ref.xht": [ + "c6d6947e2f8637f33327b70be88f39b9551fc430", + "support" + ], + "css/CSS2/normal-flow/inline-non-replaced-height-002.xht": [ + "2e75495f32dbfe16fc798a39dd3bc62572793d5e", + "reftest" + ], + "css/CSS2/normal-flow/inline-non-replaced-height-003.xht": [ + "c39e56d371ce24153913fbd1c6ced2dc499218a4", + "reftest" + ], + "css/CSS2/normal-flow/inline-non-replaced-width-001-ref.xht": [ + "4b12c8e6df2499701e3c842e736174deb187aed0", + "support" + ], + "css/CSS2/normal-flow/inline-non-replaced-width-001.xht": [ + "63bbfb908b0a9967133508f86b40d25d7f0288fb", + "reftest" + ], + "css/CSS2/normal-flow/inline-non-replaced-width-002.xht": [ + "eea510ba81207c3b76a265f703024d7b07c7899f", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-height-001.xht": [ + "077105420bf02910c964067344c006bb66b1cde3", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-height-002.xht": [ + "d55eec8b420fa79168c6046cae65050404335d2a", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-height-003.xht": [ + "ebafb1e6533ca17cbcf36db3dee7883074a0c357", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-height-004.xht": [ + "2196a43b507cd9d89f80326c37679767a00c0ced", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-height-005.xht": [ + "ae35c1b839524a8c84bdc0ed8b87d52b3b4e0f66", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-height-006.xht": [ + "b1c15657524abaaaddd525e21577bc5451da8353", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-height-007.xht": [ + "549eae04cc2a8c12405de7b82b7727f77895b8e1", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-height-008.xht": [ + "5d872db692aefdf2484f23498a82e8eee8cb451f", + "manual" + ], + "css/CSS2/normal-flow/inline-replaced-height-009.xht": [ + "c295489329b60ce35c1d2cb81d40814d0dc0e164", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-height-010.xht": [ + "3b69efebde20ca0c853c03fe6273a1cd871b001c", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-height-011.xht": [ + "c97f11ce935ee16b974d48e00b3054201656bbbb", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-width-001-ref.xht": [ + "38da6d74d7c1fe315a5fd067e9a8c4669ea7f4c8", + "support" + ], + "css/CSS2/normal-flow/inline-replaced-width-001.xht": [ + "a5cb47f86e2606767414006bbc8550ce93b26392", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-width-002-ref.xht": [ + "c5b6142ffa98aa3d3396afe9291910abaa1415ae", + "support" + ], + "css/CSS2/normal-flow/inline-replaced-width-002.xht": [ + "a88e93bf955998270eb2a9f33768b8ca1a7a8bc7", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-width-003-ref.xht": [ + "7d20a8a0c95534c15b88925af488f8bb027ef698", + "support" + ], + "css/CSS2/normal-flow/inline-replaced-width-003.xht": [ + "77ffca32d3651cbb09358344ee5a83e6ad2e358a", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-width-004.xht": [ + "a2f4138cef5404cedd179b94b9a4c947355a8ab3", + "visual" + ], + "css/CSS2/normal-flow/inline-replaced-width-006.xht": [ + "f2f82a97df6a18f9b6dd5b373f7ba6eb476aff72", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-width-008.xht": [ + "5087fc9f9456515cced6b919a056104dad9b9e5a", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-width-009.xht": [ + "b138d2e3cb428b194bf9e2145f46bcbca5ff94ec", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-width-011-ref.xht": [ + "274795db2f8133a17439b98d9ebc92a21f540887", + "support" + ], + "css/CSS2/normal-flow/inline-replaced-width-011.xht": [ + "0839281368b9c53680eb7598fb8a8fd5735495a8", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-width-012-ref.xht": [ + "7d4105afb87c85b3f39e84cc8a92faea560724a0", + "support" + ], + "css/CSS2/normal-flow/inline-replaced-width-012.xht": [ + "ae46c40ccff9a212db8296c9a4c870e343c95baf", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-width-013.xht": [ + "e5dca85516a25ca675b79064301376b0f99c5197", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-width-014-ref.xht": [ + "c64df0197918a114ef8b02f344d5efbe321833dd", + "support" + ], + "css/CSS2/normal-flow/inline-replaced-width-014.xht": [ + "9e2b87d319911e92d332ae6fabcecd89f6cfb6f6", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-width-015.xht": [ + "48cc2d00effb99f391d439ea6f63e9b2beea09af", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-width-016.xht": [ + "6f566b75c25b46ca7b5b2f67d7bf809297c183db", + "reftest" + ], + "css/CSS2/normal-flow/inline-replaced-width-017.xht": [ + "e8172e250d80140a1c237e9c5f7e51901ce1eda4", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-002-ref.xht": [ + "f2d793d01506513aa4eb77060654848b08ba81ce", + "support" + ], + "css/CSS2/normal-flow/inline-table-002a.xht": [ + "5e7baa02e5ad33e1571d1e2c43ea025dd0d61bf1", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-002b.xht": [ + "c5980ddd61b8bc682a6e48997cbbed04ba57dd92", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-003-ref.xht": [ + "e2af78d1ae3f117fe9a53babe86291c4a8f8f323", + "support" + ], + "css/CSS2/normal-flow/inline-table-003.xht": [ + "cca7efb8c8b6629c6e04740fe53db20f57db4223", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-height-001-ref.xht": [ + "4cc05959178c4be6dbf1a5ec27e909cd04725729", + "support" + ], + "css/CSS2/normal-flow/inline-table-height-001.xht": [ + "2eee6c7b5efc700c0af92156030f08f0ccf5061a", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-height-002-ref.xht": [ + "73f725fd863242db582c11ed391608ffb9445a3c", + "support" + ], + "css/CSS2/normal-flow/inline-table-height-002.xht": [ + "03594588ba2d77e69e5a4b89e0c746f4f3602953", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-valign-001-ref.xht": [ + "2dd458188be1b03d22ffd5ff5b50251f68236b88", + "support" + ], + "css/CSS2/normal-flow/inline-table-valign-001.xht": [ + "0f6fa2a289713d7465d37d7d4a22dc5cc51050ac", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-width-001-ref.xht": [ + "e8b7c592769cd0472c749d8236af4d2ec4712e2e", + "support" + ], + "css/CSS2/normal-flow/inline-table-width-001a.xht": [ + "de89c417e6629a96ccc5da9cc6c1e56da4f7e005", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-width-001b.xht": [ + "dc61e6ec1868c177cb7c1375fedd8b992c4400f8", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-width-002-ref.xht": [ + "c112735c1e04707b6add57344b4fa9d913099926", + "support" + ], + "css/CSS2/normal-flow/inline-table-width-002a.xht": [ + "bc2f9fb23ea78bc8385cd54472aa748d70767720", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-width-002b.xht": [ + "fc113c1648ea5000ab8c698f5bddc401c71d0fc6", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-zorder-001-ref.xht": [ + "4940ce15bd8e9711e436b0565c8942de68aa55cb", + "support" + ], + "css/CSS2/normal-flow/inline-table-zorder-001.xht": [ + "b15347104f1e4f8a418f0371357d93ad5d23e989", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-zorder-002.xht": [ + "3f13357d5706142c83609b1064356491e6728c0b", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-zorder-003-ref.xht": [ + "b68eed91ec6c970c8722655d38dd891889971413", + "support" + ], + "css/CSS2/normal-flow/inline-table-zorder-003.xht": [ + "38ac7342ded1a60df5fb037b2a0b45af3f40dc9e", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-zorder-004-ref.xht": [ + "03f6f6f74a5ad42798dc945befbaa2ed85361665", + "support" + ], + "css/CSS2/normal-flow/inline-table-zorder-004.xht": [ + "eeef848040a417c8beb751359a1cfc1cf3324953", + "reftest" + ], + "css/CSS2/normal-flow/inline-table-zorder-005.xht": [ + "698afe587e910c06c62d41e2b3a7f6ebb2a03566", + "reftest" + ], + "css/CSS2/normal-flow/inlines-001.xht": [ + "12e4b6e28ed0115e5de0748822a61c4b530b4629", + "visual" + ], + "css/CSS2/normal-flow/inlines-002-ref.xht": [ + "944fe913ce9324046491e62452c5352a15bb8071", + "support" + ], + "css/CSS2/normal-flow/inlines-002.xht": [ + "443662c3595ed8bc815b4e916b00924f134b2ea0", + "reftest" + ], + "css/CSS2/normal-flow/inlines-003.xht": [ + "9b5f985d3e279f9b094fd8adefe9e440cd479634", + "manual" + ], + "css/CSS2/normal-flow/inlines-004.xht": [ + "b4db75a8477678578ce7f891b3abc933cf0c1e1a", + "manual" + ], + "css/CSS2/normal-flow/inlines-005.xht": [ + "55008b438ab4a3ab01bc210742e837c4c084d467", + "manual" + ], + "css/CSS2/normal-flow/inlines-006.xht": [ + "d8910c1dd23817c2d63a6e934ba2d8745c3fbf74", + "manual" + ], + "css/CSS2/normal-flow/inlines-007.xht": [ + "008a5e64ca07e4bf23a521b097f9ecc4448b183d", + "visual" + ], + "css/CSS2/normal-flow/inlines-009.xht": [ + "d697027e3bf4a3b59bef8aac71e3fea04e89eed5", + "visual" + ], + "css/CSS2/normal-flow/inlines-010.xht": [ + "a82f725c89133a90e91b231ea34ea8204929e7c6", + "visual" + ], + "css/CSS2/normal-flow/inlines-011.xht": [ + "f598b5a2e591cf889272f49c4cdac4a87e6405ad", + "visual" + ], + "css/CSS2/normal-flow/inlines-012.xht": [ + "1e3ad66012feb97eeb74e2255f46ebabe63774bd", + "visual" + ], + "css/CSS2/normal-flow/inlines-013-ref.xht": [ + "c1e2d06785de73ae80c9ce9e4dd3c6e81abd86b4", + "support" + ], + "css/CSS2/normal-flow/inlines-013.xht": [ + "305f28eacf558cb415697f431f0e3af49a7e9f14", + "reftest" + ], + "css/CSS2/normal-flow/inlines-014.xht": [ + "db9cbcf6b8ca68568afa83a5178fcdc3f24486bc", + "visual" + ], + "css/CSS2/normal-flow/inlines-015.xht": [ + "557f04943a6c652d3aa0b8d9f8a3ad0dddc8e114", + "visual" + ], + "css/CSS2/normal-flow/inlines-016-ref.xht": [ + "1b267dd0b8619fb659d797c6cd29ae507e3cf10a", + "support" + ], + "css/CSS2/normal-flow/inlines-016.xht": [ + "5e99419c06f28c06df336c741ba4829866b16480", + "reftest" + ], + "css/CSS2/normal-flow/inlines-017-ref.xht": [ + "0b4a9b2decc87c4777d8a5156e8cb917f055024b", + "support" + ], + "css/CSS2/normal-flow/inlines-017.xht": [ + "604177bccea40f668855c6d718803eee363329f6", + "reftest" + ], + "css/CSS2/normal-flow/inlines-020-ref.xht": [ + "a31254e929342c84c104a35cb99e238c087c98ed", + "support" + ], + "css/CSS2/normal-flow/inlines-020.xht": [ + "a19a4cc8d7c500e01a0b591b16c13cd9a18773db", + "reftest" + ], + "css/CSS2/normal-flow/max-height-001.xht": [ + "34a501cb70b591b6998234f3366361c33a064a18", + "reftest" + ], + "css/CSS2/normal-flow/max-height-002.xht": [ + "3953046b0bca50a90b44ab66fb91691526096ccc", + "reftest" + ], + "css/CSS2/normal-flow/max-height-003.xht": [ + "11322952c50df85df918bc1a5b3d209dd80451d0", + "reftest" + ], + "css/CSS2/normal-flow/max-height-004.xht": [ + "d43feba31b016da5446bec829ea4b18e0d63f668", + "reftest" + ], + "css/CSS2/normal-flow/max-height-005.xht": [ + "0609378100a17449c22ab314d9addc0da9319a74", + "reftest" + ], + "css/CSS2/normal-flow/max-height-006.xht": [ + "309d5731edbf889fe5489abfe7bb466040003211", + "reftest" + ], + "css/CSS2/normal-flow/max-height-007.xht": [ + "99e57a19c24f5ae15a0afbaa1b0da52a676cdd10", + "reftest" + ], + "css/CSS2/normal-flow/max-height-012.xht": [ + "11a1d912db69b5d96025fc8fede59a276a6d2163", + "reftest" + ], + "css/CSS2/normal-flow/max-height-013.xht": [ + "cbbb363f0faec757a15b63849a1f75fc8600c978", + "reftest" + ], + "css/CSS2/normal-flow/max-height-014.xht": [ + "fce94f7e00ea264b1537feb43f95ac0b43c8ff87", + "visual" + ], + "css/CSS2/normal-flow/max-height-015.xht": [ + "181a2db628d9b3cb07c690303e7d1a6cc6527ac5", + "reftest" + ], + "css/CSS2/normal-flow/max-height-016.xht": [ + "b4adc2bdb42ab92f87e25bcdf7386e98cb5efa44", + "reftest" + ], + "css/CSS2/normal-flow/max-height-017.xht": [ + "735ce4204447b0f47daded8129b0a8cf2860c148", + "reftest" + ], + "css/CSS2/normal-flow/max-height-018.xht": [ + "20bfe69bc1ebf6c615c4f2ee7cc09d7b8b6b3c6b", + "reftest" + ], + "css/CSS2/normal-flow/max-height-023.xht": [ + "e6bab2f87c44b4ec6d9522b8d15c3004c964dec3", + "reftest" + ], + "css/CSS2/normal-flow/max-height-024.xht": [ + "8bb424271846aab964a616a350968d11d2ddde4c", + "reftest" + ], + "css/CSS2/normal-flow/max-height-025-ref.xht": [ + "5b06f9b0a32a0399ea9067c80cc778f86fa46322", + "support" + ], + "css/CSS2/normal-flow/max-height-025.xht": [ + "4ef5ca1bbd86b0a9ad9d9440186d3b0d4e2930d3", + "reftest" + ], + "css/CSS2/normal-flow/max-height-026.xht": [ + "1203f6bf86715c8b45fd32982d99e9c09425d896", + "reftest" + ], + "css/CSS2/normal-flow/max-height-027.xht": [ + "8360914a1992409c9049fe559c0484c849857ca3", + "reftest" + ], + "css/CSS2/normal-flow/max-height-028.xht": [ + "51cb7b846bdca9e11b3966e4808dce18bd7b162a", + "reftest" + ], + "css/CSS2/normal-flow/max-height-029.xht": [ + "5075fb803b0caa615c608bb025017372b52cd921", + "reftest" + ], + "css/CSS2/normal-flow/max-height-034.xht": [ + "d86728222d97f1ed19aed576a166d2843fed7f45", + "reftest" + ], + "css/CSS2/normal-flow/max-height-035.xht": [ + "7aa28d6acd303fd785b88925aa6428d5e0e40799", + "reftest" + ], + "css/CSS2/normal-flow/max-height-036-ref.xht": [ + "b8767ad93b32c199ccf38734e811bc2eb49cacc5", + "support" + ], + "css/CSS2/normal-flow/max-height-036.xht": [ + "f4e168f72678a5bd6662e4491d41d1a373d7af65", + "reftest" + ], + "css/CSS2/normal-flow/max-height-037.xht": [ + "bce35bc458dcaed1eac64d41c98c353e885980bf", + "reftest" + ], + "css/CSS2/normal-flow/max-height-038.xht": [ + "8e1f8e2d65f6a7b0bff0048f3e7a4dae4cba148a", + "reftest" + ], + "css/CSS2/normal-flow/max-height-039.xht": [ + "1dcb932dd58e9f5e3ebbb1199d0dd2f95d1a0a71", + "reftest" + ], + "css/CSS2/normal-flow/max-height-040.xht": [ + "e6c9d8681c0019f290521f8d5ba08f0f9f3ad42e", + "reftest" + ], + "css/CSS2/normal-flow/max-height-045.xht": [ + "35135495cd8b680f35475d5fcef24bb459c2a789", + "reftest" + ], + "css/CSS2/normal-flow/max-height-046.xht": [ + "219611719bc91d4cdbc75c15e5aa8f22c7de7006", + "reftest" + ], + "css/CSS2/normal-flow/max-height-047-ref.xht": [ + "95e1be9eebd8cd5343e4568bc64aeb7d797a6fcf", + "support" + ], + "css/CSS2/normal-flow/max-height-047.xht": [ + "f796fc545611bca4e09183573b65bd57ffb8a6c2", + "reftest" + ], + "css/CSS2/normal-flow/max-height-048.xht": [ + "b7684364b69d33c611a1a659a067270025d179eb", + "reftest" + ], + "css/CSS2/normal-flow/max-height-049.xht": [ + "976794958ed70f071931de178f18038080cc3c12", + "reftest" + ], + "css/CSS2/normal-flow/max-height-050.xht": [ + "060f537cfdb68e21720e284146c39ca389a672a6", + "reftest" + ], + "css/CSS2/normal-flow/max-height-051.xht": [ + "a9ba740c83dd7ffcf4ad05460bc9353aec3d87c8", + "reftest" + ], + "css/CSS2/normal-flow/max-height-056.xht": [ + "da7d5b84b8eceb7a253103def1381beff19a5bfd", + "reftest" + ], + "css/CSS2/normal-flow/max-height-057.xht": [ + "c2a721020fa89fbb9b6e97b24018000078bda503", + "reftest" + ], + "css/CSS2/normal-flow/max-height-058-ref.xht": [ + "7e56262ce9c3a3029ad5001918bf6906e96d67c8", + "support" + ], + "css/CSS2/normal-flow/max-height-058.xht": [ + "7274caf4b05cdac6dd7ac201cd58ee08603949ce", + "reftest" + ], + "css/CSS2/normal-flow/max-height-059.xht": [ + "956848fba32f95ebcf91ac07212683d00064705e", + "reftest" + ], + "css/CSS2/normal-flow/max-height-060.xht": [ + "8e211de96a6510a10a3bb6d611037198aaf0b750", + "reftest" + ], + "css/CSS2/normal-flow/max-height-061.xht": [ + "ad1ea139100ece968a8a89d11a2fc2295eadb16a", + "reftest" + ], + "css/CSS2/normal-flow/max-height-062.xht": [ + "2bb488f72a290f6c2fbea7662ecb8b70344e071f", + "reftest" + ], + "css/CSS2/normal-flow/max-height-067.xht": [ + "5d9bb98a2645f5f4db149e6237f992864301e39d", + "reftest" + ], + "css/CSS2/normal-flow/max-height-068.xht": [ + "adc9f9d8b45e752b7735c2c26aae0f80ed915337", + "reftest" + ], + "css/CSS2/normal-flow/max-height-069-ref.xht": [ + "45fcdd26fa4f4de3a8dc8af0aa00546ccc03dc9f", + "support" + ], + "css/CSS2/normal-flow/max-height-069.xht": [ + "685b25b0fef2445b58274efb3f1b7a6b28051a9b", + "reftest" + ], + "css/CSS2/normal-flow/max-height-070.xht": [ + "73934dc254e70f9047fd1b860a52e4bc8a5f5b2d", + "reftest" + ], + "css/CSS2/normal-flow/max-height-071.xht": [ + "ba1c8c96e4fecf6902969d5595fd6b64cb2e29bf", + "reftest" + ], + "css/CSS2/normal-flow/max-height-072.xht": [ + "94e9032682a1207c0e409c34b3af3a01b8c7b9aa", + "reftest" + ], + "css/CSS2/normal-flow/max-height-073.xht": [ + "234a89902364fc368eb0e82a1d885614fb3c6a2c", + "reftest" + ], + "css/CSS2/normal-flow/max-height-078.xht": [ + "67d3c43aedac09652795c9be0b8795cc59715746", + "reftest" + ], + "css/CSS2/normal-flow/max-height-079.xht": [ + "441917ed990e70d4501c38a21ef31c7c73edcf6e", + "reftest" + ], + "css/CSS2/normal-flow/max-height-080.xht": [ + "ee78ccc273a39c1ad0a2d47a0fdbcb225aafd473", + "reftest" + ], + "css/CSS2/normal-flow/max-height-081.xht": [ + "9f37244998cd016233c53f0da1fce0157cb8348d", + "reftest" + ], + "css/CSS2/normal-flow/max-height-082.xht": [ + "85319d999e362e6e39fed4fbe9f12b5ac4c3d7e3", + "reftest" + ], + "css/CSS2/normal-flow/max-height-083.xht": [ + "e66ad2787a1548aae5f0930605c8c52e12d9ce70", + "reftest" + ], + "css/CSS2/normal-flow/max-height-084.xht": [ + "39a44e82a67afa49207c61888b7a5ccc686f11ea", + "reftest" + ], + "css/CSS2/normal-flow/max-height-089.xht": [ + "b9afa6ce2a12337c430b9b46bdb9e09259037af8", + "reftest" + ], + "css/CSS2/normal-flow/max-height-090.xht": [ + "2238d4e8b95771217150f5e7d9a753c62cd384c9", + "reftest" + ], + "css/CSS2/normal-flow/max-height-091.xht": [ + "ce7b2e8373e133a5bdbd4aacad5218069dd8a7aa", + "reftest" + ], + "css/CSS2/normal-flow/max-height-092.xht": [ + "857b77e54690320fefc68d1d8cf228b0280eb045", + "reftest" + ], + "css/CSS2/normal-flow/max-height-093.xht": [ + "184139aa2d90d89878bee1db82b6fc25ee6f565d", + "reftest" + ], + "css/CSS2/normal-flow/max-height-094.xht": [ + "a4351327eac9e0c0d458abfc4bee1af0ec746f84", + "reftest" + ], + "css/CSS2/normal-flow/max-height-095.xht": [ + "48e8324ac6e6fd0aa120fc970092f8751ff73ab6", + "reftest" + ], + "css/CSS2/normal-flow/max-height-100.xht": [ + "c01688fdcb1c5ba9735e2485b99a7709143e30e9", + "reftest" + ], + "css/CSS2/normal-flow/max-height-101.xht": [ + "d65606420d1bef36c76ec3aa15e1321604d307c9", + "reftest" + ], + "css/CSS2/normal-flow/max-height-102.xht": [ + "a137e2f9f2a34cc6ba762357d05dd40aed313e60", + "reftest" + ], + "css/CSS2/normal-flow/max-height-103.xht": [ + "639be6c3f31b0c0ea58a40464fbdd5ea443c342b", + "reftest" + ], + "css/CSS2/normal-flow/max-height-104.xht": [ + "c3e95e3ebf73fc25f1ef2a193059dfa26a6f1f34", + "reftest" + ], + "css/CSS2/normal-flow/max-height-105.xht": [ + "b8c7afcd5f38b119316f663e26f22ab38d22c667", + "visual" + ], + "css/CSS2/normal-flow/max-height-106.xht": [ + "d29b3cc91cb7f6e187b6a61a4a4ed4d1eaf88c60", + "visual" + ], + "css/CSS2/normal-flow/max-height-107-ref.xht": [ + "03f4e6689db21e4ad5507ca5875fb4411eb1b9dc", + "support" + ], + "css/CSS2/normal-flow/max-height-107.xht": [ + "d104b4ef85fe0113ccbd164d6f355f3055b910be", + "reftest" + ], + "css/CSS2/normal-flow/max-height-108.xht": [ + "a2bd8c5fe34b16cc1b1e7480bfb88419a01e8bdd", + "visual" + ], + "css/CSS2/normal-flow/max-height-109.xht": [ + "61b7a124be0e812d1768f14dd5ec871a0f3865cf", + "visual" + ], + "css/CSS2/normal-flow/max-height-110-ref.xht": [ + "2f82450f34f72c364710bc0fcb89490680be5af3", + "support" + ], + "css/CSS2/normal-flow/max-height-110.xht": [ + "c41e5395ccc6dbafadb317e8a02aa0dce0fc806d", + "reftest" + ], + "css/CSS2/normal-flow/max-height-111.xht": [ + "917577d938870916b46f0b7563e8bba436b47d68", + "visual" + ], + "css/CSS2/normal-flow/max-height-applies-to-001.xht": [ + "e963d763c4b4111f9aec14e0245506fa4c549df8", + "visual" + ], + "css/CSS2/normal-flow/max-height-applies-to-002.xht": [ + "0be705108ab23e793496feb691406ffef14caedf", + "visual" + ], + "css/CSS2/normal-flow/max-height-applies-to-003.xht": [ + "95bd76150e11e8dbfc4899510dd63e492a075773", + "visual" + ], + "css/CSS2/normal-flow/max-height-applies-to-004.xht": [ + "da30b277e0f4308e21bf5e0fd3361fc6c777812a", + "visual" + ], + "css/CSS2/normal-flow/max-height-applies-to-005.xht": [ + "a7421e7f484678a06526ad74fc39674f8429a8aa", + "reftest" + ], + "css/CSS2/normal-flow/max-height-applies-to-006.xht": [ + "2eb28f677cd1cbf80b4b5c851b834d31f74112cc", + "reftest" + ], + "css/CSS2/normal-flow/max-height-applies-to-007.xht": [ + "046fb6bf19734cd19e06e85212ebd32f7c934674", + "visual" + ], + "css/CSS2/normal-flow/max-height-applies-to-008.xht": [ + "bdeb5b226e52f67c742e24ed6807fdb181bf2f08", + "reftest" + ], + "css/CSS2/normal-flow/max-height-applies-to-009.xht": [ + "8eee5458e79841586868530d6024b4477db4fc8b", + "reftest" + ], + "css/CSS2/normal-flow/max-height-applies-to-010.xht": [ + "4af73dd0af164ac971225e6b4c033147db18af9f", + "visual" + ], + "css/CSS2/normal-flow/max-height-applies-to-012.xht": [ + "c00657893019282278d0f982db5436b102e8b622", + "reftest" + ], + "css/CSS2/normal-flow/max-height-applies-to-013.xht": [ + "bf00f16c0b1c578fc3a3538d8e67764c101714fb", + "reftest" + ], + "css/CSS2/normal-flow/max-height-applies-to-014.xht": [ + "d480e8ed8f3a0caa83bcd06fd2f87707df28a008", + "reftest" + ], + "css/CSS2/normal-flow/max-height-applies-to-015.xht": [ + "16bd8d6375c918edb6fe223680a8d89b33c1f478", + "reftest" + ], + "css/CSS2/normal-flow/max-height-applies-to-016.xht": [ + "64899001cbd1563eb7691c82061443ef2af3e4db", + "reftest" + ], + "css/CSS2/normal-flow/max-height-max-width-001.xht": [ + "d2fd8517000b8ab6c75c0de78b587db3bf406598", + "visual" + ], + "css/CSS2/normal-flow/max-height-percentage-001-ref.xht": [ + "b81ccdbe8f8fdbef9d866769e3518130ba801dc6", + "support" + ], + "css/CSS2/normal-flow/max-height-percentage-001.xht": [ + "eee02a4a579ff7395dd186c20cfa18fd89a608dc", + "reftest" + ], + "css/CSS2/normal-flow/max-height-percentage-002-ref.xht": [ + "590b370b6bc0f43704dd5e9502e2418e325d498e", + "support" + ], + "css/CSS2/normal-flow/max-height-percentage-002.xht": [ + "b32212ec2858d25b932ed1beb14648b46addbb28", + "reftest" + ], + "css/CSS2/normal-flow/max-height-percentage-003.xht": [ + "6bd4605b943ac4e3ce46e29c8997a196d7d9285e", + "reftest" + ], + "css/CSS2/normal-flow/max-width-001.xht": [ + "76220f1377af7ffafb15fd5cd2d907b4ef35de33", + "reftest" + ], + "css/CSS2/normal-flow/max-width-002.xht": [ + "9f7c40f0543d77a452dff3109c5ec9b6be086f77", + "reftest" + ], + "css/CSS2/normal-flow/max-width-003-ref.xht": [ + "c0d79f288d6ba208eb31de4514fd3a4cded3a92f", + "support" + ], + "css/CSS2/normal-flow/max-width-003.xht": [ + "5bb14547752353133b4a7e696c222760630c2d3a", + "reftest" + ], + "css/CSS2/normal-flow/max-width-004.xht": [ + "33f82c7311c1969761979795558280e27854a2db", + "reftest" + ], + "css/CSS2/normal-flow/max-width-005.xht": [ + "56f7232cb5c441011b746d0aa42e571088bc9da6", + "reftest" + ], + "css/CSS2/normal-flow/max-width-006-ref.xht": [ + "6b8cb06fbcee8462a5816bde6e7513eb648de683", + "support" + ], + "css/CSS2/normal-flow/max-width-006.xht": [ + "d4ba896853bed51a2ce4747b3b19cb7b2d3f1f0c", + "reftest" + ], + "css/CSS2/normal-flow/max-width-007.xht": [ + "8c646455c49838574d20131da219644ea9a533f1", + "reftest" + ], + "css/CSS2/normal-flow/max-width-012.xht": [ + "21f4671c534c0befe72a73454ebbea0d8b0517a1", + "reftest" + ], + "css/CSS2/normal-flow/max-width-013.xht": [ + "02f31e601ee15c10e5d6859309765cd46d9bae6f", + "reftest" + ], + "css/CSS2/normal-flow/max-width-014.xht": [ + "271d39ecfe0e7b3666941028f547e57fe004258d", + "visual" + ], + "css/CSS2/normal-flow/max-width-015.xht": [ + "51549a75feee6c90f13a87c6c03296aa732381a2", + "reftest" + ], + "css/CSS2/normal-flow/max-width-016.xht": [ + "15bd7b72efee2291fd4178193c2dcede46bc6b18", + "reftest" + ], + "css/CSS2/normal-flow/max-width-017.xht": [ + "b871b7190dabf07600a8ba54043427d916157830", + "reftest" + ], + "css/CSS2/normal-flow/max-width-018.xht": [ + "a32e1f695926e4b5853ba1f513d9f0065f06385b", + "reftest" + ], + "css/CSS2/normal-flow/max-width-023.xht": [ + "544e1f1c53903a8ce30bbe0706b96478a77335cf", + "reftest" + ], + "css/CSS2/normal-flow/max-width-024.xht": [ + "eca3bba915252a4944a8cb9c3c32a7e18d2b89a3", + "reftest" + ], + "css/CSS2/normal-flow/max-width-025-ref.xht": [ + "59c985ae1181b997022ac92780fd36f4beb4b380", + "support" + ], + "css/CSS2/normal-flow/max-width-025.xht": [ + "b10698cb94c754c0d1824b728613a4a3ac399fb5", + "reftest" + ], + "css/CSS2/normal-flow/max-width-026.xht": [ + "d1bc95f0d3cf17a93fa9612ed5ed7ed66629e954", + "reftest" + ], + "css/CSS2/normal-flow/max-width-027.xht": [ + "8a2fe1459c4d38c7526d1315001e28c5d2d57d02", + "reftest" + ], + "css/CSS2/normal-flow/max-width-028.xht": [ + "9524f9353d99a665e93b9a0e2e3cb63f054a8f9c", + "reftest" + ], + "css/CSS2/normal-flow/max-width-029.xht": [ + "64e824546b6ba183602383f9c5a54cd3a88b1b7d", + "reftest" + ], + "css/CSS2/normal-flow/max-width-034.xht": [ + "2ce915dbf34340a0a6901bd35eeb1523f1cf9ce0", + "reftest" + ], + "css/CSS2/normal-flow/max-width-035.xht": [ + "46f03a808ed69d46fd1867e54816c898f2bd323b", + "reftest" + ], + "css/CSS2/normal-flow/max-width-036-ref.xht": [ + "8a4d99db313613f974e473eef0e91701e758cf55", + "support" + ], + "css/CSS2/normal-flow/max-width-036.xht": [ + "137d1fc366af7de4fe80a82a1e42b9951967b3cd", + "reftest" + ], + "css/CSS2/normal-flow/max-width-037.xht": [ + "d733eb080cce42aa7fd15ccd732f771b3d15c5bf", + "reftest" + ], + "css/CSS2/normal-flow/max-width-038.xht": [ + "2549d15e6d49ba6e46dd660e1aa1521936503bc9", + "reftest" + ], + "css/CSS2/normal-flow/max-width-039.xht": [ + "c0c004652d099f59ef5097c2d694fa0e051e5613", + "reftest" + ], + "css/CSS2/normal-flow/max-width-040.xht": [ + "21f3d9d6a29b8e64c3cb708da64752f4ea99e458", + "reftest" + ], + "css/CSS2/normal-flow/max-width-045.xht": [ + "efd5f614f0776d6a0cefbaa2d0b44cea9a652edb", + "reftest" + ], + "css/CSS2/normal-flow/max-width-046.xht": [ + "0cb35c80e4bbc5b02b44452642a4815c4f672714", + "reftest" + ], + "css/CSS2/normal-flow/max-width-047-ref.xht": [ + "4fc644b37b4f32ab961d121069b63d06b9744e39", + "support" + ], + "css/CSS2/normal-flow/max-width-047.xht": [ + "2d872b30b31e10fea31a5625942211f4f4a7d294", + "reftest" + ], + "css/CSS2/normal-flow/max-width-048.xht": [ + "01c2953c14f3cf84d5d4bce83414978c4dd55149", + "reftest" + ], + "css/CSS2/normal-flow/max-width-049.xht": [ + "7d62f348e37cf210eaef77ed4695519a9e3d8d7b", + "reftest" + ], + "css/CSS2/normal-flow/max-width-050.xht": [ + "0303eedc86ca1c700773994233b0ffc3cfe6188f", + "reftest" + ], + "css/CSS2/normal-flow/max-width-051.xht": [ + "1ff8379d48ed98706181de8167bc69b93f0b5017", + "reftest" + ], + "css/CSS2/normal-flow/max-width-056.xht": [ + "872a1211282a120cf814c8d06da94f8118b0c218", + "reftest" + ], + "css/CSS2/normal-flow/max-width-057.xht": [ + "79fcdeac2b84bea05c51f770c4a078b082031d62", + "reftest" + ], + "css/CSS2/normal-flow/max-width-058.xht": [ + "602b69ea91ff0e30b759d53e04e658da4ace87ae", + "reftest" + ], + "css/CSS2/normal-flow/max-width-059.xht": [ + "f7d0a6caf09476a575eed5e14e6a82639f900451", + "reftest" + ], + "css/CSS2/normal-flow/max-width-060.xht": [ + "6d582c0550e5316fe1133440d9a619a21de270d9", + "reftest" + ], + "css/CSS2/normal-flow/max-width-061-ref.xht": [ + "5c11c766b044e8f1b188c6fba37ee21f2d40a5eb", + "support" + ], + "css/CSS2/normal-flow/max-width-061.xht": [ + "0bfa7d3bf0b0cac3f60eaeae105b8a0536f25657", + "reftest" + ], + "css/CSS2/normal-flow/max-width-062.xht": [ + "667961dcbf8accf8184d9d1473eded46be408c33", + "reftest" + ], + "css/CSS2/normal-flow/max-width-067.xht": [ + "d08b0f0ff4001e26f7cf554fa83d24a1e7a3ab2d", + "reftest" + ], + "css/CSS2/normal-flow/max-width-068.xht": [ + "ce29d1a6524f99abb72b8934ef4e42ba01c8e0db", + "reftest" + ], + "css/CSS2/normal-flow/max-width-069-ref.xht": [ + "2ab84533e6f4182615adb520b391df28ee317ee4", + "support" + ], + "css/CSS2/normal-flow/max-width-069.xht": [ + "46f68e7870566d6f856b9390649e31095e4062d4", + "reftest" + ], + "css/CSS2/normal-flow/max-width-070.xht": [ + "680b63c87fe074c33ea42d106539157858ee2556", + "reftest" + ], + "css/CSS2/normal-flow/max-width-071.xht": [ + "5ac777a25080d1964bc73e5ee9c02fc7f5c9544f", + "reftest" + ], + "css/CSS2/normal-flow/max-width-072-ref.xht": [ + "79244a3d34023690188c2bca69a553a64a5c7362", + "support" + ], + "css/CSS2/normal-flow/max-width-072.xht": [ + "ed6d63feec73dccae7145016e6d1f6fa9b76d38d", + "reftest" + ], + "css/CSS2/normal-flow/max-width-073.xht": [ + "6a5acde53799688a1e11723ad7b627e4d90fe0a8", + "reftest" + ], + "css/CSS2/normal-flow/max-width-078.xht": [ + "43a6a214e8fc5b4a63984cc3feae7211db6d7efd", + "reftest" + ], + "css/CSS2/normal-flow/max-width-079.xht": [ + "8623b168cd36b4698c435a6d426f0811bf2e7072", + "reftest" + ], + "css/CSS2/normal-flow/max-width-080.xht": [ + "0179c21300ddf39820212eef79100a261997d195", + "reftest" + ], + "css/CSS2/normal-flow/max-width-081.xht": [ + "34e9d5118eea6fba94d77927dcc58b276c3387fa", + "reftest" + ], + "css/CSS2/normal-flow/max-width-082.xht": [ + "19b876466fd8760538d4f44f70ca5478b3387b0b", + "reftest" + ], + "css/CSS2/normal-flow/max-width-083.xht": [ + "8faf78712ae42ef92dcf01996f584c026799986d", + "reftest" + ], + "css/CSS2/normal-flow/max-width-084.xht": [ + "07b3448b1bcfc484d1a8b9ef028ee279adab861b", + "reftest" + ], + "css/CSS2/normal-flow/max-width-089.xht": [ + "07c687d1e67ed0c475a76e7d55907b124af08ab7", + "reftest" + ], + "css/CSS2/normal-flow/max-width-090.xht": [ + "66865396744703ccc187953843665e654b3d67dd", + "reftest" + ], + "css/CSS2/normal-flow/max-width-091.xht": [ + "c81b15c9c8c13c3dd5517e60602690e74d1ad9be", + "reftest" + ], + "css/CSS2/normal-flow/max-width-092.xht": [ + "b8a5e6ccddf2de3b3b1870c62c50ad082649670b", + "reftest" + ], + "css/CSS2/normal-flow/max-width-093.xht": [ + "74080e83fcf97772e6be423955cadb85b4a8930e", + "reftest" + ], + "css/CSS2/normal-flow/max-width-094.xht": [ + "a74c676c23fa82d6eeda5eae510c687dc0b66c2f", + "reftest" + ], + "css/CSS2/normal-flow/max-width-095.xht": [ + "5d172975c0863513b1c69b12149fe1472205ed37", + "reftest" + ], + "css/CSS2/normal-flow/max-width-100.xht": [ + "045eb0fb9139e93cb0111e7c593d92f9f747907a", + "reftest" + ], + "css/CSS2/normal-flow/max-width-101.xht": [ + "8ee161b43e22fa44ca7ed6d64ad443f276c2b1ef", + "reftest" + ], + "css/CSS2/normal-flow/max-width-102.xht": [ + "75fe04a356f90eab3605f4a6be2642446970abb8", + "reftest" + ], + "css/CSS2/normal-flow/max-width-103.xht": [ + "1141c1caf8d75ad182263f54ce4ca3a468577ba9", + "reftest" + ], + "css/CSS2/normal-flow/max-width-104.xht": [ + "1beb9f9bfeb57d02e5388e7a6fc48e3c01832901", + "reftest" + ], + "css/CSS2/normal-flow/max-width-105-ref.xht": [ + "69084693a25f15b9359cf8cbae03e1ffa10e3ff2", + "support" + ], + "css/CSS2/normal-flow/max-width-105.xht": [ + "2b72bea8383a23e0d95753e1cec2bce7a6f460b3", + "reftest" + ], + "css/CSS2/normal-flow/max-width-106.xht": [ + "2d76b23fbe8a4f0cd302bdb19e7c6bc6d4b7d8f8", + "reftest" + ], + "css/CSS2/normal-flow/max-width-107-ref.xht": [ + "613e8fc05a5e4d1744ea9eecdfa334fd5cb41aba", + "support" + ], + "css/CSS2/normal-flow/max-width-107.xht": [ + "1a481f4df10a8eb29f36164c3d35463b94fcc0d5", + "reftest" + ], + "css/CSS2/normal-flow/max-width-108.xht": [ + "937d0b5478f8b66ca3e36b3f8be27191f00cd851", + "visual" + ], + "css/CSS2/normal-flow/max-width-110.xht": [ + "7762cb29519e16635c749d0dff29fdd2c7abb453", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-001.xht": [ + "27d770074506618b52964132ca6834b5355204b9", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-002.xht": [ + "83897c2e1f9dff05ee45b880c6d9e28b408515e0", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-003.xht": [ + "3ab6d0768c9455e785d7c7361f3965794bc4d429", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-004.xht": [ + "261bb2453096c70f08ca5bf26fc52109a476eec6", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-005.xht": [ + "847cdaf0826e54f71ac8174d2223b112cf632996", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-006.xht": [ + "f47e1d3c2b3786e1ee1520d5c503a7870dc91e37", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-007.xht": [ + "e44838b6d29b5168db3b2d8673b0bd190f1ce3fc", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-008.xht": [ + "7528602e068f3c604160862ab06da06d5c07da1f", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-009.xht": [ + "36112603fec38f06ace65df080caf18d9a9b21d0", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-010.xht": [ + "1e47e1f71649f397b4a323d4e204812dca5489ed", + "visual" + ], + "css/CSS2/normal-flow/max-width-applies-to-012.xht": [ + "5f5a6aa5e57f62832ea065307436a05d397da105", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-013.xht": [ + "cf9090dcc9e83d94a643a0ae676d18c27e169588", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-014.xht": [ + "e7c426c87be768c0326acad9a826c96ce89cf7f0", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-015.xht": [ + "5a3395b352b9094950554176ea2ec9c869dd9c57", + "reftest" + ], + "css/CSS2/normal-flow/max-width-applies-to-016.xht": [ + "5a0e5d82bb020bd222ce786e28a2a7f8339f803f", + "reftest" + ], + "css/CSS2/normal-flow/max-width-percentage-001-ref.xht": [ + "66ed4606c48bc12a9e945f5a33e0afd0c44acb0f", + "support" + ], + "css/CSS2/normal-flow/max-width-percentage-001.xht": [ + "1a7b193be6027dfcb16519ca881a870c72b28b56", + "reftest" + ], + "css/CSS2/normal-flow/max-width-percentage-002.xht": [ + "81a670166512c27bfc82ef7f2aab4c4495105232", + "reftest" + ], + "css/CSS2/normal-flow/max-width-percentage-003.xht": [ + "058b3e8885b0110c39eba87d4246e3eb099620f4", + "visual" + ], + "css/CSS2/normal-flow/min-height-001.xht": [ + "18ac0545ada404c1bdc9602d445c6d4b86ab3bc8", + "reftest" + ], + "css/CSS2/normal-flow/min-height-002.xht": [ + "45f85c6796a9d899ce98d9fb6404e3dd6523b0fb", + "reftest" + ], + "css/CSS2/normal-flow/min-height-003.xht": [ + "e33769ad3a10329facccb285b5e5a2f0f4f2fa53", + "reftest" + ], + "css/CSS2/normal-flow/min-height-004.xht": [ + "8aa870e057d7f8edb5b93c4b55f2e81d23181f90", + "reftest" + ], + "css/CSS2/normal-flow/min-height-005.xht": [ + "c3d070fef12e021376a2f4208e00716883430ba8", + "reftest" + ], + "css/CSS2/normal-flow/min-height-006.xht": [ + "a0086f2aaec47a03d0049a03b4ead32fea158dfd", + "reftest" + ], + "css/CSS2/normal-flow/min-height-007.xht": [ + "27a291b3375b0428037d70f4b3c055bb5cf467cc", + "reftest" + ], + "css/CSS2/normal-flow/min-height-012.xht": [ + "140c201628f8d2ea1de728f6295acc92e285c406", + "reftest" + ], + "css/CSS2/normal-flow/min-height-013.xht": [ + "fbf493bb2530b1fec073204ccece7af582557b96", + "reftest" + ], + "css/CSS2/normal-flow/min-height-014.xht": [ + "85aa8dda6c99c738712f882f8a757b2c601a607f", + "visual" + ], + "css/CSS2/normal-flow/min-height-015.xht": [ + "2816e3890e235e8f169b75b06572a9d07ce971b4", + "reftest" + ], + "css/CSS2/normal-flow/min-height-016.xht": [ + "cee01d4c65e1bb547be0fd720d050eb5c7ca54f1", + "reftest" + ], + "css/CSS2/normal-flow/min-height-017.xht": [ + "1573e69e5c00ecbae557f0d758cd36720331fcce", + "reftest" + ], + "css/CSS2/normal-flow/min-height-018.xht": [ + "7174de13abe75f3935d65b597dba8fb6ce1b9faf", + "reftest" + ], + "css/CSS2/normal-flow/min-height-023.xht": [ + "660b64f1a7268a66966834caaf2fdca53d7aefa9", + "reftest" + ], + "css/CSS2/normal-flow/min-height-024.xht": [ + "2a714a9ebd026116268e271703e9e0f20b35f6b9", + "reftest" + ], + "css/CSS2/normal-flow/min-height-025.xht": [ + "de31d5dd256177bb1ba2c8524ce7b48e243175ed", + "reftest" + ], + "css/CSS2/normal-flow/min-height-026.xht": [ + "27bb65fea8c6acf07d43dbe474e99767edb6d7dd", + "reftest" + ], + "css/CSS2/normal-flow/min-height-027.xht": [ + "112243905cac417f5fb4f52888a1331d6f0b045e", + "reftest" + ], + "css/CSS2/normal-flow/min-height-028.xht": [ + "dd4fe9370674e10db93fc831279779498cd39cd6", + "reftest" + ], + "css/CSS2/normal-flow/min-height-029.xht": [ + "ee21916f63e45775fe5f06cc00fc2c79cadc6b55", + "reftest" + ], + "css/CSS2/normal-flow/min-height-034.xht": [ + "433cef8bf0e2496f509e84bc934814b34ea3452a", + "reftest" + ], + "css/CSS2/normal-flow/min-height-035.xht": [ + "e57b309d1f12a4dccb944bdc07c24c33717c9546", + "reftest" + ], + "css/CSS2/normal-flow/min-height-036.xht": [ + "1e3cd5a7e9c97d53d232c4027e9b403299b29f77", + "reftest" + ], + "css/CSS2/normal-flow/min-height-037.xht": [ + "7fc75637f0540c9ca953f7ca8413ce40930c8cc5", + "reftest" + ], + "css/CSS2/normal-flow/min-height-038.xht": [ + "41117413a9155655e5ac5085dcf9c112ea152027", + "reftest" + ], + "css/CSS2/normal-flow/min-height-039.xht": [ + "a262200c05333292fdeacd565ba2b5a2b9352c21", + "reftest" + ], + "css/CSS2/normal-flow/min-height-040.xht": [ + "565d9422d554fbf3951d1be7885ae08f5aa0b2b3", + "reftest" + ], + "css/CSS2/normal-flow/min-height-045.xht": [ + "1b401560699a529187e31df4be22c1580f373e96", + "reftest" + ], + "css/CSS2/normal-flow/min-height-046.xht": [ + "68b9fcbb683a9cefdda6e5a24818171fc746063b", + "reftest" + ], + "css/CSS2/normal-flow/min-height-047.xht": [ + "ceebfce4590c66701d9c38a9ddb26b29b8f7ec5b", + "reftest" + ], + "css/CSS2/normal-flow/min-height-048.xht": [ + "af768324b289453571b3e88ee1cacc0b38e96d50", + "reftest" + ], + "css/CSS2/normal-flow/min-height-049.xht": [ + "9c96b8d01e21d4e7e27044ccdaed173ceb67b30e", + "reftest" + ], + "css/CSS2/normal-flow/min-height-050.xht": [ + "21003c9763463e1ad0c51a3b93bbfee7de963110", + "reftest" + ], + "css/CSS2/normal-flow/min-height-051.xht": [ + "9a3f0265d673c6263300e16089377d0e23bbc125", + "reftest" + ], + "css/CSS2/normal-flow/min-height-056.xht": [ + "7645e84d4afd68d34297987e9175e752872a11fa", + "reftest" + ], + "css/CSS2/normal-flow/min-height-057.xht": [ + "d9abd2032c3785a7d36497c473866dc16b15a1ad", + "reftest" + ], + "css/CSS2/normal-flow/min-height-058.xht": [ + "fe144de7204ceeeb1ae5050faec7247b51249371", + "reftest" + ], + "css/CSS2/normal-flow/min-height-059.xht": [ + "8ccbae72918ea8b76e2efad7ffbd9e34135cd636", + "reftest" + ], + "css/CSS2/normal-flow/min-height-060.xht": [ + "4f9272b3f85e6a86d1cac6cc1430a95fb97fe02e", + "reftest" + ], + "css/CSS2/normal-flow/min-height-061.xht": [ + "c27e7633d62a4bb623c6efccc55ab13de5226431", + "reftest" + ], + "css/CSS2/normal-flow/min-height-062.xht": [ + "a888dc327ae7a0b3e4f1af72e704ca8373e8c990", + "reftest" + ], + "css/CSS2/normal-flow/min-height-067-ref.xht": [ + "cdca100be2102a3bc7610636a02105dc77c3e9d9", + "support" + ], + "css/CSS2/normal-flow/min-height-067.xht": [ + "e31fe21771f8a4b1df485c50cb339447e39524bf", + "reftest" + ], + "css/CSS2/normal-flow/min-height-068.xht": [ + "07b5d1291fe86632a6de7bebf00207f8ef6d3113", + "reftest" + ], + "css/CSS2/normal-flow/min-height-069.xht": [ + "fbbdccb427e7baacba934fc106367a1679cb0ac7", + "reftest" + ], + "css/CSS2/normal-flow/min-height-070.xht": [ + "ec2e7e01c384a14eea8e73cdac5a5b19eb6b4968", + "reftest" + ], + "css/CSS2/normal-flow/min-height-071.xht": [ + "e716399e00ac3765cdf9d81e7fdb602c18b4e353", + "reftest" + ], + "css/CSS2/normal-flow/min-height-072.xht": [ + "cd6a54a1d800ffb147fa0153c47acb6b11189981", + "reftest" + ], + "css/CSS2/normal-flow/min-height-073.xht": [ + "50744cf12702f872b9fb107ec39a7270ee4e513e", + "reftest" + ], + "css/CSS2/normal-flow/min-height-078.xht": [ + "9e8f6f1f26e1398121fd4dc85fd0bccc8945f8a1", + "reftest" + ], + "css/CSS2/normal-flow/min-height-079.xht": [ + "ac01c6ece1618e3ed74dd28002942adc32c8a9c3", + "reftest" + ], + "css/CSS2/normal-flow/min-height-080.xht": [ + "df4262ea9f4507cdb0339efa79f63a6a6231789b", + "reftest" + ], + "css/CSS2/normal-flow/min-height-081.xht": [ + "54eae8547016568597204da77c5d6dbde79b0c43", + "reftest" + ], + "css/CSS2/normal-flow/min-height-082.xht": [ + "af474b86ba3cdc978ef6b3cf146dd2e7789927ea", + "reftest" + ], + "css/CSS2/normal-flow/min-height-083.xht": [ + "25e4811e28332fb24866379bc8473f9948daff4b", + "reftest" + ], + "css/CSS2/normal-flow/min-height-084.xht": [ + "d0f2c7baf4ddc5eb7202a4f7d2c5e166b8ee085c", + "reftest" + ], + "css/CSS2/normal-flow/min-height-089.xht": [ + "17db3ba886f964290021fe3737bd08191b36c40a", + "reftest" + ], + "css/CSS2/normal-flow/min-height-090.xht": [ + "4f49d2a81094d88fe214998be6d18f2c7e1e5d56", + "reftest" + ], + "css/CSS2/normal-flow/min-height-091.xht": [ + "8fe4623cd4563c9c9be70a3151e329cc9d2c77cc", + "reftest" + ], + "css/CSS2/normal-flow/min-height-092.xht": [ + "66da6e7d56c15f4c56212f0c601412a6d1ed5237", + "reftest" + ], + "css/CSS2/normal-flow/min-height-093.xht": [ + "441fc98bd6fa8536bd22ca5b7bbc51e2af8225ad", + "reftest" + ], + "css/CSS2/normal-flow/min-height-094.xht": [ + "9db198872ecccfc2db04ccba8117f30b23f372c8", + "reftest" + ], + "css/CSS2/normal-flow/min-height-095.xht": [ + "51c85973b06ef5b6fad64f8aa2b355a549a74ba8", + "reftest" + ], + "css/CSS2/normal-flow/min-height-100.xht": [ + "dfe800541e1603b5853c1bd0559c96fa27403589", + "reftest" + ], + "css/CSS2/normal-flow/min-height-101.xht": [ + "1285de0a42b900d866cc8dcda493e7863d843e1d", + "reftest" + ], + "css/CSS2/normal-flow/min-height-102.xht": [ + "9fb2666c9e5073806509f5a29720e852d9dedc8e", + "reftest" + ], + "css/CSS2/normal-flow/min-height-103.xht": [ + "3e7e06df270c3473c53428278209a7c720d5929e", + "reftest" + ], + "css/CSS2/normal-flow/min-height-104.xht": [ + "863552a4e33de2e394023d339eb661f142389230", + "reftest" + ], + "css/CSS2/normal-flow/min-height-105.xht": [ + "f2e54ec2c71440b522c7c6471b6c92dc91e32acf", + "reftest" + ], + "css/CSS2/normal-flow/min-height-106.xht": [ + "7d5eda617143f72e376b906dc0f3c954dd153b34", + "reftest" + ], + "css/CSS2/normal-flow/min-height-111-ref.xht": [ + "7d9230bfb80b59654cc8899e1d68657f1625a2e4", + "support" + ], + "css/CSS2/normal-flow/min-height-111.xht": [ + "d39f339abca2a9fdd7c9fa7566eb8e51086019c0", + "reftest" + ], + "css/CSS2/normal-flow/min-height-112.xht": [ + "f9acb1229b0cc0502f17dac083e544b405fad1a3", + "reftest" + ], + "css/CSS2/normal-flow/min-height-113.xht": [ + "7dd5fdaec20b2b8ce860069960a50b93770cfd15", + "visual" + ], + "css/CSS2/normal-flow/min-height-applies-to-001.xht": [ + "8c0a347d3fcc50a935b70a04b6da9eec2143a60b", + "visual" + ], + "css/CSS2/normal-flow/min-height-applies-to-002.xht": [ + "7ea489b6dabafee5844e54f26340caeefb6a2535", + "visual" + ], + "css/CSS2/normal-flow/min-height-applies-to-003.xht": [ + "bfe599c8d8bc753596540cc0ccd720a2f3a63805", + "visual" + ], + "css/CSS2/normal-flow/min-height-applies-to-004.xht": [ + "0357ec8f5240361e499aeae6ba89af4cddbe0b47", + "visual" + ], + "css/CSS2/normal-flow/min-height-applies-to-005.xht": [ + "b2f0bde69525d1a2969edd19f3303d8356cb3f22", + "reftest" + ], + "css/CSS2/normal-flow/min-height-applies-to-006.xht": [ + "4562616b958355743c4e75c33c87c684f12b40cd", + "reftest" + ], + "css/CSS2/normal-flow/min-height-applies-to-007.xht": [ + "831a8147a37e93eb81f86a9c810c8cec3c11a30c", + "visual" + ], + "css/CSS2/normal-flow/min-height-applies-to-008.xht": [ + "9d4bb4bdf04a5aa630a30f08119a574992480855", + "reftest" + ], + "css/CSS2/normal-flow/min-height-applies-to-009.xht": [ + "2a8a7fe87b8d5162b0bb3d8276a353f1cbde6f74", + "reftest" + ], + "css/CSS2/normal-flow/min-height-applies-to-010.xht": [ + "24b7180c2d8fa1b33ad591a249e48fdb30204fa9", + "visual" + ], + "css/CSS2/normal-flow/min-height-applies-to-012.xht": [ + "1e5c3f3d495ee992554789b06059b4068a14a4ee", + "reftest" + ], + "css/CSS2/normal-flow/min-height-applies-to-013.xht": [ + "b47bf85ce0dc2d2f9640deca152071cfad98a0a6", + "visual" + ], + "css/CSS2/normal-flow/min-height-applies-to-014.xht": [ + "bc4bb04d8c401a275f1753ad50bbe0c3a7523361", + "visual" + ], + "css/CSS2/normal-flow/min-height-applies-to-015.xht": [ + "e7747eb3fecd08d85f8648c2dc684703756b5623", + "reftest" + ], + "css/CSS2/normal-flow/min-height-percentage-001.xht": [ + "d50ba020b219f9460675e5564d26d545e8e95e50", + "reftest" + ], + "css/CSS2/normal-flow/min-height-percentage-002.xht": [ + "1ec951b306b6a149e32e298f0288e9bc408804f6", + "reftest" + ], + "css/CSS2/normal-flow/min-height-percentage-003-ref.xht": [ + "f66a44a28e184cb65195683f96d8dd6544a765c8", + "support" + ], + "css/CSS2/normal-flow/min-height-percentage-003.xht": [ + "52a71147fbe5064a916cc72f50dca86dac9fd719", + "reftest" + ], + "css/CSS2/normal-flow/min-width-001.xht": [ + "00a16f31de68edbc2672c51892aac9c6e37d49e8", + "reftest" + ], + "css/CSS2/normal-flow/min-width-002.xht": [ + "57c97265f3f7ab17b83177308c9cc32540906598", + "reftest" + ], + "css/CSS2/normal-flow/min-width-003.xht": [ + "91c0abc296f8589a8859570eff05047e6b2877f8", + "reftest" + ], + "css/CSS2/normal-flow/min-width-004.xht": [ + "6307631afb196fda66c8037e92f986b2b2116b1f", + "reftest" + ], + "css/CSS2/normal-flow/min-width-005.xht": [ + "e8bbedeb923e12ddea8d0c333a3a18d27e69f479", + "reftest" + ], + "css/CSS2/normal-flow/min-width-006.xht": [ + "b81037a400fcdf98498b7af8773daa7811790817", + "reftest" + ], + "css/CSS2/normal-flow/min-width-007.xht": [ + "f7c514fb087f0addfc1245e50ace54d670bfcde1", + "reftest" + ], + "css/CSS2/normal-flow/min-width-012.xht": [ + "5706b8bebb718cacaa8f2c504b3b66eb9b6c6c88", + "reftest" + ], + "css/CSS2/normal-flow/min-width-013.xht": [ + "591b6220e1e7e9112d56b0850b0d3ab4f2142083", + "reftest" + ], + "css/CSS2/normal-flow/min-width-014.xht": [ + "3279827c8fda9dafc8b734f31bf1f31b58965473", + "visual" + ], + "css/CSS2/normal-flow/min-width-015.xht": [ + "fb99925cdccaae1ede941fc375e444e10d03188e", + "reftest" + ], + "css/CSS2/normal-flow/min-width-016.xht": [ + "1b9f8eba82ab482650076d60c996e4c0febd3ac7", + "reftest" + ], + "css/CSS2/normal-flow/min-width-017.xht": [ + "1d917518fae6e7f7735857ae19aa3ec660e55e3f", + "reftest" + ], + "css/CSS2/normal-flow/min-width-018.xht": [ + "59100a6f4222a41fd12db38bf6840f79cd9b11f2", + "reftest" + ], + "css/CSS2/normal-flow/min-width-023.xht": [ + "ecc2e1f13f6053e7d388795924da74200bfc832b", + "reftest" + ], + "css/CSS2/normal-flow/min-width-024.xht": [ + "e46c9e276805652c467db3a878f4cf4e86e01d02", + "reftest" + ], + "css/CSS2/normal-flow/min-width-025.xht": [ + "2ed001234f4c591d9b1c8aed6a33b3779d7112d4", + "reftest" + ], + "css/CSS2/normal-flow/min-width-026.xht": [ + "6e241b702c2436bb5497f6396b5854595d0c5e99", + "reftest" + ], + "css/CSS2/normal-flow/min-width-027.xht": [ + "22dc40ea59ed6c5b85165c7c3154316cd9f5f760", + "reftest" + ], + "css/CSS2/normal-flow/min-width-028.xht": [ + "709ce36eae3cbf5aa7bb13a41b5ee72a4f460f2a", + "reftest" + ], + "css/CSS2/normal-flow/min-width-029.xht": [ + "252a1880aa8f5f87ad16df906d74bf4256da0aae", + "reftest" + ], + "css/CSS2/normal-flow/min-width-034.xht": [ + "efa80464fcd45ee25d20fe153bc2d4f86f047765", + "reftest" + ], + "css/CSS2/normal-flow/min-width-035.xht": [ + "6756bf51e1c586639be7ade83a257d04e117439c", + "reftest" + ], + "css/CSS2/normal-flow/min-width-036.xht": [ + "e5c2d43a90bae4d95e52192da8f2eb275ee082b6", + "reftest" + ], + "css/CSS2/normal-flow/min-width-037.xht": [ + "c2d27c797041be11c06f6c6fc70e0ce5c86b8155", + "reftest" + ], + "css/CSS2/normal-flow/min-width-038.xht": [ + "77375872efcef5b5b7fe98a17cc4ee3852b20e58", + "reftest" + ], + "css/CSS2/normal-flow/min-width-039.xht": [ + "671f946cd97745fa9f2a9ce116e82509ee30c4ab", + "reftest" + ], + "css/CSS2/normal-flow/min-width-040.xht": [ + "b277267b56a680489664db8b31684ae7cee146e0", + "reftest" + ], + "css/CSS2/normal-flow/min-width-045.xht": [ + "26c5e8c29eeca723e81ab41725bc51a4042b01f8", + "reftest" + ], + "css/CSS2/normal-flow/min-width-046.xht": [ + "a95d4a112ae4810a83958233e2fd2438cf3f99c9", + "reftest" + ], + "css/CSS2/normal-flow/min-width-047.xht": [ + "6f7928ebf6cb8f40cae7e13eb0b192c4e25aa29c", + "reftest" + ], + "css/CSS2/normal-flow/min-width-048.xht": [ + "e06e18242ca24d6d6ffc75a0becc52f4e18dd886", + "reftest" + ], + "css/CSS2/normal-flow/min-width-049.xht": [ + "f9c07b72672c926e3fef8ba41ae493acd4380c01", + "reftest" + ], + "css/CSS2/normal-flow/min-width-050.xht": [ + "6286e3a99c17c9a61f5d0b5fd7c83048818d69a8", + "reftest" + ], + "css/CSS2/normal-flow/min-width-051.xht": [ + "853905a536c90f57fe53cdd29a7e331e7f36119a", + "reftest" + ], + "css/CSS2/normal-flow/min-width-056.xht": [ + "b988268daa6a56daed4dc13cd7f15d6e037a9774", + "reftest" + ], + "css/CSS2/normal-flow/min-width-057.xht": [ + "a13848bb84d60c42eb0e3d42f2f284dfff2d8619", + "reftest" + ], + "css/CSS2/normal-flow/min-width-058.xht": [ + "76d322d6e08313e2351e51422c6e9bb4caa035be", + "reftest" + ], + "css/CSS2/normal-flow/min-width-059.xht": [ + "6722d972ad39510dffd78e7f3f5199a43f0cd726", + "reftest" + ], + "css/CSS2/normal-flow/min-width-060.xht": [ + "2093d849219edc1c10ef56ff9ff1ac4ca6452b0b", + "reftest" + ], + "css/CSS2/normal-flow/min-width-061.xht": [ + "6b56322f8978a8e8cb62b51aafdfdce48c86a43d", + "reftest" + ], + "css/CSS2/normal-flow/min-width-062.xht": [ + "68110ca79049eb1e645025779e0cafc1e9a25373", + "reftest" + ], + "css/CSS2/normal-flow/min-width-067.xht": [ + "24e02e9aeae4d1de273028cf04be08fc3f48160d", + "reftest" + ], + "css/CSS2/normal-flow/min-width-068.xht": [ + "e1712d03ce784b0c1602c0af54e6cd1929fd36b4", + "reftest" + ], + "css/CSS2/normal-flow/min-width-069.xht": [ + "b809b7e2096f003b65513e37a390add82bccd13b", + "reftest" + ], + "css/CSS2/normal-flow/min-width-070.xht": [ + "b3888431117f0ff421e382224ffae46b3b35b8b0", + "reftest" + ], + "css/CSS2/normal-flow/min-width-071.xht": [ + "578a97af4d092243c39080cb663280146eb1d9c4", + "reftest" + ], + "css/CSS2/normal-flow/min-width-072.xht": [ + "d0726d670c40c7a332fef7bab5f5f99a74b8f9ce", + "reftest" + ], + "css/CSS2/normal-flow/min-width-073.xht": [ + "5f7c662fe43b6329642fceb3f16dc81fec22d18c", + "reftest" + ], + "css/CSS2/normal-flow/min-width-078.xht": [ + "e29cf646319150d78538b880bdeba69cff1a5484", + "reftest" + ], + "css/CSS2/normal-flow/min-width-079.xht": [ + "95fd45f21d09d48f582a5e98dbc8ac2e4f9a768e", + "reftest" + ], + "css/CSS2/normal-flow/min-width-080.xht": [ + "6ac5dd05b889a4c3dd6cc494aef25428b1760802", + "reftest" + ], + "css/CSS2/normal-flow/min-width-081.xht": [ + "4d9a9a811cc9a26b34b2a03d3ecc603bdfe1340c", + "reftest" + ], + "css/CSS2/normal-flow/min-width-082.xht": [ + "d4ff26e6bed00e7c86b5d77151abbc0298e0ad78", + "reftest" + ], + "css/CSS2/normal-flow/min-width-083.xht": [ + "fa80007f5a56c2dae15ea6890038dbd349104f12", + "reftest" + ], + "css/CSS2/normal-flow/min-width-084.xht": [ + "06df9d0ab9798bc170bf79464749b83794db4cd9", + "reftest" + ], + "css/CSS2/normal-flow/min-width-089.xht": [ + "aa94797dd90cbba97d4b2bfd8fb2fb6926e2c95d", + "reftest" + ], + "css/CSS2/normal-flow/min-width-090.xht": [ + "2bec9ac58876f9ca1a8e4f15648d201d4c1b1684", + "reftest" + ], + "css/CSS2/normal-flow/min-width-091.xht": [ + "28235aa7a65195f0667fe4f9544ab46cda6c78fa", + "reftest" + ], + "css/CSS2/normal-flow/min-width-092.xht": [ + "a7a68fe609a996aa2626ffa631250a5c1f82ee0f", + "reftest" + ], + "css/CSS2/normal-flow/min-width-093.xht": [ + "e730b76e52d2859109c1f26f116fc904281a15a4", + "reftest" + ], + "css/CSS2/normal-flow/min-width-094.xht": [ + "f7b30f3b8fc0a0c3ad64d1046be36bcc50e0c6f2", + "reftest" + ], + "css/CSS2/normal-flow/min-width-095.xht": [ + "64bdb5a56f5b0f98d842b0fd4e18c968a80026c9", + "reftest" + ], + "css/CSS2/normal-flow/min-width-100.xht": [ + "af648f0350158234a0f9937d1007c190e097715a", + "reftest" + ], + "css/CSS2/normal-flow/min-width-101.xht": [ + "713fe73018806dcd20faa91cbfc2069f6370fef4", + "reftest" + ], + "css/CSS2/normal-flow/min-width-102.xht": [ + "e869d5765ae6906360bb09018936f767edf33f94", + "reftest" + ], + "css/CSS2/normal-flow/min-width-103.xht": [ + "99d7db81e9d6a6b03c5caafe9b3ffd1c0e1cfa9b", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-001.xht": [ + "125a12bea03ce1ee9146ca6f4f59b0cbcbfdab7f", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-002.xht": [ + "4b00d04ad91fccbe44a00d5c45945629390a4729", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-003.xht": [ + "4d5ad571e3365ca0b438cebb267ed975b2313ff7", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-004.xht": [ + "175c1bf8714715e9dfd7a2931678ad2e0190da02", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-005.xht": [ + "0c02ad19029d4b5367c5c383911370335030e734", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-006.xht": [ + "20a16debe77f3724035f7e670c040ca033dbe3d7", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-007.xht": [ + "b2fa85f7f279ef1d632fe68867885760f0e8a44d", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-008.xht": [ + "6434d97eca23fcc0985406f95aa4d7ab872ee3a7", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-009.xht": [ + "b4463b9320d3b40a5cc9ed7dcfdf60adbe17641a", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-010.xht": [ + "de8abe5c2a02af2f63b8472809df09b4f30ea710", + "visual" + ], + "css/CSS2/normal-flow/min-width-applies-to-012.xht": [ + "b738ebe03d2a2edbbbc2c781c0719ecdcd7db130", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-013.xht": [ + "f475c8d53404c00000bacd6cf54e2e57ed2c17c0", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-014.xht": [ + "aabc6a579c64177579c3102e3572084f2f8875d0", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-015.xht": [ + "2a8340fd9e81b72563518159dea07ccaad4c11be", + "reftest" + ], + "css/CSS2/normal-flow/min-width-applies-to-016.xht": [ + "b13c41b93735502b36cdadacb4b53119f7174ade", + "reftest" + ], + "css/CSS2/normal-flow/min-width-percentage-001.xht": [ + "80852e597be1481ff0b8a60e3fdb4985fb626634", + "reftest" + ], + "css/CSS2/normal-flow/min-width-percentage-002.xht": [ + "bdef63d39f709036901d541c2dff16167f5fc51f", + "reftest" + ], + "css/CSS2/normal-flow/min-width-percentage-003.xht": [ + "3f43ab32fcea8ca32a63a210f5871c19f37cecaf", + "visual" + ], + "css/CSS2/normal-flow/replaced-elements-001.xht": [ + "a9605abf5b038e5f09476dea7d8b05c4a7c734c1", + "visual" + ], + "css/CSS2/normal-flow/replaced-intrinsic-001-ref.xht": [ + "9ec16ba1403d56c59b612d21e1546d6b4f705769", + "support" + ], + "css/CSS2/normal-flow/replaced-intrinsic-001.xht": [ + "a4a856382920effd8d8e3d7743a975e37a35e3b7", + "reftest" + ], + "css/CSS2/normal-flow/replaced-intrinsic-002-ref.xht": [ + "6c3b7b99200c9a963bf6d50b2d56e2d31425c342", + "support" + ], + "css/CSS2/normal-flow/replaced-intrinsic-002.xht": [ + "5da66aa723daf74018591583db2f5eaa1e111b73", + "reftest" + ], + "css/CSS2/normal-flow/replaced-intrinsic-003-ref.xht": [ + "1732aef912d2e3e2b3e7520ba63a4e1b33876c3c", + "support" + ], + "css/CSS2/normal-flow/replaced-intrinsic-003.xht": [ + "4ed45ef9029f52695e8cd445547238551b343ff6", + "reftest" + ], + "css/CSS2/normal-flow/replaced-intrinsic-004.xht": [ + "9b661140f441ac2222a903fa3387ef3b78a3b750", + "reftest" + ], + "css/CSS2/normal-flow/replaced-intrinsic-005-ref.xht": [ + "c01309116b7fd5ee6546dbcfbc02af5ef1087604", + "support" + ], + "css/CSS2/normal-flow/replaced-intrinsic-005.xht": [ + "c18b28197f9c810925ab27a924a706af666bf1c4", + "reftest" + ], + "css/CSS2/normal-flow/replaced-intrinsic-ratio-001.xht": [ + "5dc49dda688f33e4de08e7b9596be2d5c5ed6799", + "visual" + ], + "css/CSS2/normal-flow/replaced-min-max-001.xht": [ + "a9b955a8f1987e1c9fe7264135d237d375cf631e", + "visual" + ], + "css/CSS2/normal-flow/root-box-001-ref.xht": [ + "6207f7edf3218eec3e16cb3a4c11af9f1b41a8c0", + "support" + ], + "css/CSS2/normal-flow/root-box-001.xht": [ + "0fbfb4239d48b8e3fd07d27edf67c7b5102101a1", + "reftest" + ], + "css/CSS2/normal-flow/support/1x1-gray.png": [ + "82e0dc531e87935d58540959365e7097f84a7df6", + "support" + ], + "css/CSS2/normal-flow/support/1x1-green.png": [ + "51e7b6974a09eda6cb31337717c5eaeb9c44b443", + "support" + ], + "css/CSS2/normal-flow/support/1x1-red.png": [ + "b8da86921d04ba42f42b0a60b03c5c2172f58c2b", + "support" + ], + "css/CSS2/normal-flow/support/1x1-white.png": [ + "71b246439f915ad21c7d39414d9f85c8ed73b4ca", + "support" + ], + "css/CSS2/normal-flow/support/60x60-green.png": [ + "2f8eb2409b0a18e0bff90725ec7eedc16e7be448", + "support" + ], + "css/CSS2/normal-flow/support/black96x96.png": [ + "24664448bf07d7af7dccbae3e1e414c65c2a0ddf", + "support" + ], + "css/CSS2/normal-flow/support/blue15x15.png": [ + "eb48032c07bfeb1d3b6be6e5c9c34d2fe2180767", + "support" + ], + "css/CSS2/normal-flow/support/blue96x96.png": [ + "99949c515749e66f471c3589ee7a0ef518aaccb5", + "support" + ], + "css/CSS2/normal-flow/support/cat.png": [ + "461fd17b274662b88500cdf42bab7f3b79e6019d", + "support" + ], + "css/CSS2/normal-flow/support/diamond.png": [ + "4a136dfe39879f33f627a6de92f1e43fe8af7b94", + "support" + ], + "css/CSS2/normal-flow/support/green-rectangle-50wideBy10tall.png": [ + "4793a81fb04b63524970d8906c4ca0fc4e8571db", + "support" + ], + "css/CSS2/normal-flow/support/green15x15.png": [ + "de1830c21195763f7327f270b14b6d50dfdfb21d", + "support" + ], + "css/CSS2/normal-flow/support/green200x200.png": [ + "ebe48e65d6bfd090043fed5e003df47affe5b7ce", + "support" + ], + "css/CSS2/normal-flow/support/intrinsic-ratio.svg": [ + "ea0f0d1de3867fe22f617dfdabcdc1e66b294df6", + "support" + ], + "css/CSS2/normal-flow/support/margin-collapse-2em-space.png": [ + "75f181cc9321b22549e3bc48b57c53d7d551b060", + "support" + ], + "css/CSS2/normal-flow/support/pattern-grg-rgr-grg.png": [ + "cfb6ecc271c296c69b133a81f350a777b608bea4", + "support" + ], + "css/CSS2/normal-flow/support/pattern-rgr-grg-rgr.png": [ + "c100a35c361205932c506f1b3399753b91e4c45e", + "support" + ], + "css/CSS2/normal-flow/support/replaced-intrinsic-001.svg": [ + "08f8985990371085d40a80a18622c3976e3c8992", + "support" + ], + "css/CSS2/normal-flow/support/replaced-intrinsic-002.svg": [ + "90836bef51424fe238dccc16e2e3ff0532b949f1", + "support" + ], + "css/CSS2/normal-flow/support/replaced-intrinsic-003.svg": [ + "b2ad23007257a4b4630e341e1f658a6814858033", + "support" + ], + "css/CSS2/normal-flow/support/replaced-intrinsic-004.svg": [ + "3b7eea89b54e256511af4f62ce88cabf7416b560", + "support" + ], + "css/CSS2/normal-flow/support/replaced-intrinsic-005.svg": [ + "cd0f95b3d59106342ef1ec932c0116ef47a5e626", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-1.png": [ + "eb7f1cd715b1d434810566f438fd019e62cf6e30", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-10.png": [ + "eb1614135682a0013755a0aaacd305e4f53a6c86", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-11.png": [ + "8c58f8f0871a1b72139fef1f1a42955e198b1903", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-12.png": [ + "8902e4cc2a19663747bb49e31da1614783d770da", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-13.png": [ + "65aa612e32c62154e9fa909cab37e0367360398a", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-14.png": [ + "b21317e0466ad5858865c43b4cca10d8fa946177", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-15.png": [ + "37c38f39283e6f17226d2192a22dbabb81f8ecce", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-16.png": [ + "7903f877d26d5da09d5c28f1de193da4cd3b6031", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-17.png": [ + "2c97f9f4e356e5cfed4af868b1ada3b193cb6f68", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-18.png": [ + "bf09dc274128d1e9187330eb64b9e85bbc04c492", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-19.png": [ + "fc7bbab3384fc0c3b4c2c0c44f48d4617d740fb5", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-2.png": [ + "ed4b94ee0d86c738f65768755bd812827cdadcf4", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-3.png": [ + "64258a8271f44e9e6e8fc4784e6e4cadbd5d58d0", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-4.png": [ + "36ee94c5c1c04bddc678017b73a04ac47a37ba25", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-5.png": [ + "6765f3c73f657a97352c9abc66c16e403b038335", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-6.png": [ + "4d90d4bd094dd50e1e7f199c6e73bb4b955ad844", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-7.png": [ + "c9be0c61b015bc47784e2119c697c6d34d266634", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-8.png": [ + "ea940c954fd98c31d717ed09a8aaa3416cad37c6", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max-9.png": [ + "1c1e5ce29fff6462c54a1c6c8a3bcb498b271c68", + "support" + ], + "css/CSS2/normal-flow/support/replaced-min-max.png": [ + "656f2af655165c1395ae9cc31ece057b0a8eab3a", + "support" + ], + "css/CSS2/normal-flow/support/ring.png": [ + "11dd9e78a68b2fc5eb69c401920b43070751a569", + "support" + ], + "css/CSS2/normal-flow/support/swatch-aqua.png": [ + "54b588a71cf45dbc9b982a78a8640467e62ba249", + "support" + ], + "css/CSS2/normal-flow/support/swatch-blue.png": [ + "e79958e10feeeed3db88dee9bae9ea80055593c5", + "support" + ], + "css/CSS2/normal-flow/support/swatch-green.png": [ + "c51a03a807743f59e3027371ccfbd8e80235a485", + "support" + ], + "css/CSS2/normal-flow/support/swatch-orange.png": [ + "10768a5177b772013e628c7397ae64725057295d", + "support" + ], + "css/CSS2/normal-flow/support/swatch-red.png": [ + "eedea3e9a99c18f5fc2de3796be2c6f9da2ea07d", + "support" + ], + "css/CSS2/normal-flow/support/swatch-teal.png": [ + "994cd98028aff20822f2dca5a6058fb616bf5ce4", + "support" + ], + "css/CSS2/normal-flow/support/test-bl.png": [ + "16e4eaa4864c10e72433e575f59c9b67763fe06a", + "support" + ], + "css/CSS2/normal-flow/support/test-br.png": [ + "37f65e7a21d9b9b2daa508f193b8f665c58a1ce9", + "support" + ], + "css/CSS2/normal-flow/support/test-tl.png": [ + "956e5156fd8c0e75b1c0f3b8b3b900b653663f74", + "support" + ], + "css/CSS2/normal-flow/support/test-tr.png": [ + "078e1dd6dd61d36cec239ed75d02051f61fe60a5", + "support" + ], + "css/CSS2/normal-flow/table-in-inline-001-ref.xht": [ + "5d03e5b31d5d7466c0b70fef2ebd95f6bcc92435", + "support" + ], + "css/CSS2/normal-flow/table-in-inline-001.xht": [ + "62aae8605308e22c641111007fdc8709507d021d", + "reftest" + ], + "css/CSS2/normal-flow/width-001.xht": [ + "c43946e15b0dd2a0635f86f7227b112d878f6c17", + "reftest" + ], + "css/CSS2/normal-flow/width-002.xht": [ + "a8be31abfe9866717a07a50e5d57a13ee9abea7c", + "reftest" + ], + "css/CSS2/normal-flow/width-003.xht": [ + "1697a1ff283475c766903b2445922fa0edf497b8", + "reftest" + ], + "css/CSS2/normal-flow/width-004.xht": [ + "18feabb4f468134cccf5240bbe55a107748434c3", + "reftest" + ], + "css/CSS2/normal-flow/width-005.xht": [ + "82aece76b9dd70d87e0c27990c2198c3b64c2190", + "reftest" + ], + "css/CSS2/normal-flow/width-006.xht": [ + "4b8e47f44d63d4c9fdd402b131224005ab8a765b", + "reftest" + ], + "css/CSS2/normal-flow/width-007.xht": [ + "be458faedb167b9d6044a5046a3ad2b8c1056adf", + "reftest" + ], + "css/CSS2/normal-flow/width-012.xht": [ + "d4aa591daef148608c9a8321ee10c5a5546dd05a", + "reftest" + ], + "css/CSS2/normal-flow/width-013.xht": [ + "b70eedc65ea1bdf90912430b568aaa74ad4562d5", + "reftest" + ], + "css/CSS2/normal-flow/width-014.xht": [ + "2cba7edd1b4eb736b325760da433ec815a942f4c", + "visual" + ], + "css/CSS2/normal-flow/width-015.xht": [ + "08385a3e2baaa249ebde35df74578219237021b9", + "reftest" + ], + "css/CSS2/normal-flow/width-016.xht": [ + "32e0323afd2aa553adff499f5d6b4943f5794ea0", + "reftest" + ], + "css/CSS2/normal-flow/width-017.xht": [ + "03057a5fff3d21f525a19d43d9dee285cb08ab62", + "reftest" + ], + "css/CSS2/normal-flow/width-018.xht": [ + "e94b5160a319872dd56007b58f802aaa4c20f905", + "reftest" + ], + "css/CSS2/normal-flow/width-023.xht": [ + "355fe59e6c3712710363d64a952f395a70e312e2", + "reftest" + ], + "css/CSS2/normal-flow/width-024.xht": [ + "03e8daa44640b9bfe686d31e23581950923943de", + "reftest" + ], + "css/CSS2/normal-flow/width-025.xht": [ + "59cb90b7df2333e02b05f99ccb3aa847467a89de", + "reftest" + ], + "css/CSS2/normal-flow/width-026.xht": [ + "264b22dcbc3c1d7bf0dc79e4e1fd2471190fad04", + "reftest" + ], + "css/CSS2/normal-flow/width-027.xht": [ + "595f23a4c537ebb469ff2f33b1d8c8698e5424bd", + "reftest" + ], + "css/CSS2/normal-flow/width-028.xht": [ + "bce83a3b66900386f8af7ce962fb59a3f935c5b1", + "reftest" + ], + "css/CSS2/normal-flow/width-029.xht": [ + "42dbc1eb411a94f0a89a1a63d4427a1f2f0dfabd", + "reftest" + ], + "css/CSS2/normal-flow/width-034.xht": [ + "5b9e667b6937d613ef32f7edc709a0f0e89878c8", + "reftest" + ], + "css/CSS2/normal-flow/width-035.xht": [ + "4e6ddfbfbb430bd0ee46c255b39ed72bb7d33b6c", + "reftest" + ], + "css/CSS2/normal-flow/width-036.xht": [ + "26974b86ae0aeebfc96f74526ad5aef45d16fada", + "reftest" + ], + "css/CSS2/normal-flow/width-037.xht": [ + "0af96e4c848dc41d7d4bbdaa5d3282b2095b1a01", + "reftest" + ], + "css/CSS2/normal-flow/width-038.xht": [ + "4f73ea65290747a2be31d0ec3db0f90aa9831be7", + "reftest" + ], + "css/CSS2/normal-flow/width-039.xht": [ + "e10c0bf4caccf4d7f41659e3e88758d7daad362e", + "reftest" + ], + "css/CSS2/normal-flow/width-040.xht": [ + "b525c42d6e6209a935999ac4ed5420ee8738161a", + "reftest" + ], + "css/CSS2/normal-flow/width-045.xht": [ + "c55e3e6932f247ab06d96b598ddf390970f32738", + "reftest" + ], + "css/CSS2/normal-flow/width-046.xht": [ + "1d490630ef672771b439ee81c71b118bd65a49cf", + "reftest" + ], + "css/CSS2/normal-flow/width-047.xht": [ + "18b6042b6cc6d715b004cbe611b8e03f5fd1e57b", + "reftest" + ], + "css/CSS2/normal-flow/width-048.xht": [ + "b4476ccc9fa4aa929d70def185c416727a41f2ab", + "reftest" + ], + "css/CSS2/normal-flow/width-049.xht": [ + "d04583008ce58e6064c4e615427bf781b4f033fe", + "reftest" + ], + "css/CSS2/normal-flow/width-050.xht": [ + "cfdf7a8e5576880cc0d40e7af833bda1b16c648d", + "reftest" + ], + "css/CSS2/normal-flow/width-051.xht": [ + "e4b94192a86a64d380a103a4619e5766dddfbe88", + "reftest" + ], + "css/CSS2/normal-flow/width-056.xht": [ + "80d6a8869fc5a7fcc67850e989913c7097dbfcf0", + "reftest" + ], + "css/CSS2/normal-flow/width-057.xht": [ + "318d4d619cbc6fed1490f390b9b1e1538be95c1e", + "reftest" + ], + "css/CSS2/normal-flow/width-058.xht": [ + "2d9cbd0e95c23527657acded9e1362a8b8fe6016", + "reftest" + ], + "css/CSS2/normal-flow/width-059.xht": [ + "a926174f4d197565c3c7aeddc995547278a03805", + "reftest" + ], + "css/CSS2/normal-flow/width-060.xht": [ + "7ac15bf9a98786f5de4b76076ec8bbb8ea7d5a6f", + "reftest" + ], + "css/CSS2/normal-flow/width-061.xht": [ + "80faea68a304a73f8bbe59070ed658a552fbb14f", + "reftest" + ], + "css/CSS2/normal-flow/width-062.xht": [ + "a6bdfefcfcf13ee5826df255923f879957322bcc", + "reftest" + ], + "css/CSS2/normal-flow/width-067.xht": [ + "df021529b15e8fe6c3df092cfaec7761ef4c55af", + "reftest" + ], + "css/CSS2/normal-flow/width-068.xht": [ + "bfbb89ef33e4f7dce8116847de6d4bb7b74a7ae0", + "reftest" + ], + "css/CSS2/normal-flow/width-069.xht": [ + "9c8e97e05621fe6ec68c0ecdc124812054d6b75a", + "reftest" + ], + "css/CSS2/normal-flow/width-070.xht": [ + "3ab13d9cd676643428076bf9d8a791e8b9f8d5bf", + "reftest" + ], + "css/CSS2/normal-flow/width-071.xht": [ + "20cd4d6da2473a16769c6bc3baa68bf7b18198e7", + "reftest" + ], + "css/CSS2/normal-flow/width-072.xht": [ + "6950f3b41afa280a6ae9027bbbb8c1fe6fa074d7", + "reftest" + ], + "css/CSS2/normal-flow/width-073.xht": [ + "76cce3b2e9d23a92c9824d0cc802339a8031ff7e", + "reftest" + ], + "css/CSS2/normal-flow/width-078.xht": [ + "dfeb46f7c72ede8bee270192975c2b9b8051bf1a", + "reftest" + ], + "css/CSS2/normal-flow/width-079.xht": [ + "9e3a55847ff6d86b9bb23b201d53d548d432075a", + "reftest" + ], + "css/CSS2/normal-flow/width-080.xht": [ + "df0400b74471d4f708f2a8c2b5e61e05eabf45c8", + "reftest" + ], + "css/CSS2/normal-flow/width-081.xht": [ + "7d5979419c563f444d52d387fd0d75d42670e6f1", + "reftest" + ], + "css/CSS2/normal-flow/width-082.xht": [ + "db4cc95ba12cea3d03fbe945b4a356a84c6afed7", + "reftest" + ], + "css/CSS2/normal-flow/width-083.xht": [ + "08ee90d19f120f8d2a2f1cc1d73262abb714f389", + "reftest" + ], + "css/CSS2/normal-flow/width-084.xht": [ + "60e9b29472f89bec8e2648f251d1b39424972a77", + "reftest" + ], + "css/CSS2/normal-flow/width-089.xht": [ + "391ca2fd1384ff95845ce1588dcd191a07ed80be", + "reftest" + ], + "css/CSS2/normal-flow/width-090.xht": [ + "1d1206707bc51eaed21324fc376a3ff9595fee73", + "reftest" + ], + "css/CSS2/normal-flow/width-091.xht": [ + "40c6de4fe9f6667752b6c81ea71ee4801b40981f", + "reftest" + ], + "css/CSS2/normal-flow/width-092.xht": [ + "1370aafa4d6c47cb1a589b8cd5d75ca4233b11dc", + "reftest" + ], + "css/CSS2/normal-flow/width-093.xht": [ + "e83061715b705f8dfa1fc0b4500f62ad9fe39cdf", + "reftest" + ], + "css/CSS2/normal-flow/width-094.xht": [ + "a03df05f37b7fb216a6fe96020cdaedbfbea25e8", + "reftest" + ], + "css/CSS2/normal-flow/width-095.xht": [ + "294fb685af7dd0f835f40bc7050aeb7d8d692437", + "reftest" + ], + "css/CSS2/normal-flow/width-100.xht": [ + "1785c4d73cf4dc61d70997c24a68a9c84fce48ef", + "reftest" + ], + "css/CSS2/normal-flow/width-101.xht": [ + "d673003eed9c073f9be68f66fd9e12faf8846dab", + "reftest" + ], + "css/CSS2/normal-flow/width-102.xht": [ + "38351a76a83b4b09484b67b981eb6c0dbe7609f9", + "reftest" + ], + "css/CSS2/normal-flow/width-103-ref.xht": [ + "1c1ccc22356e2f4a502cc118ef2b5bf990e00061", + "support" + ], + "css/CSS2/normal-flow/width-103.xht": [ + "cc27192d0453e10acc18bc4527063ad8421c1174", + "reftest" + ], + "css/CSS2/normal-flow/width-104.xht": [ + "b038d9a837f6ef726baf2ae81ce76e5286c6db07", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-001.xht": [ + "298dcbe60aa2ed812d3a0fab9a6acae4f544ba19", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-002.xht": [ + "9a0940865c11f570da32c686fa1548ed5cd18a9b", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-003.xht": [ + "286dcd0573f29bb5fd7522241087357e7de43b46", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-004.xht": [ + "70725e6034263aa52df8608dff4b47b3270c2cdb", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-005.xht": [ + "66357dba885723acf53c1d09e1716469cc32caa7", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-006.xht": [ + "23bca29b4749d1e3c8071c81eb01b96038268327", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-007.xht": [ + "131cd80045be083a5e67f8906888ccf86c3b7b4c", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-008.xht": [ + "de5b4f302bfb21cd7135c39db6126fe14f8203cd", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-009.xht": [ + "2b0eff4027c88b6800a951a9b5af70455402b5ee", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-010.xht": [ + "e5750f1aa554692a0910203a7489d686c52a576e", + "visual" + ], + "css/CSS2/normal-flow/width-applies-to-012.xht": [ + "dc157892ff0829ba2e594750f83b375b1a135cfd", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-013.xht": [ + "9ececfda9af9cc771a68c34f91e9a0c070becf7f", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-014.xht": [ + "29ac1143e50bc14dc375b96973a4ce8c14e37410", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-015.xht": [ + "12dbbdc7354ba8cdc1edfb14a5cb9ada133ea9f1", + "reftest" + ], + "css/CSS2/normal-flow/width-applies-to-016.xht": [ + "e6ad61b4d41ec8649f2552c73a1942d5e08396cb", + "reftest" + ], + "css/CSS2/normal-flow/width-inherit-001.xht": [ + "e12ea1ffae7291ba97850bd8c9d26a363e8a3e8d", + "reftest" + ], + "css/CSS2/normal-flow/width-non-replaced-inline-001-ref.xht": [ + "bfa75cd0e8dc6f262f89d8b53ff7b55c7e4e6296", + "support" + ], + "css/CSS2/normal-flow/width-non-replaced-inline-001.xht": [ + "799183de91df21c07c45eb0955480c5ec5b9e2bc", + "reftest" + ], + "css/CSS2/normal-flow/width-percentage-001.xht": [ + "546ca4ca40f805f8292f0764c6efc92c96a53a94", + "reftest" + ], + "css/CSS2/normal-flow/width-percentage-002.xht": [ + "3047e3a6456ab3e57eb029d7e837aa2b33e026a9", + "reftest" + ], + "css/CSS2/normal-flow/width-replaced-element-001.xht": [ + "6dd891ee7faa3e96180d8b4fec302355c1bb68a1", + "visual" + ], + "css/CSS2/normal-flow/width-undefined-001.xht": [ + "7c30f983fe0de798db50271f1b2927d886c250c7", + "visual" + ], + "css/CSS2/positioning/absolute-non-replaced-height-001.xht": [ + "ab3813879cd95fb5aa28607960bf29557878ca8b", + "visual" + ], + "css/CSS2/positioning/absolute-non-replaced-height-002-ref.xht": [ + "ea643b87ffb79bf7a4809ee5d211e3623a5ee595", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-height-002.xht": [ + "6746746fcbd054927a582bf509b41fc8059d9cd0", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-height-003-ref.xht": [ + "ceffe8972fa8e6207d20f5fef136d1bfce8c014e", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-height-003.xht": [ + "fb399fb2b571f8a378a90cb21287980b4f25f517", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-height-004.xht": [ + "4b7ed7da20ed3a8c4d2bccbf12527c906ea755c4", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-height-005.xht": [ + "ea9029e95e66ccc220ab915152756012c08932e6", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-height-006-ref.xht": [ + "8cc7721251b682d28991869e51a2e7990c84291c", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-height-006.xht": [ + "18219f0b40e8df04633f337c75f16e54f5081c98", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-height-007-ref.xht": [ + "52c9a5086d4a943555e9e17875b75404bddf4eba", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-height-007.xht": [ + "a6b655e74092373c6618771385f86591a375ed60", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-height-008-ref.xht": [ + "8a30fc2055900263befcf0e9213d6fb0a1373a4c", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-height-008.xht": [ + "e3934ea7a1eb30089bf468461ea5385c89dbaae7", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-height-009-ref.xht": [ + "334ce8b805edec355402271650bccc2ad0ecb74a", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-height-009.xht": [ + "f9815dbbf4bd5f8308c284c7971568f9dc56b935", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-height-010.xht": [ + "06782c1b10013f971b431b5fcd51d9c7055a4952", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-height-011.xht": [ + "726a67748f1a91c6ab9d0fa9ee589424eecae0f2", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-height-012.xht": [ + "578fb958b49fd65875239a431fa1fecec62350fc", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-001.xht": [ + "4a9840422411154393eb6b6cbd988bbc4dde1162", + "visual" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-002-ref.xht": [ + "d0a82c0d64eae4043ac86e24c6f51d9270a2b16d", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-002.xht": [ + "0a0f05ebb189e9092b3c3232cad0ffa3f0a32297", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-003-ref.xht": [ + "595090f3a568214bb386095ca401556a31be4da2", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-003.xht": [ + "fdd24388fa424405c9602885ffd6cb6db1ef0dda", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-004.xht": [ + "8985892632df8a478192e6a819fbcec8c28fff59", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-005.xht": [ + "45c758501dbaaf7f47138a3227800b7cfb31cf9c", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-006.xht": [ + "be3a22dd43156e7fbca3bf68abfd814539607f46", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-007-ref.xht": [ + "6c779a32da2a9bfaf1c05ac2e29672fe68e7a1bf", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-007.xht": [ + "846579754765d4ffe9ad6b57f30cb13c890b9520", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-008-ref.xht": [ + "7f2c0f96d61f952a037b54cd926b274df42f1639", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-008.xht": [ + "bedf5d761cefd610a8e1802fe3a119c6d9ec5bb7", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-009-ref.xht": [ + "e2355bb09b0e1be6be86a99ffba8dac95a952b39", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-009.xht": [ + "1a85382a62c5dc0b303eadde01146716b5d821ec", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-010.xht": [ + "d9567b50d00e742494648bce2c44730bc7a46164", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-011.xht": [ + "9e17a5e85138b683028c64152bb6c3fa3c08c393", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-max-height-012.xht": [ + "2385f04b8450f06c86bf290397b8a6250891b928", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-001.xht": [ + "492571e69e44aca55a29c9f52f80ab5f0db57214", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-002-ref.xht": [ + "9058363b2f4b7657b3ffd9522739b095023adfe9", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-width-002.xht": [ + "abd214ff1ac68d72424b749963f766bfcb93c4d3", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-003-ref.xht": [ + "8d5f10c2d94b8fb7fe49231439e9b1e1d002a802", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-width-003.xht": [ + "81fb744d7e7766f9240c1bb1978169a65112ad3b", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-004.xht": [ + "54a6d0e4cd5a528298be17128f663e4848d6cce4", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-005.xht": [ + "181a16571c13447ae75ce1c05a900e125c8d3d1a", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-006.xht": [ + "059fa8c60a2fe66f43420d16d7fb7947b18ced4f", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-007.xht": [ + "9ea4217f181e90a473721560cc03d8d97f27af8e", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-008-ref.xht": [ + "cf93a82086805c22cde936934fc308daeb286539", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-width-008.xht": [ + "91f32f57b13894f7f835abf6710a788cce062fa6", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-009.xht": [ + "7a0fc394b6aef0547a4a47b1a45a32d359086cf1", + "visual" + ], + "css/CSS2/positioning/absolute-non-replaced-width-010.xht": [ + "7d5c335226aff433222b0e8d27be0583248156df", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-011.xht": [ + "709cf845173aabb6632d01f122668b1f082e40a0", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-012.xht": [ + "8315ff20df09fb3f1faa5c9c3f79625485cfd098", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-013.xht": [ + "4d34e6fd650df15f00c0b6906a5e8c0b961a2d56", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-014.xht": [ + "fe610aa9a6a6d9a7e0726cea83f1a6e0491a2456", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-015-ref.xht": [ + "f909d6a93644d74c7f54269933eb8162a5f9903a", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-width-015.xht": [ + "61ef23e4d0fc1f772e38444045a6c0e6e55ee854", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-016.xht": [ + "05f1f2227d479e6e5379fd8e1e534c25879d2a18", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-017-ref.xht": [ + "c38213a432ff3d7ed85b5e91f35bc684b132f833", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-width-017.xht": [ + "5e57e70ba9d37338ae48c361246ccb9e6a63c9df", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-018.xht": [ + "9c1f36a18db5c6446106dd012a34ce86b6c6a909", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-019.xht": [ + "ceeefd5649b1453ffaab8b84f3be7198a877a599", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-020.xht": [ + "b847f274c1dd64575d3fea70a7e09e5654888bdb", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-021-ref.xht": [ + "c398bcc35f27465ae877a68b2ada1126f40fb2e7", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-width-021.xht": [ + "5961b687e88009a74a9ad205528ddceae115ed4d", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-022.xht": [ + "5913d7460e3d479595e015188311164dc756919f", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-023.xht": [ + "5f2e8026fef6afe883a4b5280faa405c90e0dd19", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-024.xht": [ + "ca68648dd598de5315dd9266f3b01696accbcf30", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-025-ref.xht": [ + "98fcbb89dac2db4a8fdbc177d788d0f26a3f33fa", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-width-025.xht": [ + "c10dbd98d4dc26da1bfadc53064cd9d53e297f13", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-026-ref.xht": [ + "9a49224b6bf0ebca62f2a76577bcc232cbaac9db", + "support" + ], + "css/CSS2/positioning/absolute-non-replaced-width-026.xht": [ + "c0a7c71273d3dc15eeb671ddcd47baf4d65eec63", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-027.xht": [ + "687af01d0ac556f71fda5854ed35c5dff6394891", + "reftest" + ], + "css/CSS2/positioning/absolute-non-replaced-width-028.xht": [ + "9c31da66b8721fc5c6d761395f53c40b7f6d1d21", + "visual" + ], + "css/CSS2/positioning/absolute-replaced-height-001-ref.xht": [ + "113b1d641017e3eea22b354260a3b2918fdd072d", + "support" + ], + "css/CSS2/positioning/absolute-replaced-height-001.xht": [ + "c03cae5b9651662f601174a07f14c8837105c813", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-002-ref.xht": [ + "f42492c135aeff7c2fc882fcefeccbbc5959f1d0", + "support" + ], + "css/CSS2/positioning/absolute-replaced-height-002.xht": [ + "398e31ce72f10dcd355092c38b104e41db68614e", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-003.xht": [ + "0656f32cb02586f7ff3a131bcb53f9931fb3d992", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-004-ref.xht": [ + "4cecc6a4a47ecf26cabc9ff832bc5486e52b0aab", + "support" + ], + "css/CSS2/positioning/absolute-replaced-height-004.xht": [ + "e4951dd6893661077419ee4d0e7739c4211559c9", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-005-ref.xht": [ + "7d1c316b06175131fc156a0b305c9036e9a7170a", + "support" + ], + "css/CSS2/positioning/absolute-replaced-height-005.xht": [ + "40ad8f15c3969b5e697fea21ccaaad0ad3389aac", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-006-ref.xht": [ + "2b44563ee5c5a397a5b165e7ce1b42ead71600bd", + "support" + ], + "css/CSS2/positioning/absolute-replaced-height-006.xht": [ + "c90348c475df53c58fbf9e3aaead08bfc0cdca7f", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-007-ref.xht": [ + "03be962783199b27c4291f29c969b3f55cd0f5f0", + "support" + ], + "css/CSS2/positioning/absolute-replaced-height-007.xht": [ + "c6e7230c9378e44f5f702f6a1e3274dd25017380", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-008-ref.xht": [ + "205b82a64ad972138827a593df0129c0b03aeff1", + "support" + ], + "css/CSS2/positioning/absolute-replaced-height-008.xht": [ + "8ea6a25502bd284df4e83eeb926266ca41bc42a6", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-009.xht": [ + "b2bbc3ef671ea038f76bf755c96da6f6f1687785", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-010-ref.xht": [ + "4475bddb3c428de0f60baa4f22650e4003eefa1c", + "support" + ], + "css/CSS2/positioning/absolute-replaced-height-010.xht": [ + "5f09d580f30832754f24cdf7dc4b5e26eb867645", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-011-ref.xht": [ + "d0b95d6b19fd0f403259c621ad6dcf637617c0cc", + "support" + ], + "css/CSS2/positioning/absolute-replaced-height-011.xht": [ + "2801dbd7d81a17bd37edd64c0fe8ab4984271395", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-012-ref.xht": [ + "f440173e71adf9a880d6a0389a9c3557f78c3fe4", + "support" + ], + "css/CSS2/positioning/absolute-replaced-height-012.xht": [ + "bdef179d943c4c71665d359dd95ac4bc8ad53029", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-013-ref.xht": [ + "6ee3b046eb04a4485626e9eb9fa6a0f47c8fbd7f", + "support" + ], + "css/CSS2/positioning/absolute-replaced-height-013.xht": [ + "24c5e7e587a2a746143177aeec2912e35d1a691d", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-014-ref.xht": [ + "e411ccd8fc22903b4bcbb49b4a8e8817b7ae4791", + "support" + ], + "css/CSS2/positioning/absolute-replaced-height-014.xht": [ + "ad3e998ca241189dd2da7affe9ce6c5974a96177", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-016.xht": [ + "448807d5914665fd1cd6186c430cad67f4d757e5", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-017.xht": [ + "0fecd8d993f0402335bb9f6a614ca67cc307e01d", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-018.xht": [ + "c7f894f4aaed78309230d46f414b95074a473c71", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-019.xht": [ + "22ed5514cd548f7a4f447b0adb06d87d04859146", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-020.xht": [ + "c762aefef5aa670602d67ccf8d371e5380b25d97", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-021.xht": [ + "f22fe47a1c9cc7db406bbce50cb7adb34372b2f1", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-022.xht": [ + "aab5de3daaf6404ecbf389d92a2b970da284ddd6", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-023.xht": [ + "d5758b2992e9c5b0e20fa94603f343dffe7e8521", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-024.xht": [ + "1ca571a4b51a630c347aa2dad34c145e62173120", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-025.xht": [ + "e6122aab9278509f8f29245bb673bbd3d2961363", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-026.xht": [ + "99f2bc9bb83aab714fd2c27b9e46ac30ba7e3098", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-027.xht": [ + "79d5944c1f830f7b5c23c62785a2a5475059af9d", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-028.xht": [ + "135bac676a58deeba746064002f48bd20c173813", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-029.xht": [ + "09e6651a9e49a4c64cde35007796c6533efc7d70", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-030.xht": [ + "6a81511568186be3431024f9587c1ec425dfe979", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-031.xht": [ + "8a6260c7b9b7e591c4a560fb4d189d9196208955", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-032.xht": [ + "3c7a621e10bd1a0ca80b9b373da0726239a37782", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-033.xht": [ + "3045a7f1589ae81f37cba26c602717689eff6780", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-034.xht": [ + "ec02c99785f0714afc14f7365590af511359da9a", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-035.xht": [ + "80be0e5a47d903579a32a41cfad932d9379689b7", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-height-036.xht": [ + "294ffd246125ae422bd69cf3745979aed37b1fe2", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-001-ref.xht": [ + "abea5ee4d1feeda0cecd27c120fe3653b0dfb0bc", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-001.xht": [ + "7c9de100b8e6848d319f920de40717e3eb6a7951", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-002-ref.xht": [ + "c0f711c20a73af1b67343f235d7b75c9f17f2ac7", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-002.xht": [ + "161d61eb702273bf3183b87c5cda652a42e1ad86", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-003-ref.xht": [ + "d000a70dd9063e7a536bba18cd8b6eaca0ddb203", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-003.xht": [ + "e9956e1023039d7ea43d4a5e2c8f02533dfd041d", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-003a-ref.xht": [ + "10442dd361867e6cc4aa2b45d92281fcdf23898f", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-003a.xht": [ + "76ba6c59274f96810e61e9088a05d950c3fe1b5a", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-003b-ref.xht": [ + "48d3f913e77f3d67f4ee5ceecd88d69cae5bf418", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-003b.xht": [ + "62f055cfe03002cd841da926af68974b6cae3398", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-003c-ref.xht": [ + "ee26a908e3b237015b997e6d51c1f6487c8906fc", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-003c.xht": [ + "8033da54a2033a8078d2287538d030d1d9f63421", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-004-ref.xht": [ + "4e3d05d66ecbd958f0f7c14db20365ffb86537ad", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-004.xht": [ + "eee162f88e7597c5eb84647ba6ea778e98f04aff", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-006-ref.xht": [ + "3fa360472777d08adb89a22ece068a0b0dbaf174", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-006.xht": [ + "02debc6ce54bc2487a50a3154b94612d3b11a5ae", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-008.xht": [ + "a7b18ec0376adf32111ba9c3e10c1266616a15ce", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-009.xht": [ + "ee4a7218688febb2fb4aeb9c7ce9ffb97fbb17f4", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-010.xht": [ + "785830f600f7b73414ac465e00dc5d2092defa4d", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-011.xht": [ + "ab7afe6072b6d1d53ff10448e2ef7c21b96cbcf5", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-013.xht": [ + "b464e096ccb1bc02a89592946ea9f312e7709f2e", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-015-ref.xht": [ + "832feb77298e90bf8bb8f06ce13eee8c82ab7821", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-015.xht": [ + "0eda36c771d149d021da42a05033c782756bafba", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-020-ref.xht": [ + "d7eb879625a5b4a9c1ae4eecf284d1519df22d25", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-020.xht": [ + "eedde84b13728c3800f49ba5033490f7ce52e507", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-022-ref.xht": [ + "f7bfa9ae92e9e0b966bbc9b75c80ee99b2b81bb1", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-022.xht": [ + "ba3185653f532055d8d735665e2f957e56203f43", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-023-ref.xht": [ + "5b8e04cb5740f7389056e44daddd52b96f40c692", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-023.xht": [ + "e1e920fabfdb573d0d50bfa9e83caa55052c152f", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-024-ref.xht": [ + "ae43810f3d490e20878fc44d3e7f14c8412bfd95", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-024.xht": [ + "98b913765002fc75029fdc9698bf6d80b5eba64f", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-025-ref.xht": [ + "b0ab95e1bf276e09afef2e9b7c6cd99c94ab4fd0", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-025.xht": [ + "42dd6578a7942d38e2e729f3c2196f348b5a1a41", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-027-ref.xht": [ + "2c3b02cc80860855e4a0830c8bc4da03905367be", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-027.xht": [ + "0d562337db1daa90c3846a0ef7ed639b09de723c", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-029.xht": [ + "f934ca5d7a1de6fd9051e82dd79e90ac2925fa70", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-030.xht": [ + "3226978be5ea8500d72865cfe683c88e58577c2e", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-031.xht": [ + "9d775abf6ca0d5871cf6cb91e6f3575ce6a27f86", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-032.xht": [ + "7f1c94a4769b9f1c827f617f35ade327ccfab8ae", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-034.xht": [ + "f861d7fc26ab0cb16624207395e500ef7d5c8352", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-036-ref.xht": [ + "49c79d5891e51a84d0ed92ae40727a3071f95d41", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-036.xht": [ + "e1f577742ba6476ba3905dc68199087f43d326f0", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-037-ref.xht": [ + "ca7c510fac67363890110df01d869670045b6fa9", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-037.xht": [ + "6df9137b3fd09e5536db4f3d824bb71a581fc6d0", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-038-ref.xht": [ + "8a20e9e6539f92babe9cf01fbc37a70539879f9c", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-038.xht": [ + "c488c2157cd28e2338db26b01345291d6d5b30f2", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-039-ref.xht": [ + "d1628ba637d043512ad1901b2a16b118bb2d238c", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-039.xht": [ + "d6b0ddbeb2bac1070b803e1aa2c3c1ec87452a40", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-041-ref.xht": [ + "9e27d87546595fdb5c140ed2721cd0d73fa0d3e9", + "support" + ], + "css/CSS2/positioning/absolute-replaced-width-041.xht": [ + "57b1b9eab1642859728fc1593605be6e245d7d74", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-043.xht": [ + "310f2ab9b083f9580e66f3d156713ec399f39c3f", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-048.xht": [ + "cfc703cecace764d65eab3c800df3eb8660333c0", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-050.xht": [ + "5c4144badf6a2ae2e8ec28e7b812434a876ddc17", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-051.xht": [ + "ad557c6eaac2f4362a8d474d5c8b1803edef40a2", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-052.xht": [ + "959d2bbe8475402a5334820e82dd3ca2fb00df08", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-053.xht": [ + "950097188533fe95b82d9e61e37ca94db35825cc", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-055.xht": [ + "cc07eeec41f7979420e2828161be91041ae5aa47", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-057.xht": [ + "bf10595fd66622740454bc16eb6c91002ca6519f", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-062.xht": [ + "e9957c2416e1567292134637c313221e5a9ecc8b", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-064.xht": [ + "3ca799b205578c362400d6dd3c0d1d0decd774c2", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-065.xht": [ + "7475928e388295a02f3d66ff55f3f78488b2a1b3", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-066.xht": [ + "6e6345de8531e8305638b37dce66a177f35c2956", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-067.xht": [ + "43a56695c8b49154d79e3eb5038a207b3bea961e", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-069.xht": [ + "adf6625ef23ccef8681fcaa875ce1150b42efb1a", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-071.xht": [ + "f7932ed70695f043d2137bdd0a5f0fd97dba9d5c", + "reftest" + ], + "css/CSS2/positioning/absolute-replaced-width-076.xht": [ + "2312ab4dcd53d1933d49030c9e2dd36a08bd39db", + "reftest" + ], + "css/CSS2/positioning/abspos-001-ref.xht": [ + "b1ab54a135028aebf128b95b96be9b0754b4ce7e", + "support" + ], + "css/CSS2/positioning/abspos-001.xht": [ + "8f464d0cbf27418c750027c6d3a2eeaffe3c4076", + "reftest" + ], + "css/CSS2/positioning/abspos-002-ref.xht": [ + "9c24cecd29b8e2a89af6761e410c907d9f73fa8c", + "support" + ], + "css/CSS2/positioning/abspos-002.xht": [ + "84ba334bc9f6ed529efa88b58833c6c9b3df0887", + "reftest" + ], + "css/CSS2/positioning/abspos-003.xht": [ + "4549d8fe64dd5a62de8ae399afa2b471661470d1", + "visual" + ], + "css/CSS2/positioning/abspos-004.xht": [ + "a4aa8a1833fffeb91d8b9bc6f2aa0914757d1184", + "visual" + ], + "css/CSS2/positioning/abspos-006.xht": [ + "09db18dd647769ffd30728b3c70705233e674519", + "visual" + ], + "css/CSS2/positioning/abspos-007-ref.xht": [ + "d3baf71ceb2be2e267abd4f9f073662aa8be5173", + "support" + ], + "css/CSS2/positioning/abspos-007.xht": [ + "876ecdb5970dcd37b18d02a86922c7148b30f918", + "reftest" + ], + "css/CSS2/positioning/abspos-008-ref.xht": [ + "138effc904a3c1d79774836a0d9825c937728e69", + "support" + ], + "css/CSS2/positioning/abspos-008.xht": [ + "7ec8fb68039845b726eb7c5c82a70dd2adbc5ab8", + "reftest" + ], + "css/CSS2/positioning/abspos-009-ref.xht": [ + "60528e0d467a871a46b8d9e8c708d978db4a6cdf", + "support" + ], + "css/CSS2/positioning/abspos-009.xht": [ + "9ca0b8be7f3550e6cda1470c44dc96224e14624c", + "reftest" + ], + "css/CSS2/positioning/abspos-010.xht": [ + "bf9f120cbc053345298def9830b1ec8d32bb454a", + "visual" + ], + "css/CSS2/positioning/abspos-011-ref.xht": [ + "c235af55f1a48bf1537880675cc07fb540672238", + "support" + ], + "css/CSS2/positioning/abspos-011.xht": [ + "7deaa3e6c992cbc2cdcc8aba918d3896bc21c396", + "reftest" + ], + "css/CSS2/positioning/abspos-012.xht": [ + "888c0e9b10f97a37f320f9d947650bd10d0f3126", + "reftest" + ], + "css/CSS2/positioning/abspos-013-ref.xht": [ + "adbc5d93bd0998cb2ac466072571208b6cce3ec8", + "support" + ], + "css/CSS2/positioning/abspos-013.xht": [ + "b0d8bd75b8e4ec527bfe44ceeb9f3707fa65ca01", + "reftest" + ], + "css/CSS2/positioning/abspos-014.xht": [ + "5a4165d152321b4edd00f876d7270e508ab6cab9", + "reftest" + ], + "css/CSS2/positioning/abspos-015.xht": [ + "397198bb40505dcf2b3524c7039e92fab62294f7", + "reftest" + ], + "css/CSS2/positioning/abspos-016.xht": [ + "e3dd5035db495f78ef9c39e546589f0e8a49bace", + "reftest" + ], + "css/CSS2/positioning/abspos-017.xht": [ + "f2c7d5be5cf175f88ed236a3370cc91823004989", + "reftest" + ], + "css/CSS2/positioning/abspos-018.xht": [ + "03fbd95051a671b8a8cc1b65f2ef83e527db8ac8", + "reftest" + ], + "css/CSS2/positioning/abspos-019.xht": [ + "2b3f8eb4857aad4ac15c73d9481e2c81ab18dc0d", + "reftest" + ], + "css/CSS2/positioning/abspos-020.xht": [ + "3580425e9100a0491a71e8b09867a59f4d844b40", + "reftest" + ], + "css/CSS2/positioning/abspos-022.xht": [ + "33aa6b75932ea432fc010e8615affa202f8bcf0a", + "reftest" + ], + "css/CSS2/positioning/abspos-023.xht": [ + "fe2f75d08fa865c80a43775e1edadfea87570975", + "visual" + ], + "css/CSS2/positioning/abspos-024-ref.xht": [ + "d58a49eff34a4a8ecf385234d15a44610dcd81f6", + "support" + ], + "css/CSS2/positioning/abspos-024.xht": [ + "24ae641d12a1c7545a7707a69c159f6a9b239082", + "reftest" + ], + "css/CSS2/positioning/abspos-025-ref.xht": [ + "4763a70f6af6124217c5add981172f42ca1ba57b", + "support" + ], + "css/CSS2/positioning/abspos-025.xht": [ + "d6aa2b7045721e88a507299d5527aa10a1b3e276", + "reftest" + ], + "css/CSS2/positioning/abspos-026.xht": [ + "4f347c36961bc7a6d5e479975bce038ee1472295", + "reftest" + ], + "css/CSS2/positioning/abspos-027.xht": [ + "4206e6ba1f6839097eeeedf836b959883bfb0f4b", + "reftest" + ], + "css/CSS2/positioning/abspos-028-ref.xht": [ + "f6e9034a92073246f214af8e10aa09f4b2112f9c", + "support" + ], + "css/CSS2/positioning/abspos-028.xht": [ + "dd63d346c990db24be8085fd625b5f916d4fe3cc", + "reftest" + ], + "css/CSS2/positioning/abspos-containing-block-001-ref.xht": [ + "f8962e71160a983c274d9c240ee2bde75a8598a3", + "support" + ], + "css/CSS2/positioning/abspos-containing-block-001.xht": [ + "acd5546141dc42edf46affac2c67df2254fbae4c", + "reftest" + ], + "css/CSS2/positioning/abspos-containing-block-002.xht": [ + "9fbd2701744eedd2e75feceb57d07dc4e7de8c7a", + "reftest" + ], + "css/CSS2/positioning/abspos-containing-block-003.xht": [ + "1d7d08a6320d7ef08938a4ff30b7e43cb2d04d0b", + "reftest" + ], + "css/CSS2/positioning/abspos-containing-block-004.xht": [ + "23b52824dd0c1970bfaa253f6c290e7612596ed8", + "reftest" + ], + "css/CSS2/positioning/abspos-containing-block-005.xht": [ + "8d99133bd55052b76770e51d310290379120199d", + "reftest" + ], + "css/CSS2/positioning/abspos-containing-block-006.xht": [ + "3d125fd94346ab9531aa52ca7e7fdcef55f854e5", + "reftest" + ], + "css/CSS2/positioning/abspos-containing-block-007.xht": [ + "3cd30fd6fe0c1a23da3969f72e94fc453a96a15d", + "reftest" + ], + "css/CSS2/positioning/abspos-containing-block-008.xht": [ + "4db92d001941863f8fdd45683a4f661e442aafbc", + "reftest" + ], + "css/CSS2/positioning/abspos-containing-block-009.xht": [ + "ec73dd612746f2b107966c8553fefb2c753ea638", + "reftest" + ], + "css/CSS2/positioning/abspos-containing-block-010-ref.xht": [ + "51b6556bc21b0a5f3d79496295ee67d55f7a1bae", + "support" + ], + "css/CSS2/positioning/abspos-containing-block-010.xht": [ + "58327b3639645565edbb24d002c19b6fdecd596d", + "reftest" + ], + "css/CSS2/positioning/abspos-inline-001.xht": [ + "9971d660022e3448ff90cd1dd9797678b75a5ae1", + "manual" + ], + "css/CSS2/positioning/abspos-inline-002.xht": [ + "57a3a74ad0d53f89061add665a4a5667b32b9732", + "manual" + ], + "css/CSS2/positioning/abspos-inline-003.xht": [ + "df045cabb5a2d155cbbcd5b7cd518f98b959e664", + "manual" + ], + "css/CSS2/positioning/abspos-inline-004.xht": [ + "10f01c4df36c1347b7fe2dbdb2a01cd521ec7b26", + "manual" + ], + "css/CSS2/positioning/abspos-inline-005.xht": [ + "d974370d4b268b0dc2b3305a35ae034255ca567b", + "manual" + ], + "css/CSS2/positioning/abspos-inline-006.xht": [ + "c7b445070b3baa446741d3561c67fe6e4d89246f", + "manual" + ], + "css/CSS2/positioning/abspos-overflow-001-ref.xht": [ + "69ee40481d5d49b0f165660e73f4aa6a5509515e", + "support" + ], + "css/CSS2/positioning/abspos-overflow-001.xht": [ + "3af72e901d7f3115a210e042ce3c84f6dfb0468c", + "reftest" + ], + "css/CSS2/positioning/abspos-overflow-002-ref.xht": [ + "ffa5197d7c950642c8a10621cfe402a4cea93abf", + "support" + ], + "css/CSS2/positioning/abspos-overflow-002.xht": [ + "afccb2778c784353cc3553586dea0d416b0bc61b", + "reftest" + ], + "css/CSS2/positioning/abspos-overflow-003-ref.xht": [ + "d05546e1bcc27bacc001866807c47d15ab61c07c", + "support" + ], + "css/CSS2/positioning/abspos-overflow-003.xht": [ + "104ba81699581604ac3e38ecc8595fda7133733f", + "reftest" + ], + "css/CSS2/positioning/abspos-overflow-004-ref.xht": [ + "32e3fb6c7bee224de0622870185881d8d801a4aa", + "support" + ], + "css/CSS2/positioning/abspos-overflow-004.xht": [ + "919629d49bc01a962c00e36d563296efaa4e09d0", + "reftest" + ], + "css/CSS2/positioning/abspos-overflow-005-ref.xht": [ + "a7f0274af06e6e0c9b99b13d9f391f90ed4cc4cf", + "support" + ], + "css/CSS2/positioning/abspos-overflow-005.xht": [ + "6dad4eb941e11dda5850f1458d331eef5a5bc2b4", + "reftest" + ], + "css/CSS2/positioning/abspos-overflow-006-ref.xht": [ + "251d8ae2cf9388bd85172adcf79f8af753313001", + "support" + ], + "css/CSS2/positioning/abspos-overflow-006.xht": [ + "3d511bd749cf4589de032ba094346572f91ee983", + "reftest" + ], + "css/CSS2/positioning/abspos-overflow-007.xht": [ + "8d7e53fba9a5a0ec78a25bc960da3b1d9a960958", + "reftest" + ], + "css/CSS2/positioning/abspos-overflow-008.xht": [ + "d97239cafb1ce0c06d54bb2b50e649d8d8633f2c", + "reftest" + ], + "css/CSS2/positioning/abspos-overflow-009.xht": [ + "9b7e036f1d49d510da13671a84f7cd0958e5a328", + "reftest" + ], + "css/CSS2/positioning/abspos-overflow-010-ref.xht": [ + "5c1c0c38fd20ec829202d543b798a8becb6fe03e", + "support" + ], + "css/CSS2/positioning/abspos-overflow-010.xht": [ + "8cf2e9f474e8b9f53b23eac7fdd3286e1bc5da7d", + "reftest" + ], + "css/CSS2/positioning/abspos-overflow-011-ref.xht": [ + "97a51e28bc32a1be65a5eeed25db291842ad8594", + "support" + ], + "css/CSS2/positioning/abspos-overflow-011.xht": [ + "34148f67aaef104f9e31ed68497737bb8b69169d", + "reftest" + ], + "css/CSS2/positioning/abspos-overflow-012.xht": [ + "d2e2568a414c59871989e47bca4a1e015ab8ef81", + "reftest" + ], + "css/CSS2/positioning/abspos-paged-001.xht": [ + "ea2f2ad5f2b652ab455af7d1c68d2d673fdc0856", + "manual" + ], + "css/CSS2/positioning/abspos-paged-002.xht": [ + "5f6d8c6f08e7c67c0cefdfe1fcd144532860712f", + "manual" + ], + "css/CSS2/positioning/abspos-width-001.xht": [ + "51eff689e3037863fe393174ea9d8e44cd146995", + "reftest" + ], + "css/CSS2/positioning/abspos-width-002.xht": [ + "705c81c920985a7b57e724774c578a0119ab0189", + "reftest" + ], + "css/CSS2/positioning/abspos-width-003.xht": [ + "827a824f1642259306a5e506e00524bbeb161da9", + "reftest" + ], + "css/CSS2/positioning/abspos-width-004.xht": [ + "ec9c4a4595cb21eb99e362211842b55ed7d61963", + "reftest" + ], + "css/CSS2/positioning/abspos-width-005-ref.xht": [ + "79c0dba4d622be65a9e300c4258373767c2c1159", + "support" + ], + "css/CSS2/positioning/abspos-width-005.xht": [ + "f264fbe2c71755935b31425c11bcc246ae3800f5", + "reftest" + ], + "css/CSS2/positioning/abspos-zero-width-001.xht": [ + "07080c0cd81297efb4f43335115ef9aca4f17820", + "visual" + ], + "css/CSS2/positioning/bottom-004.xht": [ + "fd565fe66f3e1c735d43f5501caeff79285635d4", + "reftest" + ], + "css/CSS2/positioning/bottom-005.xht": [ + "11a19b734db558905bc6ae4c81806ce4758f9912", + "reftest" + ], + "css/CSS2/positioning/bottom-006.xht": [ + "4e241c6dc5437b3f405fd9ab3630eb781155b863", + "reftest" + ], + "css/CSS2/positioning/bottom-007-ref.xht": [ + "360798cbbf62cb5dcd1d9b7ce19f9a6c61131c90", + "support" + ], + "css/CSS2/positioning/bottom-007.xht": [ + "083a50d3fe9ba6f3196637c13d0ce4ab74e0b429", + "reftest" + ], + "css/CSS2/positioning/bottom-008.xht": [ + "46018fc302e6894ed0785fe0985b5a856d211f40", + "reftest" + ], + "css/CSS2/positioning/bottom-016.xht": [ + "f485c44ee2fdb6294d20c51a9ed2a59ee5a69498", + "reftest" + ], + "css/CSS2/positioning/bottom-017.xht": [ + "6325d0ceb0cea6a1c22338a5a9bb796cfbee996b", + "reftest" + ], + "css/CSS2/positioning/bottom-018.xht": [ + "b27ffbdc247ef1bf72aed6b34a42ee1f772307ed", + "reftest" + ], + "css/CSS2/positioning/bottom-019-ref.xht": [ + "aec53abfbb4187be51fe3e0a5418b2ffb89b30ad", + "support" + ], + "css/CSS2/positioning/bottom-019.xht": [ + "fc81b98e53293841ae33c33160489099f42f9909", + "reftest" + ], + "css/CSS2/positioning/bottom-020.xht": [ + "ceb03705eb6408736b2e5e0882151c7f583aad71", + "reftest" + ], + "css/CSS2/positioning/bottom-028.xht": [ + "444d9bfb79b03be9b2d817107e5f4ec142ec35c7", + "reftest" + ], + "css/CSS2/positioning/bottom-029.xht": [ + "7bc6fa5e61fa9e72cb2f1f1c351e7641ae29350f", + "reftest" + ], + "css/CSS2/positioning/bottom-030.xht": [ + "6c326f42239c0922b796abf1a10fe222f9eeab7b", + "reftest" + ], + "css/CSS2/positioning/bottom-031.xht": [ + "f19145f2b3e5cf3fd878b9692f93e59fa6ebbe37", + "reftest" + ], + "css/CSS2/positioning/bottom-032.xht": [ + "17c6119f66279fb84154b10415e13d8e891c51af", + "reftest" + ], + "css/CSS2/positioning/bottom-040.xht": [ + "e28e356940941ec9a9a615e73fd1fd8b51d4614a", + "reftest" + ], + "css/CSS2/positioning/bottom-041.xht": [ + "3077ba7ab612604caf094ea7d6f8fc4a06a4d8c2", + "reftest" + ], + "css/CSS2/positioning/bottom-042.xht": [ + "69a5ceec1a21c2b4bb4329ecb0e4e4a92008e478", + "reftest" + ], + "css/CSS2/positioning/bottom-043.xht": [ + "6ceb66efe5a1cb9d2b5993d50a467d92c9705d05", + "reftest" + ], + "css/CSS2/positioning/bottom-044.xht": [ + "cfa2b4962609ed18107bdcafc75fc2da961f4e94", + "reftest" + ], + "css/CSS2/positioning/bottom-052.xht": [ + "dce1143049d8bf938ef6fd62e3bd14b985fd9cb9", + "reftest" + ], + "css/CSS2/positioning/bottom-053.xht": [ + "e1b20372610a43b78104764419fa83ca3e962aa2", + "reftest" + ], + "css/CSS2/positioning/bottom-054.xht": [ + "222764259e9a13804921d93070f3f7e4ab33bfd6", + "reftest" + ], + "css/CSS2/positioning/bottom-055.xht": [ + "a7e910f63dec62ee683b925b153070add77b8302", + "reftest" + ], + "css/CSS2/positioning/bottom-056.xht": [ + "2b80d657491b73f99cf0e5021aafcaf062809bc8", + "reftest" + ], + "css/CSS2/positioning/bottom-064.xht": [ + "f0b6d47271e606dd0ca1d94aaac38e2db29a81a6", + "reftest" + ], + "css/CSS2/positioning/bottom-065.xht": [ + "f37d81ce9a6066eb7bc03848f390db6ba611b649", + "reftest" + ], + "css/CSS2/positioning/bottom-066.xht": [ + "e48f4845b769ddf740de97bd653b822162443003", + "reftest" + ], + "css/CSS2/positioning/bottom-067.xht": [ + "653361119bad53cade68b18e982e8ea75b2661da", + "reftest" + ], + "css/CSS2/positioning/bottom-068.xht": [ + "80f39f4ef0785e5537b707a3e940fec26e6a4557", + "reftest" + ], + "css/CSS2/positioning/bottom-076.xht": [ + "c9ce55e427b0f84f7d96f9df34ae7963ea8df5a5", + "reftest" + ], + "css/CSS2/positioning/bottom-077.xht": [ + "f48badc2e65d99f034647d406d67160c7ad63345", + "reftest" + ], + "css/CSS2/positioning/bottom-078.xht": [ + "2e7b59e11b0f101c3eafaf4eb4fef60f323152e7", + "reftest" + ], + "css/CSS2/positioning/bottom-079-ref.xht": [ + "178310e3289742df2f0e10ae18964f4e79c3ebc1", + "support" + ], + "css/CSS2/positioning/bottom-079.xht": [ + "52f87964ce66b388790b37e829d0bfebf1d814f4", + "reftest" + ], + "css/CSS2/positioning/bottom-080.xht": [ + "6bd5341beb669e75fa2e4c853d0dadddf817603a", + "reftest" + ], + "css/CSS2/positioning/bottom-088.xht": [ + "e756d23943bbb23142ca97c4dd974d2d839c75a3", + "reftest" + ], + "css/CSS2/positioning/bottom-089.xht": [ + "a60841aa2b5a207b952323946e9732e8d994fbfb", + "reftest" + ], + "css/CSS2/positioning/bottom-090.xht": [ + "690750a368911d59fdbeb9a49ea64b141492a096", + "reftest" + ], + "css/CSS2/positioning/bottom-091.xht": [ + "812f3833cf90fe9c371ec9bfceceb3fc60861a6b", + "reftest" + ], + "css/CSS2/positioning/bottom-092.xht": [ + "0275b047311d9767bb614b30796cb7ebcf1deb9f", + "reftest" + ], + "css/CSS2/positioning/bottom-100.xht": [ + "c8e9b7463a45a739bedc662a4be734c98d46572e", + "reftest" + ], + "css/CSS2/positioning/bottom-101.xht": [ + "9d069229359a60d6e4f781ea4341012644203b87", + "reftest" + ], + "css/CSS2/positioning/bottom-102.xht": [ + "26c34b000a35db5f7b93b38983f8a7dd5bbe828f", + "reftest" + ], + "css/CSS2/positioning/bottom-103.xht": [ + "23e384ca6c0de1c8f6eed9ee18a858e3fc297f46", + "reftest" + ], + "css/CSS2/positioning/bottom-104.xht": [ + "a0b7f456c07225b95d9b74abafb88171502cb5ea", + "reftest" + ], + "css/CSS2/positioning/bottom-109.xht": [ + "8369f8284e3e86c5c383130f33c6d051e7178f85", + "reftest" + ], + "css/CSS2/positioning/bottom-110.xht": [ + "ca5e95ce523a7ad8a0e01a564bffc08dcf19a4fa", + "reftest" + ], + "css/CSS2/positioning/bottom-111.xht": [ + "21bf5dde35009a6bfbb24981c797ff1f692bef62", + "reftest" + ], + "css/CSS2/positioning/bottom-112.xht": [ + "8638c47e907e1768cce73ffd6d7d0c9704fe2757", + "reftest" + ], + "css/CSS2/positioning/bottom-113-ref.xht": [ + "55c6babc81c7325f144eb5eb14902960b762840e", + "support" + ], + "css/CSS2/positioning/bottom-113.xht": [ + "102b9707317822bb1794a3899a6770f75d44054e", + "reftest" + ], + "css/CSS2/positioning/bottom-applies-to-001-ref.xht": [ + "16e69098c406c156500d363945bff1c3cbfb517b", + "support" + ], + "css/CSS2/positioning/bottom-applies-to-001.xht": [ + "07a107ac143055b6d217472765d6e06a14c9fd3f", + "reftest" + ], + "css/CSS2/positioning/bottom-applies-to-002.xht": [ + "dd861b9971feb0e5bf87d5b991556035edbc8c3a", + "reftest" + ], + "css/CSS2/positioning/bottom-applies-to-003.xht": [ + "2346e326ebc2933192f4add6234ad101900323f7", + "reftest" + ], + "css/CSS2/positioning/bottom-applies-to-004.xht": [ + "508adcd10183b734d2415644d90fbbc97480fe39", + "reftest" + ], + "css/CSS2/positioning/bottom-applies-to-005.xht": [ + "fbb6c08194a0200550006b9a29555c67d2c6e184", + "reftest" + ], + "css/CSS2/positioning/bottom-applies-to-006.xht": [ + "3debe7696af9859856b16892ee533ca16ec1ef78", + "reftest" + ], + "css/CSS2/positioning/bottom-applies-to-007.xht": [ + "80e98ac93200f89c7b3e81df9ded5abedb7dcfb1", + "reftest" + ], + "css/CSS2/positioning/bottom-applies-to-008.xht": [ + "797b132a8bef0e6ad85dcf1ef03f2d593f54e4fd", + "visual" + ], + "css/CSS2/positioning/bottom-applies-to-009.xht": [ + "2c031da9c4a288a14da1c797d127c9fb5fa737b6", + "reftest" + ], + "css/CSS2/positioning/bottom-applies-to-010.xht": [ + "ec3ca5f0752224945f773a8e356436587641ba80", + "visual" + ], + "css/CSS2/positioning/bottom-applies-to-012.xht": [ + "2c8ac0d61d95ebb8c56aff8d2cec1994ab4a20c3", + "reftest" + ], + "css/CSS2/positioning/bottom-applies-to-013.xht": [ + "0582174ae1bd2e35a664b4acaa14819412c5eeef", + "reftest" + ], + "css/CSS2/positioning/bottom-applies-to-014.xht": [ + "f7352dd038bae6427de8b9f63a8c68f61f8d4a99", + "reftest" + ], + "css/CSS2/positioning/bottom-applies-to-015.xht": [ + "13f50ffb66da5987fb17e52fa2e60244573c4790", + "reftest" + ], + "css/CSS2/positioning/bottom-offset-001-ref.xht": [ + "62243eeed4cde534c402a27255e69a66cb5799fa", + "support" + ], + "css/CSS2/positioning/bottom-offset-001.xht": [ + "cf92a9bacb074458c6515f7b56e185806a2b13a4", + "reftest" + ], + "css/CSS2/positioning/bottom-offset-002.xht": [ + "4587ac96c6435b0747227195be19d23eb16f4cc8", + "reftest" + ], + "css/CSS2/positioning/bottom-offset-003.xht": [ + "0bfe4e8c686ebf97357a511b3b081fcb35947e36", + "reftest" + ], + "css/CSS2/positioning/bottom-offset-percentage-001-ref.xht": [ + "cf6de0467b190977fc86f38b73eac1007d46f1d9", + "support" + ], + "css/CSS2/positioning/bottom-offset-percentage-001.xht": [ + "4e0e00e02787daa7f3a4b521979ad849751a99b3", + "reftest" + ], + "css/CSS2/positioning/dynamic-top-change-001-ref.xht": [ + "04e332a36e8692fefd5a6ee0229195befa8c55fe", + "support" + ], + "css/CSS2/positioning/dynamic-top-change-001.xht": [ + "6df86fd54d7924387af55d77b435df7e5cb9e958", + "reftest" + ], + "css/CSS2/positioning/dynamic-top-change-002-ref.xht": [ + "848c349e6cfb438d8799b00228a53b090e5b4a18", + "support" + ], + "css/CSS2/positioning/dynamic-top-change-002.xht": [ + "40c5059cec88e2c85aceb832cb28179d82c607b2", + "reftest" + ], + "css/CSS2/positioning/dynamic-top-change-003.xht": [ + "f04c237d91f706ec3af3be1727c0fd86a256b4a7", + "reftest" + ], + "css/CSS2/positioning/dynamic-top-change-004.xht": [ + "ae0183eee43b2a0acc8bb2938f41f84225eda04c", + "reftest" + ], + "css/CSS2/positioning/dynamic-top-change-005.xht": [ + "e4c1363a050570443931ed08097fd5a3e2e46e20", + "visual" + ], + "css/CSS2/positioning/dynamic-top-change-005a.xht": [ + "a3b66c29e309d9ad615ec170f2ced76fe401e301", + "visual" + ], + "css/CSS2/positioning/dynamic-top-change-005b.xht": [ + "ffce7b03a1ca920e20a368d7759bc2bab59deb2a", + "visual" + ], + "css/CSS2/positioning/left-004-ref.xht": [ + "b5c2ff461c17f75e3ed5a51702a7252588416ad0", + "support" + ], + "css/CSS2/positioning/left-004.xht": [ + "e81f5af3030f5cc3aad87ee4c920bc61b8b6f120", + "reftest" + ], + "css/CSS2/positioning/left-005.xht": [ + "08854022561418f093a8abc15a9b71296543b4b9", + "reftest" + ], + "css/CSS2/positioning/left-006.xht": [ + "347c1ff6e525ae06dee1fbd306a84339ddba8b1f", + "reftest" + ], + "css/CSS2/positioning/left-007-ref.xht": [ + "2522a0b52d1af99a3bf8a90e1717e164e5e3541c", + "support" + ], + "css/CSS2/positioning/left-007.xht": [ + "cdb22cffadcb734f33a1ab54fd330a7ac497ea7b", + "reftest" + ], + "css/CSS2/positioning/left-008.xht": [ + "f4100bbedeb9c2f49ac759630e099865d0b5af14", + "reftest" + ], + "css/CSS2/positioning/left-016.xht": [ + "7896482f899fad5a6fd9710adaccba856b41d8ee", + "reftest" + ], + "css/CSS2/positioning/left-017.xht": [ + "b40cfb389ff465b0fcdb00297e7dbaae0dcec67b", + "reftest" + ], + "css/CSS2/positioning/left-018.xht": [ + "115adabc737b9cfbc63254c2698c51c3db3e3bab", + "reftest" + ], + "css/CSS2/positioning/left-019.xht": [ + "b0ea1af8dda8808604bc8c27c1dc9b3fe580bde1", + "reftest" + ], + "css/CSS2/positioning/left-020.xht": [ + "bb30e2600ca082f11abcd5e3eb764e1b680cc347", + "reftest" + ], + "css/CSS2/positioning/left-028.xht": [ + "cb45440ddb7db53c3e218b1d5e6c0b7a8b4cb83a", + "reftest" + ], + "css/CSS2/positioning/left-029.xht": [ + "d69d74cbb6e45198856971b66f5927bdcd8b5a94", + "reftest" + ], + "css/CSS2/positioning/left-030.xht": [ + "35050594588c7b5ca47e9a80455830e5576fcdcd", + "reftest" + ], + "css/CSS2/positioning/left-031-ref.xht": [ + "a93abfd71c587dea04472532c72201a6a8467ed7", + "support" + ], + "css/CSS2/positioning/left-031.xht": [ + "1ca55389222841a7147257c4ce7eb1a7d0dde344", + "reftest" + ], + "css/CSS2/positioning/left-032.xht": [ + "51df49010c3f57941559de8dc25e56ff37f77256", + "reftest" + ], + "css/CSS2/positioning/left-040.xht": [ + "3f30d6507a2e2ce3ce1b93a5d4b6e8f315371b4a", + "reftest" + ], + "css/CSS2/positioning/left-041.xht": [ + "f55cb50baede594f212dfd43d2ef79d625564e7c", + "reftest" + ], + "css/CSS2/positioning/left-042.xht": [ + "ccfc6d1e14e7303fe9afbd5c12d2765b8bb3d823", + "reftest" + ], + "css/CSS2/positioning/left-043.xht": [ + "917e60896db26ccae5e8ad018e1acb8fb4e11b54", + "reftest" + ], + "css/CSS2/positioning/left-044.xht": [ + "dd976bc663a58e80aa97e6c839aaf2e77c4eb482", + "reftest" + ], + "css/CSS2/positioning/left-052.xht": [ + "8bd236600b2f8faba19ac96a3382c9dddd664a2a", + "reftest" + ], + "css/CSS2/positioning/left-053.xht": [ + "f6ccdd4fbde796b61207f317350aa473ac968baf", + "reftest" + ], + "css/CSS2/positioning/left-054.xht": [ + "584fd4bd9091f3bc7e08463a3fcd47f6254e7482", + "reftest" + ], + "css/CSS2/positioning/left-055.xht": [ + "1835bad117dd167192bd0c4f8550292541ea7c32", + "reftest" + ], + "css/CSS2/positioning/left-056.xht": [ + "d0c50bab4c8ab5de4b775ed0725055a1a632fa87", + "reftest" + ], + "css/CSS2/positioning/left-064.xht": [ + "980d07d58d5fcea6f892a2ab5672573d60ff1b50", + "reftest" + ], + "css/CSS2/positioning/left-065.xht": [ + "d056322d75b52dd03970ad1932bd029b5e73a8f5", + "reftest" + ], + "css/CSS2/positioning/left-066.xht": [ + "0ba2a760d404808a18c1f705fe8f52c6ae3d5fd6", + "reftest" + ], + "css/CSS2/positioning/left-067.xht": [ + "26efa7aa45705d8273cb0b069b75bc1e4483fae5", + "reftest" + ], + "css/CSS2/positioning/left-068.xht": [ + "658d4d8bfb46df2e8dba65432a70099dd74790f3", + "reftest" + ], + "css/CSS2/positioning/left-076.xht": [ + "fef591675cd27fcc1a82706758defe3d5a817dd1", + "reftest" + ], + "css/CSS2/positioning/left-077.xht": [ + "dcadf836e98063f47a3b734418df0162342de440", + "reftest" + ], + "css/CSS2/positioning/left-078.xht": [ + "0c706bd1da31d260c67dbda9485f867f7a4b77d8", + "reftest" + ], + "css/CSS2/positioning/left-079-ref.xht": [ + "c8981c10dfe4ea2efedfb8dced6b9e8ab0b9651c", + "support" + ], + "css/CSS2/positioning/left-079.xht": [ + "1845ea58f6e351a019805a24ecead273ef2cc8bb", + "reftest" + ], + "css/CSS2/positioning/left-080.xht": [ + "38f086fdd545d834a16cc41d1c65f1fe82a77b62", + "reftest" + ], + "css/CSS2/positioning/left-088.xht": [ + "687749c49f885205d75c5f70f057f299e8b542f3", + "reftest" + ], + "css/CSS2/positioning/left-089.xht": [ + "4c06a821472789b8724ebd8312e48a7492b7b427", + "reftest" + ], + "css/CSS2/positioning/left-090.xht": [ + "eaa12c6258a6286c1cf5508b27a3308f1f2d0e87", + "reftest" + ], + "css/CSS2/positioning/left-091.xht": [ + "bc2028bdf47355d1eeb5bab8dfaf4719d0a9ca17", + "reftest" + ], + "css/CSS2/positioning/left-092.xht": [ + "2d743bf390ef525f04171449f2edc5c055b09001", + "reftest" + ], + "css/CSS2/positioning/left-100.xht": [ + "1d290e4f55efc51cc1f4ea038d3d0833bbaa4d79", + "reftest" + ], + "css/CSS2/positioning/left-101.xht": [ + "ba1c271b6263f13efbcaa9d5667e4eefc083912b", + "reftest" + ], + "css/CSS2/positioning/left-102.xht": [ + "35b41463e8088db0f61fc86f066d101f6346bedf", + "reftest" + ], + "css/CSS2/positioning/left-103.xht": [ + "754cb2d7c5bf54b293a016b111898542d2ca3af8", + "reftest" + ], + "css/CSS2/positioning/left-104.xht": [ + "77c00f0f08677e14dbae88293a8161c80ff48497", + "reftest" + ], + "css/CSS2/positioning/left-109.xht": [ + "0241395bcf586f62179a217ed02ad2d3f46404e0", + "reftest" + ], + "css/CSS2/positioning/left-110.xht": [ + "374361a6bb3f8952377f0f2e4670ad0ce870a497", + "reftest" + ], + "css/CSS2/positioning/left-111.xht": [ + "f60e531e12d926ae96d57d21a7b18be7bbcf6cd3", + "reftest" + ], + "css/CSS2/positioning/left-112.xht": [ + "a63dfcbfc0f2a8f4159fbc394351c37eb388959b", + "reftest" + ], + "css/CSS2/positioning/left-113-ref.xht": [ + "38d59ac3834fc1f495270b038bb25d064a2f1675", + "support" + ], + "css/CSS2/positioning/left-113.xht": [ + "9705e10da384686afca504ff3e99921b645fa2b3", + "reftest" + ], + "css/CSS2/positioning/left-applies-to-001-ref.xht": [ + "25163a620b023f4931731b778eaf8a1824aa7eb0", + "support" + ], + "css/CSS2/positioning/left-applies-to-001.xht": [ + "b92b303181eb49270ab9efd60a031e6679804b1a", + "reftest" + ], + "css/CSS2/positioning/left-applies-to-002.xht": [ + "f0f30f77fdd84975b6f788dc530b3366a3f21c86", + "reftest" + ], + "css/CSS2/positioning/left-applies-to-003.xht": [ + "81c13ca5fff255f2a53d0755c1d9ffa4155fa244", + "reftest" + ], + "css/CSS2/positioning/left-applies-to-004.xht": [ + "5dc537273f7d795892941264ff2f6e6e8ae09432", + "reftest" + ], + "css/CSS2/positioning/left-applies-to-005.xht": [ + "16c861e9ea038bca8152f711aa10896aa91758df", + "reftest" + ], + "css/CSS2/positioning/left-applies-to-006.xht": [ + "3781604438d2c8153f86dee771cbf384f38ba0e2", + "reftest" + ], + "css/CSS2/positioning/left-applies-to-007.xht": [ + "cf176b79c4d06ba0435730d7cd72fadfa54a1be3", + "reftest" + ], + "css/CSS2/positioning/left-applies-to-008.xht": [ + "989bc34dbb368bfd9378c8415249eb2dc82422df", + "visual" + ], + "css/CSS2/positioning/left-applies-to-009.xht": [ + "9395cb46b48cab3b76ec02f3d8279a9c9813808c", + "reftest" + ], + "css/CSS2/positioning/left-applies-to-010.xht": [ + "7cbb00f98d5d320920c8f3f5edb39194a455c487", + "visual" + ], + "css/CSS2/positioning/left-applies-to-012.xht": [ + "c2073e54115c87a89d729b2389ac53f6b889066f", + "reftest" + ], + "css/CSS2/positioning/left-applies-to-013.xht": [ + "f8ae3686290fc38fd0e3871ab05c458ff8b89dcc", + "reftest" + ], + "css/CSS2/positioning/left-applies-to-014.xht": [ + "ff8a2f5bef6a56eb44e59965cc3d5ab5a1e36d1e", + "reftest" + ], + "css/CSS2/positioning/left-applies-to-015.xht": [ + "28686df9356f5025d8146bfa7aebbffe983ffd30", + "reftest" + ], + "css/CSS2/positioning/left-offset-001-ref.xht": [ + "ad302e81ae2622d714c34331f5bbf65286844d9b", + "support" + ], + "css/CSS2/positioning/left-offset-001.xht": [ + "06beab3d575cd0909300628151b0d40989f8d291", + "reftest" + ], + "css/CSS2/positioning/left-offset-002.xht": [ + "f0757e9dda0b2f79a0985aca63d158dac1cbee01", + "reftest" + ], + "css/CSS2/positioning/left-offset-003-ref.xht": [ + "f89e83737819e5fdabb11fe16e5dbe11c53dfdb9", + "support" + ], + "css/CSS2/positioning/left-offset-003.xht": [ + "47c413acb0c10220fc346236a1db07792f47856b", + "reftest" + ], + "css/CSS2/positioning/left-offset-percentage-001-ref.xht": [ + "b40f07ba081ebf1427daed80c2c6831ba96705e8", + "support" + ], + "css/CSS2/positioning/left-offset-percentage-001.xht": [ + "b0742545a275d2211b90432a5f63f30b4cc318fa", + "reftest" + ], + "css/CSS2/positioning/left-offset-percentage-002-ref.xht": [ + "53a696aff25b8a12f563d8c5c5a5a1ae6b4a7328", + "support" + ], + "css/CSS2/positioning/left-offset-percentage-002.xht": [ + "a6a5983c404babeeee4c84505fba860c54f4aa0d", + "reftest" + ], + "css/CSS2/positioning/position-001.xht": [ + "a911d891ab0bbd0591bb048b3b5b0d35c28be351", + "visual" + ], + "css/CSS2/positioning/position-002.xht": [ + "3207765cc3e2bfa9dbd2e26b459c4a2c508e43ff", + "visual" + ], + "css/CSS2/positioning/position-003.xht": [ + "6563be7d11627b6582318b8044727b310b4978d3", + "visual" + ], + "css/CSS2/positioning/position-004.xht": [ + "13d16673d4d4964faa26faa03f6130a379244ce3", + "manual" + ], + "css/CSS2/positioning/position-005.xht": [ + "e8c3fdbf4bb149412ef645c79eaca15126f3b082", + "visual" + ], + "css/CSS2/positioning/position-006-ref.xht": [ + "a353d509fc5bd8ce9ebeb4505389b30b802c4968", + "support" + ], + "css/CSS2/positioning/position-006.xht": [ + "af144b766acdd237bca57a8570ad2d283ef02efc", + "reftest" + ], + "css/CSS2/positioning/position-absolute-001.xht": [ + "26f25feebc5c0b682a4e136b31051d5bc834d9b2", + "reftest" + ], + "css/CSS2/positioning/position-absolute-002-ref.xht": [ + "dc1950d072e3213a1accbf6b57d2ef6f64e913ad", + "support" + ], + "css/CSS2/positioning/position-absolute-002.xht": [ + "4cb1e180a0351c281c7d5bc8109e34fb5eb8bae0", + "reftest" + ], + "css/CSS2/positioning/position-absolute-003.xht": [ + "edba32541d828cbc0b3205962de75d851e37ebdb", + "reftest" + ], + "css/CSS2/positioning/position-absolute-004-ref.xht": [ + "2ac00b913398a21e6f0c3ec8e65261720be7ddc3", + "support" + ], + "css/CSS2/positioning/position-absolute-004.xht": [ + "59d33b6a5f2cf8c6ffcf2e6a8924c5b00005f4aa", + "reftest" + ], + "css/CSS2/positioning/position-absolute-005.xht": [ + "239489de6ed845c7b7a71c34d3aa2ffff10b9745", + "visual" + ], + "css/CSS2/positioning/position-absolute-006.xht": [ + "fdca9a8b013afc72f63d847f19532df75d11618a", + "reftest" + ], + "css/CSS2/positioning/position-absolute-007-ref.xht": [ + "acdf85ffbced8570f40136102035ae59cf51b4ba", + "support" + ], + "css/CSS2/positioning/position-absolute-007.xht": [ + "e8b3b98d1d63fb0281edd8eaa93662ebe0528de2", + "reftest" + ], + "css/CSS2/positioning/position-absolute-008.xht": [ + "a41202060b50a3f8879620bfa78f6cb0c68ece6d", + "reftest" + ], + "css/CSS2/positioning/position-applies-to-001.xht": [ + "dcee9ec75c618dd4037590817b9c1d9e61583d62", + "reftest" + ], + "css/CSS2/positioning/position-applies-to-002.xht": [ + "ad9bc9e493a3300ec41b17809217cdea2aeb4f60", + "reftest" + ], + "css/CSS2/positioning/position-applies-to-003.xht": [ + "f79197464ef2d23a6c932b2aef92ec5d13a89252", + "reftest" + ], + "css/CSS2/positioning/position-applies-to-004.xht": [ + "7a8306f3368ef0c63517007ebc13895702be4b72", + "reftest" + ], + "css/CSS2/positioning/position-applies-to-005.xht": [ + "8046f68b14c839dd4230bfe6b2600664cd83bb0e", + "reftest" + ], + "css/CSS2/positioning/position-applies-to-006.xht": [ + "567883b0e197271f219a67517fd4ee7b8854f4bb", + "reftest" + ], + "css/CSS2/positioning/position-applies-to-007.xht": [ + "f8785d940bd34b34e5067197c69f429b15dcfc61", + "reftest" + ], + "css/CSS2/positioning/position-applies-to-008.xht": [ + "e26b885cc7f30c146811682d01fba0928b4051a1", + "visual" + ], + "css/CSS2/positioning/position-applies-to-009.xht": [ + "088a0a08959babfa3fa7e5b94bc90b7699522e07", + "reftest" + ], + "css/CSS2/positioning/position-applies-to-010.xht": [ + "f83bac25d1c78c351a0bfdc50819b6f1ae23c47b", + "visual" + ], + "css/CSS2/positioning/position-applies-to-012.xht": [ + "291a9b4cf93974e173bfb55a4ce85ed0d22a2819", + "reftest" + ], + "css/CSS2/positioning/position-applies-to-013.xht": [ + "1db29dfd748d14b02e9b162c6d1c1f35933b1b54", + "reftest" + ], + "css/CSS2/positioning/position-applies-to-014.xht": [ + "b672f69abc301b885ecf009a8115029e281090f5", + "reftest" + ], + "css/CSS2/positioning/position-applies-to-015.xht": [ + "5c7b0f14a48dff159b406e8145e87c25343016a4", + "reftest" + ], + "css/CSS2/positioning/position-fixed-001.xht": [ + "044b04525c93b5957a6d055791ee3ddd928e2414", + "reftest" + ], + "css/CSS2/positioning/position-fixed-002.xht": [ + "a6671be74b1e84232eda1918f4f5c4e4532edca7", + "visual" + ], + "css/CSS2/positioning/position-fixed-003.xht": [ + "89a253dcb0f8d5bddbc4a01cd21dc2499f0579b4", + "manual" + ], + "css/CSS2/positioning/position-fixed-004.xht": [ + "2ef3c6e9b8a0640838ca1ae000d0cb5edcf75826", + "manual" + ], + "css/CSS2/positioning/position-fixed-005.xht": [ + "f39810bb20f806cdf17023757f6c353c9c121982", + "manual" + ], + "css/CSS2/positioning/position-fixed-006.xht": [ + "3d2a03b1ba84e1efcc60b09d5a12889aa1c685b9", + "visual" + ], + "css/CSS2/positioning/position-fixed-007-ref.xht": [ + "af716e63244d4c04743db77a4e807eee6c7d53e9", + "support" + ], + "css/CSS2/positioning/position-fixed-007.xht": [ + "b9164b24a96807ac2d7f0658877f30d97d2b0eac", + "reftest" + ], + "css/CSS2/positioning/position-relative-001-ref.xht": [ + "d2806dcbf9cbe87b1bfee147ae55cda2ea4ed01f", + "support" + ], + "css/CSS2/positioning/position-relative-001.xht": [ + "6d25a66ef2b91495abe5c65f82a4c497fd5833f5", + "reftest" + ], + "css/CSS2/positioning/position-relative-002.xht": [ + "bcf12e78366aa1e03c8d55f5c5fe7997849ef610", + "visual" + ], + "css/CSS2/positioning/position-relative-003-ref.xht": [ + "c91555ae945130de9344904dfd9eaf9dc25b9c3b", + "support" + ], + "css/CSS2/positioning/position-relative-003.xht": [ + "b7eb98948a272060069f33bc94579d85dd14fdd3", + "reftest" + ], + "css/CSS2/positioning/position-relative-004-ref.xht": [ + "1df67a31025d733d38fb505e62659df9bd733178", + "support" + ], + "css/CSS2/positioning/position-relative-004.xht": [ + "ab4e8242cbef90917a0f3cba15cddb4defbdd88f", + "reftest" + ], + "css/CSS2/positioning/position-relative-005-ref.xht": [ + "83ed07695e3f31a85627d407b4d8514243403daf", + "support" + ], + "css/CSS2/positioning/position-relative-005.xht": [ + "b6fff4a08e8bbb577bd182c355b6264ad6586f01", + "reftest" + ], + "css/CSS2/positioning/position-relative-006.xht": [ + "b25ec5779084a1003c646a0a03bd4b09eaf9aafd", + "reftest" + ], + "css/CSS2/positioning/position-relative-007.xht": [ + "722e6217a02a4044d9cefef19d81f60cd00022a1", + "reftest" + ], + "css/CSS2/positioning/position-relative-008.xht": [ + "fc52f63af6b0ce93153f4fe0054bd5fc11d8e153", + "visual" + ], + "css/CSS2/positioning/position-relative-009.xht": [ + "ecf84e7ecc21ee52dffc380ff1c3cb6a9a9368d8", + "reftest" + ], + "css/CSS2/positioning/position-relative-010.xht": [ + "1c315962ee35d66742128af5c54c4c2f38d2610b", + "reftest" + ], + "css/CSS2/positioning/position-relative-013.xht": [ + "b333150d2c3ed541a6b5b4be8c5faa0a526f910c", + "reftest" + ], + "css/CSS2/positioning/position-relative-014-ref.xht": [ + "f5ed95dddd767c32063d9774a72263283c2dae02", + "support" + ], + "css/CSS2/positioning/position-relative-014.xht": [ + "cbe274506a6d668b0339ed5db706b8eed2b83bc7", + "reftest" + ], + "css/CSS2/positioning/position-relative-015.xht": [ + "21f32509453a516fedaaa96b81922e3ae38b3005", + "reftest" + ], + "css/CSS2/positioning/position-relative-016-ref.xht": [ + "61c618e86ef54c50c10309ce7d4bda55cacdd17c", + "support" + ], + "css/CSS2/positioning/position-relative-016.xht": [ + "2afe0a115e1c83fd6fd7a5b05fd48b550d6f89e0", + "reftest" + ], + "css/CSS2/positioning/position-relative-017.xht": [ + "01928ddc26fb8803431b6d587dbc53c56645ce39", + "reftest" + ], + "css/CSS2/positioning/position-relative-018-ref.xht": [ + "835f83cf0bf0f8337c05fd5e41dd07642c6916ea", + "support" + ], + "css/CSS2/positioning/position-relative-018.xht": [ + "5a172a07c4d7405a61fe39f976a38fcb183e9423", + "reftest" + ], + "css/CSS2/positioning/position-relative-019.xht": [ + "31f1000bddc3ccbbc126b455c209eec674896c35", + "reftest" + ], + "css/CSS2/positioning/position-relative-020.xht": [ + "c0613a67f8da782ff0bd460e0595779358d728a5", + "manual" + ], + "css/CSS2/positioning/position-relative-021.xht": [ + "a0cd4d30063f2cb6ac703156259e4e6301b37cbc", + "manual" + ], + "css/CSS2/positioning/position-relative-022.xht": [ + "a839fa0173aeae54223b8ffa1fcb0c2720c2345c", + "manual" + ], + "css/CSS2/positioning/position-relative-027-ref.xht": [ + "5811eea02f162975a5b7e232be8ccd5326b9ceca", + "support" + ], + "css/CSS2/positioning/position-relative-027.xht": [ + "0d7e9b8d7e47fed3549a75ba01f2c213a4c7d3b7", + "reftest" + ], + "css/CSS2/positioning/position-relative-028-ref.xht": [ + "d36a68d78c183f1aa9586570381eccd8d9ecd363", + "support" + ], + "css/CSS2/positioning/position-relative-028.xht": [ + "f18a7853fa27400dbc3acc7a6e94a507b52ccd9d", + "reftest" + ], + "css/CSS2/positioning/position-relative-029.xht": [ + "8c6f0d088aab3de6b3c119937fa623bd703ebab0", + "reftest" + ], + "css/CSS2/positioning/position-relative-030-ref.xht": [ + "6da8d326953f8cf28ab315db56a8de4634035506", + "support" + ], + "css/CSS2/positioning/position-relative-030.xht": [ + "41e78df4ab344d184f03cd38723fa207169b6941", + "reftest" + ], + "css/CSS2/positioning/position-relative-031-ref.xht": [ + "d8ab20871c04f15927a2421400fc0bd94751d801", + "support" + ], + "css/CSS2/positioning/position-relative-031.xht": [ + "3e7ea161ba0c2ca703de599084a12f67841ce8cc", + "reftest" + ], + "css/CSS2/positioning/position-relative-032-ref.xht": [ + "8a894d8e2fe2b660b91f6e865dc8dc1d9a753d76", + "support" + ], + "css/CSS2/positioning/position-relative-032.xht": [ + "140f34dda458aa3f3bc17fbe41463b5f161cdbaf", + "reftest" + ], + "css/CSS2/positioning/position-relative-033-ref.xht": [ + "991f2b892246ec07fda81a08a0caff0cf05ab4c3", + "support" + ], + "css/CSS2/positioning/position-relative-033.xht": [ + "9dd03c08ee48a2f7c6ef8a3b93d7c9b3bcf3cb2d", + "reftest" + ], + "css/CSS2/positioning/position-relative-034.xht": [ + "6418d5b746512edfc985db91cab4ea7248d36feb", + "manual" + ], + "css/CSS2/positioning/position-relative-035-ref.xht": [ + "9b498b666f188f5336f548c4a854382d9fe98d76", + "support" + ], + "css/CSS2/positioning/position-relative-035.xht": [ + "4fd261bbe900307afcfb9e6644f67305a89754cb", + "reftest" + ], + "css/CSS2/positioning/position-relative-036.xht": [ + "a31a05ecf1baa52042aac4cac2bdceb87ccb66f3", + "manual" + ], + "css/CSS2/positioning/position-relative-037-ref.xht": [ + "2309c6edbb197f97163ec89d7881fde2bfe42235", + "support" + ], + "css/CSS2/positioning/position-relative-037.xht": [ + "9a8f28080799f83325589845abe977010ec493bc", + "reftest" + ], + "css/CSS2/positioning/position-relative-038-ref.xht": [ + "fd66e1f9fbd3f69b83bf8c527cef994a61605432", + "support" + ], + "css/CSS2/positioning/position-relative-038.xht": [ + "b2ee62bfad3597537bf980c5a9aeae656a204eaa", + "reftest" + ], + "css/CSS2/positioning/position-relative-nested-001-ref.xht": [ + "f77d0756e66c1e0874195247b8dba1b7c392d47c", + "support" + ], + "css/CSS2/positioning/position-relative-nested-001.xht": [ + "09568e6adbdf1dd27622658e1fef970e43b9c9d9", + "reftest" + ], + "css/CSS2/positioning/position-static-001-ref.xht": [ + "56011fd24ab00aef3025b07cccfee49971695be5", + "support" + ], + "css/CSS2/positioning/position-static-001.xht": [ + "3ee674d158e165662106311d7f2d55e8fdabe7e5", + "reftest" + ], + "css/CSS2/positioning/positioning-float-001-ref.xht": [ + "6c2415a373b5eda24ddb8718d4d2483a2a2902a3", + "support" + ], + "css/CSS2/positioning/positioning-float-001.xht": [ + "f09c12ed86ca1c628f5cd14af54e5815eef5b3b0", + "reftest" + ], + "css/CSS2/positioning/positioning-float-002-ref.xht": [ + "bd6fcf0bc32e18305a817e39ac350fec4a00e815", + "support" + ], + "css/CSS2/positioning/positioning-float-002.xht": [ + "fc2d5ac0a15935e75b2e7c3a4d8fc73403b6eed3", + "reftest" + ], + "css/CSS2/positioning/relpos-calcs-001-ref.xht": [ + "3132cdbc335c90e0f492871bebc8eea52e3979f8", + "support" + ], + "css/CSS2/positioning/relpos-calcs-001.xht": [ + "ddfe2c8396149859c66a5be7c5e94be98a8352fd", + "reftest" + ], + "css/CSS2/positioning/relpos-calcs-002.xht": [ + "5b4daa3199e0f690ef42151022ca8aba091e91f4", + "reftest" + ], + "css/CSS2/positioning/relpos-calcs-003.xht": [ + "6a8f543a4b055bcf15d42ae7682376e4ba70abc6", + "reftest" + ], + "css/CSS2/positioning/relpos-calcs-004.xht": [ + "3076268c88eaba59f27d6c36ba29bb83561d2ee7", + "reftest" + ], + "css/CSS2/positioning/relpos-calcs-005.xht": [ + "29451d33a894a908676585db0b403088d7e523e9", + "reftest" + ], + "css/CSS2/positioning/relpos-calcs-006.xht": [ + "144a2eeb924a0fd956b1238bc118a5062700cccf", + "reftest" + ], + "css/CSS2/positioning/relpos-calcs-007.xht": [ + "0a8b49357d6719b6d474e053d4ecb96fe77f56a8", + "reftest" + ], + "css/CSS2/positioning/right-004-ref.xht": [ + "878bdb126fb84cc669b66436965399e064722fea", + "support" + ], + "css/CSS2/positioning/right-004.xht": [ + "2403896a8079c13adc1df9be28d0c5a658752236", + "reftest" + ], + "css/CSS2/positioning/right-005.xht": [ + "df666ac6fc836e5e429f9551ba24eac4a2c4cecb", + "reftest" + ], + "css/CSS2/positioning/right-006.xht": [ + "c2ca8015a0a2afa96c0fb81eeaf3909c394f0db9", + "reftest" + ], + "css/CSS2/positioning/right-007-ref.xht": [ + "09d8547ad61ac3e44834c86dd109b0eb7f2a650f", + "support" + ], + "css/CSS2/positioning/right-007.xht": [ + "2d5ed0b03facba34669cdbea1b99d5febc451f53", + "reftest" + ], + "css/CSS2/positioning/right-008.xht": [ + "cf3511cbb7d69ec4cd27978af4bb76d8380da3b6", + "reftest" + ], + "css/CSS2/positioning/right-016.xht": [ + "063d11b9089b46588340e0e5816611087e87a491", + "reftest" + ], + "css/CSS2/positioning/right-017.xht": [ + "91f545c1906f7199bc95d7ab7e12938a94c9ce09", + "reftest" + ], + "css/CSS2/positioning/right-018.xht": [ + "228dc3be77b7d1631aed6195513574e5d2ec6720", + "reftest" + ], + "css/CSS2/positioning/right-019-ref.xht": [ + "28dfdbe6f5b56c4ed469f1c4c843c60ee118742a", + "support" + ], + "css/CSS2/positioning/right-019.xht": [ + "3d37b9fdc3d3248882a4568ccc83b7352a2c2baa", + "reftest" + ], + "css/CSS2/positioning/right-020.xht": [ + "0c57f0dad0d826833a3702d6e31b6223fb859afc", + "reftest" + ], + "css/CSS2/positioning/right-028.xht": [ + "91eac5d44ba292bb375f0e06db089b1051058b87", + "reftest" + ], + "css/CSS2/positioning/right-029.xht": [ + "abd4b77dd525b8db086c35888378b52d5d1f91f0", + "reftest" + ], + "css/CSS2/positioning/right-030.xht": [ + "c660cfade0b57477faec85db7095e967f2ff80a1", + "reftest" + ], + "css/CSS2/positioning/right-031-ref.xht": [ + "77a7333e36b710cf93cf1be7a0ad4bcf2cf9506e", + "support" + ], + "css/CSS2/positioning/right-031.xht": [ + "60db0c5ca4d10841c6e130688828f280a22a14bf", + "reftest" + ], + "css/CSS2/positioning/right-032.xht": [ + "280f120a9921a89119291a772dedbd193a245f39", + "reftest" + ], + "css/CSS2/positioning/right-040.xht": [ + "085ffa040d01385be7bfcb4f102e84ea4b7ef5c2", + "reftest" + ], + "css/CSS2/positioning/right-041.xht": [ + "cfbd81396f84104f77860184c6ee25d82db0375d", + "reftest" + ], + "css/CSS2/positioning/right-042.xht": [ + "6a21fa287a8dac89ef5d7cd6b7db1f4403b20964", + "reftest" + ], + "css/CSS2/positioning/right-043.xht": [ + "a13d8b1dbb31f40553dd323d71d0719f9d668e80", + "reftest" + ], + "css/CSS2/positioning/right-044.xht": [ + "30002702e154ee221cfca8b97b80430b9bfe1b41", + "reftest" + ], + "css/CSS2/positioning/right-052.xht": [ + "7940f70fe3a1850451b13971c68a7df5a7279ca7", + "reftest" + ], + "css/CSS2/positioning/right-053.xht": [ + "c75d9597b1dd870e5d0e5e1bfdf0cfccd8dfa8df", + "reftest" + ], + "css/CSS2/positioning/right-054.xht": [ + "92c180868a0eeeac1ff69ff943dbfe34515d5b67", + "reftest" + ], + "css/CSS2/positioning/right-055.xht": [ + "8c834f05336beca8fad3cab1ce229186e3deaaed", + "reftest" + ], + "css/CSS2/positioning/right-056.xht": [ + "69f72d4d680df3c2b6f49cb479679f89c29418fb", + "reftest" + ], + "css/CSS2/positioning/right-064.xht": [ + "e8e8cd55a4f6f28ca5d96c4c04e8e9c9ce133843", + "reftest" + ], + "css/CSS2/positioning/right-065.xht": [ + "74e456e5bcadbf496c1c5b1b11107f55b756092b", + "reftest" + ], + "css/CSS2/positioning/right-066.xht": [ + "7c3ac77db067dd0d21f87a6ad504586566f0e513", + "reftest" + ], + "css/CSS2/positioning/right-067.xht": [ + "e172175552bd0a86709f5b6e1005b6c6369711a6", + "reftest" + ], + "css/CSS2/positioning/right-068.xht": [ + "87d6efcf56a93862bb6c9193abea9569d66744d0", + "reftest" + ], + "css/CSS2/positioning/right-076.xht": [ + "c521e0b6516102581a2d0ad135feb7cd864afd69", + "reftest" + ], + "css/CSS2/positioning/right-077.xht": [ + "163bd377ab8e295b639123294c017bb5b372ae88", + "reftest" + ], + "css/CSS2/positioning/right-078.xht": [ + "42794ae2995a27d37e17e73e6f37cb53cbf0f95a", + "reftest" + ], + "css/CSS2/positioning/right-079-ref.xht": [ + "929b35703246d0b37f2d5c9afa2c504785c413fc", + "support" + ], + "css/CSS2/positioning/right-079.xht": [ + "8773960e68b644f7f40a2b13f99828eb78a57450", + "reftest" + ], + "css/CSS2/positioning/right-080.xht": [ + "43c6a8e0e3e737444a7111f03d0071b415393a52", + "reftest" + ], + "css/CSS2/positioning/right-088.xht": [ + "5e7ebc9696c0688ff2ecc742e898d81675f83376", + "reftest" + ], + "css/CSS2/positioning/right-089.xht": [ + "cfb48fd6a8d54d82bb53bd066fa71905c5dbb807", + "reftest" + ], + "css/CSS2/positioning/right-090.xht": [ + "66c1b076cd8edaf1a4e443a09afa5e894d5b8a11", + "reftest" + ], + "css/CSS2/positioning/right-091.xht": [ + "34506bd2362c64c11cdda5ff9d7222376fb5149e", + "reftest" + ], + "css/CSS2/positioning/right-092.xht": [ + "6ac37ca8e4537b0801423916a56f2e52a42e8a1f", + "reftest" + ], + "css/CSS2/positioning/right-100-ref.xht": [ + "39637a1678421e1b795dbfde27a1c170d55c5069", + "support" + ], + "css/CSS2/positioning/right-100.xht": [ + "28d9d20d9b138fdda50027352ed7aa32c18acee1", + "reftest" + ], + "css/CSS2/positioning/right-101.xht": [ + "bce4dbb4ee1064c0049b7dbf4d10273d0664545f", + "reftest" + ], + "css/CSS2/positioning/right-102.xht": [ + "6b4e5958527a3a178e282fdff233c9c38ede54f4", + "reftest" + ], + "css/CSS2/positioning/right-103-ref.xht": [ + "780ed33618cbc06af93abf717b9108b808ac6043", + "support" + ], + "css/CSS2/positioning/right-103.xht": [ + "d46d49a13f048df883b2a37b5708f4e92793504d", + "reftest" + ], + "css/CSS2/positioning/right-104.xht": [ + "27dab2d7e9902a0e16c1162b3fccbb24a9705e5e", + "reftest" + ], + "css/CSS2/positioning/right-109.xht": [ + "31489261a035aba0f5cba810498270e53501bca9", + "reftest" + ], + "css/CSS2/positioning/right-110.xht": [ + "6a913826763af70739f82863fadd0fee955e2ce1", + "reftest" + ], + "css/CSS2/positioning/right-111.xht": [ + "458fa5272e3360dad5ea182d5d1c3126780679f3", + "reftest" + ], + "css/CSS2/positioning/right-112.xht": [ + "333b8c117b6c8ac2e4c39fa206635ecac305cc8f", + "reftest" + ], + "css/CSS2/positioning/right-113.xht": [ + "0d0c181e140abe5ea318867d4b797fc1dab8a6e5", + "reftest" + ], + "css/CSS2/positioning/right-applies-to-001-ref.xht": [ + "055ee523f79b2e075c853777aaf5538d18aff70d", + "support" + ], + "css/CSS2/positioning/right-applies-to-001.xht": [ + "2aa5c6e1d3e473e69735a67a35a41faad4934872", + "reftest" + ], + "css/CSS2/positioning/right-applies-to-002.xht": [ + "d7cdeec9d997cd82679a1e634f647a2fc393a1de", + "reftest" + ], + "css/CSS2/positioning/right-applies-to-003.xht": [ + "68f4d3be987810ceacf1a8479c98fa0e7389d31c", + "reftest" + ], + "css/CSS2/positioning/right-applies-to-004.xht": [ + "b62a2b105863076e748e722099858ed581c506f5", + "reftest" + ], + "css/CSS2/positioning/right-applies-to-005.xht": [ + "e6f00113504866c2e6bcb8dc6dd930c5cb80c8e8", + "reftest" + ], + "css/CSS2/positioning/right-applies-to-006.xht": [ + "210c597430b2430eca93052fa406c1b267e39bf6", + "reftest" + ], + "css/CSS2/positioning/right-applies-to-007.xht": [ + "1e5e39f26d88bd5f2f790beac98bfa55e01ad937", + "reftest" + ], + "css/CSS2/positioning/right-applies-to-008.xht": [ + "2de9c9299fcb9e44abc4acfbfe40ab2495168e8a", + "visual" + ], + "css/CSS2/positioning/right-applies-to-009.xht": [ + "94dbb548aabb084f9ed758a3ded3ac135873e02b", + "reftest" + ], + "css/CSS2/positioning/right-applies-to-010.xht": [ + "35d0bf65ff5901af8f96887eabeb3abf4063e3c8", + "visual" + ], + "css/CSS2/positioning/right-applies-to-012.xht": [ + "12fee90072e85d71cdac4ae01e6067f4f0e712f6", + "reftest" + ], + "css/CSS2/positioning/right-applies-to-013.xht": [ + "5d4f5238d34c3b8f478f6d1aec9705a36022f12a", + "reftest" + ], + "css/CSS2/positioning/right-applies-to-014.xht": [ + "e542cd0f0e5fa462d284c482cc69558741f223e7", + "reftest" + ], + "css/CSS2/positioning/right-applies-to-015.xht": [ + "5e7d05bb46a5e73cd427bb9a0cc4b93c39be626d", + "reftest" + ], + "css/CSS2/positioning/right-offset-001-ref.xht": [ + "efda7559d3a944487b23b977d4e4a16045ea58ef", + "support" + ], + "css/CSS2/positioning/right-offset-001.xht": [ + "d0e7d9e02b523435b3a46dd8fe92de682ffe18fc", + "reftest" + ], + "css/CSS2/positioning/right-offset-002.xht": [ + "abeb73bceb76f7fb93f1182453d2a539310a63b6", + "reftest" + ], + "css/CSS2/positioning/right-offset-003.xht": [ + "48884d5e0a6b35711e7208fc037b42b562715962", + "reftest" + ], + "css/CSS2/positioning/right-offset-004.xht": [ + "b15c0f54cbdf86ad60158db9d015556b7e51bf99", + "reftest" + ], + "css/CSS2/positioning/right-offset-percentage-001-ref.xht": [ + "b42c00019cb349a9f67eb3f4a9ca1d6a8486fc63", + "support" + ], + "css/CSS2/positioning/right-offset-percentage-001.xht": [ + "8e119030e3cffce36c4e25756e9acf350802889f", + "reftest" + ], + "css/CSS2/positioning/support/100x100-lime.png": [ + "b02fc2d0ad1d95a2aeb6011022e63928841b183f", + "support" + ], + "css/CSS2/positioning/support/100x100-red.png": [ + "6fdfe9cdb3f6aca4564a08e443784e3abd952b52", + "support" + ], + "css/CSS2/positioning/support/1x1-green.png": [ + "51e7b6974a09eda6cb31337717c5eaeb9c44b443", + "support" + ], + "css/CSS2/positioning/support/1x1-lime.png": [ + "b040eb633a35c0648ad72a2902361faf25bc419d", + "support" + ], + "css/CSS2/positioning/support/1x1-maroon.png": [ + "f78757e5ebe897bd618d100718385c84e00f2369", + "support" + ], + "css/CSS2/positioning/support/1x1-navy.png": [ + "a3fd80b2c79866fd343e18eef5a51ed6e835e53e", + "support" + ], + "css/CSS2/positioning/support/1x1-red.png": [ + "b8da86921d04ba42f42b0a60b03c5c2172f58c2b", + "support" + ], + "css/CSS2/positioning/support/1x1-white.png": [ + "71b246439f915ad21c7d39414d9f85c8ed73b4ca", + "support" + ], + "css/CSS2/positioning/support/60x60-gg-rr.png": [ + "e4843d42a26189132e1bdd53e8618521330baeca", + "support" + ], + "css/CSS2/positioning/support/60x60-green.png": [ + "2f8eb2409b0a18e0bff90725ec7eedc16e7be448", + "support" + ], + "css/CSS2/positioning/support/60x60-red.png": [ + "415b835abaaab822aab11880354296e7356bbb0a", + "support" + ], + "css/CSS2/positioning/support/a-green.css": [ + "a9716c222274ba868bfd06c05e28cb7762d93245", + "support" + ], + "css/CSS2/positioning/support/b-green.css": [ + "eb78a4d12f35b4249051826ea000c53d04df80b7", + "support" + ], + "css/CSS2/positioning/support/black15x15.png": [ + "9252cae16138e45c07796fa5a10b6100ae703eaa", + "support" + ], + "css/CSS2/positioning/support/blue15x15.png": [ + "eb48032c07bfeb1d3b6be6e5c9c34d2fe2180767", + "support" + ], + "css/CSS2/positioning/support/blue96x96.png": [ + "99949c515749e66f471c3589ee7a0ef518aaccb5", + "support" + ], + "css/CSS2/positioning/support/c-red.css": [ + "dc288b7aa49b57e0abf803741e78582ba5ceffdb", + "support" + ], + "css/CSS2/positioning/support/cat.png": [ + "461fd17b274662b88500cdf42bab7f3b79e6019d", + "support" + ], + "css/CSS2/positioning/support/diamond.png": [ + "4a136dfe39879f33f627a6de92f1e43fe8af7b94", + "support" + ], + "css/CSS2/positioning/support/green-rectangle-50wideBy10tall.png": [ + "4793a81fb04b63524970d8906c4ca0fc4e8571db", + "support" + ], + "css/CSS2/positioning/support/green15x15.png": [ + "de1830c21195763f7327f270b14b6d50dfdfb21d", + "support" + ], + "css/CSS2/positioning/support/green_box.png": [ + "e4686e26d7668b1a087810cc823252e32fde749e", + "support" + ], + "css/CSS2/positioning/support/pattern-grg-rrg-rgg.png": [ + "27080d4df556f59d4b501e03f2847bd9da5756a9", + "support" + ], + "css/CSS2/positioning/support/pattern-tr.png": [ + "c1e687deee7b79ae091f2b42c4f6cff430076444", + "support" + ], + "css/CSS2/positioning/support/red_box.png": [ + "6fdfe9cdb3f6aca4564a08e443784e3abd952b52", + "support" + ], + "css/CSS2/positioning/support/ring.png": [ + "11dd9e78a68b2fc5eb69c401920b43070751a569", + "support" + ], + "css/CSS2/positioning/support/square-purple.png": [ + "ef0619128f22e05920930420b7d96f91f860d904", + "support" + ], + "css/CSS2/positioning/support/square-teal.png": [ + "92efae44b710cf1ddd9ba96e593dae03fb2519c4", + "support" + ], + "css/CSS2/positioning/support/square-white.png": [ + "2f93fcc1462ba32b9b7899e5e78c869e529e68ee", + "support" + ], + "css/CSS2/positioning/support/swatch-blue.png": [ + "e79958e10feeeed3db88dee9bae9ea80055593c5", + "support" + ], + "css/CSS2/positioning/support/swatch-green.png": [ + "c51a03a807743f59e3027371ccfbd8e80235a485", + "support" + ], + "css/CSS2/positioning/support/swatch-lime.png": [ + "ee2cc3dcd6d8dda7c0e4ef3bbc7e63c74118211d", + "support" + ], + "css/CSS2/positioning/support/swatch-orange.png": [ + "10768a5177b772013e628c7397ae64725057295d", + "support" + ], + "css/CSS2/positioning/support/swatch-red.png": [ + "eedea3e9a99c18f5fc2de3796be2c6f9da2ea07d", + "support" + ], + "css/CSS2/positioning/support/swatch-white.png": [ + "5bccb1922de065e551d7d106e6493bb91040f3da", + "support" + ], + "css/CSS2/positioning/support/swatch-yellow.png": [ + "9cc73897c2e1fc45f5224d81d02a6b87bf72b1fa", + "support" + ], + "css/CSS2/positioning/support/test-bl.png": [ + "16e4eaa4864c10e72433e575f59c9b67763fe06a", + "support" + ], + "css/CSS2/positioning/support/test-br.png": [ + "37f65e7a21d9b9b2daa508f193b8f665c58a1ce9", + "support" + ], + "css/CSS2/positioning/support/test-outer.png": [ + "a0b8dfa40065b27f1d939ce0aab39ada3933c574", + "support" + ], + "css/CSS2/positioning/support/test-tl.png": [ + "956e5156fd8c0e75b1c0f3b8b3b900b653663f74", + "support" + ], + "css/CSS2/positioning/support/test-tr.png": [ + "078e1dd6dd61d36cec239ed75d02051f61fe60a5", + "support" + ], + "css/CSS2/positioning/top-004.xht": [ + "fd501481fbea492b18386986a2f6220e452f14de", + "reftest" + ], + "css/CSS2/positioning/top-005.xht": [ + "8704c2bc7a966d3f44ddfea4d6a50d5e2b165167", + "reftest" + ], + "css/CSS2/positioning/top-006.xht": [ + "2b1e7341801708319ff726f6bb1677606200676b", + "reftest" + ], + "css/CSS2/positioning/top-007-ref.xht": [ + "360798cbbf62cb5dcd1d9b7ce19f9a6c61131c90", + "support" + ], + "css/CSS2/positioning/top-007.xht": [ + "021a814be19e7b39720c9373eb751b83d3538711", + "reftest" + ], + "css/CSS2/positioning/top-008.xht": [ + "784a11ac6fa179d0eddb245dee348df46a4fe15a", + "reftest" + ], + "css/CSS2/positioning/top-016.xht": [ + "05c0314d130f22aa85f5a942e59d324effb99e13", + "reftest" + ], + "css/CSS2/positioning/top-017.xht": [ + "3ec7026d7b129f6c49375750980b58507d9995dc", + "reftest" + ], + "css/CSS2/positioning/top-018.xht": [ + "310940e283da7a7faa1cccb039f0635465f6f249", + "reftest" + ], + "css/CSS2/positioning/top-019-ref.xht": [ + "aec53abfbb4187be51fe3e0a5418b2ffb89b30ad", + "support" + ], + "css/CSS2/positioning/top-019.xht": [ + "7b82827f5931d32b59a134013f731a3fe984405f", + "reftest" + ], + "css/CSS2/positioning/top-020.xht": [ + "04519b70b2d45a70e6e446bcf43fdb9016dbc4ad", + "reftest" + ], + "css/CSS2/positioning/top-028.xht": [ + "fcef16c70a482139dc797704ec0622413d7c47fe", + "reftest" + ], + "css/CSS2/positioning/top-029.xht": [ + "dfff88266b88aa6124e6de16c0ff6546476f3786", + "reftest" + ], + "css/CSS2/positioning/top-030.xht": [ + "b5e6e0cbe1ea7e5babda461467020bcd2eb02b97", + "reftest" + ], + "css/CSS2/positioning/top-031.xht": [ + "48822e1651f5ac48801641891f5a29ce619855cf", + "reftest" + ], + "css/CSS2/positioning/top-032.xht": [ + "2ea6845a14b23e884f65bd47d57e084d475371be", + "reftest" + ], + "css/CSS2/positioning/top-040.xht": [ + "7135383082472a272d3d400546b195c6cc3a5e71", + "reftest" + ], + "css/CSS2/positioning/top-041.xht": [ + "15a7edcd27b74b20567497cf4e38fae56480a9e2", + "reftest" + ], + "css/CSS2/positioning/top-042.xht": [ + "9d9f417f871245aa182c75829f1cf8f3eb4b0583", + "reftest" + ], + "css/CSS2/positioning/top-043.xht": [ + "07072e9b1c960d2921c7c44037102637de5cfb2f", + "reftest" + ], + "css/CSS2/positioning/top-044.xht": [ + "691f7fe5315b2c86b0a80a85c91c9a9cd2fa62cc", + "reftest" + ], + "css/CSS2/positioning/top-052.xht": [ + "3391d3ccf7c645eb0e774aa8ac11f9bc84aa4bef", + "reftest" + ], + "css/CSS2/positioning/top-053.xht": [ + "fdeaae1915bcb18b69c1616bc91d7601557536e4", + "reftest" + ], + "css/CSS2/positioning/top-054.xht": [ + "aa3f729a708ea327633d34a9cee67b53519d103c", + "reftest" + ], + "css/CSS2/positioning/top-055.xht": [ + "b45ab996f60d15d90d980fcc665d1dac011eecbd", + "reftest" + ], + "css/CSS2/positioning/top-056.xht": [ + "684f728c03853ffe468fd6a3adb5dc9393e4772a", + "reftest" + ], + "css/CSS2/positioning/top-064.xht": [ + "6f464c066c9e0ae6b5dd4f302607b9022a82f6e9", + "reftest" + ], + "css/CSS2/positioning/top-065.xht": [ + "89f13529fc628fd080b973c32c333d22bad007bd", + "reftest" + ], + "css/CSS2/positioning/top-066.xht": [ + "36643b6f718b3204eae666c13fa40bbef9046862", + "reftest" + ], + "css/CSS2/positioning/top-067.xht": [ + "4a1ee0c26e81948fe4ca96a58e71667857800373", + "reftest" + ], + "css/CSS2/positioning/top-068.xht": [ + "a6e42b2885af22232d50076d707efe3261caa688", + "reftest" + ], + "css/CSS2/positioning/top-076.xht": [ + "e5a0b8eb0af56c13430c8c1bae95e36301ba771e", + "reftest" + ], + "css/CSS2/positioning/top-077.xht": [ + "5fa461b5975ad8b183290e36e500c55232ebaf89", + "reftest" + ], + "css/CSS2/positioning/top-078.xht": [ + "17f5a4a66c6f0eeba379458dc4df486561897f04", + "reftest" + ], + "css/CSS2/positioning/top-079-ref.xht": [ + "36c52fc6af89e5e92cd8eb56db3ed8bdebfd8497", + "support" + ], + "css/CSS2/positioning/top-079.xht": [ + "026b95e52d6c47402e256a9ada98eadbed956525", + "reftest" + ], + "css/CSS2/positioning/top-080.xht": [ + "717baa19a5a03086ba0f104179b42f8318bf8ecd", + "reftest" + ], + "css/CSS2/positioning/top-088.xht": [ + "a8d3aaf277884966a6955edf5705f4634fac2077", + "reftest" + ], + "css/CSS2/positioning/top-089.xht": [ + "d274c25518dfee0e68f0fcf5ab1acac76d0f217e", + "reftest" + ], + "css/CSS2/positioning/top-090.xht": [ + "be57836b0391306ab6850230bfaf02b9593a3739", + "reftest" + ], + "css/CSS2/positioning/top-091.xht": [ + "b81f15b550fa84260a24dca090e67e9d347f70d6", + "reftest" + ], + "css/CSS2/positioning/top-092.xht": [ + "2d039fa86657e2e819467b5d49e0ac2c84dde3f1", + "reftest" + ], + "css/CSS2/positioning/top-100.xht": [ + "488b75fd6135193cc08ebd2e2be06fb1850af867", + "reftest" + ], + "css/CSS2/positioning/top-101.xht": [ + "852160564616f54986da1429864fe2843a7a5967", + "reftest" + ], + "css/CSS2/positioning/top-102.xht": [ + "f300289cc4981568f16fc737f70436c08389560f", + "reftest" + ], + "css/CSS2/positioning/top-103.xht": [ + "9f3e72f608863735d637e6e30384222762c5dd0d", + "reftest" + ], + "css/CSS2/positioning/top-104.xht": [ + "263444e67ad8a184b216b5da8c9a4163b20c19df", + "reftest" + ], + "css/CSS2/positioning/top-109.xht": [ + "0e8194f91109a321a9c8f6f6245e33bf41fe338f", + "reftest" + ], + "css/CSS2/positioning/top-110.xht": [ + "9688af21820930ddfb04c93fa06a2dc7fcaf7f44", + "reftest" + ], + "css/CSS2/positioning/top-111.xht": [ + "dce6e63f294a9890382a297a32a96c60677c54fc", + "reftest" + ], + "css/CSS2/positioning/top-112.xht": [ + "28896156f439637f1b8596490ce6f4a770064a85", + "reftest" + ], + "css/CSS2/positioning/top-113-ref.xht": [ + "2168b6571f2eca4bb63146bf1bc93352ff31ce77", + "support" + ], + "css/CSS2/positioning/top-113.xht": [ + "ae2cd00d9a22922494f357de1261495d7b568249", + "reftest" + ], + "css/CSS2/positioning/top-applies-to-001-ref.xht": [ + "5db236198fc2f01a92a9f6ae7e5a8b021a23b18d", + "support" + ], + "css/CSS2/positioning/top-applies-to-001.xht": [ + "04b1e31645554e2a5fac707658028150ff40500f", + "reftest" + ], + "css/CSS2/positioning/top-applies-to-002.xht": [ + "1f67255402c0cd734a9ac22b2aa7384a04f84b9d", + "reftest" + ], + "css/CSS2/positioning/top-applies-to-003.xht": [ + "03878465ff0e3c920bec6dcf69def4bb6d6d5e3f", + "reftest" + ], + "css/CSS2/positioning/top-applies-to-004.xht": [ + "e92958c36f532b6f167a2b659af3c2ce2d4b6f7a", + "reftest" + ], + "css/CSS2/positioning/top-applies-to-005.xht": [ + "5ffd2d12e6bd6eb6893f5da53bb00f4a4816cb17", + "reftest" + ], + "css/CSS2/positioning/top-applies-to-006.xht": [ + "709364a3d5c5efb1d97ab14e338303950de7ea72", + "reftest" + ], + "css/CSS2/positioning/top-applies-to-007.xht": [ + "199cb996b243c9ccd98b00be3b37454fbeba55ca", + "reftest" + ], + "css/CSS2/positioning/top-applies-to-008.xht": [ + "b1c3b8d24e95213933def55fa98743005188f5fe", + "visual" + ], + "css/CSS2/positioning/top-applies-to-009.xht": [ + "9a2a2fd632096ffcd92022e803ee23d5e34cb116", + "reftest" + ], + "css/CSS2/positioning/top-applies-to-010.xht": [ + "1def565aeff9ac5b32c992a1cbef42518750abed", + "visual" + ], + "css/CSS2/positioning/top-applies-to-012.xht": [ + "a884c66e41c5130c35919818d0c3e4d221cf2e5d", + "reftest" + ], + "css/CSS2/positioning/top-applies-to-013.xht": [ + "d22f5140d76d528b2133020ee1090c2334191deb", + "reftest" + ], + "css/CSS2/positioning/top-applies-to-014.xht": [ + "79bf61d1a75f645407416bb94b73c9df52ca50c0", + "reftest" + ], + "css/CSS2/positioning/top-applies-to-015.xht": [ + "95fda6417983e8aa82a474dd6fccb6c64ce4ea3d", + "reftest" + ], + "css/CSS2/positioning/top-offset-001.xht": [ + "fefc4b9148f8b99c5fbb3743b3d26ae0cd2e5b08", + "reftest" + ], + "css/CSS2/positioning/top-offset-002.xht": [ + "4d453ff3ea77506c6e670a9c2246a50e66d9f22e", + "reftest" + ], + "css/CSS2/positioning/top-offset-003-ref.xht": [ + "5b3738e57f9125d3fce09287237917feb588d481", + "support" + ], + "css/CSS2/positioning/top-offset-003.xht": [ + "4971a1198e7871c35d882b09933d8081889e828d", + "reftest" + ], + "css/CSS2/positioning/top-offset-percentage-001-ref.xht": [ + "c9257cb78b7e88e8af47fddee635836ee81be635", + "support" + ], + "css/CSS2/positioning/top-offset-percentage-001.xht": [ + "fd92e44fbaa01603ac361c39b5e9e3e5f4bc9e65", + "reftest" + ], + "css/CSS2/positioning/top-offset-percentage-002.xht": [ + "4e18ff75863795095389735b96d557a8fbffde44", + "reftest" + ], "css/CSS2/reference/60x60-green.html": [ "c9d25fc5f68ddf46dbdf1176e719b53a22f915f7", "support" @@ -154054,6 +183271,22 @@ "0dd816530943f3a6fa3235b1d481f70ca578b6e6", "reftest" ], + "html/rendering/non-replaced-elements/the-page/iframe-body-margin-attributes.html": [ + "68e9c15f160415a652650331f403dd324cd402e9", + "testharness" + ], + "html/rendering/non-replaced-elements/the-page/iframe-marginwidth-marginheight.html": [ + "db8b96ffd3b16bc78d937b46860de8c22d857947", + "testharness" + ], + "html/rendering/non-replaced-elements/the-page/support/body-marginwidth-marginheight.html": [ + "d75fd3830c23860db68fe23589f74a7bdc95be91", + "support" + ], + "html/rendering/non-replaced-elements/the-page/support/body-topmargin-leftmargin.html": [ + "1c31ddd13c97504f59d1e403f6ab90252fa68e0c", + "support" + ], "html/rendering/non-replaced-elements/the-page/test-body.xhtml": [ "7a229199399e678847280e6e88e40e5b37bfdd11", "support" @@ -155887,7 +185120,7 @@ "testharness" ], "html/semantics/forms/textfieldselection/selection-after-content-change.html": [ - "c7f9433a664b59f59be933cdf607c158a599dff7", + "e256a498b2f958dcc6efde8393a79b61e793642a", "testharness" ], "html/semantics/forms/textfieldselection/selection-not-application-textarea.html": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/iframe-body-margin-attributes-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/iframe-body-margin-attributes-expected.txt new file mode 100644 index 0000000..eb9ecfe98 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/iframe-body-margin-attributes-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL body marginwidth vs body leftmargin assert_equals: marginTop expected "20px" but got "10px" +FAIL iframe marginwidth vs child body leftmargin assert_equals: marginTop expected "20px" but got "10px" +FAIL iframe marginwidth vs child body marginwidth assert_equals: marginTop expected "20px" but got "10px" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/iframe-body-margin-attributes.html b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/iframe-body-margin-attributes.html new file mode 100644 index 0000000..e1f4fb5 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/iframe-body-margin-attributes.html
@@ -0,0 +1,32 @@ +<!doctype html> +<title>iframe and body margin attributes</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body marginwidth=20 marginheight=20 topmargin=10 rightmargin=10 bottommargin=10 leftmargin=10> +<iframe data-desc="iframe marginwidth vs child body leftmargin" src="support/body-topmargin-leftmargin.html" marginwidth=10 marginheight=10></iframe> +<iframe data-desc="iframe marginwidth vs child body marginwidth" src="support/body-marginwidth-marginheight.html" marginwidth=10 marginheight=10></iframe> +<script> +setup({explicit_done: true}); + +onload = () => { + test(() => { + const style = getComputedStyle(document.body); + assert_style_props(style); + }, 'body marginwidth vs body leftmargin'); + + [].forEach.call(document.querySelectorAll('iframe'), iframe => { + test(() => { + const win = iframe.contentWindow; + const style = win.getComputedStyle(win.document.body); + assert_style_props(style); + }, iframe.dataset.desc); + }); + done(); +} + +function assert_style_props(style) { + for (let prop of ['marginTop', 'marginRight', 'marginBottom', 'marginLeft']) { + assert_equals(style[prop], '20px', prop); + } +} +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/iframe-marginwidth-marginheight-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/iframe-marginwidth-marginheight-expected.txt new file mode 100644 index 0000000..5c9872f7 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/iframe-marginwidth-marginheight-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL iframe marginwidth and marginheight Uncaught Error: assert_equals: Number of attributes on the child document's body expected 0 but got 2 +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/iframe-marginwidth-marginheight.html b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/iframe-marginwidth-marginheight.html new file mode 100644 index 0000000..b5b49d1b --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/iframe-marginwidth-marginheight.html
@@ -0,0 +1,11 @@ +<!doctype html> +<title>iframe marginwidth and marginheight</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<iframe src="/common/blank.html" marginwidth=0 marginheight=0></iframe> +<script> +onload = () => { + assert_equals(window[0].document.body.attributes.length, 0, "Number of attributes on the child document's body"); + done(); +} +</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/support/body-marginwidth-marginheight.html b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/support/body-marginwidth-marginheight.html new file mode 100644 index 0000000..5d825e3 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/support/body-marginwidth-marginheight.html
@@ -0,0 +1,2 @@ +<!doctype html> +<body marginwidth=20 marginheight=20>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/support/body-topmargin-leftmargin.html b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/support/body-topmargin-leftmargin.html new file mode 100644 index 0000000..7ba5e53 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/rendering/non-replaced-elements/the-page/support/body-topmargin-leftmargin.html
@@ -0,0 +1,2 @@ +<!doctype html> +<body topmargin=20 rightmargin=20 bottommargin=20 leftmargin=20>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/textfieldselection/selection-after-content-change-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/textfieldselection/selection-after-content-change-expected.txt new file mode 100644 index 0000000..48a72e42 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/textfieldselection/selection-after-content-change-expected.txt
@@ -0,0 +1,16 @@ +This is a testharness.js-based test. +FAIL input out of document: selection must not change when setting the same value assert_equals: selectionStart must not change expected 1 but got 5 +PASS input out of document: selection must change when setting a different value +FAIL input in document: selection must not change when setting the same value assert_equals: selectionStart must not change expected 1 but got 5 +PASS input in document: selection must change when setting a different value +FAIL input in document, with focus: selection must not change when setting the same value assert_equals: selectionStart must not change expected 1 but got 5 +PASS input in document, with focus: selection must change when setting a different value +PASS textarea out of document: selection must not change when setting the same value +PASS textarea out of document: selection must change when setting a different value +PASS textarea in document: selection must not change when setting the same value +PASS textarea in document: selection must change when setting a different value +PASS textarea in document, with focus: selection must not change when setting the same value +PASS textarea in document, with focus: selection must change when setting a different value +PASS textarea in document: selection must not change when setting the same normalized value +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/textfieldselection/selection-after-content-change.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/textfieldselection/selection-after-content-change.html index 90ebc28..37f37a8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/textfieldselection/selection-after-content-change.html +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/textfieldselection/selection-after-content-change.html
@@ -3,16 +3,115 @@ <title>Selection indices after content change</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> + +<input id="i1" type="text" value="hello"> +<textarea id="t1">hello</textarea> + <script> - test(function() { - var input = document.createElement("input"); - input.focus(); - input.value = "something something something dark side"; - input.setSelectionRange(4,20); - assert_equals(input.selectionStart, 4); - assert_equals(input.selectionEnd, 20); - input.value = "It's a trap!"; - assert_equals(input.selectionStart, input.value.length); - assert_equals(input.selectionEnd, input.value.length); -}, "Selection indices after reseting content"); +"use strict"; + +// This helper ensures that when the selection direction is reset, it always is reset to the same value consistently +// (which must be one of either "none" or "forward"). This helps catch bugs like one observed in Chrome, where textareas +// reset to "none" but inputs reset to "forward". +let observedResetSelectionDirection +function assertSelectionDirectionIsReset(element) { + if (!observedResetSelectionDirection) { + assert_true(element.selectionDirection === "none" || element.selectionDirection === "forward", + "selectionDirection must be set to either none or forward"); + observedResetSelectionDirection = element.selectionDirection; + } else { + assert_equals(element.selectionDirection, observedResetSelectionDirection, + `selectionDirection must be reset to ${observedResetSelectionDirection} (which was previously observed to be ` + + `the value after resetting the selection direction)`); + } +} + +runTest("input out of document", () => { + const input = document.createElement("input"); + input.value = "hello"; + return input; +}); + +runTest("input in document", () => { + return document.querySelector("#i1"); +}); + +runTest("input in document, with focus", () => { + const input = document.querySelector("#i1"); + input.value = "hello"; + input.focus(); + return input; +}); + +runTest("textarea out of document", () => { + const textarea = document.createElement("textarea"); + textarea.value = "hello"; + return textarea; +}); + +runTest("textarea in document", () => { + return document.querySelector("#t1"); +}); + +runTest("textarea in document, with focus", () => { + const textarea = document.querySelector("#t1"); + textarea.value = "hello"; + textarea.focus(); + return textarea; +}); + +function runTest(descriptor, elementFactory) { + test(() => { + const element = elementFactory(); + element.setSelectionRange(1, 3, "backward"); + + assert_equals(element.selectionStart, 1, "Sanity check: selectionStart was set correctly"); + assert_equals(element.selectionEnd, 3, "Sanity check: selectionEnd was set correctly"); + assert_equals(element.selectionDirection, "backward", "Sanity check: selectionDirection was set correctly"); + + element.value = "hello"; + + assert_equals(element.selectionStart, 1, "selectionStart must not change"); + assert_equals(element.selectionEnd, 3, "selectionEnd must not change"); + assert_equals(element.selectionDirection, "backward", "selectionDirection must not change"); + }, `${descriptor}: selection must not change when setting the same value`); + + test(() => { + const element = elementFactory(); + element.setSelectionRange(1, 3, "backward"); + + assert_equals(element.selectionStart, 1, "Sanity check: selectionStart was set correctly"); + assert_equals(element.selectionEnd, 3, "Sanity check: selectionEnd was set correctly"); + assert_equals(element.selectionDirection, "backward", "Sanity check: selectionDirection was set correctly"); + + element.value = "hello2"; + + assert_equals(element.selectionStart, element.value.length, "selectionStart must be reset to the end"); + assert_equals(element.selectionEnd, element.value.length, "selectionEnd must be reset to the end"); + assertSelectionDirectionIsReset(element); + }, `${descriptor}: selection must change when setting a different value`); +} + +test(() => { + const textarea = document.querySelector("#t1"); + textarea.value = "hell\no"; + textarea.setSelectionRange(1, 3, "backward"); + + assert_equals(textarea.selectionStart, 1, "Sanity check: selectionStart was set correctly"); + assert_equals(textarea.selectionEnd, 3, "Sanity check: selectionEnd was set correctly"); + assert_equals(textarea.selectionDirection, "backward", "Sanity check: selectionDirection was set correctly"); + + textarea.value = "hell\r\no"; + + assert_equals(textarea.selectionStart, 1, "selectionStart must not change when setting to CRLF"); + assert_equals(textarea.selectionEnd, 3, "selectionEnd must not change when setting to CRLF"); + assert_equals(textarea.selectionDirection, "backward", "selectionDirection must not change when setting to CRLF"); + + textarea.value = "hell\ro"; + + assert_equals(textarea.selectionStart, 1, "selectionStart must not change when setting to CR"); + assert_equals(textarea.selectionEnd, 3, "selectionEnd must not change when setting to CR"); + assert_equals(textarea.selectionDirection, "backward", "selectionDirection must not change when setting to CR"); +}, "textarea in document: selection must not change when setting the same normalized value"); + </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/testharness.js b/third_party/WebKit/LayoutTests/external/wpt/resources/testharness.js index 1a313aab..006d715d 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/resources/testharness.js +++ b/third_party/WebKit/LayoutTests/external/wpt/resources/testharness.js
@@ -1980,6 +1980,7 @@ } } else if (is_shared_worker(worker)) { message_port = worker.port; + message_port.start(); } else { message_port = worker; }
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/readable-streams/floating-point-total-queue-size.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/readable-streams/floating-point-total-queue-size.sharedworker-expected.txt new file mode 100644 index 0000000..41e78c1b --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/streams/readable-streams/floating-point-total-queue-size.sharedworker-expected.txt
@@ -0,0 +1,7 @@ +This is a testharness.js-based test. +FAIL Floating point arithmetic must manifest near NUMBER.MAX_SAFE_INTEGER (total ends up positive) assert_equals: [[queueTotalSize]] must clamp to 0 if it becomes negative expected 0 but got 1 +FAIL Floating point arithmetic must manifest near 0 (total ends up positive, but clamped) assert_equals: [[queueTotalSize]] must clamp to 0 if it becomes negative expected 0 but got 1.1102230246251565e-16 +PASS Floating point arithmetic must manifest near 0 (total ends up positive, and not clamped) +PASS Floating point arithmetic must manifest near 0 (total ends up zero) +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/aborting.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/aborting.sharedworker-expected.txt new file mode 100644 index 0000000..fd7a2e2 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/aborting.sharedworker-expected.txt
@@ -0,0 +1,52 @@ +This is a testharness.js-based test. +Harness Error. harness_status.status = 1 , harness_status.message = error2 +PASS Aborting a WritableStream before it starts should cause the writer's unsettled ready promise to reject +PASS Aborting a WritableStream should cause the writer's fulfilled ready promise to reset to a rejected one +PASS abort() on a released writer rejects +PASS Aborting a WritableStream immediately prevents future writes +PASS Aborting a WritableStream prevents further writes after any that are in progress +PASS Fulfillment value of ws.abort() call must be undefined even if the underlying sink returns a non-undefined value +PASS WritableStream if sink's abort throws, the promise returned by writer.abort() rejects +PASS WritableStream if sink's abort throws, the promise returned by ws.abort() rejects +PASS WritableStream if sink's abort throws, for an abort performed during a write, the promise returned by ws.abort() rejects +PASS Aborting a WritableStream passes through the given reason +PASS Aborting a WritableStream puts it in an errored state, with a TypeError as the stored error +PASS Aborting a WritableStream causes any outstanding write() promises to be rejected with a TypeError +PASS Closing but then immediately aborting a WritableStream causes the stream to error +PASS Closing a WritableStream and aborting it while it closes causes the stream to ignore the abort attempt +PASS Aborting a WritableStream after it is closed is a no-op +PASS WritableStream should NOT call underlying sink's close if no abort is supplied (historical) +PASS returning a thenable from abort() should work +PASS .closed should not resolve before fulfilled write() +FAIL .closed should not resolve before rejected write(); write() error should not overwrite abort() error promise_test: Unhandled rejection with value: object "error1: error1" +PASS writes should be satisfied in order when aborting +FAIL writes should be satisfied in order after rejected write when aborting promise_test: Unhandled rejection with value: object "error1: error1" +FAIL close() should reject with TypeError when abort() is first error promise_test: Unhandled rejection with value: object "error1: error1" +PASS underlying abort() should not be called until underlying write() completes +PASS underlying abort() should not be called if underlying close() has started +PASS if underlying close() has started and then rejects, the abort() and close() promises should reject with the underlying close rejection reason +PASS an abort() that happens during a write() should trigger the underlying abort() even with a close() queued +PASS if a writer is created for a stream with a pending abort, its ready should be rejected with a TypeError +PASS writer close() promise should resolve before abort() promise +PASS writer.ready should reject on controller error without waiting for underlying write +FAIL writer.abort() while there is an in-flight write, and then finish the write with rejection promise_test: Unhandled rejection with value: object "error2: error2" +FAIL writer.abort(), controller.error() while there is an in-flight write, and then finish the write assert_throws: writePromise3 must reject with an error indicating abort function "function () { throw e }" threw object "error2: error2" ("error2") expected object "TypeError" ("TypeError") +FAIL writer.abort(), controller.error() while there is an in-flight close, and then finish the close promise_test: Unhandled rejection with value: object "error2: error2" +FAIL controller.error(), writer.abort() while there is an in-flight write, and then finish the write assert_array_equals: writePromise and writer.closed must not be fulfilled/rejected yet even after writer.abort() lengths differ, expected 0 got 1 +FAIL controller.error(), writer.abort() while there is an in-flight close, and then finish the close promise_test: Unhandled rejection with value: object "error2: error2" +PASS releaseLock() while aborting should reject the original closed promise +FAIL releaseLock() during delayed async abort() should reject the writer.closed promise assert_equals: closed promise should not have changed expected object "[object Promise]" but got object "[object Promise]" +PASS sink abort() should not be called until sink start() is done +FAIL if start attempts to error the controller after abort() has been called, then it should lose promise_test: Unhandled rejection with value: object "error1: error1" +FAIL stream abort() promise should still resolve if sink start() rejects promise_test: Unhandled rejection with value: object "error1: error1" +PASS writer abort() during sink start() should replace the writer.ready promise synchronously +FAIL promises returned from other writer methods should be rejected when writer abort() happens during sink start() assert_array_equals: promises should resolve in the standard order property 1, expected "write1" but got "close" +FAIL abort() should succeed despite rejection from write promise_test: Unhandled rejection with value: object "error1: error1" +FAIL abort() should be rejected with the rejection returned from close() assert_throws: abort() should reject with error2 function "function () { throw e }" threw object "error1: error1" ("error1") expected object "error2: error2" ("error2") +FAIL a rejecting sink.write() should not prevent sink.abort() from being called promise_test: Unhandled rejection with value: object "error1: error1" +FAIL when start errors after stream abort(), underlying sink abort() should be called anyway promise_test: Unhandled rejection with value: object "error1: error1" +PASS when calling abort() twice on the same stream, the second call should reject +PASS sink abort() should not be called if stream was erroring due to controller.error() before abort() was called +PASS sink abort() should not be called if stream was erroring due to bad strategy before abort() was called +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/close.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/close.sharedworker-expected.txt new file mode 100644 index 0000000..400571fc --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/close.sharedworker-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +PASS fulfillment value of ws.close() call must be undefined even if the underlying sink returns a non-undefined value +FAIL when sink calls error asynchronously while sink close is in-flight, the stream should not become errored promise_test: Unhandled rejection with value: object "error1: error1" +FAIL when sink calls error synchronously while closing, the stream should not become errored promise_test: Unhandled rejection with value: object "Error: error me" +PASS when the sink throws during close, and the close is requested while a write is still in-flight, the stream should become errored during the close +PASS releaseLock on a stream with a pending write in which the stream has been errored +PASS releaseLock on a stream with a pending close in which controller.error() was called +PASS when close is called on a WritableStream in writable state, ready should return a fulfilled promise +PASS when close is called on a WritableStream in waiting state, ready promise should be fulfilled +PASS when close is called on a WritableStream in waiting state, ready should be fulfilled immediately even if close takes a long time +PASS returning a thenable from close() should work +PASS releaseLock() should not change the result of sync close() +PASS releaseLock() should not change the result of async close() +PASS close() should set state to CLOSED even if writer has detached +PASS the promise returned by async abort during close should resolve +PASS promises must fulfill/reject in the expected order on closure +FAIL promises must fulfill/reject in the expected order on aborted closure assert_array_equals: promises must fulfill/reject in the expected order property 1, expected "abortPromise" but got "closed" +FAIL promises must fulfill/reject in the expected order on aborted and errored closure assert_throws: writer.closed must reject with a TypeError indicating the stream was aborted function "function () { throw e }" threw object "error1: error1" ("error1") expected object "TypeError" ("TypeError") +FAIL close() should not reject until no sink methods are in flight assert_false: expected false got true +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor.sharedworker-expected.txt new file mode 100644 index 0000000..1998efd --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor.sharedworker-expected.txt
@@ -0,0 +1,15 @@ +This is a testharness.js-based test. +PASS controller argument should be passed to start method +PASS controller argument should be passed to write method +FAIL controller argument should not be passed to close method assert_array_equals: no arguments should be passed to close lengths differ, expected 0 got 1 +PASS highWaterMark should be reflected to desiredSize +PASS WritableStream should be writable and ready should fulfill immediately if the strategy does not apply backpressure +PASS WritableStream should be constructible with no arguments +PASS WritableStream instances should have standard methods and properties +PASS private constructors should not be exported +PASS WritableStreamDefaultController constructor should throw unless passed a WritableStream +PASS WritableStreamDefaultController constructor should throw when passed an initialised WritableStream +PASS WritableStreamDefaultWriter should throw unless passed a WritableStream +PASS WritableStreamDefaultWriter constructor should throw when stream argument is locked +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/error.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/error.sharedworker-expected.txt new file mode 100644 index 0000000..e3bb1267 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/error.sharedworker-expected.txt
@@ -0,0 +1,8 @@ +This is a testharness.js-based test. +PASS controller.error() should error the stream +PASS controller.error() on erroring stream should not throw +FAIL surplus calls to controller.error() should be a no-op Cannot error a errored writable stream +FAIL controller.error() on errored stream should not throw promise_test: Unhandled rejection with value: object "TypeError: Cannot error a errored writable stream" +FAIL controller.error() on closed stream should not throw promise_test: Unhandled rejection with value: object "TypeError: Cannot error a closed writable stream" +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/properties.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/properties.sharedworker-expected.txt new file mode 100644 index 0000000..6fe9cca --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/properties.sharedworker-expected.txt
@@ -0,0 +1,47 @@ +This is a testharness.js-based test. +PASS WritableStreamDefaultController should not be exported on the global object +PASS WritableStreamDefaultWriter should not be exported on the global object +PASS WritableStream.prototype.constructor should have standard properties +PASS WritableStream.prototype.constructor should be a constructor +PASS WritableStream.prototype.locked should have standard properties +PASS WritableStream.prototype.locked should be a getter +PASS WritableStream.prototype.abort should have standard properties +PASS WritableStream.prototype.abort should be a method +PASS WritableStream.prototype.getWriter should have standard properties +PASS WritableStream.prototype.getWriter should be a method +PASS WritableStream.prototype should have exactly the expected properties +PASS WritableStreamDefaultController.prototype.constructor should have standard properties +PASS WritableStreamDefaultController.prototype.constructor should be a constructor +PASS WritableStreamDefaultController.prototype.error should have standard properties +PASS WritableStreamDefaultController.prototype.error should be a method +PASS WritableStreamDefaultController.prototype should have exactly the expected properties +PASS WritableStreamDefaultWriter.prototype.constructor should have standard properties +PASS WritableStreamDefaultWriter.prototype.constructor should be a constructor +PASS WritableStreamDefaultWriter.prototype.closed should have standard properties +PASS WritableStreamDefaultWriter.prototype.closed should be a getter +PASS WritableStreamDefaultWriter.prototype.desiredSize should have standard properties +PASS WritableStreamDefaultWriter.prototype.desiredSize should be a getter +PASS WritableStreamDefaultWriter.prototype.ready should have standard properties +PASS WritableStreamDefaultWriter.prototype.ready should be a getter +PASS WritableStreamDefaultWriter.prototype.abort should have standard properties +PASS WritableStreamDefaultWriter.prototype.abort should be a method +PASS WritableStreamDefaultWriter.prototype.close should have standard properties +PASS WritableStreamDefaultWriter.prototype.close should be a method +PASS WritableStreamDefaultWriter.prototype.releaseLock should have standard properties +PASS WritableStreamDefaultWriter.prototype.releaseLock should be a method +PASS WritableStreamDefaultWriter.prototype.write should have standard properties +PASS WritableStreamDefaultWriter.prototype.write should be a method +PASS WritableStreamDefaultWriter.prototype should have exactly the expected properties +PASS sink method start should be called with the right number of arguments +PASS sink method start should be called even when it's located on the prototype chain +PASS sink method write should be called with the right number of arguments +PASS sink method write should be called even when it's located on the prototype chain +PASS unexpected properties should not be accessed when calling sink method write +FAIL sink method close should be called with the right number of arguments assert_equals: close should be called with 0 arguments expected 0 but got 1 +PASS sink method close should be called even when it's located on the prototype chain +PASS unexpected properties should not be accessed when calling sink method close +PASS sink method abort should be called with the right number of arguments +PASS sink method abort should be called even when it's located on the prototype chain +PASS unexpected properties should not be accessed when calling sink method abort +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/fast/dom/custom/svg-use-shadow-tree-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/custom/svg-use-shadow-tree-expected.txt index 44b1be1..ea0d3ce 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/custom/svg-use-shadow-tree-expected.txt +++ b/third_party/WebKit/LayoutTests/fast/dom/custom/svg-use-shadow-tree-expected.txt
@@ -1,7 +1,7 @@ -CONSOLE ERROR: line 2534: Uncaught Error: assert_false: Should not call createdCallback in UA ShadowRoot. expected false got true -CONSOLE ERROR: line 2534: Uncaught Error: assert_false: Should not call attachedCallback in UA ShadowRoot. expected false got true -CONSOLE ERROR: line 2534: Uncaught Error: assert_false: Should not call createdCallback in UA ShadowRoot. expected false got true -CONSOLE ERROR: line 2534: Uncaught Error: assert_false: Should not call attachedCallback in UA ShadowRoot. expected false got true +CONSOLE ERROR: line 2535: Uncaught Error: assert_false: Should not call createdCallback in UA ShadowRoot. expected false got true +CONSOLE ERROR: line 2535: Uncaught Error: assert_false: Should not call attachedCallback in UA ShadowRoot. expected false got true +CONSOLE ERROR: line 2535: Uncaught Error: assert_false: Should not call createdCallback in UA ShadowRoot. expected false got true +CONSOLE ERROR: line 2535: Uncaught Error: assert_false: Should not call attachedCallback in UA ShadowRoot. expected false got true This is a testharness.js-based test. Harness Error. harness_status.status = 1 , harness_status.message = Uncaught Error: assert_false: Should not call attachedCallback in UA ShadowRoot. expected false got true PASS SVG <use> shadow trees should not be exposed through custom elements.
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/persistence/persistence-do-not-bind-dirty-sourcecode.html b/third_party/WebKit/LayoutTests/http/tests/inspector/persistence/persistence-do-not-bind-dirty-sourcecode.html index 3d800090..59aa4d7 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/persistence/persistence-do-not-bind-dirty-sourcecode.html +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/persistence/persistence-do-not-bind-dirty-sourcecode.html
@@ -10,6 +10,7 @@ function test() { + Runtime.experiments.enableForTest('persistence2'); var testMapping = InspectorTest.initializeTestMapping(); var fs = new InspectorTest.TestFileSystem("file:///var/www"); InspectorTest.addFooJSFile(fs);
diff --git a/third_party/WebKit/LayoutTests/http/tests/webaudio/autoplay-crossorigin-expected.txt b/third_party/WebKit/LayoutTests/http/tests/webaudio/autoplay-crossorigin-expected.txt index 2a225ee..d6b55d0 100644 --- a/third_party/WebKit/LayoutTests/http/tests/webaudio/autoplay-crossorigin-expected.txt +++ b/third_party/WebKit/LayoutTests/http/tests/webaudio/autoplay-crossorigin-expected.txt
@@ -1,7 +1,7 @@ CONSOLE WARNING: line 13: An AudioContext in a cross origin iframe must be created or resumed from a user gesture to enable audio output. CONSOLE WARNING: line 23: An AudioContext in a cross origin iframe must be created or resumed from a user gesture to enable audio output. CONSOLE WARNING: line 36: An AudioContext in a cross origin iframe must be created or resumed from a user gesture to enable audio output. -CONSOLE ERROR: line 2534: Uncaught Error: assert_equals: stateAfterClick expected "running" but got "suspended" +CONSOLE ERROR: line 2535: Uncaught Error: assert_equals: stateAfterClick expected "running" but got "suspended" This is a testharness.js-based test. Harness Error. harness_status.status = 1 , harness_status.message = Uncaught Error: assert_equals: stateAfterClick expected "running" but got "suspended" PASS Verify that autoplaying Web Audio from a cross origin iframe is blocked by mediaPlaybackRequiresUserGesture
diff --git a/third_party/WebKit/LayoutTests/inspector/quick-open/command-menu-expected.txt b/third_party/WebKit/LayoutTests/inspector/quick-open/command-menu-expected.txt index 10208fc..812da80 100644 --- a/third_party/WebKit/LayoutTests/inspector/quick-open/command-menu-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/quick-open/command-menu-expected.txt
@@ -10,6 +10,7 @@ Has category: Mobile Has category: Network Has category: Panel +Has category: Settings Has category: Sources Switching to console panel
diff --git a/third_party/WebKit/LayoutTests/resources/testharness.js b/third_party/WebKit/LayoutTests/resources/testharness.js index 1a313aab..006d715d 100644 --- a/third_party/WebKit/LayoutTests/resources/testharness.js +++ b/third_party/WebKit/LayoutTests/resources/testharness.js
@@ -1980,6 +1980,7 @@ } } else if (is_shared_worker(worker)) { message_port = worker.port; + message_port.start(); } else { message_port = worker; }
diff --git a/third_party/WebKit/Source/core/dom/AncestorList.h b/third_party/WebKit/Source/core/dom/AncestorList.h new file mode 100644 index 0000000..1eb020e --- /dev/null +++ b/third_party/WebKit/Source/core/dom/AncestorList.h
@@ -0,0 +1,22 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef AncestorList_h +#define AncestorList_h + +#include "platform/weborigin/KURL.h" +#include "platform/weborigin/KURLHash.h" +#include "platform/wtf/HashSet.h" + +namespace blink { + +// Maps to "ancestor list" concept referenced in multiple module script +// algorithms. +// Example: +// https://html.spec.whatwg.org/#internal-module-script-graph-fetching-procedure +using AncestorList = HashSet<KURL>; + +} // namespace blink + +#endif
diff --git a/third_party/WebKit/Source/core/dom/BUILD.gn b/third_party/WebKit/Source/core/dom/BUILD.gn index 496dab61..01139383 100644 --- a/third_party/WebKit/Source/core/dom/BUILD.gn +++ b/third_party/WebKit/Source/core/dom/BUILD.gn
@@ -12,6 +12,7 @@ "AXObjectCache.h", "AccessibleNode.cpp", "AccessibleNode.h", + "AncestorList.h", "AnimationWorkletProxyClient.h", "Attr.cpp", "Attr.h",
diff --git a/third_party/WebKit/Source/core/dom/Modulator.h b/third_party/WebKit/Source/core/dom/Modulator.h index f6f34ec..e3a00c5 100644 --- a/third_party/WebKit/Source/core/dom/Modulator.h +++ b/third_party/WebKit/Source/core/dom/Modulator.h
@@ -8,6 +8,7 @@ #include "bindings/core/v8/ScriptWrappable.h" #include "bindings/core/v8/V8PerContextData.h" #include "core/CoreExport.h" +#include "core/dom/AncestorList.h" #include "platform/heap/Handle.h" #include "platform/loader/fetch/AccessControlStatus.h" #include "platform/weborigin/KURL.h" @@ -29,11 +30,18 @@ // A SingleModuleClient is notified when single module script node (node as in a // module tree graph) load is complete and its corresponding entry is created in // module map. -class SingleModuleClient : public GarbageCollectedMixin { +class CORE_EXPORT SingleModuleClient : public GarbageCollectedMixin { public: virtual void NotifyModuleLoadFinished(ModuleScript*) = 0; }; +// A ModuleTreeClient is notified when a module script and its whole descendent +// tree load is complete. +class CORE_EXPORT ModuleTreeClient : public GarbageCollectedMixin { + public: + virtual void NotifyModuleTreeLoadFinished(ModuleScript*) = 0; +}; + // spec: "top-level module fetch flag" // https://html.spec.whatwg.org/multipage/webappapis.html#fetching-scripts-is-top-level enum class ModuleGraphLevel { kTopLevelModuleFetch, kDependentModuleFetch }; @@ -62,6 +70,23 @@ virtual ReferrerPolicy GetReferrerPolicy() = 0; virtual SecurityOrigin* GetSecurityOrigin() = 0; + // https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-module-script-tree + virtual void FetchTree(const ModuleScriptFetchRequest&, + ModuleTreeClient*) = 0; + + // https://html.spec.whatwg.org/#internal-module-script-graph-fetching-procedure + virtual void FetchTreeInternal(const ModuleScriptFetchRequest&, + const AncestorList&, + ModuleGraphLevel, + ModuleTreeClient*) = 0; + + // Asynchronously retrieve a module script from the module map, or fetch it + // and put it in the map if it's not there already. + // https://html.spec.whatwg.org/#fetch-a-single-module-script + virtual void FetchSingle(const ModuleScriptFetchRequest&, + ModuleGraphLevel, + SingleModuleClient*) = 0; + // Synchronously retrieves a single module script from existing module map // entry. virtual ModuleScript* GetFetchedModuleScript(const KURL&) = 0;
diff --git a/third_party/WebKit/Source/core/frame/BUILD.gn b/third_party/WebKit/Source/core/frame/BUILD.gn index c723c11..4156f57d 100644 --- a/third_party/WebKit/Source/core/frame/BUILD.gn +++ b/third_party/WebKit/Source/core/frame/BUILD.gn
@@ -41,6 +41,7 @@ "FrameConsole.h", "FrameLifecycle.cpp", "FrameLifecycle.h", + "FrameOrPlugin.h", "FrameOwner.h", "FrameSerializer.cpp", "FrameSerializer.h",
diff --git a/third_party/WebKit/Source/core/frame/FrameOrPlugin.h b/third_party/WebKit/Source/core/frame/FrameOrPlugin.h new file mode 100644 index 0000000..426cd53 --- /dev/null +++ b/third_party/WebKit/Source/core/frame/FrameOrPlugin.h
@@ -0,0 +1,32 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef FrameOrPlugin_h +#define FrameOrPlugin_h + +#include "core/CoreExport.h" +#include "platform/heap/Handle.h" + +namespace blink { + +class CullRect; +class GraphicsContext; +class IntRect; + +// FrameOrPlugin is a pure virtual class which is implemented by FrameView, +// RemoteFrameView, and PluginView. +class CORE_EXPORT FrameOrPlugin : public GarbageCollectedMixin { + public: + virtual ~FrameOrPlugin() {} + + virtual void SetFrameRect(const IntRect&) = 0; + virtual const IntRect& FrameRect() const = 0; + virtual void Paint(GraphicsContext&, const CullRect&) const = 0; + virtual void Show() = 0; + virtual void Hide() = 0; + virtual void Dispose() = 0; +}; + +} // namespace blink +#endif // FrameOrPlugin_h
diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp index f0ebc36..89193ab 100644 --- a/third_party/WebKit/Source/core/frame/FrameView.cpp +++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
@@ -1505,9 +1505,8 @@ if (GetLayoutViewItem().IsNull()) break; - if (FrameViewBase* frame_view_base = part->PluginOrFrame()) { - if (frame_view_base->IsFrameView()) { - FrameView* frame_view = ToFrameView(frame_view_base); + if (part->GetFrameOrPlugin()) { + if (FrameView* frame_view = part->ChildFrameView()) { bool did_need_layout = frame_view->NeedsLayout(); part->UpdateGeometry(); if (!did_need_layout && !frame_view->ShouldThrottleRendering()) @@ -4767,8 +4766,6 @@ plugin->SetParentVisible(true); } } - - FrameViewBase::Show(); } void FrameView::Hide() { @@ -4794,8 +4791,6 @@ SetNeedsPaintPropertyUpdate(); } } - - FrameViewBase::Hide(); } int FrameView::ViewportWidth() const {
diff --git a/third_party/WebKit/Source/core/frame/FrameView.h b/third_party/WebKit/Source/core/frame/FrameView.h index 53df8155..6ee56bb0 100644 --- a/third_party/WebKit/Source/core/frame/FrameView.h +++ b/third_party/WebKit/Source/core/frame/FrameView.h
@@ -29,6 +29,7 @@ #include <memory> #include "core/CoreExport.h" #include "core/dom/DocumentLifecycle.h" +#include "core/frame/FrameOrPlugin.h" #include "core/frame/FrameViewAutoSizeInfo.h" #include "core/frame/LayoutSubtreeRootList.h" #include "core/frame/RootFrameViewport.h" @@ -71,6 +72,7 @@ class ElementVisibilityObserver; class Frame; class FloatSize; +class IntRect; class JSONArray; class JSONObject; class LayoutItem; @@ -101,6 +103,7 @@ class CORE_EXPORT FrameView final : public FrameViewBase, + public FrameOrPlugin, public PaintInvalidationCapableScrollableArea { USING_GARBAGE_COLLECTED_MIXIN(FrameView); @@ -114,8 +117,12 @@ ~FrameView() override; - void InvalidateRect(const IntRect&) override; + void Invalidate() { InvalidateRect(IntRect(0, 0, Width(), Height())); } + void InvalidateRect(const IntRect&); void SetFrameRect(const IntRect&) override; + const IntRect& FrameRect() const override { + return FrameViewBase::FrameRect(); + } LocalFrame& GetFrame() const { ASSERT(frame_);
diff --git a/third_party/WebKit/Source/core/frame/RemoteFrameView.cpp b/third_party/WebKit/Source/core/frame/RemoteFrameView.cpp index 5255fd0..dd78431 100644 --- a/third_party/WebKit/Source/core/frame/RemoteFrameView.cpp +++ b/third_party/WebKit/Source/core/frame/RemoteFrameView.cpp
@@ -115,16 +115,12 @@ void RemoteFrameView::Hide() { SetSelfVisible(false); - FrameViewBase::Hide(); - remote_frame_->Client()->VisibilityChanged(false); } void RemoteFrameView::Show() { SetSelfVisible(true); - FrameViewBase::Show(); - remote_frame_->Client()->VisibilityChanged(true); }
diff --git a/third_party/WebKit/Source/core/frame/RemoteFrameView.h b/third_party/WebKit/Source/core/frame/RemoteFrameView.h index 3a1f93d5..886ec9a3 100644 --- a/third_party/WebKit/Source/core/frame/RemoteFrameView.h +++ b/third_party/WebKit/Source/core/frame/RemoteFrameView.h
@@ -5,15 +5,20 @@ #ifndef RemoteFrameView_h #define RemoteFrameView_h +#include "core/frame/FrameOrPlugin.h" #include "platform/FrameViewBase.h" #include "platform/geometry/IntRect.h" #include "platform/heap/Handle.h" namespace blink { +class CullRect; +class GraphicsContext; class RemoteFrame; -class RemoteFrameView final : public FrameViewBase { +class RemoteFrameView final : public FrameViewBase, public FrameOrPlugin { + USING_GARBAGE_COLLECTED_MIXIN(RemoteFrameView); + public: static RemoteFrameView* Create(RemoteFrame*); @@ -30,8 +35,12 @@ void Dispose() override; // Override to notify remote frame that its viewport size has changed. void FrameRectsChanged() override; - void InvalidateRect(const IntRect&) override; + void InvalidateRect(const IntRect&); void SetFrameRect(const IntRect&) override; + const IntRect& FrameRect() const override { + return FrameViewBase::FrameRect(); + } + void Paint(GraphicsContext&, const CullRect&) const override {} void Hide() override; void Show() override; void SetParentVisible(bool) override;
diff --git a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp index 90d7742..f7cde74 100644 --- a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.cpp
@@ -34,6 +34,7 @@ #include "core/loader/FrameLoader.h" #include "core/page/Page.h" #include "core/plugins/PluginView.h" +#include "platform/heap/HeapAllocator.h" #include "platform/weborigin/SecurityOrigin.h" namespace blink { @@ -54,9 +55,10 @@ return set; } -static FrameViewBaseSet& WidgetsPendingDispose() { - DEFINE_STATIC_LOCAL(FrameViewBaseSet, set, (new FrameViewBaseSet)); - return set; +using FrameOrPluginList = HeapVector<Member<FrameOrPlugin>>; +static FrameOrPluginList& FrameOrPluginsPendingDispose() { + DEFINE_STATIC_LOCAL(FrameOrPluginList, list, (new FrameOrPluginList)); + return list; } SubframeLoadingDisabler::SubtreeRootSet& @@ -100,10 +102,10 @@ } { - FrameViewBaseSet set; - WidgetsPendingDispose().Swap(set); - for (const auto& frame_view_base : set) { - frame_view_base->Dispose(); + FrameOrPluginList list; + FrameOrPluginsPendingDispose().Swap(list); + for (const auto& frame_or_plugin : list) { + frame_or_plugin->Dispose(); } } } @@ -115,7 +117,7 @@ --g_update_suspend_count; } -// Unlike moveWidgetToParentSoon, this will not call dispose the Widget. +// Unlike moveWidgetToParentSoon, this will not call dispose. void TemporarilyRemoveWidgetFromParentSoon(FrameViewBase* frame_view_base) { if (g_update_suspend_count) { WidgetsPendingTemporaryRemovalFromParent().insert(frame_view_base); @@ -215,12 +217,13 @@ return content_frame_ && HTMLElement::IsKeyboardFocusable(); } -void HTMLFrameOwnerElement::DisposeWidgetSoon(FrameViewBase* frame_view_base) { +void HTMLFrameOwnerElement::DisposeFrameOrPluginSoon( + FrameOrPlugin* frame_or_plugin) { if (g_update_suspend_count) { - WidgetsPendingDispose().insert(frame_view_base); + FrameOrPluginsPendingDispose().push_back(frame_or_plugin); return; } - frame_view_base->Dispose(); + frame_or_plugin->Dispose(); } void HTMLFrameOwnerElement::FrameOwnerPropertiesChanged() {
diff --git a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.h b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.h index 2bda3b5..2cd3ff21 100644 --- a/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.h +++ b/third_party/WebKit/Source/core/html/HTMLFrameOwnerElement.h
@@ -34,6 +34,7 @@ class ExceptionState; class Frame; +class FrameOrPlugin; class FrameViewBase; class LayoutPart; @@ -105,7 +106,7 @@ bool replace_current_item); bool IsKeyboardFocusable() const override; - void DisposeWidgetSoon(FrameViewBase*); + void DisposeFrameOrPluginSoon(FrameOrPlugin*); void FrameOwnerPropertiesChanged(); private:
diff --git a/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp b/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp index 43fe90a..3665ea9f 100644 --- a/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLPlugInElement.cpp
@@ -104,7 +104,7 @@ // Remove and dispose the old plugin if we had one. if (plugin_) { GetDocument().View()->RemovePlugin(plugin_); - DisposeWidgetSoon(plugin_); + DisposeFrameOrPluginSoon(plugin_); } plugin_ = plugin; @@ -150,7 +150,7 @@ return; if (persisted_plugin_) { persisted_plugin_->Hide(); - DisposeWidgetSoon(persisted_plugin_.Release()); + DisposeFrameOrPluginSoon(persisted_plugin_.Release()); } persisted_plugin_ = plugin; }
diff --git a/third_party/WebKit/Source/core/layout/LayoutEmbeddedObject.cpp b/third_party/WebKit/Source/core/layout/LayoutEmbeddedObject.cpp index e19d346..54cc890 100644 --- a/third_party/WebKit/Source/core/layout/LayoutEmbeddedObject.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutEmbeddedObject.cpp
@@ -138,8 +138,7 @@ UpdateLayerTransformAfterLayout(); - FrameViewBase* frame_view_base = this->PluginOrFrame(); - if (!frame_view_base && GetFrameView()) + if (!GetFrameOrPlugin() && GetFrameView()) GetFrameView()->AddPartToUpdate(*this); ClearNeedsLayout();
diff --git a/third_party/WebKit/Source/core/layout/LayoutPart.cpp b/third_party/WebKit/Source/core/layout/LayoutPart.cpp index 4beb5b0..5d63160 100644 --- a/third_party/WebKit/Source/core/layout/LayoutPart.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutPart.cpp
@@ -25,8 +25,10 @@ #include "core/layout/LayoutPart.h" #include "core/dom/AXObjectCache.h" +#include "core/frame/FrameOrPlugin.h" #include "core/frame/FrameView.h" #include "core/frame/LocalFrame.h" +#include "core/frame/RemoteFrameView.h" #include "core/html/HTMLFrameElementBase.h" #include "core/html/HTMLPlugInElement.h" #include "core/layout/HitTestResult.h" @@ -108,14 +110,21 @@ : nullptr; } -FrameViewBase* LayoutPart::PluginOrFrame() const { - FrameViewBase* result = nullptr; +FrameOrPlugin* LayoutPart::GetFrameOrPlugin() const { Node* node = GetNode(); - if (node && node->IsFrameOwnerElement()) - result = ToHTMLFrameOwnerElement(node)->OwnedWidget(); - if (!result) - result = Plugin(); - return result; + if (node && node->IsFrameOwnerElement()) { + FrameViewBase* frame_view_base = + ToHTMLFrameOwnerElement(node)->OwnedWidget(); + if (frame_view_base) { + if (frame_view_base->IsFrameView()) + return ToFrameView(frame_view_base); + if (frame_view_base->IsRemoteFrameView()) + return ToRemoteFrameView(frame_view_base); + // Must be either FrameView or RemoteFrameView. + NOTREACHED(); + } + } + return Plugin(); } PaintLayerType LayoutPart::LayerTypeRequired() const { @@ -259,18 +268,18 @@ void LayoutPart::StyleDidChange(StyleDifference diff, const ComputedStyle* old_style) { LayoutReplaced::StyleDidChange(diff, old_style); - FrameViewBase* frame_view_base = this->PluginOrFrame(); - if (!frame_view_base) + FrameOrPlugin* frame_or_plugin = GetFrameOrPlugin(); + if (!frame_or_plugin) return; // If the iframe has custom scrollbars, recalculate their style. - if (frame_view_base->IsFrameView()) - ToFrameView(frame_view_base)->RecalculateCustomScrollbarStyle(); + if (FrameView* frame_view = ChildFrameView()) + frame_view->RecalculateCustomScrollbarStyle(); if (Style()->Visibility() != EVisibility::kVisible) { - frame_view_base->Hide(); + frame_or_plugin->Hide(); } else { - frame_view_base->Show(); + frame_or_plugin->Show(); } } @@ -312,20 +321,20 @@ } void LayoutPart::UpdateOnWidgetChange() { - FrameViewBase* frame_view_base = this->PluginOrFrame(); - if (!frame_view_base) + FrameOrPlugin* frame_or_plugin = GetFrameOrPlugin(); + if (!frame_or_plugin) return; if (!Style()) return; if (!NeedsLayout()) - UpdateGeometryInternal(*frame_view_base); + UpdateGeometryInternal(*frame_or_plugin); if (Style()->Visibility() != EVisibility::kVisible) { - frame_view_base->Hide(); + frame_or_plugin->Hide(); } else { - frame_view_base->Show(); + frame_or_plugin->Show(); // FIXME: Why do we issue a full paint invalidation in this case, but not // the other? SetShouldDoFullPaintInvalidation(); @@ -333,40 +342,38 @@ } void LayoutPart::UpdateGeometry() { - FrameViewBase* frame_view_base = this->PluginOrFrame(); - if (!frame_view_base || - !GetNode()) // Check the node in case destroy() has been called. + FrameOrPlugin* frame_or_plugin = GetFrameOrPlugin(); + if (!frame_or_plugin) return; LayoutRect new_frame = ReplacedContentRect(); DCHECK(new_frame.Size() == RoundedIntSize(new_frame.Size())); bool bounds_will_change = - LayoutSize(frame_view_base->FrameRect().Size()) != new_frame.Size(); - - FrameView* frame_view = - frame_view_base->IsFrameView() ? ToFrameView(frame_view_base) : nullptr; + LayoutSize(frame_or_plugin->FrameRect().Size()) != new_frame.Size(); // If frame bounds are changing mark the view for layout. Also check the // frame's page to make sure that the frame isn't in the process of being // destroyed. If iframe scrollbars needs reconstruction from native to custom // scrollbar, then also we need to layout the frameview. + FrameView* frame_view = ChildFrameView(); if (frame_view && frame_view->GetFrame().GetPage() && (bounds_will_change || frame_view->NeedsScrollbarReconstruction())) frame_view->SetNeedsLayout(); - UpdateGeometryInternal(*frame_view_base); + UpdateGeometryInternal(*frame_or_plugin); // If view needs layout, either because bounds have changed or possibly // indicating content size is wrong, we have to do a layout to set the right - // FrameViewBase size. + // FrameView size. if (frame_view && frame_view->NeedsLayout() && frame_view->GetFrame().GetPage()) frame_view->UpdateLayout(); - frame_view_base->GeometryMayHaveChanged(); + if (PluginView* plugin = Plugin()) + plugin->GeometryMayHaveChanged(); } -void LayoutPart::UpdateGeometryInternal(FrameViewBase& frame_view_base) { +void LayoutPart::UpdateGeometryInternal(FrameOrPlugin& frame_or_plugin) { // Ignore transform here, as we only care about the sub-pixel accumulation. // TODO(trchen): What about multicol? Need a LayoutBox function to query // sub-pixel accumulation. @@ -378,7 +385,7 @@ PixelSnappedIntRect(absolute_replaced_rect).Size()); // Normally the location of the frame rect is ignored by the painter, but // currently it is still used by a family of coordinate conversion function in - // FrameViewBase/FrameView. This is incorrect because coordinate conversion + // FrameView. This is incorrect because coordinate conversion // needs to take transform and into account. A few callers still use the // family of conversion function, including but not exhaustive: // FrameView::updateViewportIntersectionIfNeeded() @@ -391,7 +398,7 @@ // Why is the protector needed? RefPtr<LayoutPart> protector(this); - frame_view_base.SetFrameRect(frame_rect); + frame_or_plugin.SetFrameRect(frame_rect); } void LayoutPart::InvalidatePaintOfSubtreesIfNeeded(
diff --git a/third_party/WebKit/Source/core/layout/LayoutPart.h b/third_party/WebKit/Source/core/layout/LayoutPart.h index 0a42bcde..f34be6d 100644 --- a/third_party/WebKit/Source/core/layout/LayoutPart.h +++ b/third_party/WebKit/Source/core/layout/LayoutPart.h
@@ -25,11 +25,12 @@ #include "core/CoreExport.h" #include "core/layout/LayoutReplaced.h" -#include "core/plugins/PluginView.h" -#include "platform/FrameViewBase.h" namespace blink { +class FrameOrPlugin; +class PluginView; + // LayoutObject for frames via LayoutFrame and LayoutIFrame, and plugins via // LayoutEmbeddedObject. class CORE_EXPORT LayoutPart : public LayoutReplaced { @@ -55,7 +56,7 @@ // the FrameView associated with the root Document Frame. FrameView* ChildFrameView() const; PluginView* Plugin() const; - FrameViewBase* PluginOrFrame() const; + FrameOrPlugin* GetFrameOrPlugin() const; LayoutRect ReplacedContentRect() const final; @@ -80,7 +81,7 @@ const PaintInvalidationState&) override; private: - void UpdateGeometryInternal(FrameViewBase&); + void UpdateGeometryInternal(FrameOrPlugin&); CompositingReasons AdditionalCompositingReasons() const override; void WillBeDestroyed() final;
diff --git a/third_party/WebKit/Source/core/paint/PartPainter.cpp b/third_party/WebKit/Source/core/paint/PartPainter.cpp index 3f0cb335..5ecacd1 100644 --- a/third_party/WebKit/Source/core/paint/PartPainter.cpp +++ b/third_party/WebKit/Source/core/paint/PartPainter.cpp
@@ -4,6 +4,7 @@ #include "core/paint/PartPainter.h" +#include "core/frame/FrameOrPlugin.h" #include "core/layout/LayoutPart.h" #include "core/paint/BoxPainter.h" #include "core/paint/LayoutObjectDrawingRecorder.h" @@ -69,7 +70,7 @@ if (paint_info.phase != kPaintPhaseForeground) return; - if (layout_part_.PluginOrFrame()) { + if (layout_part_.GetFrameOrPlugin()) { // TODO(schenney) crbug.com/93805 Speculative release assert to verify that // the crashes we see in FrameViewBase painting are due to a destroyed // LayoutPart object. @@ -119,25 +120,24 @@ const LayoutPoint& paint_offset) { LayoutPoint adjusted_paint_offset = paint_offset + layout_part_.Location(); - FrameViewBase* frame_view_base = layout_part_.PluginOrFrame(); - CHECK(frame_view_base); + FrameOrPlugin* frame_or_plugin = layout_part_.GetFrameOrPlugin(); + CHECK(frame_or_plugin); IntPoint paint_location(RoundedIntPoint( adjusted_paint_offset + layout_part_.ReplacedContentRect().Location())); - // FrameViewBases don't support painting with a paint offset, but instead - // offset themselves using the frame rect location. To paint FrameViewBases at + // Views don't support painting with a paint offset, but instead + // offset themselves using the frame rect location. To paint Views at // our desired location, we need to apply paint offset as a transform, with // the frame rect neutralized. - IntSize frame_view_base_paint_offset = - paint_location - frame_view_base->FrameRect().Location(); + IntSize view_paint_offset = + paint_location - frame_or_plugin->FrameRect().Location(); TransformRecorder transform( paint_info.context, layout_part_, - AffineTransform::Translation(frame_view_base_paint_offset.Width(), - frame_view_base_paint_offset.Height())); - CullRect adjusted_cull_rect(paint_info.GetCullRect(), - -frame_view_base_paint_offset); - frame_view_base->Paint(paint_info.context, adjusted_cull_rect); + AffineTransform::Translation(view_paint_offset.Width(), + view_paint_offset.Height())); + CullRect adjusted_cull_rect(paint_info.GetCullRect(), -view_paint_offset); + frame_or_plugin->Paint(paint_info.context, adjusted_cull_rect); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/plugins/PluginView.h b/third_party/WebKit/Source/core/plugins/PluginView.h index 5def9f9..e5ee0b3 100644 --- a/third_party/WebKit/Source/core/plugins/PluginView.h +++ b/third_party/WebKit/Source/core/plugins/PluginView.h
@@ -29,24 +29,36 @@ #define PluginView_h #include "core/CoreExport.h" -#include "platform/FrameViewBase.h" +#include "core/frame/FrameOrPlugin.h" +#include "platform/geometry/IntRect.h" #include "platform/scroll/ScrollTypes.h" #include "platform/wtf/text/WTFString.h" #include "public/platform/WebFocusType.h" #include "v8/include/v8.h" namespace blink { -class WebLayer; -} -namespace blink { - +class Event; +class FrameView; class ResourceResponse; +class WebLayer; -class CORE_EXPORT PluginView : public FrameViewBase { +// TODO(joelhockey): Remove this class. +// The only implementation of this class is web/WebPluginContainerImpl. +// It can be used directly. +class CORE_EXPORT PluginView : public FrameOrPlugin { public: - bool IsPluginView() const final { return true; } - virtual void SetFocused(bool, WebFocusType) {} + virtual ~PluginView() {} + + virtual void SetParent(FrameView*) = 0; + virtual FrameView* Parent() const = 0; + virtual void SetParentVisible(bool) = 0; + virtual void SetFocused(bool, WebFocusType) = 0; + virtual void FrameRectsChanged() = 0; + virtual void GeometryMayHaveChanged() = 0; + virtual void HandleEvent(Event*) = 0; + virtual void EventListenersRemoved() = 0; + virtual bool IsPluginContainer() const { return false; } virtual WebLayer* PlatformLayer() const { return 0; } virtual v8::Local<v8::Object> ScriptableObject(v8::Isolate*) { @@ -62,17 +74,8 @@ virtual void UpdateAllLifecyclePhases() {} virtual void InvalidatePaintIfNeeded() {} - - protected: - PluginView() : FrameViewBase() {} }; -DEFINE_TYPE_CASTS(PluginView, - FrameViewBase, - frameViewBase, - frameViewBase->IsPluginView(), - frameViewBase.IsPluginView()); - } // namespace blink #endif // PluginView_h
diff --git a/third_party/WebKit/Source/core/style/NinePieceImage.cpp b/third_party/WebKit/Source/core/style/NinePieceImage.cpp index c9bd3de..a185d94 100644 --- a/third_party/WebKit/Source/core/style/NinePieceImage.cpp +++ b/third_party/WebKit/Source/core/style/NinePieceImage.cpp
@@ -69,16 +69,6 @@ Length(0, kFixed), Length(0, kFixed)) {} -NinePieceImageData::NinePieceImageData(const NinePieceImageData& other) - : RefCounted<NinePieceImageData>(), - fill(other.fill), - horizontal_rule(other.horizontal_rule), - vertical_rule(other.vertical_rule), - image(other.image), - image_slices(other.image_slices), - border_slices(other.border_slices), - outset(other.outset) {} - bool NinePieceImageData::operator==(const NinePieceImageData& other) const { return DataEquivalent(image, other.image) && image_slices == other.image_slices && fill == other.fill &&
diff --git a/third_party/WebKit/Source/core/style/NinePieceImage.h b/third_party/WebKit/Source/core/style/NinePieceImage.h index c2ca7819..0e876f3 100644 --- a/third_party/WebKit/Source/core/style/NinePieceImage.h +++ b/third_party/WebKit/Source/core/style/NinePieceImage.h
@@ -43,7 +43,8 @@ kRepeatImageRule }; -class CORE_EXPORT NinePieceImageData : public RefCounted<NinePieceImageData> { +class CORE_EXPORT NinePieceImageData + : public RefCountedCopyable<NinePieceImageData> { public: static PassRefPtr<NinePieceImageData> Create() { return AdoptRef(new NinePieceImageData); @@ -65,7 +66,7 @@ private: NinePieceImageData(); - NinePieceImageData(const NinePieceImageData&); + NinePieceImageData(const NinePieceImageData&) = default; }; class CORE_EXPORT NinePieceImage {
diff --git a/third_party/WebKit/Source/core/testing/DummyModulator.cpp b/third_party/WebKit/Source/core/testing/DummyModulator.cpp index 80f5d08c..3fbc977 100644 --- a/third_party/WebKit/Source/core/testing/DummyModulator.cpp +++ b/third_party/WebKit/Source/core/testing/DummyModulator.cpp
@@ -36,6 +36,24 @@ return nullptr; }; +void DummyModulator::FetchTree(const ModuleScriptFetchRequest&, + ModuleTreeClient*) { + NOTREACHED(); +} + +void DummyModulator::FetchTreeInternal(const ModuleScriptFetchRequest&, + const AncestorList&, + ModuleGraphLevel, + ModuleTreeClient*) { + NOTREACHED(); +}; + +void DummyModulator::FetchSingle(const ModuleScriptFetchRequest&, + ModuleGraphLevel, + SingleModuleClient*) { + NOTREACHED(); +} + ModuleScript* DummyModulator::GetFetchedModuleScript(const KURL&) { NOTREACHED(); return nullptr;
diff --git a/third_party/WebKit/Source/core/testing/DummyModulator.h b/third_party/WebKit/Source/core/testing/DummyModulator.h index 4e7d749..efd617a 100644 --- a/third_party/WebKit/Source/core/testing/DummyModulator.h +++ b/third_party/WebKit/Source/core/testing/DummyModulator.h
@@ -36,6 +36,14 @@ ReferrerPolicy GetReferrerPolicy() override; SecurityOrigin* GetSecurityOrigin() override; + void FetchTree(const ModuleScriptFetchRequest&, ModuleTreeClient*) override; + void FetchTreeInternal(const ModuleScriptFetchRequest&, + const AncestorList&, + ModuleGraphLevel, + ModuleTreeClient*) override; + void FetchSingle(const ModuleScriptFetchRequest&, + ModuleGraphLevel, + SingleModuleClient*) override; ModuleScript* GetFetchedModuleScript(const KURL&) override; void FetchNewSingleModule(const ModuleScriptFetchRequest&, ModuleGraphLevel,
diff --git a/third_party/WebKit/Source/core/testing/WorkerInternals.cpp b/third_party/WebKit/Source/core/testing/WorkerInternals.cpp index 42ee5394..afc509ca9 100644 --- a/third_party/WebKit/Source/core/testing/WorkerInternals.cpp +++ b/third_party/WebKit/Source/core/testing/WorkerInternals.cpp
@@ -4,6 +4,7 @@ #include "core/testing/WorkerInternals.h" +#include "bindings/core/v8/ExceptionState.h" #include "bindings/core/v8/ScriptState.h" #include "core/dom/ExecutionContext.h" #include "core/frame/Deprecation.h" @@ -21,13 +22,25 @@ } void WorkerInternals::countFeature(ScriptState* script_state, - uint32_t feature) { + uint32_t feature, + ExceptionState& exception_state) { + if (UseCounter::kNumberOfFeatures <= feature) { + exception_state.ThrowTypeError( + "The given feature does not exist in UseCounter::Feature."); + return; + } UseCounter::Count(ExecutionContext::From(script_state), static_cast<UseCounter::Feature>(feature)); } void WorkerInternals::countDeprecation(ScriptState* script_state, - uint32_t feature) { + uint32_t feature, + ExceptionState& exception_state) { + if (UseCounter::kNumberOfFeatures <= feature) { + exception_state.ThrowTypeError( + "The given feature does not exist in UseCounter::Feature."); + return; + } Deprecation::CountDeprecation(ExecutionContext::From(script_state), static_cast<UseCounter::Feature>(feature)); }
diff --git a/third_party/WebKit/Source/core/testing/WorkerInternals.h b/third_party/WebKit/Source/core/testing/WorkerInternals.h index 185d4b8d..aa69b70 100644 --- a/third_party/WebKit/Source/core/testing/WorkerInternals.h +++ b/third_party/WebKit/Source/core/testing/WorkerInternals.h
@@ -10,6 +10,7 @@ namespace blink { +class ExceptionState; class OriginTrialsTest; class ScriptState; @@ -22,8 +23,8 @@ virtual ~WorkerInternals(); OriginTrialsTest* originTrialsTest() const; - void countFeature(ScriptState*, uint32_t feature); - void countDeprecation(ScriptState*, uint32_t feature); + void countFeature(ScriptState*, uint32_t feature, ExceptionState&); + void countDeprecation(ScriptState*, uint32_t feature, ExceptionState&); void collectGarbage(ScriptState*);
diff --git a/third_party/WebKit/Source/core/testing/WorkerInternals.idl b/third_party/WebKit/Source/core/testing/WorkerInternals.idl index a49c02e..4f372e9 100644 --- a/third_party/WebKit/Source/core/testing/WorkerInternals.idl +++ b/third_party/WebKit/Source/core/testing/WorkerInternals.idl
@@ -7,8 +7,8 @@ // Records |feature| in worker's use counter. |feature| must be one of the // values from the UseCounter::Feature enum. - [CallWith=ScriptState] void countFeature(unsigned long feature); - [CallWith=ScriptState] void countDeprecation(unsigned long feature); + [CallWith=ScriptState, RaisesException] void countFeature(unsigned long feature); + [CallWith=ScriptState, RaisesException] void countDeprecation(unsigned long feature); [CallWith=ScriptState] void collectGarbage(); };
diff --git a/third_party/WebKit/Source/core/workers/BUILD.gn b/third_party/WebKit/Source/core/workers/BUILD.gn index 89d3a7de..d273a5c 100644 --- a/third_party/WebKit/Source/core/workers/BUILD.gn +++ b/third_party/WebKit/Source/core/workers/BUILD.gn
@@ -22,6 +22,8 @@ "InProcessWorkerMessagingProxy.h", "InProcessWorkerObjectProxy.cpp", "InProcessWorkerObjectProxy.h", + "MainThreadWorklet.cpp", + "MainThreadWorklet.h", "MainThreadWorkletGlobalScope.cpp", "MainThreadWorkletGlobalScope.h", "ParentFrameTaskRunners.cpp", @@ -37,6 +39,8 @@ "ThreadedMessagingProxyBase.h", "ThreadedObjectProxyBase.cpp", "ThreadedObjectProxyBase.h", + "ThreadedWorklet.cpp", + "ThreadedWorklet.h", "ThreadedWorkletGlobalScope.cpp", "ThreadedWorkletGlobalScope.h", "ThreadedWorkletMessagingProxy.cpp",
diff --git a/third_party/WebKit/Source/core/workers/MainThreadWorklet.cpp b/third_party/WebKit/Source/core/workers/MainThreadWorklet.cpp new file mode 100644 index 0000000..d58013c --- /dev/null +++ b/third_party/WebKit/Source/core/workers/MainThreadWorklet.cpp
@@ -0,0 +1,78 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/workers/MainThreadWorklet.h" + +#include "bindings/core/v8/ScriptSourceCode.h" +#include "bindings/core/v8/V8Binding.h" +#include "core/dom/DOMException.h" +#include "core/dom/Document.h" +#include "core/dom/ExceptionCode.h" +#include "core/frame/LocalFrame.h" +#include "core/workers/WorkletGlobalScopeProxy.h" +#include "platform/wtf/WTF.h" + +namespace blink { + +MainThreadWorklet::MainThreadWorklet(LocalFrame* frame) : Worklet(frame) {} + +ScriptPromise MainThreadWorklet::import(ScriptState* script_state, + const String& url) { + DCHECK(IsMainThread()); + if (!GetExecutionContext()) { + return ScriptPromise::RejectWithDOMException( + script_state, DOMException::Create(kInvalidStateError, + "This frame is already detached")); + } + + KURL script_url = GetExecutionContext()->CompleteURL(url); + if (!script_url.IsValid()) { + return ScriptPromise::RejectWithDOMException( + script_state, DOMException::Create( + kSyntaxError, "'" + url + "' is not a valid URL.")); + } + + if (!IsInitialized()) + Initialize(); + + ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); + ScriptPromise promise = resolver->Promise(); + + WorkletScriptLoader* script_loader = + WorkletScriptLoader::Create(frame_->GetDocument()->Fetcher(), this); + loader_to_resolver_map_.Set(script_loader, resolver); + script_loader->FetchScript(script_url); + return promise; +} + +void MainThreadWorklet::NotifyWorkletScriptLoadingFinished( + WorkletScriptLoader* script_loader, + const ScriptSourceCode& source_code) { + DCHECK(IsMainThread()); + ScriptPromiseResolver* resolver = loader_to_resolver_map_.at(script_loader); + loader_to_resolver_map_.erase(script_loader); + + if (!script_loader->WasScriptLoadSuccessful()) { + resolver->Reject(DOMException::Create(kNetworkError)); + return; + } + + GetWorkletGlobalScopeProxy()->EvaluateScript(source_code); + resolver->Resolve(); +} + +void MainThreadWorklet::ContextDestroyed(ExecutionContext* execution_context) { + DCHECK(IsMainThread()); + for (const auto& script_loader : loader_to_resolver_map_.Keys()) + script_loader->Cancel(); + loader_to_resolver_map_.Clear(); + Worklet::ContextDestroyed(execution_context); +} + +DEFINE_TRACE(MainThreadWorklet) { + visitor->Trace(loader_to_resolver_map_); + Worklet::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/workers/MainThreadWorklet.h b/third_party/WebKit/Source/core/workers/MainThreadWorklet.h new file mode 100644 index 0000000..858d1e9 --- /dev/null +++ b/third_party/WebKit/Source/core/workers/MainThreadWorklet.h
@@ -0,0 +1,53 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MainThreadWorklet_h +#define MainThreadWorklet_h + +#include "core/workers/Worklet.h" + +#include "bindings/core/v8/ScriptPromiseResolver.h" +#include "core/CoreExport.h" +#include "core/loader/WorkletScriptLoader.h" +#include "platform/heap/Handle.h" + +namespace blink { + +class LocalFrame; + +// A MainThreadWorklet is a worklet that runs only on the main thread. +// TODO(nhiroki): This is a temporary class to support module loading for main +// thread worklets. This and ThreadedWorklet will be merged into the base +// Worklet class once threaded worklets are ready to use module loading. +class CORE_EXPORT MainThreadWorklet : public Worklet, + public WorkletScriptLoader::Client { + USING_GARBAGE_COLLECTED_MIXIN(MainThreadWorklet); + WTF_MAKE_NONCOPYABLE(MainThreadWorklet); + + public: + virtual ~MainThreadWorklet() = default; + + // Worklet + ScriptPromise import(ScriptState*, const String& url) final; + + // WorkletScriptLoader::Client + void NotifyWorkletScriptLoadingFinished(WorkletScriptLoader*, + const ScriptSourceCode&) final; + + // ContextLifecycleObserver + void ContextDestroyed(ExecutionContext*) final; + + DECLARE_VIRTUAL_TRACE(); + + protected: + explicit MainThreadWorklet(LocalFrame*); + + private: + HeapHashMap<Member<WorkletScriptLoader>, Member<ScriptPromiseResolver>> + loader_to_resolver_map_; +}; + +} // namespace blink + +#endif // MainThreadWorklet_h
diff --git a/third_party/WebKit/Source/core/workers/ThreadedWorklet.cpp b/third_party/WebKit/Source/core/workers/ThreadedWorklet.cpp new file mode 100644 index 0000000..d60cded --- /dev/null +++ b/third_party/WebKit/Source/core/workers/ThreadedWorklet.cpp
@@ -0,0 +1,78 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/workers/ThreadedWorklet.h" + +#include "bindings/core/v8/ScriptSourceCode.h" +#include "bindings/core/v8/V8Binding.h" +#include "core/dom/DOMException.h" +#include "core/dom/Document.h" +#include "core/dom/ExceptionCode.h" +#include "core/frame/LocalFrame.h" +#include "core/workers/WorkletGlobalScopeProxy.h" +#include "platform/wtf/WTF.h" + +namespace blink { + +ThreadedWorklet::ThreadedWorklet(LocalFrame* frame) : Worklet(frame) {} + +ScriptPromise ThreadedWorklet::import(ScriptState* script_state, + const String& url) { + DCHECK(IsMainThread()); + if (!GetExecutionContext()) { + return ScriptPromise::RejectWithDOMException( + script_state, DOMException::Create(kInvalidStateError, + "This frame is already detached")); + } + + KURL script_url = GetExecutionContext()->CompleteURL(url); + if (!script_url.IsValid()) { + return ScriptPromise::RejectWithDOMException( + script_state, DOMException::Create( + kSyntaxError, "'" + url + "' is not a valid URL.")); + } + + if (!IsInitialized()) + Initialize(); + + ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); + ScriptPromise promise = resolver->Promise(); + + WorkletScriptLoader* script_loader = + WorkletScriptLoader::Create(frame_->GetDocument()->Fetcher(), this); + loader_to_resolver_map_.Set(script_loader, resolver); + script_loader->FetchScript(script_url); + return promise; +} + +void ThreadedWorklet::NotifyWorkletScriptLoadingFinished( + WorkletScriptLoader* script_loader, + const ScriptSourceCode& source_code) { + DCHECK(IsMainThread()); + ScriptPromiseResolver* resolver = loader_to_resolver_map_.at(script_loader); + loader_to_resolver_map_.erase(script_loader); + + if (!script_loader->WasScriptLoadSuccessful()) { + resolver->Reject(DOMException::Create(kNetworkError)); + return; + } + + GetWorkletGlobalScopeProxy()->EvaluateScript(source_code); + resolver->Resolve(); +} + +void ThreadedWorklet::ContextDestroyed(ExecutionContext* execution_context) { + DCHECK(IsMainThread()); + for (const auto& script_loader : loader_to_resolver_map_.Keys()) + script_loader->Cancel(); + loader_to_resolver_map_.Clear(); + Worklet::ContextDestroyed(execution_context); +} + +DEFINE_TRACE(ThreadedWorklet) { + visitor->Trace(loader_to_resolver_map_); + Worklet::Trace(visitor); +} + +} // namespace blink
diff --git a/third_party/WebKit/Source/core/workers/ThreadedWorklet.h b/third_party/WebKit/Source/core/workers/ThreadedWorklet.h new file mode 100644 index 0000000..24155c8 --- /dev/null +++ b/third_party/WebKit/Source/core/workers/ThreadedWorklet.h
@@ -0,0 +1,54 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ThreadedWorklet_h +#define ThreadedWorklet_h + +#include "core/workers/Worklet.h" + +#include "bindings/core/v8/ScriptPromiseResolver.h" +#include "core/CoreExport.h" +#include "core/loader/WorkletScriptLoader.h" +#include "platform/heap/Handle.h" + +namespace blink { + +class LocalFrame; + +// A ThreadedWorklet is a worklet that runs off the main thread. +// TODO(nhiroki): This is a temporary class to keep classic script loading for +// threaded worklets while module loading is being implemented for main thread +// worklets. This and MainThreadWorklet will be merged into the base Worklet +// class once threaded worklets are also ready to use module loading. +class CORE_EXPORT ThreadedWorklet : public Worklet, + public WorkletScriptLoader::Client { + USING_GARBAGE_COLLECTED_MIXIN(ThreadedWorklet); + WTF_MAKE_NONCOPYABLE(ThreadedWorklet); + + public: + virtual ~ThreadedWorklet() = default; + + // Worklet + ScriptPromise import(ScriptState*, const String& url) final; + + // WorkletScriptLoader::Client + void NotifyWorkletScriptLoadingFinished(WorkletScriptLoader*, + const ScriptSourceCode&) final; + + // ContextLifecycleObserver + void ContextDestroyed(ExecutionContext*) final; + + DECLARE_VIRTUAL_TRACE(); + + protected: + explicit ThreadedWorklet(LocalFrame*); + + private: + HeapHashMap<Member<WorkletScriptLoader>, Member<ScriptPromiseResolver>> + loader_to_resolver_map_; +}; + +} // namespace blink + +#endif // ThreadedWorklet_h
diff --git a/third_party/WebKit/Source/core/workers/Worklet.cpp b/third_party/WebKit/Source/core/workers/Worklet.cpp index a5f9e2a9..1e6c274 100644 --- a/third_party/WebKit/Source/core/workers/Worklet.cpp +++ b/third_party/WebKit/Source/core/workers/Worklet.cpp
@@ -4,77 +4,27 @@ #include "core/workers/Worklet.h" -#include "bindings/core/v8/ScriptSourceCode.h" -#include "bindings/core/v8/V8Binding.h" #include "core/dom/DOMException.h" #include "core/dom/Document.h" -#include "core/dom/ExceptionCode.h" #include "core/frame/LocalFrame.h" #include "core/workers/WorkletGlobalScopeProxy.h" -#include "platform/wtf/WTF.h" namespace blink { Worklet::Worklet(LocalFrame* frame) - : ContextLifecycleObserver(frame->GetDocument()), frame_(frame) {} - -ScriptPromise Worklet::import(ScriptState* script_state, const String& url) { + : ContextLifecycleObserver(frame->GetDocument()), frame_(frame) { DCHECK(IsMainThread()); - if (!GetExecutionContext()) { - return ScriptPromise::RejectWithDOMException( - script_state, DOMException::Create(kInvalidStateError, - "This frame is already detached")); - } - - KURL script_url = GetExecutionContext()->CompleteURL(url); - if (!script_url.IsValid()) { - return ScriptPromise::RejectWithDOMException( - script_state, DOMException::Create( - kSyntaxError, "'" + url + "' is not a valid URL.")); - } - - if (!IsInitialized()) - Initialize(); - - ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); - ScriptPromise promise = resolver->Promise(); - - WorkletScriptLoader* script_loader = - WorkletScriptLoader::Create(frame_->GetDocument()->Fetcher(), this); - loader_and_resolvers_.Set(script_loader, resolver); - script_loader->FetchScript(script_url); - return promise; -} - -void Worklet::NotifyWorkletScriptLoadingFinished( - WorkletScriptLoader* script_loader, - const ScriptSourceCode& source_code) { - DCHECK(IsMainThread()); - ScriptPromiseResolver* resolver = loader_and_resolvers_.at(script_loader); - loader_and_resolvers_.erase(script_loader); - - if (!script_loader->WasScriptLoadSuccessful()) { - resolver->Reject(DOMException::Create(kNetworkError)); - return; - } - - GetWorkletGlobalScopeProxy()->EvaluateScript(source_code); - resolver->Resolve(); } void Worklet::ContextDestroyed(ExecutionContext*) { DCHECK(IsMainThread()); if (IsInitialized()) GetWorkletGlobalScopeProxy()->TerminateWorkletGlobalScope(); - for (const auto& script_loader : loader_and_resolvers_.Keys()) - script_loader->Cancel(); - loader_and_resolvers_.Clear(); frame_ = nullptr; } DEFINE_TRACE(Worklet) { visitor->Trace(frame_); - visitor->Trace(loader_and_resolvers_); ContextLifecycleObserver::Trace(visitor); }
diff --git a/third_party/WebKit/Source/core/workers/Worklet.h b/third_party/WebKit/Source/core/workers/Worklet.h index 6d44e30..f482229f 100644 --- a/third_party/WebKit/Source/core/workers/Worklet.h +++ b/third_party/WebKit/Source/core/workers/Worklet.h
@@ -6,21 +6,21 @@ #define Worklet_h #include "bindings/core/v8/ScriptPromise.h" -#include "bindings/core/v8/ScriptPromiseResolver.h" #include "bindings/core/v8/ScriptWrappable.h" #include "core/CoreExport.h" #include "core/dom/ContextLifecycleObserver.h" -#include "core/loader/WorkletScriptLoader.h" #include "platform/heap/Handle.h" -#include "platform/loader/fetch/ResourceFetcher.h" namespace blink { class LocalFrame; class WorkletGlobalScopeProxy; +// This is the base implementation of Worklet interface defined in the spec: +// https://drafts.css-houdini.org/worklets/#worklet +// Although some worklets run off the main thread, this must be created and +// destroyed on the main thread. class CORE_EXPORT Worklet : public GarbageCollectedFinalized<Worklet>, - public WorkletScriptLoader::Client, public ScriptWrappable, public ContextLifecycleObserver { DEFINE_WRAPPERTYPEINFO(); @@ -33,17 +33,15 @@ virtual void Initialize() {} virtual bool IsInitialized() const { return true; } + // Worklet.idl + // import() imports ES6 module scripts. + virtual ScriptPromise import(ScriptState*, const String& url) = 0; + + // Returns a proxy to WorkletGlobalScope on the context thread. virtual WorkletGlobalScopeProxy* GetWorkletGlobalScopeProxy() const = 0; - // Worklet - ScriptPromise import(ScriptState*, const String& url); - - // WorkletScriptLoader::Client - void NotifyWorkletScriptLoadingFinished(WorkletScriptLoader*, - const ScriptSourceCode&) final; - // ContextLifecycleObserver - void ContextDestroyed(ExecutionContext*) final; + virtual void ContextDestroyed(ExecutionContext*); DECLARE_VIRTUAL_TRACE(); @@ -51,10 +49,7 @@ // The Worklet inherits the url and userAgent from the frame->document(). explicit Worklet(LocalFrame*); - private: Member<LocalFrame> frame_; - HeapHashMap<Member<WorkletScriptLoader>, Member<ScriptPromiseResolver>> - loader_and_resolvers_; }; } // namespace blink
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/module.json b/third_party/WebKit/Source/devtools/front_end/elements/module.json index 11b7c4d..684632f 100644 --- a/third_party/WebKit/Source/devtools/front_end/elements/module.json +++ b/third_party/WebKit/Source/devtools/front_end/elements/module.json
@@ -219,6 +219,7 @@ { "type": "@UI.ViewLocationResolver", "name": "elements-sidebar", + "category": "Elements", "className": "Elements.ElementsPanel" }, {
diff --git a/third_party/WebKit/Source/devtools/front_end/main/module.json b/third_party/WebKit/Source/devtools/front_end/main/module.json index 61d3623..9e5a909 100644 --- a/third_party/WebKit/Source/devtools/front_end/main/module.json +++ b/third_party/WebKit/Source/devtools/front_end/main/module.json
@@ -413,6 +413,13 @@ { "type": "@UI.ViewLocationResolver", "name": "drawer-view", + "category": "Drawer", + "className": "UI.InspectorView" + }, + { + "type": "@UI.ViewLocationResolver", + "name": "panel", + "category": "Panel", "className": "UI.InspectorView" }, {
diff --git a/third_party/WebKit/Source/devtools/front_end/quick_open/CommandMenu.js b/third_party/WebKit/Source/devtools/front_end/quick_open/CommandMenu.js index 0ca09d3..90b98ea 100644 --- a/third_party/WebKit/Source/devtools/front_end/quick_open/CommandMenu.js +++ b/third_party/WebKit/Source/devtools/front_end/quick_open/CommandMenu.js
@@ -59,35 +59,30 @@ /** * @param {!Runtime.Extension} extension + * @param {string} category * @return {!QuickOpen.CommandMenu.Command} */ - static createRevealPanelCommand(extension) { - var panelId = extension.descriptor()['id']; - var executeHandler = UI.viewManager.showView.bind(UI.viewManager, panelId); + static createRevealViewCommand(extension, category) { + var viewId = extension.descriptor()['id']; + var executeHandler = UI.viewManager.showView.bind(UI.viewManager, viewId); var tags = extension.descriptor()['tags'] || ''; return QuickOpen.CommandMenu.createCommand( - Common.UIString('Panel'), tags, Common.UIString('Show %s', extension.title()), '', executeHandler); - } - - /** - * @param {!Runtime.Extension} extension - * @return {!QuickOpen.CommandMenu.Command} - */ - static createRevealDrawerCommand(extension) { - var drawerId = extension.descriptor()['id']; - var executeHandler = UI.viewManager.showView.bind(UI.viewManager, drawerId); - var tags = extension.descriptor()['tags'] || ''; - return QuickOpen.CommandMenu.createCommand( - Common.UIString('Drawer'), tags, Common.UIString('Show %s', extension.title()), '', executeHandler); + category, tags, Common.UIString('Show %s', extension.title()), '', executeHandler); } _loadCommands() { + var locations = new Map(); + self.runtime.extensions(UI.ViewLocationResolver).forEach(extension => { + var category = extension.descriptor()['category']; + var name = extension.descriptor()['name']; + if (category && name) + locations.set(name, category); + }); var viewExtensions = self.runtime.extensions('view'); for (var extension of viewExtensions) { - if (extension.descriptor()['location'] === 'panel') - this._commands.push(QuickOpen.CommandMenu.createRevealPanelCommand(extension)); - else if (extension.descriptor()['location'] === 'drawer-view') - this._commands.push(QuickOpen.CommandMenu.createRevealDrawerCommand(extension)); + var category = locations.get(extension.descriptor()['location']); + if (category) + this._commands.push(QuickOpen.CommandMenu.createRevealViewCommand(extension, category)); } // Populate whitelisted settings.
diff --git a/third_party/WebKit/Source/devtools/front_end/settings/module.json b/third_party/WebKit/Source/devtools/front_end/settings/module.json index 50d0233..f73e1ba 100644 --- a/third_party/WebKit/Source/devtools/front_end/settings/module.json +++ b/third_party/WebKit/Source/devtools/front_end/settings/module.json
@@ -79,6 +79,7 @@ { "type": "@UI.ViewLocationResolver", "name": "settings-view", + "category": "Settings", "className": "Settings.SettingsScreen" } ],
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptSourceFrame.js b/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptSourceFrame.js index de2ac73..86fd83ac 100644 --- a/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptSourceFrame.js +++ b/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptSourceFrame.js
@@ -1253,7 +1253,7 @@ if (this._prettyPrintInfobar) return; - if (!TextUtils.isMinified(/** @type {string} */ (this._debuggerSourceCode.content()))) + if (!TextUtils.isMinified(/** @type {string} */ (this.uiSourceCode().content()))) return; this._prettyPrintInfobar = UI.Infobar.create(
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/module.json b/third_party/WebKit/Source/devtools/front_end/sources/module.json index 0795eb1..8a9d43c 100644 --- a/third_party/WebKit/Source/devtools/front_end/sources/module.json +++ b/third_party/WebKit/Source/devtools/front_end/sources/module.json
@@ -503,6 +503,7 @@ { "type": "@UI.ViewLocationResolver", "name": "sources-sidebar", + "category": "Sources", "className": "Sources.SourcesPanel" }, {
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/InspectorView.js b/third_party/WebKit/Source/devtools/front_end/ui/InspectorView.js index 077d6c9a..fc8cf5f 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui/InspectorView.js +++ b/third_party/WebKit/Source/devtools/front_end/ui/InspectorView.js
@@ -111,7 +111,11 @@ * @return {?UI.ViewLocation} */ resolveLocation(locationName) { - return this._drawerTabbedLocation; + if (locationName === 'drawer-view') + return this._drawerTabbedLocation; + if (locationName === 'panel') + return this._tabbedLocation; + return null; } createToolbars() {
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimationWorklet.cpp b/third_party/WebKit/Source/modules/compositorworker/AnimationWorklet.cpp index dded2c3..6f85765 100644 --- a/third_party/WebKit/Source/modules/compositorworker/AnimationWorklet.cpp +++ b/third_party/WebKit/Source/modules/compositorworker/AnimationWorklet.cpp
@@ -20,7 +20,7 @@ } AnimationWorklet::AnimationWorklet(LocalFrame* frame) - : Worklet(frame), worklet_messaging_proxy_(nullptr) {} + : ThreadedWorklet(frame), worklet_messaging_proxy_(nullptr) {} AnimationWorklet::~AnimationWorklet() { if (worklet_messaging_proxy_) @@ -52,7 +52,7 @@ } DEFINE_TRACE(AnimationWorklet) { - Worklet::Trace(visitor); + ThreadedWorklet::Trace(visitor); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimationWorklet.h b/third_party/WebKit/Source/modules/compositorworker/AnimationWorklet.h index b83e567b..7fb42f4 100644 --- a/third_party/WebKit/Source/modules/compositorworker/AnimationWorklet.h +++ b/third_party/WebKit/Source/modules/compositorworker/AnimationWorklet.h
@@ -5,7 +5,7 @@ #ifndef AnimationWorklet_h #define AnimationWorklet_h -#include "core/workers/Worklet.h" +#include "core/workers/ThreadedWorklet.h" #include "modules/ModulesExport.h" #include "platform/heap/Handle.h" @@ -15,7 +15,7 @@ class ThreadedWorkletMessagingProxy; class WorkletGlobalScopeProxy; -class MODULES_EXPORT AnimationWorklet final : public Worklet { +class MODULES_EXPORT AnimationWorklet final : public ThreadedWorklet { WTF_MAKE_NONCOPYABLE(AnimationWorklet); public:
diff --git a/third_party/WebKit/Source/modules/csspaint/PaintWorklet.cpp b/third_party/WebKit/Source/modules/csspaint/PaintWorklet.cpp index 71c5f98..56cb710 100644 --- a/third_party/WebKit/Source/modules/csspaint/PaintWorklet.cpp +++ b/third_party/WebKit/Source/modules/csspaint/PaintWorklet.cpp
@@ -17,7 +17,7 @@ } PaintWorklet::PaintWorklet(LocalFrame* frame) - : Worklet(frame), + : MainThreadWorklet(frame), paint_worklet_global_scope_(PaintWorkletGlobalScope::Create( frame, frame->GetDocument()->Url(), @@ -42,7 +42,7 @@ DEFINE_TRACE(PaintWorklet) { visitor->Trace(paint_worklet_global_scope_); - Worklet::Trace(visitor); + MainThreadWorklet::Trace(visitor); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/csspaint/PaintWorklet.h b/third_party/WebKit/Source/modules/csspaint/PaintWorklet.h index 31cc827..762df33 100644 --- a/third_party/WebKit/Source/modules/csspaint/PaintWorklet.h +++ b/third_party/WebKit/Source/modules/csspaint/PaintWorklet.h
@@ -5,7 +5,7 @@ #ifndef PaintWorklet_h #define PaintWorklet_h -#include "core/workers/Worklet.h" +#include "core/workers/MainThreadWorklet.h" #include "modules/ModulesExport.h" #include "modules/csspaint/PaintWorkletGlobalScope.h" #include "platform/heap/Handle.h" @@ -15,7 +15,7 @@ class CSSPaintDefinition; class CSSPaintImageGeneratorImpl; -class MODULES_EXPORT PaintWorklet final : public Worklet { +class MODULES_EXPORT PaintWorklet final : public MainThreadWorklet { WTF_MAKE_NONCOPYABLE(PaintWorklet); public:
diff --git a/third_party/WebKit/Source/modules/gamepad/BUILD.gn b/third_party/WebKit/Source/modules/gamepad/BUILD.gn index 4062bd6..027b327d 100644 --- a/third_party/WebKit/Source/modules/gamepad/BUILD.gn +++ b/third_party/WebKit/Source/modules/gamepad/BUILD.gn
@@ -21,4 +21,8 @@ "NavigatorGamepad.cpp", "NavigatorGamepad.h", ] + + deps = [ + "//device/gamepad/public/cpp:shared_with_blink", + ] }
diff --git a/third_party/WebKit/Source/modules/gamepad/DEPS b/third_party/WebKit/Source/modules/gamepad/DEPS index c54ef3e..c1ba0f0 100644 --- a/third_party/WebKit/Source/modules/gamepad/DEPS +++ b/third_party/WebKit/Source/modules/gamepad/DEPS
@@ -1,4 +1,9 @@ include_rules = [ + # NOTE: These files are POD structs used to interpret shared memory across + # the Device Gamepad implementation and the Blink client. + "+device/gamepad/public/cpp/gamepad.h", + "+device/gamepad/public/cpp/gamepads.h", + "-modules", "+modules/EventModules.h", "+modules/ModulesExport.h",
diff --git a/third_party/WebKit/Source/modules/gamepad/Gamepad.cpp b/third_party/WebKit/Source/modules/gamepad/Gamepad.cpp index f7772a9..efaba77b 100644 --- a/third_party/WebKit/Source/modules/gamepad/Gamepad.cpp +++ b/third_party/WebKit/Source/modules/gamepad/Gamepad.cpp
@@ -37,7 +37,7 @@ std::copy(data, data + count, axes_.begin()); } -void Gamepad::SetButtons(unsigned count, const WebGamepadButton* data) { +void Gamepad::SetButtons(unsigned count, const device::GamepadButton* data) { if (buttons_.size() != count) { buttons_.Resize(count); for (unsigned i = 0; i < count; ++i) @@ -51,7 +51,7 @@ } } -void Gamepad::SetPose(const WebGamepadPose& pose) { +void Gamepad::SetPose(const device::GamepadPose& pose) { if (!pose.not_null) { if (pose_) pose_ = nullptr; @@ -64,15 +64,15 @@ pose_->SetPose(pose); } -void Gamepad::SetHand(const WebGamepadHand& hand) { +void Gamepad::SetHand(const device::GamepadHand& hand) { switch (hand) { - case kGamepadHandNone: + case device::GamepadHand::kNone: hand_ = ""; break; - case kGamepadHandLeft: + case device::GamepadHand::kLeft: hand_ = "left"; break; - case kGamepadHandRight: + case device::GamepadHand::kRight: hand_ = "right"; break; default:
diff --git a/third_party/WebKit/Source/modules/gamepad/Gamepad.h b/third_party/WebKit/Source/modules/gamepad/Gamepad.h index 623d06e..0b18959 100644 --- a/third_party/WebKit/Source/modules/gamepad/Gamepad.h +++ b/third_party/WebKit/Source/modules/gamepad/Gamepad.h
@@ -27,12 +27,12 @@ #define Gamepad_h #include "bindings/core/v8/ScriptWrappable.h" +#include "device/gamepad/public/cpp/gamepad.h" #include "modules/gamepad/GamepadButton.h" #include "modules/gamepad/GamepadPose.h" #include "platform/heap/Handle.h" #include "platform/wtf/Vector.h" #include "platform/wtf/text/WTFString.h" -#include "public/platform/WebGamepad.h" namespace blink { @@ -65,13 +65,13 @@ void SetAxes(unsigned count, const double* data); const GamepadButtonVector& buttons() const { return buttons_; } - void SetButtons(unsigned count, const WebGamepadButton* data); + void SetButtons(unsigned count, const device::GamepadButton* data); GamepadPose* pose() const { return pose_; } - void SetPose(const WebGamepadPose&); + void SetPose(const device::GamepadPose&); const String& hand() const { return hand_; } - void SetHand(const WebGamepadHand&); + void SetHand(const device::GamepadHand&); unsigned displayId() const { return display_id_; } void SetDisplayId(unsigned val) { display_id_ = val; }
diff --git a/third_party/WebKit/Source/modules/gamepad/GamepadDispatcher.cpp b/third_party/WebKit/Source/modules/gamepad/GamepadDispatcher.cpp index 43e00db..c888a09 100644 --- a/third_party/WebKit/Source/modules/gamepad/GamepadDispatcher.cpp +++ b/third_party/WebKit/Source/modules/gamepad/GamepadDispatcher.cpp
@@ -15,7 +15,7 @@ return gamepad_dispatcher; } -void GamepadDispatcher::SampleGamepads(WebGamepads& gamepads) { +void GamepadDispatcher::SampleGamepads(device::Gamepads& gamepads) { Platform::Current()->SampleGamepads(gamepads); } @@ -28,21 +28,21 @@ } void GamepadDispatcher::DidConnectGamepad(unsigned index, - const WebGamepad& gamepad) { + const device::Gamepad& gamepad) { DispatchDidConnectOrDisconnectGamepad(index, gamepad, true); } void GamepadDispatcher::DidDisconnectGamepad(unsigned index, - const WebGamepad& gamepad) { + const device::Gamepad& gamepad) { DispatchDidConnectOrDisconnectGamepad(index, gamepad, false); } void GamepadDispatcher::DispatchDidConnectOrDisconnectGamepad( unsigned index, - const WebGamepad& gamepad, + const device::Gamepad& gamepad, bool connected) { - ASSERT(index < WebGamepads::kItemsLengthCap); - ASSERT(connected == gamepad.connected); + DCHECK(index < device::Gamepads::kItemsLengthCap); + DCHECK_EQ(connected, gamepad.connected); latest_change_.pad = gamepad; latest_change_.index = index;
diff --git a/third_party/WebKit/Source/modules/gamepad/GamepadDispatcher.h b/third_party/WebKit/Source/modules/gamepad/GamepadDispatcher.h index df09160..3311e1d 100644 --- a/third_party/WebKit/Source/modules/gamepad/GamepadDispatcher.h +++ b/third_party/WebKit/Source/modules/gamepad/GamepadDispatcher.h
@@ -6,14 +6,12 @@ #define GamepadDispatcher_h #include "core/frame/PlatformEventDispatcher.h" +#include "device/gamepad/public/cpp/gamepads.h" #include "platform/heap/Handle.h" -#include "public/platform/WebGamepad.h" #include "public/platform/WebGamepadListener.h" namespace blink { -class WebGamepads; - class GamepadDispatcher final : public GarbageCollectedFinalized<GamepadDispatcher>, public PlatformEventDispatcher, @@ -24,11 +22,11 @@ static GamepadDispatcher& Instance(); ~GamepadDispatcher() override; - void SampleGamepads(WebGamepads&); + void SampleGamepads(device::Gamepads&); struct ConnectionChange { DISALLOW_NEW(); - WebGamepad pad; + device::Gamepad pad; unsigned index; }; @@ -42,15 +40,15 @@ GamepadDispatcher(); // WebGamepadListener - void DidConnectGamepad(unsigned index, const WebGamepad&) override; - void DidDisconnectGamepad(unsigned index, const WebGamepad&) override; + void DidConnectGamepad(unsigned index, const device::Gamepad&) override; + void DidDisconnectGamepad(unsigned index, const device::Gamepad&) override; // PlatformEventDispatcher void StartListening() override; void StopListening() override; void DispatchDidConnectOrDisconnectGamepad(unsigned index, - const WebGamepad&, + const device::Gamepad&, bool connected); ConnectionChange latest_change_;
diff --git a/third_party/WebKit/Source/modules/gamepad/GamepadList.cpp b/third_party/WebKit/Source/modules/gamepad/GamepadList.cpp index 732b60a4..5e35828 100644 --- a/third_party/WebKit/Source/modules/gamepad/GamepadList.cpp +++ b/third_party/WebKit/Source/modules/gamepad/GamepadList.cpp
@@ -30,7 +30,7 @@ GamepadList::GamepadList() {} void GamepadList::Set(unsigned index, Gamepad* gamepad) { - if (index >= WebGamepads::kItemsLengthCap) + if (index >= device::Gamepads::kItemsLengthCap) return; items_[index] = gamepad; } @@ -40,7 +40,7 @@ } DEFINE_TRACE(GamepadList) { - for (unsigned index = 0; index < WebGamepads::kItemsLengthCap; index++) { + for (unsigned index = 0; index < device::Gamepads::kItemsLengthCap; index++) { visitor->Trace(items_[index]); } }
diff --git a/third_party/WebKit/Source/modules/gamepad/GamepadList.h b/third_party/WebKit/Source/modules/gamepad/GamepadList.h index df484683..31e4f7e2 100644 --- a/third_party/WebKit/Source/modules/gamepad/GamepadList.h +++ b/third_party/WebKit/Source/modules/gamepad/GamepadList.h
@@ -27,9 +27,9 @@ #define GamepadList_h #include "bindings/core/v8/ScriptWrappable.h" +#include "device/gamepad/public/cpp/gamepads.h" #include "modules/gamepad/Gamepad.h" #include "platform/heap/Handle.h" -#include "public/platform/WebGamepads.h" namespace blink { @@ -42,13 +42,13 @@ void Set(unsigned index, Gamepad*); Gamepad* item(unsigned index); - unsigned length() const { return WebGamepads::kItemsLengthCap; } + unsigned length() const { return device::Gamepads::kItemsLengthCap; } DECLARE_TRACE(); private: GamepadList(); - Member<Gamepad> items_[WebGamepads::kItemsLengthCap]; + Member<Gamepad> items_[device::Gamepads::kItemsLengthCap]; }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/gamepad/GamepadPose.cpp b/third_party/WebKit/Source/modules/gamepad/GamepadPose.cpp index 1be92d52..f8c211d 100644 --- a/third_party/WebKit/Source/modules/gamepad/GamepadPose.cpp +++ b/third_party/WebKit/Source/modules/gamepad/GamepadPose.cpp
@@ -8,7 +8,7 @@ namespace { -DOMFloat32Array* VecToFloat32Array(const WebGamepadVector& vec) { +DOMFloat32Array* VecToFloat32Array(const device::GamepadVector& vec) { if (vec.not_null) { DOMFloat32Array* out = DOMFloat32Array::Create(3); out->Data()[0] = vec.x; @@ -19,7 +19,7 @@ return nullptr; } -DOMFloat32Array* QuatToFloat32Array(const WebGamepadQuaternion& quat) { +DOMFloat32Array* QuatToFloat32Array(const device::GamepadQuaternion& quat) { if (quat.not_null) { DOMFloat32Array* out = DOMFloat32Array::Create(4); out->Data()[0] = quat.x; @@ -35,7 +35,7 @@ GamepadPose::GamepadPose() {} -void GamepadPose::SetPose(const WebGamepadPose& state) { +void GamepadPose::SetPose(const device::GamepadPose& state) { if (state.not_null) { has_orientation_ = state.has_orientation; has_position_ = state.has_position;
diff --git a/third_party/WebKit/Source/modules/gamepad/GamepadPose.h b/third_party/WebKit/Source/modules/gamepad/GamepadPose.h index e40b4d0..9f48783c 100644 --- a/third_party/WebKit/Source/modules/gamepad/GamepadPose.h +++ b/third_party/WebKit/Source/modules/gamepad/GamepadPose.h
@@ -7,9 +7,9 @@ #include "bindings/core/v8/ScriptWrappable.h" #include "core/dom/DOMTypedArray.h" +#include "device/gamepad/public/cpp/gamepad.h" #include "platform/heap/Handle.h" #include "platform/wtf/Forward.h" -#include "public/platform/WebGamepad.h" namespace blink { @@ -30,7 +30,7 @@ DOMFloat32Array* angularAcceleration() const { return angular_acceleration_; } DOMFloat32Array* linearAcceleration() const { return linear_acceleration_; } - void SetPose(const WebGamepadPose& state); + void SetPose(const device::GamepadPose& state); DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/modules/gamepad/NavigatorGamepad.cpp b/third_party/WebKit/Source/modules/gamepad/NavigatorGamepad.cpp index abcd9e8..023b2d42 100644 --- a/third_party/WebKit/Source/modules/gamepad/NavigatorGamepad.cpp +++ b/third_party/WebKit/Source/modules/gamepad/NavigatorGamepad.cpp
@@ -29,6 +29,7 @@ #include "core/frame/LocalFrame.h" #include "core/frame/Navigator.h" #include "core/page/Page.h" +#include "device/gamepad/public/cpp/gamepad.h" #include "modules/gamepad/GamepadDispatcher.h" #include "modules/gamepad/GamepadEvent.h" #include "modules/gamepad/GamepadList.h" @@ -38,27 +39,27 @@ template <typename T> static void SampleGamepad(unsigned index, T& gamepad, - const WebGamepad& web_gamepad) { - gamepad.SetId(web_gamepad.id); + const device::Gamepad& device_gamepad) { + gamepad.SetId(device_gamepad.id); gamepad.SetIndex(index); - gamepad.SetConnected(web_gamepad.connected); - gamepad.SetTimestamp(web_gamepad.timestamp); - gamepad.SetMapping(web_gamepad.mapping); - gamepad.SetAxes(web_gamepad.axes_length, web_gamepad.axes); - gamepad.SetButtons(web_gamepad.buttons_length, web_gamepad.buttons); - gamepad.SetPose(web_gamepad.pose); - gamepad.SetHand(web_gamepad.hand); - gamepad.SetDisplayId(web_gamepad.display_id); + gamepad.SetConnected(device_gamepad.connected); + gamepad.SetTimestamp(device_gamepad.timestamp); + gamepad.SetMapping(device_gamepad.mapping); + gamepad.SetAxes(device_gamepad.axes_length, device_gamepad.axes); + gamepad.SetButtons(device_gamepad.buttons_length, device_gamepad.buttons); + gamepad.SetPose(device_gamepad.pose); + gamepad.SetHand(device_gamepad.hand); + gamepad.SetDisplayId(device_gamepad.display_id); } template <typename GamepadType, typename ListType> static void SampleGamepads(ListType* into) { - WebGamepads gamepads; + device::Gamepads gamepads; GamepadDispatcher::Instance().SampleGamepads(gamepads); - for (unsigned i = 0; i < WebGamepads::kItemsLengthCap; ++i) { - WebGamepad& web_gamepad = gamepads.items[i]; + for (unsigned i = 0; i < device::Gamepads::kItemsLengthCap; ++i) { + device::Gamepad& web_gamepad = gamepads.items[i]; if (web_gamepad.connected) { GamepadType* gamepad = into->item(i); if (!gamepad) @@ -254,7 +255,7 @@ GamepadList* new_gamepads = gamepads_.Get(); DCHECK(new_gamepads); - for (unsigned i = 0; i < WebGamepads::kItemsLengthCap; ++i) { + for (unsigned i = 0; i < device::Gamepads::kItemsLengthCap; ++i) { Gamepad* old_gamepad = old_gamepads ? old_gamepads->item(i) : 0; Gamepad* new_gamepad = new_gamepads->item(i); bool old_was_connected = old_gamepad && old_gamepad->connected();
diff --git a/third_party/WebKit/Source/modules/gamepad/NavigatorGamepad.h b/third_party/WebKit/Source/modules/gamepad/NavigatorGamepad.h index fece750..cd4e2eac 100644 --- a/third_party/WebKit/Source/modules/gamepad/NavigatorGamepad.h +++ b/third_party/WebKit/Source/modules/gamepad/NavigatorGamepad.h
@@ -30,11 +30,11 @@ #include "core/frame/LocalDOMWindow.h" #include "core/frame/Navigator.h" #include "core/frame/PlatformEventController.h" +#include "device/gamepad/public/cpp/gamepads.h" #include "modules/ModulesExport.h" #include "platform/AsyncMethodRunner.h" #include "platform/Supplementable.h" #include "platform/heap/Handle.h" -#include "public/platform/WebGamepads.h" namespace blink { @@ -62,7 +62,7 @@ DECLARE_VIRTUAL_TRACE(); void DidConnectOrDisconnectGamepad(unsigned index, - const WebGamepad&, + const device::Gamepad&, bool connected); private:
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioWorklet.cpp b/third_party/WebKit/Source/modules/webaudio/AudioWorklet.cpp index 0d8ade7..39e341d1 100644 --- a/third_party/WebKit/Source/modules/webaudio/AudioWorklet.cpp +++ b/third_party/WebKit/Source/modules/webaudio/AudioWorklet.cpp
@@ -17,7 +17,7 @@ } AudioWorklet::AudioWorklet(LocalFrame* frame) - : Worklet(frame), worklet_messaging_proxy_(nullptr) {} + : ThreadedWorklet(frame), worklet_messaging_proxy_(nullptr) {} AudioWorklet::~AudioWorklet() { if (worklet_messaging_proxy_) @@ -45,7 +45,7 @@ } DEFINE_TRACE(AudioWorklet) { - Worklet::Trace(visitor); + ThreadedWorklet::Trace(visitor); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioWorklet.h b/third_party/WebKit/Source/modules/webaudio/AudioWorklet.h index 8aee6a10..71ddc90f 100644 --- a/third_party/WebKit/Source/modules/webaudio/AudioWorklet.h +++ b/third_party/WebKit/Source/modules/webaudio/AudioWorklet.h
@@ -5,7 +5,7 @@ #ifndef AudioWorklet_h #define AudioWorklet_h -#include "core/workers/Worklet.h" +#include "core/workers/ThreadedWorklet.h" #include "modules/ModulesExport.h" #include "platform/heap/Handle.h" @@ -15,7 +15,7 @@ class ThreadedWorkletMessagingProxy; class WorkletGlobalScopeProxy; -class MODULES_EXPORT AudioWorklet final : public Worklet { +class MODULES_EXPORT AudioWorklet final : public ThreadedWorklet { WTF_MAKE_NONCOPYABLE(AudioWorklet); public:
diff --git a/third_party/WebKit/Source/platform/FrameViewBase.h b/third_party/WebKit/Source/platform/FrameViewBase.h index b80aaa1..58ac1d9 100644 --- a/third_party/WebKit/Source/platform/FrameViewBase.h +++ b/third_party/WebKit/Source/platform/FrameViewBase.h
@@ -36,9 +36,7 @@ namespace blink { -class CullRect; class Event; -class GraphicsContext; // The FrameViewBase class serves as a base class for FrameView, Scrollbar, and // PluginView. @@ -63,17 +61,10 @@ frame_rect_ = frame_rect; } const IntRect& FrameRect() const { return frame_rect_; } - IntRect BoundsRect() const { return IntRect(0, 0, Width(), Height()); } void Resize(int w, int h) { SetFrameRect(IntRect(X(), Y(), w, h)); } void Resize(const IntSize& s) { SetFrameRect(IntRect(Location(), s)); } - virtual void Paint(GraphicsContext&, const CullRect&) const {} - void Invalidate() { InvalidateRect(BoundsRect()); } - virtual void InvalidateRect(const IntRect&) = 0; - - virtual void Show() {} - virtual void Hide() {} bool IsSelfVisible() const { return self_visible_; } // Whether or not we have been explicitly marked as visible or not.
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5 b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5 index d4e77ffd..18cde98 100644 --- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5 +++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5
@@ -177,7 +177,7 @@ }, { name: "ContextMenu", - status: "test", + status: "experimental", }, { name: "CorsRFC1918",
diff --git a/third_party/WebKit/Source/platform/loader/fetch/FetchUtils.cpp b/third_party/WebKit/Source/platform/loader/fetch/FetchUtils.cpp index a4d5e4c..f9bc710 100644 --- a/third_party/WebKit/Source/platform/loader/fetch/FetchUtils.cpp +++ b/third_party/WebKit/Source/platform/loader/fetch/FetchUtils.cpp
@@ -95,16 +95,16 @@ // Treat inspector headers as a simple headers, since they are added by blink // when the inspector is open. - if (DeprecatedEqualIgnoringCase(name, "accept") || - DeprecatedEqualIgnoringCase(name, "accept-language") || - DeprecatedEqualIgnoringCase(name, "content-language") || - DeprecatedEqualIgnoringCase( + if (EqualIgnoringASCIICase(name, "accept") || + EqualIgnoringASCIICase(name, "accept-language") || + EqualIgnoringASCIICase(name, "content-language") || + EqualIgnoringASCIICase( name, HTTPNames::X_DevTools_Emulate_Network_Conditions_Client_Id) || - DeprecatedEqualIgnoringCase(name, HTTPNames::X_DevTools_Request_Id) || - DeprecatedEqualIgnoringCase(name, "save-data")) + EqualIgnoringASCIICase(name, HTTPNames::X_DevTools_Request_Id) || + EqualIgnoringASCIICase(name, "save-data")) return true; - if (DeprecatedEqualIgnoringCase(name, "content-type")) + if (EqualIgnoringASCIICase(name, "content-type")) return IsSimpleContentType(value); return false; @@ -112,10 +112,10 @@ bool FetchUtils::IsSimpleContentType(const AtomicString& media_type) { AtomicString mime_type = ExtractMIMETypeFromMediaType(media_type); - return DeprecatedEqualIgnoringCase(mime_type, - "application/x-www-form-urlencoded") || - DeprecatedEqualIgnoringCase(mime_type, "multipart/form-data") || - DeprecatedEqualIgnoringCase(mime_type, "text/plain"); + return EqualIgnoringASCIICase(mime_type, + "application/x-www-form-urlencoded") || + EqualIgnoringASCIICase(mime_type, "multipart/form-data") || + EqualIgnoringASCIICase(mime_type, "text/plain"); } bool FetchUtils::IsSimpleRequest(const String& method, @@ -137,9 +137,9 @@ // http://fetch.spec.whatwg.org/#forbidden-method // "A forbidden method is a method that is a byte case-insensitive match" // for one of `CONNECT`, `TRACE`, and `TRACK`." - return DeprecatedEqualIgnoringCase(method, "TRACE") || - DeprecatedEqualIgnoringCase(method, "TRACK") || - DeprecatedEqualIgnoringCase(method, "CONNECT"); + return EqualIgnoringASCIICase(method, "TRACE") || + EqualIgnoringASCIICase(method, "TRACK") || + EqualIgnoringASCIICase(method, "CONNECT"); } bool FetchUtils::IsForbiddenHeaderName(const String& name) { @@ -161,8 +161,8 @@ // "A forbidden response header name is a header name that is one of: // `Set-Cookie`, `Set-Cookie2`" - return DeprecatedEqualIgnoringCase(name, "set-cookie") || - DeprecatedEqualIgnoringCase(name, "set-cookie2"); + return EqualIgnoringASCIICase(name, "set-cookie") || + EqualIgnoringASCIICase(name, "set-cookie2"); } bool FetchUtils::IsSimpleOrForbiddenRequest(const String& method, @@ -189,7 +189,7 @@ }; for (const auto& known : kMethods) { - if (DeprecatedEqualIgnoringCase(method, known)) { + if (EqualIgnoringASCIICase(method, known)) { // Don't bother allocating a new string if it's already all // uppercase. return method == known ? method : known;
diff --git a/third_party/WebKit/Source/platform/scroll/Scrollbar.cpp b/third_party/WebKit/Source/platform/scroll/Scrollbar.cpp index e794e1bc..c5a1386 100644 --- a/third_party/WebKit/Source/platform/scroll/Scrollbar.cpp +++ b/third_party/WebKit/Source/platform/scroll/Scrollbar.cpp
@@ -158,8 +158,7 @@ if (!cull_rect.IntersectsCullRect(FrameRect())) return; - if (!GetTheme().Paint(*this, context, cull_rect)) - FrameViewBase::Paint(context, cull_rect); + GetTheme().Paint(*this, context, cull_rect); } void Scrollbar::AutoscrollTimerFired(TimerBase*) {
diff --git a/third_party/WebKit/Source/platform/scroll/Scrollbar.h b/third_party/WebKit/Source/platform/scroll/Scrollbar.h index d74393e..0d492ef1 100644 --- a/third_party/WebKit/Source/platform/scroll/Scrollbar.h +++ b/third_party/WebKit/Source/platform/scroll/Scrollbar.h
@@ -36,6 +36,7 @@ namespace blink { +class CullRect; class GraphicsContext; class HostWindow; class IntRect; @@ -129,7 +130,7 @@ void SetProportion(int visible_size, int total_size); void SetPressedPos(int p) { pressed_pos_ = p; } - void Paint(GraphicsContext&, const CullRect&) const final; + void Paint(GraphicsContext&, const CullRect&) const; bool IsOverlayScrollbar() const override; bool ShouldParticipateInHitTesting();
diff --git a/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp b/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp index c5c5029..fcc8889 100644 --- a/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp +++ b/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp
@@ -112,8 +112,13 @@ // Public methods -------------------------------------------------------------- -void WebPluginContainerImpl::SetFrameRect(const IntRect& frame_rect) { - FrameViewBase::SetFrameRect(frame_rect); +void WebPluginContainerImpl::SetParent(FrameView* parent) { + DCHECK(!parent || !parent_); + if (!parent || !parent->IsVisible()) + SetParentVisible(false); + parent_ = parent; + if (parent && parent->IsVisible()) + SetParentVisible(true); } void WebPluginContainerImpl::UpdateAllLifecyclePhases() { @@ -125,19 +130,19 @@ void WebPluginContainerImpl::Paint(GraphicsContext& context, const CullRect& cull_rect) const { - if (!Parent()) + if (!parent_) return; // Don't paint anything if the plugin doesn't intersect. - if (!cull_rect.IntersectsCullRect(FrameRect())) + if (!cull_rect.IntersectsCullRect(frame_rect_)) return; if (RuntimeEnabledFeatures::slimmingPaintV2Enabled() && web_layer_) { // With Slimming Paint v2, composited plugins should have their layers // inserted rather than invoking WebPlugin::paint. RecordForeignLayer(context, *element_->GetLayoutObject(), - DisplayItem::kForeignLayerPlugin, web_layer_, Location(), - Size()); + DisplayItem::kForeignLayerPlugin, web_layer_, + frame_rect_.Location(), frame_rect_.Size()); return; } @@ -150,25 +155,22 @@ cull_rect.rect_); context.Save(); - DCHECK(Parent()->IsFrameView()); - FrameView* view = ToFrameView(Parent()); - // The plugin is positioned in the root frame's coordinates, so it needs to // be painted in them too. - IntPoint origin = view->ContentsToRootFrame(IntPoint(0, 0)); + IntPoint origin = parent_->ContentsToRootFrame(IntPoint(0, 0)); context.Translate(static_cast<float>(-origin.X()), static_cast<float>(-origin.Y())); WebCanvas* canvas = context.Canvas(); - IntRect window_rect = view->ContentsToRootFrame(cull_rect.rect_); + IntRect window_rect = parent_->ContentsToRootFrame(cull_rect.rect_); web_plugin_->Paint(canvas, window_rect); context.Restore(); } void WebPluginContainerImpl::InvalidateRect(const IntRect& rect) { - if (!Parent()) + if (!parent_) return; LayoutBox* layout_object = ToLayoutBox(element_->GetLayoutObject()); @@ -190,17 +192,13 @@ } void WebPluginContainerImpl::Show() { - SetSelfVisible(true); + self_visible_ = true; web_plugin_->UpdateVisibility(true); - - FrameViewBase::Show(); } void WebPluginContainerImpl::Hide() { - SetSelfVisible(false); + self_visible_ = false; web_plugin_->UpdateVisibility(false); - - FrameViewBase::Hide(); } void WebPluginContainerImpl::HandleEvent(Event* event) { @@ -229,12 +227,10 @@ } void WebPluginContainerImpl::FrameRectsChanged() { - FrameViewBase::FrameRectsChanged(); ReportGeometry(); } void WebPluginContainerImpl::GeometryMayHaveChanged() { - FrameViewBase::GeometryMayHaveChanged(); ReportGeometry(); } @@ -251,15 +247,15 @@ // is ignored. This function is called when the plugin eventually gets a // parent. - if (IsParentVisible() == parent_visible) + if (parent_visible_ == parent_visible) return; // No change. - FrameViewBase::SetParentVisible(parent_visible); - if (!IsSelfVisible()) + parent_visible_ = parent_visible; + if (!self_visible_) return; // This widget has explicitely been marked as not visible. if (web_plugin_) - web_plugin_->UpdateVisibility(IsVisible()); + web_plugin_->UpdateVisibility(parent_visible_ && self_visible_); } void WebPluginContainerImpl::SetPlugin(WebPlugin* plugin) { @@ -413,7 +409,7 @@ } void WebPluginContainerImpl::Invalidate() { - FrameViewBase::Invalidate(); + InvalidateRect(IntRect(0, 0, frame_rect_.Width(), frame_rect_.Height())); } void WebPluginContainerImpl::InvalidateRect(const WebRect& rect) { @@ -431,14 +427,14 @@ void WebPluginContainerImpl::ReportGeometry() { // We cannot compute geometry without a parent or layoutObject. - if (!Parent() || !element_ || !element_->GetLayoutObject() || !web_plugin_) + if (!parent_ || !element_ || !element_->GetLayoutObject() || !web_plugin_) return; IntRect window_rect, clip_rect, unobscured_rect; Vector<IntRect> cut_out_rects; CalculateGeometry(window_rect, clip_rect, unobscured_rect, cut_out_rects); web_plugin_->UpdateGeometry(window_rect, clip_rect, unobscured_rect, - cut_out_rects, IsVisible()); + cut_out_rects, self_visible_); } v8::Local<v8::Object> WebPluginContainerImpl::V8ObjectForElement() { @@ -519,7 +515,8 @@ if (!frame) return false; - IntRect document_rect(X() + rect.x, Y() + rect.y, rect.width, rect.height); + IntRect document_rect(frame_rect_.X() + rect.x, frame_rect_.Y() + rect.y, + rect.width, rect.height); // hitTestResultAtPoint() takes a padding rectangle. // FIXME: We'll be off by 1 when the width or height is even. LayoutPoint center = document_rect.Center(); @@ -574,7 +571,7 @@ if (Page* page = element_->GetDocument().GetPage()) { if (ScrollingCoordinator* scrolling_coordinator = page->GetScrollingCoordinator()) { - if (Parent() && Parent()->IsFrameView()) + if (parent_) scrolling_coordinator->NotifyGeometryChanged(); } } @@ -582,23 +579,21 @@ WebPoint WebPluginContainerImpl::RootFrameToLocalPoint( const WebPoint& point_in_root_frame) { - FrameView* view = ToFrameView(Parent()); - if (!view) + if (!parent_) return point_in_root_frame; - WebPoint point_in_content = view->RootFrameToContents(point_in_root_frame); + WebPoint point_in_content = parent_->RootFrameToContents(point_in_root_frame); return RoundedIntPoint(element_->GetLayoutObject()->AbsoluteToLocal( FloatPoint(point_in_content), kUseTransforms)); } WebPoint WebPluginContainerImpl::LocalToRootFramePoint( const WebPoint& point_in_local) { - FrameView* view = ToFrameView(Parent()); - if (!view) + if (!parent_) return point_in_local; IntPoint absolute_point = RoundedIntPoint(element_->GetLayoutObject()->LocalToAbsolute( FloatPoint(point_in_local), kUseTransforms)); - return view->ContentsToRootFrame(absolute_point); + return parent_->ContentsToRootFrame(absolute_point); } void WebPluginContainerImpl::DidReceiveResponse( @@ -672,6 +667,8 @@ web_layer_(nullptr), touch_event_request_type_(kTouchEventRequestTypeNone), wants_wheel_events_(false), + self_visible_(false), + parent_visible_(false), is_disposed_(false) {} WebPluginContainerImpl::~WebPluginContainerImpl() { @@ -698,22 +695,21 @@ } DEFINE_TRACE(WebPluginContainerImpl) { + visitor->Trace(parent_); visitor->Trace(element_); ContextClient::Trace(visitor); PluginView::Trace(visitor); } void WebPluginContainerImpl::HandleMouseEvent(MouseEvent* event) { - DCHECK(Parent()->IsFrameView()); - // We cache the parent FrameView here as the plugin widget could be deleted // in the call to HandleEvent. See http://b/issue?id=1362948 - FrameView* parent_view = ToFrameView(Parent()); + FrameView* parent_view = parent_; // TODO(dtapuska): Move WebMouseEventBuilder into the anonymous namespace // in this class. WebMouseEventBuilder transformed_event( - ToFrameView(Parent()), LayoutItem(element_->GetLayoutObject()), *event); + parent_, LayoutItem(element_->GetLayoutObject()), *event); if (transformed_event.GetType() == WebInputEvent::kUndefined) return; @@ -758,8 +754,9 @@ WebDragOperationsMask drag_operation_mask = static_cast<WebDragOperationsMask>(data_transfer->SourceOperation()); WebPoint drag_screen_location(event->screenX(), event->screenY()); - WebPoint drag_location(event->AbsoluteLocation().X() - Location().X(), - event->AbsoluteLocation().Y() - Location().Y()); + WebPoint drag_location( + event->AbsoluteLocation().X() - frame_rect_.Location().X(), + event->AbsoluteLocation().Y() - frame_rect_.Location().Y()); web_plugin_->HandleDragStatusUpdate(drag_status, drag_data, drag_operation_mask, drag_location, @@ -769,10 +766,9 @@ void WebPluginContainerImpl::HandleWheelEvent(WheelEvent* event) { WebFloatPoint absolute_location = event->NativeEvent().PositionInRootFrame(); - FrameView* view = ToFrameView(Parent()); // Translate the root frame position to content coordinates. - if (view) { - absolute_location = view->RootFrameToContents(absolute_location); + if (parent_) { + absolute_location = parent_->RootFrameToContents(absolute_location); } IntPoint local_point = @@ -838,14 +834,12 @@ WebTouchEvent transformed_event = event->NativeEvent()->FlattenTransform(); - FrameView* view = ToFrameView(Parent()); - for (unsigned i = 0; i < transformed_event.touches_length; ++i) { WebFloatPoint absolute_location = transformed_event.touches[i].position; // Translate the root frame position to content coordinates. - if (view) { - absolute_location = view->RootFrameToContents(absolute_location); + if (parent_) { + absolute_location = parent_->RootFrameToContents(absolute_location); } IntPoint local_point = @@ -898,7 +892,7 @@ void WebPluginContainerImpl::SynthesizeMouseEventIfPossible(TouchEvent* event) { WebMouseEventBuilder web_event( - ToFrameView(Parent()), LayoutItem(element_->GetLayoutObject()), *event); + parent_, LayoutItem(element_->GetLayoutObject()), *event); if (web_event.GetType() == WebInputEvent::kUndefined) return; @@ -909,7 +903,7 @@ } void WebPluginContainerImpl::FocusPlugin() { - LocalFrame& containing_frame = ToFrameView(Parent())->GetFrame(); + LocalFrame& containing_frame = parent_->GetFrame(); if (Page* current_page = containing_frame.GetPage()) current_page->GetFocusController().SetFocusedElement(element_, &containing_frame); @@ -951,7 +945,7 @@ LayoutBox* box = ToLayoutBox(owner_element->GetLayoutObject()); - // Note: frameRect() for this plugin is equal to contentBoxRect, mapped to the + // Note: FrameRect() for this plugin is equal to contentBoxRect, mapped to the // containing view space, and rounded off. // See LayoutPart.cpp::updateGeometryInternal. To remove the lossy // effect of rounding off, use contentBoxRect directly. @@ -960,13 +954,13 @@ // The frameRect is already in absolute space of the local frame to the // plugin. - window_rect = FrameRect(); + window_rect = frame_rect_; // Map up to the root frame. LayoutRect layout_window_rect = LayoutRect(element_->GetDocument() .View() ->GetLayoutViewItem() - .LocalToAbsoluteQuad(FloatQuad(FloatRect(FrameRect())), + .LocalToAbsoluteQuad(FloatQuad(FloatRect(frame_rect_)), kTraverseDocumentBoundaries) .BoundingBox()); // Finally, adjust for scrolling of the root frame, which the above does not @@ -1010,10 +1004,10 @@ ComputeClipRectsForPlugin(element_, window_rect, clip_rect, unobscured_rect); } - GetPluginOcclusions(element_, this->Parent(), FrameRect(), cut_out_rects); + GetPluginOcclusions(element_, parent_, frame_rect_, cut_out_rects); // Convert to the plugin position. for (size_t i = 0; i < cut_out_rects.size(); i++) - cut_out_rects[i].Move(-FrameRect().X(), -FrameRect().Y()); + cut_out_rects[i].Move(-frame_rect_.X(), -frame_rect_.Y()); } } // namespace blink
diff --git a/third_party/WebKit/Source/web/WebPluginContainerImpl.h b/third_party/WebKit/Source/web/WebPluginContainerImpl.h index 1e01c54..34d3abd 100644 --- a/third_party/WebKit/Source/web/WebPluginContainerImpl.h +++ b/third_party/WebKit/Source/web/WebPluginContainerImpl.h
@@ -34,7 +34,7 @@ #include "core/dom/ContextLifecycleObserver.h" #include "core/plugins/PluginView.h" -#include "platform/FrameViewBase.h" +#include "platform/heap/Handle.h" #include "platform/wtf/Compiler.h" #include "platform/wtf/PassRefPtr.h" #include "platform/wtf/Vector.h" @@ -59,7 +59,8 @@ struct WebPrintPresetOptions; class WEB_EXPORT WebPluginContainerImpl final - : public PluginView, + : public GarbageCollectedFinalized<WebPluginContainerImpl>, + public PluginView, NON_EXPORTED_BASE(public WebPluginContainer), public ContextClient { USING_GARBAGE_COLLECTED_MIXIN(WebPluginContainerImpl); @@ -70,8 +71,12 @@ WebPlugin* web_plugin) { return new WebPluginContainerImpl(element, web_plugin); } + ~WebPluginContainerImpl() override; // PluginView methods + void SetParent(FrameView*) override; + FrameView* Parent() const override { return parent_; }; + void SetParentVisible(bool) override; WebLayer* PlatformLayer() const override; v8::Local<v8::Object> ScriptableObject(v8::Isolate*) override; bool SupportsKeyboardFocus() const override; @@ -80,21 +85,23 @@ bool WantsWheelEvents() override; void UpdateAllLifecyclePhases() override; void InvalidatePaintIfNeeded() override { IssuePaintInvalidations(); } - - // FrameViewBase methods - void SetFrameRect(const IntRect&) override; - void Paint(GraphicsContext&, const CullRect&) const override; - void InvalidateRect(const IntRect&) override; + void InvalidateRect(const IntRect&); void SetFocused(bool, WebFocusType) override; - void Show() override; - void Hide() override; void HandleEvent(Event*) override; void FrameRectsChanged() override; - void SetParentVisible(bool) override; void GeometryMayHaveChanged() override; bool IsPluginContainer() const override { return true; } void EventListenersRemoved() override; + // FrameOrPlugin methods + void SetFrameRect(const IntRect& frame_rect) override { + frame_rect_ = frame_rect; + } + const IntRect& FrameRect() const override { return frame_rect_; } + void Paint(GraphicsContext&, const CullRect&) const override; + void Show() override; + void Hide() override; + // WebPluginContainer methods WebElement GetElement() override; WebDocument GetDocument() override; @@ -182,7 +189,6 @@ IntRect& unclipped_int_local_rect) const; WebPluginContainerImpl(HTMLPlugInElement*, WebPlugin*); - ~WebPluginContainerImpl() override; void HandleMouseEvent(MouseEvent*); void HandleDragEvent(MouseEvent*); @@ -206,24 +212,24 @@ friend class WebPluginContainerTest; + Member<FrameView> parent_; Member<HTMLPlugInElement> element_; WebPlugin* web_plugin_; - WebLayer* web_layer_; - + IntRect frame_rect_; IntRect pending_invalidation_rect_; - TouchEventRequestType touch_event_request_type_; bool wants_wheel_events_; - + bool self_visible_; + bool parent_visible_; bool is_disposed_; }; DEFINE_TYPE_CASTS(WebPluginContainerImpl, - FrameViewBase, - frameViewBase, - frameViewBase->IsPluginContainer(), - frameViewBase.IsPluginContainer()); + PluginView, + plugin, + plugin->IsPluginContainer(), + plugin.IsPluginContainer()); // Unlike FrameViewBase, we need not worry about object type for container. // WebPluginContainerImpl is the only subclass of WebPluginContainer. DEFINE_TYPE_CASTS(WebPluginContainerImpl,
diff --git a/third_party/WebKit/public/BUILD.gn b/third_party/WebKit/public/BUILD.gn index 6766533a..fbc3128 100644 --- a/third_party/WebKit/public/BUILD.gn +++ b/third_party/WebKit/public/BUILD.gn
@@ -190,9 +190,7 @@ "platform/WebFocusType.h", "platform/WebFont.h", "platform/WebFontDescription.h", - "platform/WebGamepad.h", "platform/WebGamepadListener.h", - "platform/WebGamepads.h", "platform/WebGestureCurve.h", "platform/WebGestureCurveTarget.h", "platform/WebGestureDevice.h",
diff --git a/third_party/WebKit/public/platform/Platform.h b/third_party/WebKit/public/platform/Platform.h index eab1ca5..28b05e6 100644 --- a/third_party/WebKit/public/platform/Platform.h +++ b/third_party/WebKit/public/platform/Platform.h
@@ -43,7 +43,6 @@ #include "WebDeviceLightListener.h" #include "WebFeaturePolicy.h" #include "WebGamepadListener.h" -#include "WebGamepads.h" #include "WebGestureDevice.h" #include "WebLocalizedString.h" #include "WebMessagePortChannel.h" @@ -60,6 +59,10 @@ #include "cc/surfaces/frame_sink_id.h" #include "mojo/public/cpp/system/message_pipe.h" +namespace device { +class Gamepads; +} + namespace gpu { class GpuMemoryBufferManager; } @@ -280,7 +283,7 @@ // Gamepad ------------------------------------------------------------- - virtual void SampleGamepads(WebGamepads& into) {} + virtual void SampleGamepads(device::Gamepads& into) {} // History -------------------------------------------------------------
diff --git a/third_party/WebKit/public/platform/WebGamepad.h b/third_party/WebKit/public/platform/WebGamepad.h deleted file mode 100644 index 72f1d67..0000000 --- a/third_party/WebKit/public/platform/WebGamepad.h +++ /dev/null
@@ -1,137 +0,0 @@ -// Copyright (C) 2011, 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: -// -// 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 APPLE INC. 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 APPLE INC. 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. - -#ifndef WebGamepad_h -#define WebGamepad_h - -#include "WebCommon.h" - -namespace blink { - -#pragma pack(push, 4) - -class WebGamepadButton { - public: - WebGamepadButton() : pressed(false), touched(false), value(0.) {} - WebGamepadButton(bool pressed, bool touched, double value) - : pressed(pressed), touched(touched), value(value) {} - bool pressed; - bool touched; - double value; -}; - -class WebGamepadVector { - public: - WebGamepadVector() : not_null(false) {} - - bool not_null; - float x, y, z; -}; - -class WebGamepadQuaternion { - public: - WebGamepadQuaternion() : not_null(false) {} - - bool not_null; - float x, y, z, w; -}; - -class WebGamepadPose { - public: - WebGamepadPose() : not_null(false) {} - - bool not_null; - - bool has_orientation; - bool has_position; - - WebGamepadQuaternion orientation; - WebGamepadVector position; - WebGamepadVector angular_velocity; - WebGamepadVector linear_velocity; - WebGamepadVector angular_acceleration; - WebGamepadVector linear_acceleration; -}; - -enum WebGamepadHand { - kGamepadHandNone = 0, - kGamepadHandLeft = 1, - kGamepadHandRight = 2 -}; - -// This structure is intentionally POD and fixed size so that it can be shared -// memory between hardware polling threads and the rest of the browser. See -// also WebGamepads.h. -class WebGamepad { - public: - static const size_t kIdLengthCap = 128; - static const size_t kMappingLengthCap = 16; - static const size_t kAxesLengthCap = 16; - static const size_t kButtonsLengthCap = 32; - - WebGamepad() - : connected(false), - timestamp(0), - axes_length(0), - buttons_length(0), - display_id(0) { - id[0] = 0; - mapping[0] = 0; - } - - // Is there a gamepad connected at this index? - bool connected; - - // Device identifier (based on manufacturer, model, etc.). - WebUChar id[kIdLengthCap]; - - // Monotonically increasing value referring to when the data were last - // updated. - unsigned long long timestamp; - - // Number of valid entries in the axes array. - unsigned axes_length; - - // Normalized values representing axes, in the range [-1..1]. - double axes[kAxesLengthCap]; - - // Number of valid entries in the buttons array. - unsigned buttons_length; - - // Button states - WebGamepadButton buttons[kButtonsLengthCap]; - - // Mapping type (for example "standard") - WebUChar mapping[kMappingLengthCap]; - - WebGamepadPose pose; - - WebGamepadHand hand; - - unsigned display_id; -}; - -#pragma pack(pop) -} - -#endif // WebGamepad_h
diff --git a/third_party/WebKit/public/platform/WebGamepadListener.h b/third_party/WebKit/public/platform/WebGamepadListener.h index f2fbffc..75016fa8 100644 --- a/third_party/WebKit/public/platform/WebGamepadListener.h +++ b/third_party/WebKit/public/platform/WebGamepadListener.h
@@ -7,14 +7,16 @@ #include "WebPlatformEventListener.h" -namespace blink { +namespace device { +class Gamepad; +} -class WebGamepad; +namespace blink { class WebGamepadListener : public WebPlatformEventListener { public: - virtual void DidConnectGamepad(unsigned index, const WebGamepad&) = 0; - virtual void DidDisconnectGamepad(unsigned index, const WebGamepad&) = 0; + virtual void DidConnectGamepad(unsigned index, const device::Gamepad&) = 0; + virtual void DidDisconnectGamepad(unsigned index, const device::Gamepad&) = 0; protected: virtual ~WebGamepadListener() {}
diff --git a/third_party/WebKit/public/platform/WebGamepads.h b/third_party/WebKit/public/platform/WebGamepads.h deleted file mode 100644 index 75d8942..0000000 --- a/third_party/WebKit/public/platform/WebGamepads.h +++ /dev/null
@@ -1,47 +0,0 @@ -// Copyright (C) 2011, 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: -// -// 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 APPLE INC. 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 APPLE INC. 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. - -#ifndef WebGamepads_h -#define WebGamepads_h - -#include "WebGamepad.h" - -#pragma pack(push, 4) - -namespace blink { - -// This structure is intentionally POD and fixed size so that it can be stored -// in shared memory between hardware polling threads and the rest of the -// browser. -class WebGamepads { - public: - static const size_t kItemsLengthCap = 4; - - // Gamepad data for N separate gamepad devices. - WebGamepad items[kItemsLengthCap]; -}; - -#pragma pack(pop) -} - -#endif // WebGamepads_h
diff --git a/third_party/closure_compiler/externs/bookmark_manager_private.js b/third_party/closure_compiler/externs/bookmark_manager_private.js index e59da2b7a..d62688cc 100644 --- a/third_party/closure_compiler/externs/bookmark_manager_private.js +++ b/third_party/closure_compiler/externs/bookmark_manager_private.js
@@ -111,12 +111,6 @@ chrome.bookmarkManagerPrivate.canEdit = function(callback) {}; /** - * Whether bookmarks can be opened in new windows - * @param {Function} callback - */ -chrome.bookmarkManagerPrivate.canOpenNewWindows = function(callback) {}; - -/** * Recursively removes list of bookmarks nodes. * @param {Array} idList An array of string-valued ids * @param {Function=} callback
diff --git a/tools/android/eclipse/.classpath b/tools/android/eclipse/.classpath index f3f4661..91700431 100644 --- a/tools/android/eclipse/.classpath +++ b/tools/android/eclipse/.classpath
@@ -56,6 +56,7 @@ <classpathentry kind="src" path="components/location/android/java/src"/> <classpathentry kind="src" path="components/navigation_interception/android/java/src"/> <classpathentry kind="src" path="components/ntp_tiles/android/java/src"/> + <classpathentry kind="src" path="components/offline_items_collection/core/android/java/src"/> <classpathentry kind="src" path="components/payments/content/android/java/src"/> <classpathentry kind="src" path="components/policy/android/java/src"/> <classpathentry kind="src" path="components/precache/android/java/src"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index d88b5df2..bbe30331 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -81712,6 +81712,14 @@ </summary> </histogram> +<histogram name="WinJumplist.DeleteDirectoryContentDuration" units="ms"> + <owner>chengx@chromium.org</owner> + <summary> + Time spent in DeleteDirectoryContentAndLogResults(). This method is to + delete the icon files in JumpListIcons folder. + </summary> +</histogram> + <histogram name="WinJumplist.DeleteStatusJumpListIcons" enum="JumplisticonsDeleteCategory"> <owner>chengx@chromium.org</owner> @@ -92101,7 +92109,7 @@ <int value="239" label="DOWNLOADS_SEARCH"/> <int value="240" label="FONTSETTINGS_CLEARFONT"/> <int value="241" label="WINDOWS_UPDATE"/> - <int value="242" label="BOOKMARKMANAGERPRIVATE_CANOPENNEWWINDOWS"/> + <int value="242" label="DELETED_BOOKMARKMANAGERPRIVATE_CANOPENNEWWINDOWS"/> <int value="243" label="SERIAL_FLUSH"/> <int value="244" label="BROWSERACTION_SETTITLE"/> <int value="245" label="BOOKMARKMANAGERPRIVATE_CANEDIT"/> @@ -103733,6 +103741,7 @@ <int value="16" label="UpdateMediaSinks"/> <int value="17" label="SearchSinks"/> <int value="18" label="ProvideSinks"/> + <int value="19" label="CreateMediaRouteController"/> </enum> <enum name="MediaRouteProviderWakeup" type="int">
diff --git a/ui/arc/notification/arc_custom_notification_item.cc b/ui/arc/notification/arc_custom_notification_item.cc index e0b0417..521145d 100644 --- a/ui/arc/notification/arc_custom_notification_item.cc +++ b/ui/arc/notification/arc_custom_notification_item.cc
@@ -102,6 +102,7 @@ pinned_ = rich_data.pinned; expand_state_ = data->expand_state; + shown_contents_ = data->shown_contents; if (!data->snapshot_image || data->snapshot_image->isNull()) { snapshot_ = gfx::ImageSkia();
diff --git a/ui/arc/notification/arc_custom_notification_item.h b/ui/arc/notification/arc_custom_notification_item.h index 3a671b9..f4ed4567 100644 --- a/ui/arc/notification/arc_custom_notification_item.h +++ b/ui/arc/notification/arc_custom_notification_item.h
@@ -53,11 +53,16 @@ mojom::ArcNotificationExpandState expand_state() const { return expand_state_; } + mojom::ArcNotificationShownContents shown_contents() const { + return shown_contents_; + } private: bool pinned_ = false; mojom::ArcNotificationExpandState expand_state_ = mojom::ArcNotificationExpandState::FIXED_SIZE; + mojom::ArcNotificationShownContents shown_contents_ = + mojom::ArcNotificationShownContents::CONTENTS_SHOWN; gfx::ImageSkia snapshot_; int window_ref_count_ = 0;
diff --git a/ui/arc/notification/arc_custom_notification_view.cc b/ui/arc/notification/arc_custom_notification_view.cc index 8afd6fb..671ead9 100644 --- a/ui/arc/notification/arc_custom_notification_view.cc +++ b/ui/arc/notification/arc_custom_notification_view.cc
@@ -13,12 +13,15 @@ #include "ui/base/resource/resource_bundle.h" #include "ui/compositor/layer_animation_observer.h" #include "ui/events/event_handler.h" +#include "ui/gfx/animation/linear_animation.h" +#include "ui/gfx/animation/tween.h" #include "ui/gfx/canvas.h" #include "ui/gfx/transform.h" #include "ui/message_center/message_center_style.h" #include "ui/message_center/views/custom_notification_view.h" #include "ui/message_center/views/toast_contents_view.h" #include "ui/strings/grit/ui_strings.h" +#include "ui/views/background.h" #include "ui/views/focus/focus_manager.h" #include "ui/views/layout/box_layout.h" #include "ui/views/painter.h" @@ -28,6 +31,22 @@ namespace arc { +namespace { + +// This value should be the same as the duration of reveal animation of +// the settings view of an Android notification. +constexpr int kBackgroundColorChangeDuration = 360; + +SkColor GetControlButtonBackgroundColor( + const mojom::ArcNotificationShownContents& shown_contents) { + if (shown_contents == mojom::ArcNotificationShownContents::CONTENTS_SHOWN) + return message_center::kControlButtonBackgroundColor; + else + return SK_ColorTRANSPARENT; +} + +} // namespace + class ArcCustomNotificationView::EventForwarder : public ui::EventHandler { public: explicit EventForwarder(ArcCustomNotificationView* owner) : owner_(owner) {} @@ -189,7 +208,12 @@ ArcCustomNotificationView::ControlButton::ControlButton( ArcCustomNotificationView* owner) - : message_center::PaddedButton(owner), owner_(owner) {} + : message_center::PaddedButton(owner), owner_(owner) { + if (!owner_->item_) { + set_background(views::Background::CreateSolidBackground( + GetControlButtonBackgroundColor(owner_->item_->shown_contents()))); + } +} void ArcCustomNotificationView::ControlButton::OnFocus() { message_center::PaddedButton::OnFocus(); @@ -240,6 +264,7 @@ void ArcCustomNotificationView::CreateCloseButton() { DCHECK(control_buttons_view_); + DCHECK(item_); close_button_ = base::MakeUnique<ControlButton>(this); close_button_->SetImage(views::CustomButton::STATE_NORMAL, @@ -254,6 +279,7 @@ void ArcCustomNotificationView::CreateSettingsButton() { DCHECK(control_buttons_view_); + DCHECK(item_); settings_button_ = new ControlButton(this); settings_button_->SetImage(views::CustomButton::STATE_NORMAL, @@ -280,7 +306,8 @@ if (item_ && item_->IsOpeningSettingsSupported()) CreateSettingsButton(); - CreateCloseButton(); + if (item_ && !item_->pinned()) + CreateCloseButton(); views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; @@ -413,6 +440,28 @@ UpdatePinnedState(); } +void ArcCustomNotificationView::StartControlButtonsColorAnimation() { + if (control_button_color_animation_) + control_button_color_animation_->End(); + control_button_color_animation_.reset(new gfx::LinearAnimation(this)); + control_button_color_animation_->SetDuration(kBackgroundColorChangeDuration); + control_button_color_animation_->Start(); +} + +bool ArcCustomNotificationView::ShouldUpdateControlButtonsColor() const { + DCHECK(item_); + + if (settings_button_ && + settings_button_->background()->get_color() != + GetControlButtonBackgroundColor(item_->shown_contents())) + return true; + if (close_button_ && + close_button_->background()->get_color() != + GetControlButtonBackgroundColor(item_->shown_contents())) + return true; + return false; +} + void ArcCustomNotificationView::ViewHierarchyChanged( const views::View::ViewHierarchyChangedDetails& details) { views::Widget* widget = GetWidget(); @@ -620,6 +669,8 @@ void ArcCustomNotificationView::OnItemUpdated() { UpdatePinnedState(); UpdateSnapshot(); + if (ShouldUpdateControlButtonsColor()) + StartControlButtonsColorAnimation(); } void ArcCustomNotificationView::OnNotificationSurfaceAdded( @@ -638,4 +689,36 @@ SetSurface(nullptr); } +void ArcCustomNotificationView::AnimationEnded( + const gfx::Animation* animation) { + DCHECK_EQ(animation, control_button_color_animation_.get()); + control_button_color_animation_.reset(); +} + +void ArcCustomNotificationView::AnimationProgressed( + const gfx::Animation* animation) { + DCHECK_EQ(animation, control_button_color_animation_.get()); + + if (item_) { + const SkColor target = + GetControlButtonBackgroundColor(item_->shown_contents()); + const SkColor start = + target == message_center::kControlButtonBackgroundColor + ? SK_ColorTRANSPARENT + : message_center::kControlButtonBackgroundColor; + const SkColor current_color = gfx::Tween::ColorValueBetween( + animation->GetCurrentValue(), start, target); + if (settings_button_) { + settings_button_->set_background( + views::Background::CreateSolidBackground(current_color)); + settings_button_->SchedulePaint(); + } + if (close_button_) { + close_button_->set_background( + views::Background::CreateSolidBackground(current_color)); + close_button_->SchedulePaint(); + } + } +} + } // namespace arc
diff --git a/ui/arc/notification/arc_custom_notification_view.h b/ui/arc/notification/arc_custom_notification_view.h index 2ecb192..0e58d7e 100644 --- a/ui/arc/notification/arc_custom_notification_view.h +++ b/ui/arc/notification/arc_custom_notification_view.h
@@ -12,6 +12,7 @@ #include "ui/arc/notification/arc_custom_notification_item.h" #include "ui/arc/notification/arc_notification_surface_manager.h" #include "ui/aura/window_observer.h" +#include "ui/gfx/animation/animation_delegate.h" #include "ui/message_center/views/custom_notification_content_view_delegate.h" #include "ui/message_center/views/padded_button.h" #include "ui/views/controls/button/button.h" @@ -21,6 +22,10 @@ class NotificationSurface; } +namespace gfx { +class LinearAnimation; +} + namespace views { class FocusTraversable; class Widget; @@ -33,7 +38,8 @@ public views::ButtonListener, public aura::WindowObserver, public ArcCustomNotificationItem::Observer, - public ArcNotificationSurfaceManager::Observer { + public ArcNotificationSurfaceManager::Observer, + public gfx::AnimationDelegate { public: explicit ArcCustomNotificationView(ArcCustomNotificationItem* item); ~ArcCustomNotificationView() override; @@ -72,6 +78,8 @@ void UpdateSnapshot(); void AttachSurface(); void ActivateToast(); + void StartControlButtonsColorAnimation(); + bool ShouldUpdateControlButtonsColor() const; // views::NativeViewHost void ViewHierarchyChanged( @@ -104,6 +112,10 @@ void OnNotificationSurfaceAdded(exo::NotificationSurface* surface) override; void OnNotificationSurfaceRemoved(exo::NotificationSurface* surface) override; + // AnimationDelegate + void AnimationEnded(const gfx::Animation* animation) override; + void AnimationProgressed(const gfx::Animation* animation) override; + ArcCustomNotificationItem* item_ = nullptr; exo::NotificationSurface* surface_ = nullptr; @@ -133,6 +145,8 @@ // Protects from call loops between Layout and OnWindowBoundsChanged. bool in_layout_ = false; + std::unique_ptr<gfx::LinearAnimation> control_button_color_animation_; + DISALLOW_COPY_AND_ASSIGN(ArcCustomNotificationView); };
diff --git a/ui/message_center/message_center_style.h b/ui/message_center/message_center_style.h index e3e245a..289903d 100644 --- a/ui/message_center/message_center_style.h +++ b/ui/message_center/message_center_style.h
@@ -96,6 +96,9 @@ const SkColor kSmallImageMaskForegroundColor = SK_ColorWHITE; // Background of small icon image. const SkColor kSmallImageMaskBackgroundColor = SkColorSetRGB(0xa3, 0xa3, 0xa3); +// Background of the close button and the settings button +const SkColor kControlButtonBackgroundColor = + SkColorSetA(SK_ColorWHITE, 0.9 * 0xff); // Limits.
diff --git a/ui/message_center/views/padded_button.cc b/ui/message_center/views/padded_button.cc index 4c73a90f..08e3e6f 100644 --- a/ui/message_center/views/padded_button.cc +++ b/ui/message_center/views/padded_button.cc
@@ -22,8 +22,8 @@ SetFocusPainter(views::Painter::CreateSolidFocusPainter( kFocusBorderColor, gfx::Insets(1, 2, 2, 2))); - set_background(views::Background::CreateSolidBackground( - SkColorSetA(SK_ColorWHITE, 0.9 * 0xff))); + set_background( + views::Background::CreateSolidBackground(kControlButtonBackgroundColor)); SetBorder(views::CreateEmptyBorder(gfx::Insets(kControlButtonBorderSize))); set_animate_on_state_change(false);
diff --git a/ui/snapshot/snapshot.cc b/ui/snapshot/snapshot.cc index aaee01f1..6e5188c2 100644 --- a/ui/snapshot/snapshot.cc +++ b/ui/snapshot/snapshot.cc
@@ -7,22 +7,40 @@ #include "base/bind.h" #include "base/callback.h" #include "base/task_runner_util.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "ui/gfx/codec/png_codec.h" #include "ui/gfx/image/image.h" +#include "ui/gfx/image/image_skia.h" +#include "ui/gfx/image/image_util.h" namespace ui { namespace { -scoped_refptr<base::RefCountedMemory> EncodeImage(const gfx::Image& image) { - return image.As1xPNGBytes(); +scoped_refptr<base::RefCountedMemory> EncodeImageAsPNG( + const gfx::Image& image) { + std::vector<uint8_t> result; + DCHECK(!image.AsImageSkia().GetRepresentation(1.0f).is_null()); + gfx::PNGCodec::FastEncodeBGRASkBitmap(image.AsBitmap(), true, &result); + return new base::RefCountedBytes(result); } -void EncodeImageAndSchedulePNGCallback( +scoped_refptr<base::RefCountedMemory> EncodeImageAsJPEG( + const gfx::Image& image) { + std::vector<uint8_t> result; + DCHECK(!image.AsImageSkia().GetRepresentation(1.0f).is_null()); + gfx::JPEG1xEncodedDataFromImage(image, 100, &result); + return new base::RefCountedBytes(result); +} + +void EncodeImageAndScheduleCallback( + scoped_refptr<base::RefCountedMemory> (*encode_func)(const gfx::Image&), scoped_refptr<base::TaskRunner> background_task_runner, - const GrabWindowSnapshotAsyncPNGCallback& callback, + const base::Callback<void(scoped_refptr<base::RefCountedMemory> data)>& + callback, const gfx::Image& image) { base::PostTaskAndReplyWithResult(background_task_runner.get(), FROM_HERE, - base::Bind(EncodeImage, image), callback); + base::Bind(encode_func, image), callback); } } // namespace @@ -34,7 +52,18 @@ const GrabWindowSnapshotAsyncPNGCallback& callback) { GrabWindowSnapshotAsync( window, source_rect, - base::Bind(EncodeImageAndSchedulePNGCallback, + base::Bind(EncodeImageAndScheduleCallback, &EncodeImageAsPNG, + std::move(background_task_runner), callback)); +} + +void GrabWindowSnapshotAsyncJPEG( + gfx::NativeWindow window, + const gfx::Rect& source_rect, + scoped_refptr<base::TaskRunner> background_task_runner, + const GrabWindowSnapshotAsyncJPEGCallback& callback) { + GrabWindowSnapshotAsync( + window, source_rect, + base::Bind(EncodeImageAndScheduleCallback, &EncodeImageAsJPEG, std::move(background_task_runner), callback)); }
diff --git a/ui/snapshot/snapshot.h b/ui/snapshot/snapshot.h index 3c83a92..31b9755a 100644 --- a/ui/snapshot/snapshot.h +++ b/ui/snapshot/snapshot.h
@@ -61,14 +61,22 @@ const gfx::Rect& source_rect, const GrabWindowSnapshotAsyncCallback& callback); -typedef base::Callback<void(scoped_refptr<base::RefCountedMemory> png_data)> - GrabWindowSnapshotAsyncPNGCallback; +using GrabWindowSnapshotAsyncPNGCallback = + base::Callback<void(scoped_refptr<base::RefCountedMemory> data)>; SNAPSHOT_EXPORT void GrabWindowSnapshotAsyncPNG( gfx::NativeWindow window, const gfx::Rect& source_rect, scoped_refptr<base::TaskRunner> background_task_runner, const GrabWindowSnapshotAsyncPNGCallback& callback); +using GrabWindowSnapshotAsyncJPEGCallback = + base::Callback<void(scoped_refptr<base::RefCountedMemory> data)>; +SNAPSHOT_EXPORT void GrabWindowSnapshotAsyncJPEG( + gfx::NativeWindow window, + const gfx::Rect& source_rect, + scoped_refptr<base::TaskRunner> background_task_runner, + const GrabWindowSnapshotAsyncJPEGCallback& callback); + } // namespace ui #endif // UI_SNAPSHOT_SNAPSHOT_H_