зеркало из https://github.com/mozilla/gecko-dev.git
Merge m-c to inbound, a=merge
MozReview-Commit-ID: 7LPTKLiLUcj
This commit is contained in:
Коммит
5226f27e3e
|
@ -72,7 +72,7 @@
|
|||
closemenu="none"
|
||||
tabindex="0"
|
||||
tooltip="&backCmd.label;"
|
||||
onclick="document.getBindingParent(this).panelMultiView.goBack()"/>
|
||||
onclick="document.getBindingParent(this).panelMultiView.goBack(); this.blur()"/>
|
||||
<xul:label xbl:inherits="value=title"/>
|
||||
</xul:box>
|
||||
<children/>
|
||||
|
|
|
@ -107,51 +107,3 @@
|
|||
#urlbar-zoom-button > .toolbarbutton-icon {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Page action button */
|
||||
#urlbar-page-action-button {
|
||||
-moz-appearance: none;
|
||||
border-style: none;
|
||||
list-style-image: url("chrome://browser/skin/page-action.svg");
|
||||
margin: 0;
|
||||
padding: 0 6px;
|
||||
color: inherit;
|
||||
-moz-context-properties: fill;
|
||||
fill: currentColor;
|
||||
}
|
||||
|
||||
#urlbar-page-action-button > .toolbarbutton-icon {
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
#page-action-bookmark-button {
|
||||
list-style-image: url("chrome://browser/skin/bookmark-hollow.svg");
|
||||
}
|
||||
|
||||
#page-action-bookmark-button[starred] {
|
||||
list-style-image: url("chrome://browser/skin/bookmark.svg");
|
||||
}
|
||||
|
||||
#page-action-copy-url-button {
|
||||
list-style-image: url("chrome://browser/skin/link.svg");
|
||||
}
|
||||
|
||||
#page-action-email-link-button {
|
||||
list-style-image: url("chrome://browser/skin/email-link.svg");
|
||||
}
|
||||
|
||||
#page-action-send-to-device-button {
|
||||
list-style-image: url("chrome://browser/skin/device-mobile.svg");
|
||||
}
|
||||
|
||||
.page-action-sendToDevice-device[clientType=mobile] {
|
||||
list-style-image: url("chrome://browser/skin/device-mobile.svg");
|
||||
}
|
||||
|
||||
.page-action-sendToDevice-device[clientType=desktop] {
|
||||
list-style-image: url("chrome://browser/skin/device-desktop.svg");
|
||||
}
|
||||
|
||||
#page-action-sendToDevice-fxa-button {
|
||||
list-style-image: url("chrome://browser/skin/sync.svg");
|
||||
}
|
||||
|
|
|
@ -2,5 +2,5 @@
|
|||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||
<path fill="context-fill" d="M8 3.6l1 2 .5.9 1 .2 2.3.4-1.7 1.8-.7.7.1 1 .4 2.4-2-1-.9-.5-.9.5-2 1 .4-2.4.1-1-.7-.7-1.7-1.8 2.4-.4 1-.2.4-.9 1-2M8 0c-.3 0-.6.2-.8.7l-2 4.1-4.3.7c-1 .2-1.2.9-.5 1.6l3.1 3.3-.7 4.6c-.1.6.2 1 .7 1a1.421 1.421 0 0 0 .6-.2L8 13.7l3.9 2.1a2.073 2.073 0 0 0 .6.2c.5 0 .8-.4.7-1.1l-.7-4.6L15.6 7c.7-.7.4-1.4-.5-1.6l-4.3-.7-2-4.1A.938.938 0 0 0 8 0z"/>
|
||||
<path fill-opacity="context-fill-opacity" fill="context-fill" d="M8 3.6l1 2 .5.9 1 .2 2.3.4-1.7 1.8-.7.7.1 1 .4 2.4-2-1-.9-.5-.9.5-2 1 .4-2.4.1-1-.7-.7-1.7-1.8 2.4-.4 1-.2.4-.9 1-2M8 0c-.3 0-.6.2-.8.7l-2 4.1-4.3.7c-1 .2-1.2.9-.5 1.6l3.1 3.3-.7 4.6c-.1.6.2 1 .7 1a1.421 1.421 0 0 0 .6-.2L8 13.7l3.9 2.1a2.073 2.073 0 0 0 .6.2c.5 0 .8-.4.7-1.1l-.7-4.6L15.6 7c.7-.7.4-1.4-.5-1.6l-4.3-.7-2-4.1A.938.938 0 0 0 8 0z"/>
|
||||
</svg>
|
||||
|
|
До Ширина: | Высота: | Размер: 682 B После Ширина: | Высота: | Размер: 718 B |
|
@ -2,5 +2,5 @@
|
|||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||
<path fill="context-fill" d="M8.014 0c-.3 0-.6.2-.8.7l-2 4.1-4.3.7c-1 .2-1.2.9-.5 1.6l3.1 3.3-.7 4.6c-.1.6.2 1 .7 1l.6-.2 3.9-2.1 3.9 2.1.6.2c.5 0 .8-.4.7-1.1l-.7-4.6 3.1-3.3c.7-.7.4-1.4-.5-1.6l-4.3-.7-2-4.1a.9.9 0 0 0-.8-.6z"/>
|
||||
<path fill-opacity="context-fill-opacity" fill="context-fill" d="M8.014 0c-.3 0-.6.2-.8.7l-2 4.1-4.3.7c-1 .2-1.2.9-.5 1.6l3.1 3.3-.7 4.6c-.1.6.2 1 .7 1l.6-.2 3.9-2.1 3.9 2.1.6.2c.5 0 .8-.4.7-1.1l-.7-4.6 3.1-3.3c.7-.7.4-1.4-.5-1.6l-4.3-.7-2-4.1a.9.9 0 0 0-.8-.6z"/>
|
||||
</svg>
|
||||
|
|
До Ширина: | Высота: | Размер: 534 B После Ширина: | Высота: | Размер: 570 B |
|
@ -2,5 +2,5 @@
|
|||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
|
||||
<path fill="context-fill" d="M2 6a2 2 0 1 0 2 2 2 2 0 0 0-2-2zm6 0a2 2 0 1 0 2 2 2 2 0 0 0-2-2zm6 0a2 2 0 1 0 2 2 2 2 0 0 0-2-2z"/>
|
||||
<path fill-opacity="context-fill-opacity" fill="context-fill" d="M2 6a2 2 0 1 0 2 2 2 2 0 0 0-2-2zm6 0a2 2 0 1 0 2 2 2 2 0 0 0-2-2zm6 0a2 2 0 1 0 2 2 2 2 0 0 0-2-2z"/>
|
||||
</svg>
|
||||
|
|
До Ширина: | Высота: | Размер: 417 B После Ширина: | Высота: | Размер: 453 B |
|
@ -49,12 +49,10 @@ toolbar[brighttext] :-moz-any(@primaryToolbarButtons@) {
|
|||
list-style-image: url("chrome://browser/skin/home.svg");
|
||||
}
|
||||
|
||||
#star-button,
|
||||
#bookmarks-menu-button[cui-areatype="toolbar"] {
|
||||
list-style-image: url("chrome://browser/skin/bookmark-hollow.svg");
|
||||
}
|
||||
|
||||
#star-button[starred],
|
||||
#bookmarks-menu-button[cui-areatype="toolbar"][starred] {
|
||||
list-style-image: url("chrome://browser/skin/bookmark.svg");
|
||||
}
|
||||
|
|
|
@ -64,3 +64,68 @@
|
|||
-moz-appearance: none;
|
||||
}
|
||||
|
||||
%ifdef MOZ_PHOTON_THEME
|
||||
/* Page action button */
|
||||
#urlbar-page-action-button {
|
||||
-moz-appearance: none;
|
||||
border-style: none;
|
||||
list-style-image: url("chrome://browser/skin/page-action.svg");
|
||||
margin: 0;
|
||||
padding: 0 6px;
|
||||
}
|
||||
|
||||
#urlbar-page-action-button > .toolbarbutton-icon {
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
#urlbar-page-action-button,
|
||||
.urlbar-icon {
|
||||
-moz-context-properties: fill, fill-opacity;
|
||||
fill: currentColor;
|
||||
fill-opacity: 0.6;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
#star-button {
|
||||
list-style-image: url("chrome://browser/skin/bookmark-hollow.svg");
|
||||
}
|
||||
|
||||
#star-button[starred] {
|
||||
list-style-image: url("chrome://browser/skin/bookmark.svg");
|
||||
fill-opacity: 1;
|
||||
fill: var(--toolbarbutton-icon-fill-attention);
|
||||
}
|
||||
|
||||
/* Page action popup */
|
||||
#page-action-bookmark-button {
|
||||
list-style-image: url("chrome://browser/skin/bookmark-hollow.svg");
|
||||
}
|
||||
|
||||
#page-action-bookmark-button[starred] {
|
||||
list-style-image: url("chrome://browser/skin/bookmark.svg");
|
||||
}
|
||||
|
||||
#page-action-copy-url-button {
|
||||
list-style-image: url("chrome://browser/skin/link.svg");
|
||||
}
|
||||
|
||||
#page-action-email-link-button {
|
||||
list-style-image: url("chrome://browser/skin/email-link.svg");
|
||||
}
|
||||
|
||||
#page-action-send-to-device-button {
|
||||
list-style-image: url("chrome://browser/skin/device-mobile.svg");
|
||||
}
|
||||
|
||||
.page-action-sendToDevice-device[clientType=mobile] {
|
||||
list-style-image: url("chrome://browser/skin/device-mobile.svg");
|
||||
}
|
||||
|
||||
.page-action-sendToDevice-device[clientType=desktop] {
|
||||
list-style-image: url("chrome://browser/skin/device-desktop.svg");
|
||||
}
|
||||
|
||||
#page-action-sendToDevice-fxa-button {
|
||||
list-style-image: url("chrome://browser/skin/sync.svg");
|
||||
}
|
||||
%endif
|
||||
|
|
|
@ -9015,23 +9015,24 @@ nsDocument::OnPageShow(bool aPersisted,
|
|||
|
||||
UpdateVisibilityState();
|
||||
|
||||
nsCOMPtr<EventTarget> target = aDispatchStartTarget;
|
||||
if (!target) {
|
||||
target = do_QueryInterface(GetWindow());
|
||||
}
|
||||
if (!mIsBeingUsedAsImage) {
|
||||
// Dispatch observer notification to notify observers page is shown.
|
||||
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
|
||||
if (os) {
|
||||
nsIPrincipal *principal = GetPrincipal();
|
||||
os->NotifyObservers(static_cast<nsIDocument*>(this),
|
||||
nsContentUtils::IsSystemPrincipal(principal) ?
|
||||
"chrome-page-shown" :
|
||||
"content-page-shown",
|
||||
nullptr);
|
||||
}
|
||||
|
||||
// Dispatch observer notification to notify observers page is shown.
|
||||
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
|
||||
if (os) {
|
||||
nsIPrincipal *principal = GetPrincipal();
|
||||
os->NotifyObservers(static_cast<nsIDocument*>(this),
|
||||
nsContentUtils::IsSystemPrincipal(principal) ?
|
||||
"chrome-page-shown" :
|
||||
"content-page-shown",
|
||||
nullptr);
|
||||
nsCOMPtr<EventTarget> target = aDispatchStartTarget;
|
||||
if (!target) {
|
||||
target = do_QueryInterface(GetWindow());
|
||||
}
|
||||
DispatchPageTransition(target, NS_LITERAL_STRING("pageshow"), aPersisted);
|
||||
}
|
||||
|
||||
DispatchPageTransition(target, NS_LITERAL_STRING("pageshow"), aPersisted);
|
||||
}
|
||||
|
||||
static bool
|
||||
|
@ -9106,26 +9107,27 @@ nsDocument::OnPageHide(bool aPersisted,
|
|||
|
||||
ExitPointerLock();
|
||||
|
||||
// Now send out a PageHide event.
|
||||
nsCOMPtr<EventTarget> target = aDispatchStartTarget;
|
||||
if (!target) {
|
||||
target = do_QueryInterface(GetWindow());
|
||||
}
|
||||
if (!mIsBeingUsedAsImage) {
|
||||
// Dispatch observer notification to notify observers page is hidden.
|
||||
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
|
||||
if (os) {
|
||||
nsIPrincipal* principal = GetPrincipal();
|
||||
os->NotifyObservers(static_cast<nsIDocument*>(this),
|
||||
nsContentUtils::IsSystemPrincipal(principal) ?
|
||||
"chrome-page-hidden" :
|
||||
"content-page-hidden",
|
||||
nullptr);
|
||||
}
|
||||
|
||||
// Dispatch observer notification to notify observers page is hidden.
|
||||
nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
|
||||
if (os) {
|
||||
nsIPrincipal* principal = GetPrincipal();
|
||||
os->NotifyObservers(static_cast<nsIDocument*>(this),
|
||||
nsContentUtils::IsSystemPrincipal(principal) ?
|
||||
"chrome-page-hidden" :
|
||||
"content-page-hidden",
|
||||
nullptr);
|
||||
}
|
||||
|
||||
{
|
||||
PageUnloadingEventTimeStamp timeStamp(this);
|
||||
DispatchPageTransition(target, NS_LITERAL_STRING("pagehide"), aPersisted);
|
||||
// Now send out a PageHide event.
|
||||
nsCOMPtr<EventTarget> target = aDispatchStartTarget;
|
||||
if (!target) {
|
||||
target = do_QueryInterface(GetWindow());
|
||||
}
|
||||
{
|
||||
PageUnloadingEventTimeStamp timeStamp(this);
|
||||
DispatchPageTransition(target, NS_LITERAL_STRING("pagehide"), aPersisted);
|
||||
}
|
||||
}
|
||||
|
||||
mVisible = false;
|
||||
|
|
|
@ -82,7 +82,7 @@ HTTP(..) == disable-sheet-1.html disable-sheet-1-ref.html
|
|||
HTTP(..) == disable-sheet-4.html disable-sheet-4-ref.html
|
||||
skip-if(styloVsGecko) HTTP(..) == disable-sheet-5.html disable-sheet-4-ref.html
|
||||
HTTP(..) == sheet-set-base-1.html sheet-set-base-1-ref.html
|
||||
random-if(cocoaWidget) skip-if(styloVsGecko) HTTP(..) == sheet-set-switch-1.html sheet-set-switch-1-ref.html # bug 468217
|
||||
random-if(cocoaWidget) HTTP(..) == sheet-set-switch-1.html sheet-set-switch-1-ref.html # bug 468217
|
||||
skip-if(styloVsGecko) HTTP(..) == insert-rule-1a.html insert-rule-1-ref.html
|
||||
skip-if(styloVsGecko) HTTP(..) == insert-rule-1b.html insert-rule-1-ref.html
|
||||
skip-if(styloVsGecko) HTTP(..) == delete-rule-1.html delete-rule-1-ref.html
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
<!doctype html>
|
||||
<style>
|
||||
div::before {
|
||||
content: "Woof";
|
||||
}
|
||||
</style>
|
||||
<div></div>
|
|
@ -0,0 +1,14 @@
|
|||
<!doctype html>
|
||||
<style>
|
||||
div::before {
|
||||
content: none;
|
||||
}
|
||||
.foo::before {
|
||||
content: "Woof";
|
||||
}
|
||||
</style>
|
||||
<div></div>
|
||||
<script>
|
||||
document.body.offsetTop;
|
||||
document.querySelector('div').classList.add('foo');
|
||||
</script>
|
|
@ -18,3 +18,4 @@ fuzzy-if(OSX==1010,1,10) == table-ignoring-whitespace-01.html table-ignoring-whi
|
|||
fuzzy-if(OSX==1010,1,10) == table-parts-01.html table-parts-01-ref.html
|
||||
== before-style-sharing.html before-style-sharing-ref.html
|
||||
== transitive-style-invalidation.html transitive-style-invalidation-ref.html
|
||||
== dynamic-content.html dynamic-content-ref.html
|
||||
|
|
|
@ -258,6 +258,7 @@ skip-if = android_version == '18' #debug-only failure; timed out #Android 4.3 aw
|
|||
[test_pseudoelement_parsing.html]
|
||||
[test_redundant_font_download.html]
|
||||
support-files = redundant_font_download.sjs
|
||||
[test_reframe_pseudo_element.html]
|
||||
[test_rem_unit.html]
|
||||
[test_restyle_table_wrapper.html]
|
||||
[test_restyles_in_smil_animation.html]
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
<!doctype html>
|
||||
<meta charset="utf-8">
|
||||
<title>
|
||||
Test for bug 1376352: We don't reframe all the time a replaced element that
|
||||
matches generated content rules.
|
||||
</title>
|
||||
<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
|
||||
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<style>
|
||||
input::before {
|
||||
content: "Foo";
|
||||
}
|
||||
</style>
|
||||
<input type="text">
|
||||
<script>
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
const utils = SpecialPowers.getDOMWindowUtils(window);
|
||||
document.documentElement.offsetTop;
|
||||
const input = document.querySelector('input');
|
||||
|
||||
const previousConstructCount = utils.framesConstructed;
|
||||
const previousRestyleGeneration = utils.restyleGeneration;
|
||||
|
||||
input.style.color = "blue";
|
||||
|
||||
document.documentElement.offsetTop;
|
||||
isnot(previousRestyleGeneration, utils.restyleGeneration,
|
||||
"We should have restyled");
|
||||
is(previousConstructCount, utils.framesConstructed,
|
||||
"We shouldn't have reframed");
|
||||
|
||||
SimpleTest.finish();
|
||||
</script>
|
|
@ -901,6 +901,8 @@ MP4MetadataRust::GetTrackInfo(mozilla::TrackInfo::TrackType aType,
|
|||
case mp4parse_codec_VP9: codec_string = "vp9"; break;
|
||||
case mp4parse_codec_MP3: codec_string = "mp3"; break;
|
||||
case mp4parse_codec_MP4V: codec_string = "mp4v"; break;
|
||||
case mp4parse_codec_AC3: codec_string = "ac-3"; break;
|
||||
case mp4parse_codec_EC3: codec_string = "ec-3"; break;
|
||||
}
|
||||
MOZ_LOG(sLog, LogLevel::Debug, ("track codec %s (%u)\n",
|
||||
codec_string, info.codec));
|
||||
|
|
|
@ -39,6 +39,9 @@ typedef enum mp4parse_codec {
|
|||
mp4parse_codec_VP9,
|
||||
mp4parse_codec_MP3,
|
||||
mp4parse_codec_MP4V,
|
||||
mp4parse_codec_JPEG,
|
||||
mp4parse_codec_AC3,
|
||||
mp4parse_codec_EC3,
|
||||
} mp4parse_codec;
|
||||
|
||||
typedef struct mp4parse_track_info {
|
||||
|
|
|
@ -137,4 +137,9 @@ box_database!(
|
|||
OriginalFormatBox 0x66726d61, // "frma"
|
||||
MP3AudioSampleEntry 0x2e6d7033, // ".mp3" - from F4V.
|
||||
CompositionOffsetBox 0x63747473, // "ctts"
|
||||
JPEGAtom 0x6a706567, // "jpeg" - QT JPEG
|
||||
AC3SampleEntry 0x61632d33, // "ac-3"
|
||||
EC3SampleEntry 0x65632d33, // "ec-3"
|
||||
AC3SpecificBox 0x64616333, // "dac3"
|
||||
EC3SpecificBox 0x64656333, // "dec3"
|
||||
);
|
||||
|
|
|
@ -267,6 +267,8 @@ pub enum AudioCodecSpecific {
|
|||
ES_Descriptor(ES_Descriptor),
|
||||
FLACSpecificBox(FLACSpecificBox),
|
||||
OpusSpecificBox(OpusSpecificBox),
|
||||
AC3SpecificBox,
|
||||
EC3SpecificBox,
|
||||
MP3,
|
||||
}
|
||||
|
||||
|
@ -285,6 +287,7 @@ pub enum VideoCodecSpecific {
|
|||
AVCConfig(Vec<u8>),
|
||||
VPxConfig(VPxConfigBox),
|
||||
ESDSConfig(Vec<u8>),
|
||||
JPEG,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
|
@ -413,6 +416,9 @@ pub enum CodecType {
|
|||
VP8,
|
||||
EncryptedVideo,
|
||||
EncryptedAudio,
|
||||
JPEG, // QT JPEG atom
|
||||
AC3, // Digital Audio Compression (AC-3, Enhanced AC-3) Standard, ETSI TS 102 366.
|
||||
EC3, // Digital Audio Compression (AC-3, Enhanced AC-3) Standard, ETSI TS 102 366.
|
||||
}
|
||||
|
||||
impl Default for CodecType {
|
||||
|
@ -1668,6 +1674,7 @@ fn read_video_sample_entry<T: Read>(src: &mut BMFFBox<T>) -> Result<(CodecType,
|
|||
BoxType::VP8SampleEntry => CodecType::VP8,
|
||||
BoxType::VP9SampleEntry => CodecType::VP9,
|
||||
BoxType::ProtectedVisualSampleEntry => CodecType::EncryptedVideo,
|
||||
BoxType::JPEGAtom => CodecType::JPEG,
|
||||
_ => CodecType::Unknown,
|
||||
};
|
||||
|
||||
|
@ -1686,7 +1693,11 @@ fn read_video_sample_entry<T: Read>(src: &mut BMFFBox<T>) -> Result<(CodecType,
|
|||
skip(src, 50)?;
|
||||
|
||||
// Skip clap/pasp/etc. for now.
|
||||
let mut codec_specific = None;
|
||||
let mut codec_specific = if name == BoxType::JPEGAtom {
|
||||
Some(VideoCodecSpecific::JPEG)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let mut protection_info = Vec::new();
|
||||
let mut iter = src.box_iter();
|
||||
while let Some(mut b) = iter.next_box()? {
|
||||
|
@ -1723,6 +1734,11 @@ fn read_video_sample_entry<T: Read>(src: &mut BMFFBox<T>) -> Result<(CodecType,
|
|||
let esds = read_buf(&mut b.content, esds_size as usize)?;
|
||||
codec_specific = Some(VideoCodecSpecific::ESDSConfig(esds));
|
||||
}
|
||||
BoxType::JPEGAtom => {
|
||||
if name != BoxType::JPEGAtom || codec_specific.is_some() {
|
||||
return Err(Error::InvalidData("malformed video sample entry"));
|
||||
}
|
||||
}
|
||||
BoxType::ProtectionSchemeInformationBox => {
|
||||
if name != BoxType::ProtectedVisualSampleEntry {
|
||||
return Err(Error::InvalidData("malformed video sample entry"));
|
||||
|
@ -1853,6 +1869,26 @@ fn read_audio_sample_entry<T: Read>(src: &mut BMFFBox<T>) -> Result<(CodecType,
|
|||
codec_type = CodecType::EncryptedAudio;
|
||||
protection_info.push(sinf);
|
||||
}
|
||||
BoxType::AC3SpecificBox => {
|
||||
if name != BoxType::AC3SampleEntry {
|
||||
return Err(Error::InvalidData("malformed AC3 sample entry"));
|
||||
}
|
||||
// TODO: AC3SpecificBox needs to be parsed for detail information.
|
||||
skip_box_remain(&mut b)?;
|
||||
log!("(ac3)");
|
||||
codec_type = CodecType::AC3;
|
||||
codec_specific = Some(AudioCodecSpecific::AC3SpecificBox);
|
||||
}
|
||||
BoxType::EC3SpecificBox => {
|
||||
if name != BoxType::EC3SpecificBox {
|
||||
return Err(Error::InvalidData("malformed EC3 sample entry"));
|
||||
}
|
||||
// TODO: EC3SpecificBox needs to be parsed for detail information.
|
||||
skip_box_remain(&mut b)?;
|
||||
log!("(ec3)");
|
||||
codec_type = CodecType::EC3;
|
||||
codec_specific = Some(AudioCodecSpecific::EC3SpecificBox);
|
||||
}
|
||||
_ => skip_box_content(&mut b)?,
|
||||
}
|
||||
check_parser_state!(b.content);
|
||||
|
|
|
@ -900,6 +900,31 @@ fn read_esds() {
|
|||
assert_eq!(es.decoder_specific_data, aac_dc_descriptor);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn read_ac3_sample_entry() {
|
||||
let ac3 =
|
||||
vec![
|
||||
0x00, 0x00, 0x00, 0x0b, 0x64, 0x61, 0x63, 0x33, 0x10, 0x11, 0x60
|
||||
];
|
||||
|
||||
let mut stream = make_box(BoxSize::Auto, b"ac-3", |s| {
|
||||
s.append_repeated(0, 6)
|
||||
.B16(1) // data_reference_count
|
||||
.B16(0)
|
||||
.append_repeated(0, 6)
|
||||
.B16(2)
|
||||
.B16(16)
|
||||
.append_repeated(0, 4)
|
||||
.B32(48000 << 16)
|
||||
.append_bytes(ac3.as_slice())
|
||||
});
|
||||
|
||||
let mut iter = super::BoxIter::new(&mut stream);
|
||||
let mut stream = iter.next_box().unwrap().unwrap();
|
||||
let (codec_type, _) = super::read_audio_sample_entry(&mut stream)
|
||||
.expect("fail to read ac3 atom");
|
||||
assert_eq!(codec_type, super::CodecType::AC3);
|
||||
}
|
||||
#[test]
|
||||
fn read_stsd_mp4v() {
|
||||
let mp4v =
|
||||
|
@ -1011,3 +1036,38 @@ fn max_table_limit() {
|
|||
_ => panic!("expected a different error result"),
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn jpeg_video_sample_entry() {
|
||||
let jpeg = make_box(BoxSize::Auto, b"jpeg", |s| {
|
||||
s.append_repeated(0, 6)
|
||||
.B16(1)
|
||||
.append_repeated(0, 16)
|
||||
.B16(1024)
|
||||
.B16(1024)
|
||||
.append_repeated(0, 14)
|
||||
.append_repeated(0, 32)
|
||||
.append_repeated(0, 4)
|
||||
}).into_inner();
|
||||
let mut stream = make_fullbox(BoxSize::Auto, b"stsd", 0, |s| {
|
||||
s.B32(1)
|
||||
.append_bytes(jpeg.as_slice())
|
||||
});
|
||||
|
||||
let mut iter = super::BoxIter::new(&mut stream);
|
||||
let mut stream = iter.next_box().unwrap().unwrap();
|
||||
let mut track = super::Track::new(0);
|
||||
match super::read_stsd(&mut stream, &mut track) {
|
||||
Ok(sample_description) => {
|
||||
match sample_description.descriptions[0] {
|
||||
super::SampleEntry::Video(ref jpeg) => {
|
||||
assert_eq!(track.codec_type, super::CodecType::JPEG);
|
||||
assert_eq!(jpeg.height, 1024);
|
||||
assert_eq!(jpeg.width, 1024);
|
||||
} ,
|
||||
_ => {},
|
||||
}
|
||||
},
|
||||
_ => panic!("failed to parse a jpeg atom"),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,6 +60,9 @@ fn public_api() {
|
|||
assert!(!mp4v.is_empty());
|
||||
"MP4V"
|
||||
}
|
||||
mp4::VideoCodecSpecific::JPEG => {
|
||||
"JPEG"
|
||||
}
|
||||
}, "AVC");
|
||||
}
|
||||
Some(mp4::SampleEntry::Audio(a)) => {
|
||||
|
@ -99,6 +102,12 @@ fn public_api() {
|
|||
mp4::AudioCodecSpecific::MP3 => {
|
||||
"MP3"
|
||||
}
|
||||
mp4::AudioCodecSpecific::AC3SpecificBox => {
|
||||
"AC3"
|
||||
}
|
||||
mp4::AudioCodecSpecific::EC3SpecificBox => {
|
||||
"EC3"
|
||||
}
|
||||
}, "ES");
|
||||
assert!(a.samplesize > 0);
|
||||
assert!(a.samplerate > 0);
|
||||
|
|
|
@ -95,6 +95,9 @@ pub enum mp4parse_codec {
|
|||
VP9,
|
||||
MP3,
|
||||
MP4V,
|
||||
JPEG, // for QT JPEG atom in video track
|
||||
AC3,
|
||||
EC3,
|
||||
}
|
||||
|
||||
impl Default for mp4parse_codec {
|
||||
|
@ -428,6 +431,10 @@ pub unsafe extern fn mp4parse_get_track_info(parser: *mut mp4parse_parser, track
|
|||
mp4parse_codec::UNKNOWN,
|
||||
AudioCodecSpecific::MP3 =>
|
||||
mp4parse_codec::MP3,
|
||||
AudioCodecSpecific::AC3SpecificBox =>
|
||||
mp4parse_codec::AC3,
|
||||
AudioCodecSpecific::EC3SpecificBox =>
|
||||
mp4parse_codec::EC3,
|
||||
},
|
||||
Some(SampleEntry::Video(ref video)) => match video.codec_specific {
|
||||
VideoCodecSpecific::VPxConfig(_) =>
|
||||
|
@ -436,6 +443,8 @@ pub unsafe extern fn mp4parse_get_track_info(parser: *mut mp4parse_parser, track
|
|||
mp4parse_codec::AVC,
|
||||
VideoCodecSpecific::ESDSConfig(_) =>
|
||||
mp4parse_codec::MP4V,
|
||||
VideoCodecSpecific::JPEG =>
|
||||
mp4parse_codec::JPEG,
|
||||
},
|
||||
_ => mp4parse_codec::UNKNOWN,
|
||||
};
|
||||
|
@ -564,6 +573,8 @@ pub unsafe extern fn mp4parse_get_track_audio_info(parser: *mut mp4parse_parser,
|
|||
}
|
||||
}
|
||||
}
|
||||
AudioCodecSpecific::AC3SpecificBox => (),
|
||||
AudioCodecSpecific::EC3SpecificBox => (),
|
||||
AudioCodecSpecific::MP3 => (),
|
||||
}
|
||||
|
||||
|
@ -944,19 +955,9 @@ fn create_sample_table(track: &Track, track_offset_time: i64) -> Option<Vec<mp4p
|
|||
// ctts_offset is the current sample offset time.
|
||||
let ctts_offset = ctts_offset_iter.next_offset_time();
|
||||
|
||||
// ctts_offset could be negative but (decode_time + ctts_offset) should always be positive
|
||||
// value.
|
||||
let start_composition = track_time_to_us(decode_time + ctts_offset, timescale).and_then(|t| {
|
||||
if t < 0 { return None; }
|
||||
Some(t)
|
||||
});
|
||||
let start_composition = track_time_to_us(decode_time + ctts_offset, timescale);
|
||||
|
||||
// ctts_offset could be negative but (sum_delta + ctts_offset) should always be positive
|
||||
// value.
|
||||
let end_composition = track_time_to_us(sum_delta + ctts_offset, timescale).and_then(|t| {
|
||||
if t < 0 { return None; }
|
||||
Some(t)
|
||||
});
|
||||
let end_composition = track_time_to_us(sum_delta + ctts_offset, timescale);
|
||||
|
||||
let start_decode = track_time_to_us(decode_time, timescale);
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Script to update mp4parse-rust sources to latest upstream
|
||||
|
||||
# Default version.
|
||||
VER=5bff34a85f2c0b1f147798ea701f7b704e651ae8
|
||||
VER=ae58bb5063cde8018d51c1778a52392777ddb0d4
|
||||
|
||||
# Accept version or commit from the command line.
|
||||
if test -n "$1"; then
|
||||
|
|
|
@ -1149,4 +1149,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
|
|||
|
||||
static const int32_t kUnknownId = -1;
|
||||
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1507477004924000);
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1507563805584000);
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1309,8 +1309,6 @@ impl<'le> TElement for GeckoElement<'le> {
|
|||
existing_transitions: &HashMap<TransitionProperty,
|
||||
Arc<AnimationValue>>)
|
||||
-> bool {
|
||||
use properties::animated_properties::AnimatedProperty;
|
||||
|
||||
// |property| should be an animatable longhand
|
||||
let animatable_longhand = AnimatableLonghand::from_transition_property(property).unwrap();
|
||||
|
||||
|
@ -1324,10 +1322,12 @@ impl<'le> TElement for GeckoElement<'le> {
|
|||
return existing_transitions.get(property).unwrap() != &after_value;
|
||||
}
|
||||
|
||||
combined_duration > 0.0f32 &&
|
||||
AnimatedProperty::from_animatable_longhand(&animatable_longhand,
|
||||
before_change_style,
|
||||
after_change_style).does_animate()
|
||||
let from = AnimationValue::from_computed_values(&animatable_longhand,
|
||||
before_change_style);
|
||||
let to = AnimationValue::from_computed_values(&animatable_longhand,
|
||||
after_change_style);
|
||||
|
||||
combined_duration > 0.0f32 && from != to
|
||||
}
|
||||
|
||||
#[inline]
|
||||
|
|
|
@ -1576,23 +1576,30 @@ pub trait MatchMethods : TElement {
|
|||
}
|
||||
|
||||
if pseudo.map_or(false, |p| p.is_before_or_after()) {
|
||||
if (old_style_is_display_none ||
|
||||
old_values.ineffective_content_property()) &&
|
||||
(new_style_is_display_none ||
|
||||
new_values.ineffective_content_property()) {
|
||||
// The pseudo-element will remain undisplayed, so just avoid
|
||||
// triggering any change.
|
||||
return StyleDifference::new(RestyleDamage::empty(), StyleChange::Unchanged)
|
||||
let old_style_generates_no_pseudo =
|
||||
old_style_is_display_none ||
|
||||
old_values.ineffective_content_property();
|
||||
|
||||
let new_style_generates_no_pseudo =
|
||||
new_style_is_display_none ||
|
||||
new_values.ineffective_content_property();
|
||||
|
||||
if old_style_generates_no_pseudo != new_style_generates_no_pseudo {
|
||||
return StyleDifference::new(RestyleDamage::reconstruct(), StyleChange::Changed)
|
||||
}
|
||||
// FIXME(bz): This will keep reframing replaced elements. Do we
|
||||
// need this at all? Seems like if we add/remove ::before or
|
||||
// ::after styles we would get reframed over in match_pseudos and if
|
||||
// that part didn't change and we had no frame for the
|
||||
// ::before/::after then we don't care. Need to double-check that
|
||||
// we handle the "content" and "display" properties changing
|
||||
// correctly, though.
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=1376352
|
||||
return StyleDifference::new(RestyleDamage::reconstruct(), StyleChange::Changed)
|
||||
|
||||
// The pseudo-element will remain undisplayed, so just avoid
|
||||
// triggering any change.
|
||||
//
|
||||
// NOTE(emilio): We will only arrive here for pseudo-elements that
|
||||
// aren't generated (see the is_existing_before_or_after check in
|
||||
// accumulate_damage).
|
||||
//
|
||||
// However, it may be the case that the style of this element would
|
||||
// make us think we need a pseudo, but we don't, like for pseudos in
|
||||
// replaced elements, that's why we need the old != new instead of
|
||||
// just check whether the new style would generate a pseudo.
|
||||
return StyleDifference::new(RestyleDamage::empty(), StyleChange::Unchanged)
|
||||
}
|
||||
|
||||
if pseudo.map_or(false, |p| p.is_first_letter()) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче