// If the device doesn't support the emulation element, then we
        // can't emulate it (regardless of whether the css is supported).
        if (canEmulateElement("marquee")) {
            // We can emulate the styles - check if we need to...
            DeviceElementCapability dec = deviceCapabilityManager.
                    getDeviceElementCapability("marquee", true);
            boolean supportsDisplayKeyword;
            final CSSVersion cssVersion = getCssVersion();
            if (cssVersion == null) {
                supportsDisplayKeyword = false;
            } else {
                CSSProperty display = cssVersion.getProperty(
                        StylePropertyDetails.DISPLAY);
                // In for the marquee css properties to have an effect, the
                // display must be set to marquee. If this keyword isn't
                // supported, then all marquee properties must be emulated.
                supportsDisplayKeyword = display.supportsKeyword(
                        DisplayKeywords.MCS_MARQUEE);
            }
            // The value of mcs-marquee-style determines if the other marquee
            // styles apply. So, if the mcs-marquee-style property css isn't
            // supported by the device, then we need to emulate all of the
            // others in order to display the requested marquee effects.
            boolean marqueeStyleCssSupported = supportsDisplayKeyword &&
                    cssVersion.getProperty(
                            StylePropertyDetails.MCS_MARQUEE_STYLE) != null;
            boolean behaviourSupported = CapabilitySupportLevel.FULL.equals(
                    dec.getSupportType(DeviceCapabilityConstants.MARQUEE_BEHAVIOR_ATT));
            // Emulate only if the css is not supported, and the attribute is.
            if (!marqueeStyleCssSupported && behaviourSupported) {
                // This renderer must be added before the other marquee
                // renderers; it ensures there is a marquee element, and the
                // others will not add attribute values to any other element
                AttributeAndOrElementStyleEmulationPropertyRenderer renderer =
                        new AttributeAndOrElementStyleEmulationPropertyRenderer(
                                new MarqueeEmulationRenderer(
                                        DeviceCapabilityConstants.MARQUEE_BEHAVIOR_ATT, false));
                styleEmulationPropertyRendererSelector.register(
                        StylePropertyDetails.MCS_MARQUEE_STYLE, renderer);
                // If we're going to be rendering this element, then need
                // to support it when transforming...
                fakePermittedChildren.add("marquee");
                // The rest of the marquee styles must be emulated if the
                // marquee style is emulated (and cannot be if it is not).
                // Marquee repetition.
                boolean marqueeLoopCssSupported = marqueeStyleCssSupported &&
                        (cssVersion.getProperty(
                                StylePropertyDetails.MCS_MARQUEE_REPETITION) != null);
                boolean loopSupported = CapabilitySupportLevel.FULL.equals(
                        dec.getSupportType(DeviceCapabilityConstants.MARQUEE_LOOP_ATT));
                if (!marqueeLoopCssSupported && loopSupported) {
                    AttributeAndOrElementStyleEmulationPropertyRenderer loopRenderer =
                            new AttributeAndOrElementStyleEmulationPropertyRenderer(
                                    new MarqueeEmulationAttributePropertyRenderer(
                                            DeviceCapabilityConstants.MARQUEE_LOOP_ATT, false));
                    styleEmulationPropertyRendererSelector.register(
                            StylePropertyDetails.MCS_MARQUEE_REPETITION,
                            loopRenderer);
                }
                // Marquee direction.
                boolean marqueeDirCssSupported = marqueeStyleCssSupported &&
                        (cssVersion.getProperty(StylePropertyDetails.MCS_MARQUEE_DIRECTION) != null);
                boolean directionSupported = CapabilitySupportLevel.FULL.equals(
                        dec.getSupportType(DeviceCapabilityConstants.MARQUEE_DIRECTION_ATT));
                if (!marqueeDirCssSupported && directionSupported) {
                    AttributeAndOrElementStyleEmulationPropertyRenderer dirRenderer =
                            new AttributeAndOrElementStyleEmulationPropertyRenderer(
                                    new MarqueeEmulationAttributePropertyRenderer(
                                            DeviceCapabilityConstants.MARQUEE_DIRECTION_ATT, false));
                    styleEmulationPropertyRendererSelector.register(
                            StylePropertyDetails.MCS_MARQUEE_DIRECTION, dirRenderer);
                }
                // Marquee background colour.
                if (!supportsDisplayKeyword &&
                        CapabilitySupportLevel.FULL.equals(dec.getSupportType(
                                DeviceCapabilityConstants.MARQUEE_BGCOLOR_ATT))) {
                    AttributeAndOrElementStyleEmulationPropertyRenderer bgColorRenderer
                            = new AttributeAndOrElementStyleEmulationPropertyRenderer(
                                    new MarqueeEmulationAttributePropertyRenderer(
                                            DeviceCapabilityConstants.MARQUEE_BGCOLOR_ATT, false));