diff --git a/DEPS b/DEPS index 9c797a9..972ee61 100644 --- a/DEPS +++ b/DEPS
@@ -105,11 +105,11 @@ # 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': '897f256413c13d932a3c6f34eebe156c96defab8', + 'skia_revision': '55b1e61684548465123e77535c2031c98b4fd66d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '4a0d5f351f8419fc0cafe7a6f622978675da7e6c', + 'v8_revision': '7399ae5da8881460b9688e81e9b4b64a5b484c53', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -117,11 +117,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '203b26f27d00e2c00e92405af4d1863187db309d', + 'angle_revision': '604d873e1df59d7767c0ad6823c50f353478122c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling build tools # and whatever else without interference from each other. - 'buildtools_revision': '691bfec9d73bfefae30bad32e7a6496f2beceb9c', + 'buildtools_revision': '0dd5c6f980d22be96b728155249df2da355989d9', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -129,7 +129,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '2daa06ab9596a42c967497c2bae16ddd902dcaf0', + 'pdfium_revision': 'b3bab6ce43cab8f4cd35e2205491c278a400d733', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -165,7 +165,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': '933672b6cfa135d177088629349ab14d2dcc363b', + 'catapult_revision': 'a1e31db3c6b70369152765f14268257cf5775c49', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -539,7 +539,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '52660b68f115ab68c31b1170f5d77bc4e2dde022', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '3fff4ff387013909c6730744773e97f991444f54', 'condition': 'checkout_linux', }, @@ -554,7 +554,7 @@ # For Linux and Chromium OS. 'src/third_party/cros_system_api': { - 'url': Var('chromium_git') + '/chromiumos/platform/system_api.git' + '@' + 'e0781f23b9e8f99f213b991bfb2e6bd2b50de82d', + 'url': Var('chromium_git') + '/chromiumos/platform/system_api.git' + '@' + '2e61850939976516c75622dc05134bac49cd24e3', 'condition': 'checkout_linux', }, @@ -564,7 +564,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '254538b955bd353e28da028e09c1f808367a4bf4', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'f12600a8ba80826493da5648ee82e2bf2e6a5782', 'src/third_party/devtools-node-modules': Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'), @@ -808,7 +808,7 @@ }, 'src/third_party/libvpx/source/libvpx': - Var('chromium_git') + '/webm/libvpx.git' + '@' + '2c45cd174a9582909ee2a7ba9cdb3feb917840cf', + Var('chromium_git') + '/webm/libvpx.git' + '@' + '3b921d49b07abd619a6fab135795c94f4ce1c7bd', 'src/third_party/libwebm/source': Var('chromium_git') + '/webm/libwebm.git' + '@' + '01c1d1d76f139345c442bfc8e61b4e1cba809059', @@ -912,7 +912,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'e0f20f1882cb7b47877ebda0d5dceb2174441745', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'ae0c5273bfa1532b5badf6f47d1ea58596c06c0d', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78', @@ -1068,7 +1068,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@e83d89c060cd9054044316926ed7353e99bda9d3', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@1d201c0289f2392b6f7cb998248e1753361b2f11', 'condition': 'checkout_src_internal', },
diff --git a/WATCHLISTS b/WATCHLISTS index 19a7517..d46b0af 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -508,6 +508,9 @@ 'blink_spv2_layout_tests': { 'filepath': 'third_party/WebKit/LayoutTests/virtual/spv2' }, + 'blink_streams': { + 'filepath': 'third_party/blink/renderer/core/streams/' + }, 'blink_style': { 'filepath': 'third_party/(WebKit|blink)/.*(style/|Style)', }, @@ -1158,9 +1161,15 @@ 'chrome/browser/ui/webui/net_internals/|' \ 'components/net_log/' }, + 'net_server': { + 'filepath': 'net/server/' + }, 'net_spdy': { 'filepath': 'net/spdy/', }, + 'net_websockets': { + 'filepath': 'net/websockets/', + }, 'netinfo': { 'filepath': '/netinfo/', }, @@ -1910,6 +1919,7 @@ 'timvolodine@chromium.org', 'xiaochengh+watch@chromium.org'], 'blink_spv2_layout_tests': ['pdr+virtualspv2watchlist@chromium.org'], + 'blink_streams': ['ricea+watch@chromium.org'], 'blink_style': ['blink-reviews-style@chromium.org'], 'blink_svg': ['dschulze@chromium.org', 'fmalita+watch@chromium.org', @@ -1929,7 +1939,8 @@ 'blink_webp': ['jzern@chromium.org', 'skal@google.com', 'urvang@chromium.org'], - 'blink_websockets': ['yhirano+watch@chromium.org'], + 'blink_websockets': ['yhirano+watch@chromium.org', + 'ricea+watch@chromium.org'], 'blink_workers': ['blink-worker-reviews@chromium.org', 'falken+watch@chromium.org', 'horo+watch@chromium.org', @@ -2193,7 +2204,9 @@ 'net_http2': ['bnc+watch@chromium.org'], 'net_log': ['bnc+watch@chromium.org', 'eroman@chromium.org'], + 'net_server': ['ricea+watch@chromium.org'], 'net_spdy': ['bnc+watch@chromium.org'], + 'net_websockets': ['ricea+watch@chromium.org'], 'netinfo': ['jkarlin+watch@chromium.org'], 'network_service': ['network-service-reviews@chromium.org'], 'nfc': ['mattreynolds+watch@chromium.org'],
diff --git a/android_webview/DEPS b/android_webview/DEPS index b130967e..0b24be7 100644 --- a/android_webview/DEPS +++ b/android_webview/DEPS
@@ -8,7 +8,7 @@ "-android_webview/lib", "+components/heap_profiling", - "+components/google/core/browser", + "+components/google/core", "+components/network_session_configurator/common", "+components/metrics", "+components/prefs",
diff --git a/android_webview/browser/aw_contents_statics.cc b/android_webview/browser/aw_contents_statics.cc index 76faeb22..1bee668 100644 --- a/android_webview/browser/aw_contents_statics.cc +++ b/android_webview/browser/aw_contents_statics.cc
@@ -11,7 +11,7 @@ #include "base/android/jni_string.h" #include "base/android/scoped_java_ref.h" #include "base/callback.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/security_interstitials/core/urls.h" #include "components/version_info/version_info.h" #include "content/public/browser/browser_thread.h"
diff --git a/android_webview/tools/system_webview_shell/test/data/webexposed/global-interface-listing-expected.txt b/android_webview/tools/system_webview_shell/test/data/webexposed/global-interface-listing-expected.txt index 3155fe8..175b408 100644 --- a/android_webview/tools/system_webview_shell/test/data/webexposed/global-interface-listing-expected.txt +++ b/android_webview/tools/system_webview_shell/test/data/webexposed/global-interface-listing-expected.txt
@@ -13,6 +13,7 @@ 'webkitIndexedDB' is deprecated. Please use 'indexedDB' instead. 'webkitURL' is deprecated. Please use 'URL' instead. interface AnalyserNode : AudioNode + attribute @@toStringTag getter fftSize getter frequencyBinCount getter maxDecibels @@ -28,10 +29,12 @@ setter minDecibels setter smoothingTimeConstant interface AnimationEvent : Event + attribute @@toStringTag getter animationName getter elapsedTime method constructor interface ApplicationCache : EventTarget + attribute @@toStringTag attribute CHECKING attribute DOWNLOADING attribute IDLE @@ -60,12 +63,14 @@ setter onprogress setter onupdateready interface ApplicationCacheErrorEvent : Event + attribute @@toStringTag getter message getter reason getter status getter url method constructor interface Attr : Node + attribute @@toStringTag getter localName getter name getter namespaceURI @@ -80,8 +85,10 @@ setter textContent setter value interface Audio + attribute @@toStringTag method constructor interface AudioBuffer + attribute @@toStringTag getter duration getter length getter numberOfChannels @@ -140,6 +147,7 @@ method suspend setter onstatechange interface AudioDestinationNode : AudioNode + attribute @@toStringTag getter maxChannelCount method constructor interface AudioListener @@ -152,6 +160,7 @@ setter dopplerFactor setter speedOfSound interface AudioNode : EventTarget + attribute @@toStringTag getter channelCount getter channelCountMode getter channelInterpretation @@ -165,6 +174,8 @@ setter channelCountMode setter channelInterpretation interface AudioParam + attribute @@toStringTag + getter automationRate getter defaultValue getter value method cancelScheduledValues @@ -176,14 +187,17 @@ method setValueCurveAtTime setter value interface AudioProcessingEvent : Event + attribute @@toStringTag getter inputBuffer getter outputBuffer getter playbackTime method constructor interface BarProp + attribute @@toStringTag getter visible method constructor interface BatteryManager : EventTarget + attribute @@toStringTag getter charging getter chargingTime getter dischargingTime @@ -198,15 +212,18 @@ setter ondischargingtimechange setter onlevelchange interface BeforeInstallPromptEvent : Event + attribute @@toStringTag getter platforms getter userChoice method constructor method prompt interface BeforeUnloadEvent : Event + attribute @@toStringTag getter returnValue method constructor setter returnValue interface BiquadFilterNode : AudioNode + attribute @@toStringTag getter Q getter detune getter frequency @@ -216,38 +233,86 @@ method getFrequencyResponse setter type interface Blob + attribute @@toStringTag getter size getter type method constructor method slice interface BlobEvent : Event + attribute @@toStringTag getter data method constructor interface CDATASection : Text + attribute @@toStringTag method constructor interface CSS + static getter paintWorklet + static method Hz + static method Q + static method ch + static method cm + static method deg + static method dpcm + static method dpi + static method dppx + static method em static method escape + static method ex + static method fr + static method grad + static method in + static method kHz + static method mm + static method ms + static method number + static method pc + static method percent + static method pt + static method px + static method rad + static method rem + static method s static method supports + static method turn + static method vh + static method vmax + static method vmin + static method vw + attribute @@toStringTag + method constructor +interface CSSConditionRule : CSSGroupingRule + attribute @@toStringTag + getter conditionText method constructor interface CSSFontFaceRule : CSSRule + attribute @@toStringTag getter style method constructor interface CSSGroupingRule : CSSRule + attribute @@toStringTag getter cssRules method constructor method deleteRule method insertRule +interface CSSImageValue : CSSStyleValue + attribute @@toStringTag + method constructor interface CSSImportRule : CSSRule + attribute @@toStringTag getter href getter media getter styleSheet method constructor + setter media interface CSSKeyframeRule : CSSRule + attribute @@toStringTag getter keyText getter style method constructor setter keyText + setter style interface CSSKeyframesRule : CSSRule + attribute @@toStringTag getter cssRules getter name method appendRule @@ -255,19 +320,108 @@ method deleteRule method findRule setter name -interface CSSMediaRule : CSSGroupingRule +interface CSSKeywordValue : CSSStyleValue + attribute @@toStringTag + getter value + method constructor + setter value +interface CSSMathInvert : CSSMathValue + attribute @@toStringTag + getter value + method constructor +interface CSSMathMax : CSSMathValue + attribute @@toStringTag + getter values + method constructor +interface CSSMathMin : CSSMathValue + attribute @@toStringTag + getter values + method constructor +interface CSSMathNegate : CSSMathValue + attribute @@toStringTag + getter value + method constructor +interface CSSMathProduct : CSSMathValue + attribute @@toStringTag + getter values + method constructor +interface CSSMathSum : CSSMathValue + attribute @@toStringTag + getter values + method constructor +interface CSSMathValue : CSSNumericValue + attribute @@toStringTag + getter operator + method constructor +interface CSSMatrixComponent : CSSTransformComponent + attribute @@toStringTag + getter matrix + method constructor + setter matrix +interface CSSMediaRule : CSSConditionRule + attribute @@toStringTag getter media method constructor + setter media interface CSSNamespaceRule : CSSRule + attribute @@toStringTag getter namespaceURI getter prefix method constructor +interface CSSNumericArray + attribute @@toStringTag + getter length + method @@iterator + method constructor + method entries + method forEach + method keys + method values +interface CSSNumericValue : CSSStyleValue + attribute @@toStringTag + method add + method constructor + method div + method equals + method max + method min + method mul + method sub + method to + method toSum + method type interface CSSPageRule : CSSRule + attribute @@toStringTag getter selectorText getter style method constructor setter selectorText + setter style +interface CSSPerspective : CSSTransformComponent + attribute @@toStringTag + getter length + method constructor + setter length +interface CSSPositionValue : CSSStyleValue + attribute @@toStringTag + getter x + getter y + method constructor + setter x + setter y +interface CSSRotate : CSSTransformComponent + attribute @@toStringTag + getter angle + getter x + getter y + getter z + method constructor + setter angle + setter x + setter y + setter z interface CSSRule + attribute @@toStringTag attribute CHARSET_RULE attribute FONT_FACE_RULE attribute IMPORT_RULE @@ -285,14 +439,44 @@ method constructor setter cssText interface CSSRuleList + attribute @@toStringTag getter length + method @@iterator method constructor method item +interface CSSScale : CSSTransformComponent + attribute @@toStringTag + getter x + getter y + getter z + method constructor + setter x + setter y + setter z +interface CSSSkew : CSSTransformComponent + attribute @@toStringTag + getter ax + getter ay + method constructor + setter ax + setter ay +interface CSSSkewX : CSSTransformComponent + attribute @@toStringTag + getter ax + method constructor + setter ax +interface CSSSkewY : CSSTransformComponent + attribute @@toStringTag + getter ay + method constructor + setter ay interface CSSStyleDeclaration + attribute @@toStringTag getter cssFloat getter cssText getter length getter parentRule + method @@iterator method constructor method getPropertyPriority method getPropertyValue @@ -302,12 +486,15 @@ setter cssFloat setter cssText interface CSSStyleRule : CSSRule + attribute @@toStringTag getter selectorText getter style + getter styleMap method constructor setter selectorText setter style interface CSSStyleSheet : StyleSheet + attribute @@toStringTag getter cssRules getter ownerRule getter rules @@ -316,16 +503,65 @@ method deleteRule method insertRule method removeRule -interface CSSSupportsRule : CSSRule - getter conditionText - getter cssRules +interface CSSStyleValue + static method parse + static method parseAll + attribute @@toStringTag method constructor - method deleteRule - method insertRule -interface CSSViewportRule : CSSRule - getter style + method toString +interface CSSSupportsRule : CSSConditionRule + attribute @@toStringTag method constructor +interface CSSTransformComponent + attribute @@toStringTag + getter is2D + method constructor + method toMatrix + method toString + setter is2D +interface CSSTransformValue : CSSStyleValue + attribute @@toStringTag + getter is2D + getter length + method @@iterator + method constructor + method entries + method forEach + method keys + method toMatrix + method values +interface CSSTranslate : CSSTransformComponent + attribute @@toStringTag + getter x + getter y + getter z + method constructor + setter x + setter y + setter z +interface CSSUnitValue : CSSNumericValue + attribute @@toStringTag + getter unit + getter value + method constructor + setter value +interface CSSUnparsedValue : CSSStyleValue + attribute @@toStringTag + getter length + method @@iterator + method constructor + method entries + method forEach + method keys + method values +interface CSSVariableReferenceValue + attribute @@toStringTag + getter fallback + getter variable + method constructor + setter variable interface Cache + attribute @@toStringTag method add method addAll method constructor @@ -335,6 +571,7 @@ method matchAll method put interface CacheStorage + attribute @@toStringTag method constructor method delete method has @@ -342,11 +579,14 @@ method match method open interface CanvasGradient + attribute @@toStringTag method addColorStop method constructor interface CanvasPattern + attribute @@toStringTag method constructor interface CanvasRenderingContext2D + attribute @@toStringTag getter canvas getter fillStyle getter font @@ -425,10 +665,14 @@ setter textAlign setter textBaseline interface ChannelMergerNode : AudioNode + attribute @@toStringTag method constructor interface ChannelSplitterNode : AudioNode + attribute @@toStringTag method constructor interface CharacterData : Node + attribute @@toStringTag + attribute @@unscopables getter data getter length getter nextElementSibling @@ -454,44 +698,54 @@ method constructor method item interface ClipboardEvent : Event + attribute @@toStringTag getter clipboardData method constructor interface CloseEvent : Event + attribute @@toStringTag getter code getter reason getter wasClean method constructor interface Comment : CharacterData + attribute @@toStringTag method constructor interface CompositionEvent : UIEvent + attribute @@toStringTag getter data method constructor method initCompositionEvent interface ConvolverNode : AudioNode + attribute @@toStringTag getter buffer getter normalize method constructor setter buffer setter normalize interface Crypto + attribute @@toStringTag getter subtle method constructor method getRandomValues interface CryptoKey + attribute @@toStringTag getter algorithm getter extractable getter type getter usages method constructor interface CustomEvent : Event + attribute @@toStringTag getter detail method constructor method initCustomEvent interface DOMError + attribute @@toStringTag getter message getter name method constructor interface DOMException + attribute @@toStringTag attribute ABORT_ERR attribute DATA_CLONE_ERR attribute DOMSTRING_SIZE_ERR @@ -523,24 +777,31 @@ method constructor method toString interface DOMImplementation + attribute @@toStringTag method constructor method createDocument method createDocumentType method createHTMLDocument method hasFeature interface DOMParser + attribute @@toStringTag method constructor method parseFromString interface DOMStringList + attribute @@toStringTag getter length + method @@iterator method constructor method contains method item interface DOMStringMap + attribute @@toStringTag method constructor interface DOMTokenList + attribute @@toStringTag getter length getter value + method @@iterator method add method constructor method contains @@ -555,6 +816,7 @@ method values setter value interface DataTransfer + attribute @@toStringTag getter dropEffect getter effectAllowed getter files @@ -568,6 +830,7 @@ setter dropEffect setter effectAllowed interface DataTransferItem + attribute @@toStringTag getter kind getter type method constructor @@ -575,7 +838,9 @@ method getAsString method webkitGetAsEntry interface DataTransferItemList + attribute @@toStringTag getter length + method @@iterator method add method clear method constructor @@ -602,21 +867,26 @@ method setUint32 method setUint8 interface DelayNode : AudioNode + attribute @@toStringTag getter delayTime method constructor interface DeviceMotionEvent : Event + attribute @@toStringTag getter acceleration getter accelerationIncludingGravity getter interval getter rotationRate method constructor interface DeviceOrientationEvent : Event + attribute @@toStringTag getter absolute getter alpha getter beta getter gamma method constructor interface Document : Node + attribute @@toStringTag + attribute @@unscopables getter URL getter activeElement getter anchors @@ -883,6 +1153,8 @@ setter xmlStandalone setter xmlVersion interface DocumentFragment : Node + attribute @@toStringTag + attribute @@unscopables getter childElementCount getter children getter firstElementChild @@ -892,15 +1164,19 @@ method querySelector method querySelectorAll interface DocumentType : Node + attribute @@toStringTag + attribute @@unscopables getter name getter publicId getter systemId method constructor method remove interface DragEvent : MouseEvent + attribute @@toStringTag getter dataTransfer method constructor interface DynamicsCompressorNode : AudioNode + attribute @@toStringTag getter attack getter knee getter ratio @@ -909,6 +1185,8 @@ getter threshold method constructor interface Element : Node + attribute @@toStringTag + attribute @@unscopables getter attributes getter childElementCount getter children @@ -1002,6 +1280,7 @@ setter scrollLeft setter scrollTop interface ErrorEvent : Event + attribute @@toStringTag getter colno getter error getter filename @@ -1009,6 +1288,7 @@ getter message method constructor interface Event + attribute @@toStringTag attribute AT_TARGET attribute BUBBLING_PHASE attribute CAPTURING_PHASE @@ -1033,6 +1313,7 @@ setter cancelBubble setter returnValue interface EventSource : EventTarget + attribute @@toStringTag attribute CLOSED attribute CONNECTING attribute OPEN @@ -1048,11 +1329,13 @@ setter onmessage setter onopen interface EventTarget + attribute @@toStringTag method addEventListener method constructor method dispatchEvent method removeEventListener interface File : Blob + attribute @@toStringTag getter lastModified getter lastModifiedDate getter name @@ -1074,10 +1357,13 @@ getter code method constructor interface FileList + attribute @@toStringTag getter length + method @@iterator method constructor method item interface FileReader : EventTarget + attribute @@toStringTag attribute DONE attribute EMPTY attribute LOADING @@ -1103,9 +1389,11 @@ setter onloadstart setter onprogress interface FocusEvent : UIEvent + attribute @@toStringTag getter relatedTarget method constructor interface FontFace + attribute @@toStringTag getter family getter featureSettings getter loaded @@ -1125,12 +1413,16 @@ setter variant setter weight interface FormData + attribute @@toStringTag + method @@iterator method append method constructor interface GainNode : AudioNode + attribute @@toStringTag getter gain method constructor interface Gamepad + attribute @@toStringTag getter axes getter buttons getter connected @@ -1140,18 +1432,23 @@ getter timestamp method constructor interface GamepadButton + attribute @@toStringTag getter pressed getter value method constructor interface GamepadEvent : Event + attribute @@toStringTag getter gamepad method constructor interface HTMLAllCollection + attribute @@toStringTag getter length + method @@iterator method constructor method item method namedItem interface HTMLAnchorElement : HTMLElement + attribute @@toStringTag getter charset getter coords getter download @@ -1200,6 +1497,7 @@ setter type setter username interface HTMLAreaElement : HTMLElement + attribute @@toStringTag getter alt getter coords getter hash @@ -1236,18 +1534,22 @@ setter target setter username interface HTMLAudioElement : HTMLMediaElement + attribute @@toStringTag method constructor interface HTMLBRElement : HTMLElement + attribute @@toStringTag getter clear method constructor setter clear interface HTMLBaseElement : HTMLElement + attribute @@toStringTag getter href getter target method constructor setter href setter target interface HTMLBodyElement : HTMLElement + attribute @@toStringTag getter aLink getter background getter bgColor @@ -1302,6 +1604,7 @@ setter text setter vLink interface HTMLButtonElement : HTMLElement + attribute @@toStringTag getter autofocus getter disabled getter form @@ -1332,6 +1635,7 @@ setter type setter value interface HTMLCanvasElement : HTMLElement + attribute @@toStringTag getter height getter width method constructor @@ -1341,31 +1645,39 @@ setter height setter width interface HTMLCollection + attribute @@toStringTag getter length + method @@iterator method constructor method item method namedItem interface HTMLContentElement : HTMLElement + attribute @@toStringTag getter select method constructor method getDistributedNodes setter select interface HTMLDListElement : HTMLElement + attribute @@toStringTag getter compact method constructor setter compact interface HTMLDataElement : HTMLElement + attribute @@toStringTag getter value method constructor setter value interface HTMLDataListElement : HTMLElement + attribute @@toStringTag getter options method constructor interface HTMLDetailsElement : HTMLElement + attribute @@toStringTag getter open method constructor setter open interface HTMLDialogElement : HTMLElement + attribute @@toStringTag getter open getter returnValue method close @@ -1375,22 +1687,17 @@ setter open setter returnValue interface HTMLDirectoryElement : HTMLElement + attribute @@toStringTag getter compact method constructor setter compact interface HTMLDivElement : HTMLElement + attribute @@toStringTag getter align method constructor setter align interface HTMLDocument : Document - getter alinkColor - getter all - getter bgColor - getter fgColor - getter linkColor - getter vlinkColor - method captureEvents - method clear + attribute @@toStringTag method constructor method releaseEvents setter alinkColor @@ -1400,6 +1707,7 @@ setter linkColor setter vlinkColor interface HTMLElement : Element + attribute @@toStringTag getter accessKey getter contentEditable getter dataset @@ -1566,6 +1874,7 @@ setter translate setter webkitdropzone interface HTMLEmbedElement : HTMLElement + attribute @@toStringTag getter align getter height getter name @@ -1581,6 +1890,7 @@ setter type setter width interface HTMLFieldSetElement : HTMLElement + attribute @@toStringTag getter disabled getter elements getter form @@ -1596,6 +1906,7 @@ setter disabled setter name interface HTMLFontElement : HTMLElement + attribute @@toStringTag getter color getter face getter size @@ -1604,9 +1915,11 @@ setter face setter size interface HTMLFormControlsCollection : HTMLCollection + attribute @@toStringTag method constructor method namedItem interface HTMLFormElement : HTMLElement + attribute @@toStringTag getter acceptCharset getter action getter autocomplete @@ -1618,6 +1931,7 @@ getter name getter noValidate getter target + method @@iterator method checkValidity method constructor method reportValidity @@ -1633,6 +1947,7 @@ setter noValidate setter target interface HTMLFrameElement : HTMLElement + attribute @@toStringTag getter contentDocument getter contentWindow getter frameBorder @@ -1653,6 +1968,7 @@ setter scrolling setter src interface HTMLFrameSetElement : HTMLElement + attribute @@toStringTag getter cols getter onbeforeunload getter onblur @@ -1699,6 +2015,7 @@ setter onunload setter rows interface HTMLHRElement : HTMLElement + attribute @@toStringTag getter align getter color getter noShade @@ -1711,16 +2028,20 @@ setter size setter width interface HTMLHeadElement : HTMLElement + attribute @@toStringTag method constructor interface HTMLHeadingElement : HTMLElement + attribute @@toStringTag getter align method constructor setter align interface HTMLHtmlElement : HTMLElement + attribute @@toStringTag getter version method constructor setter version interface HTMLIFrameElement : HTMLElement + attribute @@toStringTag getter align getter allowFullscreen getter contentDocument @@ -1753,6 +2074,7 @@ setter srcdoc setter width interface HTMLImageElement : HTMLElement + attribute @@toStringTag getter align getter alt getter border @@ -1793,6 +2115,7 @@ setter vspace setter width interface HTMLInputElement : HTMLElement + attribute @@toStringTag getter accept getter align getter alt @@ -1918,23 +2241,27 @@ setter keytype setter name interface HTMLLIElement : HTMLElement + attribute @@toStringTag getter type getter value method constructor setter type setter value interface HTMLLabelElement : HTMLElement + attribute @@toStringTag getter control getter form getter htmlFor method constructor setter htmlFor interface HTMLLegendElement : HTMLElement + attribute @@toStringTag getter align getter form method constructor setter align interface HTMLLinkElement : HTMLElement + attribute @@toStringTag getter as getter charset getter crossOrigin @@ -1967,11 +2294,13 @@ setter target setter type interface HTMLMapElement : HTMLElement + attribute @@toStringTag getter areas getter name method constructor setter name interface HTMLMarqueeElement : HTMLElement + attribute @@toStringTag getter behavior getter bgColor getter direction @@ -1998,6 +2327,7 @@ setter vspace setter width interface HTMLMediaElement : HTMLElement + attribute @@toStringTag attribute HAVE_CURRENT_DATA attribute HAVE_ENOUGH_DATA attribute HAVE_FUTURE_DATA @@ -2058,10 +2388,12 @@ setter src setter volume interface HTMLMenuElement : HTMLElement + attribute @@toStringTag getter compact method constructor setter compact interface HTMLMetaElement : HTMLElement + attribute @@toStringTag getter content getter httpEquiv getter name @@ -2072,6 +2404,7 @@ setter name setter scheme interface HTMLMeterElement : HTMLElement + attribute @@toStringTag getter high getter labels getter low @@ -2087,12 +2420,14 @@ setter optimum setter value interface HTMLModElement : HTMLElement + attribute @@toStringTag getter cite getter dateTime method constructor setter cite setter dateTime interface HTMLOListElement : HTMLElement + attribute @@toStringTag getter compact getter reversed getter start @@ -2103,6 +2438,7 @@ setter start setter type interface HTMLObjectElement : HTMLElement + attribute @@toStringTag getter align getter archive getter border @@ -2146,12 +2482,14 @@ setter vspace setter width interface HTMLOptGroupElement : HTMLElement + attribute @@toStringTag getter disabled getter label method constructor setter disabled setter label interface HTMLOptionElement : HTMLElement + attribute @@toStringTag getter defaultSelected getter disabled getter form @@ -2168,8 +2506,10 @@ setter text setter value interface HTMLOptionsCollection : HTMLCollection + attribute @@toStringTag getter length getter selectedIndex + method @@iterator method add method constructor method namedItem @@ -2177,6 +2517,7 @@ setter length setter selectedIndex interface HTMLOutputElement : HTMLElement + attribute @@toStringTag getter defaultValue getter form getter htmlFor @@ -2196,10 +2537,12 @@ setter name setter value interface HTMLParagraphElement : HTMLElement + attribute @@toStringTag getter align method constructor setter align interface HTMLParamElement : HTMLElement + attribute @@toStringTag getter name getter type getter value @@ -2210,12 +2553,15 @@ setter value setter valueType interface HTMLPictureElement : HTMLElement + attribute @@toStringTag method constructor interface HTMLPreElement : HTMLElement + attribute @@toStringTag getter width method constructor setter width interface HTMLProgressElement : HTMLElement + attribute @@toStringTag getter labels getter max getter position @@ -2224,10 +2570,12 @@ setter max setter value interface HTMLQuoteElement : HTMLElement + attribute @@toStringTag getter cite method constructor setter cite interface HTMLScriptElement : HTMLElement + attribute @@toStringTag getter async getter charset getter crossOrigin @@ -2250,6 +2598,7 @@ setter text setter type interface HTMLSelectElement : HTMLElement + attribute @@toStringTag getter autofocus getter disabled getter form @@ -2267,6 +2616,7 @@ getter validity getter value getter willValidate + method @@iterator method add method checkValidity method constructor @@ -2285,9 +2635,11 @@ setter size setter value interface HTMLShadowElement : HTMLElement + attribute @@toStringTag method constructor method getDistributedNodes interface HTMLSourceElement : HTMLElement + attribute @@toStringTag getter media getter sizes getter src @@ -2300,8 +2652,10 @@ setter srcset setter type interface HTMLSpanElement : HTMLElement + attribute @@toStringTag method constructor interface HTMLStyleElement : HTMLElement + attribute @@toStringTag getter disabled getter media getter sheet @@ -2311,10 +2665,12 @@ setter media setter type interface HTMLTableCaptionElement : HTMLElement + attribute @@toStringTag getter align method constructor setter align interface HTMLTableCellElement : HTMLElement + attribute @@toStringTag getter abbr getter align getter axis @@ -2346,6 +2702,7 @@ setter vAlign setter width interface HTMLTableColElement : HTMLElement + attribute @@toStringTag getter align getter ch getter chOff @@ -2360,6 +2717,7 @@ setter vAlign setter width interface HTMLTableElement : HTMLElement + attribute @@toStringTag getter align getter bgColor getter border @@ -2397,6 +2755,7 @@ setter tHead setter width interface HTMLTableRowElement : HTMLElement + attribute @@toStringTag getter align getter bgColor getter cells @@ -2414,6 +2773,7 @@ setter chOff setter vAlign interface HTMLTableSectionElement : HTMLElement + attribute @@toStringTag getter align getter ch getter chOff @@ -2427,10 +2787,11 @@ setter chOff setter vAlign interface HTMLTemplateElement : HTMLElement + attribute @@toStringTag getter content method constructor interface HTMLTextAreaElement : HTMLElement - getter autocapitalize + attribute @@toStringTag getter autofocus getter cols getter defaultValue @@ -2486,10 +2847,12 @@ method constructor setter dateTime interface HTMLTitleElement : HTMLElement + attribute @@toStringTag getter text method constructor setter text interface HTMLTrackElement : HTMLElement + attribute @@toStringTag attribute ERROR attribute LOADED attribute LOADING @@ -2508,14 +2871,17 @@ setter src setter srclang interface HTMLUListElement : HTMLElement + attribute @@toStringTag getter compact getter type method constructor setter compact setter type interface HTMLUnknownElement : HTMLElement + attribute @@toStringTag method constructor interface HTMLVideoElement : HTMLMediaElement + attribute @@toStringTag getter height getter poster getter videoHeight @@ -2534,10 +2900,13 @@ setter poster setter width interface HashChangeEvent : Event + attribute @@toStringTag getter newURL getter oldURL method constructor interface Headers + attribute @@toStringTag + method @@iterator method append method constructor method delete @@ -2549,6 +2918,7 @@ method set method values interface History + attribute @@toStringTag getter length getter scrollRestoration getter state @@ -2560,6 +2930,7 @@ method replaceState setter scrollRestoration interface IDBCursor + attribute @@toStringTag getter direction getter key getter primaryKey @@ -2570,9 +2941,11 @@ method delete method update interface IDBCursorWithValue : IDBCursor + attribute @@toStringTag getter value method constructor interface IDBDatabase : EventTarget + attribute @@toStringTag getter name getter objectStoreNames getter onabort @@ -2590,12 +2963,14 @@ setter onerror setter onversionchange interface IDBFactory + attribute @@toStringTag method cmp method constructor method deleteDatabase method open method webkitGetDatabaseNames interface IDBIndex + attribute @@toStringTag getter keyPath getter multiEntry getter name @@ -2614,12 +2989,14 @@ static method lowerBound static method only static method upperBound + attribute @@toStringTag getter lower getter lowerOpen getter upper getter upperOpen method constructor interface IDBObjectStore + attribute @@toStringTag getter autoIncrement getter indexNames getter keyPath @@ -2640,12 +3017,14 @@ method openKeyCursor method put interface IDBOpenDBRequest : IDBRequest + attribute @@toStringTag getter onblocked getter onupgradeneeded method constructor setter onblocked setter onupgradeneeded interface IDBRequest : EventTarget + attribute @@toStringTag getter error getter onerror getter onsuccess @@ -2657,6 +3036,7 @@ setter onerror setter onsuccess interface IDBTransaction : EventTarget + attribute @@toStringTag getter db getter error getter mode @@ -2671,32 +3051,39 @@ setter oncomplete setter onerror interface IDBVersionChangeEvent : Event + attribute @@toStringTag getter dataLoss getter dataLossMessage getter newVersion getter oldVersion method constructor interface IIRFilterNode : AudioNode + attribute @@toStringTag method constructor method getFrequencyResponse interface IdleDeadline + attribute @@toStringTag getter didTimeout method constructor method timeRemaining interface Image method constructor interface ImageBitmap + attribute @@toStringTag getter height getter width method constructor interface ImageData + attribute @@toStringTag getter height getter width method constructor interface InputDeviceCapabilities + attribute @@toStringTag getter firesTouchEvents method constructor interface KeyboardEvent : UIEvent + attribute @@toStringTag attribute DOM_KEY_LOCATION_LEFT attribute DOM_KEY_LOCATION_NUMPAD attribute DOM_KEY_LOCATION_RIGHT @@ -2715,8 +3102,10 @@ method getModifierState method initKeyboardEvent interface Location + attribute @@toStringTag method constructor interface MIDIAccess : EventTarget + attribute @@toStringTag getter inputs getter onstatechange getter outputs @@ -2724,14 +3113,18 @@ method constructor setter onstatechange interface MIDIConnectionEvent : Event + attribute @@toStringTag getter port method constructor interface MIDIInput : MIDIPort + attribute @@toStringTag getter onmidimessage method constructor setter onmidimessage interface MIDIInputMap + attribute @@toStringTag getter size + method @@iterator method constructor method entries method forEach @@ -2740,14 +3133,18 @@ method keys method values interface MIDIMessageEvent : Event + attribute @@toStringTag getter data getter receivedTime method constructor interface MIDIOutput : MIDIPort + attribute @@toStringTag method constructor method send interface MIDIOutputMap + attribute @@toStringTag getter size + method @@iterator method constructor method entries method forEach @@ -2756,6 +3153,7 @@ method keys method values interface MIDIPort : EventTarget + attribute @@toStringTag getter connection getter id getter manufacturer @@ -2775,10 +3173,12 @@ getter mediaElement method constructor interface MediaEncryptedEvent : Event + attribute @@toStringTag getter initData getter initDataType method constructor interface MediaError + attribute @@toStringTag attribute MEDIA_ERR_ABORTED attribute MEDIA_ERR_DECODE attribute MEDIA_ERR_NETWORK @@ -2786,10 +3186,12 @@ getter code method constructor interface MediaKeyMessageEvent : Event + attribute @@toStringTag getter message getter messageType method constructor interface MediaKeySession : EventTarget + attribute @@toStringTag getter closed getter expiration getter keyStatuses @@ -2805,7 +3207,9 @@ setter onkeystatuseschange setter onmessage interface MediaKeyStatusMap + attribute @@toStringTag getter size + method @@iterator method constructor method entries method forEach @@ -2814,23 +3218,29 @@ method keys method values interface MediaKeySystemAccess + attribute @@toStringTag getter keySystem method constructor method createMediaKeys method getConfiguration interface MediaKeys + attribute @@toStringTag method constructor method createSession method setServerCertificate interface MediaList + attribute @@toStringTag getter length getter mediaText + method @@iterator method appendMedium method constructor method deleteMedium method item + method toString setter mediaText interface MediaQueryList : EventTarget + attribute @@toStringTag getter matches getter media getter onchange @@ -2839,11 +3249,13 @@ method removeListener setter onchange interface MediaQueryListEvent : Event + attribute @@toStringTag getter matches getter media method constructor interface MediaRecorder : EventTarget static method isTypeSupported + attribute @@toStringTag getter audioBitsPerSecond getter ignoreMutedMedia getter mimeType @@ -2871,6 +3283,7 @@ setter onstop interface MediaSource : EventTarget static method isTypeSupported + attribute @@toStringTag getter activeSourceBuffers getter duration getter readyState @@ -2881,12 +3294,14 @@ method removeSourceBuffer setter duration interface MediaStreamAudioDestinationNode : AudioNode + attribute @@toStringTag getter stream method constructor interface MediaStreamAudioSourceNode : AudioSourceNode getter mediaStream method constructor interface MediaStreamEvent : Event + attribute @@toStringTag getter stream method constructor interface MediaStreamTrack : EventTarget @@ -2909,10 +3324,12 @@ setter onmute setter onunmute interface MessageChannel + attribute @@toStringTag getter port1 getter port2 method constructor interface MessageEvent : Event + attribute @@toStringTag getter data getter lastEventId getter origin @@ -2921,6 +3338,7 @@ method constructor method initMessageEvent interface MessagePort : EventTarget + attribute @@toStringTag getter onmessage method close method constructor @@ -2928,17 +3346,21 @@ method start setter onmessage interface MimeType + attribute @@toStringTag getter description getter enabledPlugin getter suffixes getter type method constructor interface MimeTypeArray + attribute @@toStringTag getter length + method @@iterator method constructor method item method namedItem interface MouseEvent : UIEvent + attribute @@toStringTag getter altKey getter button getter buttons @@ -2967,6 +3389,7 @@ method getModifierState method initMouseEvent interface MutationEvent : Event + attribute @@toStringTag attribute ADDITION attribute MODIFICATION attribute REMOVAL @@ -2978,11 +3401,13 @@ method constructor method initMutationEvent interface MutationObserver + attribute @@toStringTag method constructor method disconnect method observe method takeRecords interface MutationRecord + attribute @@toStringTag getter addedNodes getter attributeName getter attributeNamespace @@ -2994,7 +3419,9 @@ getter type method constructor interface NamedNodeMap + attribute @@toStringTag getter length + method @@iterator method constructor method getNamedItem method getNamedItemNS @@ -3004,6 +3431,7 @@ method setNamedItem method setNamedItemNS interface Navigator + attribute @@toStringTag getter appCodeName getter appName getter appVersion @@ -3048,6 +3476,7 @@ setter onchange setter ontypechange interface Node : EventTarget + attribute @@toStringTag attribute ATTRIBUTE_NODE attribute CDATA_SECTION_NODE attribute COMMENT_NODE @@ -3116,6 +3545,7 @@ method acceptNode method constructor interface NodeIterator + attribute @@toStringTag getter filter getter pointerBeforeReferenceNode getter referenceNode @@ -3126,10 +3556,13 @@ method nextNode method previousNode interface NodeList + attribute @@toStringTag getter length + method @@iterator method constructor method item interface OfflineAudioCompletionEvent : Event + attribute @@toStringTag getter renderedBuffer method constructor interface OfflineAudioContext : AudioContext @@ -3153,9 +3586,11 @@ setter onended setter type interface PageTransitionEvent : Event + attribute @@toStringTag getter persisted method constructor interface Path2D + attribute @@toStringTag method arc method arcTo method bezierCurveTo @@ -3167,6 +3602,7 @@ method quadraticCurveTo method rect interface Performance : EventTarget + attribute @@toStringTag getter memory getter navigation getter onresourcetimingbufferfull @@ -3185,6 +3621,7 @@ method setResourceTimingBufferSize setter onresourcetimingbufferfull interface PerformanceEntry + attribute @@toStringTag getter duration getter entryType getter name @@ -3192,10 +3629,13 @@ method constructor method toJSON interface PerformanceMark : PerformanceEntry + attribute @@toStringTag method constructor interface PerformanceMeasure : PerformanceEntry + attribute @@toStringTag method constructor interface PerformanceNavigation + attribute @@toStringTag attribute TYPE_BACK_FORWARD attribute TYPE_NAVIGATE attribute TYPE_RELOAD @@ -3204,6 +3644,7 @@ getter type method constructor interface PerformanceResourceTiming : PerformanceEntry + attribute @@toStringTag getter connectEnd getter connectStart getter domainLookupEnd @@ -3220,6 +3661,7 @@ method constructor method toJSON interface PerformanceTiming + attribute @@toStringTag getter connectEnd getter connectStart getter domComplete @@ -3244,41 +3686,52 @@ method constructor method toJSON interface PeriodicWave + attribute @@toStringTag method constructor interface Plugin + attribute @@toStringTag getter description getter filename getter length getter name + method @@iterator method constructor method item method namedItem interface PluginArray + attribute @@toStringTag getter length + method @@iterator method constructor method item method namedItem method refresh interface PopStateEvent : Event + attribute @@toStringTag getter state method constructor interface ProcessingInstruction : CharacterData + attribute @@toStringTag getter sheet getter target method constructor interface ProgressEvent : Event + attribute @@toStringTag getter lengthComputable getter loaded getter total method constructor interface PromiseRejectionEvent : Event + attribute @@toStringTag getter promise getter reason method constructor interface RTCCertificate + attribute @@toStringTag getter expires method constructor interface RTCIceCandidate + attribute @@toStringTag getter candidate getter sdpMLineIndex getter sdpMid @@ -3288,6 +3741,7 @@ setter sdpMLineIndex setter sdpMid interface RTCSessionDescription + attribute @@toStringTag getter sdp getter type method constructor @@ -3295,10 +3749,12 @@ setter sdp setter type interface RadioNodeList : NodeList + attribute @@toStringTag getter value method constructor setter value interface Range + attribute @@toStringTag attribute END_TO_END attribute END_TO_START attribute START_TO_END @@ -3344,6 +3800,7 @@ method constructor method getReader interface Request + attribute @@toStringTag getter bodyUsed getter credentials getter headers @@ -3363,6 +3820,7 @@ interface Response static method error static method redirect + attribute @@toStringTag getter body getter bodyUsed getter headers @@ -3379,10 +3837,12 @@ method json method text interface SVGAElement : SVGGraphicsElement + attribute @@toStringTag getter href getter target method constructor interface SVGAngle + attribute @@toStringTag attribute SVG_ANGLETYPE_DEG attribute SVG_ANGLETYPE_GRAD attribute SVG_ANGLETYPE_RAD @@ -3399,65 +3859,81 @@ setter valueAsString setter valueInSpecifiedUnits interface SVGAnimateElement : SVGAnimationElement + attribute @@toStringTag method constructor interface SVGAnimateMotionElement : SVGAnimationElement + attribute @@toStringTag method constructor interface SVGAnimateTransformElement : SVGAnimationElement + attribute @@toStringTag method constructor interface SVGAnimatedAngle + attribute @@toStringTag getter animVal getter baseVal method constructor interface SVGAnimatedBoolean + attribute @@toStringTag getter animVal getter baseVal method constructor setter baseVal interface SVGAnimatedEnumeration + attribute @@toStringTag getter animVal getter baseVal method constructor setter baseVal interface SVGAnimatedInteger + attribute @@toStringTag getter animVal getter baseVal method constructor setter baseVal interface SVGAnimatedLength + attribute @@toStringTag getter animVal getter baseVal method constructor interface SVGAnimatedLengthList + attribute @@toStringTag getter animVal getter baseVal method constructor interface SVGAnimatedNumber + attribute @@toStringTag getter animVal getter baseVal method constructor setter baseVal interface SVGAnimatedNumberList + attribute @@toStringTag getter animVal getter baseVal method constructor interface SVGAnimatedPreserveAspectRatio + attribute @@toStringTag getter animVal getter baseVal method constructor interface SVGAnimatedRect + attribute @@toStringTag getter animVal getter baseVal method constructor interface SVGAnimatedString + attribute @@toStringTag getter animVal getter baseVal method constructor setter baseVal interface SVGAnimatedTransformList + attribute @@toStringTag getter animVal getter baseVal method constructor interface SVGAnimationElement : SVGElement + attribute @@toStringTag getter onbegin getter onend getter onrepeat @@ -3476,14 +3952,17 @@ setter onend setter onrepeat interface SVGCircleElement : SVGGeometryElement + attribute @@toStringTag getter cx getter cy getter r method constructor interface SVGClipPathElement : SVGGraphicsElement + attribute @@toStringTag getter clipPathUnits method constructor interface SVGComponentTransferFunctionElement : SVGElement + attribute @@toStringTag attribute SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE attribute SVG_FECOMPONENTTRANSFER_TYPE_GAMMA attribute SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY @@ -3499,12 +3978,16 @@ getter type method constructor interface SVGDefsElement : SVGGraphicsElement + attribute @@toStringTag method constructor interface SVGDescElement : SVGElement + attribute @@toStringTag method constructor interface SVGDiscardElement : SVGElement + attribute @@toStringTag method constructor interface SVGElement : Element + attribute @@toStringTag getter className getter offsetHeight getter offsetLeft @@ -3647,12 +4130,14 @@ setter style setter tabIndex interface SVGEllipseElement : SVGGeometryElement + attribute @@toStringTag getter cx getter cy getter rx getter ry method constructor interface SVGFEBlendElement : SVGElement + attribute @@toStringTag attribute SVG_FEBLEND_MODE_DARKEN attribute SVG_FEBLEND_MODE_LIGHTEN attribute SVG_FEBLEND_MODE_MULTIPLY @@ -3669,6 +4154,7 @@ getter y method constructor interface SVGFEColorMatrixElement : SVGElement + attribute @@toStringTag attribute SVG_FECOLORMATRIX_TYPE_HUEROTATE attribute SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA attribute SVG_FECOLORMATRIX_TYPE_MATRIX @@ -3684,6 +4170,7 @@ getter y method constructor interface SVGFEComponentTransferElement : SVGElement + attribute @@toStringTag getter height getter in1 getter result @@ -3692,6 +4179,7 @@ getter y method constructor interface SVGFECompositeElement : SVGElement + attribute @@toStringTag attribute SVG_FECOMPOSITE_OPERATOR_ARITHMETIC attribute SVG_FECOMPOSITE_OPERATOR_ATOP attribute SVG_FECOMPOSITE_OPERATOR_IN @@ -3713,6 +4201,7 @@ getter y method constructor interface SVGFEConvolveMatrixElement : SVGElement + attribute @@toStringTag attribute SVG_EDGEMODE_DUPLICATE attribute SVG_EDGEMODE_NONE attribute SVG_EDGEMODE_UNKNOWN @@ -3736,6 +4225,7 @@ getter y method constructor interface SVGFEDiffuseLightingElement : SVGElement + attribute @@toStringTag getter diffuseConstant getter height getter in1 @@ -3748,6 +4238,7 @@ getter y method constructor interface SVGFEDisplacementMapElement : SVGElement + attribute @@toStringTag attribute SVG_CHANNEL_A attribute SVG_CHANNEL_B attribute SVG_CHANNEL_G @@ -3765,10 +4256,12 @@ getter yChannelSelector method constructor interface SVGFEDistantLightElement : SVGElement + attribute @@toStringTag getter azimuth getter elevation method constructor interface SVGFEDropShadowElement : SVGElement + attribute @@toStringTag getter dx getter dy getter height @@ -3782,6 +4275,7 @@ method constructor method setStdDeviation interface SVGFEFloodElement : SVGElement + attribute @@toStringTag getter height getter result getter width @@ -3789,14 +4283,19 @@ getter y method constructor interface SVGFEFuncAElement : SVGComponentTransferFunctionElement + attribute @@toStringTag method constructor interface SVGFEFuncBElement : SVGComponentTransferFunctionElement + attribute @@toStringTag method constructor interface SVGFEFuncGElement : SVGComponentTransferFunctionElement + attribute @@toStringTag method constructor interface SVGFEFuncRElement : SVGComponentTransferFunctionElement + attribute @@toStringTag method constructor interface SVGFEGaussianBlurElement : SVGElement + attribute @@toStringTag getter height getter in1 getter result @@ -3808,6 +4307,7 @@ method constructor method setStdDeviation interface SVGFEImageElement : SVGElement + attribute @@toStringTag getter height getter href getter preserveAspectRatio @@ -3817,6 +4317,7 @@ getter y method constructor interface SVGFEMergeElement : SVGElement + attribute @@toStringTag getter height getter result getter width @@ -3824,9 +4325,11 @@ getter y method constructor interface SVGFEMergeNodeElement : SVGElement + attribute @@toStringTag getter in1 method constructor interface SVGFEMorphologyElement : SVGElement + attribute @@toStringTag attribute SVG_MORPHOLOGY_OPERATOR_DILATE attribute SVG_MORPHOLOGY_OPERATOR_ERODE attribute SVG_MORPHOLOGY_OPERATOR_UNKNOWN @@ -3841,6 +4344,7 @@ getter y method constructor interface SVGFEOffsetElement : SVGElement + attribute @@toStringTag getter dx getter dy getter height @@ -3851,11 +4355,13 @@ getter y method constructor interface SVGFEPointLightElement : SVGElement + attribute @@toStringTag getter x getter y getter z method constructor interface SVGFESpecularLightingElement : SVGElement + attribute @@toStringTag getter height getter in1 getter kernelUnitLengthX @@ -3869,6 +4375,7 @@ getter y method constructor interface SVGFESpotLightElement : SVGElement + attribute @@toStringTag getter limitingConeAngle getter pointsAtX getter pointsAtY @@ -3879,6 +4386,7 @@ getter z method constructor interface SVGFETileElement : SVGElement + attribute @@toStringTag getter height getter in1 getter result @@ -3887,6 +4395,7 @@ getter y method constructor interface SVGFETurbulenceElement : SVGElement + attribute @@toStringTag attribute SVG_STITCHTYPE_NOSTITCH attribute SVG_STITCHTYPE_STITCH attribute SVG_STITCHTYPE_UNKNOWN @@ -3906,6 +4415,7 @@ getter y method constructor interface SVGFilterElement : SVGElement + attribute @@toStringTag getter filterUnits getter height getter href @@ -3915,14 +4425,17 @@ getter y method constructor interface SVGForeignObjectElement : SVGGraphicsElement + attribute @@toStringTag getter height getter width getter x getter y method constructor interface SVGGElement : SVGGraphicsElement + attribute @@toStringTag method constructor interface SVGGeometryElement : SVGGraphicsElement + attribute @@toStringTag getter pathLength method constructor method getPointAtLength @@ -3930,6 +4443,7 @@ method isPointInFill method isPointInStroke interface SVGGradientElement : SVGElement + attribute @@toStringTag attribute SVG_SPREADMETHOD_PAD attribute SVG_SPREADMETHOD_REFLECT attribute SVG_SPREADMETHOD_REPEAT @@ -3940,6 +4454,7 @@ getter spreadMethod method constructor interface SVGGraphicsElement : SVGElement + attribute @@toStringTag getter farthestViewportElement getter nearestViewportElement getter requiredExtensions @@ -3950,6 +4465,7 @@ method getCTM method getScreenCTM interface SVGImageElement : SVGGraphicsElement + attribute @@toStringTag getter height getter href getter preserveAspectRatio @@ -3958,6 +4474,7 @@ getter y method constructor interface SVGLength + attribute @@toStringTag attribute SVG_LENGTHTYPE_CM attribute SVG_LENGTHTYPE_EMS attribute SVG_LENGTHTYPE_EXS @@ -3980,8 +4497,10 @@ setter valueAsString setter valueInSpecifiedUnits interface SVGLengthList + attribute @@toStringTag getter length getter numberOfItems + method @@iterator method appendItem method clear method constructor @@ -3991,21 +4510,25 @@ method removeItem method replaceItem interface SVGLineElement : SVGGeometryElement + attribute @@toStringTag getter x1 getter x2 getter y1 getter y2 method constructor interface SVGLinearGradientElement : SVGGradientElement + attribute @@toStringTag getter x1 getter x2 getter y1 getter y2 method constructor interface SVGMPathElement : SVGElement + attribute @@toStringTag getter href method constructor interface SVGMarkerElement : SVGElement + attribute @@toStringTag attribute SVG_MARKERUNITS_STROKEWIDTH attribute SVG_MARKERUNITS_UNKNOWN attribute SVG_MARKERUNITS_USERSPACEONUSE @@ -4025,6 +4548,7 @@ method setOrientToAngle method setOrientToAuto interface SVGMaskElement : SVGElement + attribute @@toStringTag getter height getter maskContentUnits getter maskUnits @@ -4035,6 +4559,7 @@ getter y method constructor interface SVGMatrix + attribute @@toStringTag getter a getter b getter c @@ -4060,14 +4585,18 @@ setter e setter f interface SVGMetadataElement : SVGElement + attribute @@toStringTag method constructor interface SVGNumber + attribute @@toStringTag getter value method constructor setter value interface SVGNumberList + attribute @@toStringTag getter length getter numberOfItems + method @@iterator method appendItem method clear method constructor @@ -4077,8 +4606,10 @@ method removeItem method replaceItem interface SVGPathElement : SVGGeometryElement + attribute @@toStringTag method constructor interface SVGPatternElement : SVGElement + attribute @@toStringTag getter height getter href getter patternContentUnits @@ -4093,6 +4624,7 @@ getter y method constructor interface SVGPoint + attribute @@toStringTag getter x getter y method constructor @@ -4100,8 +4632,10 @@ setter x setter y interface SVGPointList + attribute @@toStringTag getter length getter numberOfItems + method @@iterator method appendItem method clear method constructor @@ -4111,14 +4645,17 @@ method removeItem method replaceItem interface SVGPolygonElement : SVGGeometryElement + attribute @@toStringTag getter animatedPoints getter points method constructor interface SVGPolylineElement : SVGGeometryElement + attribute @@toStringTag getter animatedPoints getter points method constructor interface SVGPreserveAspectRatio + attribute @@toStringTag attribute SVG_MEETORSLICE_MEET attribute SVG_MEETORSLICE_SLICE attribute SVG_MEETORSLICE_UNKNOWN @@ -4139,6 +4676,7 @@ setter align setter meetOrSlice interface SVGRadialGradientElement : SVGGradientElement + attribute @@toStringTag getter cx getter cy getter fr @@ -4147,6 +4685,7 @@ getter r method constructor interface SVGRect + attribute @@toStringTag getter height getter width getter x @@ -4157,6 +4696,7 @@ setter x setter y interface SVGRectElement : SVGGeometryElement + attribute @@toStringTag getter height getter rx getter ry @@ -4165,6 +4705,7 @@ getter y method constructor interface SVGSVGElement : SVGGraphicsElement + attribute @@toStringTag attribute SVG_ZOOMANDPAN_DISABLE attribute SVG_ZOOMANDPAN_MAGNIFY attribute SVG_ZOOMANDPAN_UNKNOWN @@ -4204,18 +4745,23 @@ setter currentScale setter zoomAndPan interface SVGScriptElement : SVGElement + attribute @@toStringTag getter href getter type method constructor setter type interface SVGSetElement : SVGAnimationElement + attribute @@toStringTag method constructor interface SVGStopElement : SVGElement + attribute @@toStringTag getter offset method constructor interface SVGStringList + attribute @@toStringTag getter length getter numberOfItems + method @@iterator method appendItem method clear method constructor @@ -4225,6 +4771,7 @@ method removeItem method replaceItem interface SVGStyleElement : SVGElement + attribute @@toStringTag getter disabled getter media getter sheet @@ -4236,14 +4783,18 @@ setter title setter type interface SVGSwitchElement : SVGGraphicsElement + attribute @@toStringTag method constructor interface SVGSymbolElement : SVGElement + attribute @@toStringTag getter preserveAspectRatio getter viewBox method constructor interface SVGTSpanElement : SVGTextPositioningElement + attribute @@toStringTag method constructor interface SVGTextContentElement : SVGGraphicsElement + attribute @@toStringTag attribute LENGTHADJUST_SPACING attribute LENGTHADJUST_SPACINGANDGLYPHS attribute LENGTHADJUST_UNKNOWN @@ -4260,8 +4811,10 @@ method getSubStringLength method selectSubString interface SVGTextElement : SVGTextPositioningElement + attribute @@toStringTag method constructor interface SVGTextPathElement : SVGTextContentElement + attribute @@toStringTag attribute TEXTPATH_METHODTYPE_ALIGN attribute TEXTPATH_METHODTYPE_STRETCH attribute TEXTPATH_METHODTYPE_UNKNOWN @@ -4274,6 +4827,7 @@ getter startOffset method constructor interface SVGTextPositioningElement : SVGTextContentElement + attribute @@toStringTag getter dx getter dy getter rotate @@ -4281,8 +4835,10 @@ getter y method constructor interface SVGTitleElement : SVGElement + attribute @@toStringTag method constructor interface SVGTransform + attribute @@toStringTag attribute SVG_TRANSFORM_MATRIX attribute SVG_TRANSFORM_ROTATE attribute SVG_TRANSFORM_SCALE @@ -4301,8 +4857,10 @@ method setSkewY method setTranslate interface SVGTransformList + attribute @@toStringTag getter length getter numberOfItems + method @@iterator method appendItem method clear method consolidate @@ -4314,11 +4872,13 @@ method removeItem method replaceItem interface SVGUnitTypes + attribute @@toStringTag attribute SVG_UNIT_TYPE_OBJECTBOUNDINGBOX attribute SVG_UNIT_TYPE_UNKNOWN attribute SVG_UNIT_TYPE_USERSPACEONUSE method constructor interface SVGUseElement : SVGGraphicsElement + attribute @@toStringTag getter height getter href getter width @@ -4326,6 +4886,7 @@ getter y method constructor interface SVGViewElement : SVGElement + attribute @@toStringTag attribute SVG_ZOOMANDPAN_DISABLE attribute SVG_ZOOMANDPAN_MAGNIFY attribute SVG_ZOOMANDPAN_UNKNOWN @@ -4335,6 +4896,7 @@ method constructor setter zoomAndPan interface Screen + attribute @@toStringTag getter availHeight getter availLeft getter availTop @@ -4346,6 +4908,7 @@ getter width method constructor interface ScreenOrientation : EventTarget + attribute @@toStringTag getter angle getter onchange getter type @@ -4354,11 +4917,13 @@ method unlock setter onchange interface ScriptProcessorNode : AudioNode + attribute @@toStringTag getter bufferSize getter onaudioprocess method constructor setter onaudioprocess interface SecurityPolicyViolationEvent : Event + attribute @@toStringTag getter blockedURI getter columnNumber getter disposition @@ -4372,6 +4937,7 @@ getter violatedDirective method constructor interface Selection + attribute @@toStringTag getter anchorNode getter anchorOffset getter baseNode @@ -4400,6 +4966,7 @@ method setPosition method toString interface ServiceWorker : EventTarget + attribute @@toStringTag getter onerror getter onstatechange getter scriptURL @@ -4409,6 +4976,7 @@ setter onerror setter onstatechange interface ServiceWorkerContainer : EventTarget + attribute @@toStringTag getter oncontrollerchange getter onmessage getter ready @@ -4419,6 +4987,7 @@ setter oncontrollerchange setter onmessage interface ServiceWorkerRegistration : EventTarget + attribute @@toStringTag getter onupdatefound getter scope getter sync @@ -4427,6 +4996,7 @@ method update setter onupdatefound interface ShadowRoot : DocumentFragment + attribute @@toStringTag getter activeElement getter host getter innerHTML @@ -4438,6 +5008,7 @@ method getSelection setter innerHTML interface SourceBuffer : EventTarget + attribute @@toStringTag getter appendWindowEnd getter appendWindowStart getter buffered @@ -4453,9 +5024,11 @@ setter mode setter timestampOffset interface SourceBufferList : EventTarget + attribute @@toStringTag getter length method constructor interface Storage + attribute @@toStringTag getter length method clear method constructor @@ -4464,6 +5037,7 @@ method removeItem method setItem interface StorageEvent : Event + attribute @@toStringTag getter key getter newValue getter oldValue @@ -4472,6 +5046,7 @@ method constructor method initStorageEvent interface StyleSheet + attribute @@toStringTag getter disabled getter href getter media @@ -4482,10 +5057,13 @@ method constructor setter disabled interface StyleSheetList + attribute @@toStringTag getter length + method @@iterator method constructor method item interface SubtleCrypto + attribute @@toStringTag method constructor method decrypt method deriveBits @@ -4500,32 +5078,39 @@ method verify method wrapKey interface SyncManager + attribute @@toStringTag method constructor method getTags method register interface Text : CharacterData + attribute @@toStringTag getter wholeText method constructor method getDestinationInsertionPoints method splitText interface TextDecoder + attribute @@toStringTag getter encoding getter fatal getter ignoreBOM method constructor method decode interface TextEncoder + attribute @@toStringTag getter encoding method constructor method encode interface TextEvent : UIEvent + attribute @@toStringTag getter data method constructor method initTextEvent interface TextMetrics + attribute @@toStringTag getter width method constructor interface TextTrack : EventTarget + attribute @@toStringTag getter activeCues getter cues getter id @@ -4540,6 +5125,7 @@ setter mode setter oncuechange interface TextTrackCue : EventTarget + attribute @@toStringTag getter endTime getter id getter onenter @@ -4555,25 +5141,31 @@ setter pauseOnExit setter startTime interface TextTrackCueList + attribute @@toStringTag getter length + method @@iterator method constructor method getCueById interface TextTrackList : EventTarget + attribute @@toStringTag getter length getter onaddtrack getter onchange getter onremovetrack + method @@iterator method constructor method getTrackById setter onaddtrack setter onchange setter onremovetrack interface TimeRanges + attribute @@toStringTag getter length method constructor method end method start interface Touch + attribute @@toStringTag getter clientX getter clientY getter force @@ -4588,6 +5180,7 @@ getter target method constructor interface TouchEvent : UIEvent + attribute @@toStringTag getter altKey getter changedTouches getter ctrlKey @@ -4597,18 +5190,23 @@ getter touches method constructor interface TouchList + attribute @@toStringTag getter length + method @@iterator method constructor method item interface TrackEvent : Event + attribute @@toStringTag getter track method constructor interface TransitionEvent : Event + attribute @@toStringTag getter elapsedTime getter propertyName getter pseudoElement method constructor interface TreeWalker + attribute @@toStringTag getter currentNode getter filter getter root @@ -4623,6 +5221,7 @@ method previousSibling setter currentNode interface UIEvent : Event + attribute @@toStringTag getter detail getter sourceCapabilities getter view @@ -4632,6 +5231,7 @@ interface URL static method createObjectURL static method revokeObjectURL + attribute @@toStringTag getter hash getter host getter hostname @@ -4656,6 +5256,8 @@ setter search setter username interface URLSearchParams + attribute @@toStringTag + method @@iterator method append method constructor method delete @@ -4669,6 +5271,7 @@ method toString method values interface VTTCue : TextTrackCue + attribute @@toStringTag getter align getter line getter position @@ -4686,6 +5289,7 @@ setter text setter vertical interface ValidityState + attribute @@toStringTag getter badInput getter customError getter patternMismatch @@ -4699,28 +5303,36 @@ getter valueMissing method constructor interface WaveShaperNode : AudioNode + attribute @@toStringTag getter curve getter oversample method constructor setter curve setter oversample interface WebGLActiveInfo + attribute @@toStringTag getter name getter size getter type method constructor interface WebGLBuffer + attribute @@toStringTag method constructor interface WebGLContextEvent : Event + attribute @@toStringTag getter statusMessage method constructor interface WebGLFramebuffer + attribute @@toStringTag method constructor interface WebGLProgram + attribute @@toStringTag method constructor interface WebGLRenderbuffer + attribute @@toStringTag method constructor interface WebGLRenderingContext + attribute @@toStringTag attribute ACTIVE_ATTRIBUTES attribute ACTIVE_TEXTURE attribute ACTIVE_UNIFORMS @@ -5159,17 +5771,22 @@ method vertexAttribPointer method viewport interface WebGLShader + attribute @@toStringTag method constructor interface WebGLShaderPrecisionFormat + attribute @@toStringTag getter precision getter rangeMax getter rangeMin method constructor interface WebGLTexture + attribute @@toStringTag method constructor interface WebGLUniformLocation + attribute @@toStringTag method constructor interface WebKitAnimationEvent : Event + attribute @@toStringTag getter animationName getter elapsedTime method constructor @@ -5233,16 +5850,19 @@ setter m43 setter m44 interface WebKitMutationObserver + attribute @@toStringTag method constructor method disconnect method observe method takeRecords interface WebKitTransitionEvent : Event + attribute @@toStringTag getter elapsedTime getter propertyName getter pseudoElement method constructor interface WebSocket : EventTarget + attribute @@toStringTag attribute CLOSED attribute CLOSING attribute CONNECTING @@ -5266,6 +5886,7 @@ setter onmessage setter onopen interface WheelEvent : MouseEvent + attribute @@toStringTag attribute DOM_DELTA_LINE attribute DOM_DELTA_PAGE attribute DOM_DELTA_PIXEL @@ -5278,11 +5899,13 @@ getter wheelDeltaY method constructor interface Window : EventTarget + attribute @@toStringTag attribute PERSISTENT attribute TEMPORARY method constructor method toString interface Worker : EventTarget + attribute @@toStringTag getter onerror getter onmessage method constructor @@ -5291,8 +5914,10 @@ setter onerror setter onmessage interface XMLDocument : Document + attribute @@toStringTag method constructor interface XMLHttpRequest : XMLHttpRequestEventTarget + attribute @@toStringTag attribute DONE attribute HEADERS_RECEIVED attribute LOADING @@ -5323,6 +5948,7 @@ setter timeout setter withCredentials interface XMLHttpRequestEventTarget : EventTarget + attribute @@toStringTag getter onabort getter onerror getter onload @@ -5339,19 +5965,24 @@ setter onprogress setter ontimeout interface XMLHttpRequestUpload : XMLHttpRequestEventTarget + attribute @@toStringTag method constructor interface XMLSerializer + attribute @@toStringTag method constructor method serializeToString interface XPathEvaluator + attribute @@toStringTag method constructor method createExpression method createNSResolver method evaluate interface XPathExpression + attribute @@toStringTag method constructor method evaluate interface XPathResult + attribute @@toStringTag attribute ANY_TYPE attribute ANY_UNORDERED_NODE_TYPE attribute BOOLEAN_TYPE @@ -5373,6 +6004,7 @@ method iterateNext method snapshotItem interface XSLTProcessor + attribute @@toStringTag method clearParameters method constructor method getParameter @@ -5518,6 +6150,7 @@ setter oncomplete setter onerror interface webkitMediaStream : EventTarget + attribute @@toStringTag getter active getter id getter onactive @@ -5547,6 +6180,7 @@ setter oncomplete interface webkitRTCPeerConnection : EventTarget static method generateCertificate + attribute @@toStringTag getter iceConnectionState getter iceGatheringState getter localDescription @@ -5584,6 +6218,7 @@ interface webkitURL static method createObjectURL static method revokeObjectURL + attribute @@toStringTag getter hash getter host getter hostname
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 212b7e2..b54542f1 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -126,7 +126,6 @@ "assistant/ui/assistant_main_view.h", "assistant/ui/assistant_mini_view.cc", "assistant/ui/assistant_mini_view.h", - "assistant/ui/assistant_ui_constants.h", "assistant/ui/assistant_web_view.cc", "assistant/ui/assistant_web_view.h", "assistant/ui/caption_bar.cc", @@ -1329,6 +1328,7 @@ ] deps = [ "//ash/app_menu", + "//ash/assistant/ui:constants", "//ash/autoclick/common:autoclick", "//ash/components/autoclick/public/mojom", "//ash/components/cursor",
diff --git a/ash/accessibility/accessibility_controller.cc b/ash/accessibility/accessibility_controller.cc index fd1d030..db7aeb5 100644 --- a/ash/accessibility/accessibility_controller.cc +++ b/ash/accessibility/accessibility_controller.cc
@@ -434,19 +434,20 @@ if (enabled && !dialog_ever_accepted) { Shell::Get()->accelerator_controller()->MaybeShowConfirmationDialog( IDS_ASH_DICTATION_CONFIRMATION_TITLE, - IDS_ASH_DICTATION_CONFIRMATION_BODY, base::BindOnce([]() { + IDS_ASH_DICTATION_CONFIRMATION_BODY, + // Callback for if the user accepts the dialog + base::BindOnce([]() { AccessibilityController* controller = Shell::Get()->accessibility_controller(); controller->SetDictationAcceleratorDialogAccepted(); - controller->active_user_prefs_->SetBoolean( - prefs::kAccessibilityDictationEnabled, true); - controller->active_user_prefs_->CommitPendingWrite(); + // If they accept, try again to set dictation_enabled to true + controller->SetDictationEnabled(true); })); - } else { - active_user_prefs_->SetBoolean(prefs::kAccessibilityDictationEnabled, - enabled); - active_user_prefs_->CommitPendingWrite(); + return; } + active_user_prefs_->SetBoolean(prefs::kAccessibilityDictationEnabled, + enabled); + active_user_prefs_->CommitPendingWrite(); } bool AccessibilityController::IsDictationEnabled() const { @@ -820,6 +821,7 @@ UpdateAutoclickDelayFromPref(); UpdateCaretHighlightFromPref(); UpdateCursorHighlightFromPref(); + UpdateDictationFromPref(); UpdateFocusHighlightFromPref(); UpdateHighContrastFromPref(); UpdateLargeCursorFromPref();
diff --git a/ash/app_list/BUILD.gn b/ash/app_list/BUILD.gn index cad105a..50eaebd 100644 --- a/ash/app_list/BUILD.gn +++ b/ash/app_list/BUILD.gn
@@ -99,6 +99,7 @@ deps = [ "//ash/app_list/resources", "//ash/app_menu", + "//ash/assistant/ui:constants", "//ash/public/cpp/app_list/vector_icons", "//base", "//base:i18n",
diff --git a/ash/app_list/views/app_list_folder_view.cc b/ash/app_list/views/app_list_folder_view.cc index a36ec90..95d3b36f 100644 --- a/ash/app_list/views/app_list_folder_view.cc +++ b/ash/app_list/views/app_list_folder_view.cc
@@ -305,7 +305,10 @@ // Calculate the item view's bounds based on the icon bounds. int scale = icon_dimension / bounds.width(); bounds.set_y(bounds.y() - - AppListConfig::instance().grid_icon_top_padding() / scale); + (tile_height - + AppListConfig::instance().grid_icon_bottom_padding() - + icon_dimension) / + 2 / scale); bounds.set_x(bounds.x() - (tile_width - icon_dimension) / 2 / scale); bounds.set_size(gfx::Size(tile_width / scale, tile_height / scale)); top_item_views_bounds.emplace_back(bounds);
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc index efd027b1..dedef2e 100644 --- a/ash/app_list/views/app_list_item_view.cc +++ b/ash/app_list/views/app_list_item_view.cc
@@ -410,6 +410,7 @@ if (apps_grid_view_->IsSelectedView(this)) { const int grid_focus_corner_radius = AppListConfig::instance().grid_focus_corner_radius(); + rect.Inset(0, 0, 0, AppListConfig::instance().grid_icon_bottom_padding()); rect.ClampToCenteredSize(AppListConfig::instance().grid_focus_size()); cc::PaintFlags flags; flags.setAntiAlias(true); @@ -694,8 +695,7 @@ const gfx::Rect& target_bounds, const gfx::Size& icon_size) { gfx::Rect rect(target_bounds); - rect.Inset(0, AppListConfig::instance().grid_icon_top_padding(), 0, 0); - rect.set_height(icon_size.height()); + rect.Inset(0, 0, 0, AppListConfig::instance().grid_icon_bottom_padding()); rect.ClampToCenteredSize(icon_size); return rect; } @@ -704,11 +704,9 @@ const gfx::Rect& target_bounds, const gfx::Size& title_size) { gfx::Rect rect(target_bounds); - rect.Inset(0, - AppListConfig::instance().grid_icon_top_padding() + - AppListConfig::instance().grid_icon_dimension() + - AppListConfig::instance().grid_icon_title_spacing(), - 0, 0); + rect.set_y(rect.bottom() - + AppListConfig::instance().grid_title_bottom_padding() - + title_size.height()); rect.set_height(title_size.height()); rect.ClampToCenteredSize(title_size); return rect;
diff --git a/ash/app_list/views/suggestion_chip_view.cc b/ash/app_list/views/suggestion_chip_view.cc index f25d913..bd23983 100644 --- a/ash/app_list/views/suggestion_chip_view.cc +++ b/ash/app_list/views/suggestion_chip_view.cc
@@ -6,6 +6,7 @@ #include <memory> +#include "ash/assistant/ui/assistant_ui_constants.h" #include "ash/public/cpp/app_list/app_list_config.h" #include "ui/accessibility/ax_node_data.h" #include "ui/gfx/canvas.h" @@ -27,7 +28,7 @@ constexpr SkColor kAssistantBackgroundColor = SK_ColorWHITE; constexpr SkColor kAssistantStrokeColor = SkColorSetA(gfx::kGoogleGrey900, 0x24); -constexpr SkColor kAssistantTextColor = gfx::kGoogleGrey900; +constexpr SkColor kAssistantTextColor = gfx::kGoogleGrey700; constexpr int kAssistantStrokeWidthDip = 1; // App list specific style: @@ -114,9 +115,10 @@ text_view_->SetAutoColorReadabilityEnabled(false); text_view_->SetEnabledColor(assistant_style_ ? kAssistantTextColor : kAppListTextColor); - text_view_->SetFontList(assistant_style_ - ? text_view_->font_list().DeriveWithSizeDelta(2) - : AppListConfig::instance().app_title_font()); + text_view_->SetFontList( + assistant_style_ + ? ash::assistant::ui::GetDefaultFontList().DeriveWithSizeDelta(2) + : AppListConfig::instance().app_title_font()); text_view_->SetText(params.text); AddChildView(text_view_); }
diff --git a/ash/assistant/ui/BUILD.gn b/ash/assistant/ui/BUILD.gn new file mode 100644 index 0000000..4542f3a --- /dev/null +++ b/ash/assistant/ui/BUILD.gn
@@ -0,0 +1,20 @@ +# Copyright 2018 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. + +import("//build/config/ui.gni") + +assert(is_chromeos) + +source_set("constants") { + sources = [ + "assistant_ui_constants.cc", + "assistant_ui_constants.h", + ] + + deps = [ + "//base", + "//skia", + "//ui/gfx", + ] +}
diff --git a/ash/assistant/ui/assistant_mini_view.cc b/ash/assistant/ui/assistant_mini_view.cc index 0b49a43..0917078 100644 --- a/ash/assistant/ui/assistant_mini_view.cc +++ b/ash/assistant/ui/assistant_mini_view.cc
@@ -77,7 +77,7 @@ // Label. label_->SetAutoColorReadabilityEnabled(false); label_->SetFontList( - views::Label::GetDefaultFontList().DeriveWithSizeDelta(4)); + assistant::ui::GetDefaultFontList().DeriveWithSizeDelta(4)); label_->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); AddChildView(label_);
diff --git a/ash/assistant/ui/assistant_ui_constants.cc b/ash/assistant/ui/assistant_ui_constants.cc new file mode 100644 index 0000000..fe5c020 --- /dev/null +++ b/ash/assistant/ui/assistant_ui_constants.cc
@@ -0,0 +1,21 @@ +// Copyright 2018 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 "ash/assistant/ui/assistant_ui_constants.h" + +#include "base/no_destructor.h" +#include "ui/gfx/font_list.h" + +namespace ash { +namespace assistant { +namespace ui { + +const gfx::FontList& GetDefaultFontList() { + static const base::NoDestructor<gfx::FontList> font_list("Google Sans, 12px"); + return *font_list; +} + +} // namespace ui +} // namespace assistant +} // namespace ash \ No newline at end of file
diff --git a/ash/assistant/ui/assistant_ui_constants.h b/ash/assistant/ui/assistant_ui_constants.h index cbeb697..8349e30 100644 --- a/ash/assistant/ui/assistant_ui_constants.h +++ b/ash/assistant/ui/assistant_ui_constants.h
@@ -8,6 +8,10 @@ #include "third_party/skia/include/core/SkColor.h" #include "ui/gfx/color_palette.h" +namespace gfx { +class FontList; +} // namespace gfx + namespace ash { // Appearance. @@ -21,6 +25,16 @@ constexpr SkColor kTextColorPrimary = gfx::kGoogleGrey900; constexpr SkColor kTextColorSecondary = gfx::kGoogleGrey700; +// TODO(dmblack): Move the other constants into ash::assistant::ui. +namespace assistant { +namespace ui { + +// Returns the default font list for Assistant UI. +const gfx::FontList& GetDefaultFontList(); + +} // namespace ui +} // namespace assistant + } // namespace ash #endif // ASH_ASSISTANT_UI_ASSISTANT_UI_CONSTANTS_H_
diff --git a/ash/assistant/ui/dialog_plate/dialog_plate.cc b/ash/assistant/ui/dialog_plate/dialog_plate.cc index ce6ddc7..ebedfb2 100644 --- a/ash/assistant/ui/dialog_plate/dialog_plate.cc +++ b/ash/assistant/ui/dialog_plate/dialog_plate.cc
@@ -154,7 +154,7 @@ views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_CENTER); gfx::FontList font_list = - views::Textfield::GetDefaultFontList().DeriveWithSizeDelta(4); + assistant::ui::GetDefaultFontList().DeriveWithSizeDelta(4); // Textfield. textfield_ = new views::Textfield();
diff --git a/ash/assistant/ui/main_stage/assistant_header_view.cc b/ash/assistant/ui/main_stage/assistant_header_view.cc index 0474f3b..c7afa0f9 100644 --- a/ash/assistant/ui/main_stage/assistant_header_view.cc +++ b/ash/assistant/ui/main_stage/assistant_header_view.cc
@@ -84,7 +84,7 @@ greeting_label_->SetAutoColorReadabilityEnabled(false); greeting_label_->SetEnabledColor(kTextColorPrimary); greeting_label_->SetFontList( - views::Label::GetDefaultFontList() + assistant::ui::GetDefaultFontList() .DeriveWithSizeDelta(8) .DeriveWithWeight(gfx::Font::Weight::MEDIUM)); greeting_label_->SetHorizontalAlignment(
diff --git a/ash/assistant/ui/main_stage/assistant_query_view.cc b/ash/assistant/ui/main_stage/assistant_query_view.cc index efc9f49..25802b27 100644 --- a/ash/assistant/ui/main_stage/assistant_query_view.cc +++ b/ash/assistant/ui/main_stage/assistant_query_view.cc
@@ -9,7 +9,6 @@ #include "ash/assistant/model/assistant_query.h" #include "ash/assistant/ui/assistant_ui_constants.h" #include "base/strings/utf_string_conversions.h" -#include "ui/views/controls/label.h" #include "ui/views/layout/box_layout.h" namespace ash { @@ -23,7 +22,8 @@ views::StyledLabel::RangeStyleInfo CreateStyleInfo(SkColor color) { views::StyledLabel::RangeStyleInfo style; - style.custom_font = views::Label::GetDefaultFontList().DeriveWithSizeDelta(2); + style.custom_font = + assistant::ui::GetDefaultFontList().DeriveWithSizeDelta(2); style.override_color = color; return style; }
diff --git a/ash/assistant/ui/main_stage/assistant_text_element_view.cc b/ash/assistant/ui/main_stage/assistant_text_element_view.cc index 421cd6e..a506327 100644 --- a/ash/assistant/ui/main_stage/assistant_text_element_view.cc +++ b/ash/assistant/ui/main_stage/assistant_text_element_view.cc
@@ -17,7 +17,7 @@ : views::Label(base::UTF8ToUTF16(text_element->text())) { SetAutoColorReadabilityEnabled(false); SetEnabledColor(kTextColorPrimary); - SetFontList(views::Label::GetDefaultFontList() + SetFontList(assistant::ui::GetDefaultFontList() .DeriveWithSizeDelta(2) .DeriveWithWeight(gfx::Font::Weight::MEDIUM)); SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT);
diff --git a/ash/assistant/util/animation_util.cc b/ash/assistant/util/animation_util.cc index 3b3cbdc3..ca8a45b 100644 --- a/ash/assistant/util/animation_util.cc +++ b/ash/assistant/util/animation_util.cc
@@ -14,35 +14,35 @@ namespace assistant { namespace util { -ui::LayerAnimationSequence* CreateLayerAnimationSequence( - std::unique_ptr<ui::LayerAnimationElement> a, +::ui::LayerAnimationSequence* CreateLayerAnimationSequence( + std::unique_ptr<::ui::LayerAnimationElement> a, const LayerAnimationSequenceParams& params) { return CreateLayerAnimationSequence(std::move(a), nullptr, nullptr, nullptr, params); } -ui::LayerAnimationSequence* CreateLayerAnimationSequence( - std::unique_ptr<ui::LayerAnimationElement> a, - std::unique_ptr<ui::LayerAnimationElement> b, +::ui::LayerAnimationSequence* CreateLayerAnimationSequence( + std::unique_ptr<::ui::LayerAnimationElement> a, + std::unique_ptr<::ui::LayerAnimationElement> b, const LayerAnimationSequenceParams& params) { return CreateLayerAnimationSequence(std::move(a), std::move(b), nullptr, nullptr, params); } -ui::LayerAnimationSequence* CreateLayerAnimationSequence( - std::unique_ptr<ui::LayerAnimationElement> a, - std::unique_ptr<ui::LayerAnimationElement> b, - std::unique_ptr<ui::LayerAnimationElement> c, +::ui::LayerAnimationSequence* CreateLayerAnimationSequence( + std::unique_ptr<::ui::LayerAnimationElement> a, + std::unique_ptr<::ui::LayerAnimationElement> b, + std::unique_ptr<::ui::LayerAnimationElement> c, const LayerAnimationSequenceParams& params) { return CreateLayerAnimationSequence(std::move(a), std::move(b), std::move(c), nullptr, params); } -ui::LayerAnimationSequence* CreateLayerAnimationSequence( - std::unique_ptr<ui::LayerAnimationElement> a, - std::unique_ptr<ui::LayerAnimationElement> b, - std::unique_ptr<ui::LayerAnimationElement> c, - std::unique_ptr<ui::LayerAnimationElement> d, +::ui::LayerAnimationSequence* CreateLayerAnimationSequence( + std::unique_ptr<::ui::LayerAnimationElement> a, + std::unique_ptr<::ui::LayerAnimationElement> b, + std::unique_ptr<::ui::LayerAnimationElement> c, + std::unique_ptr<::ui::LayerAnimationElement> d, const LayerAnimationSequenceParams& params) { ui::LayerAnimationSequence* layer_animation_sequence = new ui::LayerAnimationSequence(); @@ -63,32 +63,32 @@ return layer_animation_sequence; } -std::unique_ptr<ui::LayerAnimationElement> CreateOpacityElement( +std::unique_ptr<::ui::LayerAnimationElement> CreateOpacityElement( float opacity, const base::TimeDelta& duration, const gfx::Tween::Type& tween) { - std::unique_ptr<ui::LayerAnimationElement> layer_animation_element = - ui::LayerAnimationElement::CreateOpacityElement(opacity, duration); + std::unique_ptr<::ui::LayerAnimationElement> layer_animation_element = + ::ui::LayerAnimationElement::CreateOpacityElement(opacity, duration); layer_animation_element->set_tween_type(tween); return layer_animation_element; } -std::unique_ptr<ui::LayerAnimationElement> CreateTransformElement( +std::unique_ptr<::ui::LayerAnimationElement> CreateTransformElement( const gfx::Transform& transform, const base::TimeDelta& duration, const gfx::Tween::Type& tween) { - std::unique_ptr<ui::LayerAnimationElement> layer_animation_element = - ui::LayerAnimationElement::CreateTransformElement(transform, duration); + std::unique_ptr<::ui::LayerAnimationElement> layer_animation_element = + ::ui::LayerAnimationElement::CreateTransformElement(transform, duration); layer_animation_element->set_tween_type(tween); return layer_animation_element; } void StartLayerAnimationSequencesTogether( - ui::LayerAnimator* layer_animator, + ::ui::LayerAnimator* layer_animator, const std::vector<ui::LayerAnimationSequence*>& layer_animation_sequences, - ui::LayerAnimationObserver* observer) { + ::ui::LayerAnimationObserver* observer) { if (observer) { - for (ui::LayerAnimationSequence* layer_animation_sequence : + for (::ui::LayerAnimationSequence* layer_animation_sequence : layer_animation_sequences) { layer_animation_sequence->AddObserver(observer); }
diff --git a/ash/assistant/util/animation_util.h b/ash/assistant/util/animation_util.h index e5731ae..bed7a4f 100644 --- a/ash/assistant/util/animation_util.h +++ b/ash/assistant/util/animation_util.h
@@ -34,46 +34,46 @@ // Creates a LayerAnimationSequence containing the specified // LayerAnimationElements with the given |params|. The method caller assumes // ownership of the returned pointer. -ui::LayerAnimationSequence* CreateLayerAnimationSequence( - std::unique_ptr<ui::LayerAnimationElement> a, +::ui::LayerAnimationSequence* CreateLayerAnimationSequence( + std::unique_ptr<::ui::LayerAnimationElement> a, const LayerAnimationSequenceParams& params = {}); // Creates a LayerAnimationSequence containing the specified // LayerAnimationElements with the given |params|. The method caller assumes // ownership of the returned pointer. -ui::LayerAnimationSequence* CreateLayerAnimationSequence( - std::unique_ptr<ui::LayerAnimationElement> a, - std::unique_ptr<ui::LayerAnimationElement> b, +::ui::LayerAnimationSequence* CreateLayerAnimationSequence( + std::unique_ptr<::ui::LayerAnimationElement> a, + std::unique_ptr<::ui::LayerAnimationElement> b, const LayerAnimationSequenceParams& params = {}); // Creates a LayerAnimationSequence containing the specified // LayerAnimationElements with the given |params|. The method caller assumes // ownership of the returned pointer. -ui::LayerAnimationSequence* CreateLayerAnimationSequence( - std::unique_ptr<ui::LayerAnimationElement> a, - std::unique_ptr<ui::LayerAnimationElement> b, - std::unique_ptr<ui::LayerAnimationElement> c, +::ui::LayerAnimationSequence* CreateLayerAnimationSequence( + std::unique_ptr<::ui::LayerAnimationElement> a, + std::unique_ptr<::ui::LayerAnimationElement> b, + std::unique_ptr<::ui::LayerAnimationElement> c, const LayerAnimationSequenceParams& params = {}); // Creates a LayerAnimationSequence containing the specified // LayerAnimationElements with the given |params|. The method caller assumes // ownership of the returned pointer. -ui::LayerAnimationSequence* CreateLayerAnimationSequence( - std::unique_ptr<ui::LayerAnimationElement> a, - std::unique_ptr<ui::LayerAnimationElement> b, - std::unique_ptr<ui::LayerAnimationElement> c, - std::unique_ptr<ui::LayerAnimationElement> d, +::ui::LayerAnimationSequence* CreateLayerAnimationSequence( + std::unique_ptr<::ui::LayerAnimationElement> a, + std::unique_ptr<::ui::LayerAnimationElement> b, + std::unique_ptr<::ui::LayerAnimationElement> c, + std::unique_ptr<::ui::LayerAnimationElement> d, const LayerAnimationSequenceParams& params = {}); // Creates a LayerAnimationElement to animate opacity with the given parameters. -std::unique_ptr<ui::LayerAnimationElement> CreateOpacityElement( +std::unique_ptr<::ui::LayerAnimationElement> CreateOpacityElement( float opacity, const base::TimeDelta& duration, const gfx::Tween::Type& tween = gfx::Tween::Type::LINEAR); // Creates a LayerAnimationElement to animate transform with the given // parameters. -std::unique_ptr<ui::LayerAnimationElement> CreateTransformElement( +::std::unique_ptr<::ui::LayerAnimationElement> CreateTransformElement( const gfx::Transform& transform, const base::TimeDelta& duration, const gfx::Tween::Type& tween = gfx::Tween::Type::LINEAR); @@ -82,9 +82,9 @@ // |layer_animator|. If an optional |observer| is supplied, it will be added // to each sequence in the animation set. void StartLayerAnimationSequencesTogether( - ui::LayerAnimator* layer_animator, - const std::vector<ui::LayerAnimationSequence*>& layer_animation_sequences, - ui::LayerAnimationObserver* observer = nullptr); + ::ui::LayerAnimator* layer_animator, + const std::vector<::ui::LayerAnimationSequence*>& layer_animation_sequences, + ::ui::LayerAnimationObserver* observer = nullptr); } // namespace util } // namespace assistant
diff --git a/ash/assistant/util/deep_link_util.cc b/ash/assistant/util/deep_link_util.cc index f4fdfb2..eeabc42 100644 --- a/ash/assistant/util/deep_link_util.cc +++ b/ash/assistant/util/deep_link_util.cc
@@ -39,7 +39,7 @@ // TODO(dmblack): Wire up actual Assistant Reminders URL. constexpr char kAssistantRemindersWebUrl[] = R"(data:text/html, <html> - <body style="padding:0 32px;"> + <body style="font-family:Google Sans,sans-serif;padding:0 32px;"> <h3>Assistant Reminders</h3> <p>Coming soon. Meanwhile, please use your Android/iOS phone to access reminders.</p> </body> @@ -49,7 +49,7 @@ // TODO(dmblack): Wire up actual Assistant Settings URL. constexpr char kAssistantSettingsWebUrl[] = R"(data:text/html, <html> - <body style="padding:0 32px;"> + <body style="font-family:Google Sans,sans-serif;padding:0 32px;"> <h3>Assistant Settings</h3> <p>Coming soon. Meanwhile, please use your Android/iOS phone to access settings.</p> </body>
diff --git a/ash/components/strings/ash_components_strings_bn.xtb b/ash/components/strings/ash_components_strings_bn.xtb index d7e2f0d..3ef3f2c 100644 --- a/ash/components/strings/ash_components_strings_bn.xtb +++ b/ash/components/strings/ash_components_strings_bn.xtb
@@ -95,7 +95,7 @@ <translation id="4556221320735744018">কীবোর্ড শর্টকাট সহায়তাকারী দেখুন</translation> <translation id="4628718545549558538">স্ট্যাটাস এলাকা খুলুন (যেখানে আপনার অ্যাকাউন্টের ছবি দেখানো হয়)</translation> <translation id="4642092649622328492">আংশিক স্ক্রিনশট নিন</translation> -<translation id="4698850295812410683">স্টাইলাস টুল দেখান</translation> +<translation id="4698850295812410683">স্টাইলাস টুল দেখুন</translation> <translation id="4801989101741319327">পরের শব্দের শেষে নিয়ে যান</translation> <translation id="4916163929714267752">একটি নতুন উইন্ডোতে লিঙ্কটি খুলুন</translation> <translation id="5030659775136592441">বুকমার্ক পরিচালক দেখান</translation> @@ -117,7 +117,7 @@ <translation id="5757111373163288447">ট্যাবে লিঙ্কটি খুলুন</translation> <translation id="5757474750054631686">কীবোর্ডের আলো কম করুন (শুধুমাত্র ব্যাকলিট কীবোর্ডের জন্য)</translation> <translation id="587531134027443617">আগের শব্দটি মুছুন</translation> -<translation id="5899919361772749550">ডেভেলপার টুল কনসোল দেখান অথবা লুকান</translation> +<translation id="5899919361772749550">ডেভেলপার টুল কনসোল দেখুন অথবা লুকান</translation> <translation id="5921745308587794300">উইন্ডো ঘোরান</translation> <translation id="6022924867608035986">সার্চ বক্সের টেক্সট সাফ করুন</translation> <translation id="6045998054441862242">উচ্চ কনট্রাস্ট মোড চালু করুন</translation>
diff --git a/ash/keyboard/virtual_keyboard_unittest.cc b/ash/keyboard/virtual_keyboard_unittest.cc index 83ad81ac..701da54b 100644 --- a/ash/keyboard/virtual_keyboard_unittest.cc +++ b/ash/keyboard/virtual_keyboard_unittest.cc
@@ -86,4 +86,42 @@ EXPECT_EQ("1 1", delegate.GetMouseButtonCountsAndReset()); } +TEST_F(VirtualKeyboardTest, HitTestBoundsAreResetWhenContainerTypeChanges) { + aura::Window* root_window = Shell::GetPrimaryRootWindow(); + + // Create a test window in the background with the same size as the screen. + aura::test::EventCountDelegate delegate; + std::unique_ptr<aura::Window> background_window( + CreateTestWindowInShellWithDelegate(&delegate, 0, root_window->bounds())); + + auto* keyboard_controller = keyboard::KeyboardController::Get(); + keyboard_controller->ShowKeyboard(false); + keyboard_controller->NotifyKeyboardWindowLoaded(); + + aura::Window* keyboard_window = keyboard_controller->GetKeyboardWindow(); + keyboard_window->SetBounds(gfx::Rect(100, 100, 100, 100)); + + // Set empty hit test bounds, so all events pass through to the background. + keyboard_controller->SetHitTestBounds(std::vector<gfx::Rect>()); + + ui::test::EventGenerator generator(root_window); + + // (0, 0) passes through and is received by background window. + generator.MoveMouseTo(keyboard_window->bounds().origin()); + generator.ClickLeftButton(); + EXPECT_EQ("1 1", delegate.GetMouseButtonCountsAndReset()); + + // Change the container behavior, which should reset the hit test bounds to + // the whole keyboard window. + keyboard_controller->HideKeyboardExplicitlyBySystem(); + keyboard_controller->SetContainerType(keyboard::ContainerType::FLOATING, + base::nullopt, base::DoNothing()); + keyboard_controller->ShowKeyboard(false); + + // (0, 0) should no longer pass through the keyboard window. + generator.MoveMouseTo(keyboard_window->bounds().origin()); + generator.ClickLeftButton(); + EXPECT_EQ("0 0", delegate.GetMouseButtonCountsAndReset()); +} + } // namespace ash
diff --git a/ash/laser/laser_pointer_controller_unittest.cc b/ash/laser/laser_pointer_controller_unittest.cc index d4d54f6..ef5050e 100644 --- a/ash/laser/laser_pointer_controller_unittest.cc +++ b/ash/laser/laser_pointer_controller_unittest.cc
@@ -9,6 +9,7 @@ #include "ash/public/cpp/config.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" +#include "services/ui/ws2/server_window.h" #include "ui/events/test/event_generator.h" namespace ash { @@ -154,4 +155,25 @@ controller_test_api_->predicted_laser_points().GetNumberOfPoints()); } +// Test to laser pointer is shown for touches over a remote app. +TEST_F(LaserPointerControllerTest, LaserPointerWorksWithRemoteApp) { + std::unique_ptr<aura::Window> window = + CreateTestWindow(gfx::Rect(50, 50, 100, 100)); + ui::ws2::ServerWindow* server_window = + ui::ws2::ServerWindow::GetMayBeNull(window.get()); + ASSERT_TRUE(server_window); + // Setting the client area triggers slightly different logic. + server_window->SetClientArea(gfx::Insets(10), std::vector<gfx::Rect>()); + + // The laser pointer mode only works with stylus. + ui::test::EventGenerator* event_generator = GetEventGenerator(); + event_generator->EnterPenPointerMode(); + controller_test_api_->SetEnabled(true); + + event_generator->MoveTouch(gfx::Point(100, 100)); + EXPECT_FALSE(controller_test_api_->IsShowingLaserPointer()); + event_generator->PressTouch(); + EXPECT_TRUE(controller_test_api_->IsShowingLaserPointer()); +} + } // namespace ash
diff --git a/ash/public/cpp/app_list/app_list_config.cc b/ash/public/cpp/app_list/app_list_config.cc index 13498da..fd04f0b5 100644 --- a/ash/public/cpp/app_list/app_list_config.cc +++ b/ash/public/cpp/app_list/app_list_config.cc
@@ -15,8 +15,8 @@ grid_tile_height_(99), grid_tile_spacing_(24), grid_icon_dimension_(48), - grid_icon_top_padding_(24), - grid_icon_title_spacing_(10), + grid_icon_bottom_padding_(3), + grid_title_bottom_padding_(0), grid_title_width_(80), grid_title_color_(SK_ColorWHITE), grid_focus_dimension_(64), @@ -53,8 +53,8 @@ grid_tile_height_ = 112; grid_tile_spacing_ = 0; grid_icon_dimension_ = 64; - grid_icon_top_padding_ = 16; - grid_icon_title_spacing_ = 12; + grid_icon_bottom_padding_ = 24; + grid_title_bottom_padding_ = 8; grid_title_width_ = 96; grid_focus_dimension_ = 80; grid_focus_corner_radius_ = 12;
diff --git a/ash/public/cpp/app_list/app_list_config.h b/ash/public/cpp/app_list/app_list_config.h index a1f2f010..925fdf7 100644 --- a/ash/public/cpp/app_list/app_list_config.h +++ b/ash/public/cpp/app_list/app_list_config.h
@@ -29,8 +29,8 @@ int grid_tile_height() const { return grid_tile_height_; } int grid_tile_spacing() const { return grid_tile_spacing_; } int grid_icon_dimension() const { return grid_icon_dimension_; } - int grid_icon_top_padding() const { return grid_icon_top_padding_; } - int grid_icon_title_spacing() const { return grid_icon_title_spacing_; } + int grid_icon_bottom_padding() const { return grid_icon_bottom_padding_; } + int grid_title_bottom_padding() const { return grid_title_bottom_padding_; } int grid_title_width() const { return grid_title_width_; } int grid_focus_dimension() const { return grid_focus_dimension_; } int grid_focus_corner_radius() const { return grid_focus_corner_radius_; } @@ -147,11 +147,11 @@ // The icon dimension of tile views in apps grid view. int grid_icon_dimension_; - // The icon top padding in tile views in apps grid view. - int grid_icon_top_padding_; + // The icon bottom padding in tile views in apps grid view. + int grid_icon_bottom_padding_; - // The spacing between icon and title in tile views in apps grid view. - int grid_icon_title_spacing_; + // The title bottom padding in tile views in apps grid view. + int grid_title_bottom_padding_; // The title width and color of tile views in apps grid view. int grid_title_width_;
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index c62963d..2db82f19 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -96,7 +96,7 @@ <translation id="2761704814324807722">علبة الحالة، والوقت <ph name="TIME" />، و<ph name="BATTERY" /></translation> <translation id="277257480934873581">إعادة الاتصال بـ <ph name="NAME" /></translation> <translation id="2792498699870441125">Alt+مفتاح البحث</translation> -<translation id="2805756323405976993">تطبيقات</translation> +<translation id="2805756323405976993">التطبيقات</translation> <translation id="2808012452536866044">تم ربط خدمة Better Together بهاتف جديد</translation> <translation id="2819276065543622893">سيتم تسجيل خروجك الآن.</translation> <translation id="2825619548187458965">الرف</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 390bf595..223f6db2 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -130,7 +130,7 @@ <translation id="3294437725009624529">অতিথি</translation> <translation id="332587331255250389">অনুগ্রহ করে ব্যাটারি পাল্টান</translation> <translation id="3351879221545518001">আপনি বর্তমানে স্ক্রিন কাস্ট করছেন।</translation> -<translation id="3364721542077212959">লেখনী টুল</translation> +<translation id="3364721542077212959">স্টাইলাস টুল</translation> <translation id="3368922792935385530">সংযুক্ত</translation> <translation id="3371140690572404006">USB-C ডিভাইস (ডান দিকের সামনের পোর্ট)</translation> <translation id="3400357268283240774">আরও সেটিংস</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index c38a48c..e652765 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -46,6 +46,7 @@ <translation id="1882897271359938046">S'està replicant <ph name="DISPLAY_NAME" /></translation> <translation id="1885785240814121742">Desbloqueja amb l'empremta digital</translation> <translation id="1919743966458266018">La drecera per obrir el gestor de tasques ha canviat. Utilitzeu <ph name="NEW_SHORTCUT" /> en lloc de la drecera <ph name="OLD_SHORTCUT" />.</translation> +<translation id="1923508880661655826">Les dades de la sessió s'esborraran en tancar-la. <ph name="LEARN_MORE" /></translation> <translation id="1923539912171292317">Clics automàtics</translation> <translation id="1928739107511554905">Per obtenir l'actualització, utilitza la pantalla tàctil per reiniciar Chromebook amb el teclat connectat.</translation> <translation id="1942830294380034169">Botó de desbordament</translation> @@ -206,7 +207,9 @@ <translation id="4905614135390995787">La drecera per activar/desactivar el mode d'alt contrast ha canviat. A partir d'ara, utilitza <ph name="NEW_SHORTCUT" /> en lloc de la drecera <ph name="OLD_SHORTCUT" />.</translation> <translation id="4917385247580444890">Forta</translation> <translation id="4918086044614829423">Accepta</translation> +<translation id="4924411785043111640">Reinicia i restableix</translation> <translation id="4961318399572185831">Emet la pantalla</translation> +<translation id="5069971504769299223">Pot ser que el gestor del dispositiu pugui supervisar la teva activitat.</translation> <translation id="5136175204352732067">S'ha connectat un altre teclat</translation> <translation id="5168181903108465623">Dispositius d'emissió disponibles</translation> <translation id="5207949376430453814">Ressalta la marca d'inserció de text</translation> @@ -220,6 +223,7 @@ <translation id="544691375626129091">Ja s'han afegit tots els usuaris disponibles a aquesta sessió.</translation> <translation id="5457599981699367932">Navega com a convidat</translation> <translation id="54609108002486618">Gestionat</translation> +<translation id="5496819745535887422">L'administrador està revertint el dispositiu a una versió anterior. Quan es reiniciï el dispositiu, se'n suprimiran totes les dades.</translation> <translation id="553675580533261935">S'està tancant la sessió</translation> <translation id="5537725057119320332">Emet</translation> <translation id="5548285847212963613">L'extensió "<ph name="EXTENSION_NAME" />" pot ajudar a connectar-se a aquesta xarxa.</translation> @@ -290,6 +294,7 @@ <translation id="6627638273713273709">Cerca+Maj+K</translation> <translation id="6650933572246256093">El dispositiu Bluetooth "<ph name="DEVICE_NAME" />" sol·licita permís per emparellar-se. Introduïu-hi aquesta contrasenya: <ph name="PASSKEY" />.</translation> <translation id="6657585470893396449">Contrasenya</translation> +<translation id="6687966522050791666">Tria l'idioma i la introducció de text</translation> <translation id="6691659475504239918">Cerca+Maj+H</translation> <translation id="6696025732084565524">El teclat extraïble necessita una actualització molt important</translation> <translation id="6700713906295497288">Botó del menú d'IME</translation> @@ -406,6 +411,7 @@ <translation id="8984179138335769204">Inici ràpid</translation> <translation id="8995603266996330174">Gestionat per <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Hi ha disponible una actualització d'Adobe Flash Player</translation> +<translation id="9056839673611986238">El dispositiu es revertirà a una versió anterior</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">S'està fent servir el micròfon.</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index fc6c7b4..908a871 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -46,6 +46,7 @@ <translation id="1882897271359938046">Mirroring to <ph name="DISPLAY_NAME" /></translation> <translation id="1885785240814121742">Unlock with fingerprint</translation> <translation id="1919743966458266018">The shortcut to open the task manager has changed. Please use <ph name="NEW_SHORTCUT" /> instead of <ph name="OLD_SHORTCUT" />.</translation> +<translation id="1923508880661655826">Your session will be cleared when you sign out. <ph name="LEARN_MORE" /></translation> <translation id="1923539912171292317">Automatic clicks</translation> <translation id="1928739107511554905">To get the update, use the touchscreen to restart your Chromebook with the keyboard attached.</translation> <translation id="1942830294380034169">Overflow button</translation> @@ -206,7 +207,9 @@ <translation id="4905614135390995787">The shortcut to toggle high contrast mode has changed. Please use <ph name="NEW_SHORTCUT" /> instead of <ph name="OLD_SHORTCUT" />.</translation> <translation id="4917385247580444890">Strong</translation> <translation id="4918086044614829423">Accept</translation> +<translation id="4924411785043111640">Restart and reset</translation> <translation id="4961318399572185831">Cast screen</translation> +<translation id="5069971504769299223">The device manager may be able to monitor your activity.</translation> <translation id="5136175204352732067">Different keyboard connected</translation> <translation id="5168181903108465623">Cast devices available</translation> <translation id="5207949376430453814">Highlight text caret</translation> @@ -220,6 +223,7 @@ <translation id="544691375626129091">All available users have already been added to this session.</translation> <translation id="5457599981699367932">Browse as Guest</translation> <translation id="54609108002486618">Managed</translation> +<translation id="5496819745535887422">Your administrator is rolling back your device. All data will be deleted when the device is restarted.</translation> <translation id="553675580533261935">Exiting session</translation> <translation id="5537725057119320332">Cast</translation> <translation id="5548285847212963613">The extension "<ph name="EXTENSION_NAME" />" can help connect to this network.</translation> @@ -290,6 +294,7 @@ <translation id="6627638273713273709">Search+Shift+K</translation> <translation id="6650933572246256093">Bluetooth device "<ph name="DEVICE_NAME" />" would like permission to pair. Please enter this passkey on that device: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">Password</translation> +<translation id="6687966522050791666">Choose language and input</translation> <translation id="6691659475504239918">Search+Shift+H</translation> <translation id="6696025732084565524">Your detachable keyboard needs a critical update</translation> <translation id="6700713906295497288">IME menu button</translation> @@ -406,6 +411,7 @@ <translation id="8984179138335769204">Quick launch</translation> <translation id="8995603266996330174">Managed by <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Adobe Flash Player update available</translation> +<translation id="9056839673611986238">Device will be rolled back</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Microphone is in use.</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index eab3372..6ccfec22 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -46,6 +46,7 @@ <translation id="1882897271359938046">Mencerminkan ke <ph name="DISPLAY_NAME" /></translation> <translation id="1885785240814121742">Buka kunci dengan sidik jari</translation> <translation id="1919743966458266018">Pintasan untuk membuka pengelola tugas telah berubah. Gunakan <ph name="NEW_SHORTCUT" /> sebagai ganti <ph name="OLD_SHORTCUT" />.</translation> +<translation id="1923508880661655826">Sesi akan dihapus jika Anda logout. <ph name="LEARN_MORE" /></translation> <translation id="1923539912171292317">Klik otomatis</translation> <translation id="1928739107511554905">Untuk mendapatkan update, gunakan layar sentuh untuk menyalakan ulang Chromebook dengan keyboard yang disertakan.</translation> <translation id="1942830294380034169">Tombol luapan</translation> @@ -206,7 +207,9 @@ <translation id="4905614135390995787">Pintasan untuk beralih Mode Kontras Tinggi telah berubah. Gunakan <ph name="NEW_SHORTCUT" /> sebagai ganti <ph name="OLD_SHORTCUT" />.</translation> <translation id="4917385247580444890">Kuat</translation> <translation id="4918086044614829423">Terima</translation> +<translation id="4924411785043111640">Mulai ulang dan setel ulang</translation> <translation id="4961318399572185831">Transmisikan layar</translation> +<translation id="5069971504769299223">Pengelola perangkat mungkin dapat memantau aktivitas Anda.</translation> <translation id="5136175204352732067">Keyboard yang berbeda terhubung</translation> <translation id="5168181903108465623">Perangkat transmisi tersedia</translation> <translation id="5207949376430453814">Sorot tempat penyisipan teks</translation> @@ -220,6 +223,7 @@ <translation id="544691375626129091">Semua pengguna yang tersedia telah ditambahkan ke sesi ini.</translation> <translation id="5457599981699367932">Login sebagai Tamu</translation> <translation id="54609108002486618">Terkelola</translation> +<translation id="5496819745535887422">Administrator sedang memulihkan perangkat Anda. Semua data akan dihapus jika perangkat dinyalakan ulang.</translation> <translation id="553675580533261935">Keluar dari sesi</translation> <translation id="5537725057119320332">Cast</translation> <translation id="5548285847212963613">Ekstensi "<ph name="EXTENSION_NAME" />" dapat membantu menyambungkan ke jaringan ini.</translation> @@ -290,6 +294,7 @@ <translation id="6627638273713273709">Tombol Penelusuran+Shift+K</translation> <translation id="6650933572246256093">Perangkat Bluetooth "<ph name="DEVICE_NAME" />" meminta izin untuk bersanding. Masukkan kunci sandi ini pada perangkat tersebut: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">Sandi</translation> +<translation id="6687966522050791666">Pilih bahasa dan masukan</translation> <translation id="6691659475504239918">Search+Shift+H</translation> <translation id="6696025732084565524">Keyboard yang dapat dilepas memerlukan update penting</translation> <translation id="6700713906295497288">Tombol menu IME</translation> @@ -406,6 +411,7 @@ <translation id="8984179138335769204">Quick launch</translation> <translation id="8995603266996330174">Dikelola menurut <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Update Adobe Flash Player tersedia</translation> +<translation id="9056839673611986238">Perangkat akan dipulihkan</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Mikrofon sedang digunakan.</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index 9962ed2..43a727c 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -46,6 +46,7 @@ <translation id="1882897271359938046">Mencerminkan <ph name="DISPLAY_NAME" /></translation> <translation id="1885785240814121742">Buka kunci dengan cap jari</translation> <translation id="1919743966458266018">Pintasan untuk membuka pengurus tugas telah berubah. Sila gunakan <ph name="NEW_SHORTCUT" /> dan bukannya <ph name="OLD_SHORTCUT" />.</translation> +<translation id="1923508880661655826">Sesi anda akan dipadam bersih apabila anda log keluar. <ph name="LEARN_MORE" /></translation> <translation id="1923539912171292317">Klik automatik</translation> <translation id="1928739107511554905">Untuk mendapatkan kemas kini, gunakan skrin sentuh untuk memulakan semula Chromebook anda dengan papan kekunci yang dipasang.</translation> <translation id="1942830294380034169">Butang limpahan</translation> @@ -207,7 +208,9 @@ <translation id="4905614135390995787">Pintasan untuk menogol Mod Kontras Tinggi telah ditukar. Sila gunakan <ph name="NEW_SHORTCUT" /> dan bukannya <ph name="OLD_SHORTCUT" />.</translation> <translation id="4917385247580444890">Kuat</translation> <translation id="4918086044614829423">Terima</translation> +<translation id="4924411785043111640">Mulakan semula dan tetapkan semula</translation> <translation id="4961318399572185831">Hantar skrin</translation> +<translation id="5069971504769299223">Pengurus peranti mungkin dapat memantau aktiviti anda.</translation> <translation id="5136175204352732067">Papan kekunci lain disambungkan</translation> <translation id="5168181903108465623">Peranti Cast tersedia</translation> <translation id="5207949376430453814">Serlahkan karet teks</translation> @@ -221,6 +224,7 @@ <translation id="544691375626129091">Semua pengguna yang ada telah ditambahkan pada sesi ini.</translation> <translation id="5457599981699367932">Semak Imbas sebagai Tetamu</translation> <translation id="54609108002486618">Diuruskan</translation> +<translation id="5496819745535887422">Pentadbir anda sedang membalikkan peranti anda. Semua data akan dipadamkan apabila peranti dimulakan semula.</translation> <translation id="553675580533261935">Keluar daripada sesi</translation> <translation id="5537725057119320332">Cast</translation> <translation id="5548285847212963613">Sambungan "<ph name="EXTENSION_NAME" />" boleh membantu menyambung ke rangkaian ini.</translation> @@ -291,6 +295,7 @@ <translation id="6627638273713273709">Search+Shift+K</translation> <translation id="6650933572246256093">Peranti Bluetooth "<ph name="DEVICE_NAME" />" ingin kebenaran untuk berpasangan. Sila masukkan kekunci laluan ini pada peranti tersebut: <ph name="PASSKEY" /></translation> <translation id="6657585470893396449">Kata laluan</translation> +<translation id="6687966522050791666">Pilih bahasa dan input</translation> <translation id="6691659475504239918">Cari+Shift+H</translation> <translation id="6696025732084565524">Papan kekunci anda yang boleh dicabut memerlukan kemas kini kritikal</translation> <translation id="6700713906295497288">Butang menu IME</translation> @@ -407,6 +412,7 @@ <translation id="8984179138335769204">Lancar pantas</translation> <translation id="8995603266996330174">Diuruskan oleh <ph name="DOMAIN" /></translation> <translation id="9029474291399787231">Kemas kini Adobe Flash Player tersedia</translation> +<translation id="9056839673611986238">Peranti akan dibalikkan</translation> <translation id="9074739597929991885">Bluetooth</translation> <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation> <translation id="9080206825613744995">Mikrofon sedang digunakan.</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 4187820..23eea88 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -372,7 +372,7 @@ <translation id="8351131234907093545">Criar nota</translation> <translation id="8392451568018454956">Menu de opções para <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="8406981827175133772">Lupa de ecrã inteiro</translation> -<translation id="8427213022735114808">A introdução por voz envia a sua voz para o Google para permitir a Google Digitação por Voz em qualquer campo de texto.</translation> +<translation id="8427213022735114808">A introdução por voz envia a sua voz para o Google para permitir a digitação por voz em qualquer campo de texto.</translation> <translation id="8428213095426709021">Definições</translation> <translation id="8431190899827883166">Mostrar toques</translation> <translation id="8433186206711564395">Definições de rede</translation>
diff --git a/ash/test/ash_test_base.h b/ash/test/ash_test_base.h index 3c5274c8..016d4ac 100644 --- a/ash/test/ash_test_base.h +++ b/ash/test/ash_test_base.h
@@ -104,8 +104,8 @@ // |bounds_in_screen|. |shell_window_id| is the shell window id to give to // the new window. // - // In classic mode this simulates creating a window as a client of Ash would. - // That is, it goes through the WindowService. + // This function simulates creating a window as a client of Ash would. That + // is, it goes through the WindowService. // // TODO(sky): convert existing CreateTestWindow() functions into this one. std::unique_ptr<aura::Window> CreateTestWindow(
diff --git a/base/BUILD.gn b/base/BUILD.gn index 0da4dfa..7f4601f 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -2166,7 +2166,7 @@ } if (is_fuchsia) { - fidl_library("test_fidl") { + fidl_library("testfidl") { namespace = "base.fuchsia" namespace_path = "base/fuchsia" @@ -2680,7 +2680,7 @@ sources -= [ "files/file_path_watcher_unittest.cc" ] deps += [ - ":test_fidl", + ":testfidl", "//third_party/fuchsia-sdk:async", "//third_party/fuchsia-sdk:async_default", "//third_party/fuchsia-sdk:fdio",
diff --git a/base/fuchsia/filtered_service_directory_unittest.cc b/base/fuchsia/filtered_service_directory_unittest.cc index 0282818..b631be0 100644 --- a/base/fuchsia/filtered_service_directory_unittest.cc +++ b/base/fuchsia/filtered_service_directory_unittest.cc
@@ -29,21 +29,21 @@ // Verify that we can connect to a whitelisted service. TEST_F(FilteredServiceDirectoryTest, Connect) { - filtered_service_dir_->AddService(test_fidl::TestInterface::Name_); + filtered_service_dir_->AddService(testfidl::TestInterface::Name_); auto stub = - filtered_client_context_->ConnectToService<test_fidl::TestInterface>(); + filtered_client_context_->ConnectToService<testfidl::TestInterface>(); VerifyTestInterface(&stub, false); } // Verify that multiple connections to the same service work properly. TEST_F(FilteredServiceDirectoryTest, ConnectMultiple) { - filtered_service_dir_->AddService(test_fidl::TestInterface::Name_); + filtered_service_dir_->AddService(testfidl::TestInterface::Name_); auto stub1 = - filtered_client_context_->ConnectToService<test_fidl::TestInterface>(); + filtered_client_context_->ConnectToService<testfidl::TestInterface>(); auto stub2 = - filtered_client_context_->ConnectToService<test_fidl::TestInterface>(); + filtered_client_context_->ConnectToService<testfidl::TestInterface>(); VerifyTestInterface(&stub1, false); VerifyTestInterface(&stub2, false); } @@ -51,32 +51,32 @@ // Verify that non-whitelisted services are blocked. TEST_F(FilteredServiceDirectoryTest, ServiceBlocked) { auto stub = - filtered_client_context_->ConnectToService<test_fidl::TestInterface>(); + filtered_client_context_->ConnectToService<testfidl::TestInterface>(); VerifyTestInterface(&stub, true); } // Verify that FilteredServiceDirectory handles the case when the target service // is not available in the underlying service directory. TEST_F(FilteredServiceDirectoryTest, NoService) { - filtered_service_dir_->AddService(test_fidl::TestInterface::Name_); + filtered_service_dir_->AddService(testfidl::TestInterface::Name_); service_binding_.reset(); auto stub = - filtered_client_context_->ConnectToService<test_fidl::TestInterface>(); + filtered_client_context_->ConnectToService<testfidl::TestInterface>(); VerifyTestInterface(&stub, true); } // Verify that FilteredServiceDirectory handles the case when the underlying // service directory is destroyed. TEST_F(FilteredServiceDirectoryTest, NoServiceDir) { - filtered_service_dir_->AddService(test_fidl::TestInterface::Name_); + filtered_service_dir_->AddService(testfidl::TestInterface::Name_); service_binding_.reset(); service_directory_.reset(); auto stub = - filtered_client_context_->ConnectToService<test_fidl::TestInterface>(); + filtered_client_context_->ConnectToService<testfidl::TestInterface>(); VerifyTestInterface(&stub, true); }
diff --git a/base/fuchsia/service_directory_test_base.cc b/base/fuchsia/service_directory_test_base.cc index c5a09f3..5821fa0d 100644 --- a/base/fuchsia/service_directory_test_base.cc +++ b/base/fuchsia/service_directory_test_base.cc
@@ -27,7 +27,7 @@ service_directory_ = std::make_unique<ServiceDirectory>(std::move(service_directory_channel)); service_binding_ = - std::make_unique<ScopedServiceBinding<test_fidl::TestInterface>>( + std::make_unique<ScopedServiceBinding<testfidl::TestInterface>>( service_directory_.get(), &test_service_); ConnectClientContextToDirectory("public"); @@ -53,7 +53,7 @@ } void ServiceDirectoryTestBase::VerifyTestInterface( - fidl::InterfacePtr<test_fidl::TestInterface>* stub, + fidl::InterfacePtr<testfidl::TestInterface>* stub, bool expect_error) { // Call the service and wait for response. base::RunLoop run_loop;
diff --git a/base/fuchsia/service_directory_test_base.h b/base/fuchsia/service_directory_test_base.h index 88348a6..c1be171 100644 --- a/base/fuchsia/service_directory_test_base.h +++ b/base/fuchsia/service_directory_test_base.h
@@ -9,14 +9,14 @@ #include "base/fuchsia/component_context.h" #include "base/fuchsia/scoped_service_binding.h" -#include "base/fuchsia/test_fidl/cpp/fidl.h" +#include "base/fuchsia/testfidl/cpp/fidl.h" #include "base/message_loop/message_loop.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { namespace fuchsia { -class TestInterfaceImpl : public test_fidl::TestInterface { +class TestInterfaceImpl : public testfidl::TestInterface { public: TestInterfaceImpl(); ~TestInterfaceImpl() override; @@ -31,7 +31,7 @@ ~ServiceDirectoryTestBase() override; void ConnectClientContextToDirectory(const char* path); - void VerifyTestInterface(fidl::InterfacePtr<test_fidl::TestInterface>* stub, + void VerifyTestInterface(fidl::InterfacePtr<testfidl::TestInterface>* stub, bool expect_error); protected: @@ -39,7 +39,7 @@ std::unique_ptr<ServiceDirectory> service_directory_; zx::channel service_directory_client_channel_; TestInterfaceImpl test_service_; - std::unique_ptr<ScopedServiceBinding<test_fidl::TestInterface>> + std::unique_ptr<ScopedServiceBinding<testfidl::TestInterface>> service_binding_; std::unique_ptr<ComponentContext> client_context_; };
diff --git a/base/fuchsia/service_directory_unittest.cc b/base/fuchsia/service_directory_unittest.cc index 0af6f1f..f50b05b 100644 --- a/base/fuchsia/service_directory_unittest.cc +++ b/base/fuchsia/service_directory_unittest.cc
@@ -26,7 +26,7 @@ // ServiceDirectory and that connection is disconnected when the client stub is // destroyed. TEST_F(ServiceDirectoryTest, ConnectDisconnect) { - auto stub = client_context_->ConnectToService<test_fidl::TestInterface>(); + auto stub = client_context_->ConnectToService<testfidl::TestInterface>(); VerifyTestInterface(&stub, false); base::RunLoop run_loop; @@ -48,8 +48,8 @@ // Verifies that we can connect to the service service more than once. TEST_F(ServiceDirectoryTest, ConnectMulti) { - auto stub = client_context_->ConnectToService<test_fidl::TestInterface>(); - auto stub2 = client_context_->ConnectToService<test_fidl::TestInterface>(); + auto stub = client_context_->ConnectToService<testfidl::TestInterface>(); + auto stub2 = client_context_->ConnectToService<testfidl::TestInterface>(); VerifyTestInterface(&stub, false); VerifyTestInterface(&stub2, false); } @@ -57,7 +57,7 @@ // Verify that services are also exported to the legacy flat service namespace. TEST_F(ServiceDirectoryTest, ConnectLegacy) { ConnectClientContextToDirectory("."); - auto stub = client_context_->ConnectToService<test_fidl::TestInterface>(); + auto stub = client_context_->ConnectToService<testfidl::TestInterface>(); VerifyTestInterface(&stub, false); } @@ -67,7 +67,7 @@ service_binding_.reset(); service_directory_.reset(); - fidl::InterfacePtr<test_fidl::TestInterface> stub; + fidl::InterfacePtr<testfidl::TestInterface> stub; zx_status_t status = client_context_->ConnectToService(FidlInterfaceRequest(&stub)); EXPECT_EQ(status, ZX_ERR_PEER_CLOSED); @@ -78,7 +78,7 @@ // Verify that the case when the service doesn't exist is handled properly. TEST_F(ServiceDirectoryTest, NoService) { service_binding_.reset(); - auto stub = client_context_->ConnectToService<test_fidl::TestInterface>(); + auto stub = client_context_->ConnectToService<testfidl::TestInterface>(); VerifyTestInterface(&stub, true); }
diff --git a/base/fuchsia/test.fidl b/base/fuchsia/test.fidl index 1ecc89d..b76b194 100644 --- a/base/fuchsia/test.fidl +++ b/base/fuchsia/test.fidl
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -library base.fuchsia.test_fidl; +library base.fuchsia.testfidl; [Discoverable] interface TestInterface {
diff --git a/build/android/lint/suppressions.xml b/build/android/lint/suppressions.xml index 6e5562a..c4b132f 100644 --- a/build/android/lint/suppressions.xml +++ b/build/android/lint/suppressions.xml
@@ -333,10 +333,6 @@ <!-- 2 resource sets used by clank widgets for each channel --> <ignore regexp="The resource `R.string.bookmark_widget_title.*` appears to be unused"/> <ignore regexp="The resource `R.string.search_widget_title.*` appears to be unused"/> - <!-- 3 Download location strings checked in before M68 deadline --> - <!-- TODO(xingliu): Remove these. see crbug.com/840464. --> - <ignore regexp="The resource `R.string.download_location_not_enough_space_sd_card_full` appears to be unused"/> - <ignore regexp="The resource `R.string.download_location_notification_retry*` appears to be unused"/> <!-- Endnote: Please specify number of suppressions when adding more --> </issue> <issue id="UseCompoundDrawables">
diff --git a/build/config/BUILD.gn b/build/config/BUILD.gn index d06814e..997cdc8 100644 --- a/build/config/BUILD.gn +++ b/build/config/BUILD.gn
@@ -277,7 +277,7 @@ } # Only //build/config/BUILDCONFIG.gn should reference this. -group("common_deps") { +group("executable_and_loadable_module_and_shared_library_deps") { public_deps = [] if (using_sanitizer) { @@ -301,33 +301,6 @@ } } -group("executable_deps") { - public_deps = [ - ":common_deps", - ] - if (use_custom_libcxx && !is_component_build) { - public_deps += [ "//buildtools/third_party/libc++abi" ] - } -} - -group("loadable_module_deps") { - public_deps = [ - ":common_deps", - ] - if (use_custom_libcxx && !is_component_build && !(is_asan || is_ubsan_vptr)) { - public_deps += [ "//buildtools/third_party/libc++abi" ] - } -} - -group("shared_library_deps") { - public_deps = [ - ":common_deps", - ] - if (use_custom_libcxx && !is_component_build && !(is_asan || is_ubsan_vptr)) { - public_deps += [ "//buildtools/third_party/libc++abi" ] - } -} - # Executable configs ----------------------------------------------------------- # Windows linker setup for EXEs and DLLs.
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn index 362a7861..0c1b861f 100644 --- a/build/config/BUILDCONFIG.gn +++ b/build/config/BUILDCONFIG.gn
@@ -650,20 +650,20 @@ # # Variables # no_default_deps: If true, no standard dependencies will be added. -foreach(_target_type, +foreach(target_type, [ "executable", "loadable_module", "shared_library", ]) { - template(_target_type) { - target(_target_type, target_name) { + template(target_type) { + target(target_type, target_name) { forward_variables_from(invoker, "*", [ "no_default_deps" ]) if (!defined(deps)) { deps = [] } if (!defined(invoker.no_default_deps) || !invoker.no_default_deps) { - deps += [ "//build/config:${_target_type}_deps" ] + deps += [ "//build/config:executable_and_loadable_module_and_shared_library_deps" ] } } }
diff --git a/build/config/c++/c++.gni b/build/config/c++/c++.gni index 52edf0a..85ffde0 100644 --- a/build/config/c++/c++.gni +++ b/build/config/c++/c++.gni
@@ -22,6 +22,16 @@ # expected usage is to set use_custom_libcxx=false and # use_custom_libcxx_for_host=true in the passed in buildargs. use_custom_libcxx_for_host = false + + # ASan, MSan and TSan builds need to override operator new, operator delete, + # and some exception handling symbols, so libc++ must be a shared library to + # prevent duplicate symbol errors when linking. + # Additionally, -fsanitize=vptr requires libc++ to be a shared library + # because the ubsan runtime library that implements -fsanitize=vptr calls + # dynamic_cast with the ABI type info classes, which won't return the right + # answer if each DSO has its own copy of the ABI classes. + libcpp_is_static = !is_component_build && !is_asan && !is_msan && !is_tsan && + !is_ubsan && !is_ubsan_security && !is_ubsan_vptr } use_custom_libcxx =
diff --git a/build/config/gcc/BUILD.gn b/build/config/gcc/BUILD.gn index 14a2ec9..614d55dc 100644 --- a/build/config/gcc/BUILD.gn +++ b/build/config/gcc/BUILD.gn
@@ -106,8 +106,8 @@ ] } else { # See the rpath_for... config above for why this is necessary for component - # builds. - if (is_component_build) { + # builds. Sanitizers use a custom libc++ where this is also necessary. + if (is_component_build || using_sanitizer || !libcpp_is_static) { configs = [ ":rpath_for_built_shared_libraries" ] } if (current_cpu == "mipsel" || current_cpu == "mips64el") {
diff --git a/build/config/posix/BUILD.gn b/build/config/posix/BUILD.gn index cf712a1d..91405fd 100644 --- a/build/config/posix/BUILD.gn +++ b/build/config/posix/BUILD.gn
@@ -35,12 +35,12 @@ libs = [] if (use_custom_libcxx) { - if (!is_component_build) { + if (libcpp_is_static) { # Don't leak any symbols on a static build. - defines += [ "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" ] - if (!is_asan && !is_ubsan_vptr) { - defines += [ "_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" ] - } + defines += [ + "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS", + "_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS", + ] } if (!is_clang) { # Gcc has a built-in abs() definition with default visibility.
diff --git a/build/config/win/BUILD.gn b/build/config/win/BUILD.gn index 5dcc9ef5..02895ad3 100644 --- a/build/config/win/BUILD.gn +++ b/build/config/win/BUILD.gn
@@ -222,7 +222,7 @@ if (use_custom_libcxx) { cflags_cc += [ "-I" + rebase_path("$libcxx_prefix/include", root_build_dir) ] - if (!is_component_build) { + if (libcpp_is_static) { defines += [ "_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" ] }
diff --git a/build/fuchsia/sdk.sha1 b/build/fuchsia/sdk.sha1 index d0c37bc..b0d0abd8 100644 --- a/build/fuchsia/sdk.sha1 +++ b/build/fuchsia/sdk.sha1
@@ -1 +1 @@ -c4a06fe7a901ee3c23359052bd7d9e448d8207ce \ No newline at end of file +d09698fad09c2b64e9e6c4b0eea36670ab4b8097 \ No newline at end of file
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc index 4318206..327e907 100644 --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc
@@ -565,6 +565,10 @@ if (begin_impl_frame_state_ != BeginImplFrameState::INSIDE_BEGIN_FRAME) return false; + // Don't invalidate if we cannnot draw. + if (PendingDrawsShouldBeAborted()) + return false; + // TODO(sunnyps): needs_prepare_tiles_ is needed here because PrepareTiles is // called only inside the deadline / draw phase. We could remove this if we // allowed PrepareTiles to happen in OnBeginImplFrame.
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc index 53dccc0..7c768c7c 100644 --- a/cc/scheduler/scheduler_unittest.cc +++ b/cc/scheduler/scheduler_unittest.cc
@@ -2992,6 +2992,40 @@ client_->Reset(); } +TEST_F(SchedulerTest, InvalidateLayerTreeFrameSinkWhenCannotDraw) { + scheduler_settings_.using_synchronous_renderer_compositor = true; + SetUpScheduler(EXTERNAL_BFS); + + scheduler_->SetCanDraw(false); + + scheduler_->SetNeedsRedraw(); + EXPECT_ACTIONS("AddObserver(this)"); + client_->Reset(); + + // Do not invalidate in next BeginFrame. + EXPECT_SCOPED(AdvanceFrame()); + EXPECT_ACTIONS("WillBeginImplFrame"); + client_->Reset(); + + // Redraw is not cleared. + EXPECT_TRUE(scheduler_->RedrawPending()); + + scheduler_->SetCanDraw(true); + + // Do invalidate in next BeginFrame. + EXPECT_SCOPED(AdvanceFrame()); + EXPECT_ACTIONS("WillBeginImplFrame", + "ScheduledActionInvalidateLayerTreeFrameSink"); + client_->Reset(); + + bool resourceless_software_draw = false; + bool skip_draw = false; + scheduler_->OnDrawForLayerTreeFrameSink(resourceless_software_draw, + skip_draw); + EXPECT_ACTIONS("ScheduledActionDrawIfPossible"); + EXPECT_FALSE(scheduler_->RedrawPending()); +} + TEST_F(SchedulerTest, SetNeedsOneBeginImplFrame) { SetUpScheduler(EXTERNAL_BFS);
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index 8a0c802..7a970a8b 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -1441,6 +1441,7 @@ tree_impl->SetLocalSurfaceIdFromParent(local_surface_id_from_parent_); has_pushed_local_surface_id_from_parent_ = true; tree_impl->SetDeviceViewportSize(device_viewport_size_); + tree_impl->SetViewportVisibleRect(viewport_visible_rect_); if (pending_page_scale_animation_) { tree_impl->SetPendingPageScaleAnimation( @@ -1466,7 +1467,6 @@ host_impl->SetContentHasNonAAPaint(content_has_non_aa_paint_); RecordGpuRasterizationHistogram(host_impl); - host_impl->SetViewportVisibleRect(viewport_visible_rect_); host_impl->SetDebugState(debug_state_); }
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc index f1531396..f46ade2 100644 --- a/cc/trees/layer_tree_host_common_unittest.cc +++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -10523,7 +10523,7 @@ gfx::Rect viewport_visible_rect = gfx::Rect(100, 100, 200, 200); host_impl.active_tree()->SetDeviceViewportSize(device_viewport_size); - host_impl.SetViewportVisibleRect(viewport_visible_rect); + host_impl.active_tree()->SetViewportVisibleRect(viewport_visible_rect); host_impl.active_tree()->SetRootLayerForTesting( LayerImpl::Create(host_impl.active_tree(), 1));
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index abaa7f98..c2b69e1 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -3211,15 +3211,6 @@ client_->SetBeginFrameSource(source); } -void LayerTreeHostImpl::SetViewportVisibleRect(const gfx::Rect& visible_rect) { - if (visible_rect == viewport_visible_rect_) - return; - - viewport_visible_rect_ = visible_rect; - SetFullViewportDamage(); - active_tree_->set_needs_update_draw_properties(); -} - const gfx::Transform& LayerTreeHostImpl::DrawTransform() const { return external_transform_; } @@ -3773,6 +3764,15 @@ did_scroll_x_for_scroll_gesture_ |= scroll_delta.x() != 0; did_scroll_y_for_scroll_gesture_ |= scroll_delta.y() != 0; scroll_animating_latched_element_id_ = scroll_node->element_id; + // Flash the overlay scrollbar even if the scroll dalta is 0. + if (settings_.scrollbar_flash_after_any_scroll_update) { + FlashAllScrollbars(false); + } else { + ScrollbarAnimationController* animation_controller = + ScrollbarAnimationControllerForElementId(scroll_node->element_id); + if (animation_controller) + animation_controller->WillUpdateScroll(); + } return scroll_status; }
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h index 654713f..b52b6a61 100644 --- a/cc/trees/layer_tree_host_impl.h +++ b/cc/trees/layer_tree_host_impl.h
@@ -550,9 +550,6 @@ ManagedMemoryPolicy ActualManagedMemoryPolicy() const; - void SetViewportVisibleRect(const gfx::Rect& visible_rect); - gfx::Rect viewport_visible_rect() const { return viewport_visible_rect_; } - const gfx::Transform& DrawTransform() const; std::unique_ptr<ScrollAndScaleSet> ProcessScrollDeltas(); @@ -988,11 +985,6 @@ // manager, if there were no limit on memory usage. size_t max_memory_needed_bytes_ = 0; - // Viewport clip rect passed in from the main thrad, in physical pixels. - // This is used for out-of-process iframes whose size exceeds the window - // in order to prevent full raster. - gfx::Rect viewport_visible_rect_; - // Optional top-level constraints that can be set by the LayerTreeFrameSink. // - external_transform_ applies a transform above the root layer // - external_viewport_ is used DrawProperties, tile management and
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index f5c348f..8d28461 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -3960,8 +3960,7 @@ ResetScrollbars(); // Scroll on child should flash all scrollbars. - host_impl_->ScrollBegin(BeginState(gfx::Point(51, 51)).get(), - InputHandler::WHEEL); + host_impl_->ScrollAnimatedBegin(BeginState(gfx::Point(51, 51)).get()); host_impl_->ScrollAnimated(gfx::Point(51, 51), gfx::Vector2d(0, 100)); host_impl_->ScrollEnd(EndState().get());
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index 46a495e..367b29e 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -476,6 +476,7 @@ target_tree->RequestNewLocalSurfaceId(); target_tree->SetLocalSurfaceIdFromParent(local_surface_id_from_parent()); target_tree->SetDeviceViewportSize(device_viewport_size_); + target_tree->SetViewportVisibleRect(viewport_visible_rect_); target_tree->pending_page_scale_animation_ = std::move(pending_page_scale_animation_); @@ -1025,6 +1026,17 @@ host_impl_->SetViewportDamage(GetDeviceViewport()); } +void LayerTreeImpl::SetViewportVisibleRect(const gfx::Rect& visible_rect) { + if (visible_rect == viewport_visible_rect_) + return; + + viewport_visible_rect_ = visible_rect; + + set_needs_update_draw_properties(); + if (IsActiveTree()) + host_impl_->SetViewportDamage(GetDeviceViewport()); +} + gfx::Rect LayerTreeImpl::GetDeviceViewport() const { // TODO(fsamuel): We should plumb |external_viewport| similar to the // way we plumb |device_viewport_size_|. @@ -1489,10 +1501,6 @@ return host_impl_->memory_history(); } -gfx::Rect LayerTreeImpl::viewport_visible_rect() const { - return host_impl_->viewport_visible_rect(); -} - DebugRectHistory* LayerTreeImpl::debug_rect_history() const { return host_impl_->debug_rect_history(); }
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h index 877b0a7..62a41c96 100644 --- a/cc/trees/layer_tree_impl.h +++ b/cc/trees/layer_tree_impl.h
@@ -117,7 +117,6 @@ ImageAnimationController* image_animation_controller() const; FrameRateCounter* frame_rate_counter() const; MemoryHistory* memory_history() const; - gfx::Rect viewport_visible_rect() const; DebugRectHistory* debug_rect_history() const; bool IsActiveTree() const; bool IsPendingTree() const; @@ -329,6 +328,10 @@ } void SetDeviceViewportSize(const gfx::Size& device_viewport_size); + void SetViewportVisibleRect(const gfx::Rect& visible_rect); + const gfx::Rect& viewport_visible_rect() const { + return viewport_visible_rect_; + } // TODO(fsamuel): The reason this is not a trivial accessor is because it // may return an external viewport specified in LayerTreeHostImpl. In the @@ -637,6 +640,11 @@ bool new_local_surface_id_request_ = false; gfx::Size device_viewport_size_; + // Viewport clip rect passed in from the main thrad, in physical pixels. + // This is used for out-of-process iframes whose size exceeds the window + // in order to prevent full raster. + gfx::Rect viewport_visible_rect_; + scoped_refptr<SyncedElasticOverscroll> elastic_overscroll_; std::unique_ptr<OwnedLayerImplList> layers_;
diff --git a/chrome/VERSION b/chrome/VERSION index f6c0fed5..17381c8c 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=70 MINOR=0 -BUILD=3504 +BUILD=3505 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index cecbdf9..dff799b 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -375,6 +375,7 @@ java_cpp_enum("chrome_android_java_enums_srcjar") { sources = [ + "//chrome/browser/android/customtabs/detached_resource_request.h", "//chrome/browser/android/digital_asset_links/digital_asset_links_handler.h", "//chrome/browser/android/feedback/connectivity_checker.cc", "//chrome/browser/android/policy/policy_auditor.cc",
diff --git a/chrome/android/java/res/layout/download_manager_generic_item.xml b/chrome/android/java/res/layout/download_manager_generic_item.xml index d159ece..38ab921 100644 --- a/chrome/android/java/res/layout/download_manager_generic_item.xml +++ b/chrome/android/java/res/layout/download_manager_generic_item.xml
@@ -4,59 +4,53 @@ found in the LICENSE file. --> -<org.chromium.chrome.browser.download.home.view.GenericListItemView + <android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="wrap_content" + android:minHeight="64dp" android:clickable="true" - android:background="@color/modern_primary_color" > + android:background="@android:color/white" + app:columnCount="3" + app:rowCount="2"> - <android.support.v7.widget.GridLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:minHeight="64dp" - android:background="@android:color/white" - app:columnCount="3" - app:rowCount="2"> + <org.chromium.chrome.browser.widget.TintedImageView + android:id="@+id/thumbnail" + android:layout_width="@dimen/download_manager_generic_thumbnail_size" + android:layout_height="@dimen/download_manager_generic_thumbnail_size" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + android:scaleType="center" + app:layout_column="0" + app:layout_row="0" + app:layout_rowSpan="2" + app:layout_gravity="center_vertical" + app:chrometint="@color/dark_mode_tint" /> - <org.chromium.chrome.browser.widget.TintedImageView - android:id="@+id/thumbnail" - android:layout_width="@dimen/download_manager_generic_thumbnail_size" - android:layout_height="@dimen/download_manager_generic_thumbnail_size" - android:layout_marginStart="16dp" - android:layout_marginEnd="16dp" - android:scaleType="center" - app:layout_column="0" - app:layout_row="0" - app:layout_rowSpan="2" - app:layout_gravity="center_vertical" - app:chrometint="@color/dark_mode_tint" /> + <TextView + android:id="@+id/title" + style="@style/DownloadItemText" + android:layout_marginTop="11dp" + android:textAppearance="@style/BlackTitle1" + app:layout_column="1" + app:layout_row="0" + app:layout_gravity="fill_horizontal" /> - <TextView - android:id="@+id/title" - style="@style/DownloadItemText" - android:layout_marginTop="11dp" - android:textAppearance="@style/BlackTitle1" - app:layout_column="1" - app:layout_row="0" - app:layout_gravity="fill_horizontal" /> + <TextView + android:id="@+id/caption" + style="@style/DownloadItemText" + android:textAppearance="@style/BlackHint2" + app:layout_column="1" + app:layout_row="1" + app:layout_gravity="fill_horizontal" /> - <TextView - android:id="@+id/caption" - style="@style/DownloadItemText" - android:textAppearance="@style/BlackHint2" - app:layout_column="1" - app:layout_row="1" - app:layout_gravity="fill_horizontal" /> - - <include layout="@layout/list_menu_button" - android:layout_width="48dp" - android:layout_height="48dp" - app:layout_column="2" - app:layout_row="0" - app:layout_rowSpan="2" - app:layout_gravity="center_vertical" /> - </android.support.v7.widget.GridLayout> -</org.chromium.chrome.browser.download.home.view.GenericListItemView> \ No newline at end of file + <include layout="@layout/list_menu_button" + android:layout_width="48dp" + android:layout_height="48dp" + app:layout_column="2" + app:layout_row="0" + app:layout_rowSpan="2" + app:layout_gravity="center_vertical" /> +</android.support.v7.widget.GridLayout>
diff --git a/chrome/android/java/res/layout/download_manager_image_item.xml b/chrome/android/java/res/layout/download_manager_image_item.xml index 4e197cdf..71900cc 100644 --- a/chrome/android/java/res/layout/download_manager_image_item.xml +++ b/chrome/android/java/res/layout/download_manager_image_item.xml
@@ -4,7 +4,7 @@ found in the LICENSE file. --> -<org.chromium.chrome.browser.download.home.view.ImageListItemView +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" @@ -31,4 +31,4 @@ android:visibility="gone" app:chrometint="@color/dark_mode_tint"/> -</org.chromium.chrome.browser.download.home.view.ImageListItemView> +</FrameLayout>
diff --git a/chrome/android/java/res/layout/download_manager_prefetch_item.xml b/chrome/android/java/res/layout/download_manager_prefetch_item.xml index ef371e2..21cb9ef 100644 --- a/chrome/android/java/res/layout/download_manager_prefetch_item.xml +++ b/chrome/android/java/res/layout/download_manager_prefetch_item.xml
@@ -4,101 +4,96 @@ found in the LICENSE file. --> -<org.chromium.chrome.browser.download.home.view.PrefetchListItemView +<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent" - android:clickable="true" > + android:layout_height="114dp" + android:background="@android:color/white" + android:clickable="true" + app:columnCount="4" + app:rowCount="4"> - <android.support.v7.widget.GridLayout - android:layout_width="match_parent" + <ImageView + android:id="@+id/thumbnail" + android:layout_width="114dp" android:layout_height="114dp" - android:background="@android:color/white" - app:columnCount="4" - app:rowCount="4"> + android:layout_marginEnd="9dp" + android:scaleType="fitCenter" + android:background="@color/google_grey_100" + app:layout_column="0" + app:layout_row="0" + app:layout_rowSpan="4" + tools:ignore="ContentDescription" /> - <ImageView - android:id="@+id/thumbnail" - android:layout_width="114dp" - android:layout_height="114dp" - android:layout_marginEnd="9dp" - android:scaleType="fitCenter" - android:background="@color/google_grey_100" - app:layout_column="0" - app:layout_row="0" - app:layout_rowSpan="4" - tools:ignore="ContentDescription" /> + <Space + android:layout_width="wrap_content" + android:layout_height="0dp" + app:layout_gravity="fill" + app:layout_column="0" + app:layout_row="3" + app:layout_columnSpan="4" /> - <Space - android:layout_width="wrap_content" - android:layout_height="0dp" - app:layout_gravity="fill" - app:layout_column="0" - app:layout_row="3" - app:layout_columnSpan="4" /> + <TextView + android:id="@+id/title" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginTop="12dp" + android:minHeight="40dp" + android:maxLines="2" + android:ellipsize="end" + android:textAppearance="@style/BlackBodyDefault" + android:textAlignment="viewStart" + app:layout_column="1" + app:layout_row="0" + app:layout_columnSpan="2" + app:layout_gravity="fill_horizontal" /> - <TextView - android:id="@+id/title" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginTop="12dp" - android:minHeight="40dp" - android:maxLines="2" - android:ellipsize="end" - android:textAppearance="@style/BlackBodyDefault" - android:textAlignment="viewStart" - app:layout_column="1" - app:layout_row="0" - app:layout_columnSpan="2" - app:layout_gravity="fill_horizontal" /> + <TextView + android:id="@+id/caption" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + android:maxLines="1" + android:ellipsize="end" + android:textAppearance="@style/BlackCaption" + android:textAlignment="viewStart" + app:layout_column="1" + app:layout_row="1" + app:layout_columnSpan="3" + app:layout_gravity="fill_horizontal" /> - <TextView - android:id="@+id/caption" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:layout_marginBottom="8dp" - android:maxLines="1" - android:ellipsize="end" - android:textAppearance="@style/BlackCaption" - android:textAlignment="viewStart" - app:layout_column="1" - app:layout_row="1" - app:layout_columnSpan="3" - app:layout_gravity="fill_horizontal" /> + <TextView + android:id="@+id/timestamp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:maxLines="1" + android:ellipsize="end" + android:textAppearance="@style/BlackCaption" + android:textAlignment="viewStart" + app:layout_column="1" + app:layout_row="2" + app:layout_gravity="center_vertical" /> - <TextView - android:id="@+id/timestamp" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:maxLines="1" - android:ellipsize="end" - android:textAppearance="@style/BlackCaption" - android:textAlignment="viewStart" - app:layout_column="1" - app:layout_row="2" - app:layout_gravity="center_vertical" /> + <ImageView + android:layout_width="12dp" + android:layout_height="12dp" + android:layout_marginStart="4dp" + android:src="@drawable/offline_pin_round" + android:scaleType="centerInside" + android:tint="@color/default_icon_color" + app:layout_column="2" + app:layout_row="2" + app:layout_columnSpan="2" + app:layout_gravity="start|center_vertical" + tools:ignore="ContentDescription" /> - <ImageView - android:layout_width="12dp" - android:layout_height="12dp" - android:layout_marginStart="4dp" - android:src="@drawable/offline_pin_round" - android:scaleType="centerInside" - android:tint="@color/default_icon_color" - app:layout_column="2" - app:layout_row="2" - app:layout_columnSpan="2" - app:layout_gravity="start|center_vertical" - tools:ignore="ContentDescription" /> - - <include layout="@layout/list_menu_button" - android:layout_width="48dp" - android:layout_height="48dp" - android:paddingTop="12dp" - app:layout_column="3" - app:layout_row="0" /> - </android.support.v7.widget.GridLayout> -</org.chromium.chrome.browser.download.home.view.PrefetchListItemView> \ No newline at end of file + <include layout="@layout/list_menu_button" + android:layout_width="48dp" + android:layout_height="48dp" + android:paddingTop="12dp" + app:layout_column="3" + app:layout_row="0" /> +</android.support.v7.widget.GridLayout>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java index 90cfd0c..fc5e5a7f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -163,6 +163,7 @@ public static final String CCT_PARALLEL_REQUEST = "CCTParallelRequest"; public static final String CCT_POST_MESSAGE_API = "CCTPostMessageAPI"; public static final String CCT_REDIRECT_PRECONNECT = "CCTRedirectPreconnect"; + public static final String CCT_RESOURCE_PREFETCH = "CCTResourcePrefetch"; public static final String CHROME_DUET = "ChromeDuet"; // TODO(mdjones): Remove CHROME_HOME_SWIPE_VELOCITY_FEATURE or rename. public static final String CHROME_HOME_SWIPE_VELOCITY_FEATURE = "ChromeHomeSwipeLogicVelocity";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionsService.java b/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionsService.java index 8c378c6..adb28db 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionsService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionsService.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.browseractions; import android.app.Activity; +import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; @@ -110,9 +111,6 @@ Toast.LENGTH_SHORT) .show(); updateNumTabCreatedInBackground(); - NotificationUmaTracker.getInstance().onNotificationShown( - NotificationUmaTracker.SystemNotificationType.BROWSER_ACTIONS, - ChannelDefinitions.ChannelId.BROWSER); } else if (TextUtils.equals(intent.getAction(), ACTION_TAB_CREATION_CHROME_DISPLAYED)) { clearPendingStatus(); removeObserver(); @@ -231,8 +229,13 @@ } private void sendBrowserActionsNotification(boolean isUpdate, int tabId) { - ChromeNotificationBuilder builder = createNotificationBuilder(isUpdate, tabId); - startForeground(NotificationConstants.NOTIFICATION_ID_BROWSER_ACTIONS, builder.build()); + Notification notification = createNotificationBuilder(isUpdate, tabId).build(); + startForeground(NotificationConstants.NOTIFICATION_ID_BROWSER_ACTIONS, notification); + + if (!isUpdate) { + NotificationUmaTracker.getInstance().onNotificationShown( + NotificationUmaTracker.SystemNotificationType.BROWSER_ACTIONS, notification); + } } private ChromeNotificationBuilder createNotificationBuilder(boolean isUpdate, int tabId) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityClient.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityClient.java index 97f5172..d5d6a03 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityClient.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityClient.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.browserservices; +import android.app.Notification; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -69,12 +70,14 @@ service.getComponentName().getPackageName()); } + Notification notification = builder.build(); + boolean success = - service.notify(platformTag, platformId, builder.build(), channelDisplayName); + service.notify(platformTag, platformId, notification, channelDisplayName); if (success) { NotificationUmaTracker.getInstance().onNotificationShown( - NotificationUmaTracker.SystemNotificationType.SITES, null); + NotificationUmaTracker.SystemNotificationType.SITES, notification); } }); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java index 8533604..c8f5e75 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java
@@ -181,6 +181,7 @@ private long mLastMayLaunchUrlTimestamp; private boolean mCanUseHiddenTab; private boolean mAllowParallelRequest; + private boolean mAllowResourcePrefetch; private boolean mShouldGetPageLoadMetrics; public SessionParams(Context context, int uid, DisconnectCallback callback, @@ -687,6 +688,17 @@ return params != null ? params.mAllowParallelRequest : false; } + public synchronized void setAllowResourcePrefetchForSession( + CustomTabsSessionToken session, boolean allowed) { + SessionParams params = mSessionParams.get(session); + if (params != null) params.mAllowResourcePrefetch = allowed; + } + + public synchronized boolean getAllowResourcePrefetchForSession(CustomTabsSessionToken session) { + SessionParams params = mSessionParams.get(session); + return params != null ? params.mAllowResourcePrefetch : false; + } + public synchronized void setShouldGetPageLoadMetricsForSession( CustomTabsSessionToken session, boolean allowed) { SessionParams params = mSessionParams.get(session);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java index 2a7938e..518789e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
@@ -148,6 +148,8 @@ @VisibleForTesting static final String PARALLEL_REQUEST_URL_KEY = "android.support.customtabs.PARALLEL_REQUEST_URL"; + static final String RESOURCE_PREFETCH_URL_LIST_KEY = + "android.support.customtabs.RESOURCE_PREFETCH_URL_LIST"; @IntDef({ParallelRequestStatus.NO_REQUEST, ParallelRequestStatus.SUCCESS, ParallelRequestStatus.FAILURE_NOT_INITIALIZED, @@ -841,6 +843,7 @@ maybePreconnectToRedirectEndpoint(session, url, intent); handleParallelRequest(session, intent); + maybePrefetchResources(session, intent); } private void maybePreconnectToRedirectEndpoint( @@ -913,14 +916,55 @@ String urlString = url.toString(); String referrerString = referrer.toString(); - nativeCreateAndStartDetachedResourceRequest( - Profile.getLastUsedProfile(), urlString, referrerString, policy); + nativeCreateAndStartDetachedResourceRequest(Profile.getLastUsedProfile(), urlString, + referrerString, policy, DetachedResourceRequestMotivation.PARALLEL_REQUEST); if (mLogRequests) { Log.w(TAG, "startParallelRequest(%s, %s, %d)", urlString, referrerString, policy); } return ParallelRequestStatus.SUCCESS; } + /** + * Maybe starts a resource prefetch. + * + * @param session Calling context session. + * @param intent Incoming intent with the extras. + * @return Number of prefetch requests that have been sent. + */ + @VisibleForTesting + int maybePrefetchResources(CustomTabsSessionToken session, Intent intent) { + ThreadUtils.assertOnUiThread(); + + if (!mClientManager.getAllowResourcePrefetchForSession(session)) return 0; + + List<Uri> resourceList = + intent.getParcelableArrayListExtra(RESOURCE_PREFETCH_URL_LIST_KEY); + Uri referrer = intent.getParcelableExtra(PARALLEL_REQUEST_REFERRER_KEY); + int policy = + intent.getIntExtra(PARALLEL_REQUEST_REFERRER_POLICY_KEY, WebReferrerPolicy.DEFAULT); + + if (resourceList == null || referrer == null) return 0; + if (policy < 0 || policy > WebReferrerPolicy.LAST) policy = WebReferrerPolicy.DEFAULT; + if (!mClientManager.isFirstPartyOriginForSession(session, new Origin(referrer))) return 0; + + String referrerString = referrer.toString(); + int requestsSent = 0; + for (Uri url : resourceList) { + String urlString = url.toString(); + if (urlString.isEmpty() || !isValid(url)) continue; + + nativeCreateAndStartDetachedResourceRequest(Profile.getLastUsedProfile(), urlString, + referrerString, policy, DetachedResourceRequestMotivation.RESOURCE_PREFETCH); + ++requestsSent; + + if (mLogRequests) { + Log.w(TAG, "startResourcePrefetch(%s, %s, %d)", urlString, referrerString, policy); + } + } + + return requestsSent; + } + /** @return Whether {@code session} can create a parallel request for a given * {@code referrer}. */ @@ -1425,8 +1469,9 @@ "CustomTabs.SpeculationStatusOnSwap", status, SPECULATION_STATUS_ON_SWAP_MAX); } - private static native void nativeCreateAndStartDetachedResourceRequest( - Profile profile, String url, String origin, @WebReferrerPolicy int referrerPolicy); + private static native void nativeCreateAndStartDetachedResourceRequest(Profile profile, + String url, String origin, @WebReferrerPolicy int referrerPolicy, + @DetachedResourceRequestMotivation int motivation); public ModuleLoader getModuleLoader(ComponentName componentName) { if (mModuleLoader == null) mModuleLoader = new ModuleLoader(componentName);
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 47d3bfc4..0d122817 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
@@ -1355,7 +1355,7 @@ private void updateNotification(int notificationId, Notification notification, ContentId id, DownloadSharedPreferenceEntry entry) { updateNotification(notificationId, notification); - trackNotificationUma(id); + trackNotificationUma(id, notification); if (entry != null) { mDownloadSharedPreferenceHelper.addOrReplaceSharedPreferenceEntry(entry); @@ -1366,7 +1366,7 @@ new Pair<Integer, Notification>(notificationId, notification)); } - private void trackNotificationUma(ContentId id) { + private void trackNotificationUma(ContentId id, Notification notification) { // Check if we already have an entry in the DownloadSharedPreferenceHelper. This is a // reasonable indicator for whether or not a notification is already showing (or at least if // we had built one for this download before. @@ -1375,7 +1375,7 @@ LegacyHelpers.isLegacyOfflinePage(id) ? NotificationUmaTracker.SystemNotificationType.DOWNLOAD_PAGES : NotificationUmaTracker.SystemNotificationType.DOWNLOAD_FILES, - ChannelDefinitions.ChannelId.DOWNLOADS); + notification); // Record number of other notifications when there's a new notification. DownloadNotificationUmaHelper.recordExistingNotificationsCountHistogram(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService2.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService2.java index eecc1037..defb95426 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService2.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService2.java
@@ -30,7 +30,6 @@ import org.chromium.base.library_loader.LibraryProcessType; import org.chromium.chrome.R; import org.chromium.chrome.browser.notifications.NotificationUmaTracker; -import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.offline_items_collection.ContentId; import org.chromium.components.offline_items_collection.FailState; @@ -463,7 +462,7 @@ private void updateNotification(int notificationId, Notification notification, ContentId id, DownloadSharedPreferenceEntry entry) { updateNotification(notificationId, notification); - trackNotificationUma(id); + trackNotificationUma(id, notification); if (entry != null) { mDownloadSharedPreferenceHelper.addOrReplaceSharedPreferenceEntry(entry); @@ -472,7 +471,7 @@ } } - private void trackNotificationUma(ContentId id) { + private void trackNotificationUma(ContentId id, Notification notification) { // Check if we already have an entry in the DownloadSharedPreferenceHelper. This is a // reasonable indicator for whether or not a notification is already showing (or at least if // we had built one for this download before. @@ -481,7 +480,7 @@ LegacyHelpers.isLegacyOfflinePage(id) ? NotificationUmaTracker.SystemNotificationType.DOWNLOAD_PAGES : NotificationUmaTracker.SystemNotificationType.DOWNLOAD_FILES, - ChannelDefinitions.ChannelId.DOWNLOADS); + notification); // Record the number of other notifications when there's a new notification. DownloadNotificationUmaHelper.recordExistingNotificationsCountHistogram(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java index a177f259..fd303be 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java
@@ -944,7 +944,7 @@ dos.close(); } int responseCode = urlConnection.getResponseCode(); - if (responseCode == 200 || responseCode == -1) { + if (responseCode == HttpURLConnection.HTTP_OK || responseCode == -1) { return true; } return false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/FilterChipsProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/FilterChipsProvider.java index 0dfe5282..3aabe1a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/FilterChipsProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/FilterChipsProvider.java
@@ -79,21 +79,6 @@ } /** - * Sets whether or not a filter is enabled. - * @param type The type of filter to enable. - * @param enabled Whether or not that filter is enabled. - */ - public void setFilterEnabled(@FilterType int type, boolean enabled) { - int chipIndex = getChipIndex(type); - if (chipIndex == INVALID_INDEX) return; - Chip chip = mSortedChips.get(chipIndex); - - if (enabled == chip.enabled) return; - chip.enabled = enabled; - for (Observer observer : mObservers) observer.onChipChanged(chipIndex, chip); - } - - /** * Sets the filter that is currently selected. * @param type The type of filter to select. */ @@ -106,9 +91,9 @@ if (chip.selected && willSelect) return; if (chip.selected == willSelect) continue; chip.selected = willSelect; - - for (Observer observer : mObservers) observer.onChipChanged(i, chip); } + + for (Observer observer : mObservers) observer.onChipsChanged(); } /** @@ -136,7 +121,18 @@ @Override public List<Chip> getChips() { - return mSortedChips; + List<Chip> visibleChips = new ArrayList<>(); + for (Chip chip : mSortedChips) { + if (chip.enabled) visibleChips.add(chip); + } + + // Remove the none chip if no other chip is visible. + if (visibleChips.size() == 1) { + assert visibleChips.get(0).id == FilterType.NONE; + visibleChips.clear(); + } + + return visibleChips; } // OfflineItemFilterObserver implementation. @@ -165,8 +161,17 @@ filters.add(Filters.fromOfflineItem(item.filter)); } - // Set the enabled states correctly for all filter types. - for (Chip chip : mSortedChips) setFilterEnabled(chip.id, filters.contains(chip.id)); + // Set the enabled states correctly for all chips. + boolean chipsHaveChanged = false; + for (Chip chip : mSortedChips) { + boolean shouldEnable = filters.contains(chip.id); + chipsHaveChanged |= (shouldEnable != chip.enabled); + chip.enabled = shouldEnable; + } + + if (chipsHaveChanged) { + for (Observer observer : mObservers) observer.onChipsChanged(); + } // Validate that selection is on a valid type. for (Chip chip : mSortedChips) { @@ -181,12 +186,4 @@ setFilterSelected(id); mDelegate.onFilterSelected(id); } - - private int getChipIndex(@FilterType int type) { - for (int i = 0; i < mSortedChips.size(); i++) { - if (mSortedChips.get(i).id == type) return i; - } - - return INVALID_INDEX; - } } \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsCoordinator.java index 9e4b887..c22cc74 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsCoordinator.java
@@ -63,8 +63,7 @@ // ChipsProvider.Observer implementation. @Override - public void onChipChanged(int position, Chip chip) { - mModel.update(position, chip); + public void onChipsChanged() { mModel.set(mProvider.getChips()); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsProvider.java index 948176368..8af0ff1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/chips/ChipsProvider.java
@@ -10,8 +10,8 @@ public interface ChipsProvider { /** Interface to be called a Chip's state changes. */ interface Observer { - /** Called whenever the list of Chips changes. */ - void onChipChanged(int position, Chip chip); + /** Called whenever the list of Chips or selection changes. */ + void onChipsChanged(); } /** Adds an {@link Observer} to be notified of Chip state changes. */ @@ -20,6 +20,6 @@ /** Removes an {@link Observer} to be notified of Chip state changes. */ void removeObserver(Observer observer); - /** @return A list of {@link Chip} objects. */ + /** @return A list of {@link Chip} objects that are currently visible. */ List<Chip> getChips(); } \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java index ef2a2af..93ef2a3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java
@@ -15,6 +15,7 @@ import android.view.View; import org.chromium.chrome.R; +import org.chromium.chrome.browser.download.home.list.holder.ListItemViewHolder; import org.chromium.chrome.browser.modelutil.ForwardingListObservable; import org.chromium.chrome.browser.modelutil.PropertyModelChangeProcessor; import org.chromium.chrome.browser.modelutil.RecyclerViewAdapter;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListViewAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListViewAdapter.java index 94ab0280..2569a90 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListViewAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListViewAdapter.java
@@ -6,6 +6,7 @@ import android.support.v7.widget.RecyclerView; +import org.chromium.chrome.browser.download.home.list.holder.ListItemViewHolder; import org.chromium.chrome.browser.modelutil.RecyclerViewAdapter; /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItem.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItem.java index ef8624f..693bd94 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItem.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItem.java
@@ -75,4 +75,4 @@ return (((long) item.id.hashCode()) << 32) + (item.creationTimeMs & 0x0FFFFFFFF); } } -} \ No newline at end of file +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItemViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItemViewHolder.java deleted file mode 100644 index 399521b..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItemViewHolder.java +++ /dev/null
@@ -1,502 +0,0 @@ -// Copyright 2018 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.home.list; - -import android.support.annotation.CallSuper; -import android.support.annotation.DrawableRes; -import android.support.annotation.Nullable; -import android.support.v7.widget.AppCompatTextView; -import android.support.v7.widget.RecyclerView.ViewHolder; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewGroup.LayoutParams; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.ProgressBar; -import android.widget.TextView; - -import org.chromium.chrome.R; -import org.chromium.chrome.browser.download.DownloadUtils; -import org.chromium.chrome.browser.download.home.list.ListItem.DateListItem; -import org.chromium.chrome.browser.download.home.list.ListItem.OfflineItemListItem; -import org.chromium.chrome.browser.download.home.list.ListItem.ViewListItem; -import org.chromium.chrome.browser.download.home.view.GenericListItemView; -import org.chromium.chrome.browser.download.home.view.ImageListItemView; -import org.chromium.chrome.browser.download.home.view.ListItemView; -import org.chromium.chrome.browser.widget.ListMenuButton; -import org.chromium.chrome.browser.widget.ListMenuButton.Item; -import org.chromium.chrome.browser.widget.TintedImageButton; -import org.chromium.components.offline_items_collection.ContentId; -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; - -/** - * A {@link ViewHolder} responsible for building and setting properties on the underlying Android - * {@link View}s for the Download Manager list. - */ -abstract class ListItemViewHolder extends ViewHolder { - private static final int INVALID_ID = -1; - - /** Creates an instance of a {@link ListItemViewHolder}. */ - protected ListItemViewHolder(View itemView) { - super(itemView); - } - - /** - * Used as a method reference for ViewHolderFactory. - * @see - * org.chromium.chrome.browser.modelutil.RecyclerViewAdapter.ViewHolderFactory#createViewHolder - */ - public static ListItemViewHolder create(ViewGroup parent, @ListUtils.ViewType int viewType) { - switch (viewType) { - case ListUtils.ViewType.DATE: - return DateViewHolder.create(parent); - case ListUtils.ViewType.IN_PROGRESS: - return InProgressViewHolder.create(parent); - case ListUtils.ViewType.GENERIC: - return GenericViewHolder.create(parent); - case ListUtils.ViewType.VIDEO: - return new VideoViewHolder(parent); - case ListUtils.ViewType.IMAGE: - return ImageViewHolder.create(parent); - case ListUtils.ViewType.CUSTOM_VIEW: - return new CustomViewHolder(parent); - case ListUtils.ViewType.PREFETCH: - return PrefetchViewHolder.create(parent); - } - - assert false; - return null; - } - - /** - * Binds the currently held {@link View} to {@code item}. - * @param properties The shared {@link ListPropertyModel} all items can access. - * @param item The {@link ListItem} to visually represent in this {@link ViewHolder}. - */ - public abstract void bind(ListPropertyModel properties, ListItem item); - - /** A {@link ViewHolder} that holds a {@link View} that is opaque to the holder. */ - public static class CustomViewHolder extends ListItemViewHolder { - /** Creates a new {@link CustomViewHolder} instance. */ - public CustomViewHolder(ViewGroup parent) { - super(new FrameLayout(parent.getContext())); - itemView.setLayoutParams( - new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); - } - - // ListItemViewHolder implemenation. - @Override - public void bind(ListPropertyModel properties, ListItem item) { - ViewListItem viewItem = (ViewListItem) item; - ViewGroup viewGroup = (ViewGroup) itemView; - - if (viewGroup.getChildCount() > 0 && viewGroup.getChildAt(0) == viewItem.customView) { - return; - } - - viewGroup.removeAllViews(); - viewGroup.addView(viewItem.customView, - new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); - } - } - - /** A {@link ViewHolder} specifically meant to display a date header. */ - public static class DateViewHolder extends ListItemViewHolder { - /** Creates a new {@link DateViewHolder} instance. */ - public static DateViewHolder create(ViewGroup parent) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.download_manager_date_item, null); - return new DateViewHolder(view); - } - - private DateViewHolder(View view) { - super(view); - } - - // ListItemViewHolder implementation. - @Override - public void bind(ListPropertyModel properties, ListItem item) { - DateListItem dateItem = (DateListItem) item; - ((TextView) itemView).setText(UiUtils.dateToHeaderString(dateItem.date)); - } - } - - /** A {@link ViewHolder} specifically meant to display an in-progress {@code OfflineItem}. */ - public static class InProgressViewHolder extends ListItemViewHolder { - private final ProgressBar mProgressBar; - private final TextView mTitle; - private final TextView mCaption; - private final TintedImageButton mPauseResumeButton; - private final TintedImageButton mCancelButton; - - /** - * Creates a new {@link InProgressViewHolder} instance. - */ - public static InProgressViewHolder create(ViewGroup parent) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.download_manager_in_progress_item, null); - return new InProgressViewHolder(view); - } - - /** - * Creates a new {@link InProgressViewHolder} instance. - */ - public InProgressViewHolder(View view) { - super(view); - mProgressBar = view.findViewById(R.id.progress_bar); - mTitle = view.findViewById(R.id.title); - mCaption = view.findViewById(R.id.caption); - mPauseResumeButton = view.findViewById(R.id.pause_button); - mCancelButton = view.findViewById(R.id.cancel_button); - } - - // ListItemViewHolder implementation. - @Override - public void bind(ListPropertyModel properties, ListItem item) { - OfflineItemListItem offlineItem = (OfflineItemListItem) item; - mTitle.setText(offlineItem.item.title); - mCancelButton.setOnClickListener( - v -> properties.getCancelCallback().onResult(offlineItem.item)); - - if (offlineItem.item.state == OfflineItemState.PAUSED) { - mPauseResumeButton.setImageResource(R.drawable.ic_play_arrow_white_24dp); - mPauseResumeButton.setContentDescription(itemView.getContext().getString( - R.string.download_notification_resume_button)); - } else { - mPauseResumeButton.setImageResource(R.drawable.ic_pause_white_24dp); - mPauseResumeButton.setContentDescription(itemView.getContext().getString( - R.string.download_notification_pause_button)); - } - - // TODO(shaktisahu): Create status string for the new specs. - mCaption.setText( - DownloadUtils.getProgressTextForNotification(offlineItem.item.progress)); - mPauseResumeButton.setOnClickListener(view -> { - if (offlineItem.item.state == OfflineItemState.PAUSED) { - properties.getResumeCallback().onResult(offlineItem.item); - } else { - properties.getPauseCallback().onResult(offlineItem.item); - } - }); - - boolean showIndeterminate = offlineItem.item.progress.isIndeterminate() - && offlineItem.item.state != OfflineItemState.PAUSED - && offlineItem.item.state != OfflineItemState.PENDING; - if (showIndeterminate) { - mProgressBar.setIndeterminate(true); - mProgressBar.setIndeterminateDrawable( - itemView.getContext().getResources().getDrawable( - R.drawable.download_circular_progress_bar)); - } else { - mProgressBar.setIndeterminate(false); - } - - if (!offlineItem.item.progress.isIndeterminate()) { - mProgressBar.setProgress(offlineItem.item.progress.getPercentage()); - } - } - } - - /** A {@link ViewHolder} specifically meant to display a generic {@code OfflineItem}. */ - public static class GenericViewHolder extends ThumbnailAwareViewHolder { - private final TextView mTitle; - private final TextView mCaption; - - /** - * Whether or not we are currently showing an icon. This determines whether or not we - * udpate the icon on rebind. - */ - private boolean mDrawingIcon; - - /** The icon to use when there is no thumbnail. */ - private @DrawableRes int mIconId = INVALID_ID; - - /** Creates a new {@link GenericViewHolder} instance. */ - public static GenericViewHolder create(ViewGroup parent) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.download_manager_generic_item, null); - int imageSize = parent.getContext().getResources().getDimensionPixelSize( - R.dimen.download_manager_generic_thumbnail_size); - return new GenericViewHolder(view, imageSize); - } - - private GenericViewHolder(View view, int thumbnailSizePx) { - super(view, thumbnailSizePx, thumbnailSizePx); - - mTitle = (TextView) itemView.findViewById(R.id.title); - mCaption = (TextView) itemView.findViewById(R.id.caption); - } - - // ListItemViewHolder implementation. - @Override - public void bind(ListPropertyModel properties, ListItem item) { - super.bind(properties, item); - OfflineItemListItem offlineItem = (OfflineItemListItem) item; - - mTitle.setText(offlineItem.item.title); - mCaption.setText(UiUtils.generateGenericCaption(offlineItem.item)); - - mIconId = UiUtils.getIconForItem(offlineItem.item); - } - - @Override - void onVisualsChanged(ImageView view, OfflineItemVisuals visuals) { - mDrawingIcon = visuals == null || visuals.icon == null; - - GenericListItemView selectableView = (GenericListItemView) itemView; - if (mDrawingIcon) { - if (mIconId != INVALID_ID) { - selectableView.setThumbnailResource(mIconId); - } - } else { - selectableView.setThumbnail(visuals.icon); - } - } - } - - /** - * A {@link ViewHolder} specifically meant to display a video {@code OfflineItem}. - */ - public static class VideoViewHolder extends ListItemViewHolder { - public VideoViewHolder(ViewGroup parent) { - super(new AppCompatTextView(parent.getContext())); - } - - // ListItemViewHolder implementation. - @Override - public void bind(ListPropertyModel properties, ListItem item) { - OfflineItemListItem offlineItem = (OfflineItemListItem) item; - ((TextView) itemView).setText(offlineItem.item.title); - } - } - - /** A {@link ViewHolder} specifically meant to display an image {@code OfflineItem}. */ - public static class ImageViewHolder extends ThumbnailAwareViewHolder { - public static ImageViewHolder create(ViewGroup parent) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.download_manager_image_item, null); - int imageSize = parent.getContext().getResources().getDimensionPixelSize( - R.dimen.download_manager_image_width); - return new ImageViewHolder(view, imageSize); - } - - public ImageViewHolder(View view, int thumbnailSizePx) { - super(view, thumbnailSizePx, thumbnailSizePx); - } - - // ThumbnailAwareViewHolder implementation. - @Override - public void bind(ListPropertyModel properties, ListItem item) { - super.bind(properties, item); - OfflineItemListItem offlineItem = (OfflineItemListItem) item; - View imageView = itemView.findViewById(R.id.thumbnail); - imageView.setContentDescription(offlineItem.item.title); - - ImageListItemView view = (ImageListItemView) itemView; - view.setItem(item); - } - - @Override - void onVisualsChanged(ImageView view, OfflineItemVisuals visuals) { - view.setImageBitmap(visuals == null ? null : visuals.icon); - } - } - - /** - * A {@link ViewHolder} specifically meant to display a prefetch item. - */ - public static class PrefetchViewHolder extends ThumbnailAwareViewHolder { - private final TextView mTitle; - private final TextView mCaption; - private final TextView mTimestamp; - - /** - * Creates a new instance of a {@link PrefetchViewHolder}. - */ - public static PrefetchViewHolder create(ViewGroup parent) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.download_manager_prefetch_item, null); - int imageSize = parent.getContext().getResources().getDimensionPixelSize( - R.dimen.download_manager_prefetch_thumbnail_size); - return new PrefetchViewHolder(view, imageSize); - } - - private PrefetchViewHolder(View view, int thumbnailSizePx) { - super(view, thumbnailSizePx, thumbnailSizePx); - mTitle = (TextView) itemView.findViewById(R.id.title); - mCaption = (TextView) itemView.findViewById(R.id.caption); - mTimestamp = (TextView) itemView.findViewById(R.id.timestamp); - } - - // ThumbnailAwareViewHolder implementation. - @Override - public void bind(ListPropertyModel properties, ListItem item) { - super.bind(properties, item); - OfflineItemListItem offlineItem = (OfflineItemListItem) item; - - mTitle.setText(offlineItem.item.title); - mCaption.setText(UiUtils.generatePrefetchCaption(offlineItem.item)); - mTimestamp.setText(UiUtils.generatePrefetchTimestamp(offlineItem.date)); - } - - @Override - void onVisualsChanged(ImageView view, OfflineItemVisuals visuals) { - view.setImageBitmap(visuals == null ? null : visuals.icon); - } - } - - /** - * Helper {@link ViewHolder} that handles showing a 3-dot menu with preset actions. - */ - private static class MoreButtonViewHolder - extends ListItemViewHolder implements ListMenuButton.Delegate { - private final ListMenuButton mMore; - - private Runnable mShareCallback; - private Runnable mDeleteCallback; - - /** - * Creates a new instance of a {@link MoreButtonViewHolder}. - */ - public MoreButtonViewHolder(View view) { - super(view); - mMore = (ListMenuButton) view.findViewById(R.id.more); - if (mMore != null) mMore.setDelegate(this); - } - - // ListItemViewHolder implementation. - @CallSuper - @Override - public void bind(ListPropertyModel properties, ListItem item) { - OfflineItemListItem offlineItem = (OfflineItemListItem) item; - mShareCallback = () -> properties.getShareCallback().onResult(offlineItem.item); - mDeleteCallback = () -> properties.getRemoveCallback().onResult(offlineItem.item); - } - - // ListMenuButton.Delegate implementation. - @Override - public Item[] getItems() { - return new Item[] {new Item(itemView.getContext(), R.string.share, true), - new Item(itemView.getContext(), R.string.delete, true)}; - } - - @Override - public void onItemSelected(Item item) { - if (item.getTextId() == R.string.share) { - if (mShareCallback != null) mShareCallback.run(); - } else if (item.getTextId() == R.string.delete) { - if (mDeleteCallback != null) mDeleteCallback.run(); - } - } - } - - /** - * Helper {@link ViewHolder} that handles querying for thumbnails if necessary. - */ - private abstract static class ThumbnailAwareViewHolder - extends MoreButtonViewHolder implements VisualsCallback { - private final ImageView mThumbnail; - - /** - * The {@link ContentId} of the associated thumbnail/request if any. - */ - private @Nullable ContentId mId; - - /** - * A {@link Runnable} to cancel an outstanding thumbnail request if any. - */ - private @Nullable Runnable mCancellable; - - /** - * Whether or not a request is outstanding to support synchronous responses. - */ - private boolean mIsRequesting; - - /** - * The ideal width of the queried thumbnail. - */ - private int mWidthPx; - - /** - * The ideal height of the queried thumbnail. - */ - private int mHeightPx; - - /** - * Creates a new instance of a {@link ThumbnailAwareViewHolder}. - * @param view The root {@link View} for this holder. - * @param thumbnailWidthPx The desired width of the thumbnail that will be retrieved. - * @param thumbnailHeightPx The desired height of the thumbnail that will be retrieved. - */ - public ThumbnailAwareViewHolder(View view, int thumbnailWidthPx, int thumbnailHeightPx) { - super(view); - - mThumbnail = (ImageView) view.findViewById(R.id.thumbnail); - mWidthPx = thumbnailWidthPx; - mHeightPx = thumbnailHeightPx; - } - - // MoreButtonViewHolder implementation. - @Override - @CallSuper - public void bind(ListPropertyModel properties, ListItem item) { - super.bind(properties, item); - // If we have no thumbnail to show just return early. - if (mThumbnail == null) return; - - OfflineItem offlineItem = ((OfflineItemListItem) item).item; - - // If we're rebinding the same item, ignore the bind. - if (offlineItem.id.equals(mId)) return; - - ListItemView selectableView = (ListItemView) itemView; - selectableView.setSelectionDelegate(properties.getSelectionDelegate()); - selectableView.setItem(item); - selectableView.setClickCallback( - () -> properties.getOpenCallback().onResult(offlineItem)); - - // Clear any associated bitmap from the thumbnail. - if (mId != null) onVisualsChanged(mThumbnail, null); - - // Clear out any outstanding thumbnail request. - if (mCancellable != null) mCancellable.run(); - - // Start the new request. - mId = offlineItem.id; - mCancellable = properties.getVisualsProvider().getVisuals( - offlineItem, mWidthPx, mHeightPx, this); - - // Make sure to update our state properly if we got a synchronous response. - if (!mIsRequesting) mCancellable = null; - } - - // VisualsCallback implementation. - @Override - public void onVisualsAvailable(ContentId id, OfflineItemVisuals visuals) { - // Quit early if the request is not for our currently bound item. - if (!id.equals(mId)) return; - - // Clear out the request state. - mCancellable = null; - mIsRequesting = false; - - // Notify of the new visuals (if any). - onVisualsChanged(mThumbnail, visuals); - } - - /** - * Called when the contents of the thumbnail should be changed to due an event (either this - * {@link ViewHolder} being rebound to another {@link ListItem} or a thumbnail query - * returning results. - * @param view The {@link ImageView} that the thumbnail should be set on. - * @param visuals The {@link OfflineItemVisuals} that were returned by the backend if any. - */ - abstract void onVisualsChanged(ImageView view, @Nullable OfflineItemVisuals visuals); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListPropertyModel.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListPropertyModel.java index 1ddd249..2b9f790 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListPropertyModel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListPropertyModel.java
@@ -16,7 +16,7 @@ * (1) A set of properties that act directly on the list view itself. * (2) A set of properties that are effectively shared across all list items like callbacks. */ -class ListPropertyModel extends PropertyObservable<ListPropertyModel.PropertyKey> { +public class ListPropertyModel extends PropertyObservable<ListPropertyModel.PropertyKey> { @FunctionalInterface public interface VisualsProvider { /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListUtils.java index 4327903..7e78d6b1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListUtils.java
@@ -16,7 +16,7 @@ import java.lang.annotation.RetentionPolicy; /** Utility methods for representing {@link ListItem}s in a {@link RecyclerView} list. */ -class ListUtils { +public class ListUtils { /** The potential types of list items that could be displayed. */ @IntDef({ViewType.DATE, ViewType.IN_PROGRESS, ViewType.GENERIC, ViewType.VIDEO, ViewType.IMAGE, ViewType.CUSTOM_VIEW, ViewType.PREFETCH})
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/CustomViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/CustomViewHolder.java new file mode 100644 index 0000000..061bd20 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/CustomViewHolder.java
@@ -0,0 +1,39 @@ +// Copyright 2018 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.home.list.holder; + +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +import org.chromium.chrome.browser.download.home.list.ListItem; +import org.chromium.chrome.browser.download.home.list.ListPropertyModel; + +/** A {@link RecyclerView.ViewHolder} that holds a {@link View} that is opaque to the holder. */ +public class CustomViewHolder extends ListItemViewHolder { + /** Creates a new {@link org.chromium.chrome.browser.download.home.list.holder.CustomViewHolder} + * instance. */ + public CustomViewHolder(ViewGroup parent) { + super(new FrameLayout(parent.getContext())); + itemView.setLayoutParams(new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + } + + // ListItemViewHolder implemenation. + @Override + public void bind(ListPropertyModel properties, ListItem item) { + ListItem.ViewListItem viewItem = (ListItem.ViewListItem) item; + ViewGroup viewGroup = (ViewGroup) itemView; + + if (viewGroup.getChildCount() > 0 && viewGroup.getChildAt(0) == viewItem.customView) { + return; + } + + viewGroup.removeAllViews(); + viewGroup.addView(viewItem.customView, + new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/DateViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/DateViewHolder.java new file mode 100644 index 0000000..c05b00b --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/DateViewHolder.java
@@ -0,0 +1,38 @@ +// Copyright 2018 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.home.list.holder; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.download.home.list.ListItem; +import org.chromium.chrome.browser.download.home.list.ListPropertyModel; +import org.chromium.chrome.browser.download.home.list.UiUtils; + +/** A {@link RecyclerView.ViewHolder} specifically meant to display a date header. */ +public class DateViewHolder extends ListItemViewHolder { + /** Creates a new {@link org.chromium.chrome.browser.download.home.list.holder.DateViewHolder} + * instance. */ + public static org.chromium.chrome.browser.download.home.list.holder.DateViewHolder create( + ViewGroup parent) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.download_manager_date_item, null); + return new org.chromium.chrome.browser.download.home.list.holder.DateViewHolder(view); + } + + private DateViewHolder(View view) { + super(view); + } + + // ListItemViewHolder implementation. + @Override + public void bind(ListPropertyModel properties, ListItem item) { + ListItem.DateListItem dateItem = (ListItem.DateListItem) item; + ((TextView) itemView).setText(UiUtils.dateToHeaderString(dateItem.date)); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/GenericViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/GenericViewHolder.java new file mode 100644 index 0000000..eb13e2b --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/GenericViewHolder.java
@@ -0,0 +1,122 @@ +// Copyright 2018 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.home.list.holder; + +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.support.annotation.DrawableRes; +import android.support.graphics.drawable.AnimatedVectorDrawableCompat; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.support.v7.content.res.AppCompatResources; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.download.DownloadUtils; +import org.chromium.chrome.browser.download.home.list.ListItem; +import org.chromium.chrome.browser.download.home.list.ListPropertyModel; +import org.chromium.chrome.browser.download.home.list.UiUtils; +import org.chromium.chrome.browser.widget.TintedImageView; +import org.chromium.components.offline_items_collection.OfflineItemVisuals; + +/** A {@link RecyclerView.ViewHolder} specifically meant to display a generic {@code OfflineItem}. + */ +public class GenericViewHolder extends ThumbnailAwareViewHolder { + private static final int INVALID_ID = -1; + + private final ColorStateList mCheckedIconForegroundColorList; + private final AnimatedVectorDrawableCompat mCheckDrawable; + + private final TextView mTitle; + private final TextView mCaption; + private final TintedImageView mThumbnailView; + + private Bitmap mThumbnailBitmap; + + /** The icon to use when there is no thumbnail. */ + private @DrawableRes int mIconId = INVALID_ID; + + /** Creates a new {@link + * org.chromium.chrome.browser.download.home.list.holder.GenericViewHolder} instance. */ + public static org.chromium.chrome.browser.download.home.list.holder.GenericViewHolder create( + ViewGroup parent) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.download_manager_generic_item, null); + int imageSize = parent.getContext().getResources().getDimensionPixelSize( + R.dimen.download_manager_generic_thumbnail_size); + return new org.chromium.chrome.browser.download.home.list.holder.GenericViewHolder( + view, imageSize); + } + + private GenericViewHolder(View view, int thumbnailSizePx) { + super(view, thumbnailSizePx, thumbnailSizePx); + + mTitle = (TextView) itemView.findViewById(R.id.title); + mCaption = (TextView) itemView.findViewById(R.id.caption); + mThumbnailView = (TintedImageView) itemView.findViewById(R.id.thumbnail); + + mCheckDrawable = AnimatedVectorDrawableCompat.create( + itemView.getContext(), R.drawable.ic_check_googblue_24dp_animated); + mCheckedIconForegroundColorList = + DownloadUtils.getIconForegroundColorList(itemView.getContext()); + } + + // ListItemViewHolder implementation. + @Override + public void bind(ListPropertyModel properties, ListItem item) { + super.bind(properties, item); + ListItem.OfflineItemListItem offlineItem = (ListItem.OfflineItemListItem) item; + + mTitle.setText(offlineItem.item.title); + mCaption.setText(UiUtils.generateGenericCaption(offlineItem.item)); + + mIconId = UiUtils.getIconForItem(offlineItem.item); + updateThumbnailView(); + } + + @Override + void onVisualsChanged(ImageView view, OfflineItemVisuals visuals) { + mThumbnailBitmap = visuals == null ? null : visuals.icon; + updateThumbnailView(); + } + + private void updateThumbnailView() { + Resources resources = itemView.getContext().getResources(); + + // TODO(shaktisahu): Pass the appropriate value of selection. + boolean selected = false; + if (selected) { + mThumbnailView.setBackgroundResource(R.drawable.list_item_icon_modern_bg); + mThumbnailView.getBackground().setLevel( + resources.getInteger(R.integer.list_item_level_selected)); + + mThumbnailView.setImageDrawable(mCheckDrawable); + mThumbnailView.setTint(mCheckedIconForegroundColorList); + mCheckDrawable.start(); + } else if (mThumbnailBitmap != null) { + assert !mThumbnailBitmap.isRecycled(); + + mThumbnailView.setBackground(null); + mThumbnailView.setTint(null); + + RoundedBitmapDrawable drawable = + RoundedBitmapDrawableFactory.create(resources, mThumbnailBitmap); + drawable.setCircular(true); + mThumbnailView.setImageDrawable(drawable); + } else if (mIconId != INVALID_ID) { + mThumbnailView.setBackgroundResource(R.drawable.list_item_icon_modern_bg); + mThumbnailView.getBackground().setLevel( + resources.getInteger(R.integer.list_item_level_default)); + mThumbnailView.setImageResource(mIconId); + mThumbnailView.setTint(AppCompatResources.getColorStateList( + mThumbnailView.getContext(), R.color.dark_mode_tint)); + } + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ImageViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ImageViewHolder.java new file mode 100644 index 0000000..9dfedb47 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ImageViewHolder.java
@@ -0,0 +1,89 @@ +// Copyright 2018 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.home.list.holder; + +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.support.graphics.drawable.AnimatedVectorDrawableCompat; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.download.DownloadUtils; +import org.chromium.chrome.browser.download.home.list.ListItem; +import org.chromium.chrome.browser.download.home.list.ListPropertyModel; +import org.chromium.chrome.browser.widget.TintedImageView; +import org.chromium.components.offline_items_collection.OfflineItemVisuals; + +/** A {@link RecyclerView.ViewHolder} specifically meant to display an image {@code OfflineItem}. */ +public class ImageViewHolder extends ThumbnailAwareViewHolder { + private final TintedImageView mSelectionImage; + private final ColorStateList mCheckedIconForegroundColorList; + private final AnimatedVectorDrawableCompat mCheckDrawable; + + public static org.chromium.chrome.browser.download.home.list.holder.ImageViewHolder create( + ViewGroup parent) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.download_manager_image_item, null); + int imageSize = parent.getContext().getResources().getDimensionPixelSize( + R.dimen.download_manager_image_width); + return new org.chromium.chrome.browser.download.home.list.holder.ImageViewHolder( + view, imageSize); + } + + public ImageViewHolder(View view, int thumbnailSizePx) { + super(view, thumbnailSizePx, thumbnailSizePx); + mCheckDrawable = AnimatedVectorDrawableCompat.create( + itemView.getContext(), R.drawable.ic_check_googblue_24dp_animated); + mCheckedIconForegroundColorList = + DownloadUtils.getIconForegroundColorList(itemView.getContext()); + mSelectionImage = (TintedImageView) itemView.findViewById(R.id.selection); + } + + // ThumbnailAwareViewHolder implementation. + @Override + public void bind(ListPropertyModel properties, ListItem item) { + super.bind(properties, item); + ListItem.OfflineItemListItem offlineItem = (ListItem.OfflineItemListItem) item; + View imageView = itemView.findViewById(R.id.thumbnail); + imageView.setContentDescription(offlineItem.item.title); + updateImageView(); + } + + @Override + void onVisualsChanged(ImageView view, OfflineItemVisuals visuals) { + view.setImageBitmap(visuals == null ? null : visuals.icon); + updateImageView(); + } + + protected void updateImageView() { + Resources resources = itemView.getContext().getResources(); + // TODO(shaktisahu): Pass the appropriate value of selection. + boolean selected = false; + boolean selectionModeActive = false; + if (selected) { + mSelectionImage.setVisibility(View.VISIBLE); + mSelectionImage.setBackgroundResource(R.drawable.list_item_icon_modern_bg); + mSelectionImage.getBackground().setLevel( + resources.getInteger(R.integer.list_item_level_selected)); + + mSelectionImage.setImageDrawable(mCheckDrawable); + mSelectionImage.setTint(mCheckedIconForegroundColorList); + mCheckDrawable.start(); + } else if (selectionModeActive) { + mSelectionImage.setVisibility(View.VISIBLE); + mSelectionImage.setBackground(null); + mSelectionImage.setTint(null); + + mSelectionImage.setImageResource(R.drawable.download_circular_selector_transparent); + } else { + mSelectionImage.setBackground(null); + mSelectionImage.setTint(null); + mSelectionImage.setVisibility(View.GONE); + } + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressViewHolder.java new file mode 100644 index 0000000..337fad3 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressViewHolder.java
@@ -0,0 +1,96 @@ +// Copyright 2018 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.home.list.holder; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ProgressBar; +import android.widget.TextView; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.download.DownloadUtils; +import org.chromium.chrome.browser.download.home.list.ListItem; +import org.chromium.chrome.browser.download.home.list.ListPropertyModel; +import org.chromium.chrome.browser.widget.TintedImageButton; +import org.chromium.components.offline_items_collection.OfflineItemState; + +/** A {@link RecyclerView.ViewHolder} specifically meant to display an in-progress {@code + * OfflineItem}. */ +public class InProgressViewHolder extends ListItemViewHolder { + private final ProgressBar mProgressBar; + private final TextView mTitle; + private final TextView mCaption; + private final TintedImageButton mPauseResumeButton; + private final TintedImageButton mCancelButton; + + /** + * Creates a new {@link + * org.chromium.chrome.browser.download.home.list.holder.InProgressViewHolder} instance. + */ + public static org.chromium.chrome.browser.download.home.list.holder.InProgressViewHolder create( + ViewGroup parent) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.download_manager_in_progress_item, null); + return new org.chromium.chrome.browser.download.home.list.holder.InProgressViewHolder(view); + } + + /** + * Creates a new {@link + * org.chromium.chrome.browser.download.home.list.holder.InProgressViewHolder} instance. + */ + public InProgressViewHolder(View view) { + super(view); + mProgressBar = view.findViewById(R.id.progress_bar); + mTitle = view.findViewById(R.id.title); + mCaption = view.findViewById(R.id.caption); + mPauseResumeButton = view.findViewById(R.id.pause_button); + mCancelButton = view.findViewById(R.id.cancel_button); + } + + // ListItemViewHolder implementation. + @Override + public void bind(ListPropertyModel properties, ListItem item) { + ListItem.OfflineItemListItem offlineItem = (ListItem.OfflineItemListItem) item; + mTitle.setText(offlineItem.item.title); + mCancelButton.setOnClickListener( + v -> properties.getCancelCallback().onResult(offlineItem.item)); + + if (offlineItem.item.state == OfflineItemState.PAUSED) { + mPauseResumeButton.setImageResource(R.drawable.ic_play_arrow_white_24dp); + mPauseResumeButton.setContentDescription( + itemView.getContext().getString(R.string.download_notification_resume_button)); + } else { + mPauseResumeButton.setImageResource(R.drawable.ic_pause_white_24dp); + mPauseResumeButton.setContentDescription( + itemView.getContext().getString(R.string.download_notification_pause_button)); + } + + // TODO(shaktisahu): Create status string for the new specs. + mCaption.setText(DownloadUtils.getProgressTextForNotification(offlineItem.item.progress)); + mPauseResumeButton.setOnClickListener(view -> { + if (offlineItem.item.state == OfflineItemState.PAUSED) { + properties.getResumeCallback().onResult(offlineItem.item); + } else { + properties.getPauseCallback().onResult(offlineItem.item); + } + }); + + boolean showIndeterminate = offlineItem.item.progress.isIndeterminate() + && offlineItem.item.state != OfflineItemState.PAUSED + && offlineItem.item.state != OfflineItemState.PENDING; + if (showIndeterminate) { + mProgressBar.setIndeterminate(true); + mProgressBar.setIndeterminateDrawable(itemView.getContext().getResources().getDrawable( + R.drawable.download_circular_progress_bar)); + } else { + mProgressBar.setIndeterminate(false); + } + + if (!offlineItem.item.progress.isIndeterminate()) { + mProgressBar.setProgress(offlineItem.item.progress.getPercentage()); + } + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ListItemViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ListItemViewHolder.java new file mode 100644 index 0000000..2b147086 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ListItemViewHolder.java
@@ -0,0 +1,58 @@ +// Copyright 2018 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.home.list.holder; + +import android.support.v7.widget.RecyclerView.ViewHolder; +import android.view.View; +import android.view.ViewGroup; + +import org.chromium.chrome.browser.download.home.list.ListItem; +import org.chromium.chrome.browser.download.home.list.ListPropertyModel; +import org.chromium.chrome.browser.download.home.list.ListUtils; + +/** + * A {@link ViewHolder} responsible for building and setting properties on the underlying Android + * {@link View}s for the Download Manager list. + */ +public abstract class ListItemViewHolder extends ViewHolder { + /** Creates an instance of a {@link ListItemViewHolder}. */ + protected ListItemViewHolder(View itemView) { + super(itemView); + } + + /** + * Used as a method reference for ViewHolderFactory. + * @see + * org.chromium.chrome.browser.modelutil.RecyclerViewAdapter.ViewHolderFactory#createViewHolder + */ + public static ListItemViewHolder create(ViewGroup parent, @ListUtils.ViewType int viewType) { + switch (viewType) { + case ListUtils.ViewType.DATE: + return DateViewHolder.create(parent); + case ListUtils.ViewType.IN_PROGRESS: + return InProgressViewHolder.create(parent); + case ListUtils.ViewType.GENERIC: + return GenericViewHolder.create(parent); + case ListUtils.ViewType.VIDEO: + return new VideoViewHolder(parent); + case ListUtils.ViewType.IMAGE: + return ImageViewHolder.create(parent); + case ListUtils.ViewType.CUSTOM_VIEW: + return new CustomViewHolder(parent); + case ListUtils.ViewType.PREFETCH: + return PrefetchViewHolder.create(parent); + } + + assert false; + return null; + } + + /** + * Binds the currently held {@link View} to {@code item}. + * @param properties The shared {@link ListPropertyModel} all items can access. + * @param item The {@link ListItem} to visually represent in this {@link ViewHolder}. + */ + public abstract void bind(ListPropertyModel properties, ListItem item); +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/MoreButtonViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/MoreButtonViewHolder.java new file mode 100644 index 0000000..a5b2ee7 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/MoreButtonViewHolder.java
@@ -0,0 +1,58 @@ +// Copyright 2018 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.home.list.holder; + +import android.support.annotation.CallSuper; +import android.view.View; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.download.home.list.ListItem; +import org.chromium.chrome.browser.download.home.list.ListPropertyModel; +import org.chromium.chrome.browser.widget.ListMenuButton; + +/** + * Helper {@link RecyclerView.ViewHolder} that handles showing a 3-dot menu with preset actions. + */ +class MoreButtonViewHolder extends ListItemViewHolder implements ListMenuButton.Delegate { + private final ListMenuButton mMore; + + private Runnable mShareCallback; + private Runnable mDeleteCallback; + + /** + * Creates a new instance of a {@link MoreButtonViewHolder}. + */ + public MoreButtonViewHolder(View view) { + super(view); + mMore = (ListMenuButton) view.findViewById(R.id.more); + if (mMore != null) mMore.setDelegate(this); + } + + // ListItemViewHolder implementation. + @CallSuper + @Override + public void bind(ListPropertyModel properties, ListItem item) { + ListItem.OfflineItemListItem offlineItem = (ListItem.OfflineItemListItem) item; + mShareCallback = () -> properties.getShareCallback().onResult(offlineItem.item); + mDeleteCallback = () -> properties.getRemoveCallback().onResult(offlineItem.item); + } + + // ListMenuButton.Delegate implementation. + @Override + public ListMenuButton.Item[] getItems() { + return new ListMenuButton.Item[] { + new ListMenuButton.Item(itemView.getContext(), R.string.share, true), + new ListMenuButton.Item(itemView.getContext(), R.string.delete, true)}; + } + + @Override + public void onItemSelected(ListMenuButton.Item item) { + if (item.getTextId() == R.string.share) { + if (mShareCallback != null) mShareCallback.run(); + } else if (item.getTextId() == R.string.delete) { + if (mDeleteCallback != null) mDeleteCallback.run(); + } + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/PrefetchViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/PrefetchViewHolder.java new file mode 100644 index 0000000..df81844 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/PrefetchViewHolder.java
@@ -0,0 +1,63 @@ +// Copyright 2018 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.home.list.holder; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.download.home.list.ListItem; +import org.chromium.chrome.browser.download.home.list.ListPropertyModel; +import org.chromium.chrome.browser.download.home.list.UiUtils; +import org.chromium.components.offline_items_collection.OfflineItemVisuals; + +/** + * A {@link RecyclerView.ViewHolder} specifically meant to display a prefetch item. + */ +public class PrefetchViewHolder extends ThumbnailAwareViewHolder { + private final TextView mTitle; + private final TextView mCaption; + private final TextView mTimestamp; + + /** + * Creates a new instance of a {@link + * org.chromium.chrome.browser.download.home.list.holder.PrefetchViewHolder}. + */ + public static org.chromium.chrome.browser.download.home.list.holder.PrefetchViewHolder create( + ViewGroup parent) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.download_manager_prefetch_item, null); + int imageSize = parent.getContext().getResources().getDimensionPixelSize( + R.dimen.download_manager_prefetch_thumbnail_size); + return new org.chromium.chrome.browser.download.home.list.holder.PrefetchViewHolder( + view, imageSize); + } + + private PrefetchViewHolder(View view, int thumbnailSizePx) { + super(view, thumbnailSizePx, thumbnailSizePx); + mTitle = (TextView) itemView.findViewById(R.id.title); + mCaption = (TextView) itemView.findViewById(R.id.caption); + mTimestamp = (TextView) itemView.findViewById(R.id.timestamp); + } + + // ThumbnailAwareViewHolder implementation. + @Override + public void bind(ListPropertyModel properties, ListItem item) { + super.bind(properties, item); + ListItem.OfflineItemListItem offlineItem = (ListItem.OfflineItemListItem) item; + + mTitle.setText(offlineItem.item.title); + mCaption.setText(UiUtils.generatePrefetchCaption(offlineItem.item)); + mTimestamp.setText(UiUtils.generatePrefetchTimestamp(offlineItem.date)); + } + + @Override + void onVisualsChanged(ImageView view, OfflineItemVisuals visuals) { + view.setImageBitmap(visuals == null ? null : visuals.icon); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ThumbnailAwareViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ThumbnailAwareViewHolder.java new file mode 100644 index 0000000..5b832748 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ThumbnailAwareViewHolder.java
@@ -0,0 +1,117 @@ +// Copyright 2018 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.home.list.holder; + +import android.support.annotation.CallSuper; +import android.support.annotation.Nullable; +import android.view.View; +import android.widget.ImageView; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.download.home.list.ListItem; +import org.chromium.chrome.browser.download.home.list.ListPropertyModel; +import org.chromium.components.offline_items_collection.ContentId; +import org.chromium.components.offline_items_collection.OfflineItem; +import org.chromium.components.offline_items_collection.OfflineItemVisuals; +import org.chromium.components.offline_items_collection.VisualsCallback; + +/** + * Helper {@link RecyclerView.ViewHolder} that handles querying for thumbnails if necessary. + */ +abstract class ThumbnailAwareViewHolder extends MoreButtonViewHolder implements VisualsCallback { + private final ImageView mThumbnail; + + /** + * The {@link ContentId} of the associated thumbnail/request if any. + */ + private @Nullable ContentId mId; + + /** + * A {@link Runnable} to cancel an outstanding thumbnail request if any. + */ + private @Nullable Runnable mCancellable; + + /** + * Whether or not a request is outstanding to support synchronous responses. + */ + private boolean mIsRequesting; + + /** + * The ideal width of the queried thumbnail. + */ + private int mWidthPx; + + /** + * The ideal height of the queried thumbnail. + */ + private int mHeightPx; + + /** + * Creates a new instance of a {@link ThumbnailAwareViewHolder}. + * @param view The root {@link View} for this holder. + * @param thumbnailWidthPx The desired width of the thumbnail that will be retrieved. + * @param thumbnailHeightPx The desired height of the thumbnail that will be retrieved. + */ + public ThumbnailAwareViewHolder(View view, int thumbnailWidthPx, int thumbnailHeightPx) { + super(view); + + mThumbnail = (ImageView) view.findViewById(R.id.thumbnail); + mWidthPx = thumbnailWidthPx; + mHeightPx = thumbnailHeightPx; + } + + // MoreButtonViewHolder implementation. + @Override + @CallSuper + public void bind(ListPropertyModel properties, ListItem item) { + super.bind(properties, item); + // If we have no thumbnail to show just return early. + if (mThumbnail == null) return; + + OfflineItem offlineItem = ((ListItem.OfflineItemListItem) item).item; + + // If we're rebinding the same item, ignore the bind. + if (offlineItem.id.equals(mId)) return; + + // TODO(shaktisahu): Add callbacks for selection and open. + + // Clear any associated bitmap from the thumbnail. + if (mId != null) onVisualsChanged(mThumbnail, null); + + // Clear out any outstanding thumbnail request. + if (mCancellable != null) mCancellable.run(); + + // Start the new request. + mId = offlineItem.id; + mCancellable = + properties.getVisualsProvider().getVisuals(offlineItem, mWidthPx, mHeightPx, this); + + // Make sure to update our state properly if we got a synchronous response. + if (!mIsRequesting) mCancellable = null; + } + + // VisualsCallback implementation. + @Override + public void onVisualsAvailable(ContentId id, OfflineItemVisuals visuals) { + // Quit early if the request is not for our currently bound item. + if (!id.equals(mId)) return; + + // Clear out the request state. + mCancellable = null; + mIsRequesting = false; + + // Notify of the new visuals (if any). + onVisualsChanged(mThumbnail, visuals); + } + + /** + * Called when the contents of the thumbnail should be changed to due an event (either this + * {@link RecyclerView.ViewHolder} being rebound to another {@link ListItem} or a thumbnail + * query returning results. + * @param view The {@link ImageView} that the thumbnail should be set on. + * @param visuals The {@link OfflineItemVisuals} that were returned by the backend if any. + */ + abstract void onVisualsChanged(ImageView view, @Nullable OfflineItemVisuals visuals); +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/VideoViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/VideoViewHolder.java new file mode 100644 index 0000000..ee06ab7 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/VideoViewHolder.java
@@ -0,0 +1,28 @@ +// Copyright 2018 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.home.list.holder; + +import android.support.v7.widget.AppCompatTextView; +import android.view.ViewGroup; +import android.widget.TextView; + +import org.chromium.chrome.browser.download.home.list.ListItem; +import org.chromium.chrome.browser.download.home.list.ListPropertyModel; + +/** + * A {@link RecyclerView.ViewHolder} specifically meant to display a video {@code OfflineItem}. + */ +public class VideoViewHolder extends ListItemViewHolder { + public VideoViewHolder(ViewGroup parent) { + super(new AppCompatTextView(parent.getContext())); + } + + // ListItemViewHolder implementation. + @Override + public void bind(ListPropertyModel properties, ListItem item) { + ListItem.OfflineItemListItem offlineItem = (ListItem.OfflineItemListItem) item; + ((TextView) itemView).setText(offlineItem.item.title); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/GenericListItemView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/GenericListItemView.java deleted file mode 100644 index 66ee464..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/GenericListItemView.java +++ /dev/null
@@ -1,69 +0,0 @@ -// Copyright 2018 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.home.view; - -import android.content.Context; -import android.content.res.ColorStateList; -import android.support.graphics.drawable.AnimatedVectorDrawableCompat; -import android.support.v4.graphics.drawable.RoundedBitmapDrawable; -import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; -import android.support.v7.content.res.AppCompatResources; -import android.util.AttributeSet; - -import org.chromium.chrome.R; -import org.chromium.chrome.browser.download.DownloadUtils; -import org.chromium.chrome.browser.widget.TintedImageView; - -/** - * Represents a completed download in the download home. - */ -public class GenericListItemView extends ListItemView { - private TintedImageView mThumbnail; - private final ColorStateList mCheckedIconForegroundColorList; - private final AnimatedVectorDrawableCompat mCheckDrawable; - - public GenericListItemView(Context context, AttributeSet attrs) { - super(context, attrs); - mCheckDrawable = AnimatedVectorDrawableCompat.create( - getContext(), R.drawable.ic_check_googblue_24dp_animated); - mCheckedIconForegroundColorList = DownloadUtils.getIconForegroundColorList(context); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - mThumbnail = (TintedImageView) findViewById(R.id.thumbnail); - } - - @Override - protected void updateView() { - if (isChecked()) { - mThumbnail.setBackgroundResource(R.drawable.list_item_icon_modern_bg); - mThumbnail.getBackground().setLevel( - getResources().getInteger(R.integer.list_item_level_selected)); - - mThumbnail.setImageDrawable(mCheckDrawable); - mThumbnail.setTint(mCheckedIconForegroundColorList); - mCheckDrawable.start(); - } else if (mThumbnailBitmap != null) { - assert !mThumbnailBitmap.isRecycled(); - - mThumbnail.setBackground(null); - mThumbnail.setTint(null); - - RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create( - mThumbnail.getResources(), mThumbnailBitmap); - drawable.setCircular(true); - mThumbnail.setImageDrawable(drawable); - } else { - mThumbnail.setBackgroundResource(R.drawable.list_item_icon_modern_bg); - mThumbnail.getBackground().setLevel( - mThumbnail.getResources().getInteger(R.integer.list_item_level_default)); - mThumbnail.setImageResource(mIconResId); - mThumbnail.setTint(AppCompatResources.getColorStateList( - mThumbnail.getContext(), R.color.dark_mode_tint)); - } - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/ImageListItemView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/ImageListItemView.java deleted file mode 100644 index ea441cb..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/ImageListItemView.java +++ /dev/null
@@ -1,66 +0,0 @@ -// Copyright 2018 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.home.view; - -import android.content.Context; -import android.content.res.ColorStateList; -import android.support.graphics.drawable.AnimatedVectorDrawableCompat; -import android.util.AttributeSet; - -import org.chromium.chrome.R; -import org.chromium.chrome.browser.download.DownloadUtils; -import org.chromium.chrome.browser.widget.TintedImageView; - -/** - * Represents an image in the download home and handles selection. - */ -public class ImageListItemView extends ListItemView { - private final ColorStateList mCheckedIconForegroundColorList; - private final AnimatedVectorDrawableCompat mCheckDrawable; - private TintedImageView mSelectionImage; - - public ImageListItemView(Context context, AttributeSet attrs) { - super(context, attrs); - mCheckDrawable = AnimatedVectorDrawableCompat.create( - getContext(), R.drawable.ic_check_googblue_24dp_animated); - mCheckedIconForegroundColorList = DownloadUtils.getIconForegroundColorList(context); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - mSelectionImage = (TintedImageView) findViewById(R.id.selection); - } - - @Override - public void setChecked(boolean checked) { - super.setChecked(checked); - updateView(); - } - - @Override - protected void updateView() { - if (isChecked()) { - mSelectionImage.setVisibility(VISIBLE); - mSelectionImage.setBackgroundResource(R.drawable.list_item_icon_modern_bg); - mSelectionImage.getBackground().setLevel( - getResources().getInteger(R.integer.list_item_level_selected)); - - mSelectionImage.setImageDrawable(mCheckDrawable); - mSelectionImage.setTint(mCheckedIconForegroundColorList); - mCheckDrawable.start(); - } else if (isSelectionModeActive()) { - mSelectionImage.setVisibility(VISIBLE); - mSelectionImage.setBackground(null); - mSelectionImage.setTint(null); - - mSelectionImage.setImageResource(R.drawable.download_circular_selector_transparent); - } else { - mSelectionImage.setBackground(null); - mSelectionImage.setTint(null); - mSelectionImage.setVisibility(GONE); - } - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/ListItemView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/ListItemView.java deleted file mode 100644 index 29ce1c8..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/ListItemView.java +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2018 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.home.view; - -import android.content.Context; -import android.graphics.Bitmap; -import android.util.AttributeSet; - -import org.chromium.chrome.browser.download.home.list.ListItem; -import org.chromium.chrome.browser.widget.selection.SelectableItemViewBase; - -/** A class that represents a variety of possible list items to show in downloads home. */ -public abstract class ListItemView extends SelectableItemViewBase<ListItem> { - private Runnable mClickCallback; - protected Bitmap mThumbnailBitmap; - protected int mIconResId; - - public ListItemView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public void setClickCallback(Runnable listener) { - mClickCallback = listener; - } - - @Override - protected void onClick() { - mClickCallback.run(); - } - - public void setThumbnail(Bitmap thumbnail) { - mThumbnailBitmap = thumbnail; - updateView(); - } - - public void setThumbnailResource(int iconResId) { - mIconResId = iconResId; - updateView(); - } -} \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/PrefetchListItemView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/PrefetchListItemView.java deleted file mode 100644 index 3da25ed..0000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/view/PrefetchListItemView.java +++ /dev/null
@@ -1,17 +0,0 @@ -// Copyright 2018 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.home.view; - -import android.content.Context; -import android.util.AttributeSet; - -/** - * Represents a prefetched page in the download home. - */ -public class PrefetchListItemView extends ListItemView { - public PrefetchListItemView(Context context, AttributeSet attrs) { - super(context, attrs); - } -}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java index 8f3e5da8..a0a12a6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
@@ -49,10 +49,10 @@ .setGroup(NotificationConstants.GROUP_INCOGNITO); NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - nm.notify(INCOGNITO_TABS_OPEN_TAG, INCOGNITO_TABS_OPEN_ID, builder.build()); + Notification notification = builder.build(); + nm.notify(INCOGNITO_TABS_OPEN_TAG, INCOGNITO_TABS_OPEN_ID, notification); NotificationUmaTracker.getInstance().onNotificationShown( - NotificationUmaTracker.SystemNotificationType.CLOSE_INCOGNITO, - ChannelDefinitions.ChannelId.INCOGNITO); + NotificationUmaTracker.SystemNotificationType.CLOSE_INCOGNITO, notification); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java index fb89b02e..cb9fc64 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java
@@ -208,7 +208,7 @@ mNotifications.put(notificationId, mediaType); updateSharedPreferencesEntry(notificationId, false); NotificationUmaTracker.getInstance().onNotificationShown( - NotificationUmaTracker.SystemNotificationType.MEDIA_CAPTURE, channelId); + NotificationUmaTracker.SystemNotificationType.MEDIA_CAPTURE, notification); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CreateRouteRequest.java b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CreateRouteRequest.java index 9e485967..62a3e8c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CreateRouteRequest.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/router/cast/CreateRouteRequest.java
@@ -6,6 +6,7 @@ import android.annotation.SuppressLint; import android.os.Bundle; +import android.support.annotation.IntDef; import com.google.android.gms.cast.Cast; import com.google.android.gms.cast.LaunchOptions; @@ -23,6 +24,9 @@ import org.chromium.chrome.browser.media.router.MediaSource; import org.chromium.chrome.browser.media.router.cast.remoting.RemotingCastSession; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + import javax.annotation.Nullable; /** @@ -37,12 +41,17 @@ ChromeCastSessionManager.CastSessionLaunchRequest { private static final String TAG = "MediaRouter"; - private static final int STATE_IDLE = 0; - private static final int STATE_CONNECTING_TO_API = 1; - private static final int STATE_API_CONNECTION_SUSPENDED = 2; - private static final int STATE_LAUNCHING_APPLICATION = 3; - private static final int STATE_LAUNCH_SUCCEEDED = 4; - private static final int STATE_TERMINATED = 5; + @IntDef({State.IDLE, State.CONNECTING_TO_API, State.API_CONNECTION_SUSPENDED, + State.LAUNCHING_APPLICATION, State.LAUNCH_SUCCEEDED, State.TERMINATED}) + @Retention(RetentionPolicy.SOURCE) + private @interface State { + int IDLE = 0; + int CONNECTING_TO_API = 1; + int API_CONNECTION_SUSPENDED = 2; + int LAUNCHING_APPLICATION = 3; + int LAUNCH_SUCCEEDED = 4; + int TERMINATED = 5; + } private final MediaSource mSource; private final MediaSink mSink; @@ -53,15 +62,20 @@ private final int mRequestId; private final CastMessageHandler mMessageHandler; private final ChromeCastSessionManager.CastSessionManagerListener mSessionListener; - private final RequestedCastSessionType mSessionType; + private final @RequestedCastSessionType int mSessionType; private GoogleApiClient mApiClient; - private int mState = STATE_IDLE; + private @State int mState = State.IDLE; // Used to identify whether the request should launch a CastSessionImpl or a RemotingCastSession // (based off of wheter the route creation was requested by a RemotingMediaRouteProvider or a // CastMediaRouteProvider). - public enum RequestedCastSessionType { CAST, REMOTE } + @IntDef({RequestedCastSessionType.CAST, RequestedCastSessionType.REMOTE}) + @Retention(RetentionPolicy.SOURCE) + public @interface RequestedCastSessionType { + int CAST = 0; + int REMOTE = 1; + } /** * Initializes the request. @@ -79,7 +93,8 @@ public CreateRouteRequest(MediaSource source, MediaSink sink, String presentationId, String origin, int tabId, boolean isIncognito, int requestId, ChromeCastSessionManager.CastSessionManagerListener listener, - RequestedCastSessionType sessionType, @Nullable CastMessageHandler messageHandler) { + @RequestedCastSessionType int sessionType, + @Nullable CastMessageHandler messageHandler) { assert source != null; assert sink != null; @@ -140,11 +155,11 @@ */ @Override public void start(Cast.Listener castListener) { - if (mState != STATE_IDLE) throwInvalidState(); + if (mState != State.IDLE) throwInvalidState(); mApiClient = createApiClient(castListener); mApiClient.connect(); - mState = STATE_CONNECTING_TO_API; + mState = State.CONNECTING_TO_API; } ///////////////////////////////////////////////////////////////////////////////////////////// @@ -152,16 +167,16 @@ @Override public void onConnected(Bundle connectionHint) { - if (mState != STATE_CONNECTING_TO_API && mState != STATE_API_CONNECTION_SUSPENDED) { + if (mState != State.CONNECTING_TO_API && mState != State.API_CONNECTION_SUSPENDED) { throwInvalidState(); } - if (mState == STATE_API_CONNECTION_SUSPENDED) return; + if (mState == State.API_CONNECTION_SUSPENDED) return; try { launchApplication(mApiClient, mSource.getApplicationId(), true) .setResultCallback(this); - mState = STATE_LAUNCHING_APPLICATION; + mState = State.LAUNCHING_APPLICATION; } catch (Exception e) { Log.e(TAG, "Launch application failed: %s", mSource.getApplicationId(), e); reportError(); @@ -170,12 +185,12 @@ @Override public void onConnectionSuspended(int cause) { - mState = STATE_API_CONNECTION_SUSPENDED; + mState = State.API_CONNECTION_SUSPENDED; } @Override public void onConnectionFailed(ConnectionResult result) { - if (mState != STATE_CONNECTING_TO_API) throwInvalidState(); + if (mState != State.CONNECTING_TO_API) throwInvalidState(); Log.e(TAG, "GoogleApiClient connection failed: %d, %b", result.getErrorCode(), result.hasResolution()); @@ -187,8 +202,7 @@ */ @Override public void onResult(Cast.ApplicationConnectionResult result) { - if (mState != STATE_LAUNCHING_APPLICATION - && mState != STATE_API_CONNECTION_SUSPENDED) { + if (mState != State.LAUNCHING_APPLICATION && mState != State.API_CONNECTION_SUSPENDED) { throwInvalidState(); } @@ -200,7 +214,7 @@ return; } - mState = STATE_LAUNCH_SUCCEEDED; + mState = State.LAUNCH_SUCCEEDED; reportSuccess(result); } @@ -234,17 +248,17 @@ } private void reportSuccess(Cast.ApplicationConnectionResult result) { - if (mState != STATE_LAUNCH_SUCCEEDED) throwInvalidState(); + if (mState != State.LAUNCH_SUCCEEDED) throwInvalidState(); CastSession session = null; switch (mSessionType) { - case CAST: + case RequestedCastSessionType.CAST: session = new CastSessionImpl(mApiClient, result.getSessionId(), result.getApplicationMetadata(), result.getApplicationStatus(), mSink.getDevice(), mOrigin, mTabId, mIsIncognito, mSource, mMessageHandler); break; - case REMOTE: + case RequestedCastSessionType.REMOTE: session = new RemotingCastSession(mApiClient, result.getSessionId(), result.getApplicationMetadata(), result.getApplicationStatus(), mSink.getDevice(), mOrigin, mTabId, mIsIncognito, mSource); @@ -257,7 +271,7 @@ } private void reportError() { - if (mState == STATE_TERMINATED) throwInvalidState(); + if (mState == State.TERMINATED) throwInvalidState(); ChromeCastSessionManager.get().onSessionStartFailed(); @@ -267,6 +281,6 @@ private void terminate() { mApiClient.unregisterConnectionCallbacks(this); mApiClient.unregisterConnectionFailedListener(this); - mState = STATE_TERMINATED; + mState = State.TERMINATED; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java index bb36e8a..449cb45 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
@@ -777,10 +777,7 @@ if (mService == service) return; mService = service; - updateNotification(true /*serviceStarting*/); - mNotificationUmaTracker.onNotificationShown( - NotificationUmaTracker.SystemNotificationType.MEDIA, - ChannelDefinitions.ChannelId.MEDIA); + updateNotification(true /*serviceStarting*/, true /*shouldLogNotification*/); } /** @@ -841,7 +838,7 @@ updateNotificationBuilder(); AppHooks.get().startForegroundService(createIntent()); } else { - updateNotification(false); + updateNotification(false, false); } } @@ -908,7 +905,7 @@ } @VisibleForTesting - void updateNotification(boolean serviceStarting) { + void updateNotification(boolean serviceStarting, boolean shouldLogNotification) { if (mService == null) return; if (mMediaNotificationInfo == null) { @@ -943,6 +940,10 @@ } else if (!foregroundedService) { mService.startForeground(mMediaNotificationInfo.id, notification); } + if (shouldLogNotification) { + mNotificationUmaTracker.onNotificationShown( + NotificationUmaTracker.SystemNotificationType.MEDIA, notification); + } } @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java index 9a521ef..e9904e7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java
@@ -621,10 +621,10 @@ notificationBuilder.addSettingsAction( settingsIconId, settingsTitle, pendingSettingsIntent); - mNotificationManager.notify(notificationId, PLATFORM_ID, notificationBuilder.build()); + Notification notification = notificationBuilder.build(); + mNotificationManager.notify(notificationId, PLATFORM_ID, notification); NotificationUmaTracker.getInstance().onNotificationShown( - NotificationUmaTracker.SystemNotificationType.SITES, - notificationBuilder.mChannelId); + NotificationUmaTracker.SystemNotificationType.SITES, notification); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java index 0b7ae37..2df9608e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.notifications; import android.annotation.TargetApi; +import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.SharedPreferences; @@ -88,10 +89,18 @@ * types. Splits the logs by the global enabled state of notifications and also logs the last * notification shown prior to the global notifications state being disabled by the user. * @param type The type of notification that was shown. - * @param channelId The id of the notification channel set on the notification. + * @param notification The notification that was shown. * @see SystemNotificationType */ - public void onNotificationShown( + public void onNotificationShown(@SystemNotificationType int type, Notification notification) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + logNotificationShown(type, notification.getChannelId()); + } else { + logNotificationShown(type, null); + } + } + + private void logNotificationShown( @SystemNotificationType int type, @ChannelDefinitions.ChannelId String channelId) { if (!mNotificationManager.areNotificationsEnabled()) { logPotentialBlockedCause();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotifier.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotifier.java index 8aac095..0a94105 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotifier.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotifier.java
@@ -194,10 +194,12 @@ settingsIntent); } if (priority >= 0) builder.setDefaults(Notification.DEFAULT_ALL); - manager.notify(NOTIFICATION_TAG, nextId, builder.build()); + Notification notification = builder.build(); + + manager.notify(NOTIFICATION_TAG, nextId, notification); NotificationUmaTracker.getInstance().onNotificationShown( - NotificationUmaTracker.SystemNotificationType.CONTENT_SUGGESTION, - ChannelDefinitions.ChannelId.CONTENT_SUGGESTIONS); + NotificationUmaTracker.SystemNotificationType.CONTENT_SUGGESTION, notification); + addActiveNotification(new ActiveNotification(nextId, category, idWithinCategory, uri)); // Set timeout.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java index 2afaa83..94cdf23 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.offlinepages.prefetch; +import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -127,9 +128,11 @@ settingsIntent); } + Notification notification = builder.build(); + NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - manager.notify(NOTIFICATION_TAG, notificationId, builder.build()); + manager.notify(NOTIFICATION_TAG, notificationId, notification); // Increment ignored notification counter. This will be reset on click. PrefetchPrefs.setIgnoredNotificationCounter( @@ -139,7 +142,7 @@ recordNotificationAction(NOTIFICATION_ACTION_SHOWN); NotificationUmaTracker.getInstance().onNotificationShown( NotificationUmaTracker.SystemNotificationType.OFFLINE_CONTENT_SUGGESTION, - ChannelDefinitions.ChannelId.CONTENT_SUGGESTIONS); + notification); } private static PendingIntent getPendingBroadcastFor(Context context, Class clazz) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java index ca1dcbe5..27f2632c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java
@@ -516,7 +516,7 @@ private static void checkServerResponseCode(HttpURLConnection urlConnection) throws RequestFailureException { try { - if (urlConnection.getResponseCode() != 200) { + if (urlConnection.getResponseCode() != HttpURLConnection.HTTP_OK) { throw new RequestFailureException("Received " + urlConnection.getResponseCode() + " code instead of 200 (OK) from the server. Aborting."); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncAndServicesPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncAndServicesPreferences.java index 34acde3..ab3a21f7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncAndServicesPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncAndServicesPreferences.java
@@ -17,6 +17,7 @@ import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceGroup; +import android.provider.Settings; import android.support.annotation.IntDef; import android.support.annotation.Nullable; import android.text.Spannable; @@ -41,12 +42,12 @@ import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.signin.SigninManager; -import org.chromium.chrome.browser.signin.SigninUtils; import org.chromium.chrome.browser.sync.GoogleServiceAuthError; import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.chrome.browser.sync.ui.PassphraseCreationDialogFragment; import org.chromium.chrome.browser.sync.ui.PassphraseDialogFragment; import org.chromium.chrome.browser.sync.ui.PassphraseTypeDialogFragment; +import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.components.signin.AccountManagerFacade; import org.chromium.components.signin.ChromeSigninController; import org.chromium.components.sync.AndroidSyncSettings; @@ -725,8 +726,7 @@ } if (mCurrentSyncError == SyncError.ANDROID_SYNC_DISABLED) { - SigninUtils.openAccountSettingsPage( - getActivity(), ChromeSigninController.get().getSignedInAccountName()); + IntentUtils.safeStartActivity(getActivity(), new Intent(Settings.ACTION_SYNC_SETTINGS)); return; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java index 00629e3..0415090 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java
@@ -5,6 +5,8 @@ package org.chromium.chrome.browser.signin; import android.content.Context; +import android.content.Intent; +import android.provider.Settings; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -18,7 +20,7 @@ import org.chromium.chrome.browser.preferences.PreferencesLauncher; import org.chromium.chrome.browser.signin.AccountSigninActivity.AccessPoint; import org.chromium.chrome.browser.sync.ui.SyncCustomizationFragment; -import org.chromium.components.signin.ChromeSigninController; +import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.components.sync.AndroidSyncSettings; import org.chromium.components.sync.AndroidSyncSettings.AndroidSyncSettingsObserver; @@ -159,8 +161,7 @@ int descId = R.string.recent_tabs_sync_promo_enable_android_sync; ButtonState positiveButton = new ButtonPresent(R.string.open_settings_button, view -> { - SigninUtils.openAccountSettingsPage( - getContext(), ChromeSigninController.get().getSignedInAccountName()); + IntentUtils.safeStartActivity(getContext(), new Intent(Settings.ACTION_SYNC_SETTINGS)); }); return new ViewState(descId, positiveButton);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java index 09ad6399a..18c5275a0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
@@ -119,8 +119,7 @@ mNotificationManager.notify(NotificationConstants.NOTIFICATION_ID_SYNC, notification); NotificationUmaTracker.getInstance().onNotificationShown( - NotificationUmaTracker.SystemNotificationType.SYNC, - ChannelDefinitions.ChannelId.BROWSER); + NotificationUmaTracker.SystemNotificationType.SYNC, notification); } private boolean shouldSyncAuthErrorBeShown() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java index 7f98a81e..bdfc0f94 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java
@@ -19,6 +19,7 @@ import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceFragment; import android.preference.SwitchPreference; +import android.provider.Settings; import android.support.annotation.IntDef; import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; @@ -39,10 +40,10 @@ import org.chromium.chrome.browser.preferences.SyncedAccountPreference; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.signin.SigninManager; -import org.chromium.chrome.browser.signin.SigninUtils; import org.chromium.chrome.browser.sync.GoogleServiceAuthError; import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.chrome.browser.sync.SyncAccountSwitcher; +import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.components.signin.AccountManagerFacade; import org.chromium.components.signin.ChromeSigninController; import org.chromium.components.sync.AndroidSyncSettings; @@ -653,8 +654,7 @@ } if (mCurrentSyncError == SyncError.ANDROID_SYNC_DISABLED) { - SigninUtils.openAccountSettingsPage( - getActivity(), ChromeSigninController.get().getSignedInAccountName()); + IntentUtils.safeStartActivity(getActivity(), new Intent(Settings.ACTION_SYNC_SETTINGS)); return; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkDisclosureNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkDisclosureNotificationManager.java index a367fae..56aa894 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkDisclosureNotificationManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkDisclosureNotificationManager.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.webapps; +import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import android.support.v4.app.NotificationCompat; @@ -77,11 +78,11 @@ NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + Notification notification = builder.build(); nm.notify(DISMISSAL_NOTIFICATION_TAG_PREFIX + webappInfo.apkPackageName(), PLATFORM_ID, - builder.build()); + notification); NotificationUmaTracker.getInstance().onNotificationShown( - NotificationUmaTracker.SystemNotificationType.WEBAPK, - ChannelDefinitions.ChannelId.BROWSER); + NotificationUmaTracker.SystemNotificationType.WEBAPK, notification); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationManager.java index 8f237c0..13416ab4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationManager.java
@@ -57,12 +57,13 @@ return; } + Notification notification = createNotification(); NotificationManager nm = (NotificationManager) mWebappActivity.getSystemService( Context.NOTIFICATION_SERVICE); - nm.notify(NotificationConstants.NOTIFICATION_ID_WEBAPP_ACTIONS, createNotification()); + nm.notify(NotificationConstants.NOTIFICATION_ID_WEBAPP_ACTIONS, notification); + NotificationUmaTracker.getInstance().onNotificationShown( - NotificationUmaTracker.SystemNotificationType.WEBAPP_ACTIONS, - ChannelDefinitions.ChannelId.WEBAPP_ACTIONS); + NotificationUmaTracker.SystemNotificationType.WEBAPP_ACTIONS, notification); } private Notification createNotification() {
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index 0ca5ef2..642461f4 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -1338,9 +1338,6 @@ <message name="IDS_DOWNLOAD_LOCATION_NOT_ENOUGH_SPACE" desc="Text on download location dialog and error notification in the case that there is not enough space in the chosen location."> Not enough space </message> - <message name="IDS_DOWNLOAD_LOCATION_NOT_ENOUGH_SPACE_SD_CARD_FULL" desc="Text on download location error notification in the case that there is not enough space on SD card."> - Not enough space on SD card - </message> <message name="IDS_DOWNLOAD_LOCATION_DOWNLOAD_TO_DEFAULT_FOLDER" desc="Subtitle for download location dialog in the case that the download location the user had originally selected is full or not found. We automatically revert back to the default download location and ask the user to confirm that this is ok."> Download to default folder? </message> @@ -1353,9 +1350,6 @@ <message name="IDS_DOWNLOAD_LOCATION_NO_AVAILABLE_LOCATIONS" desc="Text that indicates to the user that there are no download locations available."> No available download locations </message> - <message name="IDS_DOWNLOAD_LOCATION_NOTIFICATION_RETRY" desc="Text on download location error notification button, to let the user retry the download."> - Retry - </message> <!-- About Chrome preferences --> <message name="IDS_PREFS_ABOUT_CHROME" desc="Title for the About Chrome page. [CHAR-LIMIT=32]">
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb index 2a2352fa..ee231a5 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -29,7 +29,7 @@ <translation id="1201402288615127009">ቀጣይ</translation> <translation id="1204037785786432551">የማውረጃ አገናኝ</translation> <translation id="1206892813135768548">የአገናኝ ጽሑፍ ቅዳ</translation> -<translation id="1208340532756947324">በመላ መሣሪያዎች ላይ ለማሳመር እና ግላዊነትን ለማላበስ ስምረትን ያብሩ</translation> +<translation id="1208340532756947324">በመላ መሣሪያዎች ላይ ስምረትን ማብራት ለማስመር እና ግላዊነትን ለማላበስ</translation> <translation id="1209206284964581585">ለአሁን ደብቅ</translation> <translation id="123724288017357924">የተሸጎጠ ይዘትን ችላ በማለት የአሁኑን ገጽ ዳግም ጫን</translation> <translation id="124116460088058876">ተጨማሪ ቋንቋዎች</translation> @@ -227,7 +227,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> ሰከንዶች ይቀራሉ</translation> <translation id="2781151931089541271">1 ሰከንድ ይቀራል</translation> <translation id="2810645512293415242">ውሂብን ለመቆጠብ እና በበለጠ ፍጥነት ለመጫን የተቃለለ ገጽ።</translation> -<translation id="2818669890320396765">የእርስዎን ዕልባቶች በሁሉም መሣሪያዎችዎ ላይ ለማግኘት በመለያ ይግቡና ስምረትን ያብሩ</translation> +<translation id="2818669890320396765">የእርስዎን ዕልባቶች በሁሉም መሣሪያዎችዎ ላይ ለማግኘት በመለያ መግባት እና ስምረትን ማብራት ለማግኘት</translation> <translation id="2836148919159985482">ከሙሉ ማያ ገጽ ለመውጣት የተመለስ አዝራሩን ይንኩ።</translation> <translation id="2842985007712546952">ወላጅ አቃፊ</translation> <translation id="2870560284913253234">ጣቢያ</translation> @@ -306,7 +306,7 @@ <translation id="3549657413697417275">የራስዎን ታሪክ ይፈልጉ</translation> <translation id="3552151358455404883">Chrome ስምረትን እና ግላዊነት ማለበስን በ<ph name="BEGIN_LINK1" />ቅንብሮች<ph name="END_LINK1" /> ውስጥ ያቀናብሩ</translation> <translation id="3557336313807607643">ወደ እውቂያዎች አክል</translation> -<translation id="3568688522516854065">ትሮችዎን ከሌሎች መሣሪያዎችዎ ለማግኘት በመለያ ይግቡ እና ስምረትን ያብሩ</translation> +<translation id="3568688522516854065">ትሮችዎን ከሌሎች መሣሪያዎችዎ በመለያ መግባት እና ስምረትን ማብራት ለማግኘት</translation> <translation id="3587482841069643663">ሁሉም</translation> <translation id="3590487821116122040">Chrome አላስፈላጊ ነው የሚያስበው የጣቢያ ማከማቻ (ለምሳሌ፦ ምንም የተቀመጡ ቅንብሮች የሌላቸው ጣቢያዎች ወይም እርስዎ ብዙ ጊዜ የማይጎበኟቸው)</translation> <translation id="3599863153486145794">ታሪክን በመለያ ከገቡ ሁሉም መሣሪያዎች ላይ ያጸዳል። የእርስዎ Google መለያ <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> ላይ ሌሎች የአሰሳ ታሪክ ዓይነቶች ሊኖረው ይችላል</translation> @@ -379,7 +379,7 @@ <translation id="4192273449750167573">ቅንብሮችዎን በቀጣዩ ማያ ገጽ ላይ ይገምግሙ</translation> <translation id="4195643157523330669">በአዲስ ትር ክፈት</translation> <translation id="4198423547019359126">ምንም የማውረጃ አካባቢዎች የሉም</translation> -<translation id="4209895695669353772">በGoogle የተጠቆመ ግላዊነት የተላበሰ ይዘትን ለማግኘት ስምረትን ያብሩ</translation> +<translation id="4209895695669353772">በGoogle የተጠቆመ ግላዊነት የተላበሰ ይዘትን ስምረትን ማብራት ለማግኘት</translation> <translation id="4226663524361240545">ማሳወቂያዎች መሣሪያውን እንዲነዝር ሊያደርጉት ይችላሉ</translation> <translation id="4242533952199664413">ቅንብሮችን ክፈት</translation> <translation id="424864128008805179">ከChrome ተዘግቶ ይወጣ?</translation> @@ -405,7 +405,7 @@ <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> ላይ ዕልባት ተደርጓል</translation> <translation id="4453340223357552416"><ph name="FILE_NAME" /> በ<ph name="PRODUCT_NAME" /> ውስጥ ወርዷል</translation> <translation id="4468959413250150279">በአንድ የተወሰነ ጣቢያ ላይ ድምጸ-ከል አድርግ።</translation> -<translation id="4472118726404937099">በመላ መሣሪያዎች ላይ ለማሳመር እና ግላዊነትን ለማላበስ በመለያ ይግቡ እና ስምረትን ያብሩ</translation> +<translation id="4472118726404937099">በመላ መሣሪያዎች ላይ በመለያ መግባት እና ስምረትን ማብራት ለማስመር እና ግላዊነትን ለማላበስ</translation> <translation id="4479647676395637221">ጣቢያዎች ካሜራዎን እንዲጠቀሙ ከመፍቀድዎ በፊት ይጠይቅ (የሚመከር)</translation> <translation id="4487967297491345095">ሁሉንም የChrome መተግበሪያ ውሂብ እስከመጨረሻው ይሰረዛል። ይሄ ሁሉንም ፋይሎች፣ ቅንብሮች፣ መለያዎች፣ የውሂብ ጎታዎች፣ ወዘተ. ያካትታል።</translation> <translation id="4508440807153586353">የእርስዎን የይለፍ ሐረግ ያለው ሰው ብቻ ነው የተመሰጠረ ውሂብዎን ማየት የሚችለው። የይለፍ ሐረጉ ለGoogle አይላክም ወይም አይከማችም። የይለፍ ሐረግዎን ከረሱት ስምረትን ዳግም ማስጀመር ይኖርብዎታል። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation> @@ -590,7 +590,7 @@ <translation id="5854790677617711513">ከ30 ቀናት በላይ የቆየ</translation> <translation id="5858741533101922242">Chrome የብሉቱዝ አስማሚውን ማብራት አልቻለም</translation> <translation id="5860033963881614850">አጥፋ</translation> -<translation id="5862731021271217234">ትሮችዎን ከሌሎች መሣሪያዎችዎ ለማግኘት ስምረትን ያብሩ</translation> +<translation id="5862731021271217234">ትሮችዎን ከሌሎች መሣሪያዎችዎ ስምረትን ማብራት ለማግኘት</translation> <translation id="5864174910718532887">ዝርዝሮች፦ በጣቢያ ስም የተለየ</translation> <translation id="5864419784173784555">ሌላ ውርድን በመጠበቅ ላይ…</translation> <translation id="5869522115854928033">የተቀመጡ የይለፍ ቃሎች</translation> @@ -869,7 +869,7 @@ <translation id="8100932616285851614">የአሰሳ ፓነሉ ተዘግቷል</translation> <translation id="8103578431304235997">ማንነት የማያሳውቅ ትር</translation> <translation id="8105951947646329362">ተዛማጅ ገጾችን ይጠቁሙ</translation> -<translation id="8109613176066109935">የእርስዎን ዕልባቶች በሁሉም መሣሪያዎችዎ ላይ ለማግኘት ስምረትን ያብሩ</translation> +<translation id="8109613176066109935">የእርስዎን ዕልባቶች በሁሉም መሣሪያዎችዎ ላይ ስምረትን ማብራት ለማግኘት</translation> <translation id="8116925261070264013">ድምፀ ከል ተደርጓል</translation> <translation id="813082847718468539">የጣቢያ መረጃን ይመልከቱ</translation> <translation id="8168435359814927499">ይዘት</translation> @@ -974,7 +974,7 @@ <translation id="9065203028668620118">አርትዕ</translation> <translation id="9070377983101773829">የድምጽ ፍለጋን ጀምር</translation> <translation id="9071742570345586758">የምናባዊ እውነታ ይዘትን ለመመልከት የGoogle ቪአር አገልግሎቶችን ይጫኑ</translation> -<translation id="9074336505530349563">በGoogle የተጠቆመ ግላዊነት የተላበሰ ይዘትን ለማግኘት በመለያ ይግቡ እና ስምረትን ያብሩ</translation> +<translation id="9074336505530349563">በGoogle የተጠቆመ ግላዊነት የተላበሰ ይዘትን በመለያ መግባት እና ስምረትን ማብራት ለማግኘት</translation> <translation id="9086455579313502267">አውታረ መረቡን መድረስ አልተቻለም።</translation> <translation id="9099018167121903954"><ph name="KILOBYTES" /> ኪባ ወርዷል</translation> <translation id="9100505651305367705">የሚደገፍ ሲሆን ጽሑፎችን በተቃለለ እይታ ለማሳየት ጠይቅ</translation> @@ -982,6 +982,7 @@ <translation id="9100939710791843300">አዲሱን የትር ገጽ ለመጫን እና እንዲነበቡ የተጠቆሙትን ጽሑፎች ለመመልከት መነሻ አዝራሩን መታ ያድርጉ</translation> <translation id="9133515669113036225">የመሣሪያ ምስክርነቶችን ዳግም ያስጀምሩ</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">የመጀመሪያውን አሳይ</translation> <translation id="9139068048179869749">ጣቢያዎች ማሳወቂያዎችን እንዲልኩ ከመፍቀድ በፊት ይጠይቅ (የሚመከር)</translation> <translation id="9155898266292537608">እንዲሁም አንድ ቃል ላይ በፍጥነት መታ በማድረግ ፍለጋ ማድረግ ይችላሉ</translation> <translation id="9188680907066685419">ከሚተዳደር መለያ ዘግግተህ ውጣ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb index 6c71347..94ddea70 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -159,7 +159,7 @@ <translation id="2184766556418880456">انقر للوصول إلى صفحة علامة التبويب الجديدة في علامة التبويب الحالية.</translation> <translation id="2206488550163399966"><ph name="APP_NAME" />، تطبيق ويب. <ph name="APP_URL" /></translation> <translation id="2227444325776770048">متابعة باسم <ph name="USER_FULL_NAME" /></translation> -<translation id="2232379019872353004">يُرسِل بعض معلومات النظام ومحتوى الصفحة إلى Google.</translation> +<translation id="2232379019872353004">يتم إرسال بعض معلومات النظام ومحتوى الصفحة إلى Google.</translation> <translation id="2234876718134438132">خدمات Google والمزامنة</translation> <translation id="2259659629660284697">تصدير كلمات المرور...</translation> <translation id="2268044343513325586">تحسين</translation> @@ -196,7 +196,7 @@ <translation id="2501278716633472235">الرجوع للخلف</translation> <translation id="2512222046227390255">املأ النماذج تلقائيًا</translation> <translation id="2513403576141822879">لعرض مزيد من الإعدادات المتعلِّقة بالخصوصية والأمان وجمع البيانات، يُرجى الاطِّلاع على <ph name="BEGIN_LINK" />خدمات Google والمزامنة<ph name="END_LINK" /></translation> -<translation id="2523184218357549926">يُرسِل عناوين URL للصفحات التي تزورها إلى Google.</translation> +<translation id="2523184218357549926">يتم إرسال عناوين URL للصفحات التي تزورها إلى Google.</translation> <translation id="2526148617758225454">تم تشغيل توفير البيانات. يمكنك إدارته في الإعدادات.</translation> <translation id="2532336938189706096">عرض الويب</translation> <translation id="2536728043171574184">عرض نسخة بلا اتصال من هذه الصفحة</translation> @@ -573,7 +573,7 @@ لكنك لن تكون غير مرئي، فاستخدام وضع التصفح المتخفي لا يخفي تصفحك عن صاحب العمل أو مزود خدمة الإنترنت أو مواقع الويب التي تزورها.</translation> <translation id="572328651809341494">علامات التبويب الأخيرة</translation> <translation id="5726692708398506830">تكبير كل محتويات الصفحة</translation> -<translation id="5731185123186077399">خدمات Google المخصصة مثل Google Pay</translation> +<translation id="5731185123186077399">الاستفادة من خدمات Google المخصّصة مثل Google Pay</translation> <translation id="5738816946784116349">تنزيلات Chrome</translation> <translation id="5748802427693696783">تم التبديل إلى علامات التبويب القياسية</translation> <translation id="5749068826913805084">يحتاج Chrome الوصول إلى سعة التخزين لتنزيل الملفات.</translation> @@ -844,7 +844,7 @@ <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> قديم.</translation> <translation id="7947953824732555851">قبول وتسجيل الدخول</translation> <translation id="7963646190083259054">المورّد:</translation> -<translation id="7981313251711023384">التحميل المُسبق للصفحات للحصول على أداء أسرع للتصفح والبحث</translation> +<translation id="7981313251711023384">التحميل المُسبق للصفحات للحصول على أداء أسرع أثناء التصفّح والبحث</translation> <translation id="79859296434321399">لعرض محتوى الواقع المُعزَّز، يُرجى تثبيت ARCore</translation> <translation id="7987073022710626672">بنود خدمة Chrome</translation> <translation id="7998918019931843664">إعادة فتح علامة التبويب المغلقة</translation> @@ -942,7 +942,7 @@ <translation id="8788968922598763114">إعادة فتح آخر علامة تبويب تم إغلاقها</translation> <translation id="8812260976093120287">يمكنك على مواقع ويب معيّنة الدفع باستخدام تطبيقات الدفع المتوافقة أعلاه على جهازك.</translation> <translation id="8816439037877937734">سيتم فتح <ph name="APP_NAME" /> في Chrome. بالمتابعة، أنت توافق على <ph name="BEGIN_LINK1" />بنود الخدمة<ph name="END_LINK1" /> و<ph name="BEGIN_LINK2" />إشعار الخصوصية<ph name="END_LINK2" /> في Chrome، و<ph name="BEGIN_LINK3" />إشعار الخصوصية لحسابات Google المُدارة من خلال Family Link<ph name="END_LINK3" />.</translation> -<translation id="8820817407110198400">إشارات</translation> +<translation id="8820817407110198400">الإشارات المرجعية</translation> <translation id="8823704566850948458">اقتراح كلمة مرور...</translation> <translation id="8830904257167680355"><ph name="DESCRIPTION" /> - <ph name="FILE_SIZE" /></translation> <translation id="883806473910249246">حدث خطأ أثناء تنزيل المحتوى.</translation> @@ -983,6 +983,7 @@ <translation id="9100939710791843300">انقر على زر "الصفحة الرئيسية" لتحميل صفحة علامة التبويب الجديدة وعرض المقالات المقترحة.</translation> <translation id="9133515669113036225">إعادة تعيين بيانات اعتماد الجهاز</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">إظهار الصفحة الأصلية</translation> <translation id="9139068048179869749">السؤال قبل السماح للمواقع بإرسال الإشعارات (موصى به)</translation> <translation id="9155898266292537608">يمكنك أيضًا البحث بنقرة سريعة على كلمة</translation> <translation id="9188680907066685419">تسجيل الخروج من الحساب المُدار</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb index 6bfe9787..2bcfa9e3 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -983,6 +983,7 @@ <translation id="9100939710791843300">Докоснете бутона „Начало“, за да се зареди нов раздел и да видите предложени статии</translation> <translation id="9133515669113036225">Нулиране на идентификационните данни на устройството</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Показване на оригинала</translation> <translation id="9139068048179869749">Извеждане на запитване, преди да се разреши на сайтовете да изпращат известия (препоръчително)</translation> <translation id="9155898266292537608">Можете също да извършите търсене с бързо докосване на дума</translation> <translation id="9188680907066685419">Излизане от управляван профил</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb index 82b5b94..be3ebed 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -130,6 +130,7 @@ <translation id="1989112275319619282">Examina</translation> <translation id="1993768208584545658"><ph name="SITE" /> es vol vincular</translation> <translation id="1994173015038366702">URL del lloc</translation> +<translation id="2000419248597011803">Envia al motor de cerca predeterminat algunes galetes i cerques de la barra d'adreces i del quadre de cerca</translation> <translation id="2002537628803770967">Targetes de crèdit i adreces amb Google Pay</translation> <translation id="200815880754187296"><ph name="KILOBYTES" /> kB en altres aplicacions</translation> <translation id="2017836877785168846">Esborra l'historial i les complecions automàtiques a la barra d'adreces.</translation> @@ -181,6 +182,7 @@ <translation id="2387895666653383613">Canvia la mida del text</translation> <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2410754283952462441">Tria un compte</translation> +<translation id="2414672073755873541">No hi ha contingut</translation> <translation id="2414886740292270097">Fosc</translation> <translation id="2416359993254398973">Per visitar aquest lloc web, Chrome necessita permís per accedir a la teva càmera.</translation> <translation id="2426805022920575512">Tria un altre compte</translation> @@ -227,6 +229,7 @@ <translation id="2777555524387840389">Queden <ph name="SECONDS" /> segons</translation> <translation id="2781151931089541271">Queda 1 segon</translation> <translation id="2810645512293415242">La pàgina s'ha simplificat per estalviar dades i carregar-se més ràpidament.</translation> +<translation id="281504910091592009">Consulta i gestiona les contrasenyes desades al <ph name="BEGIN_LINK" />Compte de Google<ph name="END_LINK" /></translation> <translation id="2818669890320396765">Per accedir a les adreces d'interès des de tots els dispositius, inicia la sessió i activa la sincronització</translation> <translation id="2836148919159985482">Toqueu el botó Enrere per sortir de la pantalla completa.</translation> <translation id="2842985007712546952">Carpeta principal</translation> @@ -314,6 +317,7 @@ <translation id="360207483134687714">Ajuda a millorar l'experiència de RV a Chrome</translation> <translation id="3616113530831147358">Àudio</translation> <translation id="3620176948598597475">En restablir l'extensió Economitzador de dades, se n'esborrarà l'historial, inclosa la llista de llocs web visitats.</translation> +<translation id="3630011985153972676">A la configuració, permet que Chrome et baixi articles quan estiguis connectat a la Wi-Fi.</translation> <translation id="3632295766818638029">Mostra la contrasenya</translation> <translation id="363596933471559332">Inicia la sessió automàticament als llocs web amb les credencials emmagatzemades. Si la funció està desactivada, se us demana sempre que les verifiqueu per iniciar la sessió en un lloc web.</translation> <translation id="3661699943263275414">Els llocs web de tercers poden desar i llegir les dades de les galetes</translation> @@ -518,6 +522,7 @@ <translation id="5335288049665977812">Permet que els llocs executin JavaScript (opció recomanada)</translation> <translation id="5345040418939504969"><ph name="BOOKMARK_TITLE" /> s'ha suprimit</translation> <translation id="5372829067651257087">S'ha copiat l'URL.</translation> +<translation id="5391532827096253100">La connexió a aquest lloc web no és segura. Informació del lloc web.</translation> <translation id="5400569084694353794">En fer servir aquesta aplicació, accepteu les <ph name="BEGIN_LINK1" />Condicions del servei<ph name="END_LINK1" /> i l'<ph name="BEGIN_LINK2" />Avís de privadesa<ph name="END_LINK2" /> de Chrome.</translation> <translation id="5403644198645076998">Permet només certs llocs</translation> <translation id="5414836363063783498">S'està verificant...</translation> @@ -631,6 +636,7 @@ <translation id="618555311922999635">El tauler de navegació ocupa tota la pantalla</translation> <translation id="6192333916571137726">Baixa el fitxer</translation> <translation id="6192792657125177640">Excepcions</translation> +<translation id="6206551242102657620">La connexió és segura. Informació del lloc web.</translation> <translation id="6210748933810148297">No ets <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Opcions per a <ph name="NAME_OF_LIST_ITEM" /></translation> <translation id="6221633008163990886">Desbloqueja per exportar les contrasenyes</translation> @@ -722,6 +728,7 @@ <translation id="6914783257214138813">Tothom que pugui veure el fitxer exportat podrà veure també les teves contrasenyes.</translation> <translation id="6942665639005891494">Canvia la ubicació predeterminada de baixada en qualsevol moment amb l'opció del menú Configuració</translation> <translation id="6945221475159498467">Selecciona</translation> +<translation id="6963642900430330478">Aquesta pàgina és perillosa. Informació del lloc web.</translation> <translation id="6963766334940102469">Suprimeix les adreces d'interès</translation> <translation id="6965382102122355670">D'acord</translation> <translation id="6978479750597523876">Restableix la configuració del Traductor</translation> @@ -982,6 +989,7 @@ <translation id="9100939710791843300">Toca el botó d'inici per carregar la pàgina Pestanya nova i veure els articles suggerits</translation> <translation id="9133515669113036225">Restableix les credencials del dispositiu</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Mostra l'original</translation> <translation id="9139068048179869749">Pregunta abans de permetre que els llocs enviïn notificacions (opció recomanada)</translation> <translation id="9155898266292537608">També pots fer un toc ràpid en una paraula per fer cerques</translation> <translation id="9188680907066685419">Tanqueu la sessió del compte gestionat</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb index 6dd9c059..19cc3a0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Klepnutím na tlačítko plochy načtete stránku Nová karta a zobrazíte navrhované články</translation> <translation id="9133515669113036225">Resetovat identifikační údaje zařízení</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Zobrazit originál</translation> <translation id="9139068048179869749">Pokud web bude chtít odesílat oznámení, zobrazit dotaz (doporučeno)</translation> <translation id="9155898266292537608">Hledat můžete také rychlým klepnutím na slovo</translation> <translation id="9188680907066685419">Odhlásit se ze spravovaného účtu</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb index 9c5d116..0118f30 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Tryk på knappen Hjem for at indlæse siden Ny fane og få vist foreslåede artikler</translation> <translation id="9133515669113036225">Nulstil loginoplysningerne for enheden</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Vis oprindelig</translation> <translation id="9139068048179869749">Spørg om tilladelse, før websites sender underretninger (anbefales)</translation> <translation id="9155898266292537608">Du kan også søge med et hurtigt tryk på et ord</translation> <translation id="9188680907066685419">Log ud af den administrerede konto</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb index 85630a0..2af77bb 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -983,6 +983,7 @@ <translation id="9100939710791843300">Tippen Sie auf die Schaltfläche "Startseite", um die "Neuer Tab"-Seite zu laden und sich vorgeschlagene Artikel anzeigen zu lassen</translation> <translation id="9133515669113036225">Anmeldedaten des Geräts zurücksetzen</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Original anzeigen</translation> <translation id="9139068048179869749">Nachfragen, bevor Websites Benachrichtigungen senden dürfen (empfohlen)</translation> <translation id="9155898266292537608">Sie können auch kurz auf ein Wort tippen, um eine Suche zu starten</translation> <translation id="9188680907066685419">Von verwaltetem Konto abmelden</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb index 4f48e62..5ecf782 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Πατήστε το κουμπί αρχικής οθόνης για να φορτώσετε τη σελίδα σε νέα καρτέλα και να δείτε προτεινόμενα άρθρα</translation> <translation id="9133515669113036225">Επαναφορά διαπιστευτηρίων συσκευής</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Εμφάνιση πρωτοτύπου</translation> <translation id="9139068048179869749">Να γίνεται ερώτηση προτού επιτραπεί στους ιστότοπους να στέλνουν ειδοποιήσεις (συνιστάται)</translation> <translation id="9155898266292537608">Επίσης, μπορείτε να κάνετε αναζήτηση με ένα γρήγορο πάτημα σε μια λέξη</translation> <translation id="9188680907066685419">Αποσύνδεση από διαχειριζόμενο λογαριασμό</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb index 4e7aebb..14b5542 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb
@@ -130,6 +130,7 @@ <translation id="1989112275319619282">Browse</translation> <translation id="1993768208584545658"><ph name="SITE" /> wants to pair</translation> <translation id="1994173015038366702">Site URL</translation> +<translation id="2000419248597011803">Sends some cookies and searches from the address bar and search box to your default search engine</translation> <translation id="2002537628803770967">Credit cards and addresses using Google Pay</translation> <translation id="200815880754187296"><ph name="KILOBYTES" /> KB other apps</translation> <translation id="2017836877785168846">Clears history and autocompletions in the address bar.</translation> @@ -181,6 +182,7 @@ <translation id="2387895666653383613">Text scaling</translation> <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2410754283952462441">Choose an account</translation> +<translation id="2414672073755873541">No content here</translation> <translation id="2414886740292270097">Dark</translation> <translation id="2416359993254398973">Chrome needs permission to access your camera for this site.</translation> <translation id="2426805022920575512">Choose another account</translation> @@ -227,6 +229,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> secs left</translation> <translation id="2781151931089541271">1 sec left</translation> <translation id="2810645512293415242">Simplified page to save data and load faster.</translation> +<translation id="281504910091592009">View and manage saved passwords in your <ph name="BEGIN_LINK" />Google account<ph name="END_LINK" /></translation> <translation id="2818669890320396765">To get your bookmarks on all your devices, sign in and turn on sync</translation> <translation id="2836148919159985482">Touch the back button to exit full screen.</translation> <translation id="2842985007712546952">Parent folder</translation> @@ -314,6 +317,7 @@ <translation id="360207483134687714">Help improve the VR experience in Chrome</translation> <translation id="3616113530831147358">Audio</translation> <translation id="3620176948598597475">Resetting erases Data Saver history, including the list of visited sites.</translation> +<translation id="3630011985153972676">Allow Chrome to download articles for you when on Wi-Fi under settings.</translation> <translation id="3632295766818638029">Unmask password</translation> <translation id="363596933471559332">Automatically sign in to websites using stored credentials. When the feature is off, you’ll be asked for verification every time before signing in to a website.</translation> <translation id="3661699943263275414">Third-party websites can save and read cookie data</translation> @@ -518,6 +522,7 @@ <translation id="5335288049665977812">Allow sites to run JavaScript (recommended)</translation> <translation id="5345040418939504969">Deleted <ph name="BOOKMARK_TITLE" /></translation> <translation id="5372829067651257087">URL copied.</translation> +<translation id="5391532827096253100">Your connection to this site is not secure. Site information</translation> <translation id="5400569084694353794">By using this application, you agree to Chrome’s <ph name="BEGIN_LINK1" />Terms of Service<ph name="END_LINK1" /> and <ph name="BEGIN_LINK2" />Privacy Notice<ph name="END_LINK2" />.</translation> <translation id="5403644198645076998">Only allow certain sites</translation> <translation id="5414836363063783498">Verifying…</translation> @@ -631,6 +636,7 @@ <translation id="618555311922999635">Navigation panel opened at full height</translation> <translation id="6192333916571137726">Download File</translation> <translation id="6192792657125177640">Exceptions</translation> +<translation id="6206551242102657620">Connection is secure. Site information</translation> <translation id="6210748933810148297">Not <ph name="EMAIL" />?</translation> <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> Options</translation> <translation id="6221633008163990886">Unlock to export your passwords</translation> @@ -722,6 +728,7 @@ <translation id="6914783257214138813">Your passwords will be visible to anyone who can see the exported file.</translation> <translation id="6942665639005891494">Change the default download location at any time using the Settings menu option</translation> <translation id="6945221475159498467">Select</translation> +<translation id="6963642900430330478">This page is dangerous. Site information</translation> <translation id="6963766334940102469">Delete bookmarks</translation> <translation id="6965382102122355670">OK</translation> <translation id="6978479750597523876">Reset translate settings</translation> @@ -980,6 +987,7 @@ <translation id="9100939710791843300">Tap the home button to load the new tab page and view suggested articles</translation> <translation id="9133515669113036225">Reset device credentials</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Show original</translation> <translation id="9139068048179869749">Ask before allowing sites to send notifications (recommended)</translation> <translation id="9155898266292537608">You can also search with a quick tap on a word</translation> <translation id="9188680907066685419">Sign out of managed account</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb index 4897fc8..138be199 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Presiona el botón de inicio para cargar la página Nueva pestaña y ver artículos sugeridos</translation> <translation id="9133515669113036225">Restablecer credenciales de dispositivo</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Mostrar original</translation> <translation id="9139068048179869749">Preguntar antes de permitir que los sitios envíen notificaciones (recomendado)</translation> <translation id="9155898266292537608">También puedes presionar brevemente la palabra para realizar una búsqueda</translation> <translation id="9188680907066685419">Salir de la cuenta administrada</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb index 6634186..abb56a5 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -159,7 +159,7 @@ <translation id="2184766556418880456">Toca para acceder a la página Nueva pestaña en tu pestaña actual</translation> <translation id="2206488550163399966"><ph name="APP_NAME" />, una aplicación web disponible en <ph name="APP_URL" /></translation> <translation id="2227444325776770048">Continuar como <ph name="USER_FULL_NAME" /></translation> -<translation id="2232379019872353004">Enviar información del sistema y contenido de las páginas a Google</translation> +<translation id="2232379019872353004">Envía información del sistema y contenido de las páginas a Google</translation> <translation id="2234876718134438132">Servicios de Google y sincronización</translation> <translation id="2259659629660284697">Exportar contraseñas…</translation> <translation id="2268044343513325586">Restringir</translation> @@ -186,7 +186,7 @@ <translation id="2426805022920575512">Elegir otra cuenta</translation> <translation id="2433507940547922241">Aspecto</translation> <translation id="2434158240863470628">Descarga completa <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2436117022029368436">Se comunica con Google para mejorar la navegación y Chrome</translation> +<translation id="2436117022029368436">Se comunican con Google para mejorar la navegación y Chrome</translation> <translation id="2440823041667407902">Acceso a la ubicación</translation> <translation id="2450083983707403292">¿Quieres empezar a descargar <ph name="FILE_NAME" /> de nuevo?</translation> <translation id="2476578072172137802">Configuración del sitio</translation> @@ -963,7 +963,7 @@ <translation id="8979405271719829084">Descarga vídeos para verlos más tarde</translation> <translation id="8981454092730389528">Gestión de tu actividad en Google</translation> <translation id="8983677657449185470">Ayudar a mejorar la función Navegación Segura</translation> -<translation id="8986494364107987395">Enviar automáticamente estadísticas de uso e informes sobre fallos a Google</translation> +<translation id="8986494364107987395">Envía automáticamente estadísticas de uso e informes sobre fallos a Google</translation> <translation id="8993760627012879038">Abre una nueva pestaña en modo de incógnito</translation> <translation id="8998729206196772491">Estás iniciando sesión con una cuenta gestionada por <ph name="MANAGED_DOMAIN" />, lo que significa que vas a proporcionar a su administrador el control sobre tus datos de Chrome. Los datos se vincularán de forma permanente a esta cuenta. Si cierras sesión en Chrome, se eliminarán los datos de este dispositivo, pero permanecerán almacenados en tu cuenta de Google.</translation> <translation id="9019902583201351841">Administrado por tus padres</translation> @@ -982,6 +982,7 @@ <translation id="9100939710791843300">Toca el botón de inicio para cargar la página Nueva pestaña y ver artículos sugeridos</translation> <translation id="9133515669113036225">Restablecer credenciales del dispositivo</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Mostrar original</translation> <translation id="9139068048179869749">Preguntar antes de permitir que los sitios web envíen notificaciones (recomendado)</translation> <translation id="9155898266292537608">También puedes tocar rápidamente una palabra para hacer búsquedas</translation> <translation id="9188680907066685419">Cierra sesión en la cuenta gestionada</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb index 27070f9e..8a699c8 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -981,6 +981,7 @@ <translation id="9100939710791843300">برای بارگیری صفحه برگه جدید و مشاهده مقالههای پیشنهادی، روی دکمه صفحه اصلی ضربه بزنید</translation> <translation id="9133515669113036225">بازنشانی اعتبارنامههای دستگاه</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">نمایش مورد اصلی</translation> <translation id="9139068048179869749">قبل از اجازه به سایتها برای ارسال اعلان ابتدا سؤال شود (توصیه میشود)</translation> <translation id="9155898266292537608">میتوانید با ضربهای سریع روی کلمه نیز جستجو کنید</translation> <translation id="9188680907066685419">خروج از حساب مدیریتشده</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb index 2980e6e3..f220254 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Napauta aloitusnäyttöpainiketta ladataksesi uusi välilehti ‑sivun ja nähdäksesi ehdotettuja artikkeleita</translation> <translation id="9133515669113036225">Nollaa laitteen kirjautumistiedot</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Näytä alkuperäinen</translation> <translation id="9139068048179869749">Pyydä lupaa, kun sivustot yrittävät lähettää ilmoituksia (suositus).</translation> <translation id="9155898266292537608">Voit hakea myös napauttamalla sanaa nopeasti.</translation> <translation id="9188680907066685419">Kirjaudu ulos hallinnoidulta tililtä</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb index 21ef50f..ef170d3dd 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">I-tap ang button ng home para ma-load ang page ng bagong tab at tingnan ang mga iminumungkahing artikulo</translation> <translation id="9133515669113036225">I-reset ang mga kredensyal ng device</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Ipakita ang orihinal</translation> <translation id="9139068048179869749">Magtanong bago payagan ang mga site na magpadala ng mga notification (inirerekomenda)</translation> <translation id="9155898266292537608">Makakapaghanap ka rin gamit ang mabilisang pag-tap sa isang salita</translation> <translation id="9188680907066685419">Mag-sign out sa pinamamahalaang account</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb index 6d19917..ccde3ea 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Appuyez sur le bouton d'accueil pour charger la page "Nouvel onglet" et afficher les articles suggérés</translation> <translation id="9133515669113036225">Réinitialiser les identifiants de l'appareil</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Afficher l'original</translation> <translation id="9139068048179869749">Demander avant d'autoriser des sites à envoyer des notifications (recommandé)</translation> <translation id="9155898266292537608">Vous pouvez également effectuer une recherche en appuyant brièvement sur un mot</translation> <translation id="9188680907066685419">Se déconnecter d'un compte géré</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb index 84a50643..0a120e9a 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">'नया टैब' पेज लोड करने और सुझाए गए लेख देखने के लिए 'होम' बटन पर टैप करें</translation> <translation id="9133515669113036225">डिवाइस प्रमाणिकता रीसेट करें</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">मूल दिखाएं</translation> <translation id="9139068048179869749">साइट को नोटिफ़िकेशन भेजने देने से पहले अनुमति लेना आवश्यक बनाएं (अनुशंसित)</translation> <translation id="9155898266292537608">आप किसी शब्द पर बस एक टैप करके भी खोज सकते हैं</translation> <translation id="9188680907066685419">प्रबंधित खाते से प्रस्थान करें</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb index 38e644e..b1001cf 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Dodirnite gumb početnog zaslona za učitavanje web-stranice nove kartice i prikaz predloženih članaka</translation> <translation id="9133515669113036225">Poništavanje vjerodajnica uređaja</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Prikaži original</translation> <translation id="9139068048179869749">Web-lokacije moraju tražiti dopuštenje za slanje obavijesti (preporučeno)</translation> <translation id="9155898266292537608">Možete i kratko dodirnuti riječ da biste je pretražili</translation> <translation id="9188680907066685419">Odjava s upravljanog računa</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb index 853e4b0..5587a94 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Koppintson a Kezdőképernyő gombra az új lap oldal betöltéséhez és a javasolt cikkek megtekintéséhez</translation> <translation id="9133515669113036225">Az eszközhitelesítési adatok visszaállítása</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Eredeti megjelenítése</translation> <translation id="9139068048179869749">Kérdezzen rá, mielőtt engedélyezné a webhelyek számára az értesítések küldését (ajánlott)</translation> <translation id="9155898266292537608">Úgy is végrehajthat keresést, hogy gyorsan rákoppint valamelyik szóra</translation> <translation id="9188680907066685419">Kijelentkezés felügyelt fiókból</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb index 10b8c72..c5595e6 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -130,6 +130,7 @@ <translation id="1989112275319619282">Jelajahi</translation> <translation id="1993768208584545658"><ph name="SITE" /> ingin menyandingkan</translation> <translation id="1994173015038366702">URL situs</translation> +<translation id="2000419248597011803">Mengirimkan beberapa cookie dan penelusuran dari kolom URL dan kotak penelusuran ke mesin telusur default</translation> <translation id="2002537628803770967">Kartu kredit dan alamat yang menggunakan Google Pay</translation> <translation id="200815880754187296"><ph name="KILOBYTES" /> KB aplikasi lain</translation> <translation id="2017836877785168846">Hapus histori dan pelengkapan otomatis di kolom URL.</translation> @@ -181,6 +182,7 @@ <translation id="2387895666653383613">Ukuran teks</translation> <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2410754283952462441">Pilih akun</translation> +<translation id="2414672073755873541">Tidak ada konten di sini</translation> <translation id="2414886740292270097">Gelap</translation> <translation id="2416359993254398973">Chrome memerlukan izin akses ke kamera untuk situs ini.</translation> <translation id="2426805022920575512">Pilih akun lain</translation> @@ -227,6 +229,7 @@ <translation id="2777555524387840389"><ph name="SECONDS" /> detik lagi</translation> <translation id="2781151931089541271">1 detik lagi</translation> <translation id="2810645512293415242">Halaman disederhanakan agar data disimpan dan dimuat lebih cepat.</translation> +<translation id="281504910091592009">Lihat dan kelola sandi tersimpan di <ph name="BEGIN_LINK" />Akun Google<ph name="END_LINK" /></translation> <translation id="2818669890320396765">Untuk mendapatkan bookmark di semua perangkat Anda, login dan aktifkan sinkronisasi</translation> <translation id="2836148919159985482">Ketuk tombol kembali untuk keluar dari mode layar penuh.</translation> <translation id="2842985007712546952">Folder induk</translation> @@ -314,6 +317,7 @@ <translation id="360207483134687714">Bantu membuat VR di Chrome menjadi lebih baik</translation> <translation id="3616113530831147358">Audio</translation> <translation id="3620176948598597475">Menyetel ulang akan menghapus histori Penghemat Kuota Internet, termasuk daftar situs yang dikunjungi.</translation> +<translation id="3630011985153972676">Izinkan Chrome mendownload artikel untuk Anda melalui Wi-Fi di bagian setelan.</translation> <translation id="3632295766818638029">Tampilkan sandi</translation> <translation id="363596933471559332">Otomatis masuk ke situs web menggunakan kredensial yang tersimpan. Saat fitur dinonaktifkan, Anda akan diminta untuk memverifikasi setiap kali hendak masuk ke situs web.</translation> <translation id="3661699943263275414">Situs web pihak ketiga dapat menyimpan dan membaca data cookie</translation> @@ -518,6 +522,7 @@ <translation id="5335288049665977812">Izinkan situs menjalankan JavaScript (disarankan)</translation> <translation id="5345040418939504969">Menghapus <ph name="BOOKMARK_TITLE" /></translation> <translation id="5372829067651257087">URL disalin.</translation> +<translation id="5391532827096253100">Sambungan ke situs ini tidak aman. Informasi situs</translation> <translation id="5400569084694353794">Dengan menggunakan aplikasi ini, Anda menyetujui <ph name="BEGIN_LINK1" />Persyaratan Layanan<ph name="END_LINK1" /> dan <ph name="BEGIN_LINK2" />Pemberitahuan Privasi<ph name="END_LINK2" /> Chrome.</translation> <translation id="5403644198645076998">Hanya izinkan situs tertentu</translation> <translation id="5414836363063783498">Memverifikasi...</translation> @@ -631,6 +636,7 @@ <translation id="618555311922999635">Panel navigasi dibuka dalam layar penuh</translation> <translation id="6192333916571137726">Download file</translation> <translation id="6192792657125177640">Pengecualian</translation> +<translation id="6206551242102657620">Sambungan aman. Informasi situs</translation> <translation id="6210748933810148297">Bukan <ph name="EMAIL" />?</translation> <translation id="6216432067784365534">Opsi <ph name="NAME_OF_LIST_ITEM" /></translation> <translation id="6221633008163990886">Buka kunci untuk mengekspor sandi</translation> @@ -722,6 +728,7 @@ <translation id="6914783257214138813">Sandi akan terlihat oleh orang yang dapat melihat file yang diekspor.</translation> <translation id="6942665639005891494">Ubah lokasi download default kapan saja menggunakan opsi menu Setelan</translation> <translation id="6945221475159498467">Pilih</translation> +<translation id="6963642900430330478">Halaman ini berbahaya. Informasi situs</translation> <translation id="6963766334940102469">Hapus bookmark</translation> <translation id="6965382102122355670">Oke</translation> <translation id="6978479750597523876">Setel ulang setelan terjemahan</translation> @@ -982,6 +989,7 @@ <translation id="9100939710791843300">Tap tombol beranda untuk memuat halaman tab baru dan melihat artikel yang disarankan</translation> <translation id="9133515669113036225">Menyetel ulang kredensial perangkat</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Perlihatkan halaman asli</translation> <translation id="9139068048179869749">Tanya terlebih dahulu sebelum mengizinkan situs mengirimkan notifikasi (disarankan)</translation> <translation id="9155898266292537608">Anda juga dapat menelusuri dengan menge-tap kata secara cepat</translation> <translation id="9188680907066685419">Keluar dari akun yang dikelola</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb index 7f92c6f..a9d101c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Tocca il pulsante Home per caricare la pagina Nuova scheda e visualizzare gli articoli suggeriti</translation> <translation id="9133515669113036225">Reimposta credenziali dispositivo</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Mostra originale</translation> <translation id="9139068048179869749">Chiedi conferma prima di consentire ai siti di inviare notifiche (opzione consigliata)</translation> <translation id="9155898266292537608">Per eseguire una ricerca, basta un rapido tocco su una parola</translation> <translation id="9188680907066685419">Esci dall'account gestito</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb index 0fd4c6e..6931a17 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -980,6 +980,7 @@ <translation id="9100939710791843300">הקשה על לחצן הבית תטען את דף הכרטיסייה החדשה ותציג הצעות למאמרים</translation> <translation id="9133515669113036225">אפס את פרטי הכניסה של המכשיר</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">הצג מקור</translation> <translation id="9139068048179869749">שאל לפני שתאפשר לאתרים לשלוח הודעות (מומלץ)</translation> <translation id="9155898266292537608">אפשר גם להתחיל חיפוש על-ידי הקשה קצרה על מילה</translation> <translation id="9188680907066685419">צא מהחשבון המנוהל</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb index 648b5ee..4c49c0cb2 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">新しいタブの画面を読み込んでおすすめの記事を表示するには、ホームボタンをタップします</translation> <translation id="9133515669113036225">デバイス認証情報のリセット</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" />(<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">原文のページを表示</translation> <translation id="9139068048179869749">サイトに通知の送信を許可する前に確認する(推奨)</translation> <translation id="9155898266292537608">単語をタップするだけでも検索できます</translation> <translation id="9188680907066685419">管理対象アカウントからログアウトする</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb index 932b9d9..e654384 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">홈 버튼을 탭하여 새 탭 페이지를 로드하고 추천 기사를 확인하세요.</translation> <translation id="9133515669113036225">기기 사용자 인증 정보 재설정</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" />(<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">원본 보기</translation> <translation id="9139068048179869749">사이트에서 알림을 보내도록 허용하기 전에 확인(권장)</translation> <translation id="9155898266292537608">단어를 살짝 탭하여 검색할 수도 있습니다</translation> <translation id="9188680907066685419">관리 계정에서 로그아웃</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb index e140090..25a3948 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Norėdami įkelti naujo skirtuko puslapį ir peržiūrėti siūlomus straipsnius, palieskite pagrindinio ekrano mygtuką</translation> <translation id="9133515669113036225">Iš naujo nustatyti įrenginio prisijungimo duomenis</translation> <translation id="9133703968756164531">„<ph name="ITEM_NAME" />“ (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Rodyti originalą</translation> <translation id="9139068048179869749">Klausti prieš leidžiant svetainėms siųsti pranešimus (rekomenduojama)</translation> <translation id="9155898266292537608">Taip pat galite ieškoti greitai paliesdami žodį</translation> <translation id="9188680907066685419">Atsijungimas nuo valdomos paskyros</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb index f2b59f66..860b1abf 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Lai ielādētu jaunas cilnes lapu un skatītu ieteiktos rakstus, pieskarieties pogai Sākums.</translation> <translation id="9133515669113036225">Atiestatīt ierīces akreditācijas datus</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Rādīt oriģinālo</translation> <translation id="9139068048179869749">Jautāt, pirms atļaut vietnēm sūtīt paziņojumus (ieteicams)</translation> <translation id="9155898266292537608">Varat arī meklēt, ātri pieskaroties vārdam</translation> <translation id="9188680907066685419">Izrakstīšanās no pārvaldīta konta</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb index 4805273..ccab28f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Tik op de startknop om de nieuwe tabbladpagina te laden en voorgestelde artikelen te bekijken</translation> <translation id="9133515669113036225">Apparaatinloggegevens opnieuw instellen</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Origineel weergeven</translation> <translation id="9139068048179869749">Vragen voordat sites meldingen mogen verzenden (aanbevolen)</translation> <translation id="9155898266292537608">Je kunt ook zoeken door kort op een woord te tikken</translation> <translation id="9188680907066685419">Uitloggen van beheerd account</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb index e051bca0..803777c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -973,6 +973,7 @@ <translation id="9100939710791843300">Trykk på startsideknappen for å laste inn den nye fanesiden og se foreslåtte artikler</translation> <translation id="9133515669113036225">Tilbakestill enhetens legitimasjon</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Vis original</translation> <translation id="9139068048179869749">Spør før nettsteder får sende varsler (anbefales)</translation> <translation id="9155898266292537608">Du kan også søke med et kjapt trykk på et ord</translation> <translation id="9188680907066685419">Logg av administrert konto</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb index 2a6bcd2f..9265ee32 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Dotknij przycisku ekranu głównego, by załadować stronę nowej karty i wyświetlić sugerowane artykuły</translation> <translation id="9133515669113036225">Zresetuj dane logowania na urządzeniu</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Pokaż tekst oryginalny</translation> <translation id="9139068048179869749">Pytaj, zanim zezwolisz stronom na wysyłanie powiadomień (zalecane)</translation> <translation id="9155898266292537608">Możesz też wyszukiwać szybkim kliknięciem słowa</translation> <translation id="9188680907066685419">Wyloguj się z konta zarządzanego</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb index 88b31ae..844efea 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -981,6 +981,7 @@ <translation id="9100939710791843300">Toque no botão home para carregar a página nova guia e ver artigos sugeridos</translation> <translation id="9133515669113036225">Redefinir as credenciais do dispositivo</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Mostrar original</translation> <translation id="9139068048179869749">Perguntar antes de permitir que sites enviem notificações (recomendado)</translation> <translation id="9155898266292537608">Você também pode pesquisar com um toque rápido em uma palavra</translation> <translation id="9188680907066685419">Sair da conta gerenciada</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb index 1218ad2..4446a058 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Toque no botão página inicial para carregar o novo separador e ver artigos selecionados.</translation> <translation id="9133515669113036225">Repor as credenciais do dispositivo</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Mostrar original</translation> <translation id="9139068048179869749">Perguntar antes de permitir que os sites enviem notificações (recomendado)</translation> <translation id="9155898266292537608">Também pode pesquisar ao tocar rapidamente numa palavra.</translation> <translation id="9188680907066685419">Terminar sessão na conta gerida</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb index b3247ce..74b42ef5 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Atinge butonul Pagina principală pentru a încărca pagina Filă nouă și a vedea articolele sugerate</translation> <translation id="9133515669113036225">Resetează datele de conectare de pe dispozitiv</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Afișează originalul</translation> <translation id="9139068048179869749">Întreabă înainte de a permite site-urilor să trimită notificări (recomandat)</translation> <translation id="9155898266292537608">De asemenea, poți căuta atingând scurt un cuvânt</translation> <translation id="9188680907066685419">Deconectează-te de la contul gestionat</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb index 7e17679..d7dd81d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Нажмите кнопку главного экрана, чтобы открыть страницу быстрого доступа и посмотреть рекомендуемые статьи.</translation> <translation id="9133515669113036225">Сбросить учетные данные</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Показать оригинал</translation> <translation id="9139068048179869749">Запрашивать разрешение на отправку уведомлений (рекомендуется)</translation> <translation id="9155898266292537608">Также можно выполнить поиск, нажав на слово.</translation> <translation id="9188680907066685419">Выход из управляемого аккаунта</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb index ec4bdc7..f574088c3 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -980,6 +980,7 @@ <translation id="9100939710791843300">Klepnutím na tlačidlo plochy načítate stránku na novej karte a zobrazíte navrhované články</translation> <translation id="9133515669113036225">Resetovať prihlasovacie poverenia zariadenia</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Zobraziť originál</translation> <translation id="9139068048179869749">Opýtať sa pred povolením webu odosielať upozornenia (odporúčané)</translation> <translation id="9155898266292537608">Vyhľadávať môžete aj rýchlym klepnutím na slovo</translation> <translation id="9188680907066685419">Odhlásenie zo spravovaného účtu</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb index 0101212c..84b994d4 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Dotaknite se gumba za začetni zaslon, če želite naložiti nov zavihek s povezavami in si ogledati predlagane članke</translation> <translation id="9133515669113036225">Ponastavitev poverilnic naprave</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Pokaži izvirno besedilo</translation> <translation id="9139068048179869749">Poziv, preden se spletnim mestom dovoli pošiljanje obvestil (priporočeno)</translation> <translation id="9155898266292537608">Prav tako lahko iščete, tako da se hitro dotaknete besede</translation> <translation id="9188680907066685419">Odjava iz upravljanega računa</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb index c13eb4f3..4943a4c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Додирните дугме Почетак да бисте учитали страницу нове картице и прегледали предложене чланке</translation> <translation id="9133515669113036225">Ресетуј акредитиве уређаја</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Прикажи оригинал</translation> <translation id="9139068048179869749">Питај пре него што дозволиш сајтовима да шаљу обавештења (препоручено)</translation> <translation id="9155898266292537608">Можете и кратко да додирнете реч да бисте је претражили</translation> <translation id="9188680907066685419">Одјавите се са налога којим се управља</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb index 798c40b..8a73927 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Tryck på hemknappen om du vill läsa in sidan Ny flik och se artikelförslag</translation> <translation id="9133515669113036225">Återställ användaruppgifter för enheten</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Visa original</translation> <translation id="9139068048179869749">Fråga innan webbplatser tillåts att skicka aviseringar (rekommenderas)</translation> <translation id="9155898266292537608">Du kan även söka med ett snabbt tryck eller ett ord</translation> <translation id="9188680907066685419">Logga ut från hanterat konto</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb index 37317654..86f7865c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Gusa kitufe cha ukurasa wa mwanzo ili upakie ukurasa wa kichupo kipya na uone makala yanayopendekezwa</translation> <translation id="9133515669113036225">Weka upya kitambulisho cha kifaa</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Onyesha asili</translation> <translation id="9139068048179869749">Uliza kabla ya kuruhusu tovuti zitumie arifa (inapendekezwa)</translation> <translation id="9155898266292537608">Unaweza pia kutafuta kwa kugusa haraka kwenye neno</translation> <translation id="9188680907066685419">Ondoka kwenye akaunti inayodhibitiwa</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb index 375e68d..0254ff8 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">แตะปุ่มหน้าแรกเพื่อโหลดหน้าแท็บใหม่และดูบทความที่แนะนำ</translation> <translation id="9133515669113036225">รีเซ็ตข้อมูลรับรองของอุปกรณ์</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">แสดงหน้าเว็บเดิม</translation> <translation id="9139068048179869749">ถามก่อน ก่อนที่จะอนุญาตให้เว็บไซต์ส่งการแจ้งเตือน (แนะนำ)</translation> <translation id="9155898266292537608">หรือคุณจะค้นหาด้วยการแตะอย่างรวดเร็วที่คำๆ หนึ่งก็ได้เช่นกัน</translation> <translation id="9188680907066685419">ออกจากระบบบัญชีที่มีการจัดการ</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb index dce8d396..be615d8 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Yeni sekme sayfasını yüklemek ve önerilen makaleleri görüntülemek için ana ekran düğmesine dokunun</translation> <translation id="9133515669113036225">Cihazın kimlik bilgilerini sıfırla</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Orijinali göster</translation> <translation id="9139068048179869749">Sitelerin bildirim göndermesine izin vermeden önce size sorulsun (önerilir)</translation> <translation id="9155898266292537608">Bir kelimeye hızlıca dokunarak da arama yapabilirsiniz</translation> <translation id="9188680907066685419">Yönetilen hesabın oturumunu kapat</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb index 448a723..edee29f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">Торкніться кнопки головного екрана, щоб завантажити сторінку нової вкладки та переглянути пропоновані статті</translation> <translation id="9133515669113036225">Скинути облікові дані пристрою</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Показати оригінал</translation> <translation id="9139068048179869749">Запитувати, перш ніж дозволити сайтам надсилати сповіщення (рекомендується)</translation> <translation id="9155898266292537608">Можете також шукати, швидко торкнувшись слова</translation> <translation id="9188680907066685419">Вийти з керованого облікового запису</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb index 56a1e5cc..aa7ba04 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -18,7 +18,7 @@ <translation id="1141800923049248244">{FILE_COUNT,plural, =1{1 tệp đang chờ tải xuống.}other{# tệp đang chờ tải xuống.}}</translation> <translation id="1145536944570833626">Xóa dữ liệu hiện có.</translation> <translation id="1146678959555564648">Nhập VR</translation> -<translation id="114721135501989771">Dùng các tính năng thông minh của Google trong Chrome</translation> +<translation id="114721135501989771">Trải nghiệm Google thông minh trong Chrome</translation> <translation id="1157102636231978136">Hoạt động và dữ liệu duyệt web của bạn, được đồng bộ hóa với Tài khoản Google</translation> <translation id="116280672541001035">Đã sử dụng</translation> <translation id="1172593791219290334">Trang khởi động</translation> @@ -160,7 +160,7 @@ <translation id="2206488550163399966"><ph name="APP_NAME" />, ứng dụng web. <ph name="APP_URL" /></translation> <translation id="2227444325776770048">Tiếp tục bằng <ph name="USER_FULL_NAME" /></translation> <translation id="2232379019872353004">Gửi một số thông tin hệ thống và nội dung trang cho Google</translation> -<translation id="2234876718134438132">Đồng bộ hóa và dịch vụ của Google</translation> +<translation id="2234876718134438132">Đồng bộ hóa và các dịch vụ của Google</translation> <translation id="2259659629660284697">Xuất mật khẩu...</translation> <translation id="2268044343513325586">Tinh chỉnh</translation> <translation id="2286841657746966508">Địa chỉ thanh toán</translation> @@ -982,6 +982,7 @@ <translation id="9100939710791843300">Chạm vào nút màn hình chính để tải trang tab mới và xem các bài viết đề xuất</translation> <translation id="9133515669113036225">Đặt lại thông tin đăng nhập thiết bị</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">Hiển thị văn bản gốc</translation> <translation id="9139068048179869749">Hỏi trước khi cho phép trang web gửi thông báo (được đề xuất)</translation> <translation id="9155898266292537608">Bạn cũng có thể tìm kiếm bằng cách nhấn nhanh vào một từ</translation> <translation id="9188680907066685419">Đăng xuất khỏi tài khoản được quản lý</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb index 814c7d0..62dcfa11 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">点按主页按钮即可加载新标签页并查看推荐文章</translation> <translation id="9133515669113036225">重置设备凭据</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">显示原始网页</translation> <translation id="9139068048179869749">在允许网站发送通知前先询问(推荐)</translation> <translation id="9155898266292537608">您也可以通过快速点按某个字词进行搜索</translation> <translation id="9188680907066685419">退出受管理的帐号</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb index d818f58d..c874a52 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -982,6 +982,7 @@ <translation id="9100939710791843300">輕觸主螢幕按鈕即可載入新分頁頁面並查看推薦文章</translation> <translation id="9133515669113036225">重設裝置憑證</translation> <translation id="9133703968756164531"><ph name="ITEM_NAME" /> (<ph name="ITEM_ID" />)</translation> +<translation id="9137013805542155359">顯示原文</translation> <translation id="9139068048179869749">允許網站傳送通知前,必須先詢問您 (建議)</translation> <translation id="9155898266292537608">快速輕觸字詞也可以展開搜尋</translation> <translation id="9188680907066685419">登出受管理的帳戶</translation>
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index a0574f17..30a87b0e 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -479,11 +479,16 @@ "java/src/org/chromium/chrome/browser/download/home/list/ItemUtils.java", "java/src/org/chromium/chrome/browser/download/home/list/ListItem.java", "java/src/org/chromium/chrome/browser/download/home/list/ListItemModel.java", - "java/src/org/chromium/chrome/browser/download/home/view/GenericListItemView.java", - "java/src/org/chromium/chrome/browser/download/home/view/ImageListItemView.java", - "java/src/org/chromium/chrome/browser/download/home/view/ListItemView.java", - "java/src/org/chromium/chrome/browser/download/home/view/PrefetchListItemView.java", - "java/src/org/chromium/chrome/browser/download/home/list/ListItemViewHolder.java", + "java/src/org/chromium/chrome/browser/download/home/list/holder/CustomViewHolder.java", + "java/src/org/chromium/chrome/browser/download/home/list/holder/DateViewHolder.java", + "java/src/org/chromium/chrome/browser/download/home/list/holder/GenericViewHolder.java", + "java/src/org/chromium/chrome/browser/download/home/list/holder/ImageViewHolder.java", + "java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressViewHolder.java", + "java/src/org/chromium/chrome/browser/download/home/list/holder/ListItemViewHolder.java", + "java/src/org/chromium/chrome/browser/download/home/list/holder/MoreButtonViewHolder.java", + "java/src/org/chromium/chrome/browser/download/home/list/holder/PrefetchViewHolder.java", + "java/src/org/chromium/chrome/browser/download/home/list/holder/ThumbnailAwareViewHolder.java", + "java/src/org/chromium/chrome/browser/download/home/list/holder/VideoViewHolder.java", "java/src/org/chromium/chrome/browser/download/home/list/ListPropertyModel.java", "java/src/org/chromium/chrome/browser/download/home/list/ListPropertyViewBinder.java", "java/src/org/chromium/chrome/browser/download/home/list/ListUtils.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/DetachedResourceRequestTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/DetachedResourceRequestTest.java index b3dc8b9..62e63f8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/DetachedResourceRequestTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/DetachedResourceRequestTest.java
@@ -40,6 +40,9 @@ import org.chromium.content_public.browser.WebContents; import org.chromium.net.test.EmbeddedTestServer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.concurrent.TimeoutException; /** Tests for detached resource requests. */ @@ -94,6 +97,35 @@ @Test @SmallTest + @EnableFeatures(ChromeFeatureList.CCT_RESOURCE_PREFETCH) + public void testCanDoResourcePrefetch() throws Exception { + CustomTabsSessionToken session = CustomTabsSessionToken.createMockSessionTokenForTesting(); + Assert.assertTrue(mConnection.newSession(session)); + ThreadUtils.runOnUiThreadBlocking(() -> { + String packageName = mContext.getPackageName(); + OriginVerifier.addVerifiedOriginForPackage(packageName, new Origin(ORIGIN.toString()), + + CustomTabsService.RELATION_USE_AS_ORIGIN); + }); + Intent intent = prepareIntentForResourcePrefetch( + Arrays.asList(Uri.parse("https://foo.bar")), ORIGIN); + ThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertEquals(0, mConnection.maybePrefetchResources(session, intent)); + }); + + CustomTabsTestUtils.warmUpAndWait(); + ThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertEquals(0, mConnection.maybePrefetchResources(session, intent)); + }); + + mConnection.mClientManager.setAllowResourcePrefetchForSession(session, true); + ThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertEquals(1, mConnection.maybePrefetchResources(session, intent)); + }); + } + + @Test + @SmallTest @EnableFeatures(ChromeFeatureList.CCT_PARALLEL_REQUEST) public void testStartParallelRequestValidation() throws Exception { CustomTabsSessionToken session = prepareSession(); @@ -137,6 +169,40 @@ @Test @SmallTest + @EnableFeatures(ChromeFeatureList.CCT_RESOURCE_PREFETCH) + public void testStartResourcePrefetchUrlsValidation() throws Exception { + CustomTabsSessionToken session = prepareSession(); + + ThreadUtils.runOnUiThreadBlocking(() -> { + Assert.assertEquals(0, mConnection.maybePrefetchResources(session, new Intent())); + + ArrayList<Uri> urls = new ArrayList<>(); + Intent intent = prepareIntentForResourcePrefetch(urls, ORIGIN); + Assert.assertEquals(0, mConnection.maybePrefetchResources(session, intent)); + + urls.add(Uri.parse("android-app://this.is.an.android.app")); + intent = prepareIntentForResourcePrefetch(urls, ORIGIN); + Assert.assertEquals(0, mConnection.maybePrefetchResources(session, intent)); + + urls.add(Uri.parse("")); + intent = prepareIntentForResourcePrefetch(urls, ORIGIN); + Assert.assertEquals(0, mConnection.maybePrefetchResources(session, intent)); + + urls.add(Uri.parse("https://foo.bar")); + intent = prepareIntentForResourcePrefetch(urls, ORIGIN); + Assert.assertEquals(1, mConnection.maybePrefetchResources(session, intent)); + + urls.add(Uri.parse("https://bar.foo")); + intent = prepareIntentForResourcePrefetch(urls, ORIGIN); + Assert.assertEquals(2, mConnection.maybePrefetchResources(session, intent)); + + intent = prepareIntentForResourcePrefetch(urls, Uri.parse("wrong://origin")); + Assert.assertEquals(0, mConnection.maybePrefetchResources(session, intent)); + }); + } + + @Test + @SmallTest @EnableFeatures(ChromeFeatureList.CCT_PARALLEL_REQUEST) public void testCanStartParallelRequest() throws Exception { CustomTabsSessionToken session = prepareSession(); @@ -158,6 +224,31 @@ @Test @SmallTest + @EnableFeatures(ChromeFeatureList.CCT_RESOURCE_PREFETCH) + public void testCanStartResourcePrefetch() throws Exception { + CustomTabsSessionToken session = prepareSession(); + final CallbackHelper cb = new CallbackHelper(); + // We expect one read per prefetched url. + setUpTestServerWithListener(new EmbeddedTestServer.ConnectionListener() { + @Override + public void readFromSocket(long socketId) { + cb.notifyCalled(); + } + }); + + List<Uri> urls = Arrays.asList(Uri.parse(mServer.getURL("/echo-raw?a=1")), + Uri.parse(mServer.getURL("/echo-raw?a=2")), + Uri.parse(mServer.getURL("/echo-raw?a=3"))); + ThreadUtils.runOnUiThread(() -> { + Assert.assertEquals(urls.size(), + mConnection.maybePrefetchResources( + session, prepareIntentForResourcePrefetch(urls, ORIGIN))); + }); + cb.waitForCallback(0, urls.size()); + } + + @Test + @SmallTest @EnableFeatures(ChromeFeatureList.CCT_PARALLEL_REQUEST) public void testCanSetCookie() throws Exception { CustomTabsSessionToken session = prepareSession(); @@ -310,6 +401,7 @@ CustomTabsSessionToken.createMockSessionTokenForTesting(); Assert.assertTrue(mConnection.newSession(session)); mConnection.mClientManager.setAllowParallelRequestForSession(session, true); + mConnection.mClientManager.setAllowResourcePrefetchForSession(session, true); CustomTabsTestUtils.warmUpAndWait(); ThreadUtils.runOnUiThreadBlocking(() -> { OriginVerifier.addVerifiedOriginForPackage(mContext.getPackageName(), @@ -357,4 +449,11 @@ intent.putExtra(CustomTabsConnection.PARALLEL_REQUEST_REFERRER_KEY, referrer); return intent; } + + private static Intent prepareIntentForResourcePrefetch(List<Uri> urls, Uri referrer) { + Intent intent = new Intent(); + intent.putExtra(CustomTabsConnection.RESOURCE_PREFETCH_URL_LIST_KEY, new ArrayList<>(urls)); + intent.putExtra(CustomTabsConnection.PARALLEL_REQUEST_REFERRER_KEY, referrer); + return intent; + } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerServiceLifecycleTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerServiceLifecycleTest.java index 4304cc3..53bba083 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerServiceLifecycleTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerServiceLifecycleTest.java
@@ -8,12 +8,10 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.doCallRealMethod; -import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.inOrder; @@ -38,7 +36,6 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.browser.media.ui.MediaNotificationManager.ListenerService; import org.chromium.chrome.browser.notifications.NotificationUmaTracker; -import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions; import org.chromium.content_public.common.MediaMetadata; import java.util.concurrent.TimeoutException; @@ -106,7 +103,6 @@ @Test public void testShowNotificationIsNoOpWhenInfoMatches() { doCallRealMethod().when(getManager()).onServiceStarted(any(ListenerService.class)); - doNothing().when(getManager()).updateNotification(anyBoolean()); setUpServiceAndClearInvocations(); MediaNotificationInfo newInfo = mMediaNotificationInfoBuilder.build(); @@ -116,13 +112,12 @@ verifyNoMoreInteractions(getManager()); verify(mMockAppHooks, never()).startForegroundService(any(Intent.class)); verify(mMockContext, never()).startService(any(Intent.class)); - verify(mMockUmaTracker, never()).onNotificationShown(anyInt(), anyString()); + verify(mMockUmaTracker, never()).onNotificationShown(anyInt(), any(Notification.class)); } @Test public void testShowNotificationIsNoOpWhenInfoIsPausedAndFromAnotherTab() { doCallRealMethod().when(getManager()).onServiceStarted(any(ListenerService.class)); - doNothing().when(getManager()).updateNotification(anyBoolean()); mMediaNotificationInfoBuilder.setTabId(0); setUpServiceAndClearInvocations(); @@ -134,7 +129,7 @@ verifyNoMoreInteractions(getManager()); verify(mMockAppHooks, never()).startForegroundService(any(Intent.class)); verify(mMockContext, never()).startService(any(Intent.class)); - verify(mMockUmaTracker, never()).onNotificationShown(anyInt(), anyString()); + verify(mMockUmaTracker, never()).onNotificationShown(anyInt(), any(Notification.class)); } @Test @@ -146,13 +141,12 @@ verify(getManager(), times(1)).updateNotificationBuilder(); verify(mMockContext, never()).startService(any(Intent.class)); verify(mMockAppHooks, times(1)).startForegroundService(any(Intent.class)); - verify(getManager(), never()).updateNotification(anyBoolean()); + verify(getManager(), never()).updateNotification(anyBoolean(), eq(false)); } @Test public void testShowNotificationWhenServiceAlreadyCreated() { doCallRealMethod().when(getManager()).onServiceStarted(any(ListenerService.class)); - doNothing().when(getManager()).updateNotification(anyBoolean()); setUpServiceAndClearInvocations(); mMediaNotificationInfoBuilder.setPaused(true); @@ -162,14 +156,13 @@ verify(getManager()).showNotification(newInfo); verify(mMockAppHooks, never()).startForegroundService(any(Intent.class)); verify(mMockContext, never()).startService(any(Intent.class)); - verify(getManager()).updateNotification(anyBoolean()); - verify(mMockUmaTracker, never()).onNotificationShown(anyInt(), anyString()); + verify(getManager()).updateNotification(anyBoolean(), eq(false)); + verify(mMockUmaTracker, never()).onNotificationShown(anyInt(), any(Notification.class)); } @Test public void testShowNotificationBeforeServiceCreatedUpdatesNotificationInfoAndLogsUma() { doCallRealMethod().when(getManager()).onServiceStarted(any(ListenerService.class)); - doNothing().when(getManager()).updateNotification(anyBoolean()); // The initial call to |showNotification()| should update the notification info and request // to start the service. @@ -182,7 +175,7 @@ order.verify(getManager(), times(1)).updateMediaSession(); order.verify(getManager(), times(1)).updateNotificationBuilder(); order.verify(mMockAppHooks, times(1)).startForegroundService(any(Intent.class)); - order.verify(getManager(), never()).updateNotification(anyBoolean()); + order.verify(getManager(), never()).updateNotification(anyBoolean(), eq(false)); // The second call to |showNotification()| should only update the notification info. mMediaNotificationInfoBuilder.setMetadata(new MediaMetadata("new title", "", "")); @@ -193,25 +186,25 @@ order.verify(getManager(), times(1)).updateMediaSession(); order.verify(getManager(), times(1)).updateNotificationBuilder(); order.verify(mMockAppHooks, times(1)).startForegroundService(any(Intent.class)); - order.verify(getManager(), never()).updateNotification(anyBoolean()); + order.verify(getManager(), never()).updateNotification(anyBoolean(), eq(false)); verify(getManager(), never()).onServiceStarted(any(ListenerService.class)); // Simulate the service has started. mMockContext.startService(getManager().createIntent()); order.verify(getManager(), times(1)).onServiceStarted(mService); - order.verify(getManager(), times(1)).updateNotification(anyBoolean()); + order.verify(getManager(), times(1)).updateNotification(anyBoolean(), eq(true)); verify(mMockUmaTracker) - .onNotificationShown(NotificationUmaTracker.SystemNotificationType.MEDIA, - ChannelDefinitions.ChannelId.MEDIA); + .onNotificationShown(eq(NotificationUmaTracker.SystemNotificationType.MEDIA), + any(Notification.class)); } @Test public void updateNotificationIsNoOpBeforeServiceCreated() { getManager().mMediaNotificationInfo = mMediaNotificationInfoBuilder.build(); - getManager().updateNotification(false); + getManager().updateNotification(false, false); - verify(getManager()).updateNotification(anyBoolean()); + verify(getManager()).updateNotification(anyBoolean(), eq(false)); verify(getManager(), never()).updateMediaSession(); verify(getManager(), never()).updateNotificationBuilder(); } @@ -221,9 +214,9 @@ setUpService(); getManager().mService = mService; getManager().mMediaNotificationInfo = null; - getManager().updateNotification(false); + getManager().updateNotification(false, false); - verify(getManager()).updateNotification(anyBoolean()); + verify(getManager()).updateNotification(anyBoolean(), eq(false)); verify(getManager(), never()).updateMediaSession(); verify(getManager(), never()).updateNotificationBuilder(); @@ -237,7 +230,7 @@ setUpService(); getManager().mService = mService; getManager().mMediaNotificationInfo = mMediaNotificationInfoBuilder.build(); - getManager().updateNotification(false); + getManager().updateNotification(false, false); verify(mService).stopForeground(false); assertEquals(1, getShadowNotificationManager().size()); @@ -249,7 +242,7 @@ setUpService(); getManager().mService = mService; getManager().mMediaNotificationInfo = mMediaNotificationInfoBuilder.build(); - getManager().updateNotification(false); + getManager().updateNotification(false, false); verify(mService).startForeground(eq(getNotificationId()), any(Notification.class)); } @@ -260,7 +253,7 @@ setUpService(); getManager().mService = mService; getManager().mMediaNotificationInfo = mMediaNotificationInfoBuilder.build(); - getManager().updateNotification(false); + getManager().updateNotification(false, false); verify(mService).startForeground(eq(getNotificationId()), any(Notification.class)); }
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 11e529d3..d2eba546 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-70.0.3503.0_rc-r1.afdo.bz2 \ No newline at end of file +chromeos-chrome-amd64-70.0.3504.0_rc-r1.afdo.bz2 \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index df08a29..693d1c8 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -8,6 +8,8 @@ <translation id="1170115874949214249">Instal·la Chromiu al telèfon. T'enviarem un SMS al número de telèfon de recuperació del compte.</translation> <translation id="1174473354587728743">Si compartiu un ordinador, ara podeu configurar Chromium com vulgueu.</translation> <translation id="1185134272377778587">Quant a Chromium</translation> +<translation id="1209657686917656928">{0,plural, =0{Chromium es reiniciarà ara}=1{Chromium es reiniciarà d'aquí a 1 segon}other{Chromium es reiniciarà d'aquí a # segons}}</translation> +<translation id="1267419686153937460">{0,plural, =1{Reinicia Chromium d'aquí a 1 dia}other{Reinicia Chromium d'aquí a # dies}}</translation> <translation id="1298199220304005244">Obtén ajuda per a l'ús de Chromium OS</translation> <translation id="1396446129537741364">Chromium està provant de mostrar les contrasenyes.</translation> <translation id="1414495520565016063">Teniu la sessió iniciada a Chromium.</translation> @@ -23,6 +25,7 @@ <translation id="1808667845054772817">Torna a instal·lar Chromium</translation> <translation id="1869480248812203386">Si voleu col·laborar perquè Chromium sigui més segur i més fàcil d'utilitzar, informeu automàticament Google dels detalls sobre possibles incidències de seguretat.</translation> <translation id="1881322772814446296">Esteu a punt d'iniciar la sessió amb un compte gestionat i d'atorgar el control del vostre perfil de Chromium a l'administrador corresponent. Les dades de Chromium, com ara aplicacions, adreces d'interès, historial, contrasenyes i altres configuracions, s'enllaçaran permanentment amb <ph name="USER_NAME" />. Podreu suprimir aquestes dades mitjançant el Tauler de Comptes de Google, però no les podreu associar amb un altre compte. De manera opcional, podeu crear un perfil nou per mantenir les vostres dades de Chromium a part. <ph name="LEARN_MORE" /></translation> +<translation id="1895626441344023878">{0,plural, =0{Hi ha una actualització de Chromium disponible}=1{Hi ha una actualització de Chromium disponible}other{Fa # dies que hi ha una actualització de Chromium disponible}}</translation> <translation id="1929939181775079593">Chromium no respon. Voleu tornar-lo a iniciar ara?</translation> <translation id="1966382378801805537">Chromium no pot determinar ni definir el navegador predeterminat</translation> <translation id="2008474315282236005">Amb aquesta acció, se suprimirà 1 element d'aquest dispositiu. Per recuperar les teves dades més endavant, inicia la sessió a Chromium com a <ph name="USER_EMAIL" />.</translation> @@ -52,6 +55,7 @@ <translation id="2977470724722393594">Chromium està actualitzat</translation> <translation id="3032787606318309379">S'està afegint a Chromium...</translation> <translation id="3046695367536568084">Heu de tenir la sessió iniciada a Chromium per poder utilitzar aplicacions. D'aquesta manera, Chromium podrà sincronitzar les aplicacions, les adreces d'interès, l'historial, les contrasenyes i altres paràmetres amb la resta de dispositius.</translation> +<translation id="3052899382720782935">{0,plural, =1{Chromium es reiniciarà d'aquí a 1 minut}other{Chromium es reiniciarà d'aquí a # minuts}}</translation> <translation id="3068515742935458733">Ajudeu a millorar Chromium; envieu informes d'error i <ph name="UMA_LINK" /> a Google.</translation> <translation id="3103660991484857065">L'instal·lador no ha pogut descomprimir l'arxiu. Torneu a baixar Chromium.</translation> <translation id="3130323860337406239">Chromium està utilitzant el micròfon.</translation> @@ -73,12 +77,14 @@ <translation id="3582788516608077514">S'està actualitzant Chromium...</translation> <translation id="358997566136285270">Logotip de Chromium</translation> <translation id="3713809861844741608">Obre l'enllaç en una pes&tanya nova a Chromium</translation> +<translation id="3728336900324680424">Chromium accedirà a Drive per fer suggeriments a la barra d'adreces</translation> <translation id="3762167353400286894">Chromium OS es mostra en aquest idioma</translation> <translation id="378917192836375108">Chromium us permet fer clic en un número de telèfon al web i trucar-hi amb Skype!</translation> <translation id="3848258323044014972"><ph name="PAGE_TITLE" />: Chromium</translation> <translation id="3852700440713538496">Ancora Chromium a la barra de tasques</translation> <translation id="3889543394854987837">Feu clic al vostre nom per obrir Chromium i començar a navegar.</translation> <translation id="3898493977366060150">Navegació web amb les eines intel·ligents de Google</translation> +<translation id="3965668104013180445">{0,plural, =1{Chromium OS es reiniciarà d'aquí a 1 hora}other{Chromium OS es reiniciarà d'aquí a # hores}}</translation> <translation id="4036079820698952681">Informa de la <ph name="BEGIN_LINK" />configuració actual<ph name="END_LINK" /> per ajudar-nos a millorar Chromium</translation> <translation id="4050175100176540509">La versió més recent incorpora millores de seguretat i funcions noves importants.</translation> <translation id="407254336480250557">Selecciona <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> @@ -105,6 +111,7 @@ <translation id="4943838377383847465">Chromium està en mode de segon pla.</translation> <translation id="4987820182225656817">Els convidats poden utilitzar Chromium sense deixar-hi rastre.</translation> <translation id="4994636714258228724">Afegeix-me a Chromium</translation> +<translation id="5021854341188256296">{0,plural, =0{Hi ha una actualització de Chromium OS disponible}=1{Hi ha una actualització de Chromium OS disponible}other{Fa # dies que hi ha una actualització de Chromium OS disponible}}</translation> <translation id="5032989939245619637">Desa els detalls a Chromium</translation> <translation id="5045248521775609809">Emporta't Chromium on vagis</translation> <translation id="5116586539350239523">Chromium emmagatzemarà de manera segura les vostres dades personals perquè no les hàgiu de tornar a escriure</translation> @@ -117,10 +124,13 @@ <translation id="5479196819031988440">Chromium OS no pot obrir aquesta pàgina.</translation> <translation id="5480860683791598150">Chromium necessita accedir a la teva ubicació per compartir-la amb aquest lloc web</translation> <translation id="549669000822060376">Espereu mentre Chromium instal·la les darreres actualitzacions del sistema.</translation> +<translation id="5514308096618405748">Chrome OS és possible gràcies a <ph name="BEGIN_LINK_CROS_OSS" />programari lliure addicional<ph name="END_LINK_CROS_OSS" />, així com Linux (versió beta).</translation> +<translation id="5529843986978123325">{0,plural, =1{Chromium OS es reiniciarà d'aquí a 1 minut}other{Chromium OS es reiniciarà d'aquí a # minuts}}</translation> <translation id="5631814766731275228">Nom i foto de Chromium</translation> <translation id="5634636535844844681">Chromium requereix Windows 7 o una versió posterior.</translation> <translation id="5680901439334282664">Inicia la sessió a Chromium</translation> <translation id="5698481217667032250">Mostra Chromium en aquest idioma</translation> +<translation id="5712253116097046984">L'administrador recomana que reiniciïs Chromium OS per aplicar aquesta actualització</translation> <translation id="5726838626470692954">El gestor t'ha de suprimir i tornar a afegir a Chromium.</translation> <translation id="5768914737813585044">Mostra Chromium OS en aquest idioma</translation> <translation id="5796460469508169315">Chromium ja està quasi llest.</translation> @@ -137,7 +147,9 @@ <translation id="6072279588547424923"><ph name="EXTENSION_NAME" /> s'ha afegit a Chromium</translation> <translation id="608189560609172163">Chromium no ha pogut sincronitzar les dades a causa d'un error amb l'inici de sessió.</translation> <translation id="6096348254544841612">Personalitza i controla Chromium. Hi ha una actualització disponible.</translation> +<translation id="6120345080069858279">Chromium desarà aquesta contrasenya al Compte de Google. No caldrà que la recordis.</translation> <translation id="6129621093834146363">Chromium ha bloquejat <ph name="FILE_NAME" /> perquè és perillós.</translation> +<translation id="620022061217911843">L'administrador necessita que reiniciïs Chromium OS per aplicar una actualització</translation> <translation id="6212496753309875659">Aquest equip ja té una versió més recent de Chromium. Si el programari no funciona, desinstal·leu Chromium i torneu-ho a provar.</translation> <translation id="6248213926982192922">Estableix Chromium com a navegador predeterminat</translation> <translation id="6268381023930128611">Voleu tancar la sessió de Chromium?</translation> @@ -191,8 +203,10 @@ <ph name="BEGIN_LINK_2" />Més informació<ph name="END_LINK_2" /> Per obtenir més instruccions, consulteu el correu electrònic a <ph name="ACCOUNT_EMAIL" />.</translation> +<translation id="7448255348454382571">Reinicia Chromium OS</translation> <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation> <translation id="7451052299415159299">Per visitar aquest lloc web, Chromium necessita permís per accedir a la càmera</translation> +<translation id="7471302858145901434">{0,plural, =1{Reinicia Chromium OS d'aquí a 1 dia}other{Reinicia Chromium OS d'aquí a # dies}}</translation> <translation id="7483335560992089831">No es pot instal·lar la mateixa versió de Chromium que s'està executant actualment. Tanqueu Chromium i torneu-ho a provar.</translation> <translation id="7549178288319965365">About Chromium OS</translation> <translation id="7577193603922410712">S'acaba d'aplicar una actualització de seguretat especial per a Chromium; reinicieu el navegador ara perquè es faci efectiva (restaurarem les pestanyes).</translation> @@ -222,10 +236,13 @@ <translation id="8290862415967981663">Chromium ha bloquejat aquest fitxer perquè pot ser perillós.</translation> <translation id="8330519371938183845">Inicia la sessió per sincronitzar i personalitzar Chromium en tots els teus dispositius</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> abans utilitzava Chromium</translation> +<translation id="8375950122744241554">A partir de Chromium 70, els perfils d'usuaris supervisats deixaran d'estar disponibles.</translation> +<translation id="8379713241968949941">{0,plural, =1{Chromium es reiniciarà d'aquí a 1 hora}other{Chromium es reiniciarà d'aquí a # hores}}</translation> <translation id="8453117565092476964">L'arxiu d'instal·lació està malmès o no és vàlid. Torneu a baixar Chromium.</translation> <translation id="8493179195440786826">Chromium no està actualitzat</translation> <translation id="85843667276690461">Obtén ajuda per a l'ús de Chromium</translation> <translation id="8586442755830160949">Copyright <ph name="YEAR" /> Els autors de Chromium. Tots els drets reservats.</translation> +<translation id="8599548569518771270">{0,plural, =0{Chromium OS es reiniciarà ara}=1{Chromium OS es reiniciarà d'aquí a 1 segon}other{Chromium OS es reiniciarà d'aquí a # segons}}</translation> <translation id="8619360774459241877">S'està iniciant Chromium...</translation> <translation id="8621669128220841554">La instal·lació ha fallat a causa d'un error no especificat. Torneu a baixar Chromium.</translation> <translation id="8628626585870903697">Chromium no inclou el lector de PDF que és necessari perquè la previsualització funcioni.</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb index 03d9389..042ab22 100644 --- a/chrome/app/resources/chromium_strings_en-GB.xtb +++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -10,6 +10,8 @@ <translation id="1170115874949214249">Install Chromium on your phone. We’ll send an SMS to your account recovery phone number.</translation> <translation id="1174473354587728743">Share a computer? Now you can set up Chromium just the way you like it.</translation> <translation id="1185134272377778587">About Chromium</translation> +<translation id="1209657686917656928">{0,plural, =0{Chromium will relaunch now}=1{Chromium will relaunch in 1 second}other{Chromium will relaunch in # seconds}}</translation> +<translation id="1267419686153937460">{0,plural, =1{Relaunch Chromium within a day}other{Relaunch Chromium within # days}}</translation> <translation id="1298199220304005244">Get help with using Chromium OS</translation> <translation id="1396446129537741364">Chromium is trying to show passwords.</translation> <translation id="1414495520565016063">You're signed in to Chromium!</translation> @@ -25,6 +27,7 @@ <translation id="1808667845054772817">Reinstall Chromium</translation> <translation id="1869480248812203386">You can help make Chromium safer and easier to use by automatically reporting details of possible security incidents to Google.</translation> <translation id="1881322772814446296">You are signing in with a managed account and giving its administrator control over your Chromium profile. Your Chromium data, such as your apps, bookmarks, history, passwords and other settings will become permanently tied to <ph name="USER_NAME" />. You will be able to delete this data via the Google Accounts Dashboard, but you will not be able to associate this data with another account. You can optionally create a new profile to keep your existing Chromium data separate. <ph name="LEARN_MORE" /></translation> +<translation id="1895626441344023878">{0,plural, =0{A Chromium update is available}=1{A Chromium update is available}other{A Chromium update has been available for # days}}</translation> <translation id="1929939181775079593">Chromium is unresponsive. Relaunch now?</translation> <translation id="1966382378801805537">Chromium cannot determine or set the default browser</translation> <translation id="2008474315282236005">This will delete 1 item from this device. To retrieve your data later, sign in to Chromium as <ph name="USER_EMAIL" />.</translation> @@ -54,6 +57,7 @@ <translation id="2977470724722393594">Chromium is up to date</translation> <translation id="3032787606318309379">Adding to Chromium ...</translation> <translation id="3046695367536568084">You need to be signed in to Chromium to use apps. This allows Chromium to sync your apps, bookmarks, history, passwords and other settings across devices.</translation> +<translation id="3052899382720782935">{0,plural, =1{Chromium will relaunch in 1 minute}other{Chromium will relaunch in # minutes}}</translation> <translation id="3068515742935458733">Help make Chromium better by sending crash reports and <ph name="UMA_LINK" /> to Google</translation> <translation id="3103660991484857065">The installer failed to uncompress archive. Please download Chromium again.</translation> <translation id="3130323860337406239">Chromium is using your microphone.</translation> @@ -75,12 +79,14 @@ <translation id="3582788516608077514">Updating Chromium ...</translation> <translation id="358997566136285270">Chromium logo</translation> <translation id="3713809861844741608">Open link in new Chromium &tab</translation> +<translation id="3728336900324680424">Chromium will access your Drive to make suggestions in the address bar</translation> <translation id="3762167353400286894">Chromium OS is displayed in this language</translation> <translation id="378917192836375108">Chromium lets you click a phone number on the web and call it with Skype!</translation> <translation id="3848258323044014972"><ph name="PAGE_TITLE" /> - Chromium</translation> <translation id="3852700440713538496">Pin Chromium to your taskbar</translation> <translation id="3889543394854987837">Click your name to open Chromium and start browsing.</translation> <translation id="3898493977366060150">Web browsing with Google smarts</translation> +<translation id="3965668104013180445">{0,plural, =1{Chromium OS will restart in an hour}other{Chromium OS will restart in # hours}}</translation> <translation id="4036079820698952681">Help make Chromium better by reporting the <ph name="BEGIN_LINK" />current settings<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Important security improvements and new features are available in the latest version.</translation> <translation id="407254336480250557">Select <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> @@ -107,6 +113,7 @@ <translation id="4943838377383847465">Chromium is in background mode.</translation> <translation id="4987820182225656817">Guests can use Chromium without leaving anything behind.</translation> <translation id="4994636714258228724">Add yourself to Chromium</translation> +<translation id="5021854341188256296">{0,plural, =0{A Chromium OS update is available}=1{A Chromium OS update is available}other{A Chromium OS update has been available for # days}}</translation> <translation id="5032989939245619637">Save details in Chromium</translation> <translation id="5045248521775609809">Take Chromium everywhere</translation> <translation id="5116586539350239523">Chromium will securely store your personal details so that you don't need to type them in again.</translation> @@ -119,10 +126,13 @@ <translation id="5479196819031988440">Chromium OS can't open this page.</translation> <translation id="5480860683791598150">Chromium needs access to your location to share your location with this site</translation> <translation id="549669000822060376">Please wait while Chromium installs the latest system updates.</translation> +<translation id="5514308096618405748">Chrome OS is made possible by additional <ph name="BEGIN_LINK_CROS_OSS" />open source software<ph name="END_LINK_CROS_OSS" />, as is Linux (Beta).</translation> +<translation id="5529843986978123325">{0,plural, =1{Chromium OS will restart in 1 minute}other{Chromium OS will restart in # minutes}}</translation> <translation id="5631814766731275228">Chromium name and picture</translation> <translation id="5634636535844844681">Chromium requires Windows 7 or higher.</translation> <translation id="5680901439334282664">sign in to Chromium</translation> <translation id="5698481217667032250">Display Chromium in this language</translation> +<translation id="5712253116097046984">Your administrator asks that you restart Chromium OS to apply this update</translation> <translation id="5726838626470692954">Your manager must remove and add you back to Chromium.</translation> <translation id="5768914737813585044">Display Chromium OS in this language</translation> <translation id="5796460469508169315">Chromium is almost ready.</translation> @@ -139,7 +149,9 @@ <translation id="6072279588547424923"><ph name="EXTENSION_NAME" /> has been added to Chromium</translation> <translation id="608189560609172163">Chromium could not sync your data due to an error signing in.</translation> <translation id="6096348254544841612">Customise and control Chromium. Update is available.</translation> +<translation id="6120345080069858279">Chromium will save this password in your Google account. You won’t have to remember it.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> is dangerous, so Chromium has blocked it.</translation> +<translation id="620022061217911843">Your administrator requires that you restart Chromium OS to apply an update</translation> <translation id="6212496753309875659">This computer already has a more recent version of Chromium. If the software is not working, please uninstall Chromium and try again.</translation> <translation id="6248213926982192922">Make Chromium the default browser</translation> <translation id="6268381023930128611">Sign out of Chromium?</translation> @@ -193,8 +205,10 @@ <ph name="BEGIN_LINK_2" />Learn more<ph name="END_LINK_2" /> Please check your email at <ph name="ACCOUNT_EMAIL" /> for further instructions.</translation> +<translation id="7448255348454382571">Restart Chromium OS</translation> <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> – Chromium Dev</translation> <translation id="7451052299415159299">Chromium needs permission to access your camera for this site</translation> +<translation id="7471302858145901434">{0,plural, =1{Restart Chromium OS within a day}other{Restart Chromium OS within # days}}</translation> <translation id="7483335560992089831">Can not install the same Chromium version that is currently running. Please close Chromium and try again.</translation> <translation id="7549178288319965365">About Chromium OS</translation> <translation id="7577193603922410712">A special security update for Chromium was just applied; you should restart now for it to take effect (we'll restore your tabs).</translation> @@ -224,10 +238,13 @@ <translation id="8290862415967981663">This file may be dangerous, so Chromium has blocked it.</translation> <translation id="8330519371938183845">Sign in to sync and personalise Chromium across your devices</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> was previously using Chromium</translation> +<translation id="8375950122744241554">Supervised user profiles will no longer be available starting with Chromium 70.</translation> +<translation id="8379713241968949941">{0,plural, =1{Chromium will relaunch in an hour}other{Chromium will relaunch in # hours}}</translation> <translation id="8453117565092476964">The installer archive is corrupted or invalid. Please download Chromium again.</translation> <translation id="8493179195440786826">Chromium is Out of Date</translation> <translation id="85843667276690461">Get help with using Chromium</translation> <translation id="8586442755830160949">Copyright <ph name="YEAR" /> The Chromium Authors. All rights reserved.</translation> +<translation id="8599548569518771270">{0,plural, =0{Chromium OS will restart now}=1{Chromium OS will restart in 1 second}other{Chromium OS will restart in # seconds}}</translation> <translation id="8619360774459241877">Launching Chromium...</translation> <translation id="8621669128220841554">Installation failed due to unspecified error. Please download Chromium again.</translation> <translation id="8628626585870903697">Chromium does not include the PDF viewer which is required for Print Preview to function.</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb index c266486..f5a630e 100644 --- a/chrome/app/resources/chromium_strings_id.xtb +++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -8,6 +8,8 @@ <translation id="1170115874949214249">Instal Chromium di ponsel. Kami akan mengirimkan SMS ke nomor telepon pemulihan akun Anda.</translation> <translation id="1174473354587728743">Berbagi komputer? Kini Anda dapat menyiapkan Chromium seperti yang Anda inginkan.</translation> <translation id="1185134272377778587">Tentang Chromium</translation> +<translation id="1209657686917656928">{0,plural, =0{Chromium akan diluncurkan ulang sekarang}=1{Chromium akan diluncurkan ulang dalam 1 detik}other{Chromium akan diluncurkan ulang dalam # detik}}</translation> +<translation id="1267419686153937460">{0,plural, =1{Luncurkan ulang Chromium dalam satu hari}other{Luncurkan ulang Chromium dalam # hari}}</translation> <translation id="1298199220304005244">Dapatkan bantuan tentang penggunaan Chromium OS</translation> <translation id="1396446129537741364">Chromium mencoba menampilkan sandi.</translation> <translation id="1414495520565016063">Anda sudah masuk ke Chromium!</translation> @@ -23,6 +25,7 @@ <translation id="1808667845054772817">Instal ulang Chromium</translation> <translation id="1869480248812203386">Anda dapat membantu membuat Chromium lebih aman dan lebih mudah digunakan dengan melaporkan detail secara otomatis tentang kemungkinan insiden keamanan ke Google.</translation> <translation id="1881322772814446296">Anda masuk dengan akun yang dikelola dan memberikan administratornya kontrol atas profil Chromium Anda. Data Chromium Anda, seperti aplikasi, bookmark, histori, sandi, dan setelan lain selamanya akan dikaitkan ke <ph name="USER_NAME" />. Anda dapat menghapus data ini melalui Dasbor Akun Google, namun Anda tidak akan dapat mengaitkan data ini dengan akun yang lain. Secara opsional, Anda dapat membuat profil untuk menjaga data Chromium Anda yang sudah ada tetap terpisah. <ph name="LEARN_MORE" /></translation> +<translation id="1895626441344023878">{0,plural, =0{Update Chromium tersedia}=1{Update Chromium tersedia}other{Update Chromium telah tersedia selama # hari}}</translation> <translation id="1929939181775079593">Chromium tidak merespons. Luncurkan ulang sekarang?</translation> <translation id="1966382378801805537">Chromium tidak dapat menentukan atau menyetel browser default</translation> <translation id="2008474315282236005">Tindakan ini akan menghapus 1 item dari perangkat. Untuk mengambil data nanti, login ke Chromium sebagai <ph name="USER_EMAIL" />.</translation> @@ -52,6 +55,7 @@ <translation id="2977470724722393594">Chromium sudah diperbarui</translation> <translation id="3032787606318309379">Menambahkan Chromium...</translation> <translation id="3046695367536568084">Anda harus masuk ke Chromium untuk menggunakan aplikasi. Ini memungkinkan Chromium menyinkronkan aplikasi, bookmark, histori, sandi, dan setelan lainnya antar perangkat.</translation> +<translation id="3052899382720782935">{0,plural, =1{Chromium akan diluncurkan ulang dalam 1 menit}other{Chromium akan diluncurkan ulang dalam # menit}}</translation> <translation id="3068515742935458733">Bantu Chromium menjadi lebih baik dengan mengirim laporan kerusakan dan <ph name="UMA_LINK" /> ke Google</translation> <translation id="3103660991484857065">Pemasang gagal membatalkan kompresi arsip. Download Chromium lagi.</translation> <translation id="3130323860337406239">Chromium menggunakan mikrofon Anda.</translation> @@ -73,12 +77,14 @@ <translation id="3582788516608077514">Memperbarui Chromium...</translation> <translation id="358997566136285270">Logo Chromium</translation> <translation id="3713809861844741608">Buka link di &tab Chromium baru</translation> +<translation id="3728336900324680424">Chromium akan mengakses Drive Anda untuk membuat saran di kolom URL</translation> <translation id="3762167353400286894">Chromium OS ditampilkan dalam bahasa ini</translation> <translation id="378917192836375108">Chromium memungkinkan Anda mengeklik nomor telepon pada web dan menghubunginya melalui Skype!</translation> <translation id="3848258323044014972"><ph name="PAGE_TITLE" /> - Chromium</translation> <translation id="3852700440713538496">Sematkan Chromium di bilah tugas</translation> <translation id="3889543394854987837">Klik nama Anda untuk membuka Chromium dan mulai menjelajah.</translation> <translation id="3898493977366060150">Browsing web dengan fitur smart dari Google</translation> +<translation id="3965668104013180445">{0,plural, =1{Chromium OS akan dimulai ulang dalam 1 jam}other{Chromium OS akan dimulai ulang dalam # jam}}</translation> <translation id="4036079820698952681">Bantu Chromium jadi lebih baik dengan melaporkan <ph name="BEGIN_LINK" />setelan saat ini<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Peningkatan keamanan dan fitur baru yang penting tersedia di versi terbaru.</translation> <translation id="407254336480250557">Pilih <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> @@ -105,6 +111,7 @@ <translation id="4943838377383847465">Chromium berjalan di mode latar belakang.</translation> <translation id="4987820182225656817">Tamu dapat menggunakan Chromium tanpa meninggalkan apa pun.</translation> <translation id="4994636714258228724">Tambahkan diri Anda ke Chromium</translation> +<translation id="5021854341188256296">{0,plural, =0{Update Chromium OS tersedia}=1{Update Chromium OS tersedia}other{Update Chromium OS telah tersedia selama # hari}}</translation> <translation id="5032989939245619637">Simpan detail di Chromium</translation> <translation id="5045248521775609809">Bawa Chromium ke mana saja</translation> <translation id="5116586539350239523">Chromium akan meyimpan informasi pribadi Anda dengan aman sehingga Anda tidak perlu mengetiknya lagi.</translation> @@ -117,10 +124,13 @@ <translation id="5479196819031988440">Chromium OS tidak dapat membuka halaman ini.</translation> <translation id="5480860683791598150">Chromium memerlukan akses ke lokasi Anda untuk berbagi lokasi dengan situs ini</translation> <translation id="549669000822060376">Harap tunggu selagi Chromium memasang pembaruan sistem terkini.</translation> +<translation id="5514308096618405748">Chrome OS terwujud karena <ph name="BEGIN_LINK_CROS_OSS" />software open source<ph name="END_LINK_CROS_OSS" /> tambahan, seperti Linux (Beta).</translation> +<translation id="5529843986978123325">{0,plural, =1{Chromium OS akan dimulai ulang dalam 1 menit}other{Chromium OS akan dimulai ulang dalam # menit}}</translation> <translation id="5631814766731275228">Nama dan gambar Chromium</translation> <translation id="5634636535844844681">Chromium memerlukan Windows 7 atau lebih tinggi.</translation> <translation id="5680901439334282664">masuk ke Chromium</translation> <translation id="5698481217667032250">Tampilkan Chromium dalam bahasa ini</translation> +<translation id="5712253116097046984">Administrator meminta Anda memulai ulang Chromium OS untuk menerapkan update ini</translation> <translation id="5726838626470692954">Pengelola harus menghapus dan menambahkan Anda kembali ke Chromium.</translation> <translation id="5768914737813585044">Tampilkan Chromium OS dalam bahasa ini</translation> <translation id="5796460469508169315">Chromium hampir siap.</translation> @@ -137,7 +147,9 @@ <translation id="6072279588547424923"><ph name="EXTENSION_NAME" /> telah ditambahkan ke Chromium</translation> <translation id="608189560609172163">Chromium tidak dapat menyinkronkan data Anda karena kesalahan saat masuk.</translation> <translation id="6096348254544841612">Sesuaikan dan kontrol Chromium. Update tersedia.</translation> +<translation id="6120345080069858279">Chromium akan menyimpan sandi ini di Akun Google. Anda tidak perlu mengingatnya.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> berbahaya, sehingga Chromium memblokirnya.</translation> +<translation id="620022061217911843">Administrator mengharuskan Anda memulai ulang Chromium OS untuk menerapkan update</translation> <translation id="6212496753309875659">Komputer ini sudah memiliki versi Chromium yang lebih baru. Jika software tidak bekerja, harap coba uninstal Chromium, lalu cobalah kembali.</translation> <translation id="6248213926982192922">Jadikan Chromium browser default</translation> <translation id="6268381023930128611">Keluar dari Chromium?</translation> @@ -191,8 +203,10 @@ <ph name="BEGIN_LINK_2" />Pelajari lebih lanjut<ph name="END_LINK_2" /> Lihat email Anda di <ph name="ACCOUNT_EMAIL" /> untuk petunjuk lebih lanjut.</translation> +<translation id="7448255348454382571">Mulai ulang Chromium OS</translation> <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation> <translation id="7451052299415159299">Chromium memerlukan izin akses ke kamera untuk situs ini</translation> +<translation id="7471302858145901434">{0,plural, =1{Mulai ulang Chromium OS dalam 1 hari}other{Mulai ulang Chromium OS dalam # hari}}</translation> <translation id="7483335560992089831">Tidak dapat memasang Chromium versi yang sama dengan yang sedang Anda jalankan. Tutup Chromium dan coba lagi.</translation> <translation id="7549178288319965365">Tentang OS Chromium</translation> <translation id="7577193603922410712">Pembaruan keamanan khusus untuk Chromium baru saja diterapkan; mulai ulang Chromium sekarang agar pembaruan diterapkan (nanti kami akan memulihkan tab yang Anda buka).</translation> @@ -222,10 +236,13 @@ <translation id="8290862415967981663">File ini mungkin berbahaya, jadi Chromium telah memblokirnya.</translation> <translation id="8330519371938183845">Login untuk menyinkronkan dan mempersonalisasi Chromium di perangkat Anda</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> sebelumnya menggunakan Chromium</translation> +<translation id="8375950122744241554">Profil pengguna yang dilindungi tidak akan tersedia lagi mulai dari Chromium 70.</translation> +<translation id="8379713241968949941">{0,plural, =1{Chromium akan diluncurkan ulang dalam 1 jam}other{Chromium akan diluncurkan ulang dalam # jam}}</translation> <translation id="8453117565092476964">Arsip pemasang rusak atau tidak valid. Download Chromium lagi.</translation> <translation id="8493179195440786826">Chromium Terlalu Lawas</translation> <translation id="85843667276690461">Dapatkan bantuan tentang penggunaan Chromium</translation> <translation id="8586442755830160949">Hak Cipta <ph name="YEAR" /> Pengarang Chromium. Semua hak dilindungi undang-undang.</translation> +<translation id="8599548569518771270">{0,plural, =0{Chromium OS akan dimulai ulang sekarang}=1{Chromium OS akan dimulai ulang dalam 1 detik}other{Chromium OS akan dimulai ulang dalam # detik}}</translation> <translation id="8619360774459241877">Meluncurkan Chromium...</translation> <translation id="8621669128220841554">Pemasangan gagal karena kesalahan yang tidak ditentukan. Download Chromium lagi.</translation> <translation id="8628626585870903697">Chromium tidak menyertakan penampil PDF yang dibutuhkan agar Pratinjau Cetak berfungsi.</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb index 5caaa05..e50e7660 100644 --- a/chrome/app/resources/chromium_strings_ms.xtb +++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -8,6 +8,8 @@ <translation id="1170115874949214249">Pasang Chromium pada telefon anda. Kami akan menghantar SMS ke nombor telefon pemulihan akaun anda.</translation> <translation id="1174473354587728743">Berkongsi komputer? Sekarang anda boleh menyediakan Chromium menurut cara yang anda suka.</translation> <translation id="1185134272377778587">Mengenai Chromium</translation> +<translation id="1209657686917656928">{0,plural, =0{Chromium akan dilancarkan semula sekarang}=1{Chromium akan dilancarkan semula dalam masa sesaat}other{Chromium akan dilancarkan semula dalam masa # saat}}</translation> +<translation id="1267419686153937460">{0,plural, =1{Lancarkan semula Chromium dalam masa sehari}other{Lancarkan semula Chromium dalam masa # hari}}</translation> <translation id="1298199220304005244">Dapatkan bantuan untuk menggunakan Chromium OS</translation> <translation id="1396446129537741364">Chromium sedang cuba memaparkan kata laluan.</translation> <translation id="1414495520565016063">Anda log masuk ke Chromium!</translation> @@ -23,6 +25,7 @@ <translation id="1808667845054772817">Pasang semula Chromium</translation> <translation id="1869480248812203386">Anda boleh membantu menjadikan Chromium lebih selamat dan lebih mudah untuk digunakan dengan melaporkan butiran kemungkinan insiden keselamatan secara automatik kepada Google.</translation> <translation id="1881322772814446296">Anda log masuk menggunakan akaun yang terurus dan memberikan pentadbirnya kawalan ke atas profil Chromium anda. Data Chromium anda, seperti apl, penanda halaman, sejarah, kata laluan dan tetapan anda yang lain akan terikat kepada <ph name="USER_NAME" /> secara kekal. Anda akan dapat memadamkan data ini melalui Papan Pemuka Akaun Google, tetapi anda tidak akan dapat mengaitkan data ini dengan akaun lain. Anda boleh memilih untuk membuat profil baharu untuk mengasingkan data Chromium anda yang sedia ada. <ph name="LEARN_MORE" /></translation> +<translation id="1895626441344023878">{0,plural, =0{Kemas kini Chromium tersedia}=1{Kemas kini Chromium tersedia}other{Kemas kini Chromium telah tersedia selama # hari}}</translation> <translation id="1929939181775079593">Chromium tidak responsif. Lancarkan semula sekarang?</translation> <translation id="1966382378801805537">Chromium tidak dapat menentukan atau menetapkan penyemak imbas lalai</translation> <translation id="2008474315282236005">Tindakan ini akan memadamkan 1 item daripada peranti ini. Untuk mendapatkan kembali data anda kemudian, log masuk ke Chromium sebagai <ph name="USER_EMAIL" />.</translation> @@ -52,6 +55,7 @@ <translation id="2977470724722393594">Chromium telah dikemas kini</translation> <translation id="3032787606318309379">Menambah ke Chromium...</translation> <translation id="3046695367536568084">Anda perlu log masuk ke Chromium untuk menggunakan apl. Tindakan ini membolehkan Chromium menyegerakkan apl, penanda halaman, sejarah, kata laluan dan tetapan anda yang lain pada semua peranti.</translation> +<translation id="3052899382720782935">{0,plural, =1{Chromium akan dilancarkan semula dalam masa seminit}other{Chromium akan dilancarkan semula dalam masa # minit}}</translation> <translation id="3068515742935458733">Bantu jadikan Chromium lebih baik dengan menghantar laporan ranap dan <ph name="UMA_LINK" /> kepada Google.</translation> <translation id="3103660991484857065">Pemasang gagal untuk menyahmampat arkib. Sila muat turun Chromium sekali lagi.</translation> <translation id="3130323860337406239">Chromium menggunakan mikrofon anda.</translation> @@ -73,12 +77,14 @@ <translation id="3582788516608077514">Mengemas kini Chromium...</translation> <translation id="358997566136285270">Logo Chromium</translation> <translation id="3713809861844741608">Buka pautan dalam &tab Chromium baharu</translation> +<translation id="3728336900324680424">Chromium akan mengakses Drive anda untuk membuat cadangan dalam bar alamat</translation> <translation id="3762167353400286894">OS Chromium dipaparkan dalam bahasa ini</translation> <translation id="378917192836375108">Chromium membolehkan anda mengklik nombor telefon pada web dan menghubunginya dengan Skype!</translation> <translation id="3848258323044014972"><ph name="PAGE_TITLE" /> - Chromium</translation> <translation id="3852700440713538496">Sematkan Chromium pada bar tugas anda</translation> <translation id="3889543394854987837">Klik nama anda untuk membuka Chromium dan mula menyemak imbas.</translation> <translation id="3898493977366060150">Penyemakan imbas web dengan Google smarts</translation> +<translation id="3965668104013180445">{0,plural, =1{OS Chromium akan dimulakan semula dalam masa sejam}other{OS Chromium akan dimulakan semula dalam masa # jam}}</translation> <translation id="4036079820698952681">Bantu jadikan Chromium lebih baik dengan melaporkan <ph name="BEGIN_LINK" />tetapan semasa<ph name="END_LINK" /></translation> <translation id="4050175100176540509">Peningkatan keselamatan penting dan ciri baharu tersedia dalam versi terkini.</translation> <translation id="407254336480250557">Pilih <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" /></translation> @@ -105,6 +111,7 @@ <translation id="4943838377383847465">Chromium dalam mod latar belakang.</translation> <translation id="4987820182225656817">Tetamu boleh menggunakan Chromium tanpa meninggalkan apa-apa.</translation> <translation id="4994636714258228724">Tambahkan diri anda kepada Chromium</translation> +<translation id="5021854341188256296">{0,plural, =0{Kemas kini OS Chromium tersedia}=1{Kemas kini OS Chromium tersedia}other{Kemas kini OS Chromium telah tersedia selama # hari}}</translation> <translation id="5032989939245619637">Simpan butiran di Chromium</translation> <translation id="5045248521775609809">Bawa Chromium ke mana-mana sahaja</translation> <translation id="5116586539350239523">Chromium akan menyimpan butiran peribadi anda dengan selamat supaya anda tidak perlu menaipnya semula.</translation> @@ -117,10 +124,13 @@ <translation id="5479196819031988440">OS Chromium tidak boleh membuka halaman ini.</translation> <translation id="5480860683791598150">Chromium memerlukan akses kepada lokasi anda untuk berkongsi lokasi dengan tapak ini</translation> <translation id="549669000822060376">Sila tunggu sementara Chromium memasang kemas kini sistem terkini.</translation> +<translation id="5514308096618405748">OS Chrome menjadi kenyataan dengan <ph name="BEGIN_LINK_CROS_OSS" />perisian sumber terbuka<ph name="END_LINK_CROS_OSS" /> tambahan, sebagaimana Linux (Beta).</translation> +<translation id="5529843986978123325">{0,plural, =1{OS Chromium akan dimulakan semula dalam masa seminit}other{OS Chromium akan dimulakan semula dalam masa # minit}}</translation> <translation id="5631814766731275228">Nama dan gambar Chromium</translation> <translation id="5634636535844844681">Chromium memerlukan Windows 7 atau lebih tinggi.</translation> <translation id="5680901439334282664">log masuk ke Chromium</translation> <translation id="5698481217667032250">Paparkan Chromium dalam bahasa ini</translation> +<translation id="5712253116097046984">Pentadbir anda meminta anda memulakan semula OS Chromium untuk menerapkan kemas kini ini</translation> <translation id="5726838626470692954">Pengurus anda mesti mengalih keluar dan menambahkan anda kembali pada Chromium.</translation> <translation id="5768914737813585044">Paparkan OS Chromium dalam bahasa ini</translation> <translation id="5796460469508169315">Chromium hampir sedia.</translation> @@ -137,7 +147,9 @@ <translation id="6072279588547424923"><ph name="EXTENSION_NAME" /> telah ditambahkan pada Chromium</translation> <translation id="608189560609172163">Chromium tidak dapat menyegerakkan data anda disebabkan ralat melog masuk.</translation> <translation id="6096348254544841612">Sesuaikan dan kawal Chromium. Kemas kini tersedia.</translation> +<translation id="6120345080069858279">Chromium akan menyimpan kata laluan ini dalam Akaun Google anda. Anda tidak perlu mengingati kata laluan tersebut.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> berbahaya, jadi Chromium telah menyekat fail itu.</translation> +<translation id="620022061217911843">Pentadbir anda menghendaki anda memulakan semula OS Chromium untuk menerapkan kemas kini</translation> <translation id="6212496753309875659">Komputer ini telah mempunyai versi Chromium yang lebih baharu. Jika perisian tidak berfungsi, sila nyahpasang Chromium dan cuba lagi.</translation> <translation id="6248213926982192922">Jadikan Chromium penyemak imbas lalai</translation> <translation id="6268381023930128611">Log keluar daripada Chromium?</translation> @@ -191,8 +203,10 @@ <ph name="BEGIN_LINK_2" />Ketahui lebih lanjut<ph name="END_LINK_2" /> Sila semak e-mel anda di <ph name="ACCOUNT_EMAIL" /> untuk arahan lanjut.</translation> +<translation id="7448255348454382571">Mulakan semula OS Chromium</translation> <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation> <translation id="7451052299415159299">Chromium memerlukan kebenaran untuk mengakses kamera anda bagi tapak ini</translation> +<translation id="7471302858145901434">{0,plural, =1{Mulakan semula OS Chromium dalam masa sehari}other{Mulakan semula OS Chromium dalam masa # hari}}</translation> <translation id="7483335560992089831">Tidak boleh memasang versi Chromium yang sama dengan yang sedang dijalankan. Sila tutup Chromium dan cuba lagi.</translation> <translation id="7549178288319965365">Mengenai Chromium OS</translation> <translation id="7577193603922410712">Kemas kini keselamatan khas untuk Chromium baru sahaja dilakukan; anda perlu memulakan semula peranti ini sekarang supaya kemas kini ini berkesan (kami akan memulihkan tab anda).</translation> @@ -222,10 +236,13 @@ <translation id="8290862415967981663">Fail ini mungkin berbahaya, maka Chromium telah menyekatnya.</translation> <translation id="8330519371938183845">Log masuk untuk menyegerakkan dan memperibadikan Chromium pada semua peranti anda</translation> <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> menggunakan Chromium sebelum ini</translation> +<translation id="8375950122744241554">Profil pengguna di bawah seliaan tidak tersedia lagi bermula dengan Chromium 70.</translation> +<translation id="8379713241968949941">{0,plural, =1{Chromium akan dilancarkan semula dalam masa sejam}other{Chromium akan dilancarkan semula dalam masa # jam}}</translation> <translation id="8453117565092476964">Arkib pemasang rosak atau tidak sah. Sila muat turun Chromium sekali lagi.</translation> <translation id="8493179195440786826">Chromium sudah usang</translation> <translation id="85843667276690461">Dapatkan bantuan untuk menggunakan Chromium</translation> <translation id="8586442755830160949">Hak Cipta <ph name="YEAR" /> Pengarang Chromium. Hak cipta terpelihara.</translation> +<translation id="8599548569518771270">{0,plural, =0{OS Chromium akan dimulakan semula sekarang}=1{OS Chromium akan dimulakan semula dalam masa sesaat}other{OS Chromium akan dimulakan semula dalam masa # saat}}</translation> <translation id="8619360774459241877">Melancarkan Chromium...</translation> <translation id="8621669128220841554">Pemasangan gagal disebabkan ralat yang tidak dinyatakan. Sila muat turun semula Chromium.</translation> <translation id="8628626585870903697">Chromium tidak menyertakan pemapar PDF yang diperlukan oleh Pratonton Cetakan untuk berfungsi.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 3a57d8ca..95a34ae3 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">ያልታወቀ ስህተት።</translation> <translation id="119738088725604856">የቅጽበታዊ ገጽ እይታ መስኮት</translation> <translation id="1197979282329025000">የህትመት ብቃቶች ለአታሚ <ph name="PRINTER_NAME" /> በማምጣት ላይ ሳለ አንድ ስህተት ተከስቷል። ይህ አታሚ <ph name="CLOUD_PRINT_NAME" /> ላይ መመዝገብ አይችልም።</translation> -<translation id="1198271701881992799">እንጀምር</translation> <translation id="119944043368869598">ሁሉንም አጽዳ</translation> <translation id="1201402288615127009">ቀጣይ</translation> <translation id="1202596434010270079">የKiosk መተግበሪያ ዘምኗል። እባክዎ የዩ.ኤስ.ቢ. ስቲኩን ያስወግዱ።</translation> @@ -1365,7 +1364,7 @@ <translation id="304826556400666995">የትሮች ድምጸ-ከል አንሳ</translation> <translation id="3053013834507634016">የሰርቲፊኬት ቁልፍ ጠቀሜታ</translation> <translation id="3057861065630527966">የእርስዎን ፎቶዎች እና ቪዲዮዎች በምትኬ ያስቀምጡ</translation> -<translation id="3059313675706898490">የAndroid መልእክቶች</translation> +<translation id="3059313675706898490">የAndroid መልዕክቶች</translation> <translation id="3060379269883947824">ለመናገር-ይምረጡን ያንቁ</translation> <translation id="3061707000357573562">የመጠገኛ አገልግሎት</translation> <translation id="3064410671692449875">በቂ ያልሆነ ውሂብ</translation> @@ -4152,7 +4151,6 @@ <translation id="7410344089573941623"><ph name="HOST" /> ካሜራዎን እና ማይክሮፎንዎን መድረስ ይፈልግ እንደሆነ ይጠይቁ</translation> <translation id="741204030948306876">አዎ፣ ገብቼያለሁ</translation> <translation id="7412226954991670867">የጂፒዩ ማህደረ ትውስታ</translation> -<translation id="7413455776853560343">ዳራን አብጅ</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">ያልታወቀ የአውታረ መረብ ስህተት።</translation> <translation id="7417705661718309329">Google ካርታ</translation> @@ -4353,7 +4351,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">የማሳያዎን ድንበሮች ያስተካክሉ</translation> <translation id="7760004034676677601">የጠበቁት የጅማሬ ገጽ ይሄ ነው?</translation> -<translation id="7760756088376329221">የGoogle ፎቶ አልበም ይምረጡ</translation> <translation id="7764225426217299476">አድራሻ አክል</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> ከ<ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">ውሰድ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 1e3ee8f..508bb38 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">خطأ غير محدّد.</translation> <translation id="119738088725604856">نافذة لقطة شاشة</translation> <translation id="1197979282329025000">حدث خطأ أثناء استرداد إمكانيات الطابعة للطابعة <ph name="PRINTER_NAME" />. تعذر تسجيل هذه الطابعة في <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">لنبدأ</translation> <translation id="119944043368869598">محو جميع التنزيلات</translation> <translation id="1201402288615127009">التالي</translation> <translation id="1202596434010270079">تم تحديث تطبيق Kiosk. يُرجى إزالة جهاز USB.</translation> @@ -820,7 +819,7 @@ <translation id="2230062665678605299">تعذر إنشاء المجلد "<ph name="FOLDER_NAME" />". <ph name="ERROR_MESSAGE" /></translation> <translation id="223106756035922488">انقر لعرض رسومات الشعار المبتكرة لهذا اليوم.</translation> <translation id="2231238007119540260">في حالة حذف شهادة الخادم، تتم استعادة العمليات المعتادة للتحقق من الأمان لذلك الخادم وسيتطلب الأمر استخدامه لشهادة صالحة.</translation> -<translation id="2232379019872353004">يُرسِل بعض معلومات النظام ومحتوى الصفحة إلى Google.</translation> +<translation id="2232379019872353004">يتم إرسال بعض معلومات النظام ومحتوى الصفحة إلى Google.</translation> <translation id="2232876851878324699">احتوى الملف على شهادة واحدة، لم يتم استيرادها:</translation> <translation id="2233502537820838181">&مزيد من المعلومات</translation> <translation id="2234876718134438132">خدمات Google والمزامنة</translation> @@ -962,7 +961,7 @@ <translation id="2462724976360937186">معرّف مفتاح المرجع المصدق</translation> <translation id="2462752602710430187">تمت إضافة <ph name="PRINTER_NAME" /></translation> <translation id="2464089476039395325">خادم وكيل HTTP</translation> -<translation id="2468205691404969808">يستخدم ملفات تعريف الارتباط لتذكّر التفضيلات حتى إذا لم تزُر تلك الصفحات.</translation> +<translation id="2468205691404969808">يتم استخدام ملفات تعريف الارتباط لتذكّر اهتماماتك حتى لو لم تزُر تلك الصفحات.</translation> <translation id="2468902267404883140">لا يُمكن الاتصال بهاتفك. تأكد من أنك تستخدم هاتف Android متوافقًا وأنه قيد التشغيل وفي متناول يديك. <a>مزيد من المعلومات</a></translation> <translation id="2470702053775288986">تم إيقاف الإضافات غير المدعومة</translation> <translation id="2473195200299095979">ترجم هذه الصفحة</translation> @@ -1006,7 +1005,7 @@ <translation id="2520644704042891903">في انتظار توفر منفذ...</translation> <translation id="252219247728877310">لم يتم تحديث المُكوّن</translation> <translation id="2522791476825452208">قريب جدًا</translation> -<translation id="2523184218357549926">يُرسِل عناوين URL للصفحات التي تزورها إلى Google.</translation> +<translation id="2523184218357549926">يتم إرسال عناوين URL للصفحات التي تزورها إلى Google.</translation> <translation id="2525250408503682495">للأسف تعذر تثبيت cryptohome لتطبيق Kiosk.</translation> <translation id="2526277209479171883">التثبيت والمتابعة</translation> <translation id="2526590354069164005">سطح المكتب</translation> @@ -1202,7 +1201,7 @@ <translation id="2800760947029405028">تحميل صورة</translation> <translation id="2803375539583399270">أدخل رقم التعريف الشخصي</translation> <translation id="2805646850212350655">نظام تشفير الملفات لـ Microsoft</translation> -<translation id="2805756323405976993">تطبيقات</translation> +<translation id="2805756323405976993">التطبيقات</translation> <translation id="2807517655263062534">هنا تظهر الملفات التي تم تنزيلها</translation> <translation id="2809586584051668049">و<ph name="NUMBER_ADDITIONAL_DISABLED" /> من الإضافات الأخرى</translation> <translation id="281133045296806353">تم فتح نافذة جديدة في جلسة المتصفح الحالي.</translation> @@ -3071,7 +3070,7 @@ <translation id="5723508132121499792">ليس هناك تطبيقات خلفية قيد التشغيل</translation> <translation id="5727728807527375859">قد تلحق الإضافات والتطبيقات والمظاهر الضرر بالكمبيوتر، فهل تريد بالتأكيد المتابعة؟</translation> <translation id="5729712731028706266">&عرض</translation> -<translation id="5731185123186077399">خدمات Google المخصصة مثل Google Pay</translation> +<translation id="5731185123186077399">الاستفادة من خدمات Google المخصّصة مثل Google Pay</translation> <translation id="5731247495086897348">ل&صق وانتقال</translation> <translation id="5731409020711461763">صورة واحدة جديدة</translation> <translation id="5734362860645681824">الاتصالات</translation> @@ -4150,7 +4149,6 @@ <translation id="7410344089573941623">السؤال عند رغبة <ph name="HOST" /> في الدخول إلى الكاميرا والميكروفون التابعين لك</translation> <translation id="741204030948306876">نعم، موافق</translation> <translation id="7412226954991670867">ذاكرة GPU</translation> -<translation id="7413455776853560343">تخصيص خلفية</translation> <translation id="7414464185801331860">18 ضعفًا</translation> <translation id="7416362041876611053">خطأ غير معروف في الشبكة.</translation> <translation id="7417705661718309329">خريطة Google</translation> @@ -4352,7 +4350,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">ضبط حدود شاشتك</translation> <translation id="7760004034676677601">هل هذه هي صفحة بدء التشغيل التي كنت تتوقع ظهورها؟</translation> -<translation id="7760756088376329221">اختيار ألبوم صور Google</translation> <translation id="7764225426217299476">إضافة عنوان</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> من <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">نقل</translation> @@ -4534,7 +4531,7 @@ <translation id="7978412674231730200">مفتاح خاص</translation> <translation id="7979036127916589816">حدث خطأ في المزامنة</translation> <translation id="7980084013673500153">رقم تعريف مادة العرض: <ph name="ASSET_ID" /></translation> -<translation id="7981313251711023384">التحميل المُسبق للصفحات للحصول على أداء أسرع للتصفح والبحث</translation> +<translation id="7981313251711023384">التحميل المُسبق للصفحات للحصول على أداء أسرع أثناء التصفّح والبحث</translation> <translation id="7982083145464587921">يُرجى إعادة تشغيل الجهاز لإصلاح هذا الخطأ.</translation> <translation id="7982283708762922719">الارتفاع</translation> <translation id="7982789257301363584">الشبكة</translation> @@ -5069,7 +5066,7 @@ <translation id="8814687660896548945">يُرجى الانتظار، جارٍ فحص الأرشيف...</translation> <translation id="881799181680267069">إخفاء النوافذ الأخرى</translation> <translation id="8818152010000655963">الخلفية</translation> -<translation id="8820817407110198400">إشارات</translation> +<translation id="8820817407110198400">الإشارات المرجعية</translation> <translation id="8821045908425223359">تهيئة عنوان IP تلقائيًا</translation> <translation id="882204272221080310">يمكنك تحديث البرامج الثابتة لمزيد من الأمان.</translation> <translation id="8823514049557262177">نسخ &نص الرابط</translation> @@ -5210,7 +5207,7 @@ <translation id="9042893549633094279">الخصوصية والأمان</translation> <translation id="904451693890288097">يُرجى إدخال مفتاح المرور لـ "<ph name="DEVICE_NAME" />":</translation> <translation id="9044646465488564462">تعذّر الاتصال بالشبكة: <ph name="DETAILS" /></translation> -<translation id="9045430190527754450">يُرسِل عنوان ويب الصفحة التي تحاول الوصول إليها إلى Google.</translation> +<translation id="9045430190527754450">يتم إرسال عنوان ويب الصفحة التي تحاول الوصول إليها إلى Google.</translation> <translation id="9046895021617826162">تعذّر الاتصال</translation> <translation id="9050666287014529139">عبارة المرور</translation> <translation id="9052208328806230490">لقد سجّلت طابعاتك في <ph name="CLOUD_PRINT_NAME" /> باستخدام الحساب <ph name="EMAIL" /></translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 86b138e..08d11dbfd 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Неизвестна грешка.</translation> <translation id="119738088725604856">Екранна снимка на прозореца</translation> <translation id="1197979282329025000">Възникна грешка при извличането на функционалностите на принтера <ph name="PRINTER_NAME" />. Той не можа да бъде регистриран с/ъс <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Да започваме</translation> <translation id="119944043368869598">Изчистване на всички</translation> <translation id="1201402288615127009">Напред</translation> <translation id="1202596434010270079">Павилионното приложение е актуализирано. Моля, извадете USB паметта.</translation> @@ -4155,7 +4154,6 @@ <translation id="7410344089573941623">Да се получава запитване, ако <ph name="HOST" /> иска достъп до камерата и микрофона ви</translation> <translation id="741204030948306876">Да, ще участвам</translation> <translation id="7412226954991670867">Памет на графичния процесор</translation> -<translation id="7413455776853560343">Персонализиране на фона</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Неизвестна грешка в мрежата.</translation> <translation id="7417705661718309329">Карта на Google</translation> @@ -4356,7 +4354,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Коригиране на границите на екрана</translation> <translation id="7760004034676677601">Това ли е очакваната от вас страница при стартиране?</translation> -<translation id="7760756088376329221">Избиране на албум от Google Снимки</translation> <translation id="7764225426217299476">Добавяне на адрес</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> от <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Преместване</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index a9c7067..487e2f30 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -137,7 +137,6 @@ <translation id="1195447618553298278">অজানা ত্রুটি৷</translation> <translation id="119738088725604856">স্ক্রীনশট উইন্ডো</translation> <translation id="1197979282329025000"><ph name="PRINTER_NAME" /> প্রিন্টারের প্রিন্টার দক্ষতা অ্যাকাউন্ট ফিরিয়ে আনার সময় একটি ত্রুটি ঘটেছে৷ এই প্রিন্টার <ph name="CLOUD_PRINT_NAME" />-এর সাথে নিবন্ধভুক্ত করা যাবে না৷</translation> -<translation id="1198271701881992799">আসুন শুরু করি</translation> <translation id="119944043368869598">সব পরিষ্কার করুন</translation> <translation id="1201402288615127009">পরবর্তী</translation> <translation id="1202596434010270079">কিয়স্ক অ্যাপ্লিকেশান আপডেট করা হয়েছে৷ দয়া করে USB স্টিকটি সরান৷</translation> @@ -221,7 +220,7 @@ <translation id="131461803491198646">হোম নেটওয়ার্ক, রোমিং নয়</translation> <translation id="1316136264406804862">সার্চ করা হচ্ছে...</translation> <translation id="1316495628809031177">সিঙ্ক থামানো হয়েছে</translation> -<translation id="1319979322914001937">Chrome ওয়েব স্টোর থেকে এক্সটেনশ একটি ফিল্টার করা তালিকা দেখায় এমন একটি অ্যাপ। তালিকার এক্সটেনশনগুলি অ্যাপটি থেকে সরাসরি ইনস্টল করা যাবে।</translation> +<translation id="1319979322914001937">Chrome ওয়েব স্টোর থেকে এক্সটেনশনের একটি ফিল্টার করা তালিকা দেখায় এমন একটি অ্যাপ। তালিকার এক্সটেনশনগুলি অ্যাপ থেকে সরাসরি ইনস্টল করা যাবে।</translation> <translation id="1326317727527857210">আপনার অন্য ডিভাইসগুলি থেকে আপনার ট্যাবগুলি পেতে, Chrome এ প্রবেশ করুন।</translation> <translation id="1327074568633507428">Google ক্লাউড মুদ্রণে থাকা প্রিন্টার</translation> <translation id="1327977588028644528">গেটওয়ে</translation> @@ -1537,7 +1536,7 @@ <translation id="3358935496594837302">আপনার ফোন খুঁজে পাওয়া যায়নি৷ নিশ্চিত করুন আপনার একটি উপযুক্ত Android ফোন আছে যেটি চালু রয়েছে এবং সহজে ব্যবহার করা যায়।<a>আরও জানুন/a></translation> <translation id="3359256513598016054">শংসাপত্র নীতি বাধ্যবাধকতা</translation> <translation id="3360297538363969800">প্রিন্ট করা গেল না৷ দয়া করে আপনার মুদ্রকটি পরীক্ষা করে আবার চেষ্টা করুন৷</translation> -<translation id="3364721542077212959">লেখনী টুল</translation> +<translation id="3364721542077212959">স্টাইলাস টুল</translation> <translation id="3365598184818502391">Ctrl অথবা Alt ব্যবহার করুন</translation> <translation id="3367047597842238025">আপনার পছন্দ অনুযায়ী <ph name="DEVICE_TYPE" /> সেট-আপ করুন এবং অসাধারণ সমস্ত বৈশিষ্ট্য উপভোগ করুন।</translation> <translation id="3368922792935385530">সংযুক্ত</translation> @@ -1817,7 +1816,7 @@ <translation id="3768037234834996183">আপনার পছন্দগুলি সিঙ্ক হচ্ছে...</translation> <translation id="3771294271822695279">ভিডিও ফাইলসমূহ</translation> <translation id="3775432569830822555">SSL সার্ভার শংসাপত্র</translation> -<translation id="3776796446459804932">এই এক্সটেনশনটি Chrome ওয়েব স্টোর এর নীতি লঙ্ঘন করে৷</translation> +<translation id="3776796446459804932">এই এক্সটেনশনটি Chrome ওয়েব স্টোর-এর নীতি লঙ্ঘন করে৷</translation> <translation id="3777806571986431400">এক্সটেনশান সক্ষম হয়েছে</translation> <translation id="3778152852029592020">ডাউনলোড বাতিল হয়েছে৷</translation> <translation id="3778740492972734840">&ডেভেলপার টুল</translation> @@ -2335,7 +2334,7 @@ <translation id="4647697156028544508">দয়া করে "<ph name="DEVICE_NAME" />"-এর পিন লিখুন:</translation> <translation id="4648491805942548247">অপর্যাপ্ত অনুমতিগুলি</translation> <translation id="4648499713050786492">কোনো ব্যক্তি যোগ করার আগে দয়া করে আপনার প্রোফাইলটি আনলক করুন।</translation> -<translation id="465499440663162826">Chrome ওয়েব স্টোর কানেক্ট করা যায়নি।</translation> +<translation id="465499440663162826">Chrome ওয়েব স্টোর-এর সাথে কানেক্ট করা যায়নি।</translation> <translation id="4656293982926141856">এই কম্পিউটার</translation> <translation id="4658312088164718891">Smart Lock চালু করতে পাসওয়ার্ড লিখুন। পরের বার, আপনার ফোন থেকে <ph name="DEVICE_TYPE" /> আনলক করতে পারবেন। সেটিংসে গিয়ে Smart Lock বন্ধ করুন।</translation> <translation id="4660476621274971848">"<ph name="EXPECTED_VERSION" />" ভার্সনটি হওয়া উচিত ছিল, কিন্তু ভার্সনটি হল "<ph name="NEW_ID" />"</translation> @@ -2346,7 +2345,7 @@ <translation id="4668721319092543482"><ph name="PLUGIN_NAME" /> সক্ষম করার জন্য ক্লিক করুন</translation> <translation id="4669606053856530811">এই আইটেমগুলি '<ph name="SOURCE_NAME" />' এর সদস্যদের সাথে শেয়ার না করলে তারা সেগুলি অ্যাক্সেস করতে পারবে না।</translation> <translation id="4672657274720418656">পৃষ্ঠা পাতন করুন</translation> -<translation id="4673442866648850031">স্টাইলাস সরানো হলে স্টাইলাস টুল খুলুন</translation> +<translation id="4673442866648850031">স্টাইলাস বের করলে স্টাইলাস টুল চালু হবে</translation> <translation id="4677585247300749148"><ph name="URL" /> অ্যাক্সেসযোগ্যতা ইভেন্টে প্রতিক্রিয়া দিয়ে চায়</translation> <translation id="4677692029604506169">আপনার <ph name="DEVICE_TYPE" /> আনলক করার জন্য যে ফোন আপনি ব্যবহার করছেন সেটির নিরাপত্তার জন্য স্ক্রিন লক প্রয়োজন। সাধারণত, এটি একটি পিন, প্যাটার্ন, বা পাসওয়ার্ড। আগে থেকেই স্ক্রিন লক আছে? যাচাই করতে এবং চালিয়ে যেতে আবার দেখুন বেছে নিন।</translation> <translation id="4677772697204437347">GPU মেমোরি</translation> @@ -2371,7 +2370,7 @@ <translation id="4708794300267213770">নিদ্রা মোড থেকে জাগার সময় লক স্ক্রিন দেখান</translation> <translation id="4708849949179781599"><ph name="PRODUCT_NAME" /> থেকে প্রস্থান করুন</translation> <translation id="4711638718396952945">সেটিংস পুনরুদ্ধার করুন</translation> -<translation id="4713544552769165154">Macintosh সফ্টওয়্যার ব্যবহার করে এমন একটি কম্পিউটারের জন্য এই ফাইলটি ডিজাইন করা হয়েছে৷ Chrome OS দ্বারা চালিত আপনার ডিভাইসটির সাথে এটি সামঞ্জস্যপূর্ণ নয়৷ একটি উপযুক্ত প্রতিস্থাপনযোগ্য অ্যাপ্লিকেশানের জন্য দয়া করে <ph name="BEGIN_LINK" />Chrome ওয়েব স্টোর<ph name="END_LINK" /> এ সার্চ করুন৷<ph name="BEGIN_LINK_HELP" />আরো জানুন<ph name="END_LINK_HELP" /></translation> +<translation id="4713544552769165154">Macintosh সফ্টওয়্যার ব্যবহার করে এমন একটি কম্পিউটারের জন্য এই ফাইলটি ডিজাইন করা হয়েছে৷ Chrome OS দ্বারা চালিত আপনার ডিভাইসটির সাথে এটি সামঞ্জস্যপূর্ণ নয়৷ একটি উপযুক্ত প্রতিস্থাপনযোগ্য অ্যাপ জন্য অনুগ্রহ করে <ph name="BEGIN_LINK" />Chrome ওয়েব স্টোর<ph name="END_LINK" />-এ সার্চ করুন৷<ph name="BEGIN_LINK_HELP" />আরও জানুন<ph name="END_LINK_HELP" /></translation> <translation id="4715553623069266137">খুব অল্প সময় (০.৮সে.)</translation> <translation id="4716483597559580346">অতিরিক্ত নিরাপত্তার জন্য পাওয়ারওয়াশ</translation> <translation id="4720113199587244118">ডিভাইসগুলি যোগ করুন</translation> @@ -2799,7 +2798,7 @@ <translation id="5355097969896547230">আবার খুঁজুন</translation> <translation id="5355926466126177564">আপনি বহুউপযোগী ক্ষেত্র থেকে সার্চ করলে কোন পৃষ্ঠা দেখানো হবে তা "<ph name="EXTENSION_NAME" />" এক্সটেনশানটি পরিবর্তন করেছে।</translation> <translation id="5358764674931277">ফ্রেম রেট</translation> -<translation id="5360150013186312835">টুল দণ্ডের মধ্যে দেখান</translation> +<translation id="5360150013186312835">টুলবারের মধ্যে দেখুন</translation> <translation id="5362741141255528695">ব্যক্তিগত কী ফাইল নির্বাচন করুন৷</translation> <translation id="5363109466694494651">পাওয়ারওয়াশ এবং প্রত্যাবর্তন করুন</translation> <translation id="5367091008316207019">ফাইল পড়া হচ্ছে..</translation> @@ -3001,7 +3000,7 @@ <translation id="563535393368633106">অ্যাক্সেস করার আগে জিজ্ঞাসা করুন (প্রস্তাবিত)</translation> <translation id="5636996382092289526"><ph name="NETWORK_ID" /> ব্যবহার করতে গেলে আপনাকে প্রথমে <ph name="LINK_START" />নেটওয়ার্কের সাইন-ইন পৃষ্ঠায় যেতে হবে<ph name="LINK_END" />, যা কয়েক সেকেন্ডের মধ্যে স্বয়ংক্রিয়ভাবে খুলবে৷ যদি এমন না হয়, তাহলে নেটওয়ার্কটি ব্যবহার করা যেতে পারে৷</translation> <translation id="5637476008227280525">মোবাইল ডেটা সক্ষম করুন</translation> -<translation id="5638309510554459422"><ph name="BEGIN_LINK" />Chrome ওয়েব স্টোরে<ph name="END_LINK" /> এক্সটেনশন এবং থিম খুঁজুন</translation> +<translation id="5638309510554459422"><ph name="BEGIN_LINK" />Chrome ওয়েব স্টোর<ph name="END_LINK" />-এ এক্সটেনশন এবং থিম খুঁজুন</translation> <translation id="5638497698949808140"><ph name="HOURS" />ঘণ্টা আগে আপডেট করা হয়েছে</translation> <translation id="5639549361331209298">এই পৃষ্ঠাটি পুনঃলোড করুন, আরও বিকল্প দেখতে ধরে থাকুন</translation> <translation id="5642508497713047">CRL স্বাক্ষরকারী</translation> @@ -3130,7 +3129,7 @@ <translation id="5846929185714966548">ট্যাব ৪</translation> <translation id="5849212445710944278">আগেই যোগ করা হয়েছে</translation> <translation id="5849570051105887917">হোম পরিষেবা প্রদানকারী কোড</translation> -<translation id="5850516540536751549">এই ফাইল প্রকারটি সমর্থিত নয়৷ এই ধরণের ফাইল খুলতে পারে এমন অ্যাপ্লিকেশান খুঁজতে দয়া করে <ph name="BEGIN_LINK" />Chrome ওয়েব দোকান<ph name="END_LINK" /> দেখুন৷ +<translation id="5850516540536751549">এই ফাইল প্রকারটি সমর্থিত নয়৷ এই ধরনের ফাইল খুলতে পারে এমন অ্যাপ খুঁজতে অনুগ্রহ করে <ph name="BEGIN_LINK" />Chrome ওয়েব স্টোর<ph name="END_LINK" /> দেখুন৷ <ph name="BEGIN_LINK_HELP" />আরও জানুন<ph name="END_LINK_HELP" /></translation> <translation id="5851063901794976166">এখানে দেখার মতো কিছু নেই...</translation> <translation id="5851868085455377790">ইস্যুকারী</translation> @@ -3145,7 +3144,7 @@ <translation id="5860209693144823476">ট্যাব ৩</translation> <translation id="5860491529813859533">চালু করুন</translation> <translation id="5860494867054883682">আপনার ডিভাইস <ph name="CHANNEL_NAME" /> চ্যানেলে আপডেট করা হচ্ছে (<ph name="PROGRESS_PERCENT" />)</translation> -<translation id="5862109781435984885">শেল্ফে লেখনী টুল দেখান</translation> +<translation id="5862109781435984885">শেল্ফে স্টাইলাস টুল দেখুন</translation> <translation id="5863445608433396414">ডিবাগিং বৈশিষ্ট্যাবলী সক্ষম করুন</translation> <translation id="5864471791310927901">DHCP লুকআপ ব্যর্থ</translation> <translation id="586567932979200359">আপনি <ph name="PRODUCT_NAME" /> থেকে এটির ডিস্ক ছবি চালাচ্ছেন৷ এটিকে আপনার কম্পিউটারে ইনস্টল করা হলে তা ডিস্ক ছবি ছাড়াই এটিকে চালাতে দেয় এবং এটিকে আপ টু ডেট রাখা নিশ্চিত করে৷</translation> @@ -3279,7 +3278,7 @@ <translation id="6078752646384677957">অনুগ্রহ করে আপনার মাইক্রোফোন এবং অডিওর স্তর ভালকরে দেখে নিন।</translation> <translation id="6080515710685820702">শেয়ার করা কম্পিউটার ব্যবহার করছেন? তাহলে ছদ্মবেশী উইন্ডো ব্যবহার করুন।</translation> <translation id="6080689532560039067">আপনার সিস্টেমের সময় চেক করুন</translation> -<translation id="6082651258230788217">টুল দণ্ডের মধ্যে দেখান</translation> +<translation id="6082651258230788217">টুলবারের মধ্যে দেখুন</translation> <translation id="6086846494333236931">আপনার প্রশাসক দ্বারা ইনস্টল করা হয়েছে</translation> <translation id="6087960857463881712">দুর্দান্ত চেহারা</translation> <translation id="6089481419520884864">পৃষ্ঠা পাতন করুন</translation> @@ -3509,7 +3508,7 @@ <translation id="6431217872648827691">আপনার Google পাসওয়ার্ডের মাধ্যমে <ph name="TIME" /> তারিখ অনুযায়ী সমস্ত ডেটা এনক্রিপটেড হয়েছে</translation> <translation id="6431347207794742960">এই কম্পিউটারে সকল ব্যবহারকারীর জন্য <ph name="PRODUCT_NAME" /> স্বয়ংক্রিয় আপডেটগুলো সেটআপ করবে।</translation> <translation id="6434309073475700221">বাতিল</translation> -<translation id="6436164536244065364">ওয়েব স্টোরে দেখুন</translation> +<translation id="6436164536244065364">ওয়েব স্টোর-এ দেখুন</translation> <translation id="6438992844451964465"><ph name="WINDOW_TITLE" /> - অডিও বাজছে</translation> <translation id="6442187272350399447">দুর্দান্ত</translation> <translation id="6442697326824312960">আনপিন ট্যাব</translation> @@ -3843,7 +3842,7 @@ <translation id="6976108581241006975">JavaScript কনসোল</translation> <translation id="6977381486153291903">ফার্মওয়ের পুনর্বিবেচনাগুলি</translation> <translation id="6978121630131642226">সার্চ ইঞ্জিনসমূহ</translation> -<translation id="6978611942794658017">Windows সফ্টওয়্যার ব্যবহার করে এমন একটি পিসির জন্য এই ফাইলটি ডিজাইন করা হয়েছে৷ Chrome OS দ্বারা চালিত আপনার ডিভাইসটির সাথে এটি সামঞ্জস্যপূর্ণ নয়৷ একটি উপযুক্ত প্রতিস্থাপনযোগ্য অ্যাপ্লিকেশানের জন্য দয়া করে Chrome ওয়েব স্টোর এ সার্চ করুন৷</translation> +<translation id="6978611942794658017">Windows সফ্টওয়্যার ব্যবহার করে এমন একটি কম্পিউটারের জন্য এই ফাইলটি ডিজাইন করা হয়েছে৷ Chrome OS দ্বারা চালিত আপনার ডিভাইসটির সাথে এটি সামঞ্জস্যপূর্ণ নয়৷ একটি উপযুক্ত প্রতিস্থাপনযোগ্য অ্যাপের জন্য অনুগ্রহ করে Chrome ওয়েব স্টোর-এ সার্চ করুন৷</translation> <translation id="6979158407327259162">Google ড্রাইভ</translation> <translation id="6979737339423435258">শুরু থেকে</translation> <translation id="6980462514016882061">সার্চ, বিজ্ঞাপন এবং অন্যান্য Google পরিষেবা ব্যক্তিগতকৃত করতে Google আপনার ব্রাউজিং ইতিহাস ব্যবহার করতে পারে</translation> @@ -3968,7 +3967,7 @@ <translation id="7152478047064750137">এই এক্সটেনশনটির জন্য কোনও বিশেষ অনুমতির প্রয়োজন নেই</translation> <translation id="7154130902455071009">আপনার সূচনা পৃষ্ঠাকে এতে পরিবর্তন করুন: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">ক্যামেরা বা ফাইল থেকে বিদ্যমান ফটো</translation> -<translation id="7156235233373189579">Windows সফ্টওয়্যার ব্যবহার করে এমন একটি পিসির জন্য এই ফাইলটি ডিজাইন করা হয়েছে৷ Chrome OS দ্বারা চালিত আপনার ডিভাইসটির সাথে এটি সামঞ্জস্যপূর্ণ নয়৷ একটি উপযুক্ত প্রতিস্থাপনযোগ্য অ্যাপ্লিকেশানের জন্য দয়া করে <ph name="BEGIN_LINK" />Chrome ওয়েব স্টোর<ph name="END_LINK" /> এ সার্চ করুন৷<ph name="BEGIN_LINK_HELP" />আরো জানুন<ph name="END_LINK_HELP" /></translation> +<translation id="7156235233373189579">Windows সফ্টওয়্যার ব্যবহার করে এমন একটি কম্পিউটারের জন্য এই ফাইলটি ডিজাইন করা হয়েছে৷ Chrome OS দ্বারা চালিত আপনার ডিভাইসটির সাথে এটি সামঞ্জস্যপূর্ণ নয়৷ একটি উপযুক্ত প্রতিস্থাপনযোগ্য অ্যাপের জন্য অনুগ্রহ করে <ph name="BEGIN_LINK" />Chrome ওয়েব স্টোর<ph name="END_LINK" />-এ সার্চ করুন৷<ph name="BEGIN_LINK_HELP" />আরও জানুন<ph name="END_LINK_HELP" /></translation> <translation id="7165320105431587207">নেটওয়ার্ক কনফিগার করা যায়নি</translation> <translation id="716640248772308851">" <ph name="EXTENSION" /> " নির্দিষ্ট করা অবস্থানে ছবি, ভিডিও, এবং শব্দের ফাইলগুলি পড়তে পারে৷</translation> <translation id="7167486101654761064">&সর্বদা এই ধরনের ফাইল খুলুন</translation> @@ -3980,7 +3979,7 @@ <translation id="7175353351958621980">এখান থেকে লোড হয়েছে:</translation> <translation id="7180611975245234373">রিফ্রেশ করুন</translation> <translation id="7180865173735832675">কাস্টমাইজ করুন</translation> -<translation id="7186088072322679094">টুল দণ্ডের মধ্যে রাখুন</translation> +<translation id="7186088072322679094">টুলবারের মধ্যে রাখুন</translation> <translation id="7187428571767585875">যে রেজিস্ট্রি এন্ট্রি সরিয়ে দেওয়া হবে অথবা পরিবর্তন করা হবে:</translation> <translation id="7189234443051076392">আপনার ডিভাইসে পর্যাপ্ত জায়গা আছে কিনা দেখে নিন</translation> <translation id="7191159667348037">অজানা প্রিন্টার (USB)</translation> @@ -4127,7 +4126,6 @@ <translation id="7410344089573941623"><ph name="HOST" /> আপনার ক্যামেরা এবং মাইক্রোফোন অ্যাক্সেস করতে চায় কিনা জিজ্ঞাসা করুন</translation> <translation id="741204030948306876">হ্যাঁ, আমি রাজি</translation> <translation id="7412226954991670867">GPU মেমোরি</translation> -<translation id="7413455776853560343">ব্যাকগ্রাউন্ড কাস্টমাইজ করুন</translation> <translation id="7414464185801331860">১৮x</translation> <translation id="7416362041876611053">অজানা নেটওয়ার্ক ত্রুটি৷</translation> <translation id="7417705661718309329">Google ম্যাপ</translation> @@ -4231,7 +4229,7 @@ <translation id="7576032389798113292">৬x৪</translation> <translation id="7576690715254076113">ক্রমসজ্জিত</translation> <translation id="7579149537961810247">সাইটগুলি মিউট করুন</translation> -<translation id="7580671184200851182">সব স্পিকারে একই অডিও বাজান (মনো অডিও)</translation> +<translation id="7580671184200851182">সব স্পিকারে একই অডিও বাজান (মোনো অডিও)</translation> <translation id="7581462281756524039">একটি পরিষ্কারের টুল</translation> <translation id="7582582252461552277">এই নেটওয়ার্কটিকে অগ্রাধিকার দিন</translation> <translation id="7586498138629385861">Chrome অ্যাপ্লিকেশানগুলি খোলা থাকার সময় Chrome চালু থাকবে।</translation> @@ -4327,7 +4325,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">আপনার প্রদর্শনের সীমানাগুলি সমন্বয় করে</translation> <translation id="7760004034676677601">আপনি কি এই পৃষ্ঠাটিকে শুরুর পৃষ্টা হিসেবে আশা করছিলেন?</translation> -<translation id="7760756088376329221">Google ফটো অ্যালবাম বেছে নিন</translation> <translation id="7764225426217299476">ঠিকানা যোগ করুন</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> থেকে <ph name="DOWNLOAD_RECEIVED" /></translation> <translation id="7765158879357617694">সরান</translation> @@ -4384,12 +4381,12 @@ <translation id="782590969421016895">বর্তমান পৃষ্ঠাগুলি ব্যবহার করুন</translation> <translation id="7826790948326204519"><ph name="BEGIN_H3" />ডিবাগিংয়ের ফিচারগুলি<ph name="END_H3" /> <ph name="BR" /> - আপনার ডিভাইসে কাস্টম কোড ইনস্টল এবং পরীক্ষা করতে, আপনি আপনার Chrome OS ডিভাইসে ডিবাগিংয়ের ফিচারগুলি চালু করতে পারেন। এটি আপনাকে নিম্নলিখিতগুলি করতে দেবে:<ph name="BR" /> + আপনার ডিভাইসে কাস্টম কোড ইনস্টল এবং পরীক্ষা করতে, আপনি আপনার Chrome OS ডিভাইসে ডিবাগিংয়ের ফিচারগুলি চালু করতে পারেন। এটি আপনাকে এইগুলি করতে দেবে:<ph name="BR" /> <ph name="BEGIN_LIST" /> <ph name="LIST_ITEM" />যাচাইকরণ সরিয়ে দিয়ে আপনাকে OS ফাইলগুলি পরিবর্তন করতে দেবে - <ph name="LIST_ITEM" />যাতে আপনি <ph name="BEGIN_CODE" />'cros flash'<ph name="END_CODE" />-এর মত টুলগুলি ব্যবহার করে ডিভাইস অ্যাক্সেস করতে পারেন সেজন্য স্ট্যান্ডার্ড পরীক্ষার কীগুলি ব্যবহার করে ডিভাইসে SSH অ্যাক্সেস চালু করতে দেবে - <ph name="LIST_ITEM" />যাতে আপনি ইউএসবি ড্রাইভ থেকে OS-এর একটি ইমেজ ইনস্টল করতে পারেন সেজন্য ইউএসবির সাহায্যে বুট করা চালু করতে দেবে - <ph name="LIST_ITEM" />যাতে আপনি ম্যানুয়ালি ডিভাইসে SSH করতে পারেন সেজন্য ডেভ এবং সিস্টেমের রুট লগ-ইন পাসওয়ার্ড কাস্টম মানে সেট করতে দেবে + <ph name="LIST_ITEM" />যাতে আপনি <ph name="BEGIN_CODE" />'cros flash'<ph name="END_CODE" />-এর মত টুলগুলি ব্যবহার করে ডিভাইস অ্যাক্সেস করতে পারেন সেই জন্য স্ট্যান্ডার্ড পরীক্ষার কীগুলি ব্যবহার করে ডিভাইসে SSH অ্যাক্সেস চালু করতে দেবে + <ph name="LIST_ITEM" />যাতে আপনি ইউএসবি ড্রাইভ থেকে OS-এর একটি ইমেজ ইনস্টল করতে পারেন সেই জন্য ইউএসবির সাহায্যে বুট করা চালু করতে দেবে + <ph name="LIST_ITEM" />যাতে আপনি ম্যানুয়ালি ডিভাইসে SSH করতে পারেন সেই জন্য ডেভ এবং সিস্টেমের রুট লগ-ইন পাসওয়ার্ড কাস্টম মানে সেট করতে দেবে <ph name="END_LIST" /> <ph name="BR" /> এটি চালু করলে, কোনও এন্টারপ্রাইজ পরিচালিত ডিভাইসে পাওয়ারওয়াশ বা ডেটা ওয়াইপ করার পরেও প্রায় সমস্ত ডিবাগিংয়ের ফিচারগুলি চালু থাকবে৷ সমস্ত ডিবাগিংয়ের ফিচারগুলি সম্পূর্ণরূপে বন্ধ করতে, Chrome OS পুনরুদ্ধার করার প্রক্রিয়াটি সম্পূর্ণ করুন (https://support.google.com/chromebook/answer/1080595). @@ -4411,7 +4408,7 @@ <translation id="7839051173341654115">মিডিয়া দেখুন/ব্যাকআপ নিন</translation> <translation id="7839192898639727867">শংসাপত্র বিষয় কী ID</translation> <translation id="7839804798877833423">এই ফাইলগুলি আনয়ন করতে আনুমানিক মোবাইল ডেটার <ph name="FILE_SIZE" /> ব্যবহার করবে</translation> -<translation id="7844553762889824470">আপনি যা শুনতে চান তা হাইলাইট করুন, তারপর Search + S প্রেস করুন। এছাড়াও নির্দিষ্ট অংশ বেছে নিতে আপনি Search কী প্রেস করে ধরে থাকুন অথবা আপনার প্রোফাইল ছবির কাছে 'বাছুন ও শুনুন' আইকনটি ট্যাপ করুন।</translation> +<translation id="7844553762889824470">আপনি যা শুনতে চান তা হাইলাইট করুন, তারপর Search + S প্রেস করুন। এছাড়াও নির্দিষ্ট অংশ বেছে নিতে আপনি Search বোতাম প্রেস করে ধরে থাকুন অথবা আপনার প্রোফাইল ছবির কাছে 'বাছুন ও শুনুন' আইকনটি ট্যাপ করুন।</translation> <translation id="7844992432319478437">ভিন্ন আপডেট হচ্ছে</translation> <translation id="7846076177841592234">নির্বাচন বাতিল করুন</translation> <translation id="7846634333498149051">কীবোর্ড</translation> @@ -4451,7 +4448,7 @@ <translation id="7893393459573308604"><ph name="ENGINE_NAME" /> (ডিফল্ট)</translation> <translation id="78957024357676568">বাঁ</translation> <translation id="7897900149154324287">ভবিষ্যতে, আপনার সরানোযোগ্য ডিভাইসটিকে আনপ্লাগ করার আগে ফাইল অ্যাপ্লিকেশান থেকে এটি যে বের করে নেওয়া হয়েছে সেই বিষয়ে নিশ্চিত হয়ে নিন। অন্যথায় আপনি হয়ত ডেটা হারাতে পারেন।</translation> -<translation id="7898627924844766532">টুল দণ্ডের মধ্যে রাখুন</translation> +<translation id="7898627924844766532">টুলবারের মধ্যে রাখুন</translation> <translation id="7898725031477653577">সর্বদা অনুবাদ করুন</translation> <translation id="790040513076446191">গোপনীয়তা-সংক্রান্ত সেটিংস নিপূণভাবে ব্যবহার করুন</translation> <translation id="7902874111237641165">সহজ মোশন [বিটা]</translation> @@ -4855,7 +4852,7 @@ <translation id="854655314928502177">ওয়েব প্রক্সী স্বতঃআবিষ্কার URL:</translation> <translation id="8546930481464505581">টাচ বার কাস্টমাইজ করুন</translation> <translation id="8547013269961688403">ফুলস্ক্রিন ম্যাগনিফায়ার চালু করুন</translation> -<translation id="85486688517848470">সবথেকে উপরের-সারির কীগুলির আচরণ পরিবর্তন করতে সার্চ কী ধরে থাকুন</translation> +<translation id="85486688517848470">সবথেকে উপরের-সারির বোতামগুলির আচরণ পরিবর্তন করতে সার্চ বোতাম ধরে থাকুন</translation> <translation id="855081842937141170">ট্যাব পিন করুন</translation> <translation id="8551388862522347954">লাইসেন্সগুলি</translation> <translation id="8553342806078037065">অন্যান্য ব্যক্তিদের পরিচালনা করুন</translation> @@ -5241,7 +5238,7 @@ <translation id="9131598836763251128">এক বা একাধিক ফাইল নির্বাচন করুন৷</translation> <translation id="9133055936679483811">জিপ করা ব্যর্থ হয়েছে৷ <ph name="ERROR_MESSAGE" /></translation> <translation id="9134304429738380103">হ্যাঁ, আমি রাজি৷</translation> -<translation id="9134524245363717059">Macintosh সফ্টওয়্যার ব্যবহার করে এমন একটি কম্পিউটারের জন্য এই ফাইলটি ডিজাইন করা হয়েছে৷ Chrome OS দ্বারা চালিত আপনার ডিভাইসটির সাথে এটি সামঞ্জস্যপূর্ণ নয়৷ একটি উপযুক্ত প্রতিস্থাপনযোগ্য অ্যাপ্লিকেশানের জন্য দয়া করে Chrome ওয়েব স্টোর এ সার্চ করুন৷</translation> +<translation id="9134524245363717059">Macintosh সফ্টওয়্যার ব্যবহার করে এমন একটি কম্পিউটারের জন্য এই ফাইলটি ডিজাইন করা হয়েছে৷ Chrome OS দ্বারা চালিত আপনার ডিভাইসটির সাথে এটি সামঞ্জস্যপূর্ণ নয়৷ একটি উপযুক্ত প্রতিস্থাপনযোগ্য অ্যাপের জন্য অনুগ্রহ করে Chrome ওয়েব স্টোর-এ সার্চ করুন৷</translation> <translation id="9137013805542155359">প্রকৃত রূপ দেখান</translation> <translation id="9137916601698928395"><ph name="USER" /> হিসেবে লিঙ্ক খুলুন</translation> <translation id="9138978632494473300">নিম্নল্লিখিত স্থানগুলিতে শর্টকাটগুলি যোগ করুন:</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 7101614..d9cd90a 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Error desconegut.</translation> <translation id="119738088725604856">Finestra de captura de pantalla</translation> <translation id="1197979282329025000">S'ha produït un error en recuperar la capacitat de la impressora <ph name="PRINTER_NAME" />. Aquesta impressora no s'ha pogut registrar a <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Comencem</translation> <translation id="119944043368869598">Esborra-ho tot</translation> <translation id="1201402288615127009">Següent</translation> <translation id="1202596434010270079">L'aplicació Quiosc s'ha actualitzat. Extraieu la memòria USB.</translation> @@ -223,6 +222,7 @@ <translation id="1316136264406804862">S'està cercant...</translation> <translation id="1316495628809031177">La sincronització està en pausa</translation> <translation id="1319979322914001937">Una aplicació que mostra un llista filtrada de les extensions de Chrome Web Store. Les extensions de la llista es poden instal·lar directament des de l'aplicació.</translation> +<translation id="1322046419516468189">Consulta i gestiona les contrasenyes desades a <ph name="SAVED_PASSWORDS_STORE" /></translation> <translation id="1326317727527857210">Inicieu la sessió a Chrome per accedir a les vostres pestanyes des dels altres dispositius que tingueu.</translation> <translation id="1327074568633507428">Impressora a Google Cloud Print</translation> <translation id="1327977588028644528">Passarel·la</translation> @@ -420,11 +420,13 @@ <translation id="1618268899808219593">Centre d'ajuda</translation> <translation id="162035744160882748">Activa la sincronització, la personalització i altres serveis de Google</translation> <translation id="1620510694547887537">Càmera</translation> +<translation id="1623132449929929218">En aquests moments les imatges no estan disponibles. Torna't a connectar a Internet per veure les col·leccions de fons de pantalla.</translation> <translation id="1624026626836496796">Només caldrà que ho feu una vegada i les vostres credencials no s'emmagatzemaran.</translation> <translation id="1627276047960621195">Descriptors dels fitxers</translation> <translation id="1627408615528139100">Ja s'ha baixat</translation> <translation id="1632803087685957583">Permet ajustar la freqüència de repetició del teclat, la predicció de paraules i molt més</translation> <translation id="1635033183663317347">Extensió instal·lada pel tutor.</translation> +<translation id="1635885551358739414">Google pot utilitzar contingut dels llocs web que visites, així com l'activitat i les interaccions del navegador per personalitzar Chrome i altres serveis de Google, com ara el Traductor, la Cerca i els anuncis. Pots personalitzar aquesta opció a Configuració.</translation> <translation id="1637224376458524414">Accedeix a aquesta adreça d'interès des del teu iPhone</translation> <translation id="1637765355341780467">S'ha produït un error mentre obries el perfil. És possible que algunes funcions no estiguin disponibles.</translation> <translation id="1639239467298939599">S'està carregant</translation> @@ -455,6 +457,7 @@ <translation id="166179487779922818">La contrasenya és massa curta.</translation> <translation id="1661867754829461514">Falta el PIN</translation> <translation id="16620462294541761">No s'ha pogut verificar la teva contrasenya. Torna-ho a provar.</translation> +<translation id="1662550410081243962">Desa i emplena les formes de pagament</translation> <translation id="166278006618318542">Algoritme de clau pública del subjecte</translation> <translation id="166439687370499867">No es pot canviar la configuració de la xarxa compartida</translation> <translation id="1665611772925418501">El fitxer no s'ha pogut modificar.</translation> @@ -464,6 +467,7 @@ <translation id="1673137583248014546"><ph name="URL" /> vol veure la marca i el model de la teva clau de seguretat</translation> <translation id="167832068858235403">menys vol.</translation> <translation id="1679068421605151609">Eines per a desenvolupadors</translation> +<translation id="1680849702532889074">S'ha produït un error en instal·lar l'aplicació Linux.</translation> <translation id="16815041330799488">No permetis que els llocs web vegin el text i les imatges copiats al porta-retalls</translation> <translation id="1682548588986054654">Finestra d'incògnit nova</translation> <translation id="168715261339224929">Per accedir a les adreces d'interès des de tots els dispositius, activa la sincronització.</translation> @@ -499,6 +503,7 @@ <translation id="1732215134274276513">No fixis les pestanyes</translation> <translation id="1734824808160898225">És possible que <ph name="PRODUCT_NAME" /> no pugui actualitzar-se tot sol</translation> <translation id="1736419249208073774">Explora</translation> +<translation id="1736827427463982819">Tanca Linux (versió beta)</translation> <translation id="1737968601308870607">Arxiva l'error</translation> <translation id="1741314857973421784">Continua</translation> <translation id="174173592514158117">Mostra totes les carpetes de Play</translation> @@ -671,6 +676,7 @@ <translation id="1997484222658892567"><ph name="URL" /> vol emmagatzemar una gran quantitat de dades a l'ordinador local de manera permanent</translation> <translation id="1997616988432401742">Els meus certificats</translation> <translation id="1999115740519098545">A l'inici</translation> +<translation id="2000419248597011803">Envia al motor de cerca predeterminat algunes galetes i cerques de la barra d'adreces i del quadre de cerca</translation> <translation id="2001796770603320721">Gestiona a Drive</translation> <translation id="2004663115385769400">No es pot obrir amb $1</translation> <translation id="200544492091181894">Pots canviar aquesta opció més endavant a la configuració</translation> @@ -697,6 +703,7 @@ <translation id="2045969484888636535">Continua bloquejant les galetes</translation> <translation id="204622017488417136">Es restablirà la versió de Chrome que hi havia instal·lada anteriorment al dispositiu. S'eliminaran tots els comptes d'usuari i les dades desades al dispositiu. Aquesta acció no es pot desfer.</translation> <translation id="2048182445208425546">Accedir al trànsit de xarxa</translation> +<translation id="2048653237708779538">Acció no disponible</translation> <translation id="204914487372604757">Crea la drecera</translation> <translation id="2050339315714019657">Vertical</translation> <translation id="2053312383184521053">Dades de l'estat d'inactivitat</translation> @@ -785,6 +792,7 @@ <translation id="2178098616815594724">El connector <ph name="PEPPER_PLUGIN_NAME" /> del lloc web <ph name="PEPPER_PLUGIN_DOMAIN" /> vol accedir a l'ordinador</translation> <translation id="2178614541317717477">Compromís de CA</translation> <translation id="218070003709087997">Utilitza un número per indicar quantes còpies vols imprimir (entre 1 i 999).</translation> +<translation id="2183558561014688873">Accedeix a l'Assistent en qualsevol moment dient "Ok Google" amb el dispositiu actiu i desbloquejat.</translation> <translation id="2187895286714876935">Error d'importació del certificat del servidor</translation> <translation id="2187906491731510095">S'han actualitzat les extensions</translation> <translation id="2188881192257509750">Obre <ph name="APPLICATION" /></translation> @@ -856,6 +864,7 @@ <translation id="2282146716419988068">Procés de GPU</translation> <translation id="2282155092769082568">URL de configuració automàtica:</translation> <translation id="2283117145434822734">F6</translation> +<translation id="2283340219607151381">Desa i emplena les adreces</translation> <translation id="2286841657746966508">Adreça de facturació</translation> <translation id="2288181517385084064">Canvia a la gravadora de vídeo</translation> <translation id="2288735659267887385">Configuració d'accessibilitat</translation> @@ -937,6 +946,7 @@ <translation id="2425665904502185219">Mida total dels fitxers</translation> <translation id="2428510569851653187">Descriu què feies quan la pestanya s'ha bloquejat</translation> <translation id="2431027948063157455">L'Assistent de Google no s'ha pogut carregar. Comprova la connexió a Internet i tornar-ho a provar.</translation> +<translation id="2432753757290432042">Cal actualitzar Linux (versió beta)</translation> <translation id="2433452467737464329">Afegiu un paràmetre de consulta a l'URL per actualitzar la pàgina automàticament: chrome://network/?refresh=<seg.></translation> <translation id="2433507940547922241">Aparença</translation> <translation id="2433836460518180625">Desbloqueja només el dispositiu</translation> @@ -1185,6 +1195,7 @@ <translation id="2775104091073479743">Edita les empremtes digitals</translation> <translation id="2776441542064982094">Sembla que no hi ha cap dispositiu disponible per registrar-lo a la xarxa. Si el vostre dispositiu està encès i connectat a Internet, proveu de registrar-lo seguint les instruccions del manual.</translation> <translation id="2781692009645368755">Google Pay</translation> +<translation id="2782104745158847185">S'ha produït un error en instal·lar l'aplicació Linux</translation> <translation id="2783298271312924866">Baixat</translation> <translation id="2783321960289401138">Crea una drecera...</translation> <translation id="2783829359200813069">Selecciona els tipus d'encriptació</translation> @@ -1209,6 +1220,7 @@ <translation id="2812944337881233323">Tanca la sessió i torna-la a iniciar</translation> <translation id="2812989263793994277">No mostris cap imatge</translation> <translation id="2814489978934728345">Atura la càrrega d'aquesta pàgina</translation> +<translation id="281504910091592009">Consulta i gestiona les contrasenyes desades al <ph name="BEGIN_LINK" />Compte de Google<ph name="END_LINK" /></translation> <translation id="2815500128677761940">Barra d'adreces d'interès</translation> <translation id="2815693974042551705">Carpeta d'adreces d'interès</translation> <translation id="2818476747334107629">Detalls de la impressora</translation> @@ -1289,6 +1301,7 @@ <translation id="2939938020978911855">Mostra els dispositius Bluetooth disponibles</translation> <translation id="2941112035454246133">Baixa</translation> <translation id="2942560570858569904">S'està esperant...</translation> +<translation id="2942581856830209953">Personalitza aquesta pàgina</translation> <translation id="2943400156390503548">Diapositives</translation> <translation id="2943503720238418293">Utilitza un nom més curt</translation> <translation id="2946119680249604491">Afegeix una connexió</translation> @@ -1774,6 +1787,7 @@ <translation id="3693415264595406141">Contrasenya:</translation> <translation id="3694027410380121301">Selecciona la pestanya anterior</translation> <translation id="3699624789011381381">Adreça electrònica</translation> +<translation id="3699920817649120894">Vols desactivar la sincronització i la personalització?</translation> <translation id="3700888195348409686">S'està presentant (<ph name="PAGE_ORIGIN" />)</translation> <translation id="3702500414347826004">Les pàgines d'inici han canviat per incloure <ph name="URL" />.</translation> <translation id="370415077757856453">S'ha bloquejat JavaScript</translation> @@ -1871,6 +1885,7 @@ <translation id="3827774300009121996">&Pantalla completa</translation> <translation id="3828029223314399057">Cerca adreces d'interès</translation> <translation id="3830674330436234648">No hi ha cap reproducció disponible</translation> +<translation id="3831436149286513437">Suggeriments de cerca de Google Drive</translation> <translation id="3831486154586836914">Heu entrat al mode de visió general de la finestra.</translation> <translation id="383161972796689579">El propietari d'aquest dispositiu ha desactivat la possibilitat d'afegir-hi usuaris nous</translation> <translation id="3834775135533257713">No s'ha pogut afegir l'aplicació <ph name="TO_INSTALL_APP_NAME" /> perquè entra en conflicte amb <ph name="INSTALLED_APP_NAME" />.</translation> @@ -1904,6 +1919,7 @@ <translation id="3871092408932389764">El més baix</translation> <translation id="3872220884670338524">Més accions, compte desat per a <ph name="USERNAME" /> a <ph name="DOMAIN" /></translation> <translation id="3872991219937722530">Allibera espai al disc o el dispositiu deixarà de respondre.</translation> +<translation id="3873315167136380065">Si vols activar aquesta opció, <ph name="BEGIN_LINK" />restableix la sincronització<ph name="END_LINK" /> per suprimir la frase de contrasenya de sincronització</translation> <translation id="3878840326289104869">S'està creant un usuari supervisat</translation> <translation id="3879748587602334249">Gestor de baixades</translation> <translation id="3880709822663530586">La clau de seguretat només funciona quan el Bluetooth del dispositiu està activat</translation> @@ -2026,6 +2042,7 @@ <translation id="4068776064906523561">Empremtes digitals desades</translation> <translation id="407173827865827707">En fer clic</translation> <translation id="4071770069230198275"><ph name="PROFILE_NAME" />: error d'inici de sessió</translation> +<translation id="4071828814509176232">Ok Google</translation> <translation id="4074900173531346617">Certificat del signant del correu electrònic</translation> <translation id="407520071244661467">Canvia l'escala</translation> <translation id="4075639477629295004">No es pot emetre <ph name="FILE_NAME" /></translation> @@ -2093,6 +2110,7 @@ <translation id="4192273449750167573">Revisa la configuració a la pantalla següent</translation> <translation id="4193154014135846272">Document de Google</translation> <translation id="4194570336751258953">Activa la funció de tocar per fer clic</translation> +<translation id="4195249722193633765">Instal·la l'aplicació Linux (versió beta)</translation> <translation id="4195643157523330669">Obre en una pestanya nova</translation> <translation id="4195814663415092787">Continua des d'on ho vaig deixar</translation> <translation id="4197674956721858839">Selecció de ZIP</translation> @@ -2153,7 +2171,9 @@ <translation id="428608937826130504">Objecte de prestatge 8</translation> <translation id="4287502004382794929">No teniu prou llicències de programari per registrar aquest dispositiu. Contacteu amb l'equip de vendes per comprar-ne més. Si creieu que veieu aquest missatge per error, poseu-vos en contacte amb el servei d'assistència.</translation> <translation id="4289540628985791613">Descripció general</translation> +<translation id="4295072614469448764">L'aplicació està disponible al terminal. També pot haver-hi una icona al menú d'aplicacions.</translation> <translation id="4296575653627536209">Afegeix un usuari supervisat</translation> +<translation id="4297219207642690536">Reinicia i restableix</translation> <translation id="4297322094678649474">Canvia els idiomes</translation> <translation id="4300305918532693141">Per canviar aquesta configuració, <ph name="BEGIN_LINK" />restableix la sincronització<ph name="END_LINK" />.</translation> <translation id="4305227814872083840">llarg (2 s)</translation> @@ -2189,6 +2209,7 @@ <translation id="4370975561335139969">El correu electrònic i la contrasenya indicats no coincideixen</translation> <translation id="437184764829821926">Configuració avançada de tipus de lletra</translation> <translation id="4372884569765913867">1 x 1</translation> +<translation id="4374831787438678295">Instal·lador de Linux</translation> <translation id="4375035964737468845">Obrir fitxers baixats</translation> <translation id="4377363674125277448">S'ha produït un problema amb el certificat del servidor.</translation> <translation id="4378154925671717803">Telèfon</translation> @@ -2307,6 +2328,7 @@ <translation id="4576541033847873020">Vincula un dispositiu Bluetooth</translation> <translation id="4579581181964204535">No es pot emetre <ph name="HOST_NAME" />.</translation> <translation id="4580526846085481512">Confirmes que vols suprimir $1 elements?</translation> +<translation id="4582497162516204941">Instal·la Linux (versió beta)</translation> <translation id="4582563038311694664">Restableix tota la configuració</translation> <translation id="4585793705637313973">Edita la pàgina</translation> <translation id="4589268276914962177">Terminal nou</translation> @@ -2551,6 +2573,7 @@ <translation id="4953808748584563296">Avatar taronja predeterminat</translation> <translation id="4955814292505481804">Anual</translation> <translation id="4957949153200969297">Activa només funcions relacionades amb Sincronització de <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> +<translation id="4959262764292427323">Les contrasenyes es desen al Compte de Google perquè les puguis utilitzar en tots els dispositius</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" />: <ph name="PROFILE_NAME" /></translation> <translation id="4961000125720751066">Aplega les targetes en un sol lloc</translation> <translation id="496226124210045887">La carpeta que heu seleccionat conté fitxers confidencials. Confirmes que vols concedir a "$1" accés de lectura permanent en aquesta carpeta?</translation> @@ -2732,6 +2755,7 @@ <translation id="5240817131241497236">La configuració que controla la sincronització, la personalització i altres serveis de Google a Chrome ha canviat. Això pot afectar la teva configuració actual.</translation> <translation id="5241128660650683457">Llegir totes les dades dels llocs web que es visitin</translation> <translation id="5242724311594467048">Vols activar "<ph name="EXTENSION_NAME" />"?</translation> +<translation id="5243522832766285132">Torna-ho a provar d'aquí a una estona</translation> <translation id="5244474230056479698">S'està sincronitzant amb <ph name="EMAIL" /></translation> <translation id="5246282308050205996"><ph name="APP_NAME" /> ha deixat de funcionar. Feu clic en aquest globus per reiniciar l'aplicació.</translation> <translation id="5247051749037287028">Nom de visualització (opcional)</translation> @@ -2754,6 +2778,7 @@ <translation id="5264148714798105376">Aquesta acció pot tardar més o menys un minut.</translation> <translation id="5264252276333215551">Connecteu-vos a Internet per iniciar l'aplicació en el mode quiosc.</translation> <translation id="5265562206369321422">Fora de línia des de fa més d'una setmana</translation> +<translation id="5265797726250773323">S'ha produït un error durant la instal·lació</translation> <translation id="5266113311903163739">Error d'importació de l'entitat emissora de certificats</translation> <translation id="5269977353971873915">Error d'impressió</translation> <translation id="5271549068863921519">Desa la contrasenya</translation> @@ -2776,6 +2801,7 @@ <translation id="529175790091471945">Formata aquest dispositiu</translation> <translation id="5292195676005197571">Per fer servir la majoria de les claus, només cal prémer el botó</translation> <translation id="5293170712604732402">Restableix la configuració als valors predeterminats originals</translation> +<translation id="5297082477358294722">S'ha desat la contrasenya. Consulta i gestiona les contrasenyes desades a <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5298219193514155779">Tema creat per</translation> <translation id="5299109548848736476">Opció de no seguiment</translation> <translation id="5299682071747318445">Totes les dades s'encripten amb la vostra frase de contrasenya de sincronització</translation> @@ -3004,6 +3030,7 @@ <translation id="5612720917913232150"><ph name="URL" /> vol utilitzar la ubicació de l'ordinador</translation> <translation id="5612734644261457353">Encara no s'ha pogut verificar la contrasenya. Nota: Si l'has canviat fa poc, la contrasenya nova s'aplicarà un cop hagis tancat la sessió. Fes servir la contrasenya anterior aquí.</translation> <translation id="5614190747811328134">Avís per a l'usuari </translation> +<translation id="5614553682702429503">Vols desar la contrasenya?</translation> <translation id="561698261642843490">Tanca Firefox</translation> <translation id="5618075537869101857">No s'ha pogut iniciar l'aplicació de quiosc.</translation> <translation id="5618333180342767515">(això pot trigar una estona)</translation> @@ -3045,6 +3072,7 @@ <translation id="5677503058916217575">Idioma de la pàgina:</translation> <translation id="5677928146339483299">Bloquejades</translation> <translation id="5678550637669481956">S'ha concedit accés de lectura i d'escriptura a <ph name="VOLUME_NAME" />.</translation> +<translation id="5678784840044122290">L'aplicació Linux estarà disponible al terminal i és possible que també inclogui una icona al menú d'aplicacions.</translation> <translation id="5678955352098267522">Llegir les dades del lloc <ph name="WEBSITE_1" /></translation> <translation id="5684661240348539843">Identificador d'elements</translation> <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />No es pot desconnectar d'un arxiu o d'un disc virtual<ph name="END_BOLD" /> @@ -3140,6 +3168,7 @@ <translation id="5832805196449965646">Afegeix una persona</translation> <translation id="583281660410589416">Desconegut</translation> <translation id="5832976493438355584">Bloquejat</translation> +<translation id="5833397272224757657">Per a la personalització, utilitza el contingut dels llocs web que visites, així com l'activitat i les interaccions del navegador</translation> <translation id="5833610766403489739">Aquest fitxer s'ha extraviat en algun lloc. Comproveu el paràmetre d'ubicació de les baixades i torneu-ho a provar.</translation> <translation id="5833726373896279253">Només el propietari d'aquesta configuració la pot modificar:</translation> <translation id="5834581999798853053">Queda cosa de <ph name="TIME" /> minuts</translation> @@ -3193,6 +3222,7 @@ <translation id="5908769186679515905">Impedeix que els llocs executin Flash</translation> <translation id="5910363049092958439">De&sa la imatge com a...</translation> <translation id="5911737117543891828">Els fitxers temporals sense connexió de Google Drive se suprimiran. Els fitxers que hagis definit com a disponibles sense connexió no se suprimiran del dispositiu.</translation> +<translation id="5911887972742538906">S'ha produït un error en instal·lar l'aplicació Linux.</translation> <translation id="5912378097832178659">&Edita els motors de cerca...</translation> <translation id="5914724413750400082">Mòdul (<ph name="MODULUS_NUM_BITS" /> bits): <ph name="MODULUS_HEX_DUMP" /> @@ -3379,6 +3409,7 @@ <translation id="6198102561359457428">Tanca la sessió i torna-la a iniciar...</translation> <translation id="6198252989419008588">Canvia el PIN</translation> <translation id="6199801702437275229">S'està esperant per rebre informació sobre l'espai...</translation> +<translation id="6201792273624501289">Aplicacions per a Linux</translation> <translation id="6204015976622790023">Consulta suggeriments rellevants de l'Assistent relacionats amb el que es mostra a la pantalla.</translation> <translation id="6205710420833115353">Algunes operacions estan tardant més del que estava previst. Voleu cancel·lar-les?</translation> <translation id="6206311232642889873">Cop&ia la imatge</translation> @@ -3854,6 +3885,7 @@ <translation id="6945221475159498467">Selecciona</translation> <translation id="694592694773692225">S'ha bloquejat la redirecció en aquesta pàgina.</translation> <translation id="6949306908218145636">Afegeix les pàgines obertes a les adreces d'interès...</translation> +<translation id="6950627417367801484">Restaura les aplicacions</translation> <translation id="6951153907720526401">Gestors de pagament</translation> <translation id="6955446738988643816">Inspecciona l'element emergent</translation> <translation id="6957231940976260713">Nom del servei</translation> @@ -3979,6 +4011,7 @@ <translation id="7127980134843952133">Historial de baixades</translation> <translation id="7131040479572660648">Llegir les dades dels llocs <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" /></translation> <translation id="713122686776214250">Afegeix la pà&gina...</translation> +<translation id="7133578150266914903">L'administrador vol revertir el dispositiu a una versió anterior (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="7134098520442464001">Fa el text més petit</translation> <translation id="7136694880210472378">Estableix com a predeterminat</translation> <translation id="7136984461011502314">Benvingut a <ph name="PRODUCT_NAME" /></translation> @@ -4154,7 +4187,6 @@ <translation id="7410344089573941623">Pregunta si <ph name="HOST" /> vol accedir a la càmera i al micròfon</translation> <translation id="741204030948306876">Sí, ho accepto</translation> <translation id="7412226954991670867">Memòria de la GPU</translation> -<translation id="7413455776853560343">Personalitza el fons</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Error de xarxa desconegut.</translation> <translation id="7417705661718309329">Mapa de Google</translation> @@ -4180,6 +4212,7 @@ <translation id="7463006580194749499">Afegeix una persona</translation> <translation id="7464490149090366184">S'ha produït un error en la compressió; l'element existeix: "$1"</translation> <translation id="7465778193084373987">URL de revocació de certificats de Netscape</translation> +<translation id="7469406957790636836">Per activar aquesta funció, activa primer el corrector ortogràfic a <ph name="BEGIN_LINK" />Idiomes i introducció de text<ph name="END_LINK" /></translation> <translation id="7469894403370665791">Connecta automàticament a aquesta xarxa</translation> <translation id="747114903913869239">Error: no s'ha pogut descodificar l'extensió</translation> <translation id="7473753388963818366">Deixem <ph name="DEVICE_TYPE" /> a punt</translation> @@ -4275,6 +4308,7 @@ <translation id="7606992457248886637">Entitats emissores</translation> <translation id="7607002721634913082">En pausa</translation> <translation id="7607274158153386860">Sol·licita el lloc per a la tauleta</translation> +<translation id="7609148976235050828">Connecta't a Internet i torna-ho a provar.</translation> <translation id="7611008212562900400">Cerca al dispositiu, en aplicacions, al web...</translation> <translation id="7616214729753637086">S'està registrant el dispositiu...</translation> <translation id="7617366389578322136">S'està connectant al dispositiu <ph name="DEVICE_NAME" /></translation> @@ -4343,6 +4377,7 @@ <translation id="7730449930968088409">Captura del contingut de la pantalla</translation> <translation id="7730494089396812859">Mostra els detalls de la còpia de seguretat a Cloud</translation> <translation id="7732111077498238432">La xarxa està controlada per una política</translation> +<translation id="7737238973539693982">Suprimeix Linux (versió beta)</translation> <translation id="773905249182896430">Et protegeix i protegeix el teu dispositiu de llocs web perillosos</translation> <translation id="7740996059027112821">Estàndard</translation> <translation id="7748528009589593815">Pestanya anterior</translation> @@ -4353,7 +4388,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ajusta els límits de la pantalla</translation> <translation id="7760004034676677601">Aquesta pàgina d'inici és la que esperàveu?</translation> -<translation id="7760756088376329221">Selecciona un àlbum de Google Fotos</translation> <translation id="7764225426217299476">Afegeix una adreça</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> del domini <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Mou</translation> @@ -4533,6 +4567,7 @@ <translation id="7974936243149753750">Ajusta la mida</translation> <translation id="7977551819349545646">S'està actualitzant Chromebox...</translation> <translation id="7978412674231730200">Clau privada</translation> +<translation id="7978450511781612192">Aquesta acció tancarà la sessió dels Comptes de Google. Les adreces d'interès, l'historial, les contrasenyes i altres opcions es deixaran de sincronitzar.</translation> <translation id="7979036127916589816">Error de sincronització</translation> <translation id="7980084013673500153">Identificador de l'element: <ph name="ASSET_ID" /></translation> <translation id="7981313251711023384">Carrega les pàgines prèviament per poder-hi navegar i fer cerques més de pressa</translation> @@ -4697,6 +4732,7 @@ <translation id="8226619461731305576">Cua</translation> <translation id="8226742006292257240">A continuació, trobareu la contrasenya de TPM generada aleatòriament que s'ha assignat al vostre ordinador:</translation> <translation id="8227119283605456246">Adjunta un fitxer</translation> +<translation id="8230134520748321204">Vols desar la contrasenya per a <ph name="ORIGIN" />?</translation> <translation id="8234795456569844941">Ajuda els nostres enginyers a solucionar aquest problema. Explica'ns què ha passat just abans de rebre el missatge d'error del perfil:</translation> <translation id="8234989666557591529">Tria un telèfon per desbloquejar <ph name="DEVICE_TYPE" /></translation> <translation id="8239020549147958415">Sincronitza com a <ph name="FULL_NAME" /></translation> @@ -4815,6 +4851,7 @@ <translation id="8438328416656800239">Canvia a un navegador intel·ligent</translation> <translation id="8438566539970814960">Millora les cerques i la navegació</translation> <translation id="8439506636278576865">Proposa'm traduir pàgines en aquest idioma</translation> +<translation id="8440630305826533614">Aplicacions per a Linux</translation> <translation id="8446884382197647889">Més informació</translation> <translation id="8447409163267621480">Inclou la tecla Ctrl o Alt</translation> <translation id="8448729345478502352">Amplia o redueix els elements de la pantalla</translation> @@ -4859,6 +4896,7 @@ <translation id="8497219075884839166">Utilitats per a Windows</translation> <translation id="8498214519255567734">Facilita mirar la pantalla o llegir-hi amb poca llum</translation> <translation id="8498395510292172881">Continua llegint una pàgina web a Chrome</translation> +<translation id="8502536196501630039">Per poder utilitzar aplicacions de Google Play, primer has de restaurar les teves aplicacions. És possible que algunes dades s'hagin perdut.</translation> <translation id="8503813439785031346">Nom d'usuari</translation> <translation id="850875081535031620">No s'ha trobat programari maliciós</translation> <translation id="8509646642152301857">La baixada del diccionari del corrector ortogràfic ha fallat.</translation> @@ -4988,6 +5026,7 @@ <translation id="8698464937041809063">Dibuix de Google</translation> <translation id="869884720829132584">Menú d'aplicacions</translation> <translation id="869891660844655955">Data de caducitat</translation> +<translation id="8699566574894671540">Per activar aquesta funció, selecciona primer Comprova l'ortografia mentre escric al menú Edita</translation> <translation id="870073306461175568">Ús compartit dels fitxers de la xarxa</translation> <translation id="8701677791353449257">El nom del dispositiu ha de coincidir amb l'expressió regular <ph name="REGEX" />.</translation> <translation id="8704521619148782536">El procés triga més del que és habitual. Podeu esperar o cancel·lar-lo i tornar-ho a provar més tard.</translation> @@ -5027,6 +5066,7 @@ <p>Encara podeu configurar-lo mitjançant la línia d'ordres. Consulteu <code>man <ph name="PRODUCT_BINARY_NAME" /></code> per obtenir més informació sobre indicadors i sobre variables d'entorn.</p></translation> <translation id="8755376271068075440">&Més gran</translation> +<translation id="8756969031206844760">Vols actualitzar la contrasenya?</translation> <translation id="8757090071857742562">No es pot emetre l'escriptori. Comproveu si heu confirmat el missatge per començar a compartir la pantalla.</translation> <translation id="8757640015637159332">Entrada a sessió pública</translation> <translation id="8757742102600829832">Seleccioneu un dispositiu Chromebox al qual us vulgueu connectar</translation> @@ -5183,7 +5223,9 @@ <translation id="9009369504041480176">S'està carregant (<ph name="PROGRESS_PERCENT" />%)...</translation> <translation id="9011163749350026987">Mostra sempre la icona</translation> <translation id="9011178328451474963">Darrera pestanya</translation> +<translation id="9013707997379828817">L'administrador ha revertit el dispositiu a una versió anterior. Desa els fitxers importants i, després, reinicia el dispositiu. Se'n suprimiran totes les dades.</translation> <translation id="9014987600015527693">Mostra un altre telèfon</translation> +<translation id="9018218886431812662">La instal·lació s'ha completat</translation> <translation id="901834265349196618">correu electrònic</translation> <translation id="9019062154811256702">Llegiu i canvieu la configuració d'Emplenament automàtic</translation> <translation id="9020362265352758658">4x</translation> @@ -5207,6 +5249,7 @@ <translation id="9038649477754266430">Utilitza un servei de predicció per poder carregar les pàgines més ràpidament</translation> <translation id="9039663905644212491">PEAP</translation> <translation id="9039890312082871605">Silenciar les pestanyes</translation> +<translation id="9040661932550800571">Vols actualitzar la contrasenya per a <ph name="ORIGIN" />?</translation> <translation id="9041692268811217999">L'administrador ha desactivat l'accés als fitxers locals de l'ordinador</translation> <translation id="9042893549633094279">Privadesa i seguretat</translation> <translation id="904451693890288097">Introduïu la contrasenya per a "<ph name="DEVICE_NAME" />":</translation> @@ -5311,6 +5354,7 @@ <translation id="9203478404496196495">Activa el so de la pestanya</translation> <translation id="9203904171912129171">Selecciona un dispositiu</translation> <translation id="9203962528777363226">L'administrador d'aquest dispositiu ha desactivat la possibilitat d'afegir-hi usuaris nous</translation> +<translation id="9213073329713032541">La instal·lació s'ha iniciat.</translation> <translation id="9214520840402538427">La inicialització dels atributs en temps d'instal·lació ha esgotat el temps d'espera. Contacteu amb el representant d'assistència.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">S'ha afegit "<ph name="EXTENSION_NAME" />"</translation> @@ -5365,6 +5409,7 @@ <translation id="988978206646512040">No es permeten les frases de contrasenya buides</translation> <translation id="992032470292211616">Les extensions, les aplicacions i els temes poden malmetre el vostre dispositiu. Confirmeu que voleu continuar?</translation> <translation id="992592832486024913">Desactiva ChromeVox (comentaris de veu)</translation> +<translation id="993540765962421562">Instal·lació en curs</translation> <translation id="994289308992179865">&Bucle</translation> <translation id="996250603853062861">S'està establint una connexió segura...</translation> <translation id="998747458861718449">I&nspecciona</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index d303fb6..148a16a 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Neznámá chyba.</translation> <translation id="119738088725604856">Snímek okna</translation> <translation id="1197979282329025000">Při načítání funkcí tiskárny <ph name="PRINTER_NAME" /> se vyskytla chyba. Tato tiskárna nemůže být zaregistrována do služby <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Začínáme</translation> <translation id="119944043368869598">Vymazat vše</translation> <translation id="1201402288615127009">Další</translation> <translation id="1202596434010270079">Terminálová aplikace byla aktualizována. Vyjměte jednotku USB.</translation> @@ -4151,7 +4150,6 @@ <translation id="7410344089573941623">Zobrazit dotaz, pokud bude chtít web <ph name="HOST" /> používat webovou kameru a mikrofon</translation> <translation id="741204030948306876">Ano</translation> <translation id="7412226954991670867">Paměť GPU</translation> -<translation id="7413455776853560343">Přizpůsobit pozadí</translation> <translation id="7414464185801331860">18×</translation> <translation id="7416362041876611053">Neznámá chyba sítě.</translation> <translation id="7417705661718309329">Mapa Google</translation> @@ -4350,7 +4348,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Úprava ohraničení zobrazení</translation> <translation id="7760004034676677601">Je toto počáteční stránka, kterou jste očekávali?</translation> -<translation id="7760756088376329221">Vyberte album ve Fotkách Google</translation> <translation id="7764225426217299476">Přidat adresu</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> z <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Přesunout</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index b703f347..20af611 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Ukendt fejl.</translation> <translation id="119738088725604856">Tag screenshot af vindue</translation> <translation id="1197979282329025000">Der opstod en fejl under hentningen af udskriftsegenskaber for printeren <ph name="PRINTER_NAME" />. Denne printer kunne ikke registreres med <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Lad os komme i gang</translation> <translation id="119944043368869598">Ryd alle</translation> <translation id="1201402288615127009">Næste</translation> <translation id="1202596434010270079">Terminalappen er blevet opdateret. Fjern USB-stikket.</translation> @@ -4154,7 +4153,6 @@ <translation id="7410344089573941623">Spørg, hvis <ph name="HOST" /> vil have adgang til dit kamera og din mikrofon</translation> <translation id="741204030948306876">Ja tak</translation> <translation id="7412226954991670867">GPU-hukommelse</translation> -<translation id="7413455776853560343">Tilpas baggrund</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Ukendt netværksfejl.</translation> <translation id="7417705661718309329">Google-kort</translation> @@ -4355,7 +4353,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Tilpas grænserne for din skærm</translation> <translation id="7760004034676677601">Var det den opstartsside, du havde forventet?</translation> -<translation id="7760756088376329221">Vælg et Google Fotos-album</translation> <translation id="7764225426217299476">Tilføj adresse</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> fra <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Flyt</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index c7cea0e..bcc6060 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Unbekannter Fehler.</translation> <translation id="119738088725604856">Screenshot von Fenster</translation> <translation id="1197979282329025000">Beim Abrufen der Druckerfunktionen für Drucker "<ph name="PRINTER_NAME" />" ist ein Fehler aufgetreten. Dieser Drucker konnte nicht mit <ph name="CLOUD_PRINT_NAME" /> registriert werden.</translation> -<translation id="1198271701881992799">Erste Schritte</translation> <translation id="119944043368869598">Alle löschen</translation> <translation id="1201402288615127009">Weiter</translation> <translation id="1202596434010270079">Die Kiosk-App wurde aktualisiert. Bitte entfernen Sie den USB-Stick.</translation> @@ -4151,7 +4150,6 @@ <translation id="7410344089573941623">Nachfragen, wenn <ph name="HOST" /> auf Kamera und Mikrofon zugreifen möchte</translation> <translation id="741204030948306876">Ja, bitte</translation> <translation id="7412226954991670867">GPU-Speicher</translation> -<translation id="7413455776853560343">Hintergrund anpassen</translation> <translation id="7414464185801331860">18-fach</translation> <translation id="7416362041876611053">Unbekannter Netzwerkfehler</translation> <translation id="7417705661718309329">Google-Karte</translation> @@ -4352,7 +4350,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Bildschirmbegrenzungen anpassen</translation> <translation id="7760004034676677601">Ist das Ihre erwartete "Beim Start"-Seite?</translation> -<translation id="7760756088376329221">Google Fotos-Album auswählen</translation> <translation id="7764225426217299476">Adresse hinzufügen</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> von <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Verschieben</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 5115693..1069f0c9 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Άγνωστο σφάλμα.</translation> <translation id="119738088725604856">Παράθυρο στιγμιότυπου οθόνης</translation> <translation id="1197979282329025000">Προέκυψε σφάλμα κατά την ανάκτηση των δυνατοτήτων του εκτυπωτή <ph name="PRINTER_NAME" />. Δεν ήταν δυνατή η καταχώριση αυτού του εκτυπωτή στο <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Έναρξη</translation> <translation id="119944043368869598">Διαγραφή όλων</translation> <translation id="1201402288615127009">Επόμενο</translation> <translation id="1202596434010270079">Η εφαρμογή kiosk έχει ενημερωθεί. Αφαιρέστε τη συσκευή σας USB.</translation> @@ -4156,7 +4155,6 @@ <translation id="7410344089573941623">Ερώτηση εάν το <ph name="HOST" /> θέλει να αποκτήσει πρόσβαση στην κάμερα και στο μικρόφωνό σας</translation> <translation id="741204030948306876">Ναι, συμφωνώ</translation> <translation id="7412226954991670867">Μνήμη GPU</translation> -<translation id="7413455776853560343">Προσαρμογή φόντου</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Άγνωστο σφάλμα δικτύου.</translation> <translation id="7417705661718309329">Χάρτης Google</translation> @@ -4357,7 +4355,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Προσαρμόστε τα όρια της οθόνης σας</translation> <translation id="7760004034676677601">Είναι αυτή η σελίδα εκκίνησης που περιμένατε;</translation> -<translation id="7760756088376329221">Επιλέξτε ένα λεύκωμα Φωτογραφιών Google</translation> <translation id="7764225426217299476">Προσθήκη διεύθυνσης</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> από <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Μεταφορά</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 68b4f6a..0c10d124 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Unknown error.</translation> <translation id="119738088725604856">Screenshot window</translation> <translation id="1197979282329025000">An error occurred while retrieving printer capabilities for printer <ph name="PRINTER_NAME" />. This printer could not be registered with <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Let's get started</translation> <translation id="119944043368869598">Clear all</translation> <translation id="1201402288615127009">Next</translation> <translation id="1202596434010270079">Kiosk app has been updated. Please remove the USB stick.</translation> @@ -223,6 +222,7 @@ <translation id="1316136264406804862">Searching...</translation> <translation id="1316495628809031177">Sync is paused</translation> <translation id="1319979322914001937">An app that shows a filtered list of extensions from Chrome Web Store. Extensions in the list can be installed directly from the app.</translation> +<translation id="1322046419516468189">View and manage saved passwords in your <ph name="SAVED_PASSWORDS_STORE" /></translation> <translation id="1326317727527857210">To get your tabs from your other devices, sign in to Chrome.</translation> <translation id="1327074568633507428">Printer on Google Cloud Print</translation> <translation id="1327977588028644528">Gateway</translation> @@ -420,11 +420,13 @@ <translation id="1618268899808219593">Help Centre</translation> <translation id="162035744160882748">Turn on sync, personalisation and other Google services</translation> <translation id="1620510694547887537">Camera</translation> +<translation id="1623132449929929218">The images are currently unavailable. Please reconnect to the Internet to see wallpaper collections.</translation> <translation id="1624026626836496796">This will only happen once, and your credentials will not be stored.</translation> <translation id="1627276047960621195">File Descriptors</translation> <translation id="1627408615528139100">Already downloaded</translation> <translation id="1632803087685957583">Allows you to adjust your keyboard repeat rate, word prediction and more</translation> <translation id="1635033183663317347">Installed by your custodian.</translation> +<translation id="1635885551358739414">Google may use content on sites that you visit, plus browser activity and interactions, to personalise Chrome and other Google services such as Translate, Search and ads. You can customise this in Settings.</translation> <translation id="1637224376458524414">Get this bookmark on your iPhone</translation> <translation id="1637765355341780467">Something went wrong when opening your profile. Some features may be unavailable.</translation> <translation id="1639239467298939599">Loading</translation> @@ -455,6 +457,7 @@ <translation id="166179487779922818">Password is too short.</translation> <translation id="1661867754829461514">PIN missing</translation> <translation id="16620462294541761">Sorry, your password could not be verified. Please try again.</translation> +<translation id="1662550410081243962">Save and fill payment methods</translation> <translation id="166278006618318542">Subject Public Key Algorithm</translation> <translation id="166439687370499867">Changing shared network configurations is not allowed</translation> <translation id="1665611772925418501">The file could not be modified.</translation> @@ -464,6 +467,7 @@ <translation id="1673137583248014546"><ph name="URL" /> wants to see the make and model of your Security Key</translation> <translation id="167832068858235403">vol. down</translation> <translation id="1679068421605151609">Developer Tools</translation> +<translation id="1680849702532889074">An error occurred during installation of your Linux application.</translation> <translation id="16815041330799488">Do not allow sites to see text and images copied to the clipboard</translation> <translation id="1682548588986054654">New Incognito Window</translation> <translation id="168715261339224929">To get your bookmarks on all your devices, turn on sync.</translation> @@ -499,6 +503,7 @@ <translation id="1732215134274276513">Unpin Tabs</translation> <translation id="1734824808160898225"><ph name="PRODUCT_NAME" /> may not be able to keep itself updated</translation> <translation id="1736419249208073774">Explore</translation> +<translation id="1736827427463982819">Shut down Linux (Beta)</translation> <translation id="1737968601308870607">File bug</translation> <translation id="1741314857973421784">Continue</translation> <translation id="174173592514158117">Show all Play folders</translation> @@ -671,6 +676,7 @@ <translation id="1997484222658892567"><ph name="URL" /> wants to permanently store large data on your local computer</translation> <translation id="1997616988432401742">Your certificates</translation> <translation id="1999115740519098545">On start-up</translation> +<translation id="2000419248597011803">Sends some cookies and searches from the address bar and search box to your default search engine</translation> <translation id="2001796770603320721">Manage in Drive</translation> <translation id="2004663115385769400">Unable to open with $1</translation> <translation id="200544492091181894">You can always change this later in settings</translation> @@ -697,6 +703,7 @@ <translation id="2045969484888636535">Continue blocking cookies</translation> <translation id="204622017488417136">Your device will be returned to the previously installed version of Chrome. All user accounts and local data will be removed. This cannot be undone.</translation> <translation id="2048182445208425546">Access your network traffic</translation> +<translation id="2048653237708779538">Action not available</translation> <translation id="204914487372604757">Create shortcut</translation> <translation id="2050339315714019657">Portrait</translation> <translation id="2053312383184521053">Idle State Data</translation> @@ -785,6 +792,7 @@ <translation id="2178098616815594724"><ph name="PEPPER_PLUGIN_NAME" /> on <ph name="PEPPER_PLUGIN_DOMAIN" /> wants to access your computer</translation> <translation id="2178614541317717477">CA Compromise</translation> <translation id="218070003709087997">Use a number to indicate how many copies to print (1 to 999).</translation> +<translation id="2183558561014688873">Access your Assistant any time you say 'Ok Google' when your device is awake and unlocked.</translation> <translation id="2187895286714876935">Server Certificate Import Error</translation> <translation id="2187906491731510095">Extensions updated</translation> <translation id="2188881192257509750">Open <ph name="APPLICATION" /></translation> @@ -856,6 +864,7 @@ <translation id="2282146716419988068">GPU Process</translation> <translation id="2282155092769082568">Auto-configuration URL:</translation> <translation id="2283117145434822734">F6</translation> +<translation id="2283340219607151381">Save and fill addresses</translation> <translation id="2286841657746966508">Billing address</translation> <translation id="2288181517385084064">Switch to video recorder</translation> <translation id="2288735659267887385">Accessibility settings</translation> @@ -937,6 +946,7 @@ <translation id="2425665904502185219">Total file size</translation> <translation id="2428510569851653187">Describe what you were doing when the tab crashed</translation> <translation id="2431027948063157455">Google Assistant was unable to load. Please check your network connection and retry.</translation> +<translation id="2432753757290432042">Linux (Beta) update required</translation> <translation id="2433452467737464329">Add a query param in URL to auto-refresh the page: chrome://network/?refresh=<sec></translation> <translation id="2433507940547922241">Appearance</translation> <translation id="2433836460518180625">Unlock device only</translation> @@ -1185,6 +1195,7 @@ <translation id="2775104091073479743">Edit Fingerprints</translation> <translation id="2776441542064982094">Looks like there are no devices available to register on the network. If your device is on and connected to the internet, try registering it using instructions in its instruction manual.</translation> <translation id="2781692009645368755">Google Pay</translation> +<translation id="2782104745158847185">Error installing Linux application</translation> <translation id="2783298271312924866">Downloaded</translation> <translation id="2783321960289401138">Create shortcut...</translation> <translation id="2783829359200813069">Select encryption types</translation> @@ -1209,6 +1220,7 @@ <translation id="2812944337881233323">Try signing out and back in again</translation> <translation id="2812989263793994277">Do not show any images</translation> <translation id="2814489978934728345">Stop loading this page</translation> +<translation id="281504910091592009">View and manage saved passwords in your <ph name="BEGIN_LINK" />Google account<ph name="END_LINK" /></translation> <translation id="2815500128677761940">Bookmark bar</translation> <translation id="2815693974042551705">Bookmark folder</translation> <translation id="2818476747334107629">Printer details</translation> @@ -1289,6 +1301,7 @@ <translation id="2939938020978911855">Show available Bluetooth devices</translation> <translation id="2941112035454246133">Low</translation> <translation id="2942560570858569904">Waiting...</translation> +<translation id="2942581856830209953">Customise this page</translation> <translation id="2943400156390503548">Slides</translation> <translation id="2943503720238418293">Use a shorter name</translation> <translation id="2946119680249604491">Add connection</translation> @@ -1775,6 +1788,7 @@ <translation id="3693415264595406141">Password:</translation> <translation id="3694027410380121301">Select Previous Tab</translation> <translation id="3699624789011381381">Email address</translation> +<translation id="3699920817649120894">Turn off sync and personalisation?</translation> <translation id="3700888195348409686">Presenting (<ph name="PAGE_ORIGIN" />)</translation> <translation id="3702500414347826004">Your start-up pages were changed to include <ph name="URL" />.</translation> <translation id="370415077757856453">JavaScript blocked</translation> @@ -1872,6 +1886,7 @@ <translation id="3827774300009121996">&Full Screen</translation> <translation id="3828029223314399057">Search bookmarks</translation> <translation id="3830674330436234648">No playback available.</translation> +<translation id="3831436149286513437">Google Drive search suggestions</translation> <translation id="3831486154586836914">Entered window overview mode</translation> <translation id="383161972796689579">The owner of this device has disabled new users from being added</translation> <translation id="3834775135533257713">Could not add application "<ph name="TO_INSTALL_APP_NAME" />" because it conflicts with "<ph name="INSTALLED_APP_NAME" />".</translation> @@ -1905,6 +1920,7 @@ <translation id="3871092408932389764">Lowest</translation> <translation id="3872220884670338524">More actions, saved account for <ph name="USERNAME" /> on <ph name="DOMAIN" /></translation> <translation id="3872991219937722530">Free up disk space or device will become unresponsive.</translation> +<translation id="3873315167136380065">To turn this on, <ph name="BEGIN_LINK" />reset sync<ph name="END_LINK" /> to remove your sync passphrase</translation> <translation id="3878840326289104869">Creating supervised user</translation> <translation id="3879748587602334249">Download manager</translation> <translation id="3880709822663530586">Your security key only works when your device's Bluetooth is on</translation> @@ -2028,6 +2044,7 @@ <translation id="4068776064906523561">Saved fingerprints</translation> <translation id="407173827865827707">On click</translation> <translation id="4071770069230198275"><ph name="PROFILE_NAME" />: sign-in error</translation> +<translation id="4071828814509176232">Ok Google</translation> <translation id="4074900173531346617">Email Signer Certificate</translation> <translation id="407520071244661467">Scale</translation> <translation id="4075639477629295004">Unable to cast <ph name="FILE_NAME" />.</translation> @@ -2095,6 +2112,7 @@ <translation id="4192273449750167573">Review your settings on the next screen</translation> <translation id="4193154014135846272">Google document</translation> <translation id="4194570336751258953">Enable tap-to-click</translation> +<translation id="4195249722193633765">Install app with Linux (Beta)</translation> <translation id="4195643157523330669">Open in new tab</translation> <translation id="4195814663415092787">Continue where you left off</translation> <translation id="4197674956721858839">Zip selection</translation> @@ -2155,7 +2173,9 @@ <translation id="428608937826130504">Shelf item 8</translation> <translation id="4287502004382794929">You do not have enough software licenses to enrol this device. Please contact sales to purchase more. If you believe you're seeing this message in error, please contact support.</translation> <translation id="4289540628985791613">Overview</translation> +<translation id="4295072614469448764">App is available in your terminal. There may also be an icon in your Launcher.</translation> <translation id="4296575653627536209">Add Supervised User</translation> +<translation id="4297219207642690536">Restart and reset</translation> <translation id="4297322094678649474">Change Languages</translation> <translation id="4300305918532693141">To change this setting, <ph name="BEGIN_LINK" />reset sync<ph name="END_LINK" /></translation> <translation id="4305227814872083840">long (2s)</translation> @@ -2191,6 +2211,7 @@ <translation id="4370975561335139969">The email and password that you entered don't match.</translation> <translation id="437184764829821926">Advanced font settings</translation> <translation id="4372884569765913867">1 x 1</translation> +<translation id="4374831787438678295">Linux installer</translation> <translation id="4375035964737468845">Open downloaded files</translation> <translation id="4377363674125277448">There was a problem with server's certificate.</translation> <translation id="4378154925671717803">Phone</translation> @@ -2309,6 +2330,7 @@ <translation id="4576541033847873020">Pair Bluetooth device</translation> <translation id="4579581181964204535">Unable to cast <ph name="HOST_NAME" />.</translation> <translation id="4580526846085481512">Are you sure that you want to delete these $1 items?</translation> +<translation id="4582497162516204941">Install with Linux (Beta)</translation> <translation id="4582563038311694664">Reset all settings</translation> <translation id="4585793705637313973">Edit page</translation> <translation id="4589268276914962177">New terminal</translation> @@ -2552,6 +2574,7 @@ <translation id="4953808748584563296">Default orange avatar</translation> <translation id="4955814292505481804">Annual</translation> <translation id="4957949153200969297">Only enable features related to <ph name="IDS_SHORT_PRODUCT_NAME" /> Sync</translation> +<translation id="4959262764292427323">Passwords are saved in your Google account so that you can use them on any device</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> – <ph name="PROFILE_NAME" /></translation> <translation id="4961000125720751066">Have your cards in one place</translation> <translation id="496226124210045887">The folder that you selected contains sensitive files. Are you sure that you want to grant "$1" permanent read access to this folder?</translation> @@ -2732,6 +2755,7 @@ <translation id="5240817131241497236">The settings that control sync, personalisation and other Google services in Chrome have changed. This may affect your current settings.</translation> <translation id="5241128660650683457">Read all your data on the websites that you visit</translation> <translation id="5242724311594467048">Enable "<ph name="EXTENSION_NAME" />"?</translation> +<translation id="5243522832766285132">Please try again in a few moments</translation> <translation id="5244474230056479698">Syncing to <ph name="EMAIL" /></translation> <translation id="5246282308050205996"><ph name="APP_NAME" /> has crashed. Click this balloon to restart the app.</translation> <translation id="5247051749037287028">Display name (optional)</translation> @@ -2754,6 +2778,7 @@ <translation id="5264148714798105376">This may take a minute or so.</translation> <translation id="5264252276333215551">Please connect to the Internet to launch your app in kiosk mode.</translation> <translation id="5265562206369321422">Offline for more than a week</translation> +<translation id="5265797726250773323">Error while installing</translation> <translation id="5266113311903163739">Certification Authority Import Error</translation> <translation id="5269977353971873915">Print Failed</translation> <translation id="5271549068863921519">Save password</translation> @@ -2776,6 +2801,7 @@ <translation id="529175790091471945">Format this device</translation> <translation id="5292195676005197571">To use most keys, simply press the button</translation> <translation id="5293170712604732402">Restore settings to their original defaults</translation> +<translation id="5297082477358294722">Password saved. View and manage saved passwords in your <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5298219193514155779">Theme created by</translation> <translation id="5299109548848736476">Do Not Track</translation> <translation id="5299682071747318445">All data is encrypted with your sync passphrase</translation> @@ -3004,6 +3030,7 @@ <translation id="5612720917913232150"><ph name="URL" /> wants to use your computer's location</translation> <translation id="5612734644261457353">Sorry, your password still could not be verified. Note: if you changed your password recently, your new password will be applied once you sign out, please use the old password here.</translation> <translation id="5614190747811328134">User Notice</translation> +<translation id="5614553682702429503">Save password?</translation> <translation id="561698261642843490">Close Firefox</translation> <translation id="5618075537869101857">Oh no, the kiosk application could not be launched.</translation> <translation id="5618333180342767515">(this might take a few minutes)</translation> @@ -3044,6 +3071,7 @@ <translation id="5677503058916217575">Page language:</translation> <translation id="5677928146339483299">Blocked</translation> <translation id="5678550637669481956">Read and write access to <ph name="VOLUME_NAME" /> has been granted.</translation> +<translation id="5678784840044122290">The Linux application will be available within your Terminal and may also show an icon in your Launcher.</translation> <translation id="5678955352098267522">Read your data on <ph name="WEBSITE_1" /></translation> <translation id="5684661240348539843">Asset Identifier</translation> <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Can't disconnect from an archive or virtual disk<ph name="END_BOLD" /> @@ -3139,6 +3167,7 @@ <translation id="5832805196449965646">Add Person</translation> <translation id="583281660410589416">Unknown</translation> <translation id="5832976493438355584">Locked</translation> +<translation id="5833397272224757657">Uses content on sites that you visit, plus browser activity and interactions, for personalisation</translation> <translation id="5833610766403489739">This file has wandered off somewhere. Please check your download location setting and try again.</translation> <translation id="5833726373896279253">These settings may only be modified by the owner:</translation> <translation id="5834581999798853053">About <ph name="TIME" /> minutes left</translation> @@ -3192,6 +3221,7 @@ <translation id="5908769186679515905">Block sites from running Flash</translation> <translation id="5910363049092958439">Sa&ve Image As...</translation> <translation id="5911737117543891828">Temporary Google Drive offline files will be deleted. Files that you’ve set as available offline won’t be deleted from this device.</translation> +<translation id="5911887972742538906">An error occurred during installation of your Linux application.</translation> <translation id="5912378097832178659">&Edit search engines...</translation> <translation id="5914724413750400082">Modulus (<ph name="MODULUS_NUM_BITS" /> bits): <ph name="MODULUS_HEX_DUMP" /> @@ -3378,6 +3408,7 @@ <translation id="6198102561359457428">Sign out then sign in again...</translation> <translation id="6198252989419008588">Change PIN</translation> <translation id="6199801702437275229">Waiting for space info...</translation> +<translation id="6201792273624501289">Linux apps</translation> <translation id="6204015976622790023">See relevant suggestions from your Assistant related to what's on your screen.</translation> <translation id="6205710420833115353">Some operations are taking longer than expected. Do you want to abort them?</translation> <translation id="6206311232642889873">Cop&y Image</translation> @@ -3854,6 +3885,7 @@ <translation id="6945221475159498467">Select</translation> <translation id="694592694773692225">Redirect blocked on this page.</translation> <translation id="6949306908218145636">Bookmark Open Pages...</translation> +<translation id="6950627417367801484">Restore apps</translation> <translation id="6951153907720526401">Payment Handlers</translation> <translation id="6955446738988643816">Inspect Pop-up</translation> <translation id="6957231940976260713">Service name</translation> @@ -3979,6 +4011,7 @@ <translation id="7127980134843952133">Download history</translation> <translation id="7131040479572660648">Read your data on <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> and <ph name="WEBSITE_3" /></translation> <translation id="713122686776214250">Add pa&ge...</translation> +<translation id="7133578150266914903">Your administrator is rolling back this device (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="7134098520442464001">Make Text Smaller</translation> <translation id="7136694880210472378">Make default</translation> <translation id="7136984461011502314">Welcome to <ph name="PRODUCT_NAME" /></translation> @@ -4154,7 +4187,6 @@ <translation id="7410344089573941623">Ask if <ph name="HOST" /> wants to access your camera and microphone</translation> <translation id="741204030948306876">Yes, I'm in</translation> <translation id="7412226954991670867">GPU Memory</translation> -<translation id="7413455776853560343">Customise background</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Unknown network error</translation> <translation id="7417705661718309329">Google map</translation> @@ -4180,6 +4212,7 @@ <translation id="7463006580194749499">Add person</translation> <translation id="7464490149090366184">Zipping failed, item exists: "$1"</translation> <translation id="7465778193084373987">Netscape Certificate Revocation URL</translation> +<translation id="7469406957790636836">To turn this on, first turn on spell check in <ph name="BEGIN_LINK" />Languages and input<ph name="END_LINK" /></translation> <translation id="7469894403370665791">Automatically connect to this network</translation> <translation id="747114903913869239">Error: Unable to decode extension</translation> <translation id="7473753388963818366">Let's get your <ph name="DEVICE_TYPE" /> ready for you</translation> @@ -4277,6 +4310,7 @@ <translation id="7606992457248886637">Authorities</translation> <translation id="7607002721634913082">Paused</translation> <translation id="7607274158153386860">Request tablet site</translation> +<translation id="7609148976235050828">Please connect to the Internet and try again.</translation> <translation id="7611008212562900400">Search your device, apps, web...</translation> <translation id="7616214729753637086">Enrolling device…</translation> <translation id="7617366389578322136">Connecting to '<ph name="DEVICE_NAME" />'</translation> @@ -4345,6 +4379,7 @@ <translation id="7730449930968088409">Capture content of your screen</translation> <translation id="7730494089396812859">Show Cloud backup details</translation> <translation id="7732111077498238432">Network is policy controlled</translation> +<translation id="7737238973539693982">Delete Linux (Beta)</translation> <translation id="773905249182896430">Protects you and your device from dangerous sites</translation> <translation id="7740996059027112821">Standard</translation> <translation id="7748528009589593815">Previous tab</translation> @@ -4355,7 +4390,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Adjust the boundaries of your display</translation> <translation id="7760004034676677601">Is this the start-up page that you were expecting?</translation> -<translation id="7760756088376329221">Select a Google Photo Album</translation> <translation id="7764225426217299476">Add address</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> from <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Move</translation> @@ -4535,6 +4569,7 @@ <translation id="7974936243149753750">Overscan</translation> <translation id="7977551819349545646">Updating Chromebox...</translation> <translation id="7978412674231730200">Private key</translation> +<translation id="7978450511781612192">This will sign you out of your Google accounts. Your bookmarks, history, passwords and more will no longer be synced.</translation> <translation id="7979036127916589816">Sync Error</translation> <translation id="7980084013673500153">Asset ID: <ph name="ASSET_ID" /></translation> <translation id="7981313251711023384">Preload pages for faster browsing and searching</translation> @@ -4699,6 +4734,7 @@ <translation id="8226619461731305576">Queue</translation> <translation id="8226742006292257240">Below is the randomly generated TPM password that has been assigned to your computer:</translation> <translation id="8227119283605456246">Attach file</translation> +<translation id="8230134520748321204">Save password for <ph name="ORIGIN" />?</translation> <translation id="8234795456569844941">Please help our engineers fix this problem. Tell us what happened right before you got the profile error message:</translation> <translation id="8234989666557591529">Choose a phone to unlock your <ph name="DEVICE_TYPE" /></translation> <translation id="8239020549147958415">Sync as <ph name="FULL_NAME" /></translation> @@ -4817,6 +4853,7 @@ <translation id="8438328416656800239">Switch to a smart browser</translation> <translation id="8438566539970814960">Make searches and browsing better</translation> <translation id="8439506636278576865">Offer to translate pages in this language</translation> +<translation id="8440630305826533614">Linux apps</translation> <translation id="8446884382197647889">Learn More</translation> <translation id="8447409163267621480">Include either Ctrl or Alt</translation> <translation id="8448729345478502352">Make items on your screen smaller or larger</translation> @@ -4861,6 +4898,7 @@ <translation id="8497219075884839166">Windows Utilities</translation> <translation id="8498214519255567734">Make it easier to look at your screen or read in dim light</translation> <translation id="8498395510292172881">Continue reading in Chrome</translation> +<translation id="8502536196501630039">To use apps from Google Play, you must first restore your apps. Some data may have been lost.</translation> <translation id="8503813439785031346">Username</translation> <translation id="850875081535031620">No harmful software found</translation> <translation id="8509646642152301857">Spell check dictionary download failed.</translation> @@ -4990,6 +5028,7 @@ <translation id="8698464937041809063">Google drawing</translation> <translation id="869884720829132584">Applications menu</translation> <translation id="869891660844655955">Expiry date</translation> +<translation id="8699566574894671540">To turn this on, first select Check Spelling While Typing in the Edit menu</translation> <translation id="870073306461175568">Network File Shares</translation> <translation id="8701677791353449257">The device name must match regular expression <ph name="REGEX" />.</translation> <translation id="8704521619148782536">This is taking much longer than usual. You can keep waiting or cancel and try again later.</translation> @@ -5029,6 +5068,7 @@ <p>But you can still configure via the command line. Please see <code>man <ph name="PRODUCT_BINARY_NAME" /></code> for more information on flags and environment variables.</p></translation> <translation id="8755376271068075440">&Larger</translation> +<translation id="8756969031206844760">Update password?</translation> <translation id="8757090071857742562">Unable to cast desktop. Check to see if you confirmed the prompt to start sharing your screen.</translation> <translation id="8757640015637159332">Enter public session</translation> <translation id="8757742102600829832">Select a Chromebox to connect to</translation> @@ -5185,7 +5225,9 @@ <translation id="9009369504041480176">Uploading (<ph name="PROGRESS_PERCENT" />%)...</translation> <translation id="9011163749350026987">Always show icon</translation> <translation id="9011178328451474963">Last tab</translation> +<translation id="9013707997379828817">Your administrator rolled back this device. Please save important files, then restart. All data on the device will be deleted.</translation> <translation id="9014987600015527693">Show another phone</translation> +<translation id="9018218886431812662">Installation complete</translation> <translation id="901834265349196618">email</translation> <translation id="9019062154811256702">Read and change auto-fill settings</translation> <translation id="9020362265352758658">4x</translation> @@ -5209,6 +5251,7 @@ <translation id="9038649477754266430">Use a prediction service to load pages more quickly</translation> <translation id="9039663905644212491">PEAP</translation> <translation id="9039890312082871605">Mute Tabs</translation> +<translation id="9040661932550800571">Update password for <ph name="ORIGIN" />?</translation> <translation id="9041692268811217999">Access to local files on your machine is disabled by your administrator</translation> <translation id="9042893549633094279">Privacy and security</translation> <translation id="904451693890288097">Please enter the passkey for "<ph name="DEVICE_NAME" />":</translation> @@ -5313,6 +5356,7 @@ <translation id="9203478404496196495">Unmute tab</translation> <translation id="9203904171912129171">Select a device</translation> <translation id="9203962528777363226">The administrator of this device has disabled new users from being added</translation> +<translation id="9213073329713032541">Installation successfully started.</translation> <translation id="9214520840402538427">Oops! The initialisation of the installation-time attributes has timed out. Please contact your support representative.</translation> <translation id="9214695392875603905">Cupcake</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" added</translation> @@ -5367,6 +5411,7 @@ <translation id="988978206646512040">Empty passphrase is not allowed</translation> <translation id="992032470292211616">Extensions, apps and themes can harm your mobile device. Are you sure that you want to continue?</translation> <translation id="992592832486024913">Disable ChromeVox (spoken feedback)</translation> +<translation id="993540765962421562">Installation in progress</translation> <translation id="994289308992179865">&Loop</translation> <translation id="996250603853062861">Establishing secure connection...</translation> <translation id="998747458861718449">I&nspect</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 32d467e7..db76905 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Error desconocido.</translation> <translation id="119738088725604856">Ventana de captura de pantalla</translation> <translation id="1197979282329025000">Se produjo un error al recuperar las capacidades de la impresora <ph name="PRINTER_NAME" />. Esta impresora no se pudo registrar con <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Comencemos</translation> <translation id="119944043368869598">Borrar todo</translation> <translation id="1201402288615127009">Siguiente</translation> <translation id="1202596434010270079">Se actualizó la aplicación de kiosco. Desconecta el dispositivo USB.</translation> @@ -4152,7 +4151,6 @@ <translation id="7410344089573941623">Preguntar si <ph name="HOST" /> quiere acceder a la cámara y al micrófono</translation> <translation id="741204030948306876">Sí, acepto</translation> <translation id="7412226954991670867">Memoria de GPU</translation> -<translation id="7413455776853560343">Personalizar fondo</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Error de red desconocido</translation> <translation id="7417705661718309329">Mapa de Google</translation> @@ -4353,7 +4351,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ajusta los límites de la pantalla</translation> <translation id="7760004034676677601">¿Esta es la página de inicio que esperabas ver?</translation> -<translation id="7760756088376329221">Seleccionar un álbum de Google Fotos</translation> <translation id="7764225426217299476">Agregar dirección</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> de <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Mover</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index a334504..f68be825 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Error desconocido.</translation> <translation id="119738088725604856">Ventana de captura de pantalla</translation> <translation id="1197979282329025000">Se ha producido un error al recuperar las funciones de la impresora <ph name="PRINTER_NAME" />. Esta impresora no se ha podido registrar en <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">¡Empecemos!</translation> <translation id="119944043368869598">Eliminar todo</translation> <translation id="1201402288615127009">Siguiente</translation> <translation id="1202596434010270079">La aplicación de kiosco se ha actualizado. Extrae el dispositivo USB.</translation> @@ -820,7 +819,7 @@ <translation id="2230062665678605299">No se puede crear la carpeta "<ph name="FOLDER_NAME" />". <ph name="ERROR_MESSAGE" /></translation> <translation id="223106756035922488">Haz clic para ver el doodle de hoy</translation> <translation id="2231238007119540260">Si eliminas un certificado de servidor, restablecerás las comprobaciones de seguridad habituales de ese servidor y necesitarás que este utilice un certificado válido.</translation> -<translation id="2232379019872353004">Enviar información del sistema y contenido de las páginas a Google</translation> +<translation id="2232379019872353004">Envía información del sistema y contenido de las páginas a Google</translation> <translation id="2232876851878324699">El archivo contenía un certificado, que no se ha importado:</translation> <translation id="2233502537820838181">&Más información</translation> <translation id="2234876718134438132">Servicios de Google y sincronización</translation> @@ -4150,7 +4149,6 @@ <translation id="7410344089573941623">Preguntar si <ph name="HOST" /> quiere acceder a la cámara y al micrófono</translation> <translation id="741204030948306876">Sí, acepto</translation> <translation id="7412226954991670867">Memoria de la GPU</translation> -<translation id="7413455776853560343">Personalizar fondo</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Error de red desconocido</translation> <translation id="7417705661718309329">Mapa de Google</translation> @@ -4351,7 +4349,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ajusta los extremos de la pantalla</translation> <translation id="7760004034676677601">¿Es esta la página de inicio que esperabas?</translation> -<translation id="7760756088376329221">Seleccionar un álbum de Google Fotos</translation> <translation id="7764225426217299476">Añadir dirección</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> desde <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Mover</translation> @@ -5167,7 +5164,7 @@ <translation id="8984654317541110628">URL de recurso compartido</translation> <translation id="8984872292925913496">Busca el PIN de 6 dígitos situado en la parte trasera de la llave</translation> <translation id="8986362086234534611">Dejar de recordar</translation> -<translation id="8986494364107987395">Enviar automáticamente estadísticas de uso e informes sobre fallos a Google</translation> +<translation id="8986494364107987395">Envía automáticamente estadísticas de uso e informes sobre fallos a Google</translation> <translation id="8987927404178983737">Mes</translation> <translation id="8991520179165052608">El sitio web puede usar tu micrófono</translation> <translation id="899403249577094719">URL base de certificado de Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 3184eea..beca7e7 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Tundmatu viga.</translation> <translation id="119738088725604856">Ekraanipildi aken</translation> <translation id="1197979282329025000">Ilmnes viga printeri <ph name="PRINTER_NAME" /> printerivõimaluste toomisel. Printerit ei saanud teenusega <ph name="CLOUD_PRINT_NAME" /> registreerida.</translation> -<translation id="1198271701881992799">Hakkame pihta</translation> <translation id="119944043368869598">Tühjenda kõik</translation> <translation id="1201402288615127009">Edasi</translation> <translation id="1202596434010270079">Kioski rakendust värskendati. Eemaldage USB-mälupulk.</translation> @@ -4155,7 +4154,6 @@ <translation id="7410344089573941623">Küsi, kui host <ph name="HOST" /> soovib juurdepääsu kaamerale ja mikrofonile</translation> <translation id="741204030948306876">Jah, sobib</translation> <translation id="7412226954991670867">GPU-mälu</translation> -<translation id="7413455776853560343">Tausta kohandamine</translation> <translation id="7414464185801331860">18-kordne</translation> <translation id="7416362041876611053">Tundmatu võrguviga.</translation> <translation id="7417705661718309329">Google'i kaart</translation> @@ -4356,7 +4354,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Kohandage oma ekraanikuva piire</translation> <translation id="7760004034676677601">Kas see on käivitamisel avatav leht, mida ootasite?</translation> -<translation id="7760756088376329221">Teenuse Google Photos albumi valimine</translation> <translation id="7764225426217299476">Lisage aadress</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> asukohast <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Liiguta</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 827d2fa..c4db555 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">خطای ناشناس.</translation> <translation id="119738088725604856">پنجره عکس صفحهنمایش</translation> <translation id="1197979282329025000">هنگام بازیابی قابلیتهای چاپگر برای چاپگر <ph name="PRINTER_NAME" />، خطایی روی داد. این چاپگر با <ph name="CLOUD_PRINT_NAME" /> ثبت نمیشود.</translation> -<translation id="1198271701881992799">بیایید شروع کنیم</translation> <translation id="119944043368869598">پاک کردن همه</translation> <translation id="1201402288615127009">بعدی</translation> <translation id="1202596434010270079">برنامه کیوسک بهروز شده است. لطفاً فلش USB را خارج کنید.</translation> @@ -4151,7 +4150,6 @@ <translation id="7410344089573941623">بپرسید که آیا <ph name="HOST" /> میخواهد به دوربین و میکرفون شما دسترسی داشته باشد</translation> <translation id="741204030948306876">بله، موافقم</translation> <translation id="7412226954991670867">حافظه GPU</translation> -<translation id="7413455776853560343">سفارشی کردن پسزمینه</translation> <translation id="7414464185801331860">۱۸ برابر</translation> <translation id="7416362041876611053">خطای شبکه ناشناس.</translation> <translation id="7417705661718309329">نقشه Google</translation> @@ -4352,7 +4350,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">تنظیم مرزهای نمایشگرتان</translation> <translation id="7760004034676677601">آیا این صفحه راهاندازی مورد انتظار شماست؟</translation> -<translation id="7760756088376329221">انتخاب آلبوم Google Photo</translation> <translation id="7764225426217299476">افزودن آدرس</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> از <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">انتقال</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 90e7a33..43f49895 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Tuntematon virhe.</translation> <translation id="119738088725604856">Kuvakaappausikkuna</translation> <translation id="1197979282329025000">Tapahtui virhe noudettaessa tulostimen <ph name="PRINTER_NAME" /> asetuksia. Tulostinta ei välttämättä ole rekisteröity palveluun <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Aloitetaan</translation> <translation id="119944043368869598">Tyhjennä kaikki</translation> <translation id="1201402288615127009">Seuraava</translation> <translation id="1202596434010270079">Kioskisovellus päivitettiin. Irrota USB-tikku.</translation> @@ -4155,7 +4154,6 @@ <translation id="7410344089573941623">Kysy, jos <ph name="HOST" /> haluaa käyttää kameraa ja mikrofonia</translation> <translation id="741204030948306876">Kyllä</translation> <translation id="7412226954991670867">Keskusyksikön muisti</translation> -<translation id="7413455776853560343">Räätälöi taustaa</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Tuntematon verkkovirhe.</translation> <translation id="7417705661718309329">Google-kartta</translation> @@ -4356,7 +4354,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Säädä näytön rajoja</translation> <translation id="7760004034676677601">Onko tämä haluamasi saapumissivu?</translation> -<translation id="7760756088376329221">Valitse Google Kuvat ‑albumi</translation> <translation id="7764225426217299476">Lisää osoite</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> verkkotunnuksesta <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Siirrä</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 8f067d5e..4c83ef5 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Hindi kilalang error.</translation> <translation id="119738088725604856">Screenshot window</translation> <translation id="1197979282329025000">May nangyaring error habang binabawi ang mga kakayahan ng printer para sa printer na <ph name="PRINTER_NAME" />. Hindi mairehistro ang printer na ito sa <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Tayo nang magsimula</translation> <translation id="119944043368869598">I-clear lahat</translation> <translation id="1201402288615127009">Susunod</translation> <translation id="1202596434010270079">Na-update na ang Kiosk app. Mangyaring alisin ang USB stick.</translation> @@ -4155,7 +4154,6 @@ <translation id="7410344089573941623">Itanong kung gusto ng <ph name="HOST" /> na i-access ang iyong camera at mikropono</translation> <translation id="741204030948306876">Oo, sali ako</translation> <translation id="7412226954991670867">GPU Memory</translation> -<translation id="7413455776853560343">I-customize ang background</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Hindi alam na error sa network.</translation> <translation id="7417705661718309329">Google map</translation> @@ -4356,7 +4354,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Isaayos ang mga hangganan ng iyong display</translation> <translation id="7760004034676677601">Ito ba ang inaasahan mong pahina sa pagsisimula?</translation> -<translation id="7760756088376329221">Pumili ng Album ng Larawan sa Google</translation> <translation id="7764225426217299476">Magdagdag ng address</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> mula sa <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Ilipat</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 488289b..0999f88 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Erreur inconnue</translation> <translation id="119738088725604856">Capture d'écran de la fenêtre</translation> <translation id="1197979282329025000">Une erreur s'est produite lors de la récupération des fonctions de l'imprimante <ph name="PRINTER_NAME" />. Cette imprimante n'a pas pu être enregistrée dans <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Mise en route</translation> <translation id="119944043368869598">Tout effacer</translation> <translation id="1201402288615127009">Suivant</translation> <translation id="1202596434010270079">L'application kiosque a été mise à jour. Veuillez débrancher la clé USB.</translation> @@ -4156,7 +4155,6 @@ <translation id="7410344089573941623">Demander si <ph name="HOST" /> souhaite accéder à votre caméra et à votre micro</translation> <translation id="741204030948306876">J'accepte</translation> <translation id="7412226954991670867">Mémoire processeur graphique</translation> -<translation id="7413455776853560343">Personnaliser l'arrière-plan</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Erreur réseau inconnue.</translation> <translation id="7417705661718309329">Carte Google</translation> @@ -4357,7 +4355,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Adaptez les dimensions de l'écran</translation> <translation id="7760004034676677601">Est-ce la page de démarrage que vous attendiez ?</translation> -<translation id="7760756088376329221">Sélectionner un album Google Photos</translation> <translation id="7764225426217299476">Ajouter une adresse</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> du domaine <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Déplacer</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index f56f86d..b5da674 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">અજ્ઞાત ભૂલ.</translation> <translation id="119738088725604856">સ્ક્રીનશૉટ વિંડો</translation> <translation id="1197979282329025000">પ્રિંટર <ph name="PRINTER_NAME" /> માટે પ્રિંટર ક્ષમતાઓ પુનર્પ્રાપ્ત કરતી વખતે ભૂલ થઈ છે. આ પ્રિંટર <ph name="CLOUD_PRINT_NAME" /> સાથે નોંધાયેલું નથી.</translation> -<translation id="1198271701881992799">ચાલો શરૂ કરીએ</translation> <translation id="119944043368869598">બધા દૂર કરો</translation> <translation id="1201402288615127009">આગલું</translation> <translation id="1202596434010270079">કિઓસ્ક ઍપ્લિકેશન અપડેટ કરી. કૃપા કરીને USB સ્ટીક અપડેટ કરો.</translation> @@ -4153,7 +4152,6 @@ <translation id="7410344089573941623">પૂછો કે <ph name="HOST" /> તમારા કૅમેરા અને માઇક્રોફોનને ઍક્સેસ કરવા માંગે છે કે કેમ</translation> <translation id="741204030948306876">હા, હું સંમત છું</translation> <translation id="7412226954991670867">GPU મેમરી</translation> -<translation id="7413455776853560343">બૅકગ્રાઉન્ડ કસ્ટમાઇઝ કરો</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">અજ્ઞાત નેટવર્ક ભૂલ.</translation> <translation id="7417705661718309329">Google નકશો</translation> @@ -4354,7 +4352,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">તમારા પ્રદર્શનની મર્યાદાઓને સમાયોજિત કરો</translation> <translation id="7760004034676677601">શું આ તમારી અપેક્ષા મુજબનું સ્ટાર્ટઅપ પૃષ્ઠ છે?</translation> -<translation id="7760756088376329221">Google ફોટો આલ્બમ પસંદ કરો</translation> <translation id="7764225426217299476">સરનામું ઉમેરો</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> પરથી <ph name="DOWNLOAD_RECEIVED" /> પ્રાપ્ત કર્યું</translation> <translation id="7765158879357617694">સ્થાન</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index c52c46f..f11948a 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">अज्ञात गड़बड़ी.</translation> <translation id="119738088725604856">स्क्रीनशॉट विंडो</translation> <translation id="1197979282329025000">प्रिंटर <ph name="PRINTER_NAME" /> की प्रिंटर क्षमताएं पुनर्प्राप्त करते समय एक गड़बड़ी आई. इस प्रिंटर को <ph name="CLOUD_PRINT_NAME" /> के साथ पंजीकृत नहीं किया जा सका.</translation> -<translation id="1198271701881992799">आइए प्रारंभ करते हैं</translation> <translation id="119944043368869598">सभी साफ़ करें</translation> <translation id="1201402288615127009">अगला</translation> <translation id="1202596434010270079">कियोस्क ऐप अपडेट कर दिया गया है. कृपया USB स्टिक को निकालें.</translation> @@ -4154,7 +4153,6 @@ <translation id="7410344089573941623">यदि <ph name="HOST" /> आपके कैमरे और माइक्रोफ़ोन को एक्सेस करना चाहे, तो पूछें</translation> <translation id="741204030948306876">हां मैं सहमत हूं</translation> <translation id="7412226954991670867">GPU मेमोरी</translation> -<translation id="7413455776853560343">बैकग्राउंड को पसंद के मुताबिक बनाएं</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">अज्ञात नेटवर्क गड़बड़ी.</translation> <translation id="7417705661718309329">Google मैप</translation> @@ -4355,7 +4353,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">अपने प्रदर्शन की सीमाएं एडजस्ट करें</translation> <translation id="7760004034676677601">क्या यह वही शुरुआती पन्ना है जिसकी आप अपेक्षा कर रहे थे?</translation> -<translation id="7760756088376329221">कोई Google फ़ोटो एल्बम चुनें</translation> <translation id="7764225426217299476">पता जोड़ें</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> से <ph name="DOWNLOAD_RECEIVED" /></translation> <translation id="7765158879357617694">ले जाएं</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index e80a9be3..9dee3583 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Nepoznata pogreška.</translation> <translation id="119738088725604856">Prozor snimke zaslona</translation> <translation id="1197979282329025000">Došlo je do pogreške tijekom dohvata mogućosti pisača za pisač <ph name="PRINTER_NAME" />. Ovaj se pisač ne može registrirati s nazivom <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Počnimo</translation> <translation id="119944043368869598">Očisti sve</translation> <translation id="1201402288615127009">Sljedeće</translation> <translation id="1202596434010270079">Aplikacija kioska ažurirana je. Uklonite USB privjesak.</translation> @@ -1414,7 +1413,7 @@ <translation id="313205617302240621">Zaboravili ste zaporku?</translation> <translation id="3132996321662585180">Osvježi svaki dan</translation> <translation id="3135204511829026971">Rotiranje zaslona</translation> -<translation id="313638818480447860">S vašim je računom povezano više aplikacija (<ph name="NUMBER_OF_APPS" />) koje su optimizirane za ovaj uređaj.</translation> +<translation id="313638818480447860">S vašim je računom povezano više aplikacija (njih <ph name="NUMBER_OF_APPS" />) koje su optimizirane za ovaj uređaj.</translation> <translation id="313963229645891001">Preuzimanje, <ph name="STATUS" /></translation> <translation id="3139925690611372679">Zadani žuti avatar</translation> <translation id="3140353188828248647">Fokusiraj adresnu traku</translation> @@ -4155,7 +4154,6 @@ <translation id="7410344089573941623">Pitaj ako <ph name="HOST" /> želi pristupiti kameri i mikrofonu</translation> <translation id="741204030948306876">Da, u redu</translation> <translation id="7412226954991670867">Memorija grafičkog procesora</translation> -<translation id="7413455776853560343">Prilagodite pozadinu</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Nepoznata mrežna pogreška.</translation> <translation id="7417705661718309329">Google karta</translation> @@ -4183,7 +4181,7 @@ <translation id="7465778193084373987">URL za opoziv Netscape certifikata</translation> <translation id="7469894403370665791">Automatski se povežite s tom mrežom</translation> <translation id="747114903913869239">Pogreška: Nije moguće dekodirati proširenje</translation> -<translation id="7473753388963818366">Hajdemo pripremiti uređaj <ph name="DEVICE_TYPE" /> za vas</translation> +<translation id="7473753388963818366">Idemo pripremiti uređaj <ph name="DEVICE_TYPE" /> za vas</translation> <translation id="7473891865547856676">Ne, hvala</translation> <translation id="747459581954555080">Obnovi sve</translation> <translation id="7475671414023905704">URL Netscape izgubljene zaporke</translation> @@ -4356,7 +4354,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Prilagodite granice zaslona</translation> <translation id="7760004034676677601">Je li to početna stranica koju ste očekivali?</translation> -<translation id="7760756088376329221">Odaberite album Google fotografija</translation> <translation id="7764225426217299476">Dodaj adresu</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> s <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Pomakni</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 70ad4ae..a8e4ccb 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Ismeretlen hiba.</translation> <translation id="119738088725604856">Képernyőfelvétel ablak</translation> <translation id="1197979282329025000">Hiba történt a(z) <ph name="PRINTER_NAME" /> nyomtató képességeinek lekérésekor. Ez a nyomtató nem regisztrálható itt: <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Kezdjük</translation> <translation id="119944043368869598">Összes törlése</translation> <translation id="1201402288615127009">Következő</translation> <translation id="1202596434010270079">A kioszkalkalmazás frissítve. Kérjük, távolítsa el az USB-meghajtót.</translation> @@ -4157,7 +4156,6 @@ <translation id="7410344089573941623">Kérdezzen rá, ha a(z) <ph name="HOST" /> hozzá szeretne férni a kamerához és a mikrofonhoz</translation> <translation id="741204030948306876">Igen, folytatom</translation> <translation id="7412226954991670867">GPU memória</translation> -<translation id="7413455776853560343">Háttér személyre szabása</translation> <translation id="7414464185801331860">18×</translation> <translation id="7416362041876611053">Ismeretlen hálózati hiba.</translation> <translation id="7417705661718309329">Google-térkép</translation> @@ -4358,7 +4356,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Állítsa be a kijelző határait</translation> <translation id="7760004034676677601">Erre a kezdőoldalra számított?</translation> -<translation id="7760756088376329221">Válasszon egy albumot a Google Fotókból</translation> <translation id="7764225426217299476">Cím hozzáadása</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> a(z) <ph name="DOWNLOAD_DOMAIN" /> webhelyről</translation> <translation id="7765158879357617694">Áthelyezés</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 65bb50f..6dffca88 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Kesalahan tak dikenal.</translation> <translation id="119738088725604856">Jendela screenshot</translation> <translation id="1197979282329025000">Kesalahan terjadi selagi mengambil informasi kemampuan printer untuk printer <ph name="PRINTER_NAME" />. Printer ini tidak dapat didaftarkan ke <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Mari memulai</translation> <translation id="119944043368869598">Hapus semua</translation> <translation id="1201402288615127009">Berikutnya</translation> <translation id="1202596434010270079">Aplikasi Kios telah diperbarui. Lepaskan stik USB.</translation> @@ -223,6 +222,7 @@ <translation id="1316136264406804862">Menelusuri...</translation> <translation id="1316495628809031177">Sinkronisasi dijeda</translation> <translation id="1319979322914001937">Aplikasi yang menunjukkan daftar ekstensi yang difilter dari Chrome Webstore. Ekstensi yang ada dalam daftar dapat langsung dipasang dari aplikasi.</translation> +<translation id="1322046419516468189">Lihat dan kelola sandi tersimpan di <ph name="SAVED_PASSWORDS_STORE" /></translation> <translation id="1326317727527857210">Untuk mendapatkan tab dari perangkat lainnya, masuk ke Chrome.</translation> <translation id="1327074568633507428">Printer di Google Cloud Print</translation> <translation id="1327977588028644528">Gerbang</translation> @@ -420,11 +420,13 @@ <translation id="1618268899808219593">Pusat Bantuan</translation> <translation id="162035744160882748">Aktifkan sinkronisasi, personalisasi, dan layanan Google lainnya</translation> <translation id="1620510694547887537">Kamera</translation> +<translation id="1623132449929929218">Gambar saat ini tidak tersedia. Sambungkan kembali ke internet untuk melihat koleksi wallpaper.</translation> <translation id="1624026626836496796">Hal ini hanya akan terjadi sekali, dan kredensial Anda tidak akan disimpan.</translation> <translation id="1627276047960621195">Deskriptor File</translation> <translation id="1627408615528139100">Sudah didownload</translation> <translation id="1632803087685957583">Memungkinkan Anda menyesuaikan tingkat pengulangan keyboard, prediksi kata, dan lainnya</translation> <translation id="1635033183663317347">Dipasang oleh wali Anda.</translation> +<translation id="1635885551358739414">Google dapat menggunakan konten di situs yang Anda buka, serta aktivitas browser dan interaksi untuk mempersonalisasi Chrome dan layanan Google lainnya seperti Terjemahan, Penelusuran, dan iklan. Anda dapat menyesuaikannya di Setelan.</translation> <translation id="1637224376458524414">Akses bookmark di iPhone</translation> <translation id="1637765355341780467">Terjadi kesalahan saat membuka profil Anda. Beberapa fitur mungkin tidak tersedia.</translation> <translation id="1639239467298939599">Memuat</translation> @@ -455,6 +457,7 @@ <translation id="166179487779922818">Sandi terlalu pendek.</translation> <translation id="1661867754829461514">PIN hilang</translation> <translation id="16620462294541761">Maaf, sandi Anda tidak dapat diverifikasi. Harap coba lagi.</translation> +<translation id="1662550410081243962">Simpan dan isi metode pembayaran</translation> <translation id="166278006618318542">Algoritme Kunci Publik Subjek</translation> <translation id="166439687370499867">Mengubah konfigurasi jaringan bersama tidak diizinkan</translation> <translation id="1665611772925418501">File tidak dapat diubah.</translation> @@ -464,6 +467,7 @@ <translation id="1673137583248014546"><ph name="URL" /> ingin melihat merek dan model Kunci Keamanan Anda</translation> <translation id="167832068858235403">kecilkan vol.</translation> <translation id="1679068421605151609">Alat Pengembang</translation> +<translation id="1680849702532889074">Terjadi error saat menginstal aplikasi Linux.</translation> <translation id="16815041330799488">Jangan izinkan situs melihat teks dan gambar yang disalin ke papan klip</translation> <translation id="1682548588986054654">Jendela Samaran Baru</translation> <translation id="168715261339224929">Agar bookmark tersedia di semua perangkat Anda, aktifkan sinkronisasi.</translation> @@ -499,6 +503,7 @@ <translation id="1732215134274276513">Lepas Sematan Tab</translation> <translation id="1734824808160898225"><ph name="PRODUCT_NAME" /> mungkin tidak dapat diupdate secara otomatis</translation> <translation id="1736419249208073774">Jelajahi</translation> +<translation id="1736827427463982819">Matikan Linux (Beta)</translation> <translation id="1737968601308870607">Bug file</translation> <translation id="1741314857973421784">Lanjutkan</translation> <translation id="174173592514158117">Tampilkan semua folder Play</translation> @@ -671,6 +676,7 @@ <translation id="1997484222658892567"><ph name="URL" /> ingin menyimpan data berukuran besar di komputer lokal Anda secara permanen</translation> <translation id="1997616988432401742">Sertifikat Anda</translation> <translation id="1999115740519098545">Saat memulai</translation> +<translation id="2000419248597011803">Mengirimkan beberapa cookie dan penelusuran dari kolom URL dan kotak penelusuran ke mesin telusur default</translation> <translation id="2001796770603320721">Kelola di Drive</translation> <translation id="2004663115385769400">Tidak dapat membuka dengan $1</translation> <translation id="200544492091181894">Anda dapat mengubah ini nanti di Setelan</translation> @@ -697,6 +703,7 @@ <translation id="2045969484888636535">Lanjutkan pencekalan cookie</translation> <translation id="204622017488417136">Perangkat Anda akan dikembalikan ke versi Chrome yang terpasang sebelumnya. Semua akun pengguna dan data lokal akan dihapus. Tindakan ini tidak dapat diurungkan.</translation> <translation id="2048182445208425546">Mengakses lalu lintas jaringan Anda</translation> +<translation id="2048653237708779538">Tindakan tidak tersedia</translation> <translation id="204914487372604757">Buat pintasan</translation> <translation id="2050339315714019657">Potret</translation> <translation id="2053312383184521053">Data Status Menganggur</translation> @@ -785,6 +792,7 @@ <translation id="2178098616815594724">Plugin <ph name="PEPPER_PLUGIN_NAME" /> di <ph name="PEPPER_PLUGIN_DOMAIN" /> ingin mengakses komputer Anda</translation> <translation id="2178614541317717477">CA Mencurigakan</translation> <translation id="218070003709087997">Gunakan angka untuk mengindikasikan jumlah salinan yang akan dicetak (1 sampai 999).</translation> +<translation id="2183558561014688873">Mengakses Asisten setiap kali Anda mengucapkan "OK Google" saat perangkat aktif dan tidak terkunci</translation> <translation id="2187895286714876935">Kesalahan Impor Sertifikat Server</translation> <translation id="2187906491731510095">Ekstensi diupdate</translation> <translation id="2188881192257509750">Buka <ph name="APPLICATION" /></translation> @@ -856,6 +864,7 @@ <translation id="2282146716419988068">Proses GPU</translation> <translation id="2282155092769082568">URL konfigurasi otomatis:</translation> <translation id="2283117145434822734">F6</translation> +<translation id="2283340219607151381">Simpan dan isi alamat</translation> <translation id="2286841657746966508">Alamat penagihan</translation> <translation id="2288181517385084064">Beralih ke perekam video</translation> <translation id="2288735659267887385">Setelan aksesibilitas</translation> @@ -937,6 +946,7 @@ <translation id="2425665904502185219">Ukuran file total</translation> <translation id="2428510569851653187">Jelaskan yang Anda lakukan saat tab error</translation> <translation id="2431027948063157455">Asisten Google tidak dapat dimuat, periksa sambungan internet dan coba lagi.</translation> +<translation id="2432753757290432042">Perlu update Linux (Beta)</translation> <translation id="2433452467737464329">Tambahkan parameter kueri di URL untuk menyegarkan halaman secara otomatis: chrome://network/?refresh=<sec></translation> <translation id="2433507940547922241">Tampilan</translation> <translation id="2433836460518180625">Hanya buka kunci perangkat</translation> @@ -1186,6 +1196,7 @@ <translation id="2775104091073479743">Edit Sidik Jari</translation> <translation id="2776441542064982094">Sepertinya tidak tersedia perangkat untuk mendaftar di jaringan tersebut. Jika perangkat Anda menyala dan terhubung ke internet, daftarkan menggunakan petunjuk pada panduan petunjuknya.</translation> <translation id="2781692009645368755">Google Pay</translation> +<translation id="2782104745158847185">Error saat menginstal aplikasi Linux</translation> <translation id="2783298271312924866">Telah Didownload</translation> <translation id="2783321960289401138">Membuat pintasan...</translation> <translation id="2783829359200813069">Pilih jenis enkripsi</translation> @@ -1210,6 +1221,7 @@ <translation id="2812944337881233323">Coba keluar dan masuk lagi</translation> <translation id="2812989263793994277">Jangan tampilkan gambar apa pun</translation> <translation id="2814489978934728345">Berhenti membuka halaman ini</translation> +<translation id="281504910091592009">Lihat dan kelola sandi tersimpan di <ph name="BEGIN_LINK" />Akun Google<ph name="END_LINK" /></translation> <translation id="2815500128677761940">Bilah bookmark</translation> <translation id="2815693974042551705">Folder bookmark</translation> <translation id="2818476747334107629">Detail printer</translation> @@ -1290,6 +1302,7 @@ <translation id="2939938020978911855">Tampilkan perangkat Bluetooth yang tersedia</translation> <translation id="2941112035454246133">Rendah</translation> <translation id="2942560570858569904">Menunggu...</translation> +<translation id="2942581856830209953">Sesuaikan halaman ini</translation> <translation id="2943400156390503548">Slide</translation> <translation id="2943503720238418293">Gunakan nama yang lebih pendek</translation> <translation id="2946119680249604491">Tambahkan koneksi</translation> @@ -1776,6 +1789,7 @@ <translation id="3693415264595406141">Sandi:</translation> <translation id="3694027410380121301">Pilih Tab Sebelumnya</translation> <translation id="3699624789011381381">Alamat email</translation> +<translation id="3699920817649120894">Nonaktifkan sinkronisasi dan personalisasi?</translation> <translation id="3700888195348409686">Menampilkan (<ph name="PAGE_ORIGIN" />)</translation> <translation id="3702500414347826004">Halaman awal diubah untuk menyertakan <ph name="URL" />.</translation> <translation id="370415077757856453">JavaScript diblokir</translation> @@ -1873,6 +1887,7 @@ <translation id="3827774300009121996">Layar &Penuh</translation> <translation id="3828029223314399057">Cari bookmark</translation> <translation id="3830674330436234648">Pemutaran tidak tersedia</translation> +<translation id="3831436149286513437">Saran penelusuran Google Drive</translation> <translation id="3831486154586836914">Memasuki mode ikhtisar jendela</translation> <translation id="383161972796689579">Pemilik perangkat ini telah menonaktifkan pengguna baru agar tidak ditambahkan</translation> <translation id="3834775135533257713">Tidak dapat menambahkan aplikasi "<ph name="TO_INSTALL_APP_NAME" />" karena bentrok dengan "<ph name="INSTALLED_APP_NAME" />".</translation> @@ -1906,6 +1921,7 @@ <translation id="3871092408932389764">Terendah</translation> <translation id="3872220884670338524">Tindakan lainnya, akun yang disimpan untuk <ph name="USERNAME" /> di <ph name="DOMAIN" /></translation> <translation id="3872991219937722530">Kosongkan ruang disk atau perangkat akan lambat merespons.</translation> +<translation id="3873315167136380065">Untuk mengaktifkannya, <ph name="BEGIN_LINK" />setel ulang sinkronisasi<ph name="END_LINK" /> untuk menghapus frasa sandi sinkronisasi</translation> <translation id="3878840326289104869">Membuat pengguna yang dilindungi</translation> <translation id="3879748587602334249">Pengelola download</translation> <translation id="3880709822663530586">Kunci Keamanan hanya berfungsi jika Bluetooth di perangkat aktif</translation> @@ -2029,6 +2045,7 @@ <translation id="4068776064906523561">Sidik jari yang disimpan</translation> <translation id="407173827865827707">Saat diklik</translation> <translation id="4071770069230198275"><ph name="PROFILE_NAME" />: kesalahan saat masuk</translation> +<translation id="4071828814509176232">“OK, Google”</translation> <translation id="4074900173531346617">Sertifikat Penandatangan Email</translation> <translation id="407520071244661467">Skala</translation> <translation id="4075639477629295004">Tidak dapat mentransmisikan <ph name="FILE_NAME" />.</translation> @@ -2096,6 +2113,7 @@ <translation id="4192273449750167573">Lihat setelan Anda di layar berikutnya</translation> <translation id="4193154014135846272">Dokumen Google</translation> <translation id="4194570336751258953">Aktifkan ketuk-untuk-mengeklik</translation> +<translation id="4195249722193633765">Instal aplikasi dengan Linux (Beta)</translation> <translation id="4195643157523330669">Buka di tab baru</translation> <translation id="4195814663415092787">Lanjutkan dari halaman terakhir yang dibuka</translation> <translation id="4197674956721858839">Pilihan file zip</translation> @@ -2156,7 +2174,9 @@ <translation id="428608937826130504">Item rak 8</translation> <translation id="4287502004382794929">Anda tidak memiliki cukup lisensi software untuk mendaftarkan perangkat ini. Hubungi pihak penjualan untuk membeli yang lainnya. Jika Anda yakin Anda tidak seharusnya mendapatkan pesan ini, hubungi dukungan.</translation> <translation id="4289540628985791613">Ikhtisar</translation> +<translation id="4295072614469448764">Aplikasi tersedia di terminal Anda. Mungkin juga ada ikon di Peluncur.</translation> <translation id="4296575653627536209">Tambahkan Pengguna yang Dilindungi</translation> +<translation id="4297219207642690536">Mulai ulang dan setel ulang</translation> <translation id="4297322094678649474">Ubah Bahasa</translation> <translation id="4300305918532693141">Untuk mengubah setelan ini, <ph name="BEGIN_LINK" />setel ulang sinkronisasi<ph name="END_LINK" />.</translation> <translation id="4305227814872083840">lama (2 dtk)</translation> @@ -2192,6 +2212,7 @@ <translation id="4370975561335139969">Email dan sandi yang Anda masukkan tidak cocok</translation> <translation id="437184764829821926">Setelan font lanjutan</translation> <translation id="4372884569765913867">1x1</translation> +<translation id="4374831787438678295">Installer Linux</translation> <translation id="4375035964737468845">Membuka file yang didownload</translation> <translation id="4377363674125277448">Ada masalah dengan sertifikat server.</translation> <translation id="4378154925671717803">Ponsel</translation> @@ -2310,6 +2331,7 @@ <translation id="4576541033847873020">Sandingkan perangkat Bluetooth</translation> <translation id="4579581181964204535">Tidak dapat mentransmisi <ph name="HOST_NAME" />.</translation> <translation id="4580526846085481512">Yakin ingin menghapus $1 item?</translation> +<translation id="4582497162516204941">Instal dengan Linux (Beta)</translation> <translation id="4582563038311694664">Setel ulang semua setelan</translation> <translation id="4585793705637313973">Edit halaman</translation> <translation id="4589268276914962177">Terminal baru</translation> @@ -2553,6 +2575,7 @@ <translation id="4953808748584563296">Avatar oranye default</translation> <translation id="4955814292505481804">Tahunan</translation> <translation id="4957949153200969297">Hanya mengaktifkan fitur yang terkait dengan Sinkronisasi <ph name="IDS_SHORT_PRODUCT_NAME" /></translation> +<translation id="4959262764292427323">Sandi disimpan di Akun Google agar Anda dapat menggunakannya di perangkat mana pun</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> <translation id="4961000125720751066">Simpan semua kartu Anda di satu tempat</translation> <translation id="496226124210045887">Folder yang Anda pilih berisi file sensitif. Apakah Anda yakin ingin memberikan izin pada "$1" untuk akses membaca secara permanen ke folder ini?</translation> @@ -2733,6 +2756,7 @@ <translation id="5240817131241497236">Setelan yang mengontrol sinkronisasi, personalisasi, dan layanan Google lainnya di Chrome telah berubah. Ini dapat memengaruhi setelan saat ini.</translation> <translation id="5241128660650683457">Membaca semua data pada situs web yang Anda kunjungi</translation> <translation id="5242724311594467048">Aktifkan "<ph name="EXTENSION_NAME" />"?</translation> +<translation id="5243522832766285132">Coba lagi setelah beberapa saat</translation> <translation id="5244474230056479698">Menyinkronkan dengan <ph name="EMAIL" /></translation> <translation id="5246282308050205996"><ph name="APP_NAME" /> ngadat. Klik balon ini untuk menyalakan kembali apl.</translation> <translation id="5247051749037287028">Nama yang ditampilkan (opsional)</translation> @@ -2755,6 +2779,7 @@ <translation id="5264148714798105376">Tindakan ini perlu waktu beberapa menit.</translation> <translation id="5264252276333215551">Sambungkan ke internet untuk meluncurkan aplikasi Anda dalam mode kios.</translation> <translation id="5265562206369321422">Offline selama lebih dari satu minggu</translation> +<translation id="5265797726250773323">Error saat menginstal</translation> <translation id="5266113311903163739">Kesalahan Impor Otoritas Sertifikasi</translation> <translation id="5269977353971873915">Gagal Mencetak</translation> <translation id="5271549068863921519">Simpan sandi</translation> @@ -2777,6 +2802,7 @@ <translation id="529175790091471945">Format perangkat ini</translation> <translation id="5292195676005197571">Untuk menggunakan sebagian besar kunci, cukup tekan tombol</translation> <translation id="5293170712604732402">Memulihkan setelan ke default aslinya</translation> +<translation id="5297082477358294722">Sandi disimpan. Lihat dan kelola sandi tersimpan di <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5298219193514155779">Tema dibuat oleh</translation> <translation id="5299109548848736476">Jangan Lacak</translation> <translation id="5299682071747318445">Semua data dienkripsi dengan frasa sandi sinkronisasi Anda</translation> @@ -3005,6 +3031,7 @@ <translation id="5612720917913232150"><ph name="URL" /> ingin menggunakan lokasi komputer Anda</translation> <translation id="5612734644261457353">Maaf, sandi Anda masih belum dapat diverifikasi. Catatan: jika Anda baru saja mengubah sandi Anda, sandi yang baru akan diterapkan saat Anda keluar, gunakan sandi lama di sini.</translation> <translation id="5614190747811328134">Notifikasi Pengguna</translation> +<translation id="5614553682702429503">Simpan sandi?</translation> <translation id="561698261642843490">Tutup Firefox</translation> <translation id="5618075537869101857">Waduh, aplikasi kios tidak dapat diluncurkan.</translation> <translation id="5618333180342767515">(mungkin membutuhkan beberapa menit)</translation> @@ -3045,6 +3072,7 @@ <translation id="5677503058916217575">Bahasa halaman:</translation> <translation id="5677928146339483299">Dicekal</translation> <translation id="5678550637669481956">Akses membaca dan menulis ke <ph name="VOLUME_NAME" /> telah diberikan.</translation> +<translation id="5678784840044122290">Aplikasi Linux akan tersedia dalam Terminal Anda dan juga mungkin menampilkan ikon di Peluncur.</translation> <translation id="5678955352098267522">Membaca data Anda di <ph name="WEBSITE_1" /></translation> <translation id="5684661240348539843">Pengenal Aset</translation> <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Tidak dapat memutuskan hubungan dari arsip atau disk virtual<ph name="END_BOLD" /> @@ -3140,6 +3168,7 @@ <translation id="5832805196449965646">Tambahkan Pengguna</translation> <translation id="583281660410589416">Tidak dikenal</translation> <translation id="5832976493438355584">Terkunci</translation> +<translation id="5833397272224757657">Menggunakan konten di situs yang Anda buka serta aktivitas browser dan interaksi untuk personalisasi</translation> <translation id="5833610766403489739">File ini tidak terdeteksi berada di mana. Periksa setelan lokasi download dan coba lagi.</translation> <translation id="5833726373896279253">Setelan ini hanya boleh diubah-ubah oleh pemiliknya:</translation> <translation id="5834581999798853053">Sekitar <ph name="TIME" /> menit lagi</translation> @@ -3193,6 +3222,7 @@ <translation id="5908769186679515905">Blokir situs agar tidak menjalankan Flash</translation> <translation id="5910363049092958439">Sim&pan Gambar Sebagai...</translation> <translation id="5911737117543891828">File offline Google Drive sementara akan dihapus. File yang telah disetel sebagai tersedia saat offline tidak akan dihapus dari perangkat ini.</translation> +<translation id="5911887972742538906">Terjadi error saat menginstal aplikasi Linux.</translation> <translation id="5912378097832178659">&Edit mesin telusur...</translation> <translation id="5914724413750400082">Modulus (<ph name="MODULUS_NUM_BITS" /> bit): <ph name="MODULUS_HEX_DUMP" /> @@ -3379,6 +3409,7 @@ <translation id="6198102561359457428">Keluar kemudian masuk lagi...</translation> <translation id="6198252989419008588">Ubah PIN</translation> <translation id="6199801702437275229">Menunggu info ruang...</translation> +<translation id="6201792273624501289">Aplikasi Linux</translation> <translation id="6204015976622790023">Lihat saran yang relevan dari Asisten terkait konten yang ada di layar.</translation> <translation id="6205710420833115353">Beberapa operasi berlangsung lebih lama dari biasanya. Ingin membatalkannya?</translation> <translation id="6206311232642889873">Sali&n Gambar</translation> @@ -3855,6 +3886,7 @@ <translation id="6945221475159498467">Pilih</translation> <translation id="694592694773692225">Pengalihan diblokir di halaman ini.</translation> <translation id="6949306908218145636">Bookmark Halaman Aktif...</translation> +<translation id="6950627417367801484">Pulihkan aplikasi</translation> <translation id="6951153907720526401">Penangan Pembayaran</translation> <translation id="6955446738988643816">Periksa Pop-up</translation> <translation id="6957231940976260713">Nama layanan</translation> @@ -3980,6 +4012,7 @@ <translation id="7127980134843952133">Histori download</translation> <translation id="7131040479572660648">Membaca data Anda di <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, dan <ph name="WEBSITE_3" /></translation> <translation id="713122686776214250">Tambahkan la&man...</translation> +<translation id="7133578150266914903">Administrator sedang memulihkan perangkat ini (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="7134098520442464001">Perkecil Teks</translation> <translation id="7136694880210472378">Jadikan default</translation> <translation id="7136984461011502314">Selamat datang di <ph name="PRODUCT_NAME" /></translation> @@ -4155,7 +4188,6 @@ <translation id="7410344089573941623">Tanyakan jika <ph name="HOST" /> ingin mengakses kamera dan mikrofon Anda</translation> <translation id="741204030948306876">Ya, saya ikut</translation> <translation id="7412226954991670867">Memori GPU</translation> -<translation id="7413455776853560343">Sesuaikan background</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Kesalahan jaringan tidak dikenal.</translation> <translation id="7417705661718309329">Peta Google</translation> @@ -4181,6 +4213,7 @@ <translation id="7463006580194749499">Tambahkan pengguna</translation> <translation id="7464490149090366184">Gagal membuat file zip, item sudah ada: "$1"</translation> <translation id="7465778193084373987">Netscape Certificate Revocation URL</translation> +<translation id="7469406957790636836">Untuk mengaktifkannya, terlebih dahulu aktifkan periksa ejaan di <ph name="BEGIN_LINK" />Bahasa dan masukan<ph name="END_LINK" /></translation> <translation id="7469894403370665791">Sambungkan ke jaringan ini secara otomatis</translation> <translation id="747114903913869239">Kesalahan: Tidak dapat mendekodekan ekstensi</translation> <translation id="7473753388963818366">Mari menyiapkan <ph name="DEVICE_TYPE" /> untuk Anda</translation> @@ -4278,6 +4311,7 @@ <translation id="7606992457248886637">Otoritas</translation> <translation id="7607002721634913082">Dijeda</translation> <translation id="7607274158153386860">Minta situs tablet</translation> +<translation id="7609148976235050828">Sambungkan ke internet dan coba lagi.</translation> <translation id="7611008212562900400">Telusuri perangkat, aplikasi, web...</translation> <translation id="7616214729753637086">Mendaftarkan perangkat...</translation> <translation id="7617366389578322136">Menyambungkan ke "<ph name="DEVICE_NAME" />"</translation> @@ -4346,6 +4380,7 @@ <translation id="7730449930968088409">Menangkap konten layar Anda</translation> <translation id="7730494089396812859">Tampilkan detail cadangan Awan</translation> <translation id="7732111077498238432">Jaringan dikontrol oleh kebijakan</translation> +<translation id="7737238973539693982">Hapus Linux (Beta)</translation> <translation id="773905249182896430">Melindungi Anda dan perangkat dari situs berbahaya</translation> <translation id="7740996059027112821">Standar</translation> <translation id="7748528009589593815">Tab sebelumnya</translation> @@ -4356,7 +4391,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Sesuaikan batas tampilan Anda</translation> <translation id="7760004034676677601">Apakah ini halaman mulai yang Anda harapkan?</translation> -<translation id="7760756088376329221">Pilih Album Google Foto</translation> <translation id="7764225426217299476">Tambahkan alamat</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> dari <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Pindahkan</translation> @@ -4536,6 +4570,7 @@ <translation id="7974936243149753750">Pemindaian berlebih</translation> <translation id="7977551819349545646">Memperbarui Chromebox...</translation> <translation id="7978412674231730200">Kunci pribadi</translation> +<translation id="7978450511781612192">Tindakan ini akan membuat Anda logout dari Akun Google. Bookmark, histori, sandi, dan lainnya tidak akan disinkronkan lagi.</translation> <translation id="7979036127916589816">Kesalahan Sinkronisasi</translation> <translation id="7980084013673500153">ID Aset: <ph name="ASSET_ID" /></translation> <translation id="7981313251711023384">Pramuat halaman agar browsing dan menelusuri lebih cepat</translation> @@ -4700,6 +4735,7 @@ <translation id="8226619461731305576">Antrean</translation> <translation id="8226742006292257240">Di bawah adalah sandi TPM yang dibuat secara acak yang telah ditetapkan untuk komputer Anda:</translation> <translation id="8227119283605456246">Lampirkan file</translation> +<translation id="8230134520748321204">Simpan sandi untuk <ph name="ORIGIN" />?</translation> <translation id="8234795456569844941">Bantu engineer kami memperbaiki masalah ini. Beri tahu kami yang terjadi tepat sebelum Anda mendapatkan pesan error profil:</translation> <translation id="8234989666557591529">Memilih ponsel untuk membuka kunci <ph name="DEVICE_TYPE" /> Anda</translation> <translation id="8239020549147958415">Sinkronkan sebagai <ph name="FULL_NAME" /></translation> @@ -4818,6 +4854,7 @@ <translation id="8438328416656800239">Beralih ke browser cerdas</translation> <translation id="8438566539970814960">Jadikan penelusuran dan penjelajahan lebih baik</translation> <translation id="8439506636278576865">Tawarkan penerjemahan halaman ke dalam bahasa ini</translation> +<translation id="8440630305826533614">Aplikasi Linux</translation> <translation id="8446884382197647889">Pelajari Lebih Lanjut</translation> <translation id="8447409163267621480">Sertakan Ctrl atau Alt</translation> <translation id="8448729345478502352">Membuat item di layar menjadi lebih kecil atau lebih besar</translation> @@ -4862,6 +4899,7 @@ <translation id="8497219075884839166">Windows Utilities</translation> <translation id="8498214519255567734">Memudahkan Anda melihat layar atau membaca saat cahaya redup</translation> <translation id="8498395510292172881">Lanjutkan membaca di Chrome</translation> +<translation id="8502536196501630039">Untuk menggunakan aplikasi dari Google Play, Anda terlebih dahulu harus memulihkan aplikasi. Beberapa data mungkin telah hilang.</translation> <translation id="8503813439785031346">Nama Pengguna</translation> <translation id="850875081535031620">Software berbahaya tidak ditemukan</translation> <translation id="8509646642152301857">Download kamus periksa ejaan gagal.</translation> @@ -4991,6 +5029,7 @@ <translation id="8698464937041809063">Gambar Google</translation> <translation id="869884720829132584">Menu aplikasi</translation> <translation id="869891660844655955">Masa berlaku</translation> +<translation id="8699566574894671540">Untuk mengaktifkannya, terlebih dahulu pilih Periksa Ejaan Saat Mengetik di menu Edit</translation> <translation id="870073306461175568">Berbagi File Jaringan</translation> <translation id="8701677791353449257">Nama perangkat harus cocok dengan ekspresi reguler <ph name="REGEX" />.</translation> <translation id="8704521619148782536">Proses ini lebih lama dari biasanya. Anda dapat terus menunggu, atau batalkan dan coba lagi nanti.</translation> @@ -5030,6 +5069,7 @@ <p>Namun demikian, Anda tetap dapat mengonfigurasi setelan melalui baris perintah. Lihat <code>man <ph name="PRODUCT_BINARY_NAME" /></code> untuk informasi selengkapnya mengenai tanda dan variabel lingkungan.</p></translation> <translation id="8755376271068075440">&Lebih besar</translation> +<translation id="8756969031206844760">Perbarui sandi?</translation> <translation id="8757090071857742562">Tidak dapat mentransmisi dekstop. Periksa apakah Anda telah mengonfirmasi permintaan untuk mulai berbagi layar.</translation> <translation id="8757640015637159332">Masukkan sesi publik</translation> <translation id="8757742102600829832">Pilih Chromebox untuk disambungkan</translation> @@ -5186,7 +5226,9 @@ <translation id="9009369504041480176">Mengupload (<ph name="PROGRESS_PERCENT" />%)...</translation> <translation id="9011163749350026987">Selalu tampilkan ikon</translation> <translation id="9011178328451474963">Tab terakhir</translation> +<translation id="9013707997379828817">Administrator memulihkan perangkat ini. Harap simpan file yang penting, lalu nyalakan ulang. Semua data di perangkat akan dihapus.</translation> <translation id="9014987600015527693">Tampilkan ponsel lain</translation> +<translation id="9018218886431812662">Penginstalan selesai</translation> <translation id="901834265349196618">email</translation> <translation id="9019062154811256702">Membaca dan mengubah setelan IsiOtomatis</translation> <translation id="9020362265352758658">4x</translation> @@ -5210,6 +5252,7 @@ <translation id="9038649477754266430">Gunakan layanan prediksi agar halaman dimuat dengan lebih cepat</translation> <translation id="9039663905644212491">PEAP</translation> <translation id="9039890312082871605">Nonaktifkan Tab</translation> +<translation id="9040661932550800571">Perbarui sandi untuk <ph name="ORIGIN" />?</translation> <translation id="9041692268811217999">Akses ke file lokal di komputer Anda dinonaktifkan oleh administrator</translation> <translation id="9042893549633094279">Privasi dan keamanan</translation> <translation id="904451693890288097">Masukkan kunci sandi untuk "<ph name="DEVICE_NAME" />":</translation> @@ -5314,6 +5357,7 @@ <translation id="9203478404496196495">Aktifkan tab</translation> <translation id="9203904171912129171">Pilih perangkat</translation> <translation id="9203962528777363226">Administrator perangkat ini telah menonaktifkan pengguna baru agar tidak ditambahkan</translation> +<translation id="9213073329713032541">Penginstalan berhasil dimulai.</translation> <translation id="9214520840402538427">Uups! Waktu pemulaian atribut waktu pemasangan telah habis. Hubungi perwakilan dukungan Anda.</translation> <translation id="9214695392875603905">Kue mangkok</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" ditambahkan</translation> @@ -5368,6 +5412,7 @@ <translation id="988978206646512040">Frasa sandi tidak boleh kosong</translation> <translation id="992032470292211616">Ekstensi, aplikasi, dan tema dapat membahayakan perangkat Anda. Yakin ingin melanjutkan?</translation> <translation id="992592832486024913">Nonaktifkan ChromeVox (masukan lisan)</translation> +<translation id="993540765962421562">Penginstalan sedang berlangsung</translation> <translation id="994289308992179865">&Putaran</translation> <translation id="996250603853062861">Membuat koneksi aman...</translation> <translation id="998747458861718449">I&nspeksi</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index f5b00b2..0025b31 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Errore sconosciuto.</translation> <translation id="119738088725604856">Finestra dello screenshot</translation> <translation id="1197979282329025000">Si è verificato un errore durante il recupero delle funzionalità della stampante <ph name="PRINTER_NAME" />. Non è stato possibile registrare questa stampante con <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Iniziamo</translation> <translation id="119944043368869598">Cancella tutto</translation> <translation id="1201402288615127009">Avanti</translation> <translation id="1202596434010270079">L'app kiosk è stata aggiornata. Rimuovi la chiavetta USB.</translation> @@ -2008,7 +2007,7 @@ <translation id="4037084878352560732">Cavallo</translation> <translation id="4037889604535939429">Modifica persona</translation> <translation id="4042264909745389898">Termini di Google Chrome OS</translation> -<translation id="4042863763121826131">{NUM_PAGES,plural, =1{Pagina di uscita}other{Pagine di uscita}}</translation> +<translation id="4042863763121826131">{NUM_PAGES,plural, =1{Esci dalla pagina}other{Esci dalle pagine}}</translation> <translation id="4044612648082411741">Inserisci la password del certificato</translation> <translation id="404493185430269859">Motore di ricerca predefinito</translation> <translation id="4047112090469382184">Livello di sicurezza della funzione</translation> @@ -4020,7 +4019,7 @@ <translation id="720110658997053098">Mantieni definitivamente questo dispositivo in modalità kiosk</translation> <translation id="7201118060536064622">"<ph name="DELETED_ITEM_NAME" />" eliminato</translation> <translation id="7206693748120342859">Download di <ph name="PLUGIN_NAME" /> in corso...</translation> -<translation id="720715819012336933">{NUM_PAGES,plural, =1{Pagina di uscita}other{Pagine di uscita}}</translation> +<translation id="720715819012336933">{NUM_PAGES,plural, =1{Esci dalla pagina}other{Esci dalle pagine}}</translation> <translation id="7216409898977639127">Fornitore del servizio di telefonia mobile</translation> <translation id="7216595297012131718">Ordina le lingue in base alle tue preferenze</translation> <translation id="7220019174139618249">Impossibile esportare le password in "<ph name="FOLDER" />"</translation> @@ -4151,7 +4150,6 @@ <translation id="7410344089573941623">Chiedi conferma se <ph name="HOST" /> vuole accedere alla webcam e al microfono</translation> <translation id="741204030948306876">Sì, accetto</translation> <translation id="7412226954991670867">Memoria GPU</translation> -<translation id="7413455776853560343">Personalizza sfondo</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Errore di rete sconosciuto.</translation> <translation id="7417705661718309329">Mappa Google</translation> @@ -4350,7 +4348,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Regola i bordi del display</translation> <translation id="7760004034676677601">È la pagina iniziale prevista?</translation> -<translation id="7760756088376329221">Seleziona un album di Google Foto</translation> <translation id="7764225426217299476">Aggiungi indirizzo</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> da <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Sposta</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 02cc3d8..94d3055 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">שגיאה לא ידועה.</translation> <translation id="119738088725604856">חלון צילום מסך</translation> <translation id="1197979282329025000">אירעה שגיאה בעת אחזור יכולות של המדפסת <ph name="PRINTER_NAME" />. לא ניתן לרשום מדפסת זו ב-<ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">בוא נתחיל</translation> <translation id="119944043368869598">נקה הכל</translation> <translation id="1201402288615127009">הבא</translation> <translation id="1202596434010270079">אפליקצית הקיוסק עודכנה. הסר את הדיסק און קי.</translation> @@ -4153,7 +4152,6 @@ <translation id="7410344089573941623">שאל אם <ph name="HOST" /> רוצה גישה למצלמה ולמיקרופון</translation> <translation id="741204030948306876">כן, אני רוצה</translation> <translation id="7412226954991670867">זיכרון GPU</translation> -<translation id="7413455776853560343">התאמה אישית של הרקע</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">שגיאת רשת לא ידועה.</translation> <translation id="7417705661718309329">מפת Google</translation> @@ -4352,7 +4350,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">התאמת הגבולות של התצוגה</translation> <translation id="7760004034676677601">האם זהו דף הפתיחה שציפית לראות?</translation> -<translation id="7760756088376329221">בחירת אלבום של תמונות Google</translation> <translation id="7764225426217299476">הוסף כתובת</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> מ-<ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">העבר</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 848d66f..cf117d3 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">不明なエラーです。</translation> <translation id="119738088725604856">スクリーンショット ウィンドウ</translation> <translation id="1197979282329025000"><ph name="PRINTER_NAME" /> プリンタのプリンタ機能の取得中にエラーが発生しました。このプリンタを <ph name="CLOUD_PRINT_NAME" /> に登録できませんでした。</translation> -<translation id="1198271701881992799">さあ始めましょう</translation> <translation id="119944043368869598">すべてクリア</translation> <translation id="1201402288615127009">次へ</translation> <translation id="1202596434010270079">キオスクアプリを更新しました。USB スティックを取り外してください。</translation> @@ -1553,7 +1552,7 @@ <translation id="3360297538363969800">印刷できませんでした。プリンタを確認してもう一度お試しください。</translation> <translation id="3364721542077212959">タッチペン ツール</translation> <translation id="3365598184818502391">Ctrl キーまたは Alt キーのいずれかを使用してください</translation> -<translation id="3367047597842238025"><ph name="DEVICE_TYPE" /> をカスタマイズして、さまざまな機能を思いのままに活用してください。</translation> +<translation id="3367047597842238025"><ph name="DEVICE_TYPE" /> を自分好みにセットアップして、多彩な機能を思いのままにご活用ください。</translation> <translation id="3368922792935385530">接続済み</translation> <translation id="3369624026883419694">ホストを解決しています...</translation> <translation id="337286756654493126">アプリケーションで開いたフォルダに書き込む</translation> @@ -4156,7 +4155,6 @@ <translation id="7410344089573941623"><ph name="HOST" /> がカメラやマイクへのアクセスを要求しているか確認する</translation> <translation id="741204030948306876">有効にする</translation> <translation id="7412226954991670867">GPU メモリ</translation> -<translation id="7413455776853560343">背景のカスタマイズ</translation> <translation id="7414464185801331860">18 倍</translation> <translation id="7416362041876611053">不明なネットワーク エラーが発生しました。</translation> <translation id="7417705661718309329">Google マップ</translation> @@ -4357,7 +4355,6 @@ <translation id="7758143121000533418">ファミリー リンク</translation> <translation id="7758450972308449809">ディスプレイの外枠を調整します</translation> <translation id="7760004034676677601">この起動ページでよろしいですか?</translation> -<translation id="7760756088376329221">Google フォトアルバムを選択</translation> <translation id="7764225426217299476">住所を追加</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" />(<ph name="DOWNLOAD_DOMAIN" /> から)</translation> <translation id="7765158879357617694">移動</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index d93060d..232e0733 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -134,7 +134,6 @@ <translation id="1195447618553298278">ಅಪರಿಚಿತ ದೋಷ.</translation> <translation id="119738088725604856">ಸ್ಕ್ರೀನ್ಶಾಟ್ ವಿಂಡೋ</translation> <translation id="1197979282329025000"><ph name="PRINTER_NAME" /> ಪ್ರಿಂಟರ್ಗಾಗಿ ಮುದ್ರಣ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ಪುನಃಪಡೆಯುವಾಗ ದೋಷ ಸಂಭವಿಸಿದೆ. ಈ ಪ್ರಿಂಟರ್ ಅನ್ನು <ph name="CLOUD_PRINT_NAME" /> ನೊಂದಿಗೆ ನೋಂದಾಯಿಸಲಾಗುವುದಿಲ್ಲ.</translation> -<translation id="1198271701881992799">ಪ್ರಾರಂಭಿಸೋಣವೇ</translation> <translation id="119944043368869598">ಎಲ್ಲವನ್ನೂ ತೆಗೆದುಹಾಕಿ</translation> <translation id="1201402288615127009">ಮುಂದೆ</translation> <translation id="1202596434010270079">ಕಿಯೋಸ್ಕ್ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ. ದಯವಿಟ್ಟು USB ಸ್ಟಿಕ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ.</translation> @@ -4152,7 +4151,6 @@ <translation id="7410344089573941623">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಹಾಗೂ ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶಿಸಲು <ph name="HOST" /> ಬಯಸುತ್ತಾರೆಯೇ ಎಂಬುದನ್ನು ಕೇಳಿ</translation> <translation id="741204030948306876">ಹೌದು, ನಾನಿದ್ದೇನೆ</translation> <translation id="7412226954991670867">GPU ಸ್ಮರಣೆ</translation> -<translation id="7413455776853560343">ಹಿನ್ನೆಲೆ ಕಸ್ಟಮೈಸ್ ಮಾಡಿ</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">ಅಪರಿಚಿತ ನೆಟ್ವರ್ಕ್ ದೋಷ.</translation> <translation id="7417705661718309329">Google ನಕ್ಷೆ</translation> @@ -4351,7 +4349,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">ನಿಮ್ಮ ಪ್ರದರ್ಶನದ ಗಡಿಗಳನ್ನು ಹೊಂದಿಸಿ</translation> <translation id="7760004034676677601">ಇದು ನೀವು ನಿರೀಕ್ಷಿಸುತ್ತಿರುವ ಆರಂಭಿಕ ಪುಟವೇ?</translation> -<translation id="7760756088376329221">Google ಫೋಟೋ ಆಲ್ಬಮ್ ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="7764225426217299476">ವಿಳಾಸ ಸೇರಿಸಿ</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> ರಿಂದ <ph name="DOWNLOAD_RECEIVED" /></translation> <translation id="7765158879357617694">ಸರಿಸು</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index f54e1ac..cb7252e1 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">알 수 없는 오류</translation> <translation id="119738088725604856">스크린샷 창</translation> <translation id="1197979282329025000"><ph name="PRINTER_NAME" /> 프린터의 인쇄 가능 매수를 검색하는 중에 오류가 발생했습니다. 이 프린터를 <ph name="CLOUD_PRINT_NAME" />(으)로 등록할 수 없습니다.</translation> -<translation id="1198271701881992799">시작하기</translation> <translation id="119944043368869598">모두 삭제</translation> <translation id="1201402288615127009">다음</translation> <translation id="1202596434010270079">Kiosk 앱이 업데이트되었습니다. USB 메모리를 제거하세요.</translation> @@ -4153,7 +4152,6 @@ <translation id="7410344089573941623"><ph name="HOST" />에서 카메라와 마이크에 액세스하려는 경우 메시지 표시</translation> <translation id="741204030948306876">사용</translation> <translation id="7412226954991670867">GPU 메모리</translation> -<translation id="7413455776853560343">배경 맞춤설정</translation> <translation id="7414464185801331860">18배</translation> <translation id="7416362041876611053">알려지지 않은 네트워크 오류입니다.</translation> <translation id="7417705661718309329">Google 지도</translation> @@ -4354,7 +4352,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">디스플레이 경계를 조정합니다.</translation> <translation id="7760004034676677601">설정한 시작 페이지가 맞습니까?</translation> -<translation id="7760756088376329221">Google 포토 앨범 선택</translation> <translation id="7764225426217299476">주소 추가</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" />에서 <ph name="DOWNLOAD_RECEIVED" />을(를) 다운로드함</translation> <translation id="7765158879357617694">이동</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 92e4651..0f12de23 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Nežinoma klaida.</translation> <translation id="119738088725604856">Ekrano kopijos langas</translation> <translation id="1197979282329025000">Nuskaitant „<ph name="PRINTER_NAME" />“ spausdintuvo charakteristikas įvyko klaida. Šio spausdintuvo nepavyko užregistruoti „<ph name="CLOUD_PRINT_NAME" />“.</translation> -<translation id="1198271701881992799">Pradėkime</translation> <translation id="119944043368869598">Valyti viską</translation> <translation id="1201402288615127009">Toliau</translation> <translation id="1202596434010270079">Viešojo terminalo buvo atnaujinta. Atjunkite USB atmintuką.</translation> @@ -4156,7 +4155,6 @@ <translation id="7410344089573941623">Klausti, jei <ph name="HOST" /> nori pasiekti fotoaparatą ir mikrofoną</translation> <translation id="741204030948306876">Taip, sutinku</translation> <translation id="7412226954991670867">GPU atmintis</translation> -<translation id="7413455776853560343">Tinkinti foną</translation> <translation id="7414464185801331860">18 k.</translation> <translation id="7416362041876611053">Nežinoma tinklo klaida.</translation> <translation id="7417705661718309329">„Google“ žemėlapis</translation> @@ -4357,7 +4355,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Sureguliuokite ekrano ribas</translation> <translation id="7760004034676677601">Ar tai paleidimo puslapis, kurį tikėjotės išvysti?</translation> -<translation id="7760756088376329221">Pasirinkti „Google“ nuotraukų albumą</translation> <translation id="7764225426217299476">Pridėti adresą</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> iš <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Perkelti</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 34c80f4..da3d2b5 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Nezināma kļūda.</translation> <translation id="119738088725604856">Ekrānuzņēmuma logs</translation> <translation id="1197979282329025000">Izgūstot printera <ph name="PRINTER_NAME" /> iespējas, radās kļūda. Šo printeri nevarēja reģistrēt pakalpojumā <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Sākam darbu!</translation> <translation id="119944043368869598">Notīrīt visu</translation> <translation id="1201402288615127009">Nākamais</translation> <translation id="1202596434010270079">Kioska lietotne ir atjaunināta. Lūdzu, izņemiet USB atmiņas karti.</translation> @@ -4155,7 +4154,6 @@ <translation id="7410344089573941623">Vaicāt, ja vietne <ph name="HOST" /> vēlas piekļūt jūsu kamerai un mikrofonam</translation> <translation id="741204030948306876">Jā, piekrītu</translation> <translation id="7412226954991670867">Grafiskā procesora atmiņa</translation> -<translation id="7413455776853560343">Fona pielāgošana</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Nezināma tīkla kļūda.</translation> <translation id="7417705661718309329">Google karte</translation> @@ -4356,7 +4354,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Pielāgojiet displeja robežas</translation> <translation id="7760004034676677601">Vai šī ir sākumlapa, ko bijāt gaidījis?</translation> -<translation id="7760756088376329221">Atlasīt Google fotoattēlu albumu</translation> <translation id="7764225426217299476">Pievienot adresi</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> no <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Pārvietot</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 59aced3..72e30e5 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">അജ്ഞാത പിശക്.</translation> <translation id="119738088725604856">സ്ക്രീൻഷോട്ട് വിൻഡോ</translation> <translation id="1197979282329025000"><ph name="PRINTER_NAME" /> പ്രിന്ററിനായുള്ള പ്രിന്റര് കാര്യക്ഷമതകള് വീണ്ടെടുക്കുമ്പോള് ഒരു പിശക് സംഭവിച്ചു. ഈ പ്രിന്റര് <ph name="CLOUD_PRINT_NAME" /> ഉപയോഗിച്ച് രജിസ്റ്റര് ചെയ്യാന് കഴിയില്ല.</translation> -<translation id="1198271701881992799">നമുക്ക് ആരംഭിക്കാം</translation> <translation id="119944043368869598">എല്ലാം നീക്കുക</translation> <translation id="1201402288615127009">അടുത്തത്</translation> <translation id="1202596434010270079">കിയോസ്ക് അപ്ലിക്കേഷൻ അപ്ഡേറ്റുചെയ്തു. USB സ്റ്റിക്ക് നീക്കംചെയ്യുക.</translation> @@ -4153,7 +4152,6 @@ <translation id="7410344089573941623">നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ആക്സസ്സുചെയ്യാൻ <ph name="HOST" /> താൽപ്പര്യപ്പെടുന്നുണ്ടോയെന്ന് ചോദിക്കുക</translation> <translation id="741204030948306876">ഞാൻ തയ്യാറാണ്</translation> <translation id="7412226954991670867">GPU മെമ്മറി</translation> -<translation id="7413455776853560343">പശ്ചാത്തലം ഇഷ്ടാനുസൃതമാക്കുക</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">അജ്ഞാത നെറ്റ്വർക്ക് പിശക്.</translation> <translation id="7417705661718309329">Google മാപ്പ്</translation> @@ -4354,7 +4352,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">നിങ്ങളുടെ ഡിസ്പ്ലേയുടെ ബൗണ്ടറികൾ ക്രമീകരിക്കുക</translation> <translation id="7760004034676677601">നിങ്ങൾ ഉദ്ദേശിച്ച ആരംഭ പേജ് ഇതാണോ?</translation> -<translation id="7760756088376329221">ഒരു Google ഫോട്ടോ ആൽബം തിരഞ്ഞെടുക്കുക</translation> <translation id="7764225426217299476">വിലാസം ചേർക്കുക</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> ഡൊമെയ്നിൽ നിന്ന് <ph name="DOWNLOAD_RECEIVED" /></translation> <translation id="7765158879357617694">നീക്കുക</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 3a5c8fa..2272322 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">अज्ञात एरर.</translation> <translation id="119738088725604856">स्क्रीनशॉट विंडो</translation> <translation id="1197979282329025000"><ph name="PRINTER_NAME" /> प्रिंटरसाठी प्रिंटर क्षमता पुनर्प्राप्त करताना एरर आली. हा प्रिंटर <ph name="CLOUD_PRINT_NAME" /> सह नोंदणीकृत असू शकत नाही.</translation> -<translation id="1198271701881992799">आता प्रारंभ करा</translation> <translation id="119944043368869598">सर्व साफ करा</translation> <translation id="1201402288615127009">पुढील</translation> <translation id="1202596434010270079">कियोस्क अॅप अपडेट केला गेला आहे. कृपया USB स्टिक काढा.</translation> @@ -4157,7 +4156,6 @@ <translation id="7410344089573941623"><ph name="HOST" /> आपल्या कॅमेरा आणि मायक्रोफोनवर प्रवेश करू इच्छित असल्यास विचारा</translation> <translation id="741204030948306876">होय, मला मान्य आहे</translation> <translation id="7412226954991670867">GPU मेमरी</translation> -<translation id="7413455776853560343">बॅकग्राउंड कस्टमाइझ करा</translation> <translation id="7414464185801331860">१८x</translation> <translation id="7416362041876611053">अज्ञात नेटवर्क एरर.</translation> <translation id="7417705661718309329">Google नकाशा</translation> @@ -4358,7 +4356,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">आपल्या प्रदर्शनाच्या सीमा समायोजित करा</translation> <translation id="7760004034676677601">आपण अपेक्षा करत होता हे तेच प्रारंभ पृष्ठ आहे?</translation> -<translation id="7760756088376329221">Google फोटो अल्बम निवडा</translation> <translation id="7764225426217299476">पत्ता जोडा</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> वरून <ph name="DOWNLOAD_RECEIVED" /></translation> <translation id="7765158879357617694">हलवा</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 2e7fd074..caca5085 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Ralat tidak diketahui.</translation> <translation id="119738088725604856">Tetingkap tangkapan skrin</translation> <translation id="1197979282329025000">Ralat berlaku semasa mendapatkan semula keupayaan pencetak untuk pencetak <ph name="PRINTER_NAME" />. Pencetak ini tidak boleh didaftarkan dengan <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Mari bermula</translation> <translation id="119944043368869598">Kosongkan semua</translation> <translation id="1201402288615127009">Seterusnya</translation> <translation id="1202596434010270079">Apl Kiosk telah dikemas kini. Sila alih keluar batang USB.</translation> @@ -223,6 +222,7 @@ <translation id="1316136264406804862">Mencari...</translation> <translation id="1316495628809031177">Penyegerakan dijeda</translation> <translation id="1319979322914001937">Apl yang menunjukkan senarai ditapis bagi sambungan daripada Gedung Web Chrome. Sambungan dalam senarai boleh dipasang terus daripada apl.</translation> +<translation id="1322046419516468189">Lihat dan urus kata laluan yang disimpan dalam <ph name="SAVED_PASSWORDS_STORE" /> anda</translation> <translation id="1326317727527857210">Log masuk ke Chrome untuk mendapatkan tab daripada peranti anda yang lain.</translation> <translation id="1327074568633507428">Pencetak di Cetakan Awan Google</translation> <translation id="1327977588028644528">Get Laluan</translation> @@ -420,11 +420,13 @@ <translation id="1618268899808219593">P&usat Bantuan</translation> <translation id="162035744160882748">Hidupkan penyegerakan, pemperibadian dan perkhidmatan Google yang lain</translation> <translation id="1620510694547887537">Kamera</translation> +<translation id="1623132449929929218">Imej tidak tersedia pada masa ini. Sila sambung semula ke Internet untuk melihat koleksi kertas dinding.</translation> <translation id="1624026626836496796">Ini hanya akan berlaku sekali dan bukti kelayakan anda tidak akan disimpan.</translation> <translation id="1627276047960621195">Pemerihal Fail</translation> <translation id="1627408615528139100">Telah pun dimuat turun</translation> <translation id="1632803087685957583">Membolehkan anda melaraskan kadar ulangan papan kekunci anda, ramalan perkataan dan pelbagai lagi</translation> <translation id="1635033183663317347">Dipasang oleh penjaga anda.</translation> +<translation id="1635885551358739414">Google boleh menggunakan kandungan di tapak yang anda lawati dan aktiviti serta interaksi penyemak imbas untuk memperibadikan Chrome dan perkhidmatan Google yang lain seperti Terjemah, Carian dan iklan. Anda boleh menyesuaikan ciri ini dalam Tetapan.</translation> <translation id="1637224376458524414">Dapatkan penanda halaman ini pada iPhone anda</translation> <translation id="1637765355341780467">Berlaku kesilapan semasa membuka profil anda. Sesetengah ciri mungkin tidak tersedia.</translation> <translation id="1639239467298939599">Memuatkan</translation> @@ -455,6 +457,7 @@ <translation id="166179487779922818">Kata laluan terlalu pendek.</translation> <translation id="1661867754829461514">PIN tiada</translation> <translation id="16620462294541761">Maaf, kata laluan anda tidak dapat disahkan. Sila cuba semula.</translation> +<translation id="1662550410081243962">Simpan dan lengkapkan kaedah pembayaran</translation> <translation id="166278006618318542">Algoritma Kekunci Awam Subjek</translation> <translation id="166439687370499867">Penukaran konfigurasi rangkaian kongsi tidak dibenarkan</translation> <translation id="1665611772925418501">Fail tidak boleh diubah suai.</translation> @@ -464,6 +467,7 @@ <translation id="1673137583248014546"><ph name="URL" /> ingin melihat jenama dan model Kunci Keselamatan anda</translation> <translation id="167832068858235403">kurangkan kelantangan</translation> <translation id="1679068421605151609">Alat Pembangun</translation> +<translation id="1680849702532889074">Ralat telah berlaku semasa pemasangan aplikasi Linux anda.</translation> <translation id="16815041330799488">Jangan benarkan tapak melihat teks dan imej yang disalin ke papan keratan</translation> <translation id="1682548588986054654">Tetingkap Inkognito Baharu</translation> <translation id="168715261339224929">Hidupkan penyegerakan untuk mendapatkan penanda halaman pada semua peranti anda.</translation> @@ -499,6 +503,7 @@ <translation id="1732215134274276513">Tab Buka Pin</translation> <translation id="1734824808160898225"><ph name="PRODUCT_NAME" /> mungkin tidak dapat mengemas kini dengan sendirinya</translation> <translation id="1736419249208073774">Teroka</translation> +<translation id="1736827427463982819">Matikan Linux (Beta)</translation> <translation id="1737968601308870607">Failkan pepijat</translation> <translation id="1741314857973421784">Teruskan</translation> <translation id="174173592514158117">Tunjukkan semua folder Play</translation> @@ -671,6 +676,7 @@ <translation id="1997484222658892567"><ph name="URL" /> mahu menyimpan data bersaiz besar pada komputer setempat anda secara kekal</translation> <translation id="1997616988432401742">Sijil anda</translation> <translation id="1999115740519098545">Pada permulaan</translation> +<translation id="2000419248597011803">Menghantar beberapa kuki dan carian daripada bar alamat dan kotak carian ke enjin carian lalai anda</translation> <translation id="2001796770603320721">Urus dalam Drive</translation> <translation id="2004663115385769400">Tidak dapat membuka dengan $1</translation> <translation id="200544492091181894">Anda boleh menukar ciri ini dalam tetapan pada bila-bila masa</translation> @@ -697,6 +703,7 @@ <translation id="2045969484888636535">Terus menyekat kuki</translation> <translation id="204622017488417136">Peranti anda akan kembali ke versi Chrome yang dipasang sebelum ini. Semua akaun pengguna dan data setempat akan dialih keluar. Proses ini tidak boleh dibuat asal.</translation> <translation id="2048182445208425546">Akses trafik rangkaian anda</translation> +<translation id="2048653237708779538">Tindakan tidak tersedia</translation> <translation id="204914487372604757">Cipta pintasan</translation> <translation id="2050339315714019657">Potret</translation> <translation id="2053312383184521053">Data Keadaan Melahu</translation> @@ -785,6 +792,7 @@ <translation id="2178098616815594724">Pemalam <ph name="PEPPER_PLUGIN_NAME" /> di <ph name="PEPPER_PLUGIN_DOMAIN" /> ingin mengakses komputer anda</translation> <translation id="2178614541317717477">Tolak ansur CA</translation> <translation id="218070003709087997">Gunakan nombor untuk menunjukkan bilangan salinan untuk dicetak (1 hingga 999).</translation> +<translation id="2183558561014688873">Akses Assistant anda pada bila-bila masa anda menyebut "OK Google" semasa skrin anda hidup dan tidak berkunci.</translation> <translation id="2187895286714876935">Ralat Import Sijil Pelayan</translation> <translation id="2187906491731510095">Sambungan dikemas kini</translation> <translation id="2188881192257509750">Buka <ph name="APPLICATION" /></translation> @@ -856,6 +864,7 @@ <translation id="2282146716419988068">Proses GPU</translation> <translation id="2282155092769082568">URL autokonfigurasi:</translation> <translation id="2283117145434822734">F6</translation> +<translation id="2283340219607151381">Simpan dan lengkapkan alamat</translation> <translation id="2286841657746966508">Alamat pengebilan</translation> <translation id="2288181517385084064">Beralih kepada perakam video</translation> <translation id="2288735659267887385">Tetapan kebolehaksesan</translation> @@ -937,6 +946,7 @@ <translation id="2425665904502185219">Jumlah saiz fail</translation> <translation id="2428510569851653187">Terangkan perkara yang sedang anda lakukan semasa ranap tab berlaku</translation> <translation id="2431027948063157455">Google Assistant tidak dapat dimuatkan, sila periksa sambungan rangkaian anda, kemudian cuba semula.</translation> +<translation id="2432753757290432042">Kemas kini Linux (Beta) diperlukan</translation> <translation id="2433452467737464329">Tambahkan parameter pertanyaan dalam URL untuk auto muat semula halaman: chrome://network/?refresh=<sec></translation> <translation id="2433507940547922241">Tampilan</translation> <translation id="2433836460518180625">Buka kunci peranti sahaja</translation> @@ -1187,6 +1197,7 @@ <translation id="2775104091073479743">Edit Cap Jari</translation> <translation id="2776441542064982094">Nampaknya tiada peranti tersedia untuk didaftarkan di rangkaian. Jika peranti anda hidup dan disambungkan ke internet, cuba daftarkannya menggunakan arahan yang terdapat dalam manual arahannya.</translation> <translation id="2781692009645368755">Google Pay</translation> +<translation id="2782104745158847185">Ralat semasa memasang aplikasi Linux</translation> <translation id="2783298271312924866">Sudah dimuat turun</translation> <translation id="2783321960289401138">Buat pintasan...</translation> <translation id="2783829359200813069">Pilih jenis penyulitan</translation> @@ -1211,6 +1222,7 @@ <translation id="2812944337881233323">Cuba log keluar dan log masuk semula</translation> <translation id="2812989263793994277">Jangan paparkan sebarang imej</translation> <translation id="2814489978934728345">Berhenti memuatkan halaman ini</translation> +<translation id="281504910091592009">Lihat dan urus kata laluan yang disimpan dalam <ph name="BEGIN_LINK" />Akaun Google<ph name="END_LINK" /> anda</translation> <translation id="2815500128677761940">Bar penanda halaman</translation> <translation id="2815693974042551705">Folder penanda halaman</translation> <translation id="2818476747334107629">Butiran pencetak</translation> @@ -1291,6 +1303,7 @@ <translation id="2939938020978911855">Tunjukkan peranti Bluetooth yang tersedia</translation> <translation id="2941112035454246133">Rendah</translation> <translation id="2942560570858569904">Menunggu...</translation> +<translation id="2942581856830209953">Peribadikan halaman ini</translation> <translation id="2943400156390503548">Slaid</translation> <translation id="2943503720238418293">Gunakan nama yang lebih pendek</translation> <translation id="2946119680249604491">Tambah sambungan</translation> @@ -1777,6 +1790,7 @@ <translation id="3693415264595406141">Kata laluan:</translation> <translation id="3694027410380121301">Pilih Tab Sebelumnya</translation> <translation id="3699624789011381381">Alamat e-mel</translation> +<translation id="3699920817649120894">Matikan penyegerakan dan pemperibadian?</translation> <translation id="3700888195348409686">Mempersembahkan (<ph name="PAGE_ORIGIN" />)</translation> <translation id="3702500414347826004">Halaman permulaan anda telah ditukar untuk menyertakan <ph name="URL" />.</translation> <translation id="370415077757856453">JavaScript disekat</translation> @@ -1874,6 +1888,7 @@ <translation id="3827774300009121996">&Skrin Penuh</translation> <translation id="3828029223314399057">Cari penanda halaman</translation> <translation id="3830674330436234648">Main balik tidak tersedia</translation> +<translation id="3831436149286513437">Cadangan carian Google Drive</translation> <translation id="3831486154586836914">Memasuki mod gambaran keseluruhan tetingkap</translation> <translation id="383161972796689579">Pemilik peranti ini telah melumpuhkan pengguna baharu daripada ditambah</translation> <translation id="3834775135533257713">Tidak dapat menambahkan aplikasi "<ph name="TO_INSTALL_APP_NAME" />" kerana bercanggah dengan "<ph name="INSTALLED_APP_NAME" />".</translation> @@ -1907,6 +1922,7 @@ <translation id="3871092408932389764">Terendah</translation> <translation id="3872220884670338524">Lagi tindakan, akaun disimpan untuk <ph name="USERNAME" /> di <ph name="DOMAIN" /></translation> <translation id="3872991219937722530">Kosongkan ruang cakera, jika tidak peranti akan menjadi tidak responsif.</translation> +<translation id="3873315167136380065">Untuk menghidupkan ciri ini, <ph name="BEGIN_LINK" />tetapkan semula penyegerakan<ph name="END_LINK" /> untuk mengalih keluar ungkapan laluan penyegerakan anda</translation> <translation id="3878840326289104869">Menghasilkan pengguna diselia</translation> <translation id="3879748587602334249">Pengurus muat turun</translation> <translation id="3880709822663530586">Kunci Keselamatan anda hanya berfungsi apabila Bluetooth peranti dihidupkan</translation> @@ -2030,6 +2046,7 @@ <translation id="4068776064906523561">Cap jari disimpan</translation> <translation id="407173827865827707">Apabila diklik</translation> <translation id="4071770069230198275"><ph name="PROFILE_NAME" /> : ralat log masuk</translation> +<translation id="4071828814509176232">OK Google</translation> <translation id="4074900173531346617">Sijil Penandatangan E-mel</translation> <translation id="407520071244661467">Skala</translation> <translation id="4075639477629295004">Tidak dapat menghantar <ph name="FILE_NAME" />.</translation> @@ -2097,6 +2114,7 @@ <translation id="4192273449750167573">Semak tetapan anda pada skrin seterusnya</translation> <translation id="4193154014135846272">Dokumen Google</translation> <translation id="4194570336751258953">Dayakan ketik untuk klik</translation> +<translation id="4195249722193633765">Pasang apl dengan Linux (Beta)</translation> <translation id="4195643157523330669">Buka dalam tab baharu</translation> <translation id="4195814663415092787">Sambung semula dari tempat anda berhenti</translation> <translation id="4197674956721858839">Pemilihan zip</translation> @@ -2157,7 +2175,9 @@ <translation id="428608937826130504">Item rak 8</translation> <translation id="4287502004382794929">Anda tidak mempunyai lesen perisian yang cukup untuk mendaftarkan peranti ini. Sila hubungi bahagian jualan untuk membeli lagi. Jika anda percaya anda melihat mesej yang salah, sila hubungi sokongan.</translation> <translation id="4289540628985791613">Gambaran keseluruhan</translation> +<translation id="4295072614469448764">Apl tersedia di terminal anda. Mungkin terdapat ikon dalam Pelancar anda juga.</translation> <translation id="4296575653627536209">Tambahkan Pengguna di Bawah Seliaan</translation> +<translation id="4297219207642690536">Mulakan semula dan tetapkan semula</translation> <translation id="4297322094678649474">Tukar Bahasa</translation> <translation id="4300305918532693141">Untuk menukar tetapan ini, <ph name="BEGIN_LINK" />tetapkan semula penyegerakan<ph name="END_LINK" />.</translation> <translation id="4305227814872083840">panjang (2s)</translation> @@ -2193,6 +2213,7 @@ <translation id="4370975561335139969">E-mel dan kata laluan yang anda masukkan tidak padan</translation> <translation id="437184764829821926">Tetapan fon terperinci</translation> <translation id="4372884569765913867">1x1</translation> +<translation id="4374831787438678295">Pemasang Linux</translation> <translation id="4375035964737468845">Buka fail yang dimuat turun</translation> <translation id="4377363674125277448">Berlaku masalah dengan sijil pelayan.</translation> <translation id="4378154925671717803">Telefon</translation> @@ -2311,6 +2332,7 @@ <translation id="4576541033847873020">Gandingkan peranti Bluetooth</translation> <translation id="4579581181964204535">Tidak dapat menghantar <ph name="HOST_NAME" />.</translation> <translation id="4580526846085481512">Adakah anda pasti anda mahu memadamkan item $1?</translation> +<translation id="4582497162516204941">Pasang dengan Linux (Beta)</translation> <translation id="4582563038311694664">Tetapkan semula semua tetapan</translation> <translation id="4585793705637313973">Edit halaman</translation> <translation id="4589268276914962177">Terminal baharu</translation> @@ -2554,6 +2576,7 @@ <translation id="4953808748584563296">Avatar jingga lalai</translation> <translation id="4955814292505481804">Tahunan</translation> <translation id="4957949153200969297">Dayakan ciri yang berkaitan dengan Penyegerakan <ph name="IDS_SHORT_PRODUCT_NAME" /> sahaja</translation> +<translation id="4959262764292427323">Kata laluan disimpan dalam Akaun Google anda supaya anda dapat menggunakannya pada mana-mana peranti</translation> <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation> <translation id="4961000125720751066">Dapatkan kad anda di satu tempat</translation> <translation id="496226124210045887">Folder yang anda pilih mengandungi fail sensitif. Adakah anda pasti mahu memberikan "$1" akses membaca tetap kepada folder ini?</translation> @@ -2734,6 +2757,7 @@ <translation id="5240817131241497236">Tetapan yang mengawal penyegerakan, pemperibadian dan perkhidmatan Google yang lain dalam Chrome telah berubah. Perubahan ini mungkin mempengaruhi tetapan semasa anda.</translation> <translation id="5241128660650683457">Baca semua data anda di tapak web yang anda lawati</translation> <translation id="5242724311594467048">Dayakan "<ph name="EXTENSION_NAME" />"?</translation> +<translation id="5243522832766285132">Sila cuba lagi dalam beberapa ketika</translation> <translation id="5244474230056479698">Menyegerak ke <ph name="EMAIL" /></translation> <translation id="5246282308050205996"><ph name="APP_NAME" /> telah mengalami nahas. Klik belon ini untuk memulakan semula apl.</translation> <translation id="5247051749037287028">Nama paparan (pilihan)</translation> @@ -2756,6 +2780,7 @@ <translation id="5264148714798105376">Proses ini mungkin mengambil masa seminit atau lebih.</translation> <translation id="5264252276333215551">Sila sambung ke Internet untuk melancarkan apl anda dalam mod kios.</translation> <translation id="5265562206369321422">Di luar talian selama lebih seminggu</translation> +<translation id="5265797726250773323">Ralat semasa pemasangan</translation> <translation id="5266113311903163739">Ralat Import Pihak Berkuasa Pensijilan</translation> <translation id="5269977353971873915">Cetakan Gagal</translation> <translation id="5271549068863921519">Simpan kata laluan</translation> @@ -2778,6 +2803,7 @@ <translation id="529175790091471945">Formatkan peranti ini</translation> <translation id="5292195676005197571">Untuk menggunakan kebanyakan kunci, tekan sahaja butangnya</translation> <translation id="5293170712604732402">Pulihkan tetapan kepada lalai asal.</translation> +<translation id="5297082477358294722">Kata laluan disimpan. Lihat dan urus kata laluan yang disimpan dalam <ph name="SAVED_PASSWORDS_STORE" /> anda.</translation> <translation id="5298219193514155779">Tema dicipta oleh</translation> <translation id="5299109548848736476">Jangan Kesan</translation> <translation id="5299682071747318445">Semua data disulitkan dengan frasa laluan segerak anda</translation> @@ -3006,6 +3032,7 @@ <translation id="5612720917913232150"><ph name="URL" /> mahu menggunakan lokasi komputer anda</translation> <translation id="5612734644261457353">Maaf, kata laluan anda masih tidak dapat disahkan. Perhatian: jika anda menukar kata laluan anda baru-baru ini, kata laluan baharu anda akan digunakan apabila anda log keluar, sila gunakan kata laluan yang lama di sini.</translation> <translation id="5614190747811328134">Notis Pengguna</translation> +<translation id="5614553682702429503">Simpan kata laluan?</translation> <translation id="561698261642843490">Tutup Firefox</translation> <translation id="5618075537869101857">Alamak, aplikasi kios tidak dapat dilancarkan.</translation> <translation id="5618333180342767515">(ini mungkin mengambil masa beberapa minit)</translation> @@ -3046,6 +3073,7 @@ <translation id="5677503058916217575">Bahasa halaman:</translation> <translation id="5677928146339483299">Disekat</translation> <translation id="5678550637669481956">Akses baca dan tulis kepada <ph name="VOLUME_NAME" /> telah diberikan.</translation> +<translation id="5678784840044122290">Aplikasi Linux akan tersedia di dalam Terminal anda dan mungkin menunjukkan ikon dalam Pelancar anda juga.</translation> <translation id="5678955352098267522">Baca data anda di <ph name="WEBSITE_1" /></translation> <translation id="5684661240348539843">Pengecam Aset</translation> <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Tidak dapat memutuskan sambungan daripada arkib atau cakera maya<ph name="END_BOLD" /> @@ -3141,6 +3169,7 @@ <translation id="5832805196449965646">Tambah Orang</translation> <translation id="583281660410589416">Tidak diketahui</translation> <translation id="5832976493438355584">Dikunci</translation> +<translation id="5833397272224757657">Menggunakan kandungan di tapak yang anda lawati dan aktiviti serta interaksi penyemak imbas untuk pemperibadian</translation> <translation id="5833610766403489739">Fail ini ada di tempat lain. Sila semak tetapan lokasi muat turun anda, kemudian cuba lagi.</translation> <translation id="5833726373896279253">Tetapan ini hanya boleh diubah suai oleh pemilik:</translation> <translation id="5834581999798853053">Tinggal kira-kira <ph name="TIME" /> minit</translation> @@ -3194,6 +3223,7 @@ <translation id="5908769186679515905">Sekat tapak daripada menjalankan Flash</translation> <translation id="5910363049092958439">Si&mpan Imej Sebagai...</translation> <translation id="5911737117543891828">Fail luar talian sementara Google Drive akan dipadamkan. Fail yang telah ditetapkan sebagai tersedia di luar talian tidak akan dipadamkan daripada peranti ini.</translation> +<translation id="5911887972742538906">Ralat telah berlaku semasa pemasangan aplikasi Linux anda.</translation> <translation id="5912378097832178659">&Edit enjin carian...</translation> <translation id="5914724413750400082">Modulus (<ph name="MODULUS_NUM_BITS" /> bit): <ph name="MODULUS_HEX_DUMP" /> @@ -3380,6 +3410,7 @@ <translation id="6198102561359457428">Log keluar kemudian log masuk semula...</translation> <translation id="6198252989419008588">Tukar PIN</translation> <translation id="6199801702437275229">Menunggu maklumat ruang...</translation> +<translation id="6201792273624501289">Apl Linux</translation> <translation id="6204015976622790023">Lihat cadangan yang berkaitan daripada Assistant anda, yang berkaitan dengan item yang dipaparkan pada skrin anda.</translation> <translation id="6205710420833115353">Sesetengah operasi mengambil masa lebih lama daripada yang dijangkakan. Adakah anda ingin menghenti paksanya?</translation> <translation id="6206311232642889873">Sal&in Imej</translation> @@ -3856,6 +3887,7 @@ <translation id="6945221475159498467">Pilih</translation> <translation id="694592694773692225">Ubah hala disekat pada halaman ini.</translation> <translation id="6949306908218145636">Tandakan Halaman Terbuka...</translation> +<translation id="6950627417367801484">Pulihkan apl</translation> <translation id="6951153907720526401">Pengendali Pembayaran</translation> <translation id="6955446738988643816">Semak Pop Timbul</translation> <translation id="6957231940976260713">Nama perkhidmatan</translation> @@ -3981,6 +4013,7 @@ <translation id="7127980134843952133">Sejarah muat turun</translation> <translation id="7131040479572660648">Baca data anda di <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> dan <ph name="WEBSITE_3" /></translation> <translation id="713122686776214250">Tambah ha&laman...</translation> +<translation id="7133578150266914903">Pentadbir anda sedang membalikkan peranti ini (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="7134098520442464001">Jadikan Teks Lebih Kecil</translation> <translation id="7136694880210472378">Jadikan lalai</translation> <translation id="7136984461011502314">Selamat datang ke <ph name="PRODUCT_NAME" /></translation> @@ -4156,7 +4189,6 @@ <translation id="7410344089573941623">Tanya jika <ph name="HOST" /> ingin mengakses kamera dan mikrofon anda</translation> <translation id="741204030948306876">Ya, saya setuju</translation> <translation id="7412226954991670867">Memori GPU</translation> -<translation id="7413455776853560343">Sesuaikan latar</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Ralat rangkaian tidak diketahui</translation> <translation id="7417705661718309329">Peta Google</translation> @@ -4182,6 +4214,7 @@ <translation id="7463006580194749499">Tambah orang</translation> <translation id="7464490149090366184">Gagal mengezip, item wujud: $1</translation> <translation id="7465778193084373987">URL Pembatalan Sijil Netscape</translation> +<translation id="7469406957790636836">Untuk menghidupkan ciri ini, hidupkan semakan ejaan dahulu dalam <ph name="BEGIN_LINK" />Bahasa dan input<ph name="END_LINK" /></translation> <translation id="7469894403370665791">Menyambung ke rangkaian ini secara automatik</translation> <translation id="747114903913869239">Ralat: Tidak dapat menyahkod sambungan</translation> <translation id="7473753388963818366">Mari sediakan <ph name="DEVICE_TYPE" /> anda</translation> @@ -4279,6 +4312,7 @@ <translation id="7606992457248886637">Pihak Berkuasa</translation> <translation id="7607002721634913082">Dijeda</translation> <translation id="7607274158153386860">Minta tapak tablet</translation> +<translation id="7609148976235050828">Sila sambung ke Internet dan cuba lagi.</translation> <translation id="7611008212562900400">Carian peranti anda, apl, web...</translation> <translation id="7616214729753637086">Mendaftarkan peranti...</translation> <translation id="7617366389578322136">Menyambung ke "<ph name="DEVICE_NAME" />"</translation> @@ -4347,6 +4381,7 @@ <translation id="7730449930968088409">Abadikan kandungan skrin anda</translation> <translation id="7730494089396812859">Tunjukkan butiran sandaran Awan</translation> <translation id="7732111077498238432">Rangkaian dikawal oleh dasar</translation> +<translation id="7737238973539693982">Padamkan Linux (Beta)</translation> <translation id="773905249182896430">Melindungi anda dan peranti anda daripada tapak yang berbahaya</translation> <translation id="7740996059027112821">Standard</translation> <translation id="7748528009589593815">Tab sebelumnya</translation> @@ -4357,7 +4392,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Laraskan sempadan paparan anda</translation> <translation id="7760004034676677601">Adakah ini halaman permulaan yang anda jangkakan?</translation> -<translation id="7760756088376329221">Pilih Album Google Photo</translation> <translation id="7764225426217299476">Tambahkan alamat</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> daripada <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Alih</translation> @@ -4537,6 +4571,7 @@ <translation id="7974936243149753750">Terlebih imbas</translation> <translation id="7977551819349545646">Mengemas kini Chromebox...</translation> <translation id="7978412674231730200">Kunci persendirian</translation> +<translation id="7978450511781612192">Tindakan ini akan menyebabkan anda log keluar daripada Akaun Google anda. Penanda halaman, sejarah, kata laluan dan pelbagai lagi tidak akan disegerakkan lagi.</translation> <translation id="7979036127916589816">Ralat Segerak</translation> <translation id="7980084013673500153">ID Aset: <ph name="ASSET_ID" /></translation> <translation id="7981313251711023384">Pramuat halaman untuk penyemakan imbas dan pencarian yang lebih cepat</translation> @@ -4701,6 +4736,7 @@ <translation id="8226619461731305576">Baris Gilir</translation> <translation id="8226742006292257240">Di bawah adalah kata laluan TPM yang dijana secara rawak yang diperuntukkan kepada komputer anda:</translation> <translation id="8227119283605456246">Lampirkan fail</translation> +<translation id="8230134520748321204">Simpan kata laluan untuk <ph name="ORIGIN" />?</translation> <translation id="8234795456569844941">Sila bantu jurutera kami menyelesaikan masalah ini. Beritahu kami perkara yang berlaku sejurus sebelum anda mendapat mesej ralat profil:</translation> <translation id="8234989666557591529">Pilih telefon anda untuk membuka kunci <ph name="DEVICE_TYPE" /></translation> <translation id="8239020549147958415">Segerakkan sebagai <ph name="FULL_NAME" /></translation> @@ -4820,6 +4856,7 @@ <translation id="8438328416656800239">Tukar kepada penyemak imbas pintar</translation> <translation id="8438566539970814960">Mempertingkatkan carian dan penyemakan imbas</translation> <translation id="8439506636278576865">Tawaran untuk menterjemahkan halaman dalam bahasa ini</translation> +<translation id="8440630305826533614">Apl Linux</translation> <translation id="8446884382197647889">Ketahui Lebih Lanjut</translation> <translation id="8447409163267621480">Termasuk sama ada Ctrl atau Alt</translation> <translation id="8448729345478502352">Kecilkan atau besarkan item pada skrin anda</translation> @@ -4864,6 +4901,7 @@ <translation id="8497219075884839166">Windows Utilities</translation> <translation id="8498214519255567734">Memudahkan anda melihat skrin atau membaca dalam cahaya malap</translation> <translation id="8498395510292172881">Teruskan membaca dalam Chrome</translation> +<translation id="8502536196501630039">Untuk menggunakan apl daripada Google Play, anda mesti memulihkan apl anda dahulu. Sesetengah data mungkin hilang.</translation> <translation id="8503813439785031346">Nama pengguna</translation> <translation id="850875081535031620">Tiada perisian berbahaya ditemui</translation> <translation id="8509646642152301857">Muat turun kamus semakan ejaan gagal.</translation> @@ -4993,6 +5031,7 @@ <translation id="8698464937041809063">Lukisan Google</translation> <translation id="869884720829132584">Menu aplikasi</translation> <translation id="869891660844655955">Tarikh tamat tempoh</translation> +<translation id="8699566574894671540">Untuk menghidupkan ciri ini, mula-mula pilih Semak Ejaan Semasa Menaip dalam menu Edit</translation> <translation id="870073306461175568">Perkongsian Fail Rangkaian</translation> <translation id="8701677791353449257">Nama peranti mesti sepadan dengan ungkapan nalar <ph name="REGEX" />.</translation> <translation id="8704521619148782536">Ini mengambil masa lebih lama daripada biasa. Anda boleh terus menunggu atau batalkan dan cuba sebentar lagi.</translation> @@ -5032,6 +5071,7 @@ <p>Tetapi anda masih boleh mengkonfigurasi melalui garis perintah. Sila lihat <code>man <ph name="PRODUCT_BINARY_NAME" /></code> untuk mendapatkan maklumat lanjut mengenai bendera dan pemboleh ubah persekitaran.</p></translation> <translation id="8755376271068075440">&Lebih besar</translation> +<translation id="8756969031206844760">Kemas kini kata laluan?</translation> <translation id="8757090071857742562">Tidak dapat menghantar desktop. Semak untuk melihat sama ada anda telah mengesahkan gesaan untuk mula berkongsi skrin.</translation> <translation id="8757640015637159332">Masuk ke sesi awam</translation> <translation id="8757742102600829832">Memilih Chromebox untuk menyambung ke</translation> @@ -5188,7 +5228,9 @@ <translation id="9009369504041480176">Memuat turun (<ph name="PROGRESS_PERCENT" />%)...</translation> <translation id="9011163749350026987">Sentiasa tunjukkan ikon</translation> <translation id="9011178328451474963">Tab lalu</translation> +<translation id="9013707997379828817">Pentadbir anda membalikkan peranti ini. Sila simpan fail penting, kemudian mulakan semula. Semua data pada peranti akan dipadamkan.</translation> <translation id="9014987600015527693">Tunjukkan telefon lain</translation> +<translation id="9018218886431812662">Pemasangan selesai</translation> <translation id="901834265349196618">e-mel</translation> <translation id="9019062154811256702">Baca dan tukar tetapan autolengkap</translation> <translation id="9020362265352758658">4x</translation> @@ -5212,6 +5254,7 @@ <translation id="9038649477754266430">Gunakan perkhidmatan ramalan untuk memuatkan halaman lebih cepat</translation> <translation id="9039663905644212491">PEAP</translation> <translation id="9039890312082871605">Redam Beberapa Tab</translation> +<translation id="9040661932550800571">Kemas kini kata laluan untuk <ph name="ORIGIN" />?</translation> <translation id="9041692268811217999">Akses kepada fail setempat pada mesin anda dilumpuhkan oleh pentadbir anda</translation> <translation id="9042893549633094279">Privasi dan keselamatan</translation> <translation id="904451693890288097">Sila masukkan kekunci laluan untuk "<ph name="DEVICE_NAME" />":</translation> @@ -5316,6 +5359,7 @@ <translation id="9203478404496196495">Nyahredam Tab</translation> <translation id="9203904171912129171">Pilih peranti</translation> <translation id="9203962528777363226">Pentadbir peranti ini telah melumpuhkan pengguna baharu daripada ditambah</translation> +<translation id="9213073329713032541">Pemasangan berjaya dimulakan.</translation> <translation id="9214520840402538427">Alamak! Pemulaan sifat masa pemasangan telah tamat masa. Sila hubungi wakil sokongan anda.</translation> <translation id="9214695392875603905">Kek cawan</translation> <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" ditambah</translation> @@ -5370,6 +5414,7 @@ <translation id="988978206646512040">Ungkapan laluan yang dikosongkan tidak dibenarkan</translation> <translation id="992032470292211616">Sambungan, apl dan tema boleh mengancam peranti anda. Adakah anda pasti mahu meneruskan?</translation> <translation id="992592832486024913">Lumpuhkan ChromeVox (maklum balas dituturkan)</translation> +<translation id="993540765962421562">Pemasangan sedang berlangsung</translation> <translation id="994289308992179865">&Gelung</translation> <translation id="996250603853062861">Mengukuhkan sambungan selamat...</translation> <translation id="998747458861718449">S&emak</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 411f195..4ca8623 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Onbekende fout</translation> <translation id="119738088725604856">Screenshot van venster</translation> <translation id="1197979282329025000">Er is een fout opgetreden tijdens het ophalen van de printermogelijkheden voor de printer <ph name="PRINTER_NAME" />. Deze printer kan niet worden geregistreerd met <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Aan de slag</translation> <translation id="119944043368869598">Alles wissen</translation> <translation id="1201402288615127009">Volgende</translation> <translation id="1202596434010270079">De Kiosk-app is geüpdatet. Verwijder de USB-stick.</translation> @@ -4156,7 +4155,6 @@ <translation id="7410344089573941623">Vragen of <ph name="HOST" /> toegang wil tot je camera en microfoon</translation> <translation id="741204030948306876">Ja, inschakelen</translation> <translation id="7412226954991670867">GPU-geheugen</translation> -<translation id="7413455776853560343">Achtergrond aanpassen</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Onbekende netwerkfout.</translation> <translation id="7417705661718309329">Google-kaart</translation> @@ -4357,7 +4355,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">De grenzen van je display aanpassen</translation> <translation id="7760004034676677601">Is dit de homepage die je had verwacht?</translation> -<translation id="7760756088376329221">Een Google Foto's-album selecteren</translation> <translation id="7764225426217299476">Adres toevoegen</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> van <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Verplaatsen</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 03730248..73880f4 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Ukjent feil.</translation> <translation id="119738088725604856">Ta en skjermdump av vinduet</translation> <translation id="1197979282329025000">Det oppstod en feil under henting av utskriftfunksjonaliteter for skriveren <ph name="PRINTER_NAME" />. Denne skriveren kunne ikke registreres for <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">La oss komme i gang</translation> <translation id="119944043368869598">Fjern alle</translation> <translation id="1201402288615127009">Neste</translation> <translation id="1202596434010270079">Kiosk-appen er oppdatert. Ta ut USB-pinnen.</translation> @@ -4123,7 +4122,6 @@ <translation id="7410344089573941623">Spør om <ph name="HOST" /> ønsker å bruke kameraet og mikrofonen din</translation> <translation id="741204030948306876">Ja, jeg er med</translation> <translation id="7412226954991670867">GPU-minne</translation> -<translation id="7413455776853560343">Tilpass bakgrunnen</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Ukjent nettverksfeil.</translation> <translation id="7417705661718309329">Google Maps</translation> @@ -4319,7 +4317,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Juster grensene for skjermen</translation> <translation id="7760004034676677601">Er dette oppstartssiden du forventet?</translation> -<translation id="7760756088376329221">Velg et Google Foto-album</translation> <translation id="7764225426217299476">Legg til adresse</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> fra <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Flytt</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 9d3c6d9..c2ae4b9 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Nieznany błąd.</translation> <translation id="119738088725604856">Okno zrzutu ekranu</translation> <translation id="1197979282329025000">Podczas pobierania informacji o możliwościach drukarki <ph name="PRINTER_NAME" /> wystąpił błąd. Nie można zarejestrować tej drukarki w usłudze <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Zaczynamy</translation> <translation id="119944043368869598">Wyczyść wszystko</translation> <translation id="1201402288615127009">Dalej</translation> <translation id="1202596434010270079">Aplikacja kiosku została zaktualizowana. Odłącz pamięć USB.</translation> @@ -4155,7 +4154,6 @@ <translation id="7410344089573941623">Pytaj, gdy witryna <ph name="HOST" /> chce mieć dostęp do kamery i mikrofonu</translation> <translation id="741204030948306876">Tak</translation> <translation id="7412226954991670867">Pamięć GPU</translation> -<translation id="7413455776853560343">Dostosuj tło</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Nieznany błąd sieci</translation> <translation id="7417705661718309329">Mapa Google</translation> @@ -4356,7 +4354,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Dostosuj krawędzie ekranu</translation> <translation id="7760004034676677601">Czy to oczekiwana strona początkowa?</translation> -<translation id="7760756088376329221">Wybierz album w Zdjęciach Google</translation> <translation id="7764225426217299476">Dodaj adres</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> z <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Przenieś</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 6a5810e6..efe6e7c 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Erro desconhecido.</translation> <translation id="119738088725604856">Janela de captura de tela</translation> <translation id="1197979282329025000">Ocorreu um erro durante a recuperação dos recursos da impressora <ph name="PRINTER_NAME" />. Essa impressora não pôde ser registrada com <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Começando...</translation> <translation id="119944043368869598">Limpar tudo</translation> <translation id="1201402288615127009">Próxima</translation> <translation id="1202596434010270079">O aplicativo de quiosque foi atualizado. Remova o pendrive.</translation> @@ -4157,7 +4156,6 @@ <translation id="7410344089573941623">Perguntar se <ph name="HOST" /> deseja acessar sua câmera e seu microfone</translation> <translation id="741204030948306876">Sim</translation> <translation id="7412226954991670867">Memória GPU</translation> -<translation id="7413455776853560343">Personalizar plano de fundo</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Erro de rede desconhecido.</translation> <translation id="7417705661718309329">Mapa do Google</translation> @@ -4358,7 +4356,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ajuste os limites da sua tela</translation> <translation id="7760004034676677601">Esta é a página de inicialização que você esperava?</translation> -<translation id="7760756088376329221">Selecione um álbum do Google Fotos</translation> <translation id="7764225426217299476">Adicionar endereço</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> de <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Mover</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index caa738c7f..534d3564 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Erro desconhecido.</translation> <translation id="119738088725604856">Janela de captura de ecrã</translation> <translation id="1197979282329025000">Ocorreu um erro ao obter as capacidades da impressora <ph name="PRINTER_NAME" />. Não foi possível registar esta impressora em <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Vamos começar</translation> <translation id="119944043368869598">Limpar tudo</translation> <translation id="1201402288615127009">Seguinte</translation> <translation id="1202596434010270079">A aplicação Quiosque foi atualizada. Remova a pen USB.</translation> @@ -4157,7 +4156,6 @@ <translation id="7410344089573941623">Perguntar se <ph name="HOST" /> pretende aceder à sua câmara e microfone</translation> <translation id="741204030948306876">Sim, aceito</translation> <translation id="7412226954991670867">Memória GPU</translation> -<translation id="7413455776853560343">Personalizar fundo</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Erro de rede desconhecido.</translation> <translation id="7417705661718309329">Mapa Google</translation> @@ -4358,7 +4356,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ajustar os limites do ecrã</translation> <translation id="7760004034676677601">É esta a página inicial de que estava à espera?</translation> -<translation id="7760756088376329221">Selecionar um álbum do Google Fotos</translation> <translation id="7764225426217299476">Adicionar endereço</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> de <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Mover</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index f9b18652..04af717 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Eroare necunoscută.</translation> <translation id="119738088725604856">Face o captură de ecran a ferestrei</translation> <translation id="1197979282329025000">A apărut o eroare la preluarea caracteristicilor imprimantei <ph name="PRINTER_NAME" />. Această imprimantă nu a putut fi înregistrată la <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Să începem</translation> <translation id="119944043368869598">Șterge-le pe toate</translation> <translation id="1201402288615127009">Înainte</translation> <translation id="1202596434010270079">Aplicația de tip chioșc a fost actualizată. Scoate stickul USB.</translation> @@ -4155,7 +4154,6 @@ <translation id="7410344089573941623">Întreabă dacă <ph name="HOST" /> solicită acces la camera și microfonul meu</translation> <translation id="741204030948306876">Da, accept</translation> <translation id="7412226954991670867">Memorie GPU</translation> -<translation id="7413455776853560343">Personalizează fundalul</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Eroare de rețea necunoscută.</translation> <translation id="7417705661718309329">Hartă Google</translation> @@ -4356,7 +4354,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ajustează delimitările afișajului</translation> <translation id="7760004034676677601">Aceasta este pagina de pornire la care vă așteptați?</translation> -<translation id="7760756088376329221">Selectează un album Google Foto</translation> <translation id="7764225426217299476">Adaugă o adresă</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> de la <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Mută</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index a1363c21..4d9a161 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Неизвестная ошибка.</translation> <translation id="119738088725604856">Скриншот окна</translation> <translation id="1197979282329025000">При получении данных о свойствах принтера <ph name="PRINTER_NAME" /> произошла ошибка. Не удалось зарегистрировать принтер при помощи <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Приступим!</translation> <translation id="119944043368869598">Удалить все</translation> <translation id="1201402288615127009">Далее</translation> <translation id="1202596434010270079">Киоск-приложение обновлено. Извлеките USB-накопитель.</translation> @@ -4156,7 +4155,6 @@ <translation id="7410344089573941623">Запрашивать разрешение на доступ к камере и микрофону для сайта <ph name="HOST" /></translation> <translation id="741204030948306876">ОК</translation> <translation id="7412226954991670867">Память графического процессора</translation> -<translation id="7413455776853560343">Настройка фона</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Неизвестная сетевая ошибка.</translation> <translation id="7417705661718309329">Карта Google</translation> @@ -4357,7 +4355,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Настройте границы экрана</translation> <translation id="7760004034676677601">Другая стартовая страница?</translation> -<translation id="7760756088376329221">Выберите альбом в Google Фото</translation> <translation id="7764225426217299476">Добавить адрес</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> с сайта <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Переместить</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 9a677a0c..397f675 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Neznáma chyba.</translation> <translation id="119738088725604856">Okno snímky obrazovky</translation> <translation id="1197979282329025000">Pri načítavaní funkcií tlačiarne <ph name="PRINTER_NAME" /> sa vyskytla chyba. Táto tlačiareň nemôže byť zaregistrovaná do služby <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Začnime</translation> <translation id="119944043368869598">Vymazať všetko</translation> <translation id="1201402288615127009">Ďalej</translation> <translation id="1202596434010270079">Aplikácia Kiosk bola aktualizovaná. Odoberte kľúč USB.</translation> @@ -3626,7 +3625,7 @@ <translation id="657402800789773160">&Obnoviť túto stránku</translation> <translation id="6577284282025554716">Sťahovanie bolo zrušené: <ph name="FILE_NAME" /></translation> <translation id="6578664922716508575">Šifrovať synchronizované heslá pomocou používateľského mena a hesla Google</translation> -<translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – bol zdieľaný obsah pracovnej plochy</translation> +<translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – bol zdieľaný obsah pracovnej plochy</translation> <translation id="6580151766480067746">Verzia ARC</translation> <translation id="6581162200855843583">Odkaz na službu Disk Google</translation> <translation id="6582421931165117398">Zmeňte si ihneď heslo a ochráňte tak svoje osobné informácie. Skôr ako ho budete môcť zmeniť, zobrazí sa výzva na prihlásenie.</translation> @@ -4155,7 +4154,6 @@ <translation id="7410344089573941623">Opýtať sa, ak stránky <ph name="HOST" /> chcú pristupovať ku kamere a mikrofónu</translation> <translation id="741204030948306876">Áno, súhlasím</translation> <translation id="7412226954991670867">Pamäť GPU</translation> -<translation id="7413455776853560343">Prispôsobiť pozadie</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Neznáma chyba siete</translation> <translation id="7417705661718309329">Mapa Google</translation> @@ -4356,7 +4354,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Úprava ohraničenia zobrazenia</translation> <translation id="7760004034676677601">Je toto úvodná stránka, ktorú ste čakali?</translation> -<translation id="7760756088376329221">Vybrať album Fotiek Google</translation> <translation id="7764225426217299476">Pridať adresu</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> z domény <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Presunúť</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 9c0ae49..d24d8af3 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Neznana napaka.</translation> <translation id="119738088725604856">Okno posnetka zaslona</translation> <translation id="1197979282329025000">Napaka pri prenosu zmožnosti tiskalnika <ph name="PRINTER_NAME" />. Tega tiskalnika ni mogoče registrirati za storitev <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Začnite</translation> <translation id="119944043368869598">Izbriši vse</translation> <translation id="1201402288615127009">Naprej</translation> <translation id="1202596434010270079">Aplikacija za kiosk je posodobljena. Odstranite ključek USB.</translation> @@ -4155,7 +4154,6 @@ <translation id="7410344089573941623">Vprašaj, če <ph name="HOST" /> zahteva dostop do kamere in mikrofona</translation> <translation id="741204030948306876">Da, sem za</translation> <translation id="7412226954991670867">Pomnilnik grafičnega procesorja</translation> -<translation id="7413455776853560343">Prilagodi ozadje</translation> <translation id="7414464185801331860">18 x</translation> <translation id="7416362041876611053">Neznana napaka v omrežju.</translation> <translation id="7417705661718309329">Googlov zemljevid</translation> @@ -4356,7 +4354,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Prilagodite meje zaslona</translation> <translation id="7760004034676677601">Ali je to začetna stran, ki ste jo pričakovali?</translation> -<translation id="7760756088376329221">Izberi album v Googlu Foto</translation> <translation id="7764225426217299476">Dodaj naslov</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> iz <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Premakni</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 22f06f7..b95068f 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Непозната грешка.</translation> <translation id="119738088725604856">Прозор снимка екрана</translation> <translation id="1197979282329025000">Дошло је до грешке при преузимању могућности за штампач <ph name="PRINTER_NAME" />. Тај штампач није било могуће регистровати помоћу <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Да почнемо</translation> <translation id="119944043368869598">Обриши све</translation> <translation id="1201402288615127009">Даље</translation> <translation id="1202596434010270079">Киоск апликација је ажурирана. Уклоните USB меморију.</translation> @@ -4152,7 +4151,6 @@ <translation id="7410344089573941623">Питај да ли <ph name="HOST" /> жели да приступи камери и микрофону</translation> <translation id="741204030948306876">Да, омогући</translation> <translation id="7412226954991670867">GPU меморија</translation> -<translation id="7413455776853560343">Прилагоди позадину</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Непозната грешка на мрежи.</translation> <translation id="7417705661718309329">Google мапа</translation> @@ -4353,7 +4351,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Прилагодите границе приказа</translation> <translation id="7760004034676677601">Је ли ово почетна страница коју сте очекивали?</translation> -<translation id="7760756088376329221">Изаберите Google фото-албум</translation> <translation id="7764225426217299476">Додајте адресу</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> са <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Премести</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 50eb712e..a5dc9466 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Okänt fel.</translation> <translation id="119738088725604856">Skärmdumpsfönster</translation> <translation id="1197979282329025000">Ett fel inträffade när skrivaregenskaper skulle hämtas för skrivaren <ph name="PRINTER_NAME" />. Skrivaren kunde inte registreras med <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Nu sätter vi igång</translation> <translation id="119944043368869598">Ta bort alla</translation> <translation id="1201402288615127009">Nästa</translation> <translation id="1202596434010270079">Kioskappen har uppdaterats. Ta bort USB-minnet.</translation> @@ -4154,7 +4153,6 @@ <translation id="7410344089573941623">Fråga om <ph name="HOST" /> vill använda kameran och mikrofonen</translation> <translation id="741204030948306876">Ja</translation> <translation id="7412226954991670867">GPU-minne</translation> -<translation id="7413455776853560343">Anpassa bakgrunden</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Okänt nätverksfel.</translation> <translation id="7417705661718309329">Google-karta</translation> @@ -4355,7 +4353,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Justera skärmens avgränsning</translation> <translation id="7760004034676677601">Är det här den startsida du väntade dig?</translation> -<translation id="7760756088376329221">Välj ett fotoalbum i Google Foto</translation> <translation id="7764225426217299476">Lägg till adress</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> från <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Flytta</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 658ac91c..f9f32d8 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Hitilafu isiyojulikana.</translation> <translation id="119738088725604856">Dirisha la picha ya skrini</translation> <translation id="1197979282329025000">Hitilafu imetokea wakati wa kujaribu kuonyesha mambo ambayo printa ya <ph name="PRINTER_NAME" /> inaweza kufanya. Printa hii haikuweza kusajiliwa kwenye <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Wacha tuanze</translation> <translation id="119944043368869598">Ondoa vyote</translation> <translation id="1201402288615127009">Ifuatayo</translation> <translation id="1202596434010270079">Programu ya Skrini Nzima imesasishwa. Tafadhali ondoa hifadhi ya USB.</translation> @@ -4146,7 +4145,6 @@ <translation id="7410344089573941623">Uliza iwapo <ph name="HOST" /> inataka kufikia kamera na maikrofoni yako</translation> <translation id="741204030948306876">Ndiyo, ninakubali</translation> <translation id="7412226954991670867">Kumbukumbu ya GPU</translation> -<translation id="7413455776853560343">Weka mapendeleo kwenye mandharinyuma</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Hitilafu ya mtandao isiyojulikana.</translation> <translation id="7417705661718309329">Ramani ya Google</translation> @@ -4346,7 +4344,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Rekebisha mipaka ya skrini yako</translation> <translation id="7760004034676677601">Je, huu ndio ukurasa unaoanza uliokuwa ukitarajia?</translation> -<translation id="7760756088376329221">Chagua Albamu ya Picha kwenye Google</translation> <translation id="7764225426217299476">Ongeza anwani</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> kutoka <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Sogeza</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 1807ec70..5092ed47a 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">தெரியாத பிழை.</translation> <translation id="119738088725604856">ஸ்க்ரீன்ஷாட் சாளரம்</translation> <translation id="1197979282329025000"><ph name="PRINTER_NAME" /> பிரிண்டர்க்கான, பிரிண்டர் திறன்களை மீட்டெடுக்கும்போது பிழை ஏற்பட்டது. இந்த அச்சுப் பொறியை <ph name="CLOUD_PRINT_NAME" /> உடன் பதிவு செய்யமுடியவில்லை.</translation> -<translation id="1198271701881992799">தொடங்குங்கள்</translation> <translation id="119944043368869598">அனைத்தையும் அழி</translation> <translation id="1201402288615127009">அடுத்தது</translation> <translation id="1202596434010270079">கியாஸ்க் பயன்பாடு புதுப்பிக்கப்பட்டது. USB சாதனத்தை அகற்றவும்.</translation> @@ -4156,7 +4155,6 @@ <translation id="7410344089573941623">உங்கள் கேமராவையும் மைக்ரோஃபோனையும் <ph name="HOST" /> அணுக வேண்டுமெனில் கேட்கவும்</translation> <translation id="741204030948306876">ஏற்கிறேன்</translation> <translation id="7412226954991670867">GPU நினைவகம்</translation> -<translation id="7413455776853560343">பின்னணியைத் தனிப்பயனாக்கவும்</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">அறியாத பிணையப் பிழை.</translation> <translation id="7417705661718309329">Google வரைபடம்</translation> @@ -4355,7 +4353,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">திரையின் எல்லைகளைச் சரிசெய்யவும்</translation> <translation id="7760004034676677601">இந்தத் துவக்கப் பக்கத்தைத்தான் எதிர்பார்த்தீர்களா?</translation> -<translation id="7760756088376329221">Google Photo ஆல்பத்தைத் தேர்ந்தெடு</translation> <translation id="7764225426217299476">முகவரியைச் சேர்</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> இலிருந்து <ph name="DOWNLOAD_RECEIVED" /></translation> <translation id="7765158879357617694">நகர்த்து</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index a6505f9..40f5011d 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -137,7 +137,6 @@ <translation id="1195447618553298278">తెలియని లోపం.</translation> <translation id="119738088725604856">స్క్రీన్షాట్ విండో</translation> <translation id="1197979282329025000">ముద్రకం <ph name="PRINTER_NAME" />కి ముద్రకం సామర్థ్యాలను తిరిగి పొందడంలో లోపం సంభవించింది. ఈ ముద్రకాన్ని <ph name="CLOUD_PRINT_NAME" />తో నమోదు చెయ్యడం సాధ్యం కాలేదు.</translation> -<translation id="1198271701881992799">ఇప్పుడు ప్రారంభించండి</translation> <translation id="119944043368869598">అన్ని క్లియర్ చెయ్యి</translation> <translation id="1201402288615127009">తదుపరి</translation> <translation id="1202596434010270079">కియోస్క్ అనువర్తనం నవీకరించబడింది. దయచేసి USB స్టిక్ను తీసివేయండి.</translation> @@ -4108,7 +4107,6 @@ <translation id="7410344089573941623"><ph name="HOST" /> మీ కెమెరా మరియు మైక్రోఫోన్ను ప్రాప్యత చేయాలని అనుకుంటే నాకు తెలియజేయి</translation> <translation id="741204030948306876">సరే, సమ్మతమే</translation> <translation id="7412226954991670867">GPU మెమరీ</translation> -<translation id="7413455776853560343">నేపథ్యాన్ని అనుకూలీకరించండి</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">తెలియని నెట్వర్క్ లోపం.</translation> <translation id="7417705661718309329">Google మ్యాప్</translation> @@ -4305,7 +4303,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">మీ ప్రదర్శన సరిహద్దులను సర్దుబాటు చేయండి</translation> <translation id="7760004034676677601">మీరు ఆశిస్తున్న ప్రారంభ పేజీ ఇదేనా?</translation> -<translation id="7760756088376329221">Google ఫోటో ఆల్బమ్ను ఎంచుకోండి</translation> <translation id="7764225426217299476">చిరునామాను జోడించు</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> నుండి <ph name="DOWNLOAD_RECEIVED" /></translation> <translation id="7765158879357617694">తరలించు</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 2b68c86..0dec71f 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">ข้อผิดพลาดที่ไม่รู้จัก</translation> <translation id="119738088725604856">จับภาพหน้าจอของหน้าต่าง</translation> <translation id="1197979282329025000">เกิดข้อผิดพลาดขณะดึงข้อมูลความสามารถของเครื่องพิมพ์ <ph name="PRINTER_NAME" /> ไม่สามารถลงทะเบียนเครื่องพิมพ์นี้กับ <ph name="CLOUD_PRINT_NAME" /></translation> -<translation id="1198271701881992799">มาเริ่มกันเลย</translation> <translation id="119944043368869598">ล้างทั้งหมด</translation> <translation id="1201402288615127009">ถัดไป</translation> <translation id="1202596434010270079">อัปเดตแอปคีออสก์แล้ว โปรดนำ USB สติ๊กออก</translation> @@ -4156,7 +4155,6 @@ <translation id="7410344089573941623">ถามว่า <ph name="HOST" /> ต้องการเข้าถึงกล้องและไมโครโฟนของคุณหรือไม่</translation> <translation id="741204030948306876">ได้สิ ตกลง</translation> <translation id="7412226954991670867">หน่วยความจำ GPU</translation> -<translation id="7413455776853560343">ปรับแต่งพื้นหลัง</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">ข้อผิดพลาดของเครือข่ายที่ไม่รู้จัก</translation> <translation id="7417705661718309329">แผนที่ Google</translation> @@ -4357,7 +4355,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">ปรับขอบเขตของการแสดงผล</translation> <translation id="7760004034676677601">นี่คือหน้าเริ่มต้นใช้งานที่คุณต้องการใช่ไหม</translation> -<translation id="7760756088376329221">เลือกอัลบั้ม Google Photos</translation> <translation id="7764225426217299476">เพิ่มที่อยู่</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> จาก <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">ย้าย</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 37472203..7d5516e 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Bilinmeyen hata.</translation> <translation id="119738088725604856">Ekran görüntüsü penceresi</translation> <translation id="1197979282329025000"><ph name="PRINTER_NAME" /> yazıcısının yazıcı özellikleri alınırken bir hata oluştu. Bu yazıcı <ph name="CLOUD_PRINT_NAME" /> ile kaydettirilemedi.</translation> -<translation id="1198271701881992799">Haydi başlayalım</translation> <translation id="119944043368869598">Tümünü temizle</translation> <translation id="1201402288615127009">Sonraki</translation> <translation id="1202596434010270079">Kiosk uygulaması güncellendi. Lütfen USB çubuğunu çıkarın.</translation> @@ -4156,7 +4155,6 @@ <translation id="7410344089573941623"><ph name="HOST" /> sitesi kamerama ve mikrofonuma erişmek isterse sor</translation> <translation id="741204030948306876">Evet, istiyorum</translation> <translation id="7412226954991670867">GPU Belleği</translation> -<translation id="7413455776853560343">Arka planı özelleştirin</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Bilinmeyen ağ hatası.</translation> <translation id="7417705661718309329">Google harita</translation> @@ -4357,7 +4355,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ekranınızın sınırlarını ayarlayın</translation> <translation id="7760004034676677601">Bu beklediğiniz başlangıç sayfası mı?</translation> -<translation id="7760756088376329221">Google Fotoğraf Albümü seçin</translation> <translation id="7764225426217299476">Adres ekle</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> alan adından <ph name="DOWNLOAD_RECEIVED" /></translation> <translation id="7765158879357617694">Taşı</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index ea2332e..432d1a4 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">Невідома помилка.</translation> <translation id="119738088725604856">Зробити знімок екрана з вікна</translation> <translation id="1197979282329025000">Під час отримання характеристик принтера для принтера <ph name="PRINTER_NAME" /> сталася помилка. Цей принтер неможливо зареєструвати в <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Розпочнімо</translation> <translation id="119944043368869598">Очистити все</translation> <translation id="1201402288615127009">Далі</translation> <translation id="1202596434010270079">Додаток-термінал оновлено. Витягніть носій USB.</translation> @@ -4155,7 +4154,6 @@ <translation id="7410344089573941623">Запитувати, якщо хост <ph name="HOST" /> хоче отримати доступ до ваших камери та мікрофона</translation> <translation id="741204030948306876">Увімкнути</translation> <translation id="7412226954991670867">Пам’ять GPU</translation> -<translation id="7413455776853560343">Налаштування фону</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Невідома помилка мережі.</translation> <translation id="7417705661718309329">Карта Google</translation> @@ -4356,7 +4354,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Налаштуйте межі дисплея</translation> <translation id="7760004034676677601">Це стартова сторінка, яку ви очікували?</translation> -<translation id="7760756088376329221">Виберіть альбом Google Фото</translation> <translation id="7764225426217299476">Додати адресу</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> з домену <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Перемістити</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index c0efd13..a814c45 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -96,7 +96,7 @@ <translation id="1145292499998999162">Plugin bị chặn</translation> <translation id="1145532888383813076">Tìm kiếm trong thiết bị, ứng dụng và trên web.</translation> <translation id="1146204723345436916">Nhập dấu trang từ tệp HTML...</translation> -<translation id="114721135501989771">Dùng các tính năng thông minh của Google trong Chrome</translation> +<translation id="114721135501989771">Trải nghiệm Google thông minh trong Chrome</translation> <translation id="1148097584170732637">Đã tìm thấy <ph name="FILE_COUNT" />. <ph name="LINE_BREAK1" /> Không còn đủ dung lượng trong bộ nhớ cục bộ. Cần có thêm <ph name="FILE_SIZE" />. @@ -138,7 +138,6 @@ <translation id="1195447618553298278">Lỗi chưa biết.</translation> <translation id="119738088725604856">Cửa sổ ảnh chụp màn hình</translation> <translation id="1197979282329025000">Đã xảy ra lỗi khi truy xuất các chức năng máy in cho máy in <ph name="PRINTER_NAME" />. Không thể đăng ký máy in này bằng <ph name="CLOUD_PRINT_NAME" />.</translation> -<translation id="1198271701881992799">Hãy bắt đầu</translation> <translation id="119944043368869598">Xóa tất cả</translation> <translation id="1201402288615127009">Tiếp theo</translation> <translation id="1202596434010270079">Ứng dụng Kiosk đã được cập nhật. Vui lòng rút thẻ USB.</translation> @@ -823,7 +822,7 @@ <translation id="2232379019872353004">Gửi một số thông tin hệ thống và nội dung trang cho Google</translation> <translation id="2232876851878324699">Tệp có chứa một chứng chỉ chưa được nhập:</translation> <translation id="2233502537820838181">&Thông tin khác</translation> -<translation id="2234876718134438132">Đồng bộ hóa và dịch vụ của Google</translation> +<translation id="2234876718134438132">Đồng bộ hóa và các dịch vụ của Google</translation> <translation id="2238379619048995541">Dữ liệu trạng thái tần suất</translation> <translation id="2239921694246509981">Thêm người được giám sát</translation> <translation id="2241053333139545397">Đọc và thay đổi dữ liệu của bạn trên một số trang web</translation> @@ -1889,7 +1888,7 @@ <translation id="3851428669031642514">Tải tập lệnh không an toàn</translation> <translation id="3854599674806204102">Chọn một tùy chọn</translation> <translation id="3855441664322950881">Đóng gói tiện ích</translation> -<translation id="3855676282923585394">Nhập Dấu trang và Cài đặt...</translation> +<translation id="3855676282923585394">Nhập Dấu trang và các mục Cài đặt...</translation> <translation id="3856800405688283469">Chọn múi giờ</translation> <translation id="3857228364945137633">Dùng thử Smart Lock để mở khóa <ph name="DEVICE_TYPE" /> của bạn mà không cần mật khẩu khi điện thoại của bạn ở gần.</translation> <translation id="3857773447683694438">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</translation> @@ -1963,7 +1962,7 @@ <translation id="3954469006674843813"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (<ph name="REFRESH_RATE" /> Hertz)</translation> <translation id="3955193568934677022">Cho phép trang web phát nội dung được bảo vệ (được đề xuất)</translation> <translation id="3956702100721821638">Không thể truy cập vào Google Play</translation> -<translation id="3958088479270651626">Nhập dấu trang và cài đặt</translation> +<translation id="3958088479270651626">Nhập dấu trang và các mục cài đặt</translation> <translation id="3960566196862329469">ONC</translation> <translation id="3965965397408324205">Thoát khỏi <ph name="PROFILE_NAME" /></translation> <translation id="3966072572894326936">Chọn một thư mục khác...</translation> @@ -2733,7 +2732,7 @@ <translation id="5240817131241497236">Các tùy chọn cài đặt kiểm soát tính năng đồng bộ hóa, cá nhân hóa và các dịch vụ khác của Google trong Chrome đã thay đổi. Điều này có thể ảnh hưởng đến các tùy chọn cài đặt hiện tại của bạn.</translation> <translation id="5241128660650683457">Đọc tất cả dữ liệu của bạn trên các trang web bạn truy cập</translation> <translation id="5242724311594467048">Cho phép "<ph name="EXTENSION_NAME" />"?</translation> -<translation id="5244474230056479698">Đồng bộ hóa với <ph name="EMAIL" /></translation> +<translation id="5244474230056479698">Đang đồng bộ hóa với <ph name="EMAIL" /></translation> <translation id="5246282308050205996"><ph name="APP_NAME" /> đã xảy ra lỗi. Nhấp vào bong bóng này để khởi động lại ứng dụng.</translation> <translation id="5247051749037287028">Tên hiển thị (tùy chọn)</translation> <translation id="5249624017678798539">Trình duyệt đã gặp lỗi trước khi quá trình tải xuống hoàn tất.</translation> @@ -3726,7 +3725,7 @@ <translation id="6721972322305477112">&Tệp</translation> <translation id="672213144943476270">Vui lòng mở khóa hồ sơ của bạn trước khi duyệt với tư cách khách.</translation> <translation id="6723354935081862304">In tới Google Documents và các điểm đến khác trên đám mây. <ph name="BEGIN_LINK" />Đăng nhập<ph name="END_LINK" /> để in tới Google Cloud Print.</translation> -<translation id="6723661294526996303">Nhập dấu trang và cài đặt...</translation> +<translation id="6723661294526996303">Nhập dấu trang và các mục cài đặt...</translation> <translation id="6723839937902243910">Nguồn</translation> <translation id="6725206449694821596">Giao thức in qua Internet (IPP)</translation> <translation id="6727005317916125192">Ngăn trước đó</translation> @@ -4155,7 +4154,6 @@ <translation id="7410344089573941623">Hỏi xem <ph name="HOST" /> có muốn truy cập vào máy ảnh và micrô của bạn không</translation> <translation id="741204030948306876">Có, tôi đồng ý</translation> <translation id="7412226954991670867">Bộ nhớ GPU</translation> -<translation id="7413455776853560343">Tùy chỉnh nền</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">Lỗi mạng không xác định.</translation> <translation id="7417705661718309329">Bản đồ Google</translation> @@ -4356,7 +4354,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Điều chỉnh ranh giới cho màn hình của bạn</translation> <translation id="7760004034676677601">Đây có phải là trang khởi động bạn muốn không?</translation> -<translation id="7760756088376329221">Chọn một album trên Google Photos</translation> <translation id="7764225426217299476">Thêm địa chỉ</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> từ <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">Di chuyển</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 40864e7d..0c85750 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">未知错误。</translation> <translation id="119738088725604856">窗口的屏幕截图</translation> <translation id="1197979282329025000">检索打印机“<ph name="PRINTER_NAME" />”的打印功能时发生错误。此打印机无法使用“<ph name="CLOUD_PRINT_NAME" />”进行注册。</translation> -<translation id="1198271701881992799">让我们开始吧</translation> <translation id="119944043368869598">全部清除</translation> <translation id="1201402288615127009">下一步</translation> <translation id="1202596434010270079">自助服务终端应用已更新完毕。请拔下 U 盘。</translation> @@ -4141,7 +4140,6 @@ <translation id="7410344089573941623"><ph name="HOST" /> 想要使用摄像头和麦克风时询问我是否同意</translation> <translation id="741204030948306876">立即启用</translation> <translation id="7412226954991670867">GPU 内存</translation> -<translation id="7413455776853560343">自定义背景</translation> <translation id="7414464185801331860">18 倍</translation> <translation id="7416362041876611053">未知网络错误。</translation> <translation id="7417705661718309329">Google 地图</translation> @@ -4340,7 +4338,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">调整显示屏的边界</translation> <translation id="7760004034676677601">这是您想要的启动页吗?</translation> -<translation id="7760756088376329221">选择一个 Google 相册</translation> <translation id="7764225426217299476">添加地址</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" />,来自 <ph name="DOWNLOAD_DOMAIN" /></translation> <translation id="7765158879357617694">移动</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 2e1af0b8..2c6f1ff2 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -138,7 +138,6 @@ <translation id="1195447618553298278">未知的錯誤。</translation> <translation id="119738088725604856">螢幕擷取畫面視窗</translation> <translation id="1197979282329025000">擷取 <ph name="PRINTER_NAME" /> 的印表機功能狀態時發生錯誤,無法向 <ph name="CLOUD_PRINT_NAME" /> 註冊該印表機。</translation> -<translation id="1198271701881992799">開始使用</translation> <translation id="119944043368869598">全部清除</translation> <translation id="1201402288615127009">繼續</translation> <translation id="1202596434010270079">Kiosk 應用程式已更新,請移除 USB 隨身碟。</translation> @@ -4152,7 +4151,6 @@ <translation id="7410344089573941623">當 <ph name="HOST" /> 要求存取攝影機和麥克風時詢問我。</translation> <translation id="741204030948306876">是,我要啟用</translation> <translation id="7412226954991670867">GPU 記憶體</translation> -<translation id="7413455776853560343">自訂背景</translation> <translation id="7414464185801331860">18x</translation> <translation id="7416362041876611053">不明的網路錯誤。</translation> <translation id="7417705661718309329">Google 地圖</translation> @@ -4352,7 +4350,6 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">調整顯示畫面邊界</translation> <translation id="7760004034676677601">這是你想要的起始網頁嗎?</translation> -<translation id="7760756088376329221">選取 Google 相簿</translation> <translation id="7764225426217299476">新增地址</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> (來源網域:<ph name="DOWNLOAD_DOMAIN" />)</translation> <translation id="7765158879357617694">移動</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index 960d74f5..7a2040c 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -13,6 +13,7 @@ <translation id="123620459398936149">Chrome OS no ha pogut sincronitzar les vostres dades. Actualitzeu la contrasenya de sincronització.</translation> <translation id="127345590676626841">Chrome s'actualitza automàticament perquè en tingueu sempre la versió més recent. Quan es completi aquesta baixada, Chrome es reiniciarà i ja el podreu utilitzar.</translation> <translation id="1302523850133262269">Espereu mentre Chrome instal·la les actualitzacions més recents del sistema.</translation> +<translation id="1312676208694947750">{0,plural, =0{Hi ha una actualització de Chrome OS disponible}=1{Hi ha una actualització de Chrome OS disponible}other{Fa # dies que hi ha una actualització de Chrome OS disponible}}</translation> <translation id="137466361146087520">Google Chrome Beta</translation> <translation id="1393853151966637042">Obtén ajuda per fer servir Chrome</translation> <translation id="1399397803214730675">Aquest equip ja disposa d'una versió més recent de Google Chrome. Si el programari no funciona, desinstal·leu Google Chrome i torneu-ho a provar.</translation> @@ -29,6 +30,7 @@ <translation id="1682634494516646069">Google Chrome no pot llegir ni escriure en el directori de dades: <ph name="USER_DATA_DIRECTORY" /></translation> <translation id="1698376642261615901">Google Chrome és un navegador web que executa pàgines web i aplicacions a gran velocitat. És ràpid, estable i fàcil d'utilitzar. Navegueu d'una manera més segura pel web amb la protecció contra programari maliciós i llocs de pesca integrada a Google Chrome.</translation> <translation id="1718131156967340976">Selecciona <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /></translation> +<translation id="1734234790201236882">Chrome desarà aquesta contrasenya al Compte de Google. No caldrà que la recordis.</translation> <translation id="174539241580958092">Google Chrome no ha pogut sincronitzar les dades a causa d'un error en iniciar la sessió.</translation> <translation id="1759842336958782510">Chrome</translation> <translation id="1773601347087397504">Obtén ajuda per a l'ús de Chrome OS</translation> @@ -46,6 +48,7 @@ <translation id="216054706567564023">Instal·la Chrome al telèfon. T'enviarem un SMS al número de telèfon de recuperació del compte.</translation> <translation id="2246246234298806438">Google Chrome no pot mostrar la previsualització d'impressió perquè falta el lector de PDF incorporat.</translation> <translation id="2252923619938421629">Informa de la configuració actual per ajudar-nos a millorar Google Chrome</translation> +<translation id="225363235161345695">{0,plural, =1{Chrome es reiniciarà d'aquí a 1 hora}other{Chrome es reiniciarà d'aquí a # hores}}</translation> <translation id="2286950485307333924">Heu iniciat la sessió a Chrome</translation> <translation id="2290014774651636340">Falten les claus de l'API de Google. Es desactivaran algunes de les funcionalitats de Google Chrome.</translation> <translation id="2290095356545025170">Confirmeu que voleu desinstal·lar Google Chrome?</translation> @@ -145,10 +148,13 @@ <translation id="4891791193823137474">Permet que Google Chrome s'executi en procés de fons</translation> <translation id="4895437082222824641">Obre l'enllaç en una pes&tanya nova a Chrome</translation> <translation id="4921569541910214635">Si compartiu un ordinador, ara podeu configurar Chrome com vulgueu.</translation> +<translation id="4945319281866068441">{0,plural, =1{Reinicia Chrome OS d'aquí a 1 dia}other{Reinicia Chrome OS d'aquí a # dies}}</translation> <translation id="4953650215774548573">Defineix Google Chrome com a navegador predeterminat</translation> <translation id="495931528404527476">A Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome no ha pogut sincronitzar les dades. Actualitzeu la frase de contrasenya de sincronització.</translation> +<translation id="5062123544085870375">Reinicia Chrome OS</translation> +<translation id="5090044601776247154">A partir de Google Chrome 70, els perfils d'usuaris supervisats deixaran d'estar disponibles.</translation> <translation id="5132929315877954718">Descobriu aplicacions, jocs, extensions i temes genials per a Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome es mostra en aquest idioma</translation> <translation id="5170938038195470297">El vostre perfil no es pot utilitzar perquè prové d'una versió més nova de Google Chrome. Pot ser que algunes funcions no estiguin disponibles. Especifiqueu un directori de perfil diferent o utilitzeu una versió més nova de Chrome.</translation> @@ -158,6 +164,8 @@ <translation id="532046782124376502">Advertiment: Google Chrome no pot impedir que les extensions registrin el teu historial de navegació. Per desactivar aquesta extensió en mode d'incògnit, desselecciona aquesta opció.</translation> <translation id="5386244825306882791">També controla la pàgina que es mostra quan inicieu Chrome o quan feu una cerca des de l'omnibox.</translation> <translation id="5430073640787465221">El fitxer de preferències està malmès o no és vàlid. Google Chrome no pot recuperar la configuració.</translation> +<translation id="5483595757826856374">{0,plural, =0{Chrome es reiniciarà ara}=1{Chrome es reiniciarà d'aquí a 1 segon}other{Chrome es reiniciarà d'aquí a # segons}}</translation> +<translation id="5514308096618405748">Chrome OS és possible gràcies a <ph name="BEGIN_LINK_CROS_OSS" />programari lliure addicional<ph name="END_LINK_CROS_OSS" />, així com Linux (versió beta).</translation> <translation id="556024056938947818">Google Chrome està provant de mostrar les contrasenyes.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> <translation id="565744775970812598">Chrome ha bloquejat <ph name="FILE_NAME" /> perquè pot ser perillós.</translation> @@ -183,6 +191,7 @@ <translation id="6291549208091401781">Ja tens instal·lat Google Chrome per a tots els usuaris de l'ordinador.</translation> <translation id="6338556085225130112">S'està actualitzant Google Chrome</translation> <translation id="6368958679917195344">Chrome OS és possible gràcies a <ph name="BEGIN_LINK_CROS_OSS" />programari addicional de codi obert<ph name="END_LINK_CROS_OSS" />.</translation> +<translation id="6468844726266617801">{0,plural, =1{Reinicia Chrome d'aquí a 1 dia}other{Reinicia Chrome d'aquí a # dies}}</translation> <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation> <translation id="6566149418543181476">S'està actualitzant Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6598387184982954187">Utilitzeu <ph name="PROFILE_EMAIL" /> per sincronitzar el contingut de Chrome. Per modificar la preferència de sincronització o per utilitzar Chrome sense cap compte de Google, dirigiu-vos a <ph name="SETTINGS_LINK" />.</translation> @@ -194,10 +203,12 @@ <translation id="683440813066116847">Regla d'entrada de Google Chrome Canary per permetre el trànsit de mDNS.</translation> <translation id="686561893457936865">Emporta't Chrome on vagis</translation> <translation id="6885412569789873916">Aplicacions de Chrome Beta</translation> +<translation id="6964107240822114422">{0,plural, =0{Hi ha una actualització de Chrome disponible}=1{Hi ha una actualització de Chrome disponible}other{Fa # dies que hi ha una actualització de Chrome disponible}}</translation> <translation id="6967962315388095737">Regla d'entrada de Google Chrome Beta per permetre el trànsit d'mDNS.</translation> <translation id="6970811910055250180">S'està actualitzant el dispositiu...</translation> <translation id="6982337800632491844"><ph name="DOMAIN" /> exigeix que llegiu i accepteu els Termes i condicions següents abans no utilitzeu el dispositiu. Aquestes condicions no amplien, modifiquen ni restringeixen les condicions de Google Chrome OS.</translation> <translation id="6989339256997917931">Google Chrome està actualitzat, però no l'heu utilitzat durant un mínim de 30 dies.</translation> +<translation id="7023651421574588884">L'administrador necessita que reiniciïs Chrome OS per aplicar una actualització</translation> <translation id="7098166902387133879">Google Chrome està utilitzant el micròfon.</translation> <translation id="7106741999175697885">Gestor de tasques - Google Chrome</translation> <translation id="7164397146364144019">Si voleu col·laborar perquè Chrome sigui més segur i fàcil d'utilitzar, informeu automàticament Google dels detalls sobre possibles incidències de seguretat.</translation> @@ -210,8 +221,10 @@ <translation id="7419046106786626209">Chrome OS no ha pogut sincronitzar les vostres dades perquè la sincronització no està disponible per al vostre domini.</translation> <translation id="7459554271817304652">Configureu la sincronització per desar al web les funcions personalitzades del navegador i per accedir-hi des de qualsevol ordinador mitjançant Google Chrome.</translation> <translation id="7473136999113284234">Chrome s'actualitza automàticament perquè en tingueu sempre la versió més recent.</translation> +<translation id="7486227612705979895">Chrome accedirà a Drive per fer suggeriments a la barra d'adreces</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7552219221109926349">Mostra Chrome OS en aquest idioma</translation> +<translation id="7561940363513215021">{0,plural, =1{Chrome es reiniciarà d'aquí a 1 minut}other{Chrome es reiniciarà d'aquí a # minuts}}</translation> <translation id="7589360514048265910">Aquest ordinador ja no rebrà més actualitzacions de Google Chrome perquè Mac OS X 10.9 ja no és compatible.</translation> <translation id="7592736734348559088">Google Chrome no ha pogut sincronitzar les dades perquè els detalls d'inici de sessió del compte no estan actualitzats.</translation> <translation id="7626032353295482388">Us donem la benvinguda a Chrome</translation> @@ -233,9 +246,11 @@ <translation id="8008534537613507642">Torna a instal·lar Chrome</translation> <translation id="8030318113982266900">S'està actualitzant el vostre dispositiu al canal <ph name="CHANNEL_NAME" />...</translation> <translation id="8032142183999901390">Després de suprimir el vostre compte de Chrome, pot ser que hàgiu de tornar a carregar les pestanyes obertes.</translation> +<translation id="8077352834923175128">L'administrador recomana que reiniciïs Chrome OS per aplicar aquesta actualització</translation> <translation id="8129812357326543296">Quant a &Google Chrome</translation> <translation id="8179874765710681175">Instal·la Chrome al telèfon. T'enviarem un SMS al telèfon.</translation> <translation id="8183957050892517584">Chrome emmagatzemarà de manera segura les vostres dades personals perquè no les hàgiu de tornar a escriure</translation> +<translation id="8226081633851087288">{0,plural, =0{Chrome OS es reiniciarà ara}=1{Chrome OS es reiniciarà d'aquí a 1 segon}other{Chrome OS es reiniciarà d'aquí a # segons}}</translation> <translation id="8255190535488645436">Google Chrome està utilitzant la càmera i el micròfon.</translation> <translation id="8286862437124483331">Google Chrome està provant de mostrar contrasenyes. Escriviu la vostra contrasenya de Windows per permetre-ho.</translation> <translation id="8290100596633877290">Google Chrome s'ha bloquejat. Voleu tornar-lo a iniciar?</translation> @@ -258,6 +273,7 @@ <translation id="870251953148363156">Actualitza &Google Chrome</translation> <translation id="873133009373065397">Google Chrome no pot determinar ni definir el navegador predeterminat</translation> <translation id="8736674169840206667">L'administrador necessita que reiniciïs Chrome per aplicar una actualització</translation> +<translation id="8791470158600044404">{0,plural, =1{Chrome OS es reiniciarà d'aquí a 1 minut}other{Chrome OS es reiniciarà d'aquí a # minuts}}</translation> <translation id="8796108026289707191">Reinicieu Google Chrome ara.</translation> <translation id="8823341990149967727">Chrome no està actualitzat</translation> <translation id="884296878221830158">També controla la pàgina que es mostra quan inicieu Chrome o quan feu clic al botó Pàgina d'inici.</translation> @@ -266,6 +282,7 @@ <translation id="9026991721384951619">Chrome OS no ha pogut sincronitzar les vostres dades perquè les dades d'inici de sessió del compte no estan actualitzades.</translation> <translation id="9067395829937117663">Google Chrome requereix Windows 7 o una versió posterior.</translation> <translation id="9084668267983921457">El certificat d'autenticació ha fallat. Torna a iniciar la sessió a Google Chrome o contacta amb l'administrador per obtenir més informació. <ph name="ADDITIONAL_EXPLANATION" /></translation> +<translation id="909149346112452267">{0,plural, =1{Chrome OS es reiniciarà d'aquí a 1 hora}other{Chrome OS es reiniciarà d'aquí a # hores}}</translation> <translation id="911206726377975832">També voleu suprimir les dades de navegació?</translation> <translation id="919706545465235479">Actualitza Chrome per iniciar la sincronització</translation> <translation id="924447568950697217">Estableix Chrome com a navegador predeterminat</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index 1a5edc1..dee6996 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -15,6 +15,7 @@ <translation id="123620459398936149">Chrome OS could not sync your data. Please update your Sync passphrase.</translation> <translation id="127345590676626841">Chrome updates automatically so that you always have the freshest version. When this download completes, Chrome will restart and you'll be on your way.</translation> <translation id="1302523850133262269">Please wait while Chrome installs the latest system updates.</translation> +<translation id="1312676208694947750">{0,plural, =0{A Chrome OS update is available}=1{A Chrome OS update is available}other{A Chrome OS update has been available for # days}}</translation> <translation id="137466361146087520">Google Chrome Beta</translation> <translation id="1393853151966637042">Get help with using Chrome</translation> <translation id="1399397803214730675">This computer already has a more recent version of Google Chrome. If the software is not working, please uninstall Google Chrome and try again.</translation> @@ -33,6 +34,7 @@ <ph name="USER_DATA_DIRECTORY" /></translation> <translation id="1698376642261615901">Google Chrome is a web browser that runs web pages and applications with lightning speed. It's fast, stable and easy to use. Browse the web more safely with malware and phishing protection built into Google Chrome.</translation> <translation id="1718131156967340976">Select <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /></translation> +<translation id="1734234790201236882">Chrome will save this password in your Google account. You won’t have to remember it.</translation> <translation id="174539241580958092">Google Chrome could not sync your data due to an error signing in.</translation> <translation id="1759842336958782510">Chrome</translation> <translation id="1773601347087397504">Get help with using Chrome OS</translation> @@ -50,6 +52,7 @@ <translation id="216054706567564023">Install Chrome on your phone. We’ll send an SMS to your account recovery phone number.</translation> <translation id="2246246234298806438">Google Chrome cannot show the print preview when the built-in PDF viewer is missing.</translation> <translation id="2252923619938421629">Help make Google Chrome better by reporting the current settings</translation> +<translation id="225363235161345695">{0,plural, =1{Chrome will relaunch in an hour}other{Chrome will relaunch in # hours}}</translation> <translation id="2286950485307333924">You're now signed in to Chrome</translation> <translation id="2290014774651636340">Google API keys are missing. Some functionality of Google Chrome will be disabled.</translation> <translation id="2290095356545025170">Are you sure you want to uninstall Google Chrome?</translation> @@ -149,10 +152,13 @@ <translation id="4891791193823137474">Let Google Chrome run in the background</translation> <translation id="4895437082222824641">Open link in new Chrome &tab</translation> <translation id="4921569541910214635">Share a computer? Now you can set up Chrome just the way you like it.</translation> +<translation id="4945319281866068441">{0,plural, =1{Restart Chrome OS within a day}other{Restart Chrome OS within # days}}</translation> <translation id="4953650215774548573">Set Google Chrome as your default browser</translation> <translation id="495931528404527476">In Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome could not sync your data. Please update your Sync passphrase.</translation> +<translation id="5062123544085870375">Restart Chrome OS</translation> +<translation id="5090044601776247154">Supervised user profiles will no longer be available starting with Google Chrome 70.</translation> <translation id="5132929315877954718">Discover great apps, games, extensions and themes for Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome is displayed in this language</translation> <translation id="5170938038195470297">Your profile cannot be used because it is from a newer version of Google Chrome. @@ -166,6 +172,8 @@ <translation id="5430073640787465221">Your preferences file is corrupt or invalid. Google Chrome is unable to recover your settings.</translation> +<translation id="5483595757826856374">{0,plural, =0{Chrome will relaunch now}=1{Chrome will relaunch in 1 second}other{Chrome will relaunch in # seconds}}</translation> +<translation id="5514308096618405748">Chrome OS is made possible by additional <ph name="BEGIN_LINK_CROS_OSS" />open source software<ph name="END_LINK_CROS_OSS" />, as is Linux (Beta).</translation> <translation id="556024056938947818">Google Chrome is trying to show passwords.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> may be dangerous, so Chrome has blocked it.</translation> @@ -191,6 +199,7 @@ <translation id="6291549208091401781">Google Chrome is already installed for all users on your computer.</translation> <translation id="6338556085225130112">Updating Google Chrome</translation> <translation id="6368958679917195344">Chrome OS is made possible by additional <ph name="BEGIN_LINK_CROS_OSS" />open-source software<ph name="END_LINK_CROS_OSS" />.</translation> +<translation id="6468844726266617801">{0,plural, =1{Relaunch Chrome within a day}other{Relaunch Chrome within # days}}</translation> <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> – Google Chrome Dev</translation> <translation id="6566149418543181476">Updating Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6598387184982954187">You're using <ph name="PROFILE_EMAIL" /> to sync your Chrome stuff. To update your sync preference or to use Chrome without a Google account, visit <ph name="SETTINGS_LINK" />.</translation> @@ -202,10 +211,12 @@ <translation id="683440813066116847">Inbound rule for Google Chrome Canary to allow mDNS traffic.</translation> <translation id="686561893457936865">Take Chrome everywhere</translation> <translation id="6885412569789873916">Chrome Beta Apps</translation> +<translation id="6964107240822114422">{0,plural, =0{A Chrome update is available}=1{A Chrome update is available}other{A Chrome update has been available for # days}}</translation> <translation id="6967962315388095737">Inbound rule for Google Chrome Beta to allow mDNS traffic.</translation> <translation id="6970811910055250180">Updating your device...</translation> <translation id="6982337800632491844"><ph name="DOMAIN" /> requires that you read and accept the following Terms of Service before using this device. These terms do not expand, modify or limit the Google Chrome OS Terms.</translation> <translation id="6989339256997917931">Google Chrome has been updated, but you haven't used it for at least 30 days.</translation> +<translation id="7023651421574588884">Your administrator requires that you restart Chrome OS to apply an update</translation> <translation id="7098166902387133879">Google Chrome is using your microphone.</translation> <translation id="7106741999175697885">Task Manager - Google Chrome</translation> <translation id="7164397146364144019">You can help make Chrome safer and easier to use by automatically reporting details of possible security incidents to Google.</translation> @@ -218,8 +229,10 @@ <translation id="7419046106786626209">Chrome OS could not sync your data because Sync is not available for your domain.</translation> <translation id="7459554271817304652">Set up Sync to save your personalised browser features to the web and access them from Google Chrome on any computer.</translation> <translation id="7473136999113284234">Chrome updates automatically so that you always have the freshest version.</translation> +<translation id="7486227612705979895">Chrome will access your Drive to make suggestions in the address bar</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7552219221109926349">Display Chrome OS in this language</translation> +<translation id="7561940363513215021">{0,plural, =1{Chrome will relaunch in 1 minute}other{Chrome will relaunch in # minutes}}</translation> <translation id="7589360514048265910">This computer will no longer receive Google Chrome updates because Mac OS X 10.9 is no longer supported.</translation> <translation id="7592736734348559088">Google Chrome could not sync your data because your account sign-in details are out of date.</translation> <translation id="7626032353295482388">Welcome to Chrome</translation> @@ -241,9 +254,11 @@ <translation id="8008534537613507642">Reinstall Chrome</translation> <translation id="8030318113982266900">Updating your device to <ph name="CHANNEL_NAME" /> channel...</translation> <translation id="8032142183999901390">After removing your account from Chrome, you may need to reload your open tabs to take effect.</translation> +<translation id="8077352834923175128">Your administrator asks that you restart Chrome OS to apply this update</translation> <translation id="8129812357326543296">About &Google Chrome</translation> <translation id="8179874765710681175">Install Chrome on your phone. We’ll send an SMS to your phone.</translation> <translation id="8183957050892517584">Chrome will securely store your personal details so that you don't need to type them again.</translation> +<translation id="8226081633851087288">{0,plural, =0{Chrome OS will restart now}=1{Chrome OS will restart in 1 second}other{Chrome OS will restart in # seconds}}</translation> <translation id="8255190535488645436">Google Chrome is using your camera and microphone.</translation> <translation id="8286862437124483331">Google Chrome is trying to show passwords. Type your Windows password to allow this.</translation> <translation id="8290100596633877290">Whoa! Google Chrome has crashed. Relaunch now?</translation> @@ -266,6 +281,7 @@ <translation id="870251953148363156">Update &Google Chrome</translation> <translation id="873133009373065397">Google Chrome cannot determine or set the default browser</translation> <translation id="8736674169840206667">Your administrator requires that you relaunch Chrome to apply an update</translation> +<translation id="8791470158600044404">{0,plural, =1{Chrome OS will restart in 1 minute}other{Chrome OS will restart in # minutes}}</translation> <translation id="8796108026289707191">You should restart Google Chrome now.</translation> <translation id="8823341990149967727">Chrome is Out of Date</translation> <translation id="884296878221830158">It also controls what page is shown when you start Chrome or click the Home button.</translation> @@ -274,6 +290,7 @@ <translation id="9026991721384951619">Chrome OS could not sync your data because your account sign-in details are out of date.</translation> <translation id="9067395829937117663">Google Chrome requires Windows 7 or higher.</translation> <translation id="9084668267983921457">Authentication certificate failed. Please sign in to Google Chrome again or contact your administrator for more information. <ph name="ADDITIONAL_EXPLANATION" /></translation> +<translation id="909149346112452267">{0,plural, =1{Chrome OS will restart in an hour}other{Chrome OS will restart in # hours}}</translation> <translation id="911206726377975832">Also delete your browsing data?</translation> <translation id="919706545465235479">Update Chrome to start sync</translation> <translation id="924447568950697217">Make Chrome your default browser</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb index 82a6877..73a8b3e 100644 --- a/chrome/app/resources/google_chrome_strings_es.xtb +++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -61,7 +61,7 @@ <translation id="2348335408836342058">Chrome necesita permiso para acceder a la cámara y al micrófono en este sitio web</translation> <translation id="2397416548179033562">Mostrar menú de Chrome</translation> <translation id="2429317896000329049">Google Chrome no ha podido sincronizar los datos porque la función de sincronización no está disponible para tu dominio.</translation> -<translation id="2436117022029368436">Se comunica con Google para mejorar la navegación y Chrome</translation> +<translation id="2436117022029368436">Se comunican con Google para mejorar la navegación y Chrome</translation> <translation id="2467438592969358367">Google Chrome quiere exportar tus contraseñas. Escribe tu contraseña de Windows para permitirlo.</translation> <translation id="2485422356828889247">Desinstalar</translation> <translation id="2534507159460261402">Google Pay (copiada en Chrome)</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb index 777144e..5cf839c 100644 --- a/chrome/app/resources/google_chrome_strings_id.xtb +++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -13,6 +13,7 @@ <translation id="123620459398936149">Chrome OS tidak dapat menyinkronkan data Anda. Perbarui frasa sandi Sinkronisasi Anda.</translation> <translation id="127345590676626841">Chrome diperbarui secara otomatis sehingga Anda selalu memiliki versi terbaru. Saat download ini selesai, Chrome akan dimulai ulang dan segera siap digunakan.</translation> <translation id="1302523850133262269">Harap tunggu selagi Chrome memasang pembaruan sistem terkini.</translation> +<translation id="1312676208694947750">{0,plural, =0{Update Chrome OS tersedia}=1{Update Chrome OS tersedia}other{Update Chrome OS telah tersedia selama # hari}}</translation> <translation id="137466361146087520">Google Chrome Beta</translation> <translation id="1393853151966637042">Dapatkan bantuan tentang penggunaan Chrome</translation> <translation id="1399397803214730675">Komputer ini telah memiliki versi Google Chrome yang lebih anyar. Jika software tidak bekerja, uninstal Google Chrome dan coba lagi.</translation> @@ -29,6 +30,7 @@ <translation id="1682634494516646069">Google Chrome tidak dapat membaca dan menulis ke direktori datanya: <ph name="USER_DATA_DIRECTORY" /></translation> <translation id="1698376642261615901">Google Chrome adalah browser web yang menjalankan halaman dan aplikasi web secepat kilat. Cepat, stabil, dan mudah digunakan. Jelajahi web secara lebih aman dengan perlindungan terhadap software perusak dan phishing yang disertakan dalam Google Chrome.</translation> <translation id="1718131156967340976">Pilih <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /></translation> +<translation id="1734234790201236882">Chrome akan menyimpan sandi ini di Akun Google. Anda tidak perlu mengingatnya.</translation> <translation id="174539241580958092">Google Chrome tidak dapat menyinkronkan data Anda karena kesalahan saat masuk.</translation> <translation id="1759842336958782510">Chrome</translation> <translation id="1773601347087397504">Dapatkan bantuan tentang penggunaan Chrome OS</translation> @@ -46,6 +48,7 @@ <translation id="216054706567564023">Instal Chrome di ponsel. Kami akan mengirimkan SMS ke nomor telepon pemulihan akun Anda.</translation> <translation id="2246246234298806438">Google Chrome tidak dapat menampilkan pratinjau cetak jika penampil PDF default hilang.</translation> <translation id="2252923619938421629">Bantu menjadikan Google Chrome lebih baik dengan melaporkan setelan saat ini</translation> +<translation id="225363235161345695">{0,plural, =1{Chrome akan diluncurkan ulang dalam satu jam}other{Chrome akan diluncurkan ulang dalam # jam}}</translation> <translation id="2286950485307333924">Anda sudah masuk ke Chrome</translation> <translation id="2290014774651636340">Kunci API Google tidak ada. Beberapa fungsi Google Chrome tidak akan berfungsi.</translation> <translation id="2290095356545025170">Apakah Anda yakin ingin mencopot penginstalan Google Chrome?</translation> @@ -145,10 +148,13 @@ <translation id="4891791193823137474">Jalankan Google Chrome di latar belakang</translation> <translation id="4895437082222824641">Buka link di &tab Chrome baru</translation> <translation id="4921569541910214635">Membagikan komputer? Kini Anda dapat menyiapkan Chrome seperti yang Anda inginkan.</translation> +<translation id="4945319281866068441">{0,plural, =1{Mulai ulang Chrome OS dalam 1 hari}other{Mulai ulang Chrome OS dalam # hari}}</translation> <translation id="4953650215774548573">Setel Google Chrome sebagai browser default Anda</translation> <translation id="495931528404527476">Di Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome tidak dapat menyinkronkan data Anda. Perbarui frasa sandi Sinkronisasi Anda.</translation> +<translation id="5062123544085870375">Mulai ulang Chrome OS</translation> +<translation id="5090044601776247154">Profil pengguna yang dilindungi tidak akan tersedia lagi mulai dari Google Chrome 70.</translation> <translation id="5132929315877954718">Temukan aplikasi, game, ekstensi, dan tema yang hebat untuk Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome ditampilkan dalam bahasa ini</translation> <translation id="5170938038195470297">Profil Anda tidak dapat digunakan karena berasal dari versi terbaru Google Chrome. Beberapa fitur mungkin tidak tersedia. Tentukan direktori profil yang berbeda atau gunakan versi Chrome yang lebih anyar.</translation> @@ -158,6 +164,8 @@ <translation id="532046782124376502">Peringatan: Google Chrome tidak dapat mencegah ekstensi merekam histori browsing Anda. Untuk menonaktifkan ekstensi ini dalam mode penyamaran, batalkan memilih opsi ini.</translation> <translation id="5386244825306882791">Juga mengontrol halaman apa yang ditampilkan saat Anda memulai Chrome atau menelusuri dari Omnibox.</translation> <translation id="5430073640787465221">File preferensi Anda rusak atau tidak valid. Google Chrome tidak dapat memulihkan setelan Anda.</translation> +<translation id="5483595757826856374">{0,plural, =0{Chrome akan diluncurkan ulang sekarang}=1{Chrome akan diluncurkan ulang dalam 1 detik}other{Chrome akan diluncurkan ulang dalam # detik}}</translation> +<translation id="5514308096618405748">Chrome OS terwujud karena <ph name="BEGIN_LINK_CROS_OSS" />software open source<ph name="END_LINK_CROS_OSS" /> tambahan, seperti Linux (Beta).</translation> <translation id="556024056938947818">Google Chrome mencoba menampilkan sandi.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> mungkin berbahaya, sehingga Chrome memblokirnya.</translation> @@ -183,6 +191,7 @@ <translation id="6291549208091401781">Google Chrome sudah terpasang untuk semua pengguna di komputer Anda.</translation> <translation id="6338556085225130112">Memperbarui Google Chrome</translation> <translation id="6368958679917195344">Chrome OS terwujud karena <ph name="BEGIN_LINK_CROS_OSS" />software sumber terbuka<ph name="END_LINK_CROS_OSS" /> tambahan.</translation> +<translation id="6468844726266617801">{0,plural, =1{Luncurkan ulang Chrome dalam satu hari}other{Luncurkan ulang Chrome dalam # hari}}</translation> <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation> <translation id="6566149418543181476">Memperbarui Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6598387184982954187">Anda menggunakan <ph name="PROFILE_EMAIL" /> untuk menyinkronkan barang-barang Chrome. Untuk memperbarui preferensi sinkronisasi atau untuk menggunakan Chrome tanpa akun Google, kunjungi <ph name="SETTINGS_LINK" />.</translation> @@ -194,10 +203,12 @@ <translation id="683440813066116847">Inbound rule untuk Google Chrome Canary guna mengizinkan lalu lintas mDNS.</translation> <translation id="686561893457936865">Bawa Chrome ke mana saja</translation> <translation id="6885412569789873916">Aplikasi Chrome Beta</translation> +<translation id="6964107240822114422">{0,plural, =0{Update Chrome tersedia}=1{Update Chrome tersedia}other{Update Chrome telah tersedia selama # hari}}</translation> <translation id="6967962315388095737">Inbound rule untuk Google Chrome Beta guna mengizinkan traffic mDNS.</translation> <translation id="6970811910055250180">Memperbarui perangkat Anda...</translation> <translation id="6982337800632491844"><ph name="DOMAIN" /> mewajibkan Anda membaca dan menyetujui Persyaratan Layanan sebelum menggunakan perangkat ini. Persyaratan ini tidak memperluas, mengubah, atau membatasi Persyaratan Chrome OS.</translation> <translation id="6989339256997917931">Google Chrome telah diperbarui, tetapi Anda belum menggunakannya selama setidaknya 30 hari.</translation> +<translation id="7023651421574588884">Administrator mengharuskan Anda memulai ulang Chrome OS untuk menerapkan update</translation> <translation id="7098166902387133879">Google Chrome menggunakan mikrofon Anda.</translation> <translation id="7106741999175697885">Pengelola Tugas - Google Chrome</translation> <translation id="7164397146364144019">Anda dapat membantu membuat Chrome lebih aman dan lebih mudah digunakan dengan melaporkan detail secara otomatis tentang kemungkinan insiden keamanan ke Google.</translation> @@ -210,8 +221,10 @@ <translation id="7419046106786626209">Chrome OS tidak dapat menyinkronkan data Anda karena Sinkronisasi tidak tersedia untuk domain Anda.</translation> <translation id="7459554271817304652">Siapkan Sinkronisasi untuk menyimpan fitur browser hasil personalisasi Anda ke web dan mengaksesnya dari Google Chrome di komputer mana pun.</translation> <translation id="7473136999113284234">Chrome otomatis diperbarui sehingga Anda selalu memiliki versi terbaru.</translation> +<translation id="7486227612705979895">Chrome akan mengakses Drive Anda untuk membuat saran di kolom URL</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7552219221109926349">Tampilkan Chrome OS dalam bahasa ini</translation> +<translation id="7561940363513215021">{0,plural, =1{Chrome akan diluncurkan ulang dalam 1 menit}other{Chrome akan diluncurkan ulang dalam # menit}}</translation> <translation id="7589360514048265910">Komputer ini tidak akan menerima update Google Chrome lagi karena Mac OS X 10.9 sudah tidak didukung.</translation> <translation id="7592736734348559088">Google Chrome tidak dapat menyinkronkan data karena detail ID masuk akun Anda belum diperbarui.</translation> <translation id="7626032353295482388">Selamat Menggunakan Chrome</translation> @@ -233,9 +246,11 @@ <translation id="8008534537613507642">Instal Ulang Chrome</translation> <translation id="8030318113982266900">Memperbarui perangkat Anda ke saluran <ph name="CHANNEL_NAME" />...</translation> <translation id="8032142183999901390">Setelah membuang akun dari Chrome, Anda mungkin perlu memuat ulang tab terbuka untuk menerapkannya.</translation> +<translation id="8077352834923175128">Administrator meminta Anda memulai ulang Chrome OS untuk menerapkan update ini</translation> <translation id="8129812357326543296">Tentang &Google Chrome</translation> <translation id="8179874765710681175">Instal Chrome di ponsel. Kami akan mengirimkan SMS ke ponsel Anda.</translation> <translation id="8183957050892517584">Chrome akan meyimpan informasi pribadi Anda dengan aman sehingga Anda tidak perlu mengetiknya lagi.</translation> +<translation id="8226081633851087288">{0,plural, =0{Chrome OS akan dimulai ulang sekarang}=1{Chrome OS akan dimulai ulang dalam 1 detik}other{Chrome OS akan dimulai ulang dalam # detik}}</translation> <translation id="8255190535488645436">Google Chrome menggunakan kamera dan mikrofon Anda.</translation> <translation id="8286862437124483331">Google Chrome mencoba menampilkan sandi. Ketik sandi Windows Anda untuk mengizinkannya.</translation> <translation id="8290100596633877290">Aduh! Google Chrome ngadat. Luncurkan ulang sekarang?</translation> @@ -258,6 +273,7 @@ <translation id="870251953148363156">Pembaruan &Google Chrome</translation> <translation id="873133009373065397">Google Chrome tidak dapat menentukan atau menyetel browser default</translation> <translation id="8736674169840206667">Administrator mengharuskan Anda meluncurkan ulang Chrome untuk menerapkan update</translation> +<translation id="8791470158600044404">{0,plural, =1{Chrome OS akan dimulai ulang dalam 1 menit}other{Chrome OS akan dimulai ulang dalam # menit}}</translation> <translation id="8796108026289707191">Mulai ulang Google Chrome sekarang.</translation> <translation id="8823341990149967727">Chrome Terlalu Lawas</translation> <translation id="884296878221830158">Juga mengontrol halaman apa yang ditampilkan saat Anda memulai Chrome atau mengeklik tombol Beranda.</translation> @@ -266,6 +282,7 @@ <translation id="9026991721384951619">Chrome OS tidak dapat menyinkronkan data karena detail ID masuk akun Anda belum diperbarui.</translation> <translation id="9067395829937117663">Google Chrome memerlukan Windows 7 atau lebih tinggi.</translation> <translation id="9084668267983921457">Gagal mengautentikasi sertifikat. Harap login kembali ke Google Chrome atau hubungi administrator untuk informasi lebih lanjut. <ph name="ADDITIONAL_EXPLANATION" /></translation> +<translation id="909149346112452267">{0,plural, =1{Chrome OS akan dimulai ulang dalam 1 jam}other{Chrome OS akan dimulai ulang dalam # jam}}</translation> <translation id="911206726377975832">Hapus juga data browsing Anda?</translation> <translation id="919706545465235479">Perbarui Chrome untuk memulai sinkronisasi</translation> <translation id="924447568950697217">Menjadikan Chrome sebagai browser default</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb index 4ac506e..549333c 100644 --- a/chrome/app/resources/google_chrome_strings_ms.xtb +++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -13,6 +13,7 @@ <translation id="123620459398936149">OS Chrome tidak dapat menyegerakkan data anda. Sila kemas kini frasa laluan Segerak anda.</translation> <translation id="127345590676626841">Chrome dikemas kini secara automatik supaya anda sentiasa mempunyai versi yang terbaharu. Apabila muat turun ini selesai, Chrome akan dimulakan semula dan anda sudah boleh menggunakannya.</translation> <translation id="1302523850133262269">Sila tunggu sementara Chrome memasang kemas kini sistem terkini.</translation> +<translation id="1312676208694947750">{0,plural, =0{Kemas kini OS Chrome tersedia}=1{Kemas kini OS Chrome tersedia}other{Kemas kini OS Chrome telah tersedia selama # hari}}</translation> <translation id="137466361146087520">Google Chrome Beta</translation> <translation id="1393853151966637042">Dapatkan bantuan untuk menggunakan Chrome</translation> <translation id="1399397803214730675">Komputer ini mempunyai versi Google Chrome paling terkini. Jika perisian tidak berfungsi, sila nyahpasang Google Chrome dan cuba semula.</translation> @@ -29,6 +30,7 @@ <translation id="1682634494516646069">Google Chrome tidak dapat membaca atau menulis pada direktori datanya: <ph name="USER_DATA_DIRECTORY" /></translation> <translation id="1698376642261615901">Google Chrome ialah penyemak imbas web yang menjalankan halaman web dan aplikasi dengan kelajuan kilat. Ia pantas, stabil dan mudah digunakan. Semak imbas web dengan lebih selamat dengan perlindungan daripada perisian berniat jahat dan pancingan data yang terbina dalam Google Chrome.</translation> <translation id="1718131156967340976">Pilih <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /></translation> +<translation id="1734234790201236882">Chrome akan menyimpan kata laluan ini dalam Akaun Google anda. Anda tidak perlu mengingati kata laluan tersebut.</translation> <translation id="174539241580958092">Google Chrome tidak dapat menyegerakkan data anda disebabkan ralat melog masuk.</translation> <translation id="1759842336958782510">Chrome</translation> <translation id="1773601347087397504">Dapatkan bantuan untuk menggunakan Chrome OS</translation> @@ -46,6 +48,7 @@ <translation id="216054706567564023">Pasang Chrome pada telefon anda. Kami akan menghantar SMS ke nombor telefon pemulihan akaun anda.</translation> <translation id="2246246234298806438">Google Chrome tidak dapat memaparkan pratonton cetakan apabila pemapar PDF terbina dalam tiada.</translation> <translation id="2252923619938421629">Bantu menjadikan Google Chrome lebih baik dengan melaporkan tetapan semasa</translation> +<translation id="225363235161345695">{0,plural, =1{Chrome akan dilancarkan semula dalam masa sejam}other{Chrome akan dilancarkan semula dalam masa # jam}}</translation> <translation id="2286950485307333924">Anda kini dilog masuk ke Chrome</translation> <translation id="2290014774651636340">Kunci API Google tiada. Sesetengah fungsi Google Chrome akan dilumpuhkan.</translation> <translation id="2290095356545025170">Adakah anda pasti anda mahu menyahpasang Google Chrome?</translation> @@ -145,10 +148,13 @@ <translation id="4891791193823137474">Biarkan Google Chrome dijalankan di latar belakang</translation> <translation id="4895437082222824641">Buka pautan dalam &tab Chrome baharu</translation> <translation id="4921569541910214635">Berkongsi komputer? Kini anda boleh sediakan Chrome menurut cara yang anda suka.</translation> +<translation id="4945319281866068441">{0,plural, =1{Mulakan semula OS Chrome dalam masa sehari}other{Mulakan semula OS Chrome dalam masa # hari}}</translation> <translation id="4953650215774548573">Tetapkan Google Chrome sebagai penyemak imbas lalai anda</translation> <translation id="495931528404527476">Dalam Chrome</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5028489144783860647">Google Chrome tidak dapat menyegerakkan data anda. Sila kemas kini frasa laluan Segerak anda.</translation> +<translation id="5062123544085870375">Mulakan semula OS Chrome</translation> +<translation id="5090044601776247154">Profil pengguna di bawah seliaan tidak tersedia lagi bermula dengan Google Chrome 70.</translation> <translation id="5132929315877954718">Temui apl, permainan, sambungan dan tema hebat untuk Google Chrome.</translation> <translation id="5166975452760862670">Google Chrome dipaparkan dalam bahasa ini</translation> <translation id="5170938038195470297">Profil anda tidak boleh digunakan kerana ia adalah dari versi Google Chrome yang lebih baharu. Beberapa ciri mungkin tidak tersedia. Sila tetapkan direktori profil lain atau gunakan versi Chrome yang lebih baharu.</translation> @@ -158,6 +164,8 @@ <translation id="532046782124376502">Amaran: Google Chrome tidak dapat menghalang sambungan daripada merakamkan sejarah penyemakan imbas anda. Untuk melumpuhkan sambungan ini dalam mod inkognito, nyahpilih pilihan ini.</translation> <translation id="5386244825306882791">Sambungan turut mengawal halaman yang ditunjukkan apabila anda memulakan Chrome atau membuat carian dari Kotak Omni.</translation> <translation id="5430073640787465221">Fail pilihan anda rosak atau tidak sah. Google Chrome tidak dapat mengembalikan tetapan anda.</translation> +<translation id="5483595757826856374">{0,plural, =0{Chrome akan dilancarkan semula sekarang}=1{Chrome akan dilancarkan semula dalam masa sesaat}other{Chrome akan dilancarkan semula dalam masa # saat}}</translation> +<translation id="5514308096618405748">OS Chrome menjadi kenyataan dengan <ph name="BEGIN_LINK_CROS_OSS" />perisian sumber terbuka<ph name="END_LINK_CROS_OSS" /> tambahan, sebagaimana Linux (Beta).</translation> <translation id="556024056938947818">Google Chrome sedang cuba memaparkan kata laluan.</translation> <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation> <translation id="565744775970812598"><ph name="FILE_NAME" /> mungkin berbahaya, jadi Chrome telah menyekat fail itu.</translation> @@ -183,6 +191,7 @@ <translation id="6291549208091401781">Google Chrome telah dipasang untuk semua pengguna pada komputer anda.</translation> <translation id="6338556085225130112">Mengemas kini Google Chrome</translation> <translation id="6368958679917195344">OS Chrome menjadi kenyataan dengan <ph name="BEGIN_LINK_CROS_OSS" />perisian sumber terbuka<ph name="END_LINK_CROS_OSS" /> tambahan.</translation> +<translation id="6468844726266617801">{0,plural, =1{Lancarkan semula Chrome dalam masa sehari}other{Lancarkan semula Chrome dalam masa # hari}}</translation> <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation> <translation id="6566149418543181476">Mengemas kini Google Chrome (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="6598387184982954187">Anda menggunakan <ph name="PROFILE_EMAIL" /> untuk menyegerakkan bahan digital Chrome anda. Untuk mengemas kini pilihan penyegerakan anda atau menggunakan Chrome tanpa akaun Google, lawati <ph name="SETTINGS_LINK" />.</translation> @@ -194,10 +203,12 @@ <translation id="683440813066116847">Peraturan masuk bagi Google Chrome Canary untuk membenarkan trafik mDNS.</translation> <translation id="686561893457936865">Bawa Chrome ke mana-mana sahaja</translation> <translation id="6885412569789873916">Apl Chrome Beta</translation> +<translation id="6964107240822114422">{0,plural, =0{Kemas kini Chrome tersedia}=1{Kemas kini Chrome tersedia}other{Kemas kini Chrome telah tersedia selama # hari}}</translation> <translation id="6967962315388095737">Peraturan masuk bagi Google Chrome Beta untuk membenarkan trafik mDNS.</translation> <translation id="6970811910055250180">Mengemas kini peranti anda...</translation> <translation id="6982337800632491844"><ph name="DOMAIN" /> menghendaki anda membaca dan menerima Syarat Perkhidmatan berikut sebelum menggunakan peranti ini. Syarat ini tidak memperluas, mengubah suai atau mengehadkan Syarat OS Google Chrome.</translation> <translation id="6989339256997917931">Google Chrome telah dikemas kini, tetapi anda belum menggunakannya untuk sekurang-kurangnya 30 hari.</translation> +<translation id="7023651421574588884">Pentadbir anda menghendaki anda memulakan semula OS Chrome untuk menerapkan kemas kini</translation> <translation id="7098166902387133879">Google Chrome menggunakan mikrofon anda.</translation> <translation id="7106741999175697885">Pengurus Tugas - Google Chrome</translation> <translation id="7164397146364144019">Anda boleh membantu menjadikan Chrome lebih selamat dan lebih mudah untuk digunakan dengan melaporkan butiran kemungkinan insiden keselamatan secara automatik kepada Google.</translation> @@ -210,8 +221,10 @@ <translation id="7419046106786626209">OS Chrome tidak dapat menyegerakkan data anda kerana Segerak tidak tersedia untuk domain anda.</translation> <translation id="7459554271817304652">Sediakan Penyegerakan untuk menyimpan ciri penyemak imbas anda yang diperibadikan ke web dan mengaksesnya dari Google Chrome pada mana-mana komputer.</translation> <translation id="7473136999113284234">Chrome dikemas kini secara automatik supaya anda sentiasa mempunyai versi yang terbaharu.</translation> +<translation id="7486227612705979895">Chrome akan mengakses Drive anda untuk membuat cadangan dalam bar alamat</translation> <translation id="7535429826459677826">Google Chrome Dev</translation> <translation id="7552219221109926349">Paparkan OS Chrome dalam bahasa ini</translation> +<translation id="7561940363513215021">{0,plural, =1{Chrome akan dilancarkan semula dalam masa seminit}other{Chrome akan dilancarkan semula dalam masa # minit}}</translation> <translation id="7589360514048265910">Komputer ini tidak akan menerima kemas kini Google Chrome lagi kerana Mac OS X 10.9 tidak lagi disokong.</translation> <translation id="7592736734348559088">Google Chrome tidak dapat menyegerakkan data anda kerana butiran log masuk akaun anda sudah lapuk.</translation> <translation id="7626032353295482388">Selamat Datang ke Chrome</translation> @@ -233,9 +246,11 @@ <translation id="8008534537613507642">Pasang Semula Chrome</translation> <translation id="8030318113982266900">Mengemas kini peranti anda kepada saluran <ph name="CHANNEL_NAME" />...</translation> <translation id="8032142183999901390">Selepas mengalih keluar akaun anda daripada Chrome, anda mungkin perlu memuatkan semula tab yang dibuka untuk memberi kesan.</translation> +<translation id="8077352834923175128">Pentadbir anda meminta anda memulakan semula OS Chrome untuk menerapkan kemas kini ini</translation> <translation id="8129812357326543296">Mengenai &Google Chrome</translation> <translation id="8179874765710681175">Pasang Chrome pada telefon anda. Kami akan menghantar SMS ke telefon anda.</translation> <translation id="8183957050892517584">Chrome akan menyimpan butiran peribadi anda dengan selamat supaya anda tidak perlu menaipnya semula.</translation> +<translation id="8226081633851087288">{0,plural, =0{OS Chrome akan dimulakan semula sekarang}=1{OS Chrome akan dimulakan semula dalam masa sesaat}other{OS Chrome akan dimulakan semula dalam masa # saat}}</translation> <translation id="8255190535488645436">Google Chrome menggunakan kamera dan mikrofon anda.</translation> <translation id="8286862437124483331">Google Chrome cuba menunjukkan kata laluan. Taip kata laluan Windows anda untuk membenarkannya.</translation> <translation id="8290100596633877290">Alamak! Google Chrome mengalami ranap sistem. Lancarkan semula sekarang?</translation> @@ -258,6 +273,7 @@ <translation id="870251953148363156">Kemas kini &Google Chrome</translation> <translation id="873133009373065397">Google Chrome tidak dapat menentukan atau menetapkan penyemak imbas lalai</translation> <translation id="8736674169840206667">Pentadbir anda menghendaki anda melancarkan semula Chrome untuk menggunakan kemas kini</translation> +<translation id="8791470158600044404">{0,plural, =1{OS Chrome akan dimulakan semula dalam masa seminit}other{OS Chrome akan dimulakan semula dalam masa # minit}}</translation> <translation id="8796108026289707191">Anda perlu memulakan semula Google Chrome sekarang.</translation> <translation id="8823341990149967727">Chrome sudah Usang</translation> <translation id="884296878221830158">Sambungan turut mengawal halaman yang ditunjukkan apabila anda memulakan Chrome atau mengklik butang Laman Utama.</translation> @@ -266,6 +282,7 @@ <translation id="9026991721384951619">OS Chrome tidak dapat menyegerakkan data anda kerana butiran log masuk akaun anda sudah lapuk.</translation> <translation id="9067395829937117663">Google Chrome memerlukan Windows 7 atau lebih tinggi.</translation> <translation id="9084668267983921457">Sijil pengesahan gagal. Sila log masuk ke Google Chrome sekali lagi atau hubungi pentadbir anda untuk mendapatkan maklumat lanjut. <ph name="ADDITIONAL_EXPLANATION" /></translation> +<translation id="909149346112452267">{0,plural, =1{OS Chrome akan dimulakan semula dalam masa sejam}other{OS Chrome akan dimulakan semula dalam masa # jam}}</translation> <translation id="911206726377975832">Padamkan juga data menyemak imbas anda?</translation> <translation id="919706545465235479">Kemas kini Chrome untuk memulakan penyegerakan</translation> <translation id="924447568950697217">Jadikan Chrome penyemak imbas lalai anda</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 0c90143..2ba1d3a 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1583,6 +1583,8 @@ "usb/usb_tab_helper.h", "usb/web_usb_chooser_service.cc", "usb/web_usb_chooser_service.h", + "usb/web_usb_device_manager.cc", + "usb/web_usb_device_manager.h", "usb/web_usb_histograms.cc", "usb/web_usb_histograms.h", "usb/web_usb_permission_provider.cc",
diff --git a/chrome/browser/accessibility/accessibility_ui.cc b/chrome/browser/accessibility/accessibility_ui.cc index 6c1b3a2..957391b 100644 --- a/chrome/browser/accessibility/accessibility_ui.cc +++ b/chrome/browser/accessibility/accessibility_ui.cc
@@ -181,14 +181,15 @@ std::string RecursiveDumpAXPlatformNodeAsString(ui::AXPlatformNode* node, int indent) { + if (!node) + return ""; std::string str(2 * indent, '+'); str += node->GetDelegate()->GetData().ToString() + "\n"; for (int i = 0; i < node->GetDelegate()->GetChildCount(); i++) { gfx::NativeViewAccessible child = node->GetDelegate()->ChildAtIndex(i); ui::AXPlatformNode* child_node = ui::AXPlatformNode::FromNativeViewAccessible(child); - if (child_node) - str += RecursiveDumpAXPlatformNodeAsString(child_node, indent + 1); + str += RecursiveDumpAXPlatformNodeAsString(child_node, indent + 1); } return str; }
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc index 90a7a9a..72f8f30 100644 --- a/chrome/browser/android/chrome_feature_list.cc +++ b/chrome/browser/android/chrome_feature_list.cc
@@ -78,6 +78,7 @@ &kCCTParallelRequest, &kCCTPostMessageAPI, &kCCTRedirectPreconnect, + &kCCTResourcePrefetch, &kChromeDuetFeature, &kChromeHomeSwipeLogic, &kChromeHomeSwipeLogicVelocity, @@ -212,6 +213,9 @@ const base::Feature kCCTRedirectPreconnect{"CCTRedirectPreconnect", base::FEATURE_ENABLED_BY_DEFAULT}; +const base::Feature kCCTResourcePrefetch{"CCTResourcePrefetch", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kChromeDuetFeature{"ChromeDuet", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h index 77fdc52..a20f76c 100644 --- a/chrome/browser/android/chrome_feature_list.h +++ b/chrome/browser/android/chrome_feature_list.h
@@ -24,6 +24,7 @@ extern const base::Feature kCCTParallelRequest; extern const base::Feature kCCTPostMessageAPI; extern const base::Feature kCCTRedirectPreconnect; +extern const base::Feature kCCTResourcePrefetch; extern const base::Feature kChromeDuetFeature; extern const base::Feature kChromeHomeSwipeLogic; extern const base::Feature kChromeHomeSwipeLogicVelocity;
diff --git a/chrome/browser/android/customtabs/detached_resource_request.cc b/chrome/browser/android/customtabs/detached_resource_request.cc index 0882434..f8c6fd6 100644 --- a/chrome/browser/android/customtabs/detached_resource_request.cc +++ b/chrome/browser/android/customtabs/detached_resource_request.cc
@@ -36,11 +36,12 @@ const GURL& url, const GURL& site_for_cookies, const net::URLRequest::ReferrerPolicy referrer_policy, + Motivation motivation, DetachedResourceRequest::OnResultCallback cb) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); std::unique_ptr<DetachedResourceRequest> detached_request( new DetachedResourceRequest(url, site_for_cookies, referrer_policy, - std::move(cb))); + motivation, std::move(cb))); Start(std::move(detached_request), browser_context); } @@ -50,9 +51,11 @@ const GURL& url, const GURL& site_for_cookies, net::URLRequest::ReferrerPolicy referrer_policy, + Motivation motivation, DetachedResourceRequest::OnResultCallback cb) : url_(url), site_for_cookies_(site_for_cookies), + motivation_(motivation), cb_(std::move(cb)), redirects_(0) { net::NetworkTrafficAnnotationTag traffic_annotation = @@ -137,23 +140,42 @@ int net_error = url_loader_->NetError(); bool success = net_error == net::OK; auto duration = base::TimeTicks::Now() - start_time_; - if (success) { - // Max 20 redirects, 21 would be a bug. - UMA_HISTOGRAM_CUSTOM_COUNTS( - "CustomTabs.DetachedResourceRequest.RedirectsCount.Success", redirects_, - 1, 21, 21); - UMA_HISTOGRAM_MEDIUM_TIMES( - "CustomTabs.DetachedResourceRequest.Duration.Success", duration); - } else { - UMA_HISTOGRAM_CUSTOM_COUNTS( - "CustomTabs.DetachedResourceRequest.RedirectsCount.Failure", redirects_, - 1, 21, 21); - UMA_HISTOGRAM_MEDIUM_TIMES( - "CustomTabs.DetachedResourceRequest.Duration.Failure", duration); + switch (motivation_) { + case Motivation::kParallelRequest: { + if (success) { + // Max 20 redirects, 21 would be a bug. + UMA_HISTOGRAM_CUSTOM_COUNTS( + "CustomTabs.DetachedResourceRequest.RedirectsCount.Success", + redirects_, 1, 21, 21); + UMA_HISTOGRAM_MEDIUM_TIMES( + "CustomTabs.DetachedResourceRequest.Duration.Success", duration); + } else { + UMA_HISTOGRAM_CUSTOM_COUNTS( + "CustomTabs.DetachedResourceRequest.RedirectsCount.Failure", + redirects_, 1, 21, 21); + UMA_HISTOGRAM_MEDIUM_TIMES( + "CustomTabs.DetachedResourceRequest.Duration.Failure", duration); + } + + base::UmaHistogramSparse("CustomTabs.DetachedResourceRequest.FinalStatus", + std::abs(net_error)); + break; + } + case Motivation::kResourcePrefetch: { + if (success) { + UMA_HISTOGRAM_MEDIUM_TIMES( + "CustomTabs.ResourcePrefetch.Duration.Success", duration); + } else { + UMA_HISTOGRAM_MEDIUM_TIMES( + "CustomTabs.ResourcePrefetch.Duration.Failure", duration); + } + + base::UmaHistogramSparse("CustomTabs.ResourcePrefetch.FinalStatus", + std::abs(net_error)); + break; + } } - base::UmaHistogramSparse("CustomTabs.DetachedResourceRequest.FinalStatus", - std::abs(net_error)); std::move(cb_).Run(success); }
diff --git a/chrome/browser/android/customtabs/detached_resource_request.h b/chrome/browser/android/customtabs/detached_resource_request.h index 4959c50377..8c997331a 100644 --- a/chrome/browser/android/customtabs/detached_resource_request.h +++ b/chrome/browser/android/customtabs/detached_resource_request.h
@@ -36,11 +36,14 @@ // It is intended to provide "detached" request capabilities from the browser // process, that is like <a ping> or <link rel="prefetch">. // -// DO NOT USE for anything that would end up in the content area. -// // This is a UI thread class. class DetachedResourceRequest { public: + // The motivation of the resource request, used for histograms reporting. + // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.customtabs + // GENERATED_JAVA_CLASS_NAME_OVERRIDE: DetachedResourceRequestMotivation + enum class Motivation { kParallelRequest, kResourcePrefetch }; + using OnResultCallback = base::OnceCallback<void(bool success)>; ~DetachedResourceRequest(); @@ -52,12 +55,14 @@ const GURL& url, const GURL& first_party_for_cookies, net::URLRequest::ReferrerPolicy referer_policy, + Motivation motivation, OnResultCallback cb = base::DoNothing()); private: DetachedResourceRequest(const GURL& url, const GURL& site_for_cookies, net::URLRequest::ReferrerPolicy referer_policy, + Motivation motivation, OnResultCallback cb); static void Start(std::unique_ptr<DetachedResourceRequest> request, @@ -70,6 +75,7 @@ const GURL url_; const GURL site_for_cookies_; base::TimeTicks start_time_; + Motivation motivation_; OnResultCallback cb_; std::unique_ptr<network::SimpleURLLoader> url_loader_; int redirects_;
diff --git a/chrome/browser/android/customtabs/detached_resource_request_android.cc b/chrome/browser/android/customtabs/detached_resource_request_android.cc index cfa366a..0d6e282 100644 --- a/chrome/browser/android/customtabs/detached_resource_request_android.cc +++ b/chrome/browser/android/customtabs/detached_resource_request_android.cc
@@ -21,7 +21,8 @@ const base::android::JavaParamRef<jobject>& profile, const base::android::JavaParamRef<jstring>& url, const base::android::JavaParamRef<jstring>& origin, - jint referrer_policy) { + jint referrer_policy, + jint motivation) { DCHECK(profile && url && origin); Profile* native_profile = ProfileAndroid::FromProfileAndroid(profile); @@ -36,8 +37,11 @@ net::URLRequest::ReferrerPolicy url_request_referrer_policy = content::Referrer::ReferrerPolicyForUrlRequest( static_cast<blink::WebReferrerPolicy>(referrer_policy)); + DetachedResourceRequest::Motivation request_motivation = + static_cast<DetachedResourceRequest::Motivation>(motivation); DetachedResourceRequest::CreateAndStart( - native_profile, native_url, native_origin, url_request_referrer_policy); + native_profile, native_url, native_origin, url_request_referrer_policy, + request_motivation); } } // namespace customtabs
diff --git a/chrome/browser/android/customtabs/detached_resource_request_unittest.cc b/chrome/browser/android/customtabs/detached_resource_request_unittest.cc index e85f78423..b3224578 100644 --- a/chrome/browser/android/customtabs/detached_resource_request_unittest.cc +++ b/chrome/browser/android/customtabs/detached_resource_request_unittest.cc
@@ -45,6 +45,9 @@ constexpr const char kIndexKey[] = "index"; constexpr const char kMaxKey[] = "max"; +const DetachedResourceRequest::Motivation kMotivation = + DetachedResourceRequest::Motivation::kParallelRequest; + // /set-cookie-and-redirect?cookie=bla&url=https://redictected-url // Sets a cookies, then responds with HTTP code 302. std::unique_ptr<HttpResponse> SetCookieAndRedirect(const HttpRequest& request) { @@ -201,7 +204,7 @@ DetachedResourceRequest::CreateAndStart( browser_context(), url, site_for_cookies, - content::Referrer::GetDefaultReferrerPolicy()); + content::Referrer::GetDefaultReferrerPolicy(), kMotivation); first_request_waiter.Run(); second_request_waiter.Run(); @@ -224,7 +227,7 @@ GURL site_for_cookies(initial_referrer); DetachedResourceRequest::CreateAndStart( - browser_context(), url, site_for_cookies, policy, + browser_context(), url, site_for_cookies, policy, kMotivation, base::BindLambdaForTesting([&](bool success) { EXPECT_TRUE(success); request_completion_waiter.Quit(); @@ -256,7 +259,7 @@ DetachedResourceRequest::CreateAndStart( browser_context(), url, site_for_cookies, - content::Referrer::GetDefaultReferrerPolicy(), + content::Referrer::GetDefaultReferrerPolicy(), kMotivation, base::BindLambdaForTesting([&](bool success) { EXPECT_TRUE(success); request_completion_waiter.Quit(); @@ -281,7 +284,7 @@ DetachedResourceRequest::CreateAndStart( browser_context(), url, site_for_cookies, - content::Referrer::GetDefaultReferrerPolicy(), + content::Referrer::GetDefaultReferrerPolicy(), kMotivation, base::BindLambdaForTesting([&](bool success) { EXPECT_FALSE(success); request_waiter.Quit(); @@ -312,7 +315,7 @@ for (int i = 0; i < 2; ++i) { DetachedResourceRequest::CreateAndStart( browser_context(), url, site_for_cookies, - content::Referrer::GetDefaultReferrerPolicy()); + content::Referrer::GetDefaultReferrerPolicy(), kMotivation); } request_waiter.Run(); EXPECT_EQ(site_for_cookies.spec(), headers["referer"]); @@ -333,7 +336,7 @@ DetachedResourceRequest::CreateAndStart( browser_context(), url, site_for_cookies, - content::Referrer::GetDefaultReferrerPolicy()); + content::Referrer::GetDefaultReferrerPolicy(), kMotivation); request_waiter.Run(); EXPECT_EQ("", headers["referer"]); } @@ -360,7 +363,7 @@ DetachedResourceRequest::CreateAndStart( browser_context(), url, site_for_cookies, - content::Referrer::GetDefaultReferrerPolicy()); + content::Referrer::GetDefaultReferrerPolicy(), kMotivation); first_request_waiter.Run(); second_request_waiter.Run(); } @@ -385,7 +388,7 @@ DetachedResourceRequest::CreateAndStart( browser_context(), url, site_for_cookies, - content::Referrer::GetDefaultReferrerPolicy(), + content::Referrer::GetDefaultReferrerPolicy(), kMotivation, base::BindLambdaForTesting([&](bool success) { EXPECT_TRUE(success); request_completion_waiter.Quit(); @@ -446,7 +449,7 @@ DetachedResourceRequest::CreateAndStart( browser_context(), url, site_for_cookies, - content::Referrer::GetDefaultReferrerPolicy(), + content::Referrer::GetDefaultReferrerPolicy(), kMotivation, base::BindLambdaForTesting([&](bool success) { EXPECT_TRUE(success); detached_request_waiter.Quit(); @@ -477,7 +480,7 @@ DetachedResourceRequest::CreateAndStart( browser_context(), url, site_for_cookies, - content::Referrer::GetDefaultReferrerPolicy(), + content::Referrer::GetDefaultReferrerPolicy(), kMotivation, base::BindLambdaForTesting([&](bool success) { EXPECT_TRUE(success); request_waiter.Quit(); @@ -501,7 +504,7 @@ DetachedResourceRequest::CreateAndStart( browser_context(), url, site_for_cookies, - content::Referrer::GetDefaultReferrerPolicy(), + content::Referrer::GetDefaultReferrerPolicy(), kMotivation, base::BindLambdaForTesting([&](bool success) { EXPECT_FALSE(success); request_waiter.Quit(); @@ -530,7 +533,7 @@ DetachedResourceRequest::CreateAndStart( browser_context(), url, site_for_cookies, - content::Referrer::GetDefaultReferrerPolicy(), + content::Referrer::GetDefaultReferrerPolicy(), kMotivation, base::BindLambdaForTesting([&](bool success) { EXPECT_TRUE(success); first_request_waiter.Quit(); @@ -539,7 +542,7 @@ DetachedResourceRequest::CreateAndStart( browser_context(), url, site_for_cookies, - content::Referrer::GetDefaultReferrerPolicy(), + content::Referrer::GetDefaultReferrerPolicy(), kMotivation, base::BindLambdaForTesting([&](bool success) { EXPECT_TRUE(success); second_request_waiter.Quit();
diff --git a/chrome/browser/android/signin/signin_manager_android.cc b/chrome/browser/android/signin/signin_manager_android.cc index faa4ae1..f40471c 100644 --- a/chrome/browser/android/signin/signin_manager_android.cc +++ b/chrome/browser/android/signin/signin_manager_android.cc
@@ -31,7 +31,7 @@ #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/common/pref_names.h" #include "components/bookmarks/browser/bookmark_model.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/policy/core/browser/browser_policy_connector.h" #include "components/policy/core/common/cloud/cloud_policy_core.h" #include "components/policy/core/common/cloud/cloud_policy_store.h"
diff --git a/chrome/browser/android/url_utilities.cc b/chrome/browser/android/url_utilities.cc index cd0eb2d..67f64570 100644 --- a/chrome/browser/android/url_utilities.cc +++ b/chrome/browser/android/url_utilities.cc
@@ -7,7 +7,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/strings/string_util.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "jni/UrlUtilities_jni.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "url/gurl.h"
diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc index 762da37..f0b04c6b 100644 --- a/chrome/browser/autocomplete/search_provider_unittest.cc +++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -29,7 +29,7 @@ #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" -#include "components/google/core/browser/google_switches.h" +#include "components/google/core/common/google_switches.h" #include "components/history/core/browser/history_service.h" #include "components/omnibox/browser/autocomplete_controller.h" #include "components/omnibox/browser/autocomplete_input.h"
diff --git a/chrome/browser/background_fetch/background_fetch_browsertest.cc b/chrome/browser/background_fetch/background_fetch_browsertest.cc index e2786be..689cd1dfd 100644 --- a/chrome/browser/background_fetch/background_fetch_browsertest.cc +++ b/chrome/browser/background_fetch/background_fetch_browsertest.cc
@@ -8,6 +8,7 @@ #include "base/command_line.h" #include "base/logging.h" #include "base/run_loop.h" +#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "chrome/browser/background_fetch/background_fetch_delegate_impl.h" @@ -134,12 +135,17 @@ item.state != offline_items_collection::OfflineItemState::PENDING && finished_processing_item_callback_) std::move(finished_processing_item_callback_).Run(item); + latest_item_ = item; } + const OfflineItem& latest_item() const { return latest_item_; } + private: ItemsAddedCallback items_added_callback_; FinishedProcessingItemCallback finished_processing_item_callback_; + OfflineItem latest_item_; + DISALLOW_COPY_AND_ASSIGN(OfflineContentProviderObserver); }; @@ -484,12 +490,24 @@ EXPECT_EQ(offline_item.progress.unit, OfflineItemProgressUnit::PERCENTAGE); } -IN_PROC_BROWSER_TEST_F(BackgroundFetchBrowserTest, FetchesRunToCompletion) { - // Starts two seperate multifile fetches and waits for them to complete. +IN_PROC_BROWSER_TEST_F(BackgroundFetchBrowserTest, + FetchesRunToCompletionAndUpdateTitle_Fetched) { ASSERT_NO_FATAL_FAILURE(RunScriptAndCheckResultingEvent( "RunFetchTillCompletion()", "backgroundfetched")); + base::RunLoop().RunUntilIdle(); // Give `updateUI` a chance to propagate. + EXPECT_TRUE( + base::StartsWith(offline_content_provider_observer_->latest_item().title, + "New Fetched Title!", base::CompareCase::SENSITIVE)); +} + +IN_PROC_BROWSER_TEST_F(BackgroundFetchBrowserTest, + FetchesRunToCompletionAndUpdateTitle_Failed) { ASSERT_NO_FATAL_FAILURE(RunScriptAndCheckResultingEvent( "RunFetchTillCompletionWithMissingResource()", "backgroundfetchfail")); + base::RunLoop().RunUntilIdle(); // Give `updateUI` a chance to propagate. + EXPECT_TRUE( + base::StartsWith(offline_content_provider_observer_->latest_item().title, + "New Failed Title!", base::CompareCase::SENSITIVE)); } } // namespace
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc index 74d0f0a..b64adcb 100644 --- a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc +++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
@@ -103,6 +103,8 @@ } else { offline_item.state = OfflineItemState::IN_PROGRESS; } + + // TODO(crbug.com/865063): Update the icon. } bool BackgroundFetchDelegateImpl::JobDetails::ShouldReportProgressBySize() { @@ -207,20 +209,26 @@ job_details_map_.erase(job_details_iter); } -void BackgroundFetchDelegateImpl::UpdateUI(const std::string& job_unique_id, - const std::string& title) { +void BackgroundFetchDelegateImpl::UpdateUI( + const std::string& job_unique_id, + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + DCHECK(title || icon); // One of the UI options must be updatable. + DCHECK(!icon || !icon->isNull()); // The |icon|, if provided, is not null. auto job_details_iter = job_details_map_.find(job_unique_id); if (job_details_iter == job_details_map_.end()) return; JobDetails& job_details = job_details_iter->second; - // Update the title, if it's different. - if (job_details.fetch_description->title == title) - return; - job_details.fetch_description->title = title; + if (title && job_details.fetch_description->title != *title) + job_details.fetch_description->title = *title; + + if (icon) + job_details.fetch_description->icon = *icon; + UpdateOfflineItemAndUpdateObservers(&job_details); }
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.h b/chrome/browser/background_fetch/background_fetch_delegate_impl.h index a7a4744..f57bff8 100644 --- a/chrome/browser/background_fetch/background_fetch_delegate_impl.h +++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.h
@@ -58,7 +58,8 @@ const net::HttpRequestHeaders& headers) override; void Abort(const std::string& job_unique_id) override; void UpdateUI(const std::string& job_unique_id, - const std::string& title) override; + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) override; // Abort all ongoing downloads and fail the fetch. Currently only used when // the bytes downloaded exceed the total download size, if specified.
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc index 45c6a23c..f1e950e 100644 --- a/chrome/browser/browser_process_impl.cc +++ b/chrome/browser/browser_process_impl.cc
@@ -532,23 +532,6 @@ return waitable_event_.TimedWaitUntil(end_time); } -#if !defined(OS_ANDROID) -void RequestProxyResolvingSocketFactoryOnUIThread( - network::mojom::ProxyResolvingSocketFactoryRequest request) { - network::mojom::NetworkContext* network_context = - g_browser_process->system_network_context_manager()->GetContext(); - network_context->CreateProxyResolvingSocketFactory(std::move(request)); -} - -void RequestProxyResolvingSocketFactory( - network::mojom::ProxyResolvingSocketFactoryRequest request) { - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - base::BindOnce(&RequestProxyResolvingSocketFactoryOnUIThread, - std::move(request))); -} -#endif - } // namespace void BrowserProcessImpl::FlushLocalStateAndReply(base::OnceClosure reply) { @@ -1378,7 +1361,7 @@ gcm_driver_ = gcm::CreateGCMDriverDesktop( base::WrapUnique(new gcm::GCMClientFactory), local_state(), store_path, - base::BindRepeating(&RequestProxyResolvingSocketFactory), + system_request_context(), system_network_context_manager()->GetSharedURLLoaderFactory(), chrome::GetChannel(), gcm::GetProductCategoryForSubtypes(local_state()), content::BrowserThread::GetTaskRunnerForThread(
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index c42b0328..e22fae5 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -356,7 +356,6 @@ <include name="IDR_CUSTOM_LINKS_EDIT_CSS" file="resources\local_ntp\custom_links_edit.css" type="BINDATA" /> <include name="IDR_CUSTOM_LINKS_EDIT_JS" file="resources\local_ntp\custom_links_edit.js" type="BINDATA" /> <include name="IDR_CUSTOM_LINKS_ADD_SVG" file="resources\local_ntp\icons\add_link.svg" type="BINDATA" /> - <include name="IDR_CUSTOM_LINKS_EDIT_MENU_SVG" file="resources\local_ntp\icons\edit_menu.svg" type="BINDATA" /> <include name="IDR_OMNIBOX_HTML" file="resources\omnibox\omnibox.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> <include name="IDR_OMNIBOX_CSS" file="resources\omnibox\omnibox.css" type="BINDATA" compress="gzip" /> <include name="IDR_OMNIBOX_JS" file="resources\omnibox\omnibox.js" type="BINDATA" compress="gzip" />
diff --git a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc index d58d3e96..06fc4bab 100644 --- a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc +++ b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
@@ -48,6 +48,7 @@ #include "content/public/browser/network_service_instance.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/content_features.h" #include "content/public/common/content_paths.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/browsing_data_remover_test_util.h" @@ -243,7 +244,11 @@ void SetUpOnMainThread() override { feature_list_.InitWithFeatures( - {browsing_data::features::kRemoveNavigationHistory}, {}); + {browsing_data::features::kRemoveNavigationHistory, + // Ensure that MojoSessionStorage is enabled because the old + // SessionStorage implementation causes flaky tests. + features::kMojoSessionStorage}, + {}); base::FilePath path; base::PathService::Get(content::DIR_TEST_DATA, &path); host_resolver()->AddRule(kExampleHost, "127.0.0.1"); @@ -724,9 +729,8 @@ // SessionStorage is not supported by site data counting and the cookie tree // model but we can test the web visible behavior. -// Disabled due to failures in https://crbug.com/865802. IN_PROC_BROWSER_TEST_P(BrowsingDataRemoverBrowserTestP, - DISABLED_SessionStorageDeletion2) { + SessionStorageDeletionWebOnly) { GURL url = embedded_test_server()->GetURL("/browsing_data/site_data.html"); ui_test_utils::NavigateToURL(browser(), url); const std::string type = "SessionStorage"; @@ -838,9 +842,7 @@ // Check if any data remains after a deletion and a Chrome restart to force // all writes to be finished. -// Disabled due to failures in https://crbug.com/865802. -IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, - DISABLED_StorageRemovedFromDisk) { +IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest, StorageRemovedFromDisk) { // Deletions should remove all traces of browsing data from disk // but there are a few bugs that need to be fixed. // Any addition to this list must have an associated TODO().
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index 6787c04a..7c4d220 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -130,7 +130,7 @@ #include "components/component_updater/crl_set_remover.h" #include "components/device_event_log/device_event_log.h" #include "components/flags_ui/pref_service_flags_storage.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/language/content/browser/geo_language_provider.h" #include "components/language/core/browser/pref_names.h" #include "components/language/core/common/language_experiments.h"
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index f9429e57..da99f4c 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -177,7 +177,7 @@ #include "components/error_page/common/error_page_switches.h" #include "components/feature_engagement/public/feature_constants.h" #include "components/feature_engagement/public/feature_list.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/metrics/call_stack_profile_collector.h" #include "components/metrics/client_info.h" #include "components/nacl/common/buildflags.h"
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index abfa105..8d54035 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1752,6 +1752,8 @@ "virtual_machines/virtual_machines_util.h", # Extension API implementations. + "extensions/arc_apps_private_api.cc", + "extensions/arc_apps_private_api.h", "extensions/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.cc", "extensions/backdrop_wallpaper_handlers/backdrop_wallpaper_handlers.h", "extensions/echo_private_api.cc", @@ -2146,6 +2148,7 @@ "policy/pre_signin_policy_fetcher_unittest.cc", "policy/remote_commands/device_command_screenshot_job_unittest.cc", "policy/remote_commands/device_command_set_volume_job_unittest.cc", + "policy/remote_commands/device_command_start_crd_session_unittest.cc", "policy/remote_commands/device_command_wipe_users_job_unittest.cc", "policy/remote_commands/user_command_arc_job_unittest.cc", "policy/secondary_google_account_signin_policy_handler_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc index 1580a496d..44f45fb 100644 --- a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc +++ b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc
@@ -278,6 +278,10 @@ ax::mojom::Event::kTextSelectionChanged, true); } } + } else if (!is_notification_event && + event_data->event_type == + arc::mojom::AccessibilityEventType::WINDOW_STATE_CHANGED) { + UpdateWindowProperties(GetActiveWindow()); } return; @@ -560,6 +564,8 @@ window->SetProperty(aura::client::kAccessibilityTouchExplorationPassThrough, use_talkback); window->SetProperty(ash::kSearchKeyAcceleratorReservedKey, use_talkback); + window->SetProperty(aura::client::kAccessibilityFocusFallsbackToWidgetKey, + !use_talkback); } aura::Window* ArcAccessibilityHelperBridge::GetActiveWindow() {
diff --git a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc index 180d3cac..8aca112 100644 --- a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc +++ b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.h" #include "ash/shell.h" +#include "base/feature_list.h" #include "chrome/browser/chromeos/accessibility/accessibility_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" @@ -17,6 +18,7 @@ #include "components/exo/shell_surface.h" #include "components/exo/test/exo_test_helper.h" #include "components/exo/wm_helper.h" +#include "components/viz/common/features.h" #include "ui/aura/client/aura_constants.h" #include "ui/views/widget/widget.h" #include "ui/wm/public/activation_client.h" @@ -64,6 +66,11 @@ IN_PROC_BROWSER_TEST_F(ArcAccessibilityHelperBridgeBrowserTest, PreferenceChange) { + // TODO(penghuang): Re-enable once the EXO+Viz work is done and Arc can be + // supported. https://crbug.com/807465 + if (base::FeatureList::IsEnabled(features::kVizDisplayCompositor)) + return; + ASSERT_EQ(mojom::AccessibilityFilterType::OFF, fake_accessibility_helper_instance_->filter_type());
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc index e5969cb0..644f277b 100644 --- a/chrome/browser/chromeos/crostini/crostini_manager.cc +++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -41,6 +41,7 @@ constexpr int64_t kMinimumDiskSize = 1ll * 1024 * 1024 * 1024; // 1 GiB constexpr base::FilePath::CharType kHomeDirectory[] = FILE_PATH_LITERAL("/home"); +const char kSeparator[] = "--"; chromeos::CiceroneClient* GetCiceroneClient() { return chromeos::DBusThreadManager::Get()->GetCiceroneClient(); @@ -866,9 +867,11 @@ } // static -GURL CrostiniManager::GenerateVshInCroshUrl(Profile* profile, - const std::string& vm_name, - const std::string& container_name) { +GURL CrostiniManager::GenerateVshInCroshUrl( + Profile* profile, + const std::string& vm_name, + const std::string& container_name, + const std::vector<std::string>& terminal_args) { std::string vsh_crosh = base::StringPrintf( "chrome-extension://%s/html/crosh.html?command=vmshell", kCrostiniCroshBuiltinAppId); @@ -884,6 +887,14 @@ std::vector<base::StringPiece> pieces = { vsh_crosh, vm_name_param, container_name_param, owner_id_param}; + if (!terminal_args.empty()) { + // Separates the command args from the args we are passing into the + // terminal to be executed. + pieces.emplace_back(kSeparator); + for (auto arg : terminal_args) { + pieces.emplace_back(net::EscapeQueryParamValue(arg, false)); + } + } GURL vsh_in_crosh_url(base::JoinString(pieces, "&args[]=")); return vsh_in_crosh_url; @@ -920,9 +931,10 @@ void CrostiniManager::LaunchContainerTerminal( Profile* profile, const std::string& vm_name, - const std::string& container_name) { + const std::string& container_name, + const std::vector<std::string>& terminal_args) { GURL vsh_in_crosh_url = - GenerateVshInCroshUrl(profile, vm_name, container_name); + GenerateVshInCroshUrl(profile, vm_name, container_name, terminal_args); AppLaunchParams launch_params = GenerateTerminalAppLaunchParams(profile); OpenApplicationWindow(launch_params, vsh_in_crosh_url); }
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.h b/chrome/browser/chromeos/crostini/crostini_manager.h index 877dca7..59d4e0a 100644 --- a/chrome/browser/chromeos/crostini/crostini_manager.h +++ b/chrome/browser/chromeos/crostini/crostini_manager.h
@@ -148,9 +148,11 @@ static bool IsCrosTerminaInstalled(); // Generate the URL for Crostini terminal application. - static GURL GenerateVshInCroshUrl(Profile* profile, - const std::string& vm_name, - const std::string& container_name); + static GURL GenerateVshInCroshUrl( + Profile* profile, + const std::string& vm_name, + const std::string& container_name, + const std::vector<std::string>& terminal_args); // Generate AppLaunchParams for the Crostini terminal application. static AppLaunchParams GenerateTerminalAppLaunchParams(Profile* profile); @@ -276,10 +278,12 @@ Browser* browser); // Launches the crosh-in-a-window that displays a shell in an already running - // container on a VM. + // container on a VM and passes |terminal_args| as parameters to that shell + // which will cause them to be executed as program inside that shell. void LaunchContainerTerminal(Profile* profile, const std::string& vm_name, - const std::string& container_name); + const std::string& container_name, + const std::vector<std::string>& terminal_args); using RestartId = int; static const RestartId kUninitializedRestartId = -1;
diff --git a/chrome/browser/chromeos/crostini/crostini_remover.cc b/chrome/browser/chromeos/crostini/crostini_remover.cc index 14933950..dc6a52c 100644 --- a/chrome/browser/chromeos/crostini/crostini_remover.cc +++ b/chrome/browser/chromeos/crostini/crostini_remover.cc
@@ -25,27 +25,30 @@ std::string container_name, CrostiniManager::RemoveCrostiniCallback callback) : profile_(profile), - vm_name_(vm_name), - container_name_(container_name), + vm_name_(std::move(vm_name)), + container_name_(std::move(container_name)), callback_(std::move(callback)) {} CrostiniRemover::~CrostiniRemover() = default; void CrostiniRemover::RemoveCrostini() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - restart_id_ = CrostiniManager::GetInstance()->RestartCrostini( - profile_, vm_name_, container_name_, - base::BindOnce(&CrostiniRemover::OnRestartCrostini, this), this); + CrostiniManager::GetInstance()->InstallTerminaComponent( + base::BindOnce(&CrostiniRemover::OnComponentLoaded, this)); } -void CrostiniRemover::OnConciergeStarted(ConciergeClientResult result) { - // Abort RestartCrostini after it has started the Concierge service, and - // before it starts the VM. - CrostiniManager::GetInstance()->AbortRestartCrostini(profile_, restart_id_); - // Now that we have started the Concierge service, we can use it to stop the - // VM. - if (result != ConciergeClientResult::SUCCESS) { - std::move(callback_).Run(result); +void CrostiniRemover::OnComponentLoaded(bool is_successful) { + if (!is_successful) { + std::move(callback_).Run(ConciergeClientResult::UNKNOWN_ERROR); + return; + } + CrostiniManager::GetInstance()->StartConcierge( + base::BindOnce(&CrostiniRemover::OnConciergeStarted, this)); +} + +void CrostiniRemover::OnConciergeStarted(bool is_successful) { + if (!is_successful) { + std::move(callback_).Run(ConciergeClientResult::UNKNOWN_ERROR); return; } CrostiniManager::GetInstance()->StopVm( @@ -53,20 +56,6 @@ base::BindOnce(&CrostiniRemover::StopVmFinished, this)); } -void CrostiniRemover::OnRestartCrostini(ConciergeClientResult result) { - // If we got here, it must be due to a failure before Concierge was started. - // |result| should never be SUCCESS. - DCHECK_NE(result, ConciergeClientResult::SUCCESS) - << "RestartCrostini should have been aborted after starting the " - "Concierge service."; - - // We still need to signal failure via |callback_| - if (result != ConciergeClientResult::SUCCESS) { - LOG(ERROR) << "Failed to start concierge service"; - std::move(callback_).Run(result); - } -} - void CrostiniRemover::StopVmFinished(ConciergeClientResult result) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (result != ConciergeClientResult::SUCCESS) { @@ -92,8 +81,8 @@ base::BindOnce(&CrostiniRemover::StopConciergeFinished, this)); } -void CrostiniRemover::StopConciergeFinished(bool success) { - // The success parameter is never set by debugd. +void CrostiniRemover::StopConciergeFinished(bool is_successful) { + // The is_successful parameter is never set by debugd. auto* cros_component_manager = g_browser_process->platform_part()->cros_component_manager(); if (cros_component_manager) {
diff --git a/chrome/browser/chromeos/crostini/crostini_remover.h b/chrome/browser/chromeos/crostini/crostini_remover.h index 40aa3ee..35a5c04 100644 --- a/chrome/browser/chromeos/crostini/crostini_remover.h +++ b/chrome/browser/chromeos/crostini/crostini_remover.h
@@ -9,8 +9,7 @@ namespace crostini { -class CrostiniRemover : public crostini::CrostiniManager::RestartObserver, - public base::RefCountedThreadSafe<CrostiniRemover> { +class CrostiniRemover : public base::RefCountedThreadSafe<CrostiniRemover> { public: CrostiniRemover(Profile* profile, std::string vm_name, @@ -19,22 +18,17 @@ void RemoveCrostini(); - // crostini::CrostiniManager::RestartObserver - void OnComponentLoaded(crostini::ConciergeClientResult result) override {} - void OnConciergeStarted(crostini::ConciergeClientResult result) override; - void OnDiskImageCreated(crostini::ConciergeClientResult result) override {} - void OnVmStarted(crostini::ConciergeClientResult result) override {} - private: friend class base::RefCountedThreadSafe<CrostiniRemover>; - ~CrostiniRemover() override; - void OnRestartCrostini(crostini::ConciergeClientResult result); + + ~CrostiniRemover(); + + void OnComponentLoaded(bool is_successful); + void OnConciergeStarted(bool is_successful); void StopVmFinished(crostini::ConciergeClientResult result); void DestroyDiskImageFinished(crostini::ConciergeClientResult result); - void StopConciergeFinished(bool success); + void StopConciergeFinished(bool is_successful); - crostini::CrostiniManager::RestartId restart_id_ = - crostini::CrostiniManager::kUninitializedRestartId; Profile* profile_; std::string vm_name_; std::string container_name_;
diff --git a/chrome/browser/chromeos/crostini/crostini_util.cc b/chrome/browser/chromeos/crostini/crostini_util.cc index 987a715..8ba0e15 100644 --- a/chrome/browser/chromeos/crostini/crostini_util.cc +++ b/chrome/browser/chromeos/crostini/crostini_util.cc
@@ -288,7 +288,7 @@ } GURL vsh_in_crosh_url = crostini::CrostiniManager::GenerateVshInCroshUrl( - profile, vm_name, container_name); + profile, vm_name, container_name, std::vector<std::string>()); AppLaunchParams launch_params = crostini::CrostiniManager::GenerateTerminalAppLaunchParams(profile); // Create the terminal here so it's created in the right display. If the
diff --git a/chrome/browser/chromeos/dbus/vm_applications_service_provider_delegate.cc b/chrome/browser/chromeos/dbus/vm_applications_service_provider_delegate.cc index 7948817..b1390aa9 100644 --- a/chrome/browser/chromeos/dbus/vm_applications_service_provider_delegate.cc +++ b/chrome/browser/chromeos/dbus/vm_applications_service_provider_delegate.cc
@@ -4,10 +4,13 @@ #include "chrome/browser/chromeos/dbus/vm_applications_service_provider_delegate.h" +#include "chrome/browser/chromeos/crostini/crostini_manager.h" #include "chrome/browser/chromeos/crostini/crostini_registry_service.h" #include "chrome/browser/chromeos/crostini/crostini_registry_service_factory.h" +#include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chromeos/dbus/vm_applications/apps.pb.h" namespace chromeos { @@ -28,4 +31,17 @@ registry_service->UpdateApplicationList(app_list); } +void VmApplicationsServiceProviderDelegate::LaunchTerminal( + const vm_tools::apps::TerminalParams& terminal_params) { + Profile* profile = ProfileManager::GetPrimaryUserProfile(); + if (!ProfileHelper::IsPrimaryProfile(profile) || + terminal_params.owner_id() != CryptohomeIdForProfile(profile)) + return; + + crostini::CrostiniManager::GetInstance()->LaunchContainerTerminal( + profile, terminal_params.vm_name(), terminal_params.container_name(), + std::vector<std::string>(terminal_params.params().begin(), + terminal_params.params().end())); +} + } // namespace chromeos
diff --git a/chrome/browser/chromeos/dbus/vm_applications_service_provider_delegate.h b/chrome/browser/chromeos/dbus/vm_applications_service_provider_delegate.h index 5194f72..3ef641e 100644 --- a/chrome/browser/chromeos/dbus/vm_applications_service_provider_delegate.h +++ b/chrome/browser/chromeos/dbus/vm_applications_service_provider_delegate.h
@@ -19,6 +19,8 @@ // VmApplicationsServiceProvider::Delegate: void UpdateApplicationList( const vm_tools::apps::ApplicationList& app_list) override; + void LaunchTerminal( + const vm_tools::apps::TerminalParams& terminal_params) override; private: DISALLOW_COPY_AND_ASSIGN(VmApplicationsServiceProviderDelegate);
diff --git a/chrome/browser/chromeos/extensions/arc_apps_private_api.cc b/chrome/browser/chromeos/extensions/arc_apps_private_api.cc new file mode 100644 index 0000000..6844601 --- /dev/null +++ b/chrome/browser/chromeos/extensions/arc_apps_private_api.cc
@@ -0,0 +1,61 @@ +// Copyright 2018 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 "chrome/browser/chromeos/extensions/arc_apps_private_api.h" + +#include <string> +#include <vector> + +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" +#include "chrome/browser/ui/app_list/arc/arc_app_utils.h" +#include "chrome/common/extensions/api/arc_apps_private.h" +#include "ui/events/event_constants.h" + +ArcAppsPrivateGetLaunchableAppsFunction:: + ArcAppsPrivateGetLaunchableAppsFunction() = default; + +ArcAppsPrivateGetLaunchableAppsFunction:: + ~ArcAppsPrivateGetLaunchableAppsFunction() = default; + +ExtensionFunction::ResponseAction +ArcAppsPrivateGetLaunchableAppsFunction::Run() { + ArcAppListPrefs* prefs = + ArcAppListPrefs::Get(Profile::FromBrowserContext(browser_context())); + if (!prefs) + return RespondNow(Error("Not available")); + + std::vector<extensions::api::arc_apps_private::AppInfo> result; + const std::vector<std::string> app_ids = prefs->GetAppIds(); + for (const auto& app_id : app_ids) { + std::unique_ptr<ArcAppListPrefs::AppInfo> app_info = prefs->GetApp(app_id); + if (app_info && app_info->launchable) { + extensions::api::arc_apps_private::AppInfo app_info_result; + app_info_result.id = app_id; + result.push_back(std::move(app_info_result)); + } + } + return RespondNow(ArgumentList( + extensions::api::arc_apps_private::GetLaunchableApps::Results::Create( + result))); +} + +ArcAppsPrivateLaunchAppFunction::ArcAppsPrivateLaunchAppFunction() = default; + +ArcAppsPrivateLaunchAppFunction::~ArcAppsPrivateLaunchAppFunction() = default; + +ExtensionFunction::ResponseAction ArcAppsPrivateLaunchAppFunction::Run() { + std::unique_ptr<extensions::api::arc_apps_private::LaunchApp::Params> params( + extensions::api::arc_apps_private::LaunchApp::Params::Create(*args_)); + EXTENSION_FUNCTION_VALIDATE(params.get()); + if (!ArcAppListPrefs::Get(Profile::FromBrowserContext(browser_context()))) + return RespondNow(Error("Not available")); + + if (!arc::LaunchApp( + browser_context(), params->app_id, ui::EF_NONE, + arc::UserInteractionType::APP_STARTED_FROM_EXTENSION_API)) { + return RespondNow(Error("Launch failed")); + } + return RespondNow(NoArguments()); +} \ No newline at end of file
diff --git a/chrome/browser/chromeos/extensions/arc_apps_private_api.h b/chrome/browser/chromeos/extensions/arc_apps_private_api.h new file mode 100644 index 0000000..c15cc63d --- /dev/null +++ b/chrome/browser/chromeos/extensions/arc_apps_private_api.h
@@ -0,0 +1,46 @@ +// Copyright 2018 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 CHROME_BROWSER_CHROMEOS_EXTENSIONS_ARC_APPS_PRIVATE_API_H_ +#define CHROME_BROWSER_CHROMEOS_EXTENSIONS_ARC_APPS_PRIVATE_API_H_ + +#include "base/macros.h" +#include "extensions/browser/extension_function.h" + +class ArcAppsPrivateGetLaunchableAppsFunction + : public UIThreadExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("arcAppsPrivate.getLaunchableApps", + ARCAPPSPRIVATE_GETLAUNCHABLEAPPS) + + ArcAppsPrivateGetLaunchableAppsFunction(); + + protected: + ~ArcAppsPrivateGetLaunchableAppsFunction() override; + + // ExtensionFunction: + ResponseAction Run() override; + + private: + DISALLOW_COPY_AND_ASSIGN(ArcAppsPrivateGetLaunchableAppsFunction); +}; + +class ArcAppsPrivateLaunchAppFunction : public UIThreadExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("arcAppsPrivate.launchApp", + ARCAPPSPRIVATE_LAUNCHAPP) + + ArcAppsPrivateLaunchAppFunction(); + + protected: + ~ArcAppsPrivateLaunchAppFunction() override; + + // ExtensionFunction: + ResponseAction Run() override; + + private: + DISALLOW_COPY_AND_ASSIGN(ArcAppsPrivateLaunchAppFunction); +}; + +#endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_ARC_APPS_PRIVATE_API_H_ \ No newline at end of file
diff --git a/chrome/browser/chromeos/extensions/arc_apps_private_apitest.cc b/chrome/browser/chromeos/extensions/arc_apps_private_apitest.cc new file mode 100644 index 0000000..845a027 --- /dev/null +++ b/chrome/browser/chromeos/extensions/arc_apps_private_apitest.cc
@@ -0,0 +1,94 @@ +// Copyright 2018 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 <memory> + +#include "base/macros.h" +#include "chrome/browser/chromeos/arc/arc_util.h" +#include "chrome/browser/extensions/extension_apitest.h" +#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" +#include "chromeos/dbus/dbus_thread_manager.h" +#include "chromeos/dbus/fake_session_manager_client.h" +#include "components/arc/arc_bridge_service.h" +#include "components/arc/arc_service_manager.h" +#include "components/arc/arc_util.h" +#include "components/arc/test/connection_holder_util.h" +#include "components/arc/test/fake_app_instance.h" + +namespace { + +// Helper function to create a fake app instance and wait for the instance to be +// ready. +std::unique_ptr<arc::FakeAppInstance> CreateAppInstance( + ArcAppListPrefs* prefs) { + std::unique_ptr<arc::FakeAppInstance> app_instance = + std::make_unique<arc::FakeAppInstance>(prefs); + arc::ArcServiceManager::Get()->arc_bridge_service()->app()->SetInstance( + app_instance.get()); + WaitForInstanceReady( + arc::ArcServiceManager::Get()->arc_bridge_service()->app()); + return app_instance; +} + +} // namespace + +class ArcAppsPrivateApiTest : public extensions::ExtensionApiTest { + public: + ArcAppsPrivateApiTest() = default; + ~ArcAppsPrivateApiTest() override = default; + + void SetUpCommandLine(base::CommandLine* command_line) override { + extensions::ExtensionApiTest::SetUpCommandLine(command_line); + arc::SetArcAvailableCommandLineForTesting(command_line); + } + + void SetUpInProcessBrowserTestFixture() override { + extensions::ExtensionApiTest::SetUpInProcessBrowserTestFixture(); + arc::ArcSessionManager::SetUiEnabledForTesting(false); + std::unique_ptr<chromeos::FakeSessionManagerClient> session_manager_client = + std::make_unique<chromeos::FakeSessionManagerClient>(); + session_manager_client->set_arc_available(true); + chromeos::DBusThreadManager::GetSetterForTesting()->SetSessionManagerClient( + std::move(session_manager_client)); + } + + void SetUpOnMainThread() override { + extensions::ExtensionApiTest::SetUpOnMainThread(); + arc::SetArcPlayStoreEnabledForProfile(profile(), true); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcAppsPrivateApiTest); +}; + +IN_PROC_BROWSER_TEST_F(ArcAppsPrivateApiTest, GetAppIdAndLaunchApp) { + ArcAppListPrefs* prefs = ArcAppListPrefs::Get(browser()->profile()); + ASSERT_TRUE(prefs); + std::unique_ptr<arc::FakeAppInstance> app_instance = CreateAppInstance(prefs); + // Add one launchable app and one non-launchable app. + arc::mojom::AppInfo launchable_app("App_0", "Package_0", "Dummy_activity_0"); + app_instance->SendRefreshAppList({launchable_app}); + static_cast<arc::mojom::AppHost*>(prefs)->OnTaskCreated( + 0 /* task_id */, "Package_1", "Dummy_activity_1", "App_1", + base::nullopt /* intent */); + // Stopping the service makes the app non-ready. + arc::ArcServiceManager::Get()->arc_bridge_service()->app()->CloseInstance( + app_instance.get()); + + EXPECT_EQ(0u, app_instance->launch_requests().size()); + // Verify |chrome.arcAppsPrivate.getLaunchableApps| returns the id of + // the launchable app only. The JS test will attempt to launch the app. + EXPECT_TRUE(RunPlatformAppTestWithArg( + "arc_app_launcher", + ArcAppListPrefs::GetAppId("Package_0", "Dummy_activity_0").c_str())) + << message_; + // Verify the app is not launched because it's not ready. + EXPECT_EQ(0u, app_instance->launch_requests().size()); + // Restarting the service makes the app ready. Verify the app is launched + // successfully. + app_instance = CreateAppInstance(prefs); + app_instance->SendRefreshAppList({launchable_app}); + ASSERT_EQ(1u, app_instance->launch_requests().size()); + EXPECT_TRUE(app_instance->launch_requests()[0]->IsForApp(launchable_app)); +} \ No newline at end of file
diff --git a/chrome/browser/chromeos/file_manager/path_util_unittest.cc b/chrome/browser/chromeos/file_manager/path_util_unittest.cc index d8b704c..c438b91 100644 --- a/chrome/browser/chromeos/file_manager/path_util_unittest.cc +++ b/chrome/browser/chromeos/file_manager/path_util_unittest.cc
@@ -197,8 +197,12 @@ GURL url; EXPECT_TRUE( ConvertPathToArcUrl(drive_mount_point_.AppendASCII("a/b/c"), &url)); + // "@" appears escaped 3 times here because escaping happens when: + // - creating drive mount point name for user + // - creating externalfile: URL from the path + // - encoding the URL to Chrome content provider URL EXPECT_EQ(GURL("content://org.chromium.arc.chromecontentprovider/" - "externalfile%3Adrive-user%2540gmail.com-hash%2Fa%2Fb%2Fc"), + "externalfile%3Adrive-user%252540gmail.com-hash%2Fa%2Fb%2Fc"), url); } @@ -301,11 +305,10 @@ [](base::RunLoop* run_loop, const std::vector<GURL>& urls) { run_loop->Quit(); ASSERT_EQ(1U, urls.size()); - EXPECT_EQ( - GURL( - "content://org.chromium.arc.chromecontentprovider/" - "externalfile%3Adrive-user%2540gmail.com-hash%2Fa%2Fb%2Fc"), - urls[0]); + EXPECT_EQ(GURL("content://org.chromium.arc.chromecontentprovider/" + "externalfile%3Adrive-user%252540gmail.com-hash%2Fa%" + "2Fb%2Fc"), + urls[0]); }, &run_loop)); run_loop.Run(); @@ -416,11 +419,10 @@ EXPECT_EQ( GURL("content://org.chromium.arc.removablemediaprovider/a/b/c"), urls[1]); - EXPECT_EQ( - GURL( - "content://org.chromium.arc.chromecontentprovider/" - "externalfile%3Adrive-user%2540gmail.com-hash%2Fa%2Fb%2Fc"), - urls[2]); + EXPECT_EQ(GURL("content://org.chromium.arc.chromecontentprovider/" + "externalfile%3Adrive-user%252540gmail.com-hash%2Fa%" + "2Fb%2Fc"), + urls[2]); EXPECT_EQ( GURL("content://org.chromium.arc.intent_helper.fileprovider/" "external_files/a/b/c"),
diff --git a/chrome/browser/chromeos/fileapi/external_file_url_util.cc b/chrome/browser/chromeos/fileapi/external_file_url_util.cc index a99f03cc..ed206334 100644 --- a/chrome/browser/chromeos/fileapi/external_file_url_util.cc +++ b/chrome/browser/chromeos/fileapi/external_file_url_util.cc
@@ -45,13 +45,17 @@ if (!url.is_valid() || url.scheme() != content::kExternalFileScheme) return base::FilePath(); const std::string path_string = net::UnescapeURLComponent( - url.GetContent(), net::UnescapeRule::NONASCII_SPACES); + url.path(), + net::UnescapeRule::SPACES | net::UnescapeRule::PATH_SEPARATORS | + net::UnescapeRule::URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS | + net::UnescapeRule::NONASCII_SPACES); return base::FilePath::FromUTF8Unsafe(path_string); } GURL VirtualPathToExternalFileURL(const base::FilePath& virtual_path) { - return GURL(base::StringPrintf("%s:%s", content::kExternalFileScheme, - virtual_path.AsUTF8Unsafe().c_str())); + return GURL( + base::StringPrintf("%s:%s", content::kExternalFileScheme, + net::EscapePath(virtual_path.AsUTF8Unsafe()).c_str())); } GURL CreateExternalFileURLFromPath(Profile* profile,
diff --git a/chrome/browser/chromeos/fileapi/external_file_url_util_unittest.cc b/chrome/browser/chromeos/fileapi/external_file_url_util_unittest.cc index 61486959..17074cf 100644 --- a/chrome/browser/chromeos/fileapi/external_file_url_util_unittest.cc +++ b/chrome/browser/chromeos/fileapi/external_file_url_util_unittest.cc
@@ -79,12 +79,30 @@ .AsUTF8Unsafe()); } -TEST_F(ExternalFileURLUtilTest, VirtualPathToExternalFileURL) { - base::FilePath virtual_path(FILE_PATH_LITERAL("foo/bar012.txt")); +// Tests that given virtual path is encoded to an expected externalfile: URL +// and then the original path is reconstructed from it. +void ExpectVirtualPathRoundtrip( + const base::FilePath::StringType& virtual_path_string, + std::string expected_url) { + base::FilePath virtual_path(virtual_path_string); GURL result = VirtualPathToExternalFileURL(virtual_path); EXPECT_TRUE(result.is_valid()); EXPECT_EQ(content::kExternalFileScheme, result.scheme()); + EXPECT_EQ(expected_url, result.path()); EXPECT_EQ(virtual_path.value(), ExternalFileURLToVirtualPath(result).value()); } +TEST_F(ExternalFileURLUtilTest, VirtualPathToExternalFileURL) { + ExpectVirtualPathRoundtrip(FILE_PATH_LITERAL("foo/bar012.txt"), + "foo/bar012.txt"); + + // Path containing precent character, which is also used for URL encoding. + ExpectVirtualPathRoundtrip(FILE_PATH_LITERAL("foo/bar012%41%.txt"), + "foo/bar012%2541%25.txt"); + + // Path containing some ASCII characters that are escaped by URL enconding. + ExpectVirtualPathRoundtrip(FILE_PATH_LITERAL("foo/bar \"#<>?`{}.txt"), + "foo/bar%20%22%23%3C%3E%3F%60%7B%7D.txt"); +} + } // namespace chromeos
diff --git a/chrome/browser/chromeos/login/existing_user_controller.cc b/chrome/browser/chromeos/login/existing_user_controller.cc index af00b53..692d89a 100644 --- a/chrome/browser/chromeos/login/existing_user_controller.cc +++ b/chrome/browser/chromeos/login/existing_user_controller.cc
@@ -70,7 +70,7 @@ #include "chromeos/settings/cros_settings_names.h" #include "components/account_id/account_id.h" #include "components/arc/arc_util.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/policy/core/common/cloud/cloud_policy_client.h" #include "components/policy/core/common/cloud/cloud_policy_core.h" #include "components/policy/core/common/cloud/cloud_policy_store.h"
diff --git a/chrome/browser/chromeos/login/kiosk_browsertest.cc b/chrome/browser/chromeos/login/kiosk_browsertest.cc index 2ff6cb0..5bc35d9 100644 --- a/chrome/browser/chromeos/login/kiosk_browsertest.cc +++ b/chrome/browser/chromeos/login/kiosk_browsertest.cc
@@ -1914,15 +1914,13 @@ // compliant. // 3. Platform version changed and the new app is installed because it is // compliant now. -// Flaky tests - crbug.com/859715 IN_PROC_BROWSER_TEST_F(KioskUpdateTest, - DISABLED_PRE_PRE_IncompliantPlatformDelayInstall) { + PRE_PRE_IncompliantPlatformDelayInstall) { PreCacheAndLaunchApp(kTestOfflineEnabledKioskApp, "1.0.0", std::string(kTestOfflineEnabledKioskApp) + "_v1.crx"); } -// Flaky tests - crbug.com/859715 -IN_PROC_BROWSER_TEST_F(KioskUpdateTest, DISABLED_PRE_IncompliantPlatformDelayInstall) { +IN_PROC_BROWSER_TEST_F(KioskUpdateTest, PRE_IncompliantPlatformDelayInstall) { SetPlatformVersion("1233.0.0"); set_test_app_id(kTestOfflineEnabledKioskApp); @@ -1931,6 +1929,7 @@ // Fake auto launch. ReloadAutolaunchKioskApps(); + KioskAppManager::Get()->SetEnableAutoLaunch(true); KioskAppManager::Get()->SetAppWasAutoLaunchedWithZeroDelay( kTestOfflineEnabledKioskApp); @@ -1943,8 +1942,7 @@ EXPECT_TRUE(PrimaryAppUpdateIsPending()); } -// Flaky tests - crbug.com/859715 -IN_PROC_BROWSER_TEST_F(KioskUpdateTest, DISABLED_IncompliantPlatformDelayInstall) { +IN_PROC_BROWSER_TEST_F(KioskUpdateTest, IncompliantPlatformDelayInstall) { SetPlatformVersion("1234.0.0"); set_test_app_id(kTestOfflineEnabledKioskApp); @@ -1953,6 +1951,7 @@ // Fake auto launch. ReloadAutolaunchKioskApps(); + KioskAppManager::Get()->SetEnableAutoLaunch(true); KioskAppManager::Get()->SetAppWasAutoLaunchedWithZeroDelay( kTestOfflineEnabledKioskApp); @@ -1976,6 +1975,7 @@ // Fake auto launch. ReloadAutolaunchKioskApps(); + KioskAppManager::Get()->SetEnableAutoLaunch(true); KioskAppManager::Get()->SetAppWasAutoLaunchedWithZeroDelay( kTestOfflineEnabledKioskApp);
diff --git a/chrome/browser/chromeos/login/signin/merge_session_throttling_utils.cc b/chrome/browser/chromeos/login/signin/merge_session_throttling_utils.cc index 06126f93c..85eb1b8 100644 --- a/chrome/browser/chromeos/login/signin/merge_session_throttling_utils.cc +++ b/chrome/browser/chromeos/login/signin/merge_session_throttling_utils.cc
@@ -15,7 +15,7 @@ #include "chrome/browser/chromeos/login/signin/oauth2_login_manager.h" #include "chrome/browser/chromeos/login/signin/oauth2_login_manager_factory.h" #include "chrome/common/url_constants.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/user_manager/user_manager.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/chromeos/policy/device_status_collector.cc b/chrome/browser/chromeos/policy/device_status_collector.cc index 4313fb10..d430904 100644 --- a/chrome/browser/chromeos/policy/device_status_collector.cc +++ b/chrome/browser/chromeos/policy/device_status_collector.cc
@@ -44,6 +44,7 @@ #include "chrome/browser/policy/profile_policy_connector.h" #include "chrome/browser/policy/profile_policy_connector_factory.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/common/channel_info.h" #include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chromeos/audio/cras_audio_handler.h" @@ -63,6 +64,7 @@ #include "components/arc/arc_service_manager.h" #include "components/arc/common/enterprise_reporting.mojom.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" +#include "components/policy/core/common/cloud/cloud_policy_util.h" #include "components/policy/proto/device_management_backend.pb.h" #include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_registry_simple.h" @@ -719,17 +721,16 @@ android_status_fetcher_ = base::Bind(&ReadAndroidStatus); idle_poll_timer_.Start(FROM_HERE, - TimeDelta::FromSeconds(kIdlePollIntervalSeconds), - this, &DeviceStatusCollector::CheckIdleState); + TimeDelta::FromSeconds(kIdlePollIntervalSeconds), this, + &DeviceStatusCollector::CheckIdleState); resource_usage_sampling_timer_.Start( FROM_HERE, TimeDelta::FromSeconds(kResourceUsageSampleIntervalSeconds), this, &DeviceStatusCollector::SampleResourceUsage); // Watch for changes to the individual policies that control what the status // reports contain. - base::Closure callback = - base::Bind(&DeviceStatusCollector::UpdateReportingSettings, - base::Unretained(this)); + base::Closure callback = base::Bind( + &DeviceStatusCollector::UpdateReportingSettings, base::Unretained(this)); version_info_subscription_ = cros_settings_->AddSettingsObserver( chromeos::kReportDeviceVersionInfo, callback); activity_times_subscription_ = cros_settings_->AddSettingsObserver( @@ -764,9 +765,8 @@ base::Bind(&chromeos::version_loader::GetFirmware), base::Bind(&DeviceStatusCollector::OnOSFirmware, weak_factory_.GetWeakPtr())); - chromeos::version_loader::GetTpmVersion( - base::BindOnce(&DeviceStatusCollector::OnTpmVersion, - weak_factory_.GetWeakPtr())); + chromeos::version_loader::GetTpmVersion(base::BindOnce( + &DeviceStatusCollector::OnTpmVersion, weak_factory_.GetWeakPtr())); // If doing enterprise device-level reporting, observe the list of users to be // reported. Consumer reporting is enforced for the signed-in registered user @@ -787,8 +787,7 @@ : prefs::kUserActivityTimes)); } -DeviceStatusCollector::~DeviceStatusCollector() { -} +DeviceStatusCollector::~DeviceStatusCollector() {} // static void DeviceStatusCollector::RegisterPrefs(PrefRegistrySimple* registry) { @@ -805,8 +804,8 @@ void DeviceStatusCollector::CheckIdleState() { CalculateIdleState(kIdleStateThresholdSeconds, - base::Bind(&DeviceStatusCollector::IdleStateCallback, - base::Unretained(this))); + base::Bind(&DeviceStatusCollector::IdleStateCallback, + base::Unretained(this))); } void DeviceStatusCollector::UpdateReportingSettings() { @@ -815,13 +814,13 @@ // back when they are available. if (chromeos::CrosSettingsProvider::TRUSTED != cros_settings_->PrepareTrustedValues( - base::Bind(&DeviceStatusCollector::UpdateReportingSettings, - weak_factory_.GetWeakPtr()))) { + base::Bind(&DeviceStatusCollector::UpdateReportingSettings, + weak_factory_.GetWeakPtr()))) { return; } - if (!cros_settings_->GetBoolean( - chromeos::kReportDeviceVersionInfo, &report_version_info_)) { + if (!cros_settings_->GetBoolean(chromeos::kReportDeviceVersionInfo, + &report_version_info_)) { report_version_info_ = true; } if (!is_enterprise_reporting_) { @@ -832,8 +831,8 @@ &report_activity_times_)) { report_activity_times_ = true; } - if (!cros_settings_->GetBoolean( - chromeos::kReportDeviceBootMode, &report_boot_mode_)) { + if (!cros_settings_->GetBoolean(chromeos::kReportDeviceBootMode, + &report_boot_mode_)) { report_boot_mode_ = true; } if (!cros_settings_->GetBoolean(chromeos::kReportDeviceSessionStatus, @@ -852,8 +851,8 @@ } // Hardware status is reported for enterprise devices only by default. const bool already_reporting_hardware_status = report_hardware_status_; - if (!cros_settings_->GetBoolean( - chromeos::kReportDeviceHardwareStatus, &report_hardware_status_)) { + if (!cros_settings_->GetBoolean(chromeos::kReportDeviceHardwareStatus, + &report_hardware_status_)) { report_hardware_status_ = is_enterprise_reporting_; } @@ -1088,6 +1087,7 @@ // Enterprise-only version reporting below. status->set_browser_version(version_info::GetVersionNumber()); + status->set_channel(ConvertToProtoChannel(chrome::GetChannel())); status->set_firmware_version(firmware_version_); em::TpmVersionInfo* const tpm_version_info = @@ -1135,18 +1135,17 @@ const char* state_string; em::NetworkState::ConnectionState state_constant; } kConnectionStateMap[] = { - { shill::kStateIdle, em::NetworkState::IDLE }, - { shill::kStateCarrier, em::NetworkState::CARRIER }, - { shill::kStateAssociation, em::NetworkState::ASSOCIATION }, - { shill::kStateConfiguration, em::NetworkState::CONFIGURATION }, - { shill::kStateReady, em::NetworkState::READY }, - { shill::kStatePortal, em::NetworkState::PORTAL }, - { shill::kStateOffline, em::NetworkState::OFFLINE }, - { shill::kStateOnline, em::NetworkState::ONLINE }, - { shill::kStateDisconnect, em::NetworkState::DISCONNECT }, - { shill::kStateFailure, em::NetworkState::FAILURE }, - { shill::kStateActivationFailure, - em::NetworkState::ACTIVATION_FAILURE }, + {shill::kStateIdle, em::NetworkState::IDLE}, + {shill::kStateCarrier, em::NetworkState::CARRIER}, + {shill::kStateAssociation, em::NetworkState::ASSOCIATION}, + {shill::kStateConfiguration, em::NetworkState::CONFIGURATION}, + {shill::kStateReady, em::NetworkState::READY}, + {shill::kStatePortal, em::NetworkState::PORTAL}, + {shill::kStateOffline, em::NetworkState::OFFLINE}, + {shill::kStateOnline, em::NetworkState::ONLINE}, + {shill::kStateDisconnect, em::NetworkState::DISCONNECT}, + {shill::kStateFailure, em::NetworkState::FAILURE}, + {shill::kStateActivationFailure, em::NetworkState::ACTIVATION_FAILURE}, }; chromeos::NetworkStateHandler::DeviceStateList device_list; @@ -1549,9 +1548,8 @@ std::string DeviceStatusCollector::GetAppVersion( const std::string& kiosk_app_id) { - Profile* const profile = - chromeos::ProfileHelper::Get()->GetProfileByUser( - user_manager::UserManager::Get()->GetActiveUser()); + Profile* const profile = chromeos::ProfileHelper::Get()->GetProfileByUser( + user_manager::UserManager::Get()->GetActiveUser()); const extensions::ExtensionRegistry* const registry = extensions::ExtensionRegistry::Get(profile); const extensions::Extension* const extension = registry->GetExtensionById(
diff --git a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc index 737ae96..0c23dfd 100644 --- a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc +++ b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc
@@ -91,11 +91,17 @@ const char kArcKioskPackageName[] = "com.test.kioskapp"; const char kExternalMountPoint[] = "/a/b/c"; const char kPublicAccountId[] = "public_user@localhost"; -const char kArcStatus[] = "{\"applications\":[ { " - "\"packageName\":\"com.android.providers.telephony\"," - "\"versionName\":\"6.0.1\"," - "\"permissions\": [\"android.permission.INTERNET\"] }]," - "\"userEmail\":\"xxx@google.com\"}"; +const char kArcStatus[] = R"( +{ + "applications":[ + { + "packageName":"com.android.providers.telephony", + "versionName":"6.0.1", + "permissions":[ "android.permission.INTERNET" ] + } + ], + "userEmail":"xxx@google.com" +})"; const char kDroidGuardInfo[] = "{\"droid_guard_info\":42}"; const char kShillFakeProfilePath[] = "/profile/user1/shill"; const char kShillFakeUserhash[] = "user1"; @@ -182,7 +188,7 @@ Time GetCurrentTime() override { int poll_interval = policy::DeviceStatusCollector::kIdlePollIntervalSeconds; return baseline_time_ + - TimeDelta::FromSeconds(poll_interval * baseline_offset_periods_++); + TimeDelta::FromSeconds(poll_interval * baseline_offset_periods_++); } private: @@ -390,9 +396,7 @@ false); } - void TearDown() override { - settings_helper_.RestoreProvider(); - } + void TearDown() override { settings_helper_.RestoreProvider(); } protected: void AddMountPoint(const std::string& mount_point) { @@ -1002,6 +1006,7 @@ // Expect the version info to be reported by default. GetStatus(); EXPECT_TRUE(device_status_.has_browser_version()); + EXPECT_TRUE(device_status_.has_channel()); EXPECT_TRUE(device_status_.has_os_version()); EXPECT_TRUE(device_status_.has_firmware_version()); EXPECT_TRUE(device_status_.has_tpm_version_info()); @@ -1011,6 +1016,7 @@ settings_helper_.SetBoolean(chromeos::kReportDeviceVersionInfo, false); GetStatus(); EXPECT_FALSE(device_status_.has_browser_version()); + EXPECT_FALSE(device_status_.has_channel()); EXPECT_FALSE(device_status_.has_os_version()); EXPECT_FALSE(device_status_.has_firmware_version()); EXPECT_FALSE(device_status_.has_tpm_version_info()); @@ -1018,13 +1024,13 @@ settings_helper_.SetBoolean(chromeos::kReportDeviceVersionInfo, true); GetStatus(); EXPECT_TRUE(device_status_.has_browser_version()); + EXPECT_TRUE(device_status_.has_channel()); EXPECT_TRUE(device_status_.has_os_version()); EXPECT_TRUE(device_status_.has_firmware_version()); EXPECT_TRUE(device_status_.has_tpm_version_info()); - // Check that the browser version is not empty. OS version & firmware - // don't have any reasonable values inside the unit test, so those - // aren't checked. + // Check that the browser version is not empty. OS version & firmware don't + // have any reasonable values inside the unit test, so those aren't checked. EXPECT_NE("", device_status_.browser_version()); } @@ -1084,7 +1090,7 @@ std::vector<em::VolumeInfo> expected_volume_info; int size = 12345678; for (const auto& mount_info : - DiskMountManager::GetInstance()->mount_points()) { + DiskMountManager::GetInstance()->mount_points()) { expected_mount_points.push_back(mount_info.first); } expected_mount_points.push_back(kExternalMountPoint); @@ -1249,7 +1255,7 @@ GetStatus(); EXPECT_EQ(kArcStatus, session_status_.android_status().status_payload()); EXPECT_EQ(kDroidGuardInfo, - session_status_.android_status().droid_guard_info()); + session_status_.android_status().droid_guard_info()); // Expect no User DM Token for kiosk sessions. EXPECT_FALSE(session_status_.has_user_dm_token()); } @@ -1946,6 +1952,7 @@ // Should only report OS version. EXPECT_TRUE(device_status_.has_os_version()); EXPECT_FALSE(device_status_.has_browser_version()); + EXPECT_FALSE(device_status_.has_channel()); EXPECT_FALSE(device_status_.has_firmware_version()); EXPECT_FALSE(device_status_.has_tpm_version_info()); }
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.cc index ed99818..f477c69 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.cc +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.cc
@@ -42,7 +42,7 @@ // Period in seconds since last user activity, if job finished with // FAILURE_NOT_IDLE result code. -const char kLastActivityFieldName[] = "lastActivitySec"; +const char kResultLastActivityFieldName[] = "lastActivitySec"; } // namespace @@ -82,7 +82,7 @@ if (auth_code) value.SetKey(kResultAuthCodeFieldName, base::Value(auth_code.value())); if (time_delta) { - value.SetKey(kLastActivityFieldName, + value.SetKey(kResultLastActivityFieldName, base::Value(static_cast<int>(time_delta.value().InSeconds()))); } base::JSONWriter::Write(value, &payload_);
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h b/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h index ebe4bb8..06f25bae 100644 --- a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h
@@ -31,10 +31,16 @@ FAILURE_NOT_A_KIOSK = 2, // Failed as device is currently in use and no interruptUser flag is set. - FAILURE_NOT_IDLE = 2, + FAILURE_NOT_IDLE = 3, - // TODO(antrim): Work in progress - FAILURE_NOT_IMPLEMENTED_YET = 3, + // Failed as we could not get OAuth token for whatever reason. + FAILURE_NO_OAUTH_TOKEN = 4, + + // Failed as we could not get ICE configuration for whatever reason. + FAILURE_NO_ICE_CONFIG = 5, + + // Failure during attempt to start CRD host and obtain CRD token. + FAILURE_CRD_HOST_ERROR = 6, }; using OAuthTokenCallback = base::OnceCallback<void(const std::string&)>;
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_unittest.cc b/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_unittest.cc new file mode 100644 index 0000000..482932bb --- /dev/null +++ b/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_unittest.cc
@@ -0,0 +1,487 @@ +// Copyright 2018 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 "chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h" + +#include <map> +#include <utility> +#include <vector> + +#include "base/json/json_writer.h" +#include "base/macros.h" +#include "base/run_loop.h" +#include "base/single_thread_task_runner.h" +#include "base/test/test_mock_time_task_runner.h" +#include "base/threading/thread_task_runner_handle.h" +#include "base/time/time.h" +#include "base/values.h" +#include "chrome/test/base/testing_browser_process.h" +#include "components/policy/proto/device_management_backend.pb.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/test/test_browser_thread_bundle.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace policy { + +namespace em = enterprise_management; + +namespace { + +constexpr char kResultCodeFieldName[] = "resultCode"; +constexpr char kResultMessageFieldName[] = "message"; +constexpr char kResultAuthCodeFieldName[] = "authCode"; +constexpr char kResultLastActivityFieldName[] = "lastActivitySec"; + +constexpr RemoteCommandJob::UniqueIDType kUniqueID = 123456789; + +constexpr char kTestDirectoryBotJID[] = "remote@bot.jabber.nowhere.org"; + +constexpr char kTestOAuthToken[] = "test-oauth-token"; +constexpr char kTestAuthCode[] = "1111-2222-3333"; +constexpr char kTestNoOAuthTokenReason[] = "oops-no-oauth-token"; +constexpr char kTestNoICEConfigReason[] = "oops-no-ice-config"; + +constexpr char kIdlenessCutoffFieldName[] = "idlenessCutoffSec"; +constexpr char kDirectoryBotJIDFieldName[] = "directoryBotJID"; + +em::RemoteCommand GenerateCommandProto(RemoteCommandJob::UniqueIDType unique_id, + base::TimeDelta age_of_command, + base::TimeDelta idleness_cutoff, + const std::string& directory_bot_jid) { + em::RemoteCommand command_proto; + command_proto.set_type( + enterprise_management::RemoteCommand_Type_DEVICE_START_CRD_SESSION); + command_proto.set_command_id(unique_id); + command_proto.set_age_of_command(age_of_command.InMilliseconds()); + + std::string payload; + base::Value root_dict(base::Value::Type::DICTIONARY); + root_dict.SetKey(kIdlenessCutoffFieldName, + base::Value((int)idleness_cutoff.InSeconds())); + root_dict.SetKey(kDirectoryBotJIDFieldName, base::Value(directory_bot_jid)); + base::JSONWriter::Write(root_dict, &payload); + command_proto.set_payload(payload); + return command_proto; +} + +class StubCRDHostDelegate : public DeviceCommandStartCRDSessionJob::Delegate { + public: + StubCRDHostDelegate(bool has_active_session, + bool are_services_ready, + bool is_running_kiosk, + base::TimeDelta idleness_period, + bool oauth_token_success, + bool ice_config_success, + bool auth_code_success); + ~StubCRDHostDelegate() override; + + bool HasActiveSession() override; + void TerminateSession(base::OnceClosure callback) override; + + bool AreServicesReady() override; + bool IsRunningKiosk() override; + base::TimeDelta GetIdlenessPeriod() override; + + void FetchOAuthToken( + DeviceCommandStartCRDSessionJob::OAuthTokenCallback success_callback, + DeviceCommandStartCRDSessionJob::ErrorCallback error_callback) override; + + void FetchICEConfig( + const std::string& oauth_token, + DeviceCommandStartCRDSessionJob::ICEConfigCallback success_callback, + DeviceCommandStartCRDSessionJob::ErrorCallback error_callback) override; + + void StartCRDHostAndGetCode( + const std::string& directory_bot_jid, + const std::string& oauth_token, + base::Value ice_config, + DeviceCommandStartCRDSessionJob::AuthCodeCallback success_callback, + DeviceCommandStartCRDSessionJob::ErrorCallback error_callback) override; + + private: + bool has_active_session_; + bool are_services_ready_; + bool is_running_kiosk_; + base::TimeDelta idleness_period_; + bool oauth_token_success_; + bool ice_config_success_; + bool auth_code_success_; + + DISALLOW_COPY_AND_ASSIGN(StubCRDHostDelegate); +}; + +StubCRDHostDelegate::StubCRDHostDelegate(bool has_active_session, + bool are_services_ready, + bool is_running_kiosk, + base::TimeDelta idleness_period, + bool oauth_token_success, + bool ice_config_success, + bool auth_code_success) + : has_active_session_(has_active_session), + are_services_ready_(are_services_ready), + is_running_kiosk_(is_running_kiosk), + idleness_period_(idleness_period), + oauth_token_success_(oauth_token_success), + ice_config_success_(ice_config_success), + auth_code_success_(auth_code_success) {} + +StubCRDHostDelegate::~StubCRDHostDelegate() {} + +bool StubCRDHostDelegate::HasActiveSession() { + return has_active_session_; +} + +void StubCRDHostDelegate::TerminateSession(base::OnceClosure callback) { + has_active_session_ = false; + std::move(callback).Run(); +} + +bool StubCRDHostDelegate::AreServicesReady() { + return are_services_ready_; +} + +bool StubCRDHostDelegate::IsRunningKiosk() { + return is_running_kiosk_; +} + +base::TimeDelta StubCRDHostDelegate::GetIdlenessPeriod() { + return idleness_period_; +} + +void StubCRDHostDelegate::FetchOAuthToken( + DeviceCommandStartCRDSessionJob::OAuthTokenCallback success_callback, + DeviceCommandStartCRDSessionJob::ErrorCallback error_callback) { + if (oauth_token_success_) { + std::move(success_callback).Run(kTestOAuthToken); + } else { + std::move(error_callback) + .Run(DeviceCommandStartCRDSessionJob::FAILURE_NO_OAUTH_TOKEN, + kTestNoOAuthTokenReason); + } +} + +void StubCRDHostDelegate::FetchICEConfig( + const std::string& oauth_token, + DeviceCommandStartCRDSessionJob::ICEConfigCallback success_callback, + DeviceCommandStartCRDSessionJob::ErrorCallback error_callback) { + if (ice_config_success_) { + base::Value ice_config(base::Value::Type::DICTIONARY); + std::move(success_callback).Run(std::move(ice_config)); + } else { + std::move(error_callback) + .Run(DeviceCommandStartCRDSessionJob::FAILURE_NO_ICE_CONFIG, + kTestNoICEConfigReason); + } +} + +void StubCRDHostDelegate::StartCRDHostAndGetCode( + const std::string& directory_bot_jid, + const std::string& oauth_token, + base::Value ice_config, + DeviceCommandStartCRDSessionJob::AuthCodeCallback success_callback, + DeviceCommandStartCRDSessionJob::ErrorCallback error_callback) { + if (auth_code_success_) { + std::move(success_callback).Run(kTestAuthCode); + } else { + std::move(error_callback) + .Run(DeviceCommandStartCRDSessionJob::FAILURE_CRD_HOST_ERROR, + std::string()); + } +} + +} // namespace + +class DeviceCommandStartCRDSessionJobTest : public testing::Test { + public: + void VerifyResults(RemoteCommandJob* job, + RemoteCommandJob::Status expected_status, + std::string expected_payload); + + protected: + DeviceCommandStartCRDSessionJobTest(); + + // testing::Test: + void SetUp() override; + + void InitializeJob(RemoteCommandJob* job, + RemoteCommandJob::UniqueIDType unique_id, + base::TimeTicks issued_time, + base::TimeDelta idleness_cutoff, + const std::string& directory_bot_jid); + + std::string CreateSuccessPayload(const std::string& auth_code); + std::string CreateErrorPayload( + DeviceCommandStartCRDSessionJob::ResultCode result_code, + const std::string& error_message); + std::string CreateNotIdlePayload(base::TimeDelta idleness); + + base::TimeTicks test_start_time_; + + content::TestBrowserThreadBundle thread_bundle_; + base::RunLoop run_loop_; + + private: + DISALLOW_COPY_AND_ASSIGN(DeviceCommandStartCRDSessionJobTest); +}; + +DeviceCommandStartCRDSessionJobTest::DeviceCommandStartCRDSessionJobTest() {} + +void DeviceCommandStartCRDSessionJobTest::SetUp() { + test_start_time_ = base::TimeTicks::Now(); +} + +void DeviceCommandStartCRDSessionJobTest::InitializeJob( + RemoteCommandJob* job, + RemoteCommandJob::UniqueIDType unique_id, + base::TimeTicks issued_time, + base::TimeDelta idleness_cutoff, + const std::string& directory_bot_jid) { + EXPECT_TRUE(job->Init( + base::TimeTicks::Now(), + GenerateCommandProto(unique_id, base::TimeTicks::Now() - issued_time, + idleness_cutoff, directory_bot_jid))); + + EXPECT_EQ(unique_id, job->unique_id()); + EXPECT_EQ(RemoteCommandJob::NOT_STARTED, job->status()); +} + +std::string DeviceCommandStartCRDSessionJobTest::CreateSuccessPayload( + const std::string& auth_code) { + std::string payload; + base::Value root(base::Value::Type::DICTIONARY); + root.SetKey(kResultCodeFieldName, + base::Value(DeviceCommandStartCRDSessionJob::SUCCESS)); + root.SetKey(kResultAuthCodeFieldName, base::Value(auth_code)); + base::JSONWriter::Write(root, &payload); + return payload; +} + +std::string DeviceCommandStartCRDSessionJobTest::CreateErrorPayload( + DeviceCommandStartCRDSessionJob::ResultCode result_code, + const std::string& error_message) { + std::string payload; + base::Value root(base::Value::Type::DICTIONARY); + root.SetKey(kResultCodeFieldName, base::Value(result_code)); + if (!error_message.empty()) + root.SetKey(kResultMessageFieldName, base::Value(error_message)); + base::JSONWriter::Write(root, &payload); + return payload; +} + +std::string DeviceCommandStartCRDSessionJobTest::CreateNotIdlePayload( + base::TimeDelta idleness) { + std::string payload; + base::Value root(base::Value::Type::DICTIONARY); + root.SetKey(kResultCodeFieldName, + base::Value(DeviceCommandStartCRDSessionJob::FAILURE_NOT_IDLE)); + root.SetKey(kResultLastActivityFieldName, + base::Value(static_cast<int>(idleness.InSeconds()))); + base::JSONWriter::Write(root, &payload); + return payload; +} + +void DeviceCommandStartCRDSessionJobTest::VerifyResults( + RemoteCommandJob* job, + RemoteCommandJob::Status expected_status, + std::string expected_payload) { + EXPECT_EQ(expected_status, job->status()); + std::unique_ptr<std::string> payload = job->GetResultPayload(); + EXPECT_TRUE(payload); + EXPECT_EQ(expected_payload, *payload); + run_loop_.Quit(); +} + +TEST_F(DeviceCommandStartCRDSessionJobTest, Success) { + StubCRDHostDelegate delegate( + false /* has_active_session */, true /* are_services_ready */, + true /* is_running_kiosk */, + base::TimeDelta::FromHours(1) /* idleness_period */, + true /* oauth_token_success */, true /* ice_config_success */, + true /* auth_code_success */); + + std::unique_ptr<RemoteCommandJob> job = + std::make_unique<DeviceCommandStartCRDSessionJob>(&delegate); + InitializeJob(job.get(), kUniqueID, test_start_time_, + base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); + bool success = job->Run( + base::TimeTicks::Now(), + base::BindRepeating(&DeviceCommandStartCRDSessionJobTest::VerifyResults, + base::Unretained(this), base::Unretained(job.get()), + RemoteCommandJob::SUCCEEDED, + CreateSuccessPayload(kTestAuthCode))); + EXPECT_TRUE(success); + run_loop_.Run(); +} + +TEST_F(DeviceCommandStartCRDSessionJobTest, SuccessOldSessionWasRunning) { + StubCRDHostDelegate delegate( + true /* has_active_session */, true /* are_services_ready */, + true /* is_running_kiosk */, + base::TimeDelta::FromHours(1) /* idleness_period */, + true /* oauth_token_success */, true /* ice_config_success */, + true /* auth_code_success */); + + std::unique_ptr<RemoteCommandJob> job = + std::make_unique<DeviceCommandStartCRDSessionJob>(&delegate); + InitializeJob(job.get(), kUniqueID, test_start_time_, + base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); + bool success = job->Run( + base::TimeTicks::Now(), + base::BindRepeating(&DeviceCommandStartCRDSessionJobTest::VerifyResults, + base::Unretained(this), base::Unretained(job.get()), + RemoteCommandJob::SUCCEEDED, + CreateSuccessPayload(kTestAuthCode))); + EXPECT_TRUE(success); + run_loop_.Run(); +} + +TEST_F(DeviceCommandStartCRDSessionJobTest, FailureServicesAreNotReady) { + StubCRDHostDelegate delegate( + false /* has_active_session */, false /* are_services_ready */, + true /* is_running_kiosk */, + base::TimeDelta::FromHours(1) /* idleness_period */, + true /* oauth_token_success */, true /* ice_config_success */, + true /* auth_code_success */); + + std::unique_ptr<RemoteCommandJob> job = + std::make_unique<DeviceCommandStartCRDSessionJob>(&delegate); + InitializeJob(job.get(), kUniqueID, test_start_time_, + base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); + bool success = job->Run( + base::TimeTicks::Now(), + base::BindRepeating( + &DeviceCommandStartCRDSessionJobTest::VerifyResults, + base::Unretained(this), base::Unretained(job.get()), + RemoteCommandJob::FAILED, + CreateErrorPayload( + DeviceCommandStartCRDSessionJob::FAILURE_SERVICES_NOT_READY, + std::string()))); + EXPECT_TRUE(success); + run_loop_.Run(); +} + +TEST_F(DeviceCommandStartCRDSessionJobTest, FailureNotAKiosk) { + StubCRDHostDelegate delegate( + false /* has_active_session */, true /* are_services_ready */, + false /* is_running_kiosk */, + base::TimeDelta::FromHours(1) /* idleness_period */, + true /* oauth_token_success */, true /* ice_config_success */, + true /* auth_code_success */); + + std::unique_ptr<RemoteCommandJob> job = + std::make_unique<DeviceCommandStartCRDSessionJob>(&delegate); + InitializeJob(job.get(), kUniqueID, test_start_time_, + base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); + bool success = + job->Run(base::TimeTicks::Now(), + base::BindRepeating( + &DeviceCommandStartCRDSessionJobTest::VerifyResults, + base::Unretained(this), base::Unretained(job.get()), + RemoteCommandJob::FAILED, + CreateErrorPayload( + DeviceCommandStartCRDSessionJob::FAILURE_NOT_A_KIOSK, + std::string()))); + EXPECT_TRUE(success); + run_loop_.Run(); +} + +TEST_F(DeviceCommandStartCRDSessionJobTest, FailureNotIdle) { + StubCRDHostDelegate delegate( + false /* has_active_session */, true /* are_services_ready */, + true /* is_running_kiosk */, + base::TimeDelta::FromSeconds(1) /* idleness_period */, + true /* oauth_token_success */, true /* ice_config_success */, + true /* auth_code_success */); + + std::unique_ptr<RemoteCommandJob> job = + std::make_unique<DeviceCommandStartCRDSessionJob>(&delegate); + InitializeJob(job.get(), kUniqueID, test_start_time_, + base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); + bool success = + job->Run(base::TimeTicks::Now(), + base::BindRepeating( + &DeviceCommandStartCRDSessionJobTest::VerifyResults, + base::Unretained(this), base::Unretained(job.get()), + RemoteCommandJob::FAILED, + CreateNotIdlePayload(base::TimeDelta::FromSeconds(1)))); + EXPECT_TRUE(success); + run_loop_.Run(); +} + +TEST_F(DeviceCommandStartCRDSessionJobTest, TestNoOauthToken) { + StubCRDHostDelegate delegate( + false /* has_active_session */, true /* are_services_ready */, + true /* is_running_kiosk */, + base::TimeDelta::FromHours(1) /* idleness_period */, + false /* oauth_token_success */, true /* ice_config_success */, + true /* auth_code_success */); + + std::unique_ptr<RemoteCommandJob> job = + std::make_unique<DeviceCommandStartCRDSessionJob>(&delegate); + InitializeJob(job.get(), kUniqueID, test_start_time_, + base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); + bool success = + job->Run(base::TimeTicks::Now(), + base::BindRepeating( + &DeviceCommandStartCRDSessionJobTest::VerifyResults, + base::Unretained(this), base::Unretained(job.get()), + RemoteCommandJob::FAILED, + CreateErrorPayload( + DeviceCommandStartCRDSessionJob::FAILURE_NO_OAUTH_TOKEN, + kTestNoOAuthTokenReason))); + EXPECT_TRUE(success); + run_loop_.Run(); +} + +TEST_F(DeviceCommandStartCRDSessionJobTest, TestNoICEConfig) { + StubCRDHostDelegate delegate( + false /* has_active_session */, true /* are_services_ready */, + true /* is_running_kiosk */, + base::TimeDelta::FromHours(1) /* idleness_period */, + true /* oauth_token_success */, false /* ice_config_success */, + true /* auth_code_success */); + + std::unique_ptr<RemoteCommandJob> job = + std::make_unique<DeviceCommandStartCRDSessionJob>(&delegate); + InitializeJob(job.get(), kUniqueID, test_start_time_, + base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); + bool success = + job->Run(base::TimeTicks::Now(), + base::BindRepeating( + &DeviceCommandStartCRDSessionJobTest::VerifyResults, + base::Unretained(this), base::Unretained(job.get()), + RemoteCommandJob::FAILED, + CreateErrorPayload( + DeviceCommandStartCRDSessionJob::FAILURE_NO_ICE_CONFIG, + kTestNoICEConfigReason))); + EXPECT_TRUE(success); + run_loop_.Run(); +} + +TEST_F(DeviceCommandStartCRDSessionJobTest, TestErrorRunningCRDHost) { + StubCRDHostDelegate delegate( + false /* has_active_session */, true /* are_services_ready */, + true /* is_running_kiosk */, + base::TimeDelta::FromHours(1) /* idleness_period */, + true /* oauth_token_success */, true /* ice_config_success */, + false /* auth_code_success */); + + std::unique_ptr<RemoteCommandJob> job = + std::make_unique<DeviceCommandStartCRDSessionJob>(&delegate); + InitializeJob(job.get(), kUniqueID, test_start_time_, + base::TimeDelta::FromSeconds(30), kTestDirectoryBotJID); + bool success = + job->Run(base::TimeTicks::Now(), + base::BindRepeating( + &DeviceCommandStartCRDSessionJobTest::VerifyResults, + base::Unretained(this), base::Unretained(job.get()), + RemoteCommandJob::FAILED, + CreateErrorPayload( + DeviceCommandStartCRDSessionJob::FAILURE_CRD_HOST_ERROR, + std::string()))); + EXPECT_TRUE(success); + run_loop_.Run(); +} + +} // namespace policy
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc index 44f3282..587ff44 100644 --- a/chrome/browser/devtools/devtools_ui_bindings.cc +++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -1255,13 +1255,32 @@ const std::vector<std::string>& changed_paths, const std::vector<std::string>& added_paths, const std::vector<std::string>& removed_paths) { - base::ListValue changed, added, removed; - changed.AppendStrings(changed_paths); - added.AppendStrings(added_paths); - removed.AppendStrings(removed_paths); - - CallClientFunction("DevToolsAPI.fileSystemFilesChangedAddedRemoved", &changed, - &added, &removed); + const int kMaxPathsPerMessage = 1000; + size_t changed_index = 0; + size_t added_index = 0; + size_t removed_index = 0; + // Dispatch limited amount of file paths in a time to avoid + // IPC max message size limit. See https://crbug.com/797817. + while (changed_index < changed_paths.size() || + added_index < added_paths.size() || + removed_index < removed_paths.size()) { + int budget = kMaxPathsPerMessage; + base::ListValue changed, added, removed; + while (budget > 0 && changed_index < changed_paths.size()) { + changed.AppendString(changed_paths[changed_index++]); + --budget; + } + while (budget > 0 && added_index < added_paths.size()) { + added.AppendString(added_paths[added_index++]); + --budget; + } + while (budget > 0 && removed_index < removed_paths.size()) { + removed.AppendString(removed_paths[removed_index++]); + --budget; + } + CallClientFunction("DevToolsAPI.fileSystemFilesChangedAddedRemoved", + &changed, &added, &removed); + } } void DevToolsUIBindings::IndexingTotalWorkCalculated(
diff --git a/chrome/browser/download/download_commands.cc b/chrome/browser/download/download_commands.cc index 3287104..71e66e5f 100644 --- a/chrome/browser/download/download_commands.cc +++ b/chrome/browser/download/download_commands.cc
@@ -26,7 +26,7 @@ #include "chrome/common/safe_browsing/file_type_policies.h" #include "chrome/common/url_constants.h" #include "chrome/grit/theme_resources.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/safe_browsing/proto/csd.pb.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/download_item_utils.h"
diff --git a/chrome/browser/download/download_danger_prompt_browsertest.cc b/chrome/browser/download/download_danger_prompt_browsertest.cc index 91a28b1..d3895af 100644 --- a/chrome/browser/download/download_danger_prompt_browsertest.cc +++ b/chrome/browser/download/download_danger_prompt_browsertest.cc
@@ -6,7 +6,6 @@ #include "base/command_line.h" #include "base/files/file_path.h" #include "base/macros.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chrome/browser/download/download_danger_prompt.h" #include "chrome/browser/profiles/profile.h" @@ -25,7 +24,6 @@ #include "content/public/browser/download_item_utils.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/base/ui_base_features.h" #include "url/gurl.h" using ::testing::_; @@ -42,32 +40,9 @@ const char kTestDownloadUrl[] = "http://evildownload.com"; const char kDownloadResponseToken[] = "default_token"; -// An enum to parameterize the tests so that the tests can be run with and -// without the secondary-ui-md flag. -enum class SecondaryUiMd { - ENABLED, - DISABLED, -}; - -// Generates the test name suffix depending on the value of the SecondaryUiMd -// param. -std::string SecondaryUiMdStatusToString( - const ::testing::TestParamInfo<SecondaryUiMd>& info) { - switch (info.param) { - case SecondaryUiMd::ENABLED: - return "SecondaryUiMdEnabled"; - case SecondaryUiMd::DISABLED: - return "SecondaryUiMdDisabled"; - } - NOTREACHED(); - return std::string(); -} - } // namespace -class DownloadDangerPromptTest - : public InProcessBrowserTest, - public ::testing::WithParamInterface<SecondaryUiMd> { +class DownloadDangerPromptTest : public InProcessBrowserTest { public: DownloadDangerPromptTest() : prompt_(nullptr), @@ -79,12 +54,6 @@ ~DownloadDangerPromptTest() override {} void SetUp() override { - // TODO(crbug.com/630357): Remove parameterized testing for this class when - // secondary-ui-md is enabled by default on all platforms. - if (GetParam() == SecondaryUiMd::ENABLED) - scoped_feature_list_.InitAndEnableFeature(features::kSecondaryUiMd); - else - scoped_feature_list_.InitAndDisableFeature(features::kSecondaryUiMd); SafeBrowsingService::RegisterFactory(test_safe_browsing_factory_.get()); InProcessBrowserTest::SetUp(); } @@ -207,7 +176,6 @@ bool did_receive_callback_; std::unique_ptr<TestSafeBrowsingServiceFactory> test_safe_browsing_factory_; std::string expected_serialized_report_; - base::test::ScopedFeatureList scoped_feature_list_; DISALLOW_COPY_AND_ASSIGN(DownloadDangerPromptTest); }; @@ -218,7 +186,7 @@ #else #define MAYBE_TestAll TestAll #endif -IN_PROC_BROWSER_TEST_P(DownloadDangerPromptTest, MAYBE_TestAll) { +IN_PROC_BROWSER_TEST_F(DownloadDangerPromptTest, MAYBE_TestAll) { GURL download_url(kTestDownloadUrl); ON_CALL(download(), GetURL()).WillByDefault(ReturnRef(download_url)); ON_CALL(download(), GetReferrerUrl()) @@ -323,14 +291,6 @@ VerifyExpectations(true); } -// Prefix for test instantiations intentionally left blank since the test -// fixture class has a single parameterization. -INSTANTIATE_TEST_CASE_P(, - DownloadDangerPromptTest, - ::testing::Values(SecondaryUiMd::ENABLED, - SecondaryUiMd::DISABLED), - &SecondaryUiMdStatusToString); - // Class for testing interactive dialogs. class DownloadDangerPromptBrowserTest : public DialogBrowserTest { protected:
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index b162e8b..3deb4c43 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn
@@ -633,8 +633,6 @@ "external_provider_impl.h", "external_registry_loader_win.cc", "external_registry_loader_win.h", - "favicon_downloader.cc", - "favicon_downloader.h", "forced_extensions/installation_tracker.cc", "forced_extensions/installation_tracker.h", "global_shortcut_listener.cc", @@ -801,6 +799,7 @@ "//chrome/browser/media/router/discovery", "//chrome/browser/resource_coordinator:mojo_bindings", "//chrome/browser/safe_browsing", + "//chrome/browser/web_applications/components", "//chrome/browser/web_applications/extensions", "//chrome/common", "//chrome/common/extensions:mojo_bindings",
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc b/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc index a9177d0b..096d24e5 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc +++ b/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc
@@ -82,7 +82,7 @@ version_info::GetVersionNumber()); // Set Chrome channel request->mutable_browser_report()->set_channel( - static_cast<em::BrowserReport_Channel>(chrome::GetChannel())); + policy::ConvertToProtoChannel(chrome::GetChannel())); // Set Chrome executable path request->mutable_browser_report()->set_executable_path(GetChromePath());
diff --git a/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc b/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc index c3ad97eb7..04109d5 100644 --- a/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc +++ b/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc
@@ -84,8 +84,10 @@ const base::DictionaryValue* pac_dict = NULL; proxy_config->GetDictionary(proxy_api_constants::kProxyConfigPacScript, &pac_dict); - if (!pac_dict) + if (!pac_dict) { + *out = false; return true; + } bool mandatory_pac = false; if (pac_dict->HasKey(proxy_api_constants::kProxyConfigPacScriptMandatory) &&
diff --git a/chrome/browser/extensions/api/proxy/proxy_api_helpers.h b/chrome/browser/extensions/api/proxy/proxy_api_helpers.h index 4342898..bf7a1ee 100644 --- a/chrome/browser/extensions/api/proxy/proxy_api_helpers.h +++ b/chrome/browser/extensions/api/proxy/proxy_api_helpers.h
@@ -43,6 +43,8 @@ // // - If there are NO entries for the respective pieces of data, the functions // return true. +// The GetPacMandatoryFromExtensionPref() function sets |out| to false in this +// case. // - If there ARE entries and they could be parsed, the functions set |out| // and return true. // - If there are entries that could not be parsed, the functions set |error|
diff --git a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc index ec0e9ea..bc4abb57 100644 --- a/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc
@@ -1543,14 +1543,14 @@ const bool cancel = true; std::string value; net::HttpRequestHeaders old_headers; - old_headers.AddHeadersFromString("key1: value1\r\n" - "key2: value2\r\n"); + old_headers.SetHeader("key1", "value1"); + old_headers.SetHeader("key2", "value2"); // Test adding a header. net::HttpRequestHeaders new_headers_added; - new_headers_added.AddHeadersFromString("key1: value1\r\n" - "key3: value3\r\n" - "key2: value2\r\n"); + new_headers_added.SetHeader("key1", "value1"); + new_headers_added.SetHeader("key3", "value3"); + new_headers_added.SetHeader("key2", "value2"); std::unique_ptr<EventResponseDelta> delta_added( CalculateOnBeforeSendHeadersDelta("extid", base::Time::Now(), cancel, &old_headers, &new_headers_added)); @@ -1561,7 +1561,7 @@ // Test deleting a header. net::HttpRequestHeaders new_headers_deleted; - new_headers_deleted.AddHeadersFromString("key1: value1\r\n"); + new_headers_deleted.SetHeader("key1", "value1"); std::unique_ptr<EventResponseDelta> delta_deleted( CalculateOnBeforeSendHeadersDelta("extid", base::Time::Now(), cancel, &old_headers, &new_headers_deleted)); @@ -1571,8 +1571,8 @@ // Test modifying a header. net::HttpRequestHeaders new_headers_modified; - new_headers_modified.AddHeadersFromString("key1: value1\r\n" - "key2: value3\r\n"); + new_headers_modified.SetHeader("key1", "value1"); + new_headers_modified.SetHeader("key2", "value3"); std::unique_ptr<EventResponseDelta> delta_modified( CalculateOnBeforeSendHeadersDelta("extid", base::Time::Now(), cancel, &old_headers, &new_headers_modified)); @@ -1586,9 +1586,9 @@ // value) pair with a key that existed before. This is incorrect // usage of the API that shall be handled gracefully. net::HttpRequestHeaders new_headers_modified2; - new_headers_modified2.AddHeadersFromString("key1: value1\r\n" - "key2: value2\r\n" - "key2: value3\r\n"); + new_headers_modified2.SetHeader("key1", "value1"); + new_headers_modified2.SetHeader("key2", "value2"); + new_headers_modified2.SetHeader("key2", "value3"); std::unique_ptr<EventResponseDelta> delta_modified2( CalculateOnBeforeSendHeadersDelta("extid", base::Time::Now(), cancel, &old_headers, &new_headers_modified)); @@ -2017,8 +2017,8 @@ TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses_Cookies) { net::HttpRequestHeaders base_headers; - base_headers.AddHeaderFromString( - "Cookie: name=value; name2=value2; name3=\"value3\""); + base_headers.SetHeader("Cookie", + "name=value; name2=value2; name3=\"value3\""); TestLogger logger; WarningSet warning_set; std::string header_value;
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc index 957b2763..f0ae26495 100644 --- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -47,7 +47,7 @@ #include "chrome/test/base/search_test_utils.h" #include "chrome/test/base/ui_test_utils.h" #include "chromeos/login/scoped_test_public_session_login_state.h" -#include "components/google/core/browser/google_switches.h" +#include "components/google/core/common/google_switches.h" #include "components/prefs/pref_service.h" #include "components/proxy_config/proxy_config_dictionary.h" #include "components/proxy_config/proxy_config_pref_names.h"
diff --git a/chrome/browser/extensions/bookmark_app_helper.cc b/chrome/browser/extensions/bookmark_app_helper.cc index 8b3c5a7..982e028 100644 --- a/chrome/browser/extensions/bookmark_app_helper.cc +++ b/chrome/browser/extensions/bookmark_app_helper.cc
@@ -25,7 +25,6 @@ #include "chrome/browser/extensions/convert_web_app.h" #include "chrome/browser/extensions/crx_installer.h" #include "chrome/browser/extensions/extension_service.h" -#include "chrome/browser/extensions/favicon_downloader.h" #include "chrome/browser/extensions/launch_util.h" #include "chrome/browser/extensions/tab_helper.h" #include "chrome/browser/installable/installable_data.h" @@ -38,6 +37,7 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/extensions/application_launch.h" +#include "chrome/browser/web_applications/components/web_app_icon_downloader.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/webshare/share_target_pref_helper.h" #include "chrome/common/chrome_features.h" @@ -246,7 +246,7 @@ } void SetupWebContents() { - // Spin up a web contents process so we can use FaviconDownloader. + // Spin up a web contents process so we can use WebAppIconDownloader. // This is necessary to make sure we pick up all of the images provided // in favicon URLs. Without this, bookmark app sync can fail due to // missing icons which are not correctly extracted from a favicon. @@ -271,15 +271,15 @@ void DidFinishLoad(content::RenderFrameHost* render_frame_host, const GURL& validated_url) override { - favicon_downloader_.reset(new FaviconDownloader( + web_app_icon_downloader_.reset(new WebAppIconDownloader( web_contents_.get(), urls_to_download_, "Extensions.BookmarkApp.Icon.HttpStatusCodeClassOnSync", base::BindOnce(&BookmarkAppInstaller::OnIconsDownloaded, base::Unretained(this)))); // Skip downloading the page favicons as everything in is the URL list. - favicon_downloader_->SkipPageFavicons(); - favicon_downloader_->Start(); + web_app_icon_downloader_->SkipPageFavicons(); + web_app_icon_downloader_->Start(); } private: @@ -333,7 +333,7 @@ WebApplicationInfo web_app_info_; std::unique_ptr<content::WebContents> web_contents_; - std::unique_ptr<FaviconDownloader> favicon_downloader_; + std::unique_ptr<WebAppIconDownloader> web_app_icon_downloader_; std::vector<GURL> urls_to_download_; std::vector<BookmarkAppHelper::BitmapAndSource> downloaded_bitmaps_; }; @@ -652,7 +652,7 @@ web_app_info_.icons.push_back(primary_icon_info); } - favicon_downloader_.reset(new FaviconDownloader( + web_app_icon_downloader_.reset(new WebAppIconDownloader( contents_, web_app_info_icon_urls, "Extensions.BookmarkApp.Icon.HttpStatusCodeClassOnCreate", base::BindOnce(&BookmarkAppHelper::OnIconsDownloaded, @@ -660,9 +660,9 @@ // If the manifest specified icons, don't use the page icons. if (!data.manifest->icons.empty()) - favicon_downloader_->SkipPageFavicons(); + web_app_icon_downloader_->SkipPageFavicons(); - favicon_downloader_->Start(); + web_app_icon_downloader_->Start(); } void BookmarkAppHelper::OnIconsDownloaded( @@ -671,7 +671,7 @@ // The tab has navigated away during the icon download. Cancel the bookmark // app creation. if (!success) { - favicon_downloader_.reset(); + web_app_icon_downloader_.reset(); callback_.Run(nullptr, web_app_info_); return; } @@ -701,7 +701,7 @@ std::map<int, BitmapAndSource> size_to_icons = ResizeIconsAndGenerateMissing( downloaded_icons, SizesToGenerate(), &web_app_info_); ReplaceWebAppIcons(size_to_icons, &web_app_info_); - favicon_downloader_.reset(); + web_app_icon_downloader_.reset(); if (!contents_) { // The web contents can be null in tests.
diff --git a/chrome/browser/extensions/bookmark_app_helper.h b/chrome/browser/extensions/bookmark_app_helper.h index cd67554b..31827d5a0 100644 --- a/chrome/browser/extensions/bookmark_app_helper.h +++ b/chrome/browser/extensions/bookmark_app_helper.h
@@ -20,7 +20,7 @@ #include "content/public/browser/notification_registrar.h" #include "third_party/blink/public/common/manifest/manifest.h" -class FaviconDownloader; +class WebAppIconDownloader; struct InstallableData; class InstallableManager; class Profile; @@ -29,7 +29,7 @@ namespace content { class BrowserContext; class WebContents; -} +} // namespace content namespace extensions { class CrxInstaller; @@ -138,7 +138,7 @@ // Downloads icons from the given WebApplicationInfo using the given // WebContents. - std::unique_ptr<FaviconDownloader> favicon_downloader_; + std::unique_ptr<WebAppIconDownloader> web_app_icon_downloader_; private: FRIEND_TEST_ALL_PREFIXES(BookmarkAppHelperTest,
diff --git a/chrome/browser/extensions/bookmark_app_helper_unittest.cc b/chrome/browser/extensions/bookmark_app_helper_unittest.cc index 64fc44d..3255caa 100644 --- a/chrome/browser/extensions/bookmark_app_helper_unittest.cc +++ b/chrome/browser/extensions/bookmark_app_helper_unittest.cc
@@ -12,9 +12,9 @@ #include "chrome/browser/extensions/convert_web_app.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_service_test_base.h" -#include "chrome/browser/extensions/favicon_downloader.h" #include "chrome/browser/extensions/launch_util.h" #include "chrome/browser/installable/installable_data.h" +#include "chrome/browser/web_applications/components/web_app_icon_downloader.h" #include "chrome/common/chrome_features.h" #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" #include "chrome/common/extensions/manifest_handlers/app_theme_color_info.h" @@ -324,8 +324,8 @@ const Extension* extension() { return extension_; } - const FaviconDownloader* favicon_downloader() { - return favicon_downloader_.get(); + const WebAppIconDownloader* web_app_icon_downloader() { + return web_app_icon_downloader_.get(); } private: @@ -453,11 +453,11 @@ helper.CompleteInstallableCheck(kManifestUrl, manifest, GetParam()); // Favicon URLs are ignored because the site has a manifest with icons. - EXPECT_FALSE(helper.favicon_downloader()->need_favicon_urls_); + EXPECT_FALSE(helper.web_app_icon_downloader()->need_favicon_urls_); // Only 1 icon should be downloading since the other was provided by the // InstallableManager. - EXPECT_EQ(1u, helper.favicon_downloader()->in_progress_requests_.size()); + EXPECT_EQ(1u, helper.web_app_icon_downloader()->in_progress_requests_.size()); std::map<GURL, std::vector<SkBitmap>> icon_map; icon_map[GURL(kAppIconURL2)].push_back( @@ -968,7 +968,6 @@ downloaded, size_map, TestSizesToGenerate(), 3, 0); } - TEST_F(BookmarkAppHelperTest, IconResizedFromLargerAndSmaller) { std::vector<BookmarkAppHelper::BitmapAndSource> downloaded;
diff --git a/chrome/browser/extensions/dev_mode_bubble_delegate_unittest.cc b/chrome/browser/extensions/dev_mode_bubble_delegate_unittest.cc index eb545fdf..abd013c 100644 --- a/chrome/browser/extensions/dev_mode_bubble_delegate_unittest.cc +++ b/chrome/browser/extensions/dev_mode_bubble_delegate_unittest.cc
@@ -5,41 +5,17 @@ #include "chrome/browser/extensions/dev_mode_bubble_delegate.h" #include "base/macros.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_service_test_base.h" #include "extensions/common/extension_builder.h" #include "extensions/common/feature_switch.h" -#include "ui/base/material_design/material_design_controller.h" -#include "ui/base/ui_base_features.h" namespace extensions { -class DevModeBubbleDelegateMdUiUnitTest - : public ExtensionServiceTestBase, - public testing::WithParamInterface<bool> { - public: - DevModeBubbleDelegateMdUiUnitTest() = default; - ~DevModeBubbleDelegateMdUiUnitTest() override = default; +using DevModeBubbleDelegateUiUnitTest = ExtensionServiceTestBase; - void SetUp() override { - ExtensionServiceTestBase::SetUp(); - - bool secondary_md_ui_enabled = GetParam(); - if (secondary_md_ui_enabled) - scoped_feature_list_.InitAndEnableFeature(features::kSecondaryUiMd); - else - scoped_feature_list_.InitAndDisableFeature(features::kSecondaryUiMd); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; - - DISALLOW_COPY_AND_ASSIGN(DevModeBubbleDelegateMdUiUnitTest); -}; - -TEST_P(DevModeBubbleDelegateMdUiUnitTest, ExtensionServiceTestBase) { +TEST_F(DevModeBubbleDelegateUiUnitTest, Test) { FeatureSwitch::ScopedOverride dev_mode_highlighting( FeatureSwitch::force_dev_mode_highlighting(), true); @@ -51,19 +27,7 @@ DevModeBubbleDelegate bubble_delegate(profile()); EXPECT_TRUE(bubble_delegate.ShouldIncludeExtension(extension.get())); - // The Cocoa version of the bubble doesn't have a dismiss 'x', so needs a - // dedicated 'cancel' button. - bool should_have_cancel_button = -#if defined(OS_MACOSX) - !ui::MaterialDesignController::IsSecondaryUiMaterial(); -#else - false; -#endif - - EXPECT_EQ(should_have_cancel_button, - !bubble_delegate.GetDismissButtonLabel().empty()); + EXPECT_TRUE(bubble_delegate.GetDismissButtonLabel().empty()); } -INSTANTIATE_TEST_CASE_P(, DevModeBubbleDelegateMdUiUnitTest, testing::Bool()); - } // namespace extensions
diff --git a/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc b/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc index 1049110..15fd662 100644 --- a/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc +++ b/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc
@@ -76,28 +76,6 @@ const char kTestExtensionName[] = "FooBar"; -void RequestProxyResolvingSocketFactoryOnUIThread( - Profile* profile, - base::WeakPtr<gcm::GCMProfileService> service, - network::mojom::ProxyResolvingSocketFactoryRequest request) { - if (!service) - return; - network::mojom::NetworkContext* network_context = - content::BrowserContext::GetDefaultStoragePartition(profile) - ->GetNetworkContext(); - network_context->CreateProxyResolvingSocketFactory(std::move(request)); -} - -void RequestProxyResolvingSocketFactory( - Profile* profile, - base::WeakPtr<gcm::GCMProfileService> service, - network::mojom::ProxyResolvingSocketFactoryRequest request) { - content::BrowserThread::PostTask( - content::BrowserThread::UI, FROM_HERE, - base::BindOnce(&RequestProxyResolvingSocketFactoryOnUIThread, profile, - service, std::move(request))); -} - } // namespace // Helper class for asynchronous waiting. @@ -233,7 +211,6 @@ {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})); return std::make_unique<gcm::GCMProfileService>( profile->GetPrefs(), profile->GetPath(), profile->GetRequestContext(), - base::BindRepeating(&RequestProxyResolvingSocketFactory, profile), content::BrowserContext::GetDefaultStoragePartition(profile) ->GetURLLoaderFactoryForBrowserProcess(), chrome::GetChannel(),
diff --git a/chrome/browser/gcm/gcm_profile_service_factory.cc b/chrome/browser/gcm/gcm_profile_service_factory.cc index 4cc90a04..bb9e4a83 100644 --- a/chrome/browser/gcm/gcm_profile_service_factory.cc +++ b/chrome/browser/gcm/gcm_profile_service_factory.cc
@@ -38,38 +38,6 @@ namespace gcm { -namespace { - -#if !defined(OS_ANDROID) -// Requests a ProxyResolvingSocketFactoryPtr on the UI thread. Note that a -// WeakPtr of GCMProfileService is needed to detect when the KeyedService shuts -// down, and avoid calling into |profile| which might have also been destroyed. -void RequestProxyResolvingSocketFactoryOnUIThread( - Profile* profile, - base::WeakPtr<GCMProfileService> service, - network::mojom::ProxyResolvingSocketFactoryRequest request) { - if (!service) - return; - network::mojom::NetworkContext* network_context = - content::BrowserContext::GetDefaultStoragePartition(profile) - ->GetNetworkContext(); - network_context->CreateProxyResolvingSocketFactory(std::move(request)); -} - -// A thread-safe wrapper to request a ProxyResolvingSocketFactoryPtr. -void RequestProxyResolvingSocketFactory( - Profile* profile, - base::WeakPtr<GCMProfileService> service, - network::mojom::ProxyResolvingSocketFactoryRequest request) { - content::BrowserThread::PostTask( - content::BrowserThread::UI, FROM_HERE, - base::BindOnce(&RequestProxyResolvingSocketFactoryOnUIThread, profile, - std::move(service), std::move(request))); -} -#endif - -} // namespace - // static GCMProfileService* GCMProfileServiceFactory::GetForProfile( content::BrowserContext* profile) { @@ -115,9 +83,8 @@ service = base::WrapUnique( new GCMProfileService(profile->GetPath(), blocking_task_runner)); #else - service = std::make_unique<GCMProfileService>( + service = base::WrapUnique(new GCMProfileService( profile->GetPrefs(), profile->GetPath(), profile->GetRequestContext(), - base::BindRepeating(&RequestProxyResolvingSocketFactory, profile), content::BrowserContext::GetDefaultStoragePartition(profile) ->GetURLLoaderFactoryForBrowserProcess(), chrome::GetChannel(), @@ -130,7 +97,7 @@ content::BrowserThread::UI), content::BrowserThread::GetTaskRunnerForThread( content::BrowserThread::IO), - blocking_task_runner); + blocking_task_runner)); #endif #if BUILDFLAG(ENABLE_OFFLINE_PAGES) offline_pages::PrefetchService* prefetch_service =
diff --git a/chrome/browser/gcm/gcm_profile_service_unittest.cc b/chrome/browser/gcm/gcm_profile_service_unittest.cc index 87feeaa..28d1dd1 100644 --- a/chrome/browser/gcm/gcm_profile_service_unittest.cc +++ b/chrome/browser/gcm/gcm_profile_service_unittest.cc
@@ -46,27 +46,6 @@ const char kTestAppID[] = "TestApp"; const char kUserID[] = "user"; -void RequestProxyResolvingSocketFactoryOnUIThread( - Profile* profile, - base::WeakPtr<gcm::GCMProfileService> service, - network::mojom::ProxyResolvingSocketFactoryRequest request) { - if (!service) - return; - return content::BrowserContext::GetDefaultStoragePartition(profile) - ->GetNetworkContext() - ->CreateProxyResolvingSocketFactory(std::move(request)); -} - -void RequestProxyResolvingSocketFactory( - Profile* profile, - base::WeakPtr<gcm::GCMProfileService> service, - network::mojom::ProxyResolvingSocketFactoryRequest request) { - content::BrowserThread::PostTask( - content::BrowserThread::UI, FROM_HERE, - base::BindOnce(&RequestProxyResolvingSocketFactoryOnUIThread, profile, - service, std::move(request))); -} - std::unique_ptr<KeyedService> BuildGCMProfileService( content::BrowserContext* context) { Profile* profile = Profile::FromBrowserContext(context); @@ -75,7 +54,6 @@ {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})); return std::make_unique<gcm::GCMProfileService>( profile->GetPrefs(), profile->GetPath(), profile->GetRequestContext(), - base::BindRepeating(&RequestProxyResolvingSocketFactory, profile), content::BrowserContext::GetDefaultStoragePartition(profile) ->GetURLLoaderFactoryForBrowserProcess(), chrome::GetChannel(),
diff --git a/chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc b/chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc index f77c238..64d56a6b 100644 --- a/chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc +++ b/chrome/browser/loader/chrome_resource_dispatcher_host_delegate.cc
@@ -49,7 +49,7 @@ #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_io_data.h" #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/nacl/common/buildflags.h" #include "components/offline_pages/buildflags/buildflags.h" #include "components/offline_pages/core/request_header/offline_page_navigation_ui_data.h"
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager.cc b/chrome/browser/media/webrtc/webrtc_event_log_manager.cc index db43624..8f05d4ca 100644 --- a/chrome/browser/media/webrtc/webrtc_event_log_manager.cc +++ b/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
@@ -122,42 +122,19 @@ DCHECK(browser_context); CHECK(!browser_context->IsOffTheRecord()); - // network_connection_tracker() and system_request_context() are not available - // during instantiation; we get them when the first profile is loaded, which - // is also the earliest time when they could be needed. - content::NetworkConnectionTracker* network_connection_tracker; - net::URLRequestContextGetter* url_request_context_getter; - if (remote_logs_manager_ && !first_browser_context_initializations_done_) { - network_connection_tracker = - g_browser_process->network_connection_tracker(); - DCHECK(network_connection_tracker); - - url_request_context_getter = g_browser_process->system_request_context(); - DCHECK(url_request_context_getter); - + if (!first_browser_context_initializations_done_) { + OnFirstBrowserContextLoaded(); first_browser_context_initializations_done_ = true; - } else { - network_connection_tracker = nullptr; - url_request_context_getter = nullptr; } - // * The object is destroyed by ~BrowserProcessImpl(), so - // base::Unretained(this) will not be dereferenced after destruction. - // * |url_request_context_getter| is owned by IOThread. The internal task - // runner that uses it (|task_runner_|) stops before IOThread dies, so we - // can trust that |url_request_context_getter| will not be used after - // destruction. - // * |network_connection_tracker| is owned by BrowserProcessImpl, which - // owns the IOThread, so the logic explaining why using base::Unretained - // was safe for with |url_request_context_getter|, also applies to it. + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // will not be dereferenced after destruction. task_runner_->PostTask( FROM_HERE, - base::BindOnce( - &WebRtcEventLogManager::EnableForBrowserContextInternal, - base::Unretained(this), GetBrowserContextId(browser_context), - browser_context->GetPath(), - base::Unretained(network_connection_tracker), - base::Unretained(url_request_context_getter), std::move(reply))); + base::BindOnce(&WebRtcEventLogManager::EnableForBrowserContextInternal, + base::Unretained(this), + GetBrowserContextId(browser_context), + browser_context->GetPath(), std::move(reply))); } void WebRtcEventLogManager::DisableForBrowserContext( @@ -166,7 +143,7 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(browser_context); - // The object is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) // will not be dereferenced after destruction. task_runner_->PostTask( FROM_HERE, @@ -201,7 +178,7 @@ const auto browser_context_id = GetBrowserContextId(rph->GetBrowserContext()); DCHECK_NE(browser_context_id, kNullBrowserContextId); - // The object is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) // will not be dereferenced after destruction. task_runner_->PostTask( FROM_HERE, @@ -226,7 +203,7 @@ return; } - // The object is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) // will not be dereferenced after destruction. task_runner_->PostTask( FROM_HERE, @@ -257,7 +234,7 @@ base::OnceCallback<void(bool)> reply) { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(!base_path.empty()); - // The object is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) // will not be dereferenced after destruction. task_runner_->PostTask( FROM_HERE, @@ -269,7 +246,7 @@ void WebRtcEventLogManager::DisableLocalLogging( base::OnceCallback<void(bool)> reply) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - // The object is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) // will not be dereferenced after destruction. task_runner_->PostTask( FROM_HERE, @@ -296,7 +273,7 @@ const bool remote_logging_allowed = !browser_context->IsOffTheRecord(); - // The object is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) // will not be dereferenced after destruction. task_runner_->PostTask( FROM_HERE, @@ -340,7 +317,7 @@ const auto browser_context_id = GetBrowserContextId(browser_context); DCHECK_NE(browser_context_id, kNullBrowserContextId); - // The object is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) // will not be dereferenced after destruction. task_runner_->PostTask( FROM_HERE, @@ -372,7 +349,7 @@ WebRtcLocalEventLogsObserver* observer, base::OnceClosure reply) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - // The object is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) // will not be dereferenced after destruction. task_runner_->PostTask( FROM_HERE, @@ -384,7 +361,7 @@ WebRtcRemoteEventLogsObserver* observer, base::OnceClosure reply) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - // The object is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) // will not be dereferenced after destruction. task_runner_->PostTask( FROM_HERE, @@ -393,6 +370,8 @@ } bool WebRtcEventLogManager::IsRemoteLoggingEnabled() const { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + #if defined(OS_ANDROID) bool enabled = false; #else @@ -432,7 +411,7 @@ host->RemoveObserver(this); observed_render_process_hosts_.erase(host); - // The object is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) // will not be dereferenced after destruction. task_runner_->PostTask( FROM_HERE, @@ -514,25 +493,55 @@ } } +void WebRtcEventLogManager::OnFirstBrowserContextLoaded() { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + + if (!remote_logs_manager_) { + return; + } + + content::NetworkConnectionTracker* network_connection_tracker = + g_browser_process->network_connection_tracker(); + DCHECK(network_connection_tracker); + + net::URLRequestContextGetter* url_request_context_getter = + g_browser_process->system_request_context(); + DCHECK(url_request_context_getter); + + // * |url_request_context_getter| is owned by IOThread. The internal task + // runner that uses it (|task_runner_|) stops before IOThread dies, so we + // can trust that |url_request_context_getter| will not be used after + // destruction. + // * |network_connection_tracker| is owned by BrowserProcessImpl, which + // owns the IOThread, so the logic explaining why using base::Unretained + // was safe for with |url_request_context_getter|, also applies to it. + task_runner_->PostTask( + FROM_HERE, + base::BindOnce( + &WebRtcEventLogManager::OnFirstBrowserContextLoadedInternal, + base::Unretained(this), base::Unretained(network_connection_tracker), + base::Unretained(url_request_context_getter))); +} + +void WebRtcEventLogManager::OnFirstBrowserContextLoadedInternal( + content::NetworkConnectionTracker* network_connection_tracker, + net::URLRequestContextGetter* url_request_context_getter) { + DCHECK(task_runner_->RunsTasksInCurrentSequence()); + DCHECK(network_connection_tracker); + DCHECK(url_request_context_getter); + DCHECK(remote_logs_manager_); + remote_logs_manager_->SetNetworkConnectionTracker(network_connection_tracker); + remote_logs_manager_->SetUrlRequestContextGetter(url_request_context_getter); +} + void WebRtcEventLogManager::EnableForBrowserContextInternal( BrowserContextId browser_context_id, const base::FilePath& browser_context_dir, - content::NetworkConnectionTracker* network_connection_tracker, - net::URLRequestContextGetter* context_getter, base::OnceClosure reply) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); DCHECK_NE(browser_context_id, kNullBrowserContextId); if (remote_logs_manager_) { - if (network_connection_tracker) { - remote_logs_manager_->SetNetworkConnectionTracker( - network_connection_tracker); - } - - if (context_getter) { - remote_logs_manager_->SetUrlRequestContextGetter(context_getter); - } - remote_logs_manager_->EnableForBrowserContext(browser_context_id, browser_context_dir); } @@ -702,7 +711,7 @@ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, std::move(reply)); }; - // The object is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) // will not be dereferenced after destruction. task_runner_->PostTask(FROM_HERE, base::BindOnce(task, base::Unretained(this), clock, std::move(reply))); @@ -722,7 +731,7 @@ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, std::move(reply)); }; - // The object is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) // will not be dereferenced after destruction. task_runner_->PostTask( FROM_HERE, base::BindOnce(task, base::Unretained(this), @@ -747,7 +756,7 @@ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, std::move(reply)); }; - // The object is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) + // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this) // will not be dereferenced after destruction. task_runner_->PostTask( FROM_HERE, base::BindOnce(task, base::Unretained(this),
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager.h b/chrome/browser/media/webrtc/webrtc_event_log_manager.h index 626dc5b..2c1392c 100644 --- a/chrome/browser/media/webrtc/webrtc_event_log_manager.h +++ b/chrome/browser/media/webrtc/webrtc_event_log_manager.h
@@ -195,11 +195,19 @@ void OnLoggingTargetStarted(LoggingTarget target, PeerConnectionKey key); void OnLoggingTargetStopped(LoggingTarget target, PeerConnectionKey key); + // network_connection_tracker() and system_request_context() are not available + // during instantiation; we get them when the first profile is loaded, which + // is also the earliest time when they could be needed. + // OnFirstBrowserContextLoaded() is on the UI thread. + // OnFirstBrowserContextLoadedInternal() is the task sent to |task_runner_|. + void OnFirstBrowserContextLoaded(); + void OnFirstBrowserContextLoadedInternal( + content::NetworkConnectionTracker* network_connection_tracker, + net::URLRequestContextGetter* url_request_context_getter); + void EnableForBrowserContextInternal( BrowserContextId browser_context_id, const base::FilePath& browser_context_dir, - content::NetworkConnectionTracker* network_connection_tracker, - net::URLRequestContextGetter* context_getter, base::OnceClosure reply); void DisableForBrowserContextInternal(BrowserContextId browser_context_id, base::OnceClosure reply);
diff --git a/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win_unittest.cc b/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win_unittest.cc index ac0db0d..79b8b97d5d 100644 --- a/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win_unittest.cc +++ b/chrome/browser/media_galleries/win/mtp_device_delegate_impl_win_unittest.cc
@@ -158,7 +158,8 @@ EXPECT_EQ(0UL, info.transient_device_id.size()); } -TEST_F(MTPDeviceDelegateImplWinTest, GalleryNameMTP) { +// TODO(https://crbug.com/868254): Failing on Win7 Tests (1). Fix and enable. +TEST_F(MTPDeviceDelegateImplWinTest, DISABLED_GalleryNameMTP) { base::FilePath location( PortableDeviceWatcherWin::GetStoragePathFromStorageId( TestPortableDeviceWatcherWin::kStorageUniqueIdA));
diff --git a/chrome/browser/navigation_predictor/navigation_predictor.cc b/chrome/browser/navigation_predictor/navigation_predictor.cc index 6c6da38..d42ed3c 100644 --- a/chrome/browser/navigation_predictor/navigation_predictor.cc +++ b/chrome/browser/navigation_predictor/navigation_predictor.cc
@@ -36,8 +36,9 @@ NavigationPredictor::NavigationPredictor( content::RenderFrameHost* render_frame_host) - : render_frame_host_(render_frame_host) { - DCHECK(render_frame_host_); + : browser_context_( + render_frame_host->GetSiteInstance()->GetBrowserContext()) { + DCHECK(browser_context_); } NavigationPredictor::~NavigationPredictor() = default; @@ -60,8 +61,7 @@ } SiteEngagementService* NavigationPredictor::GetEngagementService() const { - Profile* profile = Profile::FromBrowserContext( - render_frame_host_->GetSiteInstance()->GetBrowserContext()); + Profile* profile = Profile::FromBrowserContext(browser_context_); return SiteEngagementService::Get(profile); }
diff --git a/chrome/browser/navigation_predictor/navigation_predictor.h b/chrome/browser/navigation_predictor/navigation_predictor.h index de642138..55cc2811 100644 --- a/chrome/browser/navigation_predictor/navigation_predictor.h +++ b/chrome/browser/navigation_predictor/navigation_predictor.h
@@ -12,6 +12,7 @@ #include "third_party/blink/public/mojom/loader/navigation_predictor.mojom.h" namespace content { +class BrowserContext; class RenderFrameHost; } @@ -65,9 +66,8 @@ void RecordMetricsOnLoad( const blink::mojom::AnchorElementMetrics& metric) const; - // |render_frame_host_| is the host associated with the render frame. It is - // used to retrieve metrics at the browser side. - content::RenderFrameHost* const render_frame_host_; + // Used to get keyed services. + content::BrowserContext* const browser_context_; DISALLOW_COPY_AND_ASSIGN(NavigationPredictor); };
diff --git a/chrome/browser/net/dns_probe_browsertest.cc b/chrome/browser/net/dns_probe_browsertest.cc index 31235f30..23c3655 100644 --- a/chrome/browser/net/dns_probe_browsertest.cc +++ b/chrome/browser/net/dns_probe_browsertest.cc
@@ -23,7 +23,7 @@ #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "components/error_page/common/net_error_info.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/prefs/pref_service.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/net/errorpage_browsertest.cc b/chrome/browser/net/errorpage_browsertest.cc index 5503482..4747d485 100644 --- a/chrome/browser/net/errorpage_browsertest.cc +++ b/chrome/browser/net/errorpage_browsertest.cc
@@ -38,7 +38,7 @@ #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "components/error_page/common/error_page_switches.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/policy/core/browser/browser_policy_connector.h" #include "components/policy/core/common/mock_configuration_policy_provider.h" #include "components/policy/core/common/policy_map.h"
diff --git a/chrome/browser/net/safe_search_util.cc b/chrome/browser/net/safe_search_util.cc index ba59b77..7ee7bd1d 100644 --- a/chrome/browser/net/safe_search_util.cc +++ b/chrome/browser/net/safe_search_util.cc
@@ -15,7 +15,7 @@ #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "chrome/common/url_constants.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "net/cookies/cookie_util.h" #include "net/http/http_request_headers.h" #include "net/url_request/url_request.h"
diff --git a/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.cc b/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.cc index 3c77767..666a096 100644 --- a/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.cc +++ b/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.cc
@@ -27,6 +27,12 @@ }; } // namespace +// static +void PrefetchBackgroundTaskHandlerImpl::RegisterPrefs( + PrefRegistrySimple* registry) { + registry->RegisterListPref(prefs::kOfflinePrefetchBackoff); +} + PrefetchBackgroundTaskHandlerImpl::PrefetchBackgroundTaskHandlerImpl( PrefService* prefs) : prefs_(prefs) {} @@ -120,8 +126,4 @@ prefs_->Set(prefs::kOfflinePrefetchBackoff, *value); } -void RegisterPrefetchBackgroundTaskPrefs(PrefRegistrySimple* registry) { - registry->RegisterListPref(prefs::kOfflinePrefetchBackoff); -} - } // namespace offline_pages
diff --git a/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.h b/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.h index 004c530..bfeb2f65 100644 --- a/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.h +++ b/chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.h
@@ -41,6 +41,8 @@ // The backoff value is controlled by a persisted BackoffEntry. class PrefetchBackgroundTaskHandlerImpl : public PrefetchBackgroundTaskHandler { public: + static void RegisterPrefs(PrefRegistrySimple* registry); + explicit PrefetchBackgroundTaskHandlerImpl(PrefService* profile); ~PrefetchBackgroundTaskHandlerImpl() override; @@ -69,8 +71,6 @@ DISALLOW_COPY_AND_ASSIGN(PrefetchBackgroundTaskHandlerImpl); }; -void RegisterPrefetchBackgroundTaskPrefs(PrefRegistrySimple* registry); - } // namespace offline_pages #endif // CHROME_BROWSER_OFFLINE_PAGES_PREFETCH_PREFETCH_BACKGROUND_TASK_HANDLER_IMPL_H_
diff --git a/chrome/browser/offline_pages/prefetch/prefetch_configuration_impl.cc b/chrome/browser/offline_pages/prefetch/prefetch_configuration_impl.cc index c8c40d3..bd07470 100644 --- a/chrome/browser/offline_pages/prefetch/prefetch_configuration_impl.cc +++ b/chrome/browser/offline_pages/prefetch/prefetch_configuration_impl.cc
@@ -4,20 +4,28 @@ #include "chrome/browser/offline_pages/prefetch/prefetch_configuration_impl.h" -#include "chrome/browser/net/prediction_options.h" #include "chrome/common/pref_names.h" +#include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" namespace offline_pages { +// static +void PrefetchConfigurationImpl::RegisterPrefs(PrefRegistrySimple* registry) { + registry->RegisterBooleanPref(prefs::kOfflinePrefetchEnabled, true); +} + PrefetchConfigurationImpl::PrefetchConfigurationImpl(PrefService* pref_service) : pref_service_(pref_service) {} PrefetchConfigurationImpl::~PrefetchConfigurationImpl() = default; bool PrefetchConfigurationImpl::IsPrefetchingEnabledBySettings() { - return pref_service_->GetInteger(prefs::kNetworkPredictionOptions) != - chrome_browser_net::NETWORK_PREDICTION_NEVER; + return pref_service_->GetBoolean(prefs::kOfflinePrefetchEnabled); +} + +void PrefetchConfigurationImpl::SetPrefetchingEnabledInSettings(bool enabled) { + pref_service_->SetBoolean(prefs::kOfflinePrefetchEnabled, enabled); } } // namespace offline_pages
diff --git a/chrome/browser/offline_pages/prefetch/prefetch_configuration_impl.h b/chrome/browser/offline_pages/prefetch/prefetch_configuration_impl.h index e36a0e4..52d01bd 100644 --- a/chrome/browser/offline_pages/prefetch/prefetch_configuration_impl.h +++ b/chrome/browser/offline_pages/prefetch/prefetch_configuration_impl.h
@@ -8,6 +8,7 @@ #include "base/macros.h" #include "components/offline_pages/core/prefetch/prefetch_configuration.h" +class PrefRegistrySimple; class PrefService; namespace offline_pages { @@ -15,12 +16,18 @@ // Implementation of PrefetchConfiguration that queries Chrome preferences. class PrefetchConfigurationImpl : public PrefetchConfiguration { public: + static void RegisterPrefs(PrefRegistrySimple* registry); + explicit PrefetchConfigurationImpl(PrefService* pref_service); ~PrefetchConfigurationImpl() override; // PrefetchConfiguration implementation. bool IsPrefetchingEnabledBySettings() override; + // Configures the user controlled setting that enables or disables the + // prefetching of offline pages to run. + void SetPrefetchingEnabledInSettings(bool enabled); + private: PrefService* pref_service_;
diff --git a/chrome/browser/offline_pages/prefetch/prefetch_configuration_impl_unittest.cc b/chrome/browser/offline_pages/prefetch/prefetch_configuration_impl_unittest.cc new file mode 100644 index 0000000..fb23038 --- /dev/null +++ b/chrome/browser/offline_pages/prefetch/prefetch_configuration_impl_unittest.cc
@@ -0,0 +1,71 @@ +// Copyright 2018 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 "chrome/browser/offline_pages/prefetch/prefetch_configuration_impl.h" + +#include "base/feature_list.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/common/pref_names.h" +#include "components/offline_pages/core/offline_page_feature.h" +#include "components/prefs/testing_pref_service.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace offline_pages { + +class PrefetchConfigurationImplTest : public testing::Test { + public: + PrefetchConfigurationImplTest() + : pref_service_(), prefetch_config_(&pref_service_) {} + ~PrefetchConfigurationImplTest() override = default; + + void SetUp() override { + PrefetchConfigurationImpl::RegisterPrefs(pref_service_.registry()); + } + + PrefService& prefs() { return pref_service_; } + PrefetchConfigurationImpl& config() { return prefetch_config_; } + + protected: + TestingPrefServiceSimple pref_service_; + PrefetchConfigurationImpl prefetch_config_; + + DISALLOW_COPY_AND_ASSIGN(PrefetchConfigurationImplTest); +}; + +TEST_F(PrefetchConfigurationImplTest, EnabledInSettingsByDefault) { + EXPECT_TRUE(prefs().GetBoolean(prefs::kOfflinePrefetchEnabled)); + EXPECT_TRUE(config().IsPrefetchingEnabledBySettings()); +} + +TEST_F(PrefetchConfigurationImplTest, WhenPrefetchFlagIsEnabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature(kPrefetchingOfflinePagesFeature); + + // Disable in settings and check. + config().SetPrefetchingEnabledInSettings(false); + EXPECT_FALSE(config().IsPrefetchingEnabledBySettings()); + EXPECT_FALSE(config().IsPrefetchingEnabled()); + + // Re-enable in settings and check. + config().SetPrefetchingEnabledInSettings(true); + EXPECT_TRUE(config().IsPrefetchingEnabledBySettings()); + EXPECT_TRUE(config().IsPrefetchingEnabled()); +} + +TEST_F(PrefetchConfigurationImplTest, WhenPrefetchFlagIsDisabled) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndDisableFeature(kPrefetchingOfflinePagesFeature); + + // Disable in settings and check. + config().SetPrefetchingEnabledInSettings(false); + EXPECT_FALSE(config().IsPrefetchingEnabledBySettings()); + EXPECT_FALSE(config().IsPrefetchingEnabled()); + + // Re-enable in settings and check. + config().SetPrefetchingEnabledInSettings(true); + EXPECT_TRUE(config().IsPrefetchingEnabledBySettings()); + EXPECT_FALSE(config().IsPrefetchingEnabled()); +} + +} // namespace offline_pages
diff --git a/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer.cc index 9e41297..89cc069 100644 --- a/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/amp_page_load_metrics_observer.cc
@@ -11,7 +11,7 @@ #include "base/time/time.h" #include "chrome/browser/page_load_metrics/page_load_metrics_util.h" #include "chrome/common/page_load_metrics/page_load_timing.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "content/public/browser/navigation_handle.h" #include "url/gurl.h"
diff --git a/chrome/browser/pdf/pdf_extension_test.cc b/chrome/browser/pdf/pdf_extension_test.cc index 50ae7a9..896d0140 100644 --- a/chrome/browser/pdf/pdf_extension_test.cc +++ b/chrome/browser/pdf/pdf_extension_test.cc
@@ -133,8 +133,7 @@ bool PdfIsExpectedToLoad(const std::string& pdf_file) { if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { // These files don't crash with the different timing of network service. - if (pdf_file == "pdf_private/cfuzz5.pdf" || - pdf_file == "pdf_private/cfuzz6.pdf") { + if (pdf_file == "pdf_private/cfuzz5.pdf") { return true; } } @@ -142,7 +141,6 @@ const char* const kFailingPdfs[] = { "pdf_private/accessibility_crash_1.pdf", "pdf_private/cfuzz5.pdf", - "pdf_private/cfuzz6.pdf", "pdf_private/js.pdf", "pdf_private/segv-ecx.pdf", "pdf_private/tests.pdf",
diff --git a/chrome/browser/plugins/plugin_infobar_delegates.cc b/chrome/browser/plugins/plugin_infobar_delegates.cc index 86cab4ce..e564fa0 100644 --- a/chrome/browser/plugins/plugin_infobar_delegates.cc +++ b/chrome/browser/plugins/plugin_infobar_delegates.cc
@@ -23,7 +23,7 @@ #include "chrome/common/buildflags.h" #include "chrome/common/url_constants.h" #include "chrome/grit/generated_resources.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/infobars/core/infobar.h" #include "components/strings/grit/components_strings.h" #include "content/public/browser/render_process_host.h"
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 260886c..00105649 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -158,6 +158,7 @@ #if BUILDFLAG(ENABLE_OFFLINE_PAGES) #include "chrome/browser/offline_pages/prefetch/offline_metrics_collector_impl.h" #include "chrome/browser/offline_pages/prefetch/prefetch_background_task_handler_impl.h" +#include "chrome/browser/offline_pages/prefetch/prefetch_configuration_impl.h" #endif #if BUILDFLAG(ENABLE_PLUGINS) @@ -724,7 +725,8 @@ #if BUILDFLAG(ENABLE_OFFLINE_PAGES) offline_pages::OfflineMetricsCollectorImpl::RegisterPrefs(registry); - offline_pages::RegisterPrefetchBackgroundTaskPrefs(registry); + offline_pages::PrefetchBackgroundTaskHandlerImpl::RegisterPrefs(registry); + offline_pages::PrefetchConfigurationImpl::RegisterPrefs(registry); #endif #if defined(OS_ANDROID)
diff --git a/chrome/browser/prerender/prerender_histograms.cc b/chrome/browser/prerender/prerender_histograms.cc index 389dea9..1469fccf 100644 --- a/chrome/browser/prerender/prerender_histograms.cc +++ b/chrome/browser/prerender/prerender_histograms.cc
@@ -14,7 +14,7 @@ #include "base/strings/stringprintf.h" #include "chrome/browser/prerender/prerender_manager.h" #include "chrome/common/prerender_util.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "net/http/http_cache.h" namespace prerender {
diff --git a/chrome/browser/prerender/prerender_util.cc b/chrome/browser/prerender/prerender_util.cc index 9ed46b8..8451c3a 100644 --- a/chrome/browser/prerender/prerender_util.cc +++ b/chrome/browser/prerender/prerender_util.cc
@@ -5,7 +5,7 @@ #include "chrome/browser/prerender/prerender_util.h" #include "base/metrics/histogram_macros.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "extensions/buildflags/buildflags.h" #include "url/gurl.h"
diff --git a/chrome/browser/printing/print_dialog_cloud.cc b/chrome/browser/printing/print_dialog_cloud.cc index 34fb495..1186955 100644 --- a/chrome/browser/printing/print_dialog_cloud.cc +++ b/chrome/browser/printing/print_dialog_cloud.cc
@@ -13,7 +13,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_window.h" #include "components/cloud_devices/common/cloud_devices_urls.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/signin/core/browser/profile_management_switches.h" #include "components/signin/core/browser/signin_header_helper.h" #include "components/signin/core/browser/signin_metrics.h"
diff --git a/chrome/browser/printing/print_dialog_cloud_win.cc b/chrome/browser/printing/print_dialog_cloud_win.cc index baecdb40..855485a 100644 --- a/chrome/browser/printing/print_dialog_cloud_win.cc +++ b/chrome/browser/printing/print_dialog_cloud_win.cc
@@ -26,7 +26,7 @@ #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" #include "chrome/common/chrome_switches.h" #include "components/cloud_devices/common/cloud_devices_urls.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/message_port_provider.h"
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc index 90a4d37..1bc3fb0 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -79,7 +79,7 @@ #include "components/autofill/core/common/password_generation_util.h" #include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h" #include "components/download/public/common/download_url_parameters.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/guest_view/browser/guest_view_base.h" #include "components/language/core/browser/language_model_manager.h" #include "components/omnibox/browser/autocomplete_classifier.h"
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js index 60cecf0..fc80caa 100644 --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
@@ -226,13 +226,9 @@ listBoxOption: {msgId: 'role_listitem', earconId: 'LIST_ITEM'}, listItem: {msgId: 'role_listitem', earconId: 'LIST_ITEM', inherits: 'abstractItem'}, - log: { - msgId: 'role_log', - }, + log: {msgId: 'role_log', inherits: 'abstractNameFromContents'}, main: {msgId: 'role_main', inherits: 'abstractContainer'}, - marquee: { - msgId: 'role_marquee', - }, + marquee: {msgId: 'role_marquee', inherits: 'abstractNameFromContents'}, math: {msgId: 'role_math', inherits: 'abstractContainer'}, menu: {msgId: 'role_menu', outputContextFirst: true, ignoreAncestry: true}, menuBar: { @@ -263,7 +259,7 @@ inherits: 'abstractRange', earconId: 'LISTBOX' }, - status: {msgId: 'role_status'}, + status: {msgId: 'role_status', inherits: 'abstractNameFromContents'}, tab: {msgId: 'role_tab'}, tabList: {msgId: 'role_tablist', inherits: 'abstractContainer'}, tabPanel: {msgId: 'role_tabpanel'}, @@ -271,7 +267,7 @@ textField: {msgId: 'input_type_text', earconId: 'EDITABLE_TEXT'}, textFieldWithComboBox: {msgId: 'role_combobox', earconId: 'EDITABLE_TEXT'}, time: {msgId: 'tag_time', inherits: 'abstractContainer'}, - timer: {msgId: 'role_timer'}, + timer: {msgId: 'role_timer', inherits: 'abstractNameFromContents'}, toolbar: {msgId: 'role_toolbar', ignoreAncestry: true}, toggleButton: {msgId: 'role_button', inherits: 'checkBox'}, tree: {msgId: 'role_tree'}, @@ -369,6 +365,10 @@ $if($posInSet, @describe_index($posInSet, $setSize)) $description $restriction` }, + abstractNameFromContents: { + speak: `$nameOrDescendants $node(activeDescendant) $value $state + $restriction $role $description`, + }, abstractRange: { speak: `$name $node(activeDescendant) $description $role $if($value, $value, $if($valueForRange, $valueForRange))
diff --git a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb index 209633b..364e2a4e 100644 --- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb +++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bn.xtb
@@ -59,7 +59,7 @@ <translation id="1467432559032391204">বামে</translation> <translation id="1474557363159888097">কোনো পূর্ববর্তী অ্যাঙ্কর নেই৷</translation> <translation id="1480046233931937785">কৃতিত্ব</translation> -<translation id="1487494366197411587">Chromebook এ বাঁ Shift কী এর ঠিক উপরেই সার্চ কী।</translation> +<translation id="1487494366197411587">Chromebook এ বাঁ Shift বোতাম এর ঠিক উপরেই সার্চ বোতাম।</translation> <translation id="1499041187027566160">ভলিউম বাড়ান</translation> <translation id="1502086903961450562">পূর্ববর্তী গ্রাফিক</translation> <translation id="1506187449813838456">পিচ বাড়ান</translation> @@ -675,7 +675,7 @@ <translation id="6493991254603208962">উজ্জ্বলতা কমান</translation> <translation id="6508059270146105198">পৃষ্ঠার নীচের দিকে ব্রেইল প্রদর্শন সরান</translation> <translation id="6536864053412760904">গাণিতিক ML টোকেন</translation> -<translation id="6540201937398578274">ChromeVox এ, সার্চ বোতাম হল পরিবর্তক কী। বেশিরভাগ ChromeVox শর্টকাটগুলি সার্চ বোতাম দিয়ে শুরু হয়। এছাড়াও, নেভিগেশনের জন্য আপনি তীরচিহ্নগুলি ব্যবহার করবেন।</translation> +<translation id="6540201937398578274">ChromeVox এ, সার্চ বোতাম হল পরিবর্তক বোতাম। বেশিরভাগ ChromeVox শর্টকাটগুলি সার্চ বোতাম দিয়ে শুরু হয়। এছাড়াও, নেভিগেশনের জন্য আপনি তীরচিহ্নগুলি ব্যবহার করবেন।</translation> <translation id="6550720799683018100">নিচের তালিকা থেকে একটি বিকল্প নির্বাচনের মাধ্যমে বর্তমান কীম্যাপটি পরিবর্তন করুন৷</translation> <translation id="6561818612645211875">বর্তমান সারির শুরুতে যান</translation> <translation id="6587021927234520429">কোনো পূর্ববর্তী স্তর ৪ শিরোনাম নেই৷</translation>
diff --git a/chrome/browser/resources/chromeos/login/oobe_hid_detection.css b/chrome/browser/resources/chromeos/login/oobe_hid_detection.css index f40deab..183b460b 100644 --- a/chrome/browser/resources/chromeos/login/oobe_hid_detection.css +++ b/chrome/browser/resources/chromeos/login/oobe_hid_detection.css
@@ -2,15 +2,34 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -#continue-button-text { - text-transform: none; +:root { + --oobe-hid-detection-item-border: 1px solid var(--google-grey-200); +} + +#status-container { + margin: 15px 0; +} + +.hid-selection-entry:first-of-type { + margin-top: 8px; +} + +.hid-selection-entry { + border-top: var(--oobe-hid-detection-item-border); + color: var(--google-grey-900); + font-size: 13px; + min-height: 48px; +} + +.hid-selection-entry:last-of-type { + border-bottom: var(--oobe-hid-detection-item-border); } #keyboard-icon, #mouse-icon { - --iron-icon-height: 32px; - --iron-icon-width: 32px; - padding-right: 8px; + --iron-icon-height: 20px; + --iron-icon-width: 20px; + padding-inline-end: 8px; } #keyboard-tick, @@ -21,23 +40,44 @@ } #hid-keyboard-pincode { - padding-bottom: 4px; + padding 15px 0; }; -#hid-continue-button { - padding-inline-end: 18px; +.bluetooth-keyboard-button { + border: 1px solid #ccc; + border-radius: 4px; + box-shadow: 0 0 0 1px #222; + color: #222; + display: inline-block; + font-size: 16px; + height: 38px; + line-height: 38px; + margin: 0 5px; + padding: 0 15px; + position: relative; + text-align: center; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + vertical-align: baseline; } -[slot='bottom-buttons'] { - padding: 0 6px; /* = 8px - 2px back button border */ +#bluetooth-enter-key { + min-width: 54px; } -.hid-selection-entry { - border-top: 1px solid lightgrey; - min-height: 44px; - padding: 0 20px; +.key-typed { + color: #222; } -.hid-selection-entry:last-of-type { - border-bottom: 1px solid lightgrey; +.key-next { + background: rgb(77, 144, 254); + background-image: none; + border: 2px solid rgb(77, 144, 254); + box-shadow: none; + color: #fff; +} + +.key-untyped { + border: 1px solid #d4d4d4; + box-shadow: 0 0 0 1px #888; + color: #666; }
diff --git a/chrome/browser/resources/chromeos/login/oobe_hid_detection.html b/chrome/browser/resources/chromeos/login/oobe_hid_detection.html index b8d35c85..7795be937 100644 --- a/chrome/browser/resources/chromeos/login/oobe_hid_detection.html +++ b/chrome/browser/resources/chromeos/login/oobe_hid_detection.html
@@ -84,7 +84,7 @@ </div> </div> <div class="layout vertical hid-selection-entry"> - <div class="flex layout horizontal center"> + <div id="status-container" class="flex layout horizontal center"> <hd-iron-icon id="keyboard-icon" alt="" icon1x="oobe-hid-detection-20:keyboard" icon2x="oobe-hid-detection-40:keyboard"> @@ -138,10 +138,9 @@ </div> </div> <div slot="bottom-buttons" class="flex layout horizontal end-justified"> - <oobe-text-button id="hid-continue-button" - inverse on-tap="onHIDContinueTap_" + <oobe-text-button inverse on-tap="onHIDContinueTap_" disabled="[[continueButtonDisabled]]"> - <div i18n-content="hidDetectionContinue" id="continue-button-text"> + <div i18n-content="hidDetectionContinue"> </div> </oobe-text-button> </div>
diff --git a/chrome/browser/resources/chromeos/login/oobe_hid_detection.js b/chrome/browser/resources/chromeos/login/oobe_hid_detection.js index bb8f1fb9..724eb706 100644 --- a/chrome/browser/resources/chromeos/login/oobe_hid_detection.js +++ b/chrome/browser/resources/chromeos/login/oobe_hid_detection.js
@@ -13,6 +13,8 @@ Polymer({ is: 'oobe-hid-detection-md', + behaviors: [I18nBehavior, OobeDialogHostBehavior], + properties: { /** "Continue" button is disabled until HID devices are paired. */ continueButtonDisabled: {
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_hid_detection.html b/chrome/browser/resources/chromeos/login/oobe_screen_hid_detection.html index f62d92e..0f60d61b 100644 --- a/chrome/browser/resources/chromeos/login/oobe_screen_hid_detection.html +++ b/chrome/browser/resources/chromeos/login/oobe_screen_hid_detection.html
@@ -1,5 +1,5 @@ <div class="step hidden" id="hid-detection" hidden role="group" i18n-values="aria-label:hidDetectionInvitation"> - <oobe-hid-detection-md id="oobe-hid-detection-md"> + <oobe-hid-detection-md id="oobe-hid-detection-md" full-screen-dialog> </oobe-hid-detection-md> </div>
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.css b/chrome/browser/resources/local_ntp/custom_backgrounds.css index aff34723..06b6e5f 100644 --- a/chrome/browser/resources/local_ntp/custom_backgrounds.css +++ b/chrome/browser/resources/local_ntp/custom_backgrounds.css
@@ -115,17 +115,6 @@ border-radius: 50%; } -#edit-bg-divider { - border-bottom: 1px solid rgb(232, 234, 237); - margin: 8px 0; - width: 100%; -} - -#custom-link-restore-default .bg-option-img { - background: rgb(241, 243, 244) url(icons/link_gray.svg) no-repeat center; - border-radius: 50%; -} - #edit-bg-restore-default .bg-option-img { background: rgb(241, 243, 244) url(icons/chrome.svg) no-repeat center; border-radius: 50%; @@ -209,8 +198,9 @@ } #bg-sel-title-bar { + border-bottom: 1px solid rgb(232, 234, 237); font-size: 15px; - height: 52px; + height: 51px; line-height: 52px; text-align: center; }
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.js b/chrome/browser/resources/local_ntp/custom_backgrounds.js index 4c88ccf5..52a13054 100644 --- a/chrome/browser/resources/local_ntp/custom_backgrounds.js +++ b/chrome/browser/resources/local_ntp/custom_backgrounds.js
@@ -35,8 +35,6 @@ CANCEL: 'bg-sel-footer-cancel', CONNECT_GOOGLE_PHOTOS: 'edit-bg-google-photos', CONNECT_GOOGLE_PHOTOS_TEXT: 'edit-bg-google-photos-text', - CUSTOM_LINK_RESTORE_DEFAULT: 'custom-link-restore-default', - CUSTOM_LINK_RESTORE_DEFAULT_TEXT: 'custom-link-restore-default-text', DEFAULT_WALLPAPERS: 'edit-bg-default-wallpapers', DEFAULT_WALLPAPERS_TEXT: 'edit-bg-default-wallpapers-text', DONE: 'bg-sel-footer-done', @@ -173,6 +171,7 @@ attributionBox.onclick = function() { window.open(attributionActionUrl, '_blank'); }; + attributionBox.style.cursor = 'pointer'; } }; @@ -673,8 +672,6 @@ configData.translatedStrings.uploadImage; $(customBackgrounds.IDS.RESTORE_DEFAULT_TEXT).textContent = configData.translatedStrings.restoreDefaultBackground; - $(customBackgrounds.IDS.CUSTOM_LINK_RESTORE_DEFAULT_TEXT).textContent = - configData.translatedStrings.restoreDefaultLinks; $(customBackgrounds.IDS.OPTIONS_TITLE).textContent = configData.translatedStrings.customizeBackground; $(customBackgrounds.IDS.REFRESH_TEXT).textContent = @@ -800,20 +797,6 @@ } }; - // Interactions with the "Restore default shortcuts" option. - var customLinksRestoreDefaultInteraction = function(event) { - editDialog.close(); - window.chrome.embeddedSearch.newTabPage.resetCustomLinks(); - }; - $(customBackgrounds.IDS.CUSTOM_LINK_RESTORE_DEFAULT).onclick = - customLinksRestoreDefaultInteraction; - $(customBackgrounds.IDS.CUSTOM_LINK_RESTORE_DEFAULT).onkeyup = function( - event) { - if (event.keyCode === customBackgrounds.KEYCODES.ENTER) { - customLinksRestoreDefaultInteraction(event); - } - }; - // Interactions with the "Chrome backgrounds" option. var defaultWallpapersInteraction = function(event) { customBackgrounds.loadChromeBackgrounds();
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.css b/chrome/browser/resources/local_ntp/custom_links_edit.css index b07f963..ce2a8dc2 100644 --- a/chrome/browser/resources/local_ntp/custom_links_edit.css +++ b/chrome/browser/resources/local_ntp/custom_links_edit.css
@@ -25,9 +25,7 @@ width: 100%; } -#dialog-title { - color: rgb(32, 33, 36); - font-family: 'Roboto', arial, sans-serif; +.dialog-title { font-size: 15px; line-height: 24px; margin-bottom: 16px; @@ -44,72 +42,18 @@ margin-bottom: 4px; } -.input-container { - position: relative; -} - input { + -webkit-padding-end: 8px; + -webkit-padding-start: 8px; background-color: rgb(232, 234, 237); border: none; border-radius: 4px; - caret-color: rgb(26, 115, 232); - color: rgb(32, 33, 36); - font-family: 'Roboto', arial, sans-serif; font-size: 13px; height: 32px; line-height: 24px; - outline: none; - padding-inline-end: 8px; - padding-inline-start: 8px; width: calc(100% - 16px); } -.underline { - border-bottom: 2px solid rgb(26, 115, 232); - bottom: 0; - box-sizing: border-box; - left: 0; - margin: auto; - opacity: 0; - position: absolute; - right: 0; - transition: opacity 120ms ease-out, width 0ms linear 180ms; - width: 0; -} - -input:focus + .underline { - opacity: 1; - transition: width 180ms ease-out, opacity 120ms ease-in; - width: 100%; -} - -.field-title.focused { - color: rgb(26, 115, 232); -} - -.error-msg { - color: rgb(217, 48, 37); - display: none; - font-size: 10px; - font-weight: 400; - margin-top: 6px; -} - -.invalid label { - color: rgb(217, 48, 37); -} - -.invalid .error-msg { - display: block; -} - -.invalid .underline { - border-color: rgb(217, 48, 37); - opacity: 1; - transition: width 180ms ease-out, opacity 120ms ease-in; - width: 100%; -} - .buttons-container { display: flex; justify-content: space-between; @@ -122,14 +66,9 @@ button { border: none; border-radius: 4px; - font-family: 'Roboto', arial, sans-serif; font-size: 12px; - font-weight: 500; height: 32px; padding: 0 16px; - transition-duration: 200ms; - transition-property: background-color, color, box-shadow, border; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } button.primary { @@ -137,49 +76,12 @@ color: white; } -button:focus:not(:active) { - box-shadow: 0 0 0 2px rgba(26, 115, 232, 0.4); -} - -button.primary:disabled { - background-color: rgb(241, 243, 244); - color: rgb(128, 134, 139); -} - -button.primary:hover:not(:disabled) { - background-color: rgb(41, 123, 231); - box-shadow: 0 1px 2px 0 rgba(66, 133, 244, 0.3), - 0 1px 3px 1px rgba(66, 133, 244, 0.15); -} - -button.primary:active:not(:disabled) { - box-shadow: 0 1px 2px 0 rgba(66, 133, 244, 0.3), - 0 3px 6px 2px rgba(66, 133, 244, 0.15); -} - button.secondary { background-color: white; - border: 1px solid rgb(218, 220, 224); + border: 1px solid rgb(218,220,224); color: rgb(26, 115, 232); } -button.secondary:disabled { - border-color: rgb(241, 243, 244); - color: rgb(128, 134, 139); -} - -button.secondary:hover:not(:disabled) { - background-color: rgba(66, 133, 244, 0.04); - border-color: rgb(210, 227, 252); -} - -button.secondary:active:not(:disabled) { - background-color: white; - border-color: white; - box-shadow: 0 1px 2px 0 rgba(60, 64, 67, 0.3), - 0 3px 6px 2px rgba(60, 64, 67, 0.15); -} - #cancel { margin-right: 8px; }
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.html b/chrome/browser/resources/local_ntp/custom_links_edit.html index b665e9db..d194d52 100644 --- a/chrome/browser/resources/local_ntp/custom_links_edit.html +++ b/chrome/browser/resources/local_ntp/custom_links_edit.html
@@ -11,34 +11,24 @@ </head> <body> <dialog id="edit-link-dialog"> - <div id="dialog-title"></div> - <form id="edit-form" action=""> - <div id="title" class="field-container"> - <label id="title-field-name" class="field-title"></label> - <div class="input-container"> - <input id="title-field" class="field-input" type="text" - autocomplete="no" tabindex="0" required></input> - <div class="underline"></div> - </div> - </div> - <div id="url" class="field-container"> - <label id="url-field-name" class="field-title"></label> - <div class="input-container"> - <input id="url-field" class="field-input" type="text" - autocomplete="url" tabindex="0" required></input> - <div class="underline"></div> - </div> - <div id="invalid-url" class="error-msg"></div> - </div> - <div class="buttons-container"> - <button id="delete" class="secondary" tabindex="0"></button> - <span class="right"> - <button id="cancel" class="secondary" tabindex="0"></button> - <button type="submit" id="done" class="primary" disabled="true" - tabindex="0"></button> - </span> - </div> - </form> + <div class="dialog-title">Edit shortcut</div> + <div class="field-container"> + <div class="field-title">Name</div> + <input class="field-input" autocomplete="no" tabindex="0"></input> + </div> + <div class="field-container"> + <div class="field-title">URL</div> + <input class="field-input" autocomplete="url" tabindex="0"></input> + </div> + <div class="buttons-container"> + <span> + <button id="delete" class="secondary">Remove</button> + </span> + <span class="right"> + <button id="cancel" class="secondary">Cancel</button> + <button id="done" class="primary">Done</button> + </span> + </div> </dialog> </body> </html>
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.js b/chrome/browser/resources/local_ntp/custom_links_edit.js index 83d4fc7..3fa26f2 100644 --- a/chrome/browser/resources/local_ntp/custom_links_edit.js +++ b/chrome/browser/resources/local_ntp/custom_links_edit.js
@@ -4,6 +4,27 @@ /** + * Enum for ids. + * @enum {string} + * @const + */ +const IDS = { + EDIT_DIALOG: 'edit-link-dialog', // Edit dialog. + CANCEL: 'cancel', // Cancel button. + DELETE: 'delete', // Delete button. + DONE: 'done', // Done button. +}; + + +/** + * The origin of this request, i.e. 'https://www.google.TLD' for the remote NTP, + * or 'chrome-search://local-ntp' for the local NTP. + * @const {string} + */ +let DOMAIN_ORIGIN = '{{ORIGIN}}'; + + +/** * Alias for document.getElementById. * @param {string} id The ID of the element to find. * @return {HTMLElement} The found element or null if not found. @@ -15,175 +36,12 @@ /** - * Enum for ids. - * @enum {string} - * @const - */ -const IDS = { - CANCEL: 'cancel', // Cancel button. - DELETE: 'delete', // Delete button. - DIALOG_TITLE: 'dialog-title', // Dialog title. - DONE: 'done', // Done button. - EDIT_DIALOG: 'edit-link-dialog', // Dialog element. - FORM: 'edit-form', // The edit link form. - INVALID_URL: 'invalid-url', // Invalid URL error message. - TITLE_FIELD: 'title-field', // Title input field. - TITLE_FIELD_NAME: 'title-field-name', // Title input field name. - URL_FIELD: 'url-field', // URL input field. - URL_FIELD_CONTAINER: 'url', // URL input field container. - URL_FIELD_NAME: 'url-field-name', // URL input field name. -}; - - -/** - * The origin of this request, i.e. 'https://www.google.TLD' for the remote NTP, - * or 'chrome-search://local-ntp' for the local NTP. - * @const {string} - */ -const DOMAIN_ORIGIN = '{{ORIGIN}}'; - - -/** - * List of parameters passed by query args. - * @type {Object} - */ -let queryArgs = {}; - - -/** - * The prepopulated data for the form. Includes title, url, and rid. - * @type {Object} - */ -let prepopulatedLink = { - rid: -1, - title: '', - url: '', -}; - - -/** - * True if the provided url is valid. - * @type {string} - */ -function isValidURL(url) { - let a = document.createElement('a'); - a.href = url; - // Invalid URLs will not match the current host. - let isValid = a.host && a.host != window.location.host; - return isValid; -} - - -/** - * Handler for the 'linkData' message from the host page. Pre-populates the url - * and title fields with link's data obtained using the rid. Called if we are - * editing an existing link. - * @param {number} rid Restricted id of the link to be edited. - */ -function prepopulateFields(rid) { - if (!isFinite(rid)) - return; - - // Grab the link data from the embeddedSearch API. - let data = chrome.embeddedSearch.newTabPage.getMostVisitedItemData(rid); - if (!data) - return; - prepopulatedLink.rid = rid; - $(IDS.TITLE_FIELD).value = prepopulatedLink.title = data.title; - $(IDS.URL_FIELD).value = prepopulatedLink.url = data.url; -} - - -/** - * Disables the "Done" button until the URL field is modified. - */ -function disableSubmitUntilTextInput() { - $(IDS.DONE).disabled = true; - let reenable = (event) => { - $(IDS.DONE).disabled = false; - $(IDS.URL_FIELD).removeEventListener('input', reenable); - }; - $(IDS.URL_FIELD).addEventListener('input', reenable); -} - - -/** - * Shows the invalid URL error message until the URL field is modified. - */ -function showInvalidUrlUntilTextInput() { - $(IDS.URL_FIELD_CONTAINER).classList.add('invalid'); - let reenable = (event) => { - $(IDS.URL_FIELD_CONTAINER).classList.remove('invalid'); - $(IDS.URL_FIELD).removeEventListener('input', reenable); - }; - $(IDS.URL_FIELD).addEventListener('input', reenable); -} - - -/** * Send a message to close the edit dialog. Called when the edit flow has been - * completed. If the fields were unchanged, does not update the link data. + * completed. * @param {!Event} event The click event. */ -function finishEditLink(event) { - // Show error message for invalid urls. - if (!isValidURL($(IDS.URL_FIELD).value)) { - showInvalidUrlUntilTextInput(); - disableSubmitUntilTextInput(); - return; - } - - // Do not update link if fields were unchanged. - if ($(IDS.TITLE_FIELD).value != prepopulatedLink.title || - $(IDS.URL_FIELD).value != prepopulatedLink.url) { - chrome.embeddedSearch.newTabPage.updateCustomLink( - prepopulatedLink.rid, $(IDS.URL_FIELD).value, $(IDS.TITLE_FIELD).value); - } - closeDialog(); -} - - -/** - * Call the EmbeddedSearchAPI to delete the link. Closes the dialog. - * @param {!Event} event The click event. - */ -function deleteLink(event) { - chrome.embeddedSearch.newTabPage.deleteMostVisitedItem(prepopulatedLink.rid); - closeDialog(); -} - - -/** - * Send a message to close the edit dialog, clears the url and title fields, and - * resets the button statuses. Called when the edit flow has been completed. - */ function closeDialog(event) { window.parent.postMessage({cmd: 'closeDialog'}, DOMAIN_ORIGIN); - $(IDS.FORM).reset(); - $(IDS.URL_FIELD_CONTAINER).classList.remove('invalid'); - $(IDS.DELETE).disabled = false; - $(IDS.DONE).disabled = false; - prepopulatedLink.rid = -1; - prepopulatedLink.title = ''; - prepopulatedLink.url = ''; -} - - -/** - * Event handler for messages from the host page. - * @param {Event} event Event received. - */ -function handlePostMessage(event) { - let cmd = event.data.cmd; - let args = event.data; - if (cmd === 'linkData') { - if (args.tid) { // We are editing a link, prepopulate the link data. - prepopulateFields(args.tid); - } else { // We are adding a link, disable the delete button. - $(IDS.DELETE).disabled = true; - disableSubmitUntilTextInput(); - } - } } @@ -191,59 +49,10 @@ * Does some initialization and shows the dialog window. */ function init() { - // Parse query arguments. - let query = window.location.search.substring(1).split('&'); - queryArgs = {}; - for (let i = 0; i < query.length; ++i) { - let val = query[i].split('='); - if (val[0] == '') - continue; - queryArgs[decodeURIComponent(val[0])] = decodeURIComponent(val[1]); - } - - // Enable RTL. - // TODO(851293): Add RTL formatting. - if (queryArgs['rtl'] == '1') { - let html = document.querySelector('html'); - html.dir = 'rtl'; - } - - // Populate text content. - $(IDS.DIALOG_TITLE).textContent = queryArgs['title']; - $(IDS.TITLE_FIELD_NAME).textContent = queryArgs['nameField']; - $(IDS.TITLE_FIELD_NAME).name = queryArgs['nameField']; - $(IDS.URL_FIELD_NAME).textContent = queryArgs['urlField']; - $(IDS.URL_FIELD_NAME).name = queryArgs['urlField']; - $(IDS.DELETE).textContent = queryArgs['linkRemove']; - $(IDS.CANCEL).textContent = queryArgs['linkCancel']; - $(IDS.DONE).textContent = queryArgs['linkDone']; - $(IDS.INVALID_URL).textContent = queryArgs['invalidUrl']; - - // Set up event listeners. - $(IDS.DELETE).addEventListener('click', deleteLink); - $(IDS.CANCEL).addEventListener('click', closeDialog); - $(IDS.FORM).addEventListener('submit', (event) => { - // Prevent the form from submitting and modifying the URL. - event.preventDefault(); - finishEditLink(event); - }); - - // Change input field name to blue on input field focus. - let changeColor = (fieldTitle) => { - $(fieldTitle).classList.toggle('focused'); - }; - $(IDS.TITLE_FIELD) - .addEventListener('focusin', () => changeColor(IDS.TITLE_FIELD_NAME)); - $(IDS.TITLE_FIELD) - .addEventListener('blur', () => changeColor(IDS.TITLE_FIELD_NAME)); - $(IDS.URL_FIELD) - .addEventListener('focusin', () => changeColor(IDS.URL_FIELD_NAME)); - $(IDS.URL_FIELD) - .addEventListener('blur', () => changeColor(IDS.URL_FIELD_NAME)); - $(IDS.EDIT_DIALOG).showModal(); - - window.addEventListener('message', handlePostMessage); + $(IDS.DELETE).addEventListener('click', closeDialog); + $(IDS.CANCEL).addEventListener('click', closeDialog); + $(IDS.DONE).addEventListener('click', closeDialog); }
diff --git a/chrome/browser/resources/local_ntp/icons/edit_menu.svg b/chrome/browser/resources/local_ntp/icons/edit_menu.svg deleted file mode 100644 index a0feae1..0000000 --- a/chrome/browser/resources/local_ntp/icons/edit_menu.svg +++ /dev/null
@@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"> - <g fill="none" fill-rule="evenodd"> - <circle cx="6" cy="3" r="1" fill="#000"/> - <circle cx="6" cy="6" r="1" fill="#000"/> - <circle cx="6" cy="9" r="1" fill="#000"/> - </g> -</svg>
diff --git a/chrome/browser/resources/local_ntp/icons/link_gray.svg b/chrome/browser/resources/local_ntp/icons/link_gray.svg deleted file mode 100644 index 0072bceb..0000000 --- a/chrome/browser/resources/local_ntp/icons/link_gray.svg +++ /dev/null
@@ -1,6 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"> - <g fill="none" fill-rule="evenodd"> - <polygon points="0 0 16 0 16 16 0 16"/> - <path fill="#5F6368" fill-rule="nonzero" d="M1.52,8 C1.52,6.632 2.632,5.52 4,5.52 L7.2,5.52 L7.2,4 L4,4 C1.792,4 0,5.792 0,8 C0,10.208 1.792,12 4,12 L7.2,12 L7.2,10.48 L4,10.48 C2.632,10.48 1.52,9.368 1.52,8 Z M4.8,8.8 L11.2,8.8 L11.2,7.2 L4.8,7.2 L4.8,8.8 Z M12,4 L8.8,4 L8.8,5.52 L12,5.52 C13.368,5.52 14.48,6.632 14.48,8 C14.48,9.368 13.368,10.48 12,10.48 L8.8,10.48 L8.8,12 L12,12 C14.208,12 16,10.208 16,8 C16,5.792 14.208,4 12,4 Z"/> - </g> -</svg>
diff --git a/chrome/browser/resources/local_ntp/local_ntp.css b/chrome/browser/resources/local_ntp/local_ntp.css index 3f3b2988..6d7a3a6b 100644 --- a/chrome/browser/resources/local_ntp/local_ntp.css +++ b/chrome/browser/resources/local_ntp/local_ntp.css
@@ -495,10 +495,13 @@ } .md-icons #mv-tiles { - /* Two rows of tiles of 104px each, 8px of spacing after each row, and 10px of - * margin on top and bottom. If you change this, also change the corresponding - * values in most_visited_single.css. */ - height: calc(2*(var(--md-tile-height) + var(--md-tile-margin)) + 2*10px); + /* Two rows of tiles of 112px each, 16px of spacing after each row, and 10px + * of margin on top. If you change this, also change the corresponding values + * in most_visited_single.css. */ + height: calc(2*(var(--md-tile-height) + var(--md-tile-margin)) + 10px); + /* Add 2*5px to account for drop shadow on the tiles. If you change this, also + * change the corresponding values in most_visited_single.css. */ + width: calc(var(--content-width) + 2*5px); } #mv-notice-x {
diff --git a/chrome/browser/resources/local_ntp/local_ntp.html b/chrome/browser/resources/local_ntp/local_ntp.html index 3372e94..2bb4148 100644 --- a/chrome/browser/resources/local_ntp/local_ntp.html +++ b/chrome/browser/resources/local_ntp/local_ntp.html
@@ -103,11 +103,6 @@ <div class="bg-option-img"></div> <div id="edit-bg-upload-image-text" class="bg-option-text"></div> </div> - <div id="edit-bg-divider"></div> - <div id="custom-link-restore-default" class="bg-option" tabindex="0"> - <div class="bg-option-img"></div> - <div id="custom-link-restore-default-text" class="bg-option-text"></div> - </div> <div id="edit-bg-restore-default" class="bg-option" tabindex="0"> <div class="bg-option-img"></div> <div id="edit-bg-restore-default-text" class="bg-option-text"></div>
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js index fecb715..6a9fe79f 100644 --- a/chrome/browser/resources/local_ntp/local_ntp.js +++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -340,7 +340,6 @@ var message = {cmd: 'updateTheme'}; message.isThemeDark = isThemeDark; - message.hasBackgroundImage = !!info.imageUrl; var titleColor = NTP_DESIGN.titleColor; if (!info.usingDefaultTheme && info.textColorRgba) { @@ -697,8 +696,6 @@ document.body.style.setProperty('--logo-iframe-width', width); document.body.style.setProperty('--logo-iframe-resize-duration', duration); } else if (cmd === 'startEditLink') { - $(IDS.CUSTOM_LINKS_EDIT_IFRAME) - .contentWindow.postMessage({cmd: 'linkData', tid: args.tid}, '*'); setEditCustomLinkDialogVisibility(true); } else if (cmd === 'closeDialog') { setEditCustomLinkDialogVisibility(false); @@ -980,14 +977,6 @@ if (configData.isCustomLinksEnabled) { args.push('enableCustomLinks=1'); - args.push( - 'addLink=' + encodeURIComponent(configData.translatedStrings.addLink)); - args.push( - 'addLinkTooltip=' + - encodeURIComponent(configData.translatedStrings.addLinkTooltip)); - args.push( - 'editLinkTooltip=' + - encodeURIComponent(configData.translatedStrings.editLinkTooltip)); } // Create the most visited iframe. @@ -1003,37 +992,7 @@ sendThemeInfoToMostVisitedIframe(); }; - if (configData.isCustomLinksEnabled) { - // Collect arguments for the edit custom link iframe. - let clArgs = []; - - if (searchboxApiHandle.rtl) - clArgs.push('rtl=1'); - - clArgs.push( - 'title=' + - encodeURIComponent(configData.translatedStrings.editLinkTitle)); - clArgs.push( - 'nameField=' + - encodeURIComponent(configData.translatedStrings.nameField)); - clArgs.push( - 'urlField=' + - encodeURIComponent(configData.translatedStrings.urlField)); - clArgs.push( - 'linkRemove=' + - encodeURIComponent(configData.translatedStrings.linkRemove)); - clArgs.push( - 'linkCancel=' + - encodeURIComponent(configData.translatedStrings.linkCancel)); - clArgs.push( - 'linkDone=' + - encodeURIComponent(configData.translatedStrings.linkDone)); - clArgs.push( - 'invalidUrl=' + - encodeURIComponent(configData.translatedStrings.invalidUrl)); - - $(IDS.CUSTOM_LINKS_EDIT_IFRAME).src += '?' + clArgs.join('&'); - } + // TODO(851293): Add translated title attribute to edit custom link iframe. window.addEventListener('message', handlePostMessage);
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.css b/chrome/browser/resources/local_ntp/most_visited_single.css index b045561..c35439495 100644 --- a/chrome/browser/resources/local_ntp/most_visited_single.css +++ b/chrome/browser/resources/local_ntp/most_visited_single.css
@@ -14,7 +14,7 @@ --md-menu-size: 12px; --md-tile-height: 112px; --md-tile-margin: 16px; - --md-tile-padding-horizontal: 8px; + --md-tile-padding-horizontal: 4px; --md-tile-padding-vertical: 16px; --md-tile-width: 112px; --md-title-font-size: 12px; @@ -500,6 +500,13 @@ width: var(--md-favicon-size); } +.md-title-container { + background-color: white; + border-radius: 12px; + height: 24px; + padding: 4px; +} + .md-title { color: rgba(33, 32, 36, 0.86); font-family: 'Roboto', arial, sans-serif; @@ -507,20 +514,15 @@ font-weight: 500; height: var(--md-title-height); line-height: var(--md-title-height); + overflow: hidden; text-align: center; - width: 100%; + text-overflow: ellipsis; + white-space: nowrap; + width: 96px; word-break: break-word; word-wrap: break-word; } -body.dark-theme .md-title { - color: rgb(248, 249, 250); -} - -body.background-image .md-title { - text-shadow: 0 0 16px rgba(0, 0, 0, 0.3); -} - .md-menu { background-color: transparent; border: none; @@ -556,11 +558,6 @@ width: var(--md-menu-size); } -.md-edit-menu::after { - --mask-width: var(--md-menu-size); - -webkit-mask-image: url(chrome-search://most-visited/edit_menu.svg); -} - body.dark-theme .md-menu::after { background-color: white; }
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.js b/chrome/browser/resources/local_ntp/most_visited_single.js index 3ea9eeba..c258fc5 100644 --- a/chrome/browser/resources/local_ntp/most_visited_single.js +++ b/chrome/browser/resources/local_ntp/most_visited_single.js
@@ -26,7 +26,6 @@ MD_ADD_ICON: 'md-add-icon', MD_ADD_BACKGROUND: 'md-add-background', MD_MENU: 'md-menu', - MD_EDIT_MENU: 'md-edit-menu', MD_TILE: 'md-tile', MD_TILE_INNER: 'md-tile-inner', MD_TITLE: 'md-title', @@ -250,7 +249,6 @@ var updateTheme = function(info) { document.body.style.setProperty('--tile-title-color', info.tileTitleColor); document.body.classList.toggle('dark-theme', info.isThemeDark); - document.body.classList.toggle('background-image', info.hasBackgroundImage); }; @@ -316,11 +314,6 @@ // Add new tileset. cur.id = 'mv-tiles'; parent.appendChild(cur); - if (isMDEnabled) { - // Called after appending to document so that css styles are active. - truncateTitleText( - parent.lastChild.querySelectorAll('.' + CLASSES.MD_TITLE)); - } // getComputedStyle causes the initial style (opacity 0) to be applied, so // that when we then set it to 1, that triggers the CSS transition. if (fadeIn) { @@ -335,27 +328,6 @@ /** - * Truncates titles that are longer than one line and appends an ellipsis. Text - * overflow in CSS ("text-overflow: ellipsis") requires "overflow: hidden", - * which will cut off the title's text shadow. Only used for Material Design - * tiles. - */ -function truncateTitleText(titles) { - for (let i = 0; i < titles.length; i++) { - let el = titles[i]; - const originalTitle = el.innerText; - let truncatedTitle = el.innerText; - while (el.scrollHeight > el.offsetHeight && truncatedTitle.length > 0) { - el.innerText = (truncatedTitle = truncatedTitle.slice(0, -1)) + '...'; - } - if (truncatedTitle.length == 0) { - console.error('Title truncation failed: ' + originalTitle); - } - } -} - - -/** * Handler for the 'show' message from the host page, called when it wants to * add a suggestion tile. * It's also used to fill up our tiles to MAX_NUM_TILES if necessary. @@ -410,16 +382,6 @@ /** - * Starts edit custom link flow. Tells host page to show the edit custom link - * dialog and pre-populate it with data obtained using the link's id. - * @param {?number} tid Restricted id of the tile we want to edit. - */ -function editCustomLink(tid) { - window.parent.postMessage({cmd: 'startEditLink', tid: tid}, DOMAIN_ORIGIN); -} - - -/** * Returns whether the given URL has a known, safe scheme. * @param {string} url URL to check. */ @@ -732,23 +694,13 @@ if (!data.isAddButton) { let mdMenu = document.createElement('button'); mdMenu.className = CLASSES.MD_MENU; - if (isCustomLinksEnabled) { - mdMenu.classList.add(CLASSES.MD_EDIT_MENU); - mdMenu.title = queryArgs['editLinkTooltip'] || ''; - mdMenu.addEventListener('click', function(ev) { - editCustomLink(data.tid); - ev.preventDefault(); - ev.stopPropagation(); - }); - } else { - mdMenu.title = queryArgs['removeTooltip'] || ''; - mdMenu.addEventListener('click', function(ev) { - removeAllOldTiles(); - blacklistTile(mdTile); - ev.preventDefault(); - ev.stopPropagation(); - }); - } + mdMenu.title = queryArgs['removeTooltip'] || ''; + mdMenu.addEventListener('click', function(ev) { + removeAllOldTiles(); + blacklistTile(mdTile); + ev.preventDefault(); + ev.stopPropagation(); + }); // Don't allow the event to bubble out to the containing tile, as that would // trigger navigation to the tile URL. mdMenu.addEventListener('keydown', function(event) {
diff --git a/chrome/browser/rlz/chrome_rlz_tracker_delegate.cc b/chrome/browser/rlz/chrome_rlz_tracker_delegate.cc index fd274a5..78d7336 100644 --- a/chrome/browser/rlz/chrome_rlz_tracker_delegate.cc +++ b/chrome/browser/rlz/chrome_rlz_tracker_delegate.cc
@@ -16,7 +16,7 @@ #include "chrome/browser/ui/startup/startup_browser_creator.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/omnibox/browser/omnibox_log.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.cc b/chrome/browser/safe_browsing/chrome_password_protection_service.cc index 3a59ec65..6b00cabd2 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service.cc +++ b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
@@ -29,7 +29,7 @@ #include "chrome/common/url_constants.h" #include "components/browser_sync/profile_sync_service.h" #include "components/content_settings/core/browser/host_content_settings_map.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/password_manager/core/browser/hash_password_manager.h" #include "components/password_manager/core/browser/password_store.h" #include "components/password_manager/core/common/password_manager_pref_names.h"
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc index aba4d424..359bd70 100644 --- a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc +++ b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc
@@ -21,7 +21,7 @@ #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/common/safe_browsing/binary_feature_extractor.h" #include "chrome/common/url_constants.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/safe_browsing/common/safebrowsing_switches.h" #include "components/signin/core/browser/signin_manager.h" #include "content/public/browser/browser_context.h"
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc index 7fc6ac4..736d545 100644 --- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc +++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
@@ -39,7 +39,7 @@ #include "chrome/common/url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/prefs/pref_service.h" #include "components/safe_browsing/browser/threat_details.h" #include "components/safe_browsing/common/safe_browsing.mojom.h"
diff --git a/chrome/browser/safe_browsing/safe_browsing_util.cc b/chrome/browser/safe_browsing/safe_browsing_util.cc index 11e5868..6a5b2dd 100644 --- a/chrome/browser/safe_browsing/safe_browsing_util.cc +++ b/chrome/browser/safe_browsing/safe_browsing_util.cc
@@ -8,7 +8,7 @@ #include "base/strings/string_util.h" #include "chrome/browser/safe_browsing/chunk.pb.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" namespace safe_browsing {
diff --git a/chrome/browser/search/instant_service.cc b/chrome/browser/search/instant_service.cc index 5344afa..f37ccfd 100644 --- a/chrome/browser/search/instant_service.cc +++ b/chrome/browser/search/instant_service.cc
@@ -192,16 +192,16 @@ void InstantService::AddCustomLink(const GURL& url, const std::string& title) { if (most_visited_sites_) { - // Initializes custom links if they have not been initialized yet. - most_visited_sites_->InitializeCustomLinks(); + // Initialize custom links if they have not been initialized yet. + MaybeInitializeCustomLinks(); most_visited_sites_->AddCustomLink(url, base::UTF8ToUTF16(title)); } } void InstantService::DeleteCustomLink(const GURL& url) { if (most_visited_sites_) { - // Initializes custom links if they have not been initialized yet. - most_visited_sites_->InitializeCustomLinks(); + // Initialize custom links if they have not been initialized yet. + MaybeInitializeCustomLinks(); most_visited_sites_->DeleteCustomLink(url); } } @@ -551,6 +551,13 @@ theme_info_->custom_background_attribution_action_url = GURL(); } +void InstantService::MaybeInitializeCustomLinks() { + DCHECK(most_visited_sites_); + if (!most_visited_sites_->IsCustomLinksInitialized()) { + most_visited_sites_->InitializeCustomLinks(); + } +} + // static void InstantService::RegisterProfilePrefs(PrefRegistrySimple* registry) { registry->RegisterDictionaryPref(prefs::kNtpCustomBackgroundDict,
diff --git a/chrome/browser/search/instant_service.h b/chrome/browser/search/instant_service.h index 24a6f3f..8a39767 100644 --- a/chrome/browser/search/instant_service.h +++ b/chrome/browser/search/instant_service.h
@@ -157,6 +157,10 @@ // chrome-search://local-ntp/background.jpg void SetBackgroundToLocalResource(); + // Will initialize custom links from the current Most Visited sites if custom + // links have not been initialized yet. Otherwise, does nothing. + void MaybeInitializeCustomLinks(); + Profile* const profile_; // The process ids associated with Instant processes.
diff --git a/chrome/browser/search/local_ntp_source.cc b/chrome/browser/search/local_ntp_source.cc index 021ee14..02569ce 100644 --- a/chrome/browser/search/local_ntp_source.cc +++ b/chrome/browser/search/local_ntp_source.cc
@@ -153,8 +153,6 @@ AddString(translated_strings.get(), "searchboxPlaceholder", features::IsMDUIEnabled() ? IDS_GOOGLE_SEARCH_BOX_EMPTY_HINT_MD : IDS_GOOGLE_SEARCH_BOX_EMPTY_HINT); - - // Custom Backgrounds AddString(translated_strings.get(), "customizeBackground", IDS_NTP_CUSTOM_BG_CUSTOMIZE_BACKGROUND); AddString(translated_strings.get(), "connectGooglePhotos", @@ -189,33 +187,6 @@ AddString(translated_strings.get(), "photoLabel", IDS_NTP_CUSTOM_BG_GOOGLE_PHOTO_LABEL); - // Custom Links - AddString(translated_strings.get(), "addLink", - IDS_NTP_CUSTOM_LINKS_ADD_SHORTCUT_TITLE); - AddString(translated_strings.get(), "addLinkTooltip", - IDS_NTP_CUSTOM_LINKS_ADD_SHORTCUT_TOOLTIP); - AddString(translated_strings.get(), "editLinkTooltip", - IDS_NTP_CUSTOM_LINKS_EDIT_SHORTCUT_TOOLTIP); - AddString(translated_strings.get(), "editLinkTitle", - IDS_NTP_CUSTOM_LINKS_EDIT_SHORTCUT); - AddString(translated_strings.get(), "nameField", IDS_NTP_CUSTOM_LINKS_NAME); - AddString(translated_strings.get(), "urlField", IDS_NTP_CUSTOM_LINKS_URL); - AddString(translated_strings.get(), "linkRemove", - IDS_NTP_CUSTOM_LINKS_REMOVE); - AddString(translated_strings.get(), "linkCancel", - IDS_NTP_CUSTOM_LINKS_CANCEL); - AddString(translated_strings.get(), "linkDone", IDS_NTP_CUSTOM_LINKS_DONE); - AddString(translated_strings.get(), "invalidUrl", - IDS_NTP_CUSTOM_LINKS_INVALID_URL); - AddString(translated_strings.get(), "linkRemovedMsg", - IDS_NTP_CONFIRM_MSG_SHORTCUT_REMOVED); - AddString(translated_strings.get(), "linkEditedMsg", - IDS_NTP_CONFIRM_MSG_SHORTCUT_EDITED); - AddString(translated_strings.get(), "linkAddedMsg", - IDS_NTP_CONFIRM_MSG_SHORTCUT_ADDED); - AddString(translated_strings.get(), "restoreDefaultLinks", - IDS_NTP_CONFIRM_MSG_RESTORE_DEFAULTS); - // Voice Search AddString(translated_strings.get(), "audioError", IDS_NEW_TAB_VOICE_AUDIO_ERROR);
diff --git a/chrome/browser/search/most_visited_iframe_source.cc b/chrome/browser/search/most_visited_iframe_source.cc index 3f51d9c1..7abd3681d 100644 --- a/chrome/browser/search/most_visited_iframe_source.cc +++ b/chrome/browser/search/most_visited_iframe_source.cc
@@ -30,13 +30,14 @@ const char kUtilJSPath[] = "/util.js"; const char kCommonCSSPath[] = "/common.css"; -// Edit custom links dialog iframe and resources, used by the local NTP and the -// Google remote NTP. +// Add custom link button icon. +const char kAddSvgPath[] = "/add_link.svg"; + +// Edit custom links dialog iframe, used by the local NTP and the Google remote +// NTP. const char kEditHTMLPath[] = "/edit.html"; const char kEditCSSPath[] = "/edit.css"; const char kEditJSPath[] = "/edit.js"; -const char kAddSvgPath[] = "/add_link.svg"; -const char kEditMenuSvgPath[] = "/edit_menu.svg"; } // namespace @@ -103,8 +104,6 @@ SendJSWithOrigin(IDR_CUSTOM_LINKS_EDIT_JS, wc_getter, callback); } else if (path == kAddSvgPath) { SendResource(IDR_CUSTOM_LINKS_ADD_SVG, callback); - } else if (path == kEditMenuSvgPath) { - SendResource(IDR_CUSTOM_LINKS_EDIT_MENU_SVG, callback); } else { callback.Run(nullptr); } @@ -117,6 +116,5 @@ path == kThumbnailHTMLPath || path == kThumbnailCSSPath || path == kThumbnailJSPath || path == kUtilJSPath || path == kCommonCSSPath || path == kEditHTMLPath || - path == kEditCSSPath || path == kEditJSPath || path == kAddSvgPath || - path == kEditMenuSvgPath; + path == kEditCSSPath || path == kEditJSPath || path == kAddSvgPath; }
diff --git a/chrome/browser/search/ntp_icon_source.cc b/chrome/browser/search/ntp_icon_source.cc index 15f5e59..120e66e5 100644 --- a/chrome/browser/search/ntp_icon_source.cc +++ b/chrome/browser/search/ntp_icon_source.cc
@@ -198,7 +198,7 @@ // If luminance is too high, the white text will become unreadable. Invert // the background color to achieve better constrast. The constant comes // W3C Accessibility standards. - if (color_utils::GetRelativeLuminance(background_color) > 0.179) + if (color_utils::GetRelativeLuminance(background_color) > 0.179f) background_color = color_utils::InvertColor(background_color); DrawCircleInCanvas(&canvas, size, background_color);
diff --git a/chrome/browser/search/one_google_bar/one_google_bar_loader_impl.cc b/chrome/browser/search/one_google_bar/one_google_bar_loader_impl.cc index f631ea4..df6f5cd 100644 --- a/chrome/browser/search/one_google_bar/one_google_bar_loader_impl.cc +++ b/chrome/browser/search/one_google_bar/one_google_bar_loader_impl.cc
@@ -15,7 +15,7 @@ #include "chrome/common/chrome_content_client.h" #include "chrome/common/webui_url_constants.h" #include "components/google/core/browser/google_url_tracker.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/signin/core/browser/chrome_connected_header_helper.h" #include "components/signin/core/browser/signin_header_helper.h" #include "components/variations/net/variations_http_headers.h"
diff --git a/chrome/browser/search/search.cc b/chrome/browser/search/search.cc index 05ca70f..bd26831 100644 --- a/chrome/browser/search/search.cc +++ b/chrome/browser/search/search.cc
@@ -16,7 +16,7 @@ #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/search/search.h" #include "components/search_engines/search_engine_type.h" #include "components/search_engines/template_url_service.h"
diff --git a/chrome/browser/search/suggestions/suggestions_service_factory.cc b/chrome/browser/search/suggestions/suggestions_service_factory.cc index 2101b20..37e50bf 100644 --- a/chrome/browser/search/suggestions/suggestions_service_factory.cc +++ b/chrome/browser/search/suggestions/suggestions_service_factory.cc
@@ -90,7 +90,9 @@ std::unique_ptr<ImageManager> thumbnail_manager( new ImageManager(std::move(image_fetcher), std::move(db), database_dir)); return new SuggestionsServiceImpl( - identity_manager, sync_service, profile->GetRequestContext(), + identity_manager, sync_service, + content::BrowserContext::GetDefaultStoragePartition(profile) + ->GetURLLoaderFactoryForBrowserProcess(), std::move(suggestions_store), std::move(thumbnail_manager), std::move(blacklist_store), base::DefaultTickClock::GetInstance()); }
diff --git a/chrome/browser/search_engines/template_url_service_android.cc b/chrome/browser/search_engines/template_url_service_android.cc index a815d8e9d5..df23c7b 100644 --- a/chrome/browser/search_engines/template_url_service_android.cc +++ b/chrome/browser/search_engines/template_url_service_android.cc
@@ -17,7 +17,7 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/search_engines/template_url_android.h" #include "chrome/browser/search_engines/template_url_service_factory.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/search_engines/search_terms_data.h" #include "components/search_engines/template_url.h" #include "components/search_engines/template_url_prepopulate_data.h"
diff --git a/chrome/browser/search_engines/ui_thread_search_terms_data.cc b/chrome/browser/search_engines/ui_thread_search_terms_data.cc index 34b5430..9847903a 100644 --- a/chrome/browser/search_engines/ui_thread_search_terms_data.cc +++ b/chrome/browser/search_engines/ui_thread_search_terms_data.cc
@@ -14,7 +14,7 @@ #include "chrome/common/channel_info.h" #include "chrome/common/chrome_switches.h" #include "components/google/core/browser/google_url_tracker.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/version_info/version_info.h" #include "content/public/browser/browser_thread.h" #include "rlz/buildflags/buildflags.h"
diff --git a/chrome/browser/signin/signin_promo.cc b/chrome/browser/signin/signin_promo.cc index 4418135..70cf84e 100644 --- a/chrome/browser/signin/signin_promo.cc +++ b/chrome/browser/signin/signin_promo.cc
@@ -24,7 +24,7 @@ #include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" #include "components/signin/core/browser/account_tracker_service.h"
diff --git a/chrome/browser/supervised_user/supervised_user_google_auth_navigation_throttle.cc b/chrome/browser/supervised_user/supervised_user_google_auth_navigation_throttle.cc index 2854fac..193531f 100644 --- a/chrome/browser/supervised_user/supervised_user_google_auth_navigation_throttle.cc +++ b/chrome/browser/supervised_user/supervised_user_google_auth_navigation_throttle.cc
@@ -11,7 +11,7 @@ #include "chrome/browser/signin/signin_manager_factory.h" #include "chrome/browser/supervised_user/child_accounts/child_account_service.h" #include "chrome/browser/supervised_user/child_accounts/child_account_service_factory.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/signin/core/browser/signin_manager.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc index ae6c4bd..aa65fab 100644 --- a/chrome/browser/themes/theme_service.cc +++ b/chrome/browser/themes/theme_service.cc
@@ -673,16 +673,16 @@ // However, if the frame is already very dark or very light, respectively, // this won't contrast sufficiently with the frame color, so we'll need to // reverse when we're lightening and darkening. - const double tab_luminance = color_utils::GetRelativeLuminance(tab_color); - const double frame_luminance = color_utils::GetRelativeLuminance(frame_color); + const float tab_luminance = color_utils::GetRelativeLuminance(tab_color); + const float frame_luminance = color_utils::GetRelativeLuminance(frame_color); const bool lighten = tab_luminance < frame_luminance; SkColor separator_color = lighten ? SK_ColorWHITE : SK_ColorBLACK; - double separator_luminance = color_utils::GetRelativeLuminance( + float separator_luminance = color_utils::GetRelativeLuminance( color_utils::AlphaBlend(separator_color, frame_color, kAlpha)); // The minimum contrast ratio here is just under the ~1.1469 in the default MD // incognito theme. We want the separator to still darken the frame in that // theme, but that's about as low of contrast as we're willing to accept. - const double kMinContrastRatio = 1.1465; + const float kMinContrastRatio = 1.1465f; if (color_utils::GetContrastRatio(separator_luminance, frame_luminance) >= kMinContrastRatio) return SkColorSetA(separator_color, kAlpha); @@ -700,7 +700,7 @@ // The reversed separator doesn't contrast enough with the tab. Compute the // resulting luminance from adjusting the tab color, instead of the frame // color, by the separator color. - const double target_luminance = color_utils::GetRelativeLuminance( + const float target_luminance = color_utils::GetRelativeLuminance( color_utils::AlphaBlend(separator_color, tab_color, kAlpha)); // Now try to compute an alpha for the separator such that, when blended with @@ -709,7 +709,7 @@ // possible range of alpha values. SkAlpha alpha = 128; for (int delta = lighten ? 64 : -64; delta != 0; delta /= 2) { - const double luminance = color_utils::GetRelativeLuminance( + const float luminance = color_utils::GetRelativeLuminance( color_utils::AlphaBlend(separator_color, frame_color, alpha)); if (luminance == target_luminance) break;
diff --git a/chrome/browser/themes/theme_service_unittest.cc b/chrome/browser/themes/theme_service_unittest.cc index 0f60366..4ff63999 100644 --- a/chrome/browser/themes/theme_service_unittest.cc +++ b/chrome/browser/themes/theme_service_unittest.cc
@@ -456,7 +456,7 @@ EXPECT_EQ(theme_color, separator_color); // For the default theme, the separator should darken the frame. - double frame_luminance = color_utils::GetRelativeLuminance(frame_color); + float frame_luminance = color_utils::GetRelativeLuminance(frame_color); EXPECT_LT(color_utils::GetRelativeLuminance(separator_color), frame_luminance); @@ -466,8 +466,8 @@ // "tab" (frame color) since otherwise the contrast the contrast with the // "tab color" would be too minimal. separator_color = GetSeparatorColor(frame_color, tab_color); - double tab_luminance = color_utils::GetRelativeLuminance(tab_color); - double separator_luminance = + float tab_luminance = color_utils::GetRelativeLuminance(tab_color); + float separator_luminance = color_utils::GetRelativeLuminance(separator_color); EXPECT_LT(separator_luminance, tab_luminance); EXPECT_LT(separator_luminance, frame_luminance); @@ -513,7 +513,7 @@ // And if we reverse the colors, the separator should lighten the "frame" // (tab color). separator_color = GetSeparatorColor(frame_color, tab_color); - double tab_luminance = color_utils::GetRelativeLuminance(tab_color); + float tab_luminance = color_utils::GetRelativeLuminance(tab_color); EXPECT_GT(color_utils::GetRelativeLuminance(separator_color), tab_luminance); @@ -521,7 +521,7 @@ // should also be lighter than the tab color since otherwise the contrast // with the tab would be too minimal. separator_color = GetSeparatorColor(tab_color, SK_ColorBLACK); - double separator_luminance = + float separator_luminance = color_utils::GetRelativeLuminance(separator_color); EXPECT_GT(separator_luminance, 0); EXPECT_GT(separator_luminance, tab_luminance);
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc index ff9edd8..ef0f25a 100644 --- a/chrome/browser/ui/browser_commands.cc +++ b/chrome/browser/ui/browser_commands.cc
@@ -64,7 +64,7 @@ #include "components/bookmarks/common/bookmark_pref_names.h" #include "components/favicon/content/content_favicon_driver.h" #include "components/feature_engagement/buildflags.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/prefs/pref_service.h" #include "components/sessions/core/live_tab_context.h" #include "components/sessions/core/tab_restore_service.h"
diff --git a/chrome/browser/ui/browser_content_setting_bubble_model_delegate.cc b/chrome/browser/ui/browser_content_setting_bubble_model_delegate.cc index 0d47d4f..88e1f37 100644 --- a/chrome/browser/ui/browser_content_setting_bubble_model_delegate.cc +++ b/chrome/browser/ui/browser_content_setting_bubble_model_delegate.cc
@@ -10,7 +10,7 @@ #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/tab_dialogs.h" #include "chrome/common/url_constants.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/subresource_filter/core/browser/subresource_filter_constants.h" // The URL for when the user clicks "learn more" on the mixed scripting page
diff --git a/chrome/browser/ui/extensions/extension_installed_bubble_browsertest.cc b/chrome/browser/ui/extensions/extension_installed_bubble_browsertest.cc index 41c8257..e7665a9 100644 --- a/chrome/browser/ui/extensions/extension_installed_bubble_browsertest.cc +++ b/chrome/browser/ui/extensions/extension_installed_bubble_browsertest.cc
@@ -6,7 +6,6 @@ #include "base/auto_reset.h" #include "base/optional.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/extensions/extension_service.h" @@ -23,7 +22,6 @@ #include "extensions/common/extension_builder.h" #include "extensions/common/manifest_constants.h" #include "services/identity/public/cpp/identity_test_utils.h" -#include "ui/base/ui_base_features.h" using extensions::Manifest; using ActionType = extensions::ExtensionBuilder::ActionType; @@ -176,14 +174,6 @@ // the BubbleUi is closed. IN_PROC_BROWSER_TEST_F(ExtensionInstalledBubbleBrowserTest, MAYBE_CloseBubbleUI) { - base::test::ScopedFeatureList scoped_feature_list; -#if defined(OS_MACOSX) - scoped_feature_list.InitWithFeatures( - {features::kSecondaryUiMd, features::kShowAllDialogsWithViewsToolkit}, - {}); -#else - scoped_feature_list.InitWithFeatures({features::kSecondaryUiMd}, {}); -#endif auto bubble = MakeBubble("No action", base::nullopt); BubbleManager* manager = browser()->GetBubbleManager(); manager->ShowBubble(std::move(bubble));
diff --git a/chrome/browser/ui/navigation_correction_tab_observer.cc b/chrome/browser/ui/navigation_correction_tab_observer.cc index 40e4819..deb42bc 100644 --- a/chrome/browser/ui/navigation_correction_tab_observer.cc +++ b/chrome/browser/ui/navigation_correction_tab_observer.cc
@@ -12,7 +12,7 @@ #include "chrome/common/navigation_corrector.mojom.h" #include "chrome/common/pref_names.h" #include "chrome/common/render_messages.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" #include "content/public/browser/render_frame_host.h"
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc index fd29d598..7361336 100644 --- a/chrome/browser/ui/search/search_tab_helper.cc +++ b/chrome/browser/ui/search/search_tab_helper.cc
@@ -27,7 +27,7 @@ #include "chrome/common/url_constants.h" #include "chrome/grit/generated_resources.h" #include "components/browser_sync/profile_sync_service.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/omnibox/browser/omnibox_edit_model.h" #include "components/omnibox/browser/omnibox_popup_model.h" #include "components/omnibox/browser/omnibox_view.h"
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc index 66a387a..4d42c78 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
@@ -97,7 +97,7 @@ #endif // defined(OS_WIN) #if BUILDFLAG(ENABLE_RLZ) -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/rlz/rlz_tracker.h" // nogncheck #endif
diff --git a/chrome/browser/ui/toolbar/chrome_toolbar_model_delegate.cc b/chrome/browser/ui/toolbar/chrome_toolbar_model_delegate.cc index e7571f6..894ff1f9 100644 --- a/chrome/browser/ui/toolbar/chrome_toolbar_model_delegate.cc +++ b/chrome/browser/ui/toolbar/chrome_toolbar_model_delegate.cc
@@ -12,7 +12,7 @@ #include "chrome/browser/ssl/security_state_tab_helper.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/offline_pages/buildflags/buildflags.h" #include "components/omnibox/browser/autocomplete_input.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc index 15c6bf9..553a04d 100644 --- a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc +++ b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc
@@ -41,9 +41,13 @@ // By spec, dropdowns should have a min width of 64, a max width of 456, and // should always have a width which is a multiple of 12. -const int kAutofillPopupWidthMultiple = 12; -const int kAutofillPopupMinWidth = 64; -const int kAutofillPopupMaxWidth = 456; +constexpr int kAutofillPopupWidthMultiple = 12; +constexpr int kAutofillPopupMinWidth = 64; +constexpr int kAutofillPopupMaxWidth = 456; + +// Max width for the username and masked password. +constexpr int kAutofillPopupUsernameMaxWidth = 272; +constexpr int kAutofillPopupPasswordMaxWidth = 108; // A space between the input element and the dropdown, so that the dropdown's // border doesn't look too close to the element. @@ -65,6 +69,35 @@ namespace { +// Container view that holds one child view and limits its width to the +// specified maximum. +class ConstrainedWidthView : public views::View { + public: + ConstrainedWidthView(views::View* child, int max_width); + ~ConstrainedWidthView() override = default; + + private: + // views::View: + gfx::Size CalculatePreferredSize() const override; + + int max_width_; + + DISALLOW_COPY_AND_ASSIGN(ConstrainedWidthView); +}; + +ConstrainedWidthView::ConstrainedWidthView(views::View* child, int max_width) + : max_width_(max_width) { + SetLayoutManager(std::make_unique<views::FillLayout>()); + AddChildView(child); +} + +gfx::Size ConstrainedWidthView::CalculatePreferredSize() const { + gfx::Size size = View::CalculatePreferredSize(); + if (size.width() <= max_width_) + return size; + return gfx::Size(max_width_, GetHeightForWidth(max_width_)); +} + // This represents a single selectable item. Subclasses distinguish between // footer and suggestion rows, which are structurally similar but have // distinct styling. @@ -91,6 +124,9 @@ protected: virtual int GetPrimaryTextStyle() = 0; + virtual views::View* CreateValueLabel(); + // The description view can be nullptr. + virtual views::View* CreateDescriptionLabel(); private: void AddSpacerWithSize(int spacer_width, @@ -117,13 +153,33 @@ std::unique_ptr<views::Background> CreateBackground() override; int GetPrimaryTextStyle() override; - private: AutofillPopupSuggestionView(AutofillPopupViewNativeViews* popup_view, int line_number); DISALLOW_COPY_AND_ASSIGN(AutofillPopupSuggestionView); }; +// This represents a password suggestion row; i.e., a username and password. +class PasswordPopupSuggestionView : public AutofillPopupSuggestionView { + public: + ~PasswordPopupSuggestionView() override = default; + + static PasswordPopupSuggestionView* Create( + AutofillPopupViewNativeViews* popup_view, + int line_number); + + protected: + // AutofillPopupItemView: + views::View* CreateValueLabel() override; + views::View* CreateDescriptionLabel() override; + + private: + PasswordPopupSuggestionView(AutofillPopupViewNativeViews* popup_view, + int line_number); + + DISALLOW_COPY_AND_ASSIGN(PasswordPopupSuggestionView); +}; + // This represents an option which appears in the footer of the dropdown, such // as a row which will open the Autofill settings page when selected. class AutofillPopupFooterView : public AutofillPopupItemView { @@ -205,6 +261,8 @@ DISALLOW_COPY_AND_ASSIGN(AutofillPopupWarningView); }; +/************** AutofillPopupItemView **************/ + void AutofillPopupItemView::GetAccessibleNodeData(ui::AXNodeData* node_data) { AutofillPopupController* controller = popup_view_->controller(); auto suggestion = controller->GetSuggestionAt(line_number_); @@ -272,33 +330,14 @@ layout->set_minimum_cross_axis_size( views::MenuConfig::instance().touchable_menu_height + extra_height_); - // TODO(crbug.com/831603): Remove elision responsibilities from controller. - views::Label* text_label = new views::Label( - controller->GetElidedValueAt(line_number_), - {views::style::GetFont(ChromeTextContext::CONTEXT_BODY_TEXT_LARGE, - GetPrimaryTextStyle())}); - text_label->SetEnabledColor( - views::style::GetColor(*this, ChromeTextContext::CONTEXT_BODY_TEXT_LARGE, - GetPrimaryTextStyle())); - - AddChildView(text_label); + AddChildView(CreateValueLabel()); AddSpacerWithSize(views::MenuConfig::instance().item_horizontal_padding, /*resize=*/true, layout); - const base::string16& description_text = - controller->GetElidedLabelAt(line_number_); - if (!description_text.empty()) { - views::Label* subtext_label = new views::Label( - description_text, - {views::style::GetFont(ChromeTextContext::CONTEXT_BODY_TEXT_LARGE, - ChromeTextStyle::STYLE_SECONDARY)}); - subtext_label->SetEnabledColor(views::style::GetColor( - *this, ChromeTextContext::CONTEXT_BODY_TEXT_LARGE, - ChromeTextStyle::STYLE_SECONDARY)); - - AddChildView(subtext_label); - } + views::View* description_label = CreateDescriptionLabel(); + if (description_label) + AddChildView(description_label); const gfx::ImageSkia icon = controller->layout_model().GetIconImage(line_number_); @@ -318,6 +357,35 @@ SchedulePaint(); } +views::View* AutofillPopupItemView::CreateValueLabel() { + // TODO(crbug.com/831603): Remove elision responsibilities from controller. + views::Label* text_label = new views::Label( + popup_view_->controller()->GetElidedValueAt(line_number_), + {views::style::GetFont(ChromeTextContext::CONTEXT_BODY_TEXT_LARGE, + GetPrimaryTextStyle())}); + text_label->SetEnabledColor( + views::style::GetColor(*this, ChromeTextContext::CONTEXT_BODY_TEXT_LARGE, + GetPrimaryTextStyle())); + return text_label; +} + +views::View* AutofillPopupItemView::CreateDescriptionLabel() { + const base::string16& description_text = + popup_view_->controller()->GetElidedLabelAt(line_number_); + if (!description_text.empty()) { + views::Label* subtext_label = new views::Label( + description_text, + {views::style::GetFont(ChromeTextContext::CONTEXT_BODY_TEXT_LARGE, + ChromeTextStyle::STYLE_SECONDARY)}); + subtext_label->SetEnabledColor(views::style::GetColor( + *this, ChromeTextContext::CONTEXT_BODY_TEXT_LARGE, + ChromeTextStyle::STYLE_SECONDARY)); + + return subtext_label; + } + return nullptr; +} + void AutofillPopupItemView::AddSpacerWithSize(int spacer_width, bool resize, views::BoxLayout* layout) { @@ -327,6 +395,8 @@ layout->SetFlexForView(spacer, /*flex=*/resize ? 1 : 0); } +/************** AutofillPopupSuggestionView **************/ + // static AutofillPopupSuggestionView* AutofillPopupSuggestionView::Create( AutofillPopupViewNativeViews* popup_view, @@ -355,6 +425,35 @@ SetFocusBehavior(FocusBehavior::ALWAYS); } +/************** PasswordPopupSuggestionView **************/ + +PasswordPopupSuggestionView* PasswordPopupSuggestionView::Create( + AutofillPopupViewNativeViews* popup_view, + int line_number) { + PasswordPopupSuggestionView* result = + new PasswordPopupSuggestionView(popup_view, line_number); + result->Init(); + return result; +} + +views::View* PasswordPopupSuggestionView::CreateValueLabel() { + views::View* label = AutofillPopupSuggestionView::CreateValueLabel(); + return new ConstrainedWidthView(label, kAutofillPopupUsernameMaxWidth); +} + +views::View* PasswordPopupSuggestionView::CreateDescriptionLabel() { + views::View* label = AutofillPopupSuggestionView::CreateDescriptionLabel(); + return label ? new ConstrainedWidthView(label, kAutofillPopupPasswordMaxWidth) + : nullptr; +} + +PasswordPopupSuggestionView::PasswordPopupSuggestionView( + AutofillPopupViewNativeViews* popup_view, + int line_number) + : AutofillPopupSuggestionView(popup_view, line_number) {} + +/************** AutofillPopupFooterView **************/ + // static AutofillPopupFooterView* AutofillPopupFooterView::Create( AutofillPopupViewNativeViews* popup_view, @@ -394,6 +493,8 @@ SetFocusBehavior(FocusBehavior::ALWAYS); } +/************** AutofillPopupSeparatorView **************/ + // static AutofillPopupSeparatorView* AutofillPopupSeparatorView::Create( AutofillPopupViewNativeViews* popup_view, @@ -444,6 +545,8 @@ SetFocusBehavior(FocusBehavior::NEVER); } +/************** AutofillPopupWarningView **************/ + // static AutofillPopupWarningView* AutofillPopupWarningView::Create( AutofillPopupViewNativeViews* popup_view, @@ -499,6 +602,8 @@ } // namespace +/************** AutofillPopupRowView **************/ + void AutofillPopupRowView::SetSelected(bool is_selected) { if (is_selected == is_selected_) return; @@ -628,6 +733,11 @@ rows_.push_back(AutofillPopupWarningView::Create(this, line_number)); break; + case autofill::PopupItemId::POPUP_ITEM_ID_USERNAME_ENTRY: + case autofill::PopupItemId::POPUP_ITEM_ID_PASSWORD_ENTRY: + rows_.push_back(PasswordPopupSuggestionView::Create(this, line_number)); + break; + default: rows_.push_back(AutofillPopupSuggestionView::Create(this, line_number)); }
diff --git a/chrome/browser/ui/views/autofill/save_card_bubble_views.h b/chrome/browser/ui/views/autofill/save_card_bubble_views.h index 8eb7a0c..de1b384 100644 --- a/chrome/browser/ui/views/autofill/save_card_bubble_views.h +++ b/chrome/browser/ui/views/autofill/save_card_bubble_views.h
@@ -74,9 +74,8 @@ views::View* GetFootnoteViewForTesting(); private: - FRIEND_TEST_ALL_PREFIXES( - SaveCardBubbleViewsFullFormBrowserTest, - Upload_ClickingCloseClosesBubbleIfSecondaryUiMdExpOn); + FRIEND_TEST_ALL_PREFIXES(SaveCardBubbleViewsFullFormBrowserTest, + Upload_ClickingCloseClosesBubble); FRIEND_TEST_ALL_PREFIXES( SaveCardBubbleViewsFullFormBrowserTest, Upload_DecliningUploadDoesNotLogUserAcceptedCardOriginUMA);
diff --git a/chrome/browser/ui/views/autofill/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/save_card_bubble_views_browsertest.cc index 303668ab..773b20e 100644 --- a/chrome/browser/ui/views/autofill/save_card_bubble_views_browsertest.cc +++ b/chrome/browser/ui/views/autofill/save_card_bubble_views_browsertest.cc
@@ -14,8 +14,6 @@ #include "components/autofill/core/browser/autofill_experiments.h" #include "content/public/test/browser_test_utils.h" #include "net/url_request/test_url_fetcher_factory.h" -#include "ui/base/material_design/material_design_controller.h" -#include "ui/base/ui_base_features.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/button/label_button.h" #include "ui/views/controls/styled_label.h" @@ -98,49 +96,10 @@ AutofillMetrics::SAVE_CARD_PROMPT_END_ACCEPTED, 1); } -// Tests the local save bubble. Ensures that clicking the [No thanks] button -// successfully causes the bubble to go away. -IN_PROC_BROWSER_TEST_F( - SaveCardBubbleViewsFullFormBrowserTest, - Local_ClickingNoThanksClosesBubbleIfSecondaryUiMdExpOff) { - // Pre-Harmony tests are not applicable to Refresh. - if (ui::MaterialDesignController::IsRefreshUi()) - return; - - // Disable the SecondaryUiMd experiment. - scoped_feature_list_.InitAndDisableFeature(features::kSecondaryUiMd); - - // Set up the Payments RPC. - SetUploadDetailsRpcPaymentsDeclines(); - - // Submitting the form and having Payments decline offering to save should - // show the local save bubble. - // (Must wait for response from Payments before accessing the controller.) - ResetEventWaiterForSequence( - {DialogEvent::REQUESTED_UPLOAD_SAVE, - DialogEvent::RECEIVED_GET_UPLOAD_DETAILS_RESPONSE, - DialogEvent::OFFERED_LOCAL_SAVE}); - FillAndSubmitForm(); - WaitForObservedEvent(); - EXPECT_TRUE( - FindViewInBubbleById(DialogViewId::MAIN_CONTENT_VIEW_LOCAL)->visible()); - - // Clicking [No thanks] should cancel and close it. - base::HistogramTester histogram_tester; - ClickOnDialogViewWithIdAndWait(DialogViewId::CANCEL_BUTTON); - // UMA should have recorded bubble rejection. - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Local.FirstShow", - AutofillMetrics::SAVE_CARD_PROMPT_END_DENIED, 1); -} - // Tests the local save bubble. Ensures that the Harmony version of the bubble // does not have a [No thanks] button (it has an [X] Close button instead.) IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest, - Local_ShouldNotHaveNoThanksButtonIfSecondaryUiMdExpOn) { - // Enable the SecondaryUiMd experiment. - scoped_feature_list_.InitAndEnableFeature(features::kSecondaryUiMd); - + Local_ShouldNotHaveNoThanksButton) { // Set up the Payments RPC. SetUploadDetailsRpcPaymentsDeclines(); @@ -229,48 +188,10 @@ AutofillMetrics::SAVE_CARD_PROMPT_END_ACCEPTED, 1); } -// Tests the upload save bubble. Ensures that clicking the [No thanks] button -// successfully causes the bubble to go away. -IN_PROC_BROWSER_TEST_F( - SaveCardBubbleViewsFullFormBrowserTest, - Upload_ClickingNoThanksClosesBubbleIfSecondaryUiMdExpOff) { - // Pre-Harmony tests are not applicable to Refresh. - if (ui::MaterialDesignController::IsRefreshUi()) - return; - - // Disable the SecondaryUiMd experiment. - scoped_feature_list_.InitAndDisableFeature(features::kSecondaryUiMd); - - // Set up the Payments RPC. - SetUploadDetailsRpcPaymentsAccepts(); - - // Submitting the form should show the upload save bubble and legal footer. - // (Must wait for response from Payments before accessing the controller.) - ResetEventWaiterForSequence( - {DialogEvent::REQUESTED_UPLOAD_SAVE, - DialogEvent::RECEIVED_GET_UPLOAD_DETAILS_RESPONSE}); - FillAndSubmitForm(); - WaitForObservedEvent(); - EXPECT_TRUE( - FindViewInBubbleById(DialogViewId::MAIN_CONTENT_VIEW_UPLOAD)->visible()); - EXPECT_TRUE(FindViewInBubbleById(DialogViewId::FOOTNOTE_VIEW)->visible()); - - // Clicking [No thanks] should cancel and close it. - base::HistogramTester histogram_tester; - ClickOnDialogViewWithIdAndWait(DialogViewId::CANCEL_BUTTON); - // UMA should have recorded bubble rejection. - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow", - AutofillMetrics::SAVE_CARD_PROMPT_END_DENIED, 1); -} - // Tests the upload save bubble. Ensures that the Harmony version of the bubble // does not have a [No thanks] button (it has an [X] Close button instead.) IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest, - Upload_ShouldNotHaveNoThanksButtonIfSecondaryUiMdExpOn) { - // Enable the SecondaryUiMd experiment. - scoped_feature_list_.InitAndEnableFeature(features::kSecondaryUiMd); - + Upload_ShouldNotHaveNoThanksButton) { // Set up the Payments RPC. SetUploadDetailsRpcPaymentsAccepts(); @@ -292,10 +213,7 @@ // Tests the upload save bubble. Ensures that clicking the top-right [X] close // button successfully causes the bubble to go away. IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest, - Upload_ClickingCloseClosesBubbleIfSecondaryUiMdExpOn) { - // Enable the SecondaryUiMd experiment. - scoped_feature_list_.InitAndEnableFeature(features::kSecondaryUiMd); - + Upload_ClickingCloseClosesBubble) { // Set up the Payments RPC. SetUploadDetailsRpcPaymentsAccepts(); @@ -810,10 +728,6 @@ IN_PROC_BROWSER_TEST_F( SaveCardBubbleViewsFullFormBrowserTest, Upload_DecliningUploadDoesNotLogUserAcceptedCardOriginUMA) { - // Enable the SecondaryUiMd experiment (required for clicking the Close - // button). - scoped_feature_list_.InitAndEnableFeature(features::kSecondaryUiMd); - // Set up the Payments RPC. SetUploadDetailsRpcPaymentsAccepts();
diff --git a/chrome/browser/ui/views/crostini/crostini_installer_view.cc b/chrome/browser/ui/views/crostini/crostini_installer_view.cc index 300bf09..2849ce6 100644 --- a/chrome/browser/ui/views/crostini/crostini_installer_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_installer_view.cc
@@ -396,7 +396,8 @@ state_ = State::SHOW_LOGIN_SHELL; crostini::CrostiniManager::GetInstance()->LaunchContainerTerminal( - profile_, kCrostiniDefaultVmName, kCrostiniDefaultContainerName); + profile_, kCrostiniDefaultVmName, kCrostiniDefaultContainerName, + std::vector<std::string>()); StepProgress(); RecordSetupResultHistogram(SetupResult::kSuccess);
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.cc b/chrome/browser/ui/views/overlay/overlay_window_views.cc index 53196883..232f92f 100644 --- a/chrome/browser/ui/views/overlay/overlay_window_views.cc +++ b/chrome/browser/ui/views/overlay/overlay_window_views.cc
@@ -517,7 +517,10 @@ void OverlayWindowViews::OnMouseEvent(ui::MouseEvent* event) { switch (event->type()) { // Only show the media controls when the mouse is hovering over the window. + // This is checking for both ENTERED and MOVED because ENTERED is not fired + // after a resize on Windows. case ui::ET_MOUSE_ENTERED: + case ui::ET_MOUSE_MOVED: UpdateControlsVisibility(true); break;
diff --git a/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc b/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc index 263c596..c8b6f30 100644 --- a/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc +++ b/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc
@@ -11,7 +11,6 @@ #include "base/macros.h" #include "base/metrics/histogram_samples.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/passwords/manage_passwords_test.h" @@ -33,7 +32,6 @@ #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" #include "testing/gmock/include/gmock/gmock.h" -#include "ui/base/ui_base_features.h" #include "ui/base/ui_features.h" #include "ui/views/window/dialog_client_view.h" @@ -72,16 +70,6 @@ PasswordBubbleInteractiveUiTest() {} ~PasswordBubbleInteractiveUiTest() override {} - // ManagePasswordsTest: - void SetUp() override { -#if defined(OS_MACOSX) - scoped_feature_list_.InitWithFeatures( - {features::kSecondaryUiMd, features::kShowAllDialogsWithViewsToolkit}, - {}); -#endif - ManagePasswordsTest::SetUp(); - } - MOCK_METHOD0(OnIconRequestDone, void()); // Called on the server background thread. @@ -95,7 +83,6 @@ private: test::ScopedMacViewsBrowserMode views_mode_{true}; - base::test::ScopedFeatureList scoped_feature_list_; DISALLOW_COPY_AND_ASSIGN(PasswordBubbleInteractiveUiTest); };
diff --git a/chrome/browser/ui/views/payments/payment_request_views_util.cc b/chrome/browser/ui/views/payments/payment_request_views_util.cc index 4f665a3..8dc1ca6 100644 --- a/chrome/browser/ui/views/payments/payment_request_views_util.cc +++ b/chrome/browser/ui/views/payments/payment_request_views_util.cc
@@ -414,7 +414,7 @@ } SkColor GetForegroundColorForBackground(SkColor background_color) { - constexpr double kLightForegroundRatioThreshold = 3; + constexpr float kLightForegroundRatioThreshold = 3; if (background_color != 0 && color_utils::GetContrastRatio(background_color, SK_ColorWHITE) >= kLightForegroundRatioThreshold) {
diff --git a/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc b/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc index 44c3c2b..6069e44 100644 --- a/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc +++ b/chrome/browser/ui/views/sync/one_click_signin_dialog_view.cc
@@ -15,7 +15,7 @@ #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "components/constrained_window/constrained_window_views.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/strings/grit/components_strings.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h"
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view_browsertest.cc b/chrome/browser/ui/views/translate/translate_bubble_view_browsertest.cc index 9427216..d40d8bf1 100644 --- a/chrome/browser/ui/views/translate/translate_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/translate/translate_bubble_view_browsertest.cc
@@ -10,7 +10,6 @@ #include "base/command_line.h" #include "base/macros.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/translate/chrome_translate_client.h" @@ -36,10 +35,6 @@ ~TranslateBubbleViewBrowserTest() override {} void SetUp() override { -#if defined(OS_MACOSX) - // Enable toolkit-views bubbles on Mac (otherwise Cocoa bubbles are used). - feature_list_.InitAndEnableFeature(features::kSecondaryUiMd); -#endif set_open_about_blank_on_browser_launch(true); translate::TranslateManager::SetIgnoreMissingKeyForTesting(true); InProcessBrowserTest::SetUp(); @@ -60,7 +55,6 @@ private: std::string expected_lang_; - base::test::ScopedFeatureList feature_list_; bool OnLanguageDetermined(const content::NotificationSource& source, const content::NotificationDetails& details) {
diff --git a/chrome/browser/ui/webui/conflicts/conflicts_handler.cc b/chrome/browser/ui/webui/conflicts/conflicts_handler.cc index 0ba7fba..7b9fb38 100644 --- a/chrome/browser/ui/webui/conflicts/conflicts_handler.cc +++ b/chrome/browser/ui/webui/conflicts/conflicts_handler.cc
@@ -229,9 +229,10 @@ if (!ModuleDatabase::IsThirdPartyBlockingPolicyEnabled()) third_party_features_status_ = kPolicyDisabled; - if (!base::FeatureList::IsEnabled( - features::kIncompatibleApplicationsWarning) || - !base::FeatureList::IsEnabled(features::kThirdPartyModulesBlocking)) { + if (!base::FeatureList::IsEnabled(features::kThirdPartyModulesBlocking) && + !(base::FeatureList::IsEnabled( + features::kIncompatibleApplicationsWarning) && + base::win::GetVersion() >= base::win::VERSION_WIN10)) { third_party_features_status_ = kFeatureDisabled; }
diff --git a/chrome/browser/ui/webui/extensions/extensions_ui.cc b/chrome/browser/ui/webui/extensions/extensions_ui.cc index c733a9e..88213e3 100644 --- a/chrome/browser/ui/webui/extensions/extensions_ui.cc +++ b/chrome/browser/ui/webui/extensions/extensions_ui.cc
@@ -23,7 +23,7 @@ #include "chrome/grit/extensions_resources_map.h" #include "chrome/grit/generated_resources.h" #include "chrome/grit/theme_resources.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" #include "components/strings/grit/components_strings.h"
diff --git a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc index 3c2af7b1..fdc5098 100644 --- a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc +++ b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
@@ -32,7 +32,7 @@ #include "chrome/grit/generated_resources.h" #include "chrome/grit/theme_resources.h" #include "components/bookmarks/common/bookmark_pref_names.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/prefs/pref_service.h" #include "components/strings/grit/components_strings.h" #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/ui/webui/settings/about_handler.cc b/chrome/browser/ui/webui/settings/about_handler.cc index 6683c9e7..fd36a556 100644 --- a/chrome/browser/ui/webui/settings/about_handler.cc +++ b/chrome/browser/ui/webui/settings/about_handler.cc
@@ -37,7 +37,7 @@ #include "chrome/common/url_constants.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/policy/core/common/policy_namespace.h" #include "components/policy/policy_constants.h" #include "components/strings/grit/components_chromium_strings.h"
diff --git a/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc b/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc index dd9e351..fa15065 100644 --- a/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc +++ b/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc
@@ -30,9 +30,7 @@ using chromeos::tpm_firmware_update::Mode; // Decide which update mode to use. - // TODO(crbug.com/854576): Re-add Mode::kPreserveDeviceState after fixing - // interrupted update flow issue described in the bug. - for (Mode mode : {Mode::kPowerwash}) { + for (Mode mode : {Mode::kPreserveDeviceState, Mode::kPowerwash}) { if (available_modes.count(mode) == 0) { continue; }
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 149634cb..8b6355b 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
@@ -30,7 +30,7 @@ #include "components/autofill/core/browser/payments/payments_service_url.h" #include "components/autofill/core/common/autofill_constants.h" #include "components/content_settings/core/common/features.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/omnibox/browser/omnibox_field_trial.h" #include "components/password_manager/core/common/password_manager_features.h" #include "components/safe_browsing/common/safe_browsing_prefs.h"
diff --git a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc index 1f486d9..e91b7de8 100644 --- a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc +++ b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
@@ -17,7 +17,7 @@ #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/url_constants.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/prefs/pref_service.h" #include "content/public/browser/web_ui.h"
diff --git a/chrome/browser/usb/usb_tab_helper.cc b/chrome/browser/usb/usb_tab_helper.cc index 4ca1398..242970d 100644 --- a/chrome/browser/usb/usb_tab_helper.cc +++ b/chrome/browser/usb/usb_tab_helper.cc
@@ -9,11 +9,11 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/usb/web_usb_device_manager.h" #include "chrome/browser/usb/web_usb_permission_provider.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_frame_host.h" #include "content/public/common/content_features.h" -#include "device/usb/mojo/device_manager_impl.h" #include "mojo/public/cpp/bindings/message.h" #include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom.h" @@ -65,8 +65,8 @@ mojo::ReportBadMessage(kFeaturePolicyViolation); return; } - device::usb::DeviceManagerImpl::Create( - GetPermissionProvider(render_frame_host), std::move(request)); + WebUsbDeviceManager::Create(GetPermissionProvider(render_frame_host), + std::move(request)); } void UsbTabHelper::CreateChooserService(
diff --git a/chrome/browser/usb/web_usb_device_manager.cc b/chrome/browser/usb/web_usb_device_manager.cc new file mode 100644 index 0000000..52fbb91a --- /dev/null +++ b/chrome/browser/usb/web_usb_device_manager.cc
@@ -0,0 +1,94 @@ +// Copyright 2018 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 "chrome/browser/usb/web_usb_device_manager.h" + +#include <utility> + +#include "base/bind.h" +#include "device/base/device_client.h" +#include "device/usb/mojo/device_manager_impl.h" +#include "device/usb/mojo/type_converters.h" +#include "device/usb/usb_device.h" + +// static +void WebUsbDeviceManager::Create( + base::WeakPtr<device::usb::PermissionProvider> permission_provider, + device::mojom::UsbDeviceManagerRequest request) { + // Bind the Blink request with WebUsbDeviceManager. + auto* web_usb_device_manager = + new WebUsbDeviceManager(std::move(permission_provider)); + web_usb_device_manager->binding_ = mojo::MakeStrongBinding( + base::WrapUnique(web_usb_device_manager), std::move(request)); +} + +WebUsbDeviceManager::WebUsbDeviceManager( + base::WeakPtr<device::usb::PermissionProvider> permission_provider) + : permission_provider_(std::move(permission_provider)), + observer_(this), + weak_factory_(this) { + // Bind |device_manager_| to UsbDeviceManager and set error handler. + // TODO(donna.wu@intel.com): Request UsbDeviceManagerPtr from the Device + // Service after moving //device/usb to //services/device. + device::usb::DeviceManagerImpl::Create(permission_provider_, + mojo::MakeRequest(&device_manager_)); + device_manager_.set_connection_error_handler(base::BindOnce( + &WebUsbDeviceManager::OnConnectionError, base::Unretained(this))); + // Listen for add/remove device events from UsbService. + // TODO(donna.wu@intel.com): Listen to |device_manager_| in the future. + // We can't set WebUsbDeviceManager as a UsbDeviceManagerClient because + // the OnDeviceRemoved event will be delivered here after it is delivered + // to UsbChooserContext, meaning that all ephemeral permission checks in + // OnDeviceRemoved() will fail. + auto* usb_service = device::DeviceClient::Get()->GetUsbService(); + if (usb_service) + observer_.Add(usb_service); +} + +WebUsbDeviceManager::~WebUsbDeviceManager() = default; + +void WebUsbDeviceManager::GetDevices( + device::mojom::UsbEnumerationOptionsPtr options, + GetDevicesCallback callback) { + device_manager_->GetDevices(std::move(options), std::move(callback)); +} + +void WebUsbDeviceManager::GetDevice( + const std::string& guid, + device::mojom::UsbDeviceRequest device_request) { + device_manager_->GetDevice(guid, std::move(device_request)); +} + +void WebUsbDeviceManager::SetClient( + device::mojom::UsbDeviceManagerClientPtr client) { + client_ = std::move(client); +} + +void WebUsbDeviceManager::OnDeviceAdded( + scoped_refptr<device::UsbDevice> device) { + if (client_ && permission_provider_ && + permission_provider_->HasDevicePermission(device)) { + client_->OnDeviceAdded(device::mojom::UsbDeviceInfo::From(*device)); + } +} + +void WebUsbDeviceManager::OnDeviceRemoved( + scoped_refptr<device::UsbDevice> device) { + if (client_ && permission_provider_ && + permission_provider_->HasDevicePermission(device)) { + client_->OnDeviceRemoved(device::mojom::UsbDeviceInfo::From(*device)); + } +} + +void WebUsbDeviceManager::OnConnectionError() { + device_manager_.reset(); + + // Close the connection with blink. + client_.reset(); + binding_->Close(); +} + +void WebUsbDeviceManager::WillDestroyUsbService() { + OnConnectionError(); +}
diff --git a/chrome/browser/usb/web_usb_device_manager.h b/chrome/browser/usb/web_usb_device_manager.h new file mode 100644 index 0000000..2fa30b22 --- /dev/null +++ b/chrome/browser/usb/web_usb_device_manager.h
@@ -0,0 +1,67 @@ +// Copyright 2018 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 CHROME_BROWSER_USB_WEB_USB_DEVICE_MANAGER_H_ +#define CHROME_BROWSER_USB_WEB_USB_DEVICE_MANAGER_H_ + +#include <string> + +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "base/scoped_observer.h" +#include "device/usb/mojo/permission_provider.h" +#include "device/usb/public/mojom/device.mojom.h" +#include "device/usb/public/mojom/device_manager.mojom.h" +#include "device/usb/usb_service.h" +#include "mojo/public/cpp/bindings/strong_binding.h" + +namespace device { +class UsbDevice; +} + +// Implements a restricted device::mojom::UsbDeviceManager interface by wrapping +// another UsbDeviceManager instance and checking requests with the provided +// device::usb::PermissionProvider. +class WebUsbDeviceManager : public device::mojom::UsbDeviceManager, + public device::UsbService::Observer { + public: + static void Create( + base::WeakPtr<device::usb::PermissionProvider> permission_provider, + device::mojom::UsbDeviceManagerRequest request); + + ~WebUsbDeviceManager() override; + + private: + WebUsbDeviceManager( + base::WeakPtr<device::usb::PermissionProvider> permission_provider); + + // DeviceManager implementation: + void GetDevices(device::mojom::UsbEnumerationOptionsPtr options, + GetDevicesCallback callback) override; + void GetDevice(const std::string& guid, + device::mojom::UsbDeviceRequest device_request) override; + void SetClient(device::mojom::UsbDeviceManagerClientPtr client) override; + + // device::UsbService::Observer implementation: + void OnDeviceAdded(scoped_refptr<device::UsbDevice> device) override; + void OnDeviceRemoved(scoped_refptr<device::UsbDevice> device) override; + void WillDestroyUsbService() override; + + void OnConnectionError(); + + base::WeakPtr<device::usb::PermissionProvider> permission_provider_; + + // Used to bind with Blink. + mojo::StrongBindingPtr<device::mojom::UsbDeviceManager> binding_; + device::mojom::UsbDeviceManagerClientPtr client_; + + device::mojom::UsbDeviceManagerPtr device_manager_; + ScopedObserver<device::UsbService, device::UsbService::Observer> observer_; + + base::WeakPtrFactory<WebUsbDeviceManager> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(WebUsbDeviceManager); +}; + +#endif // CHROME_BROWSER_USB_WEB_USB_DEVICE_MANAGER_H_
diff --git a/chrome/browser/usb/web_usb_device_manager_unittest.cc b/chrome/browser/usb/web_usb_device_manager_unittest.cc new file mode 100644 index 0000000..97e2598 --- /dev/null +++ b/chrome/browser/usb/web_usb_device_manager_unittest.cc
@@ -0,0 +1,158 @@ +// Copyright 2018 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 "chrome/browser/usb/web_usb_device_manager.h" + +#include <memory> +#include <set> +#include <string> +#include <vector> + +#include "base/barrier_closure.h" +#include "base/bind.h" +#include "base/run_loop.h" +#include "base/test/scoped_task_environment.h" +#include "device/base/mock_device_client.h" +#include "device/usb/mock_usb_device.h" +#include "device/usb/mock_usb_service.h" +#include "device/usb/mojo/device_impl.h" +#include "device/usb/mojo/mock_permission_provider.h" +#include "mojo/public/cpp/bindings/binding.h" +#include "testing/gtest/include/gtest/gtest.h" + +using ::testing::_; +using ::testing::AtMost; + +using device::mojom::UsbDeviceInfo; +using device::mojom::UsbDeviceInfoPtr; +using device::mojom::UsbDeviceManagerClient; +using device::mojom::UsbDeviceManagerClientPtr; +using device::mojom::UsbDeviceManagerPtr; +using device::MockUsbDevice; +using device::usb::MockPermissionProvider; + +namespace { + +ACTION_P2(ExpectGuidAndThen, expected_guid, callback) { + ASSERT_TRUE(arg0); + EXPECT_EQ(expected_guid, arg0->guid); + if (!callback.is_null()) + callback.Run(); +}; + +class WebUsbDeviceManagerTest : public testing::Test { + public: + WebUsbDeviceManagerTest() = default; + ~WebUsbDeviceManagerTest() override = default; + + protected: + UsbDeviceManagerPtr ConnectToDeviceManager() { + UsbDeviceManagerPtr manager; + WebUsbDeviceManager::Create(permission_provider_.GetWeakPtr(), + mojo::MakeRequest(&manager)); + return manager; + } + + device::MockDeviceClient device_client_; + + private: + MockPermissionProvider permission_provider_; + base::test::ScopedTaskEnvironment task_environment_; +}; + +class MockDeviceManagerClient : public UsbDeviceManagerClient { + public: + MockDeviceManagerClient() : binding_(this) {} + ~MockDeviceManagerClient() override = default; + + UsbDeviceManagerClientPtr CreateInterfacePtrAndBind() { + UsbDeviceManagerClientPtr client; + binding_.Bind(mojo::MakeRequest(&client)); + return client; + } + + MOCK_METHOD1(DoOnDeviceAdded, void(UsbDeviceInfo*)); + void OnDeviceAdded(UsbDeviceInfoPtr device_info) override { + DoOnDeviceAdded(device_info.get()); + } + + MOCK_METHOD1(DoOnDeviceRemoved, void(UsbDeviceInfo*)); + void OnDeviceRemoved(UsbDeviceInfoPtr device_info) override { + DoOnDeviceRemoved(device_info.get()); + } + + private: + mojo::Binding<UsbDeviceManagerClient> binding_; +}; + +void ExpectDevicesAndThen(const std::set<std::string>& expected_guids, + base::OnceClosure continuation, + std::vector<UsbDeviceInfoPtr> results) { + EXPECT_EQ(expected_guids.size(), results.size()); + std::set<std::string> actual_guids; + for (size_t i = 0; i < results.size(); ++i) + actual_guids.insert(results[i]->guid); + EXPECT_EQ(expected_guids, actual_guids); + std::move(continuation).Run(); +} + +} // namespace + +// Test requesting device enumeration updates with GetDeviceChanges. +TEST_F(WebUsbDeviceManagerTest, NoPermissionDevice) { + scoped_refptr<MockUsbDevice> device0 = + new MockUsbDevice(0x1234, 0x5678, "ACME", "Frobinator", "ABCDEF"); + scoped_refptr<MockUsbDevice> device1 = + new MockUsbDevice(0x1234, 0x5679, "ACME", "Frobinator+", "GHIJKL"); + scoped_refptr<MockUsbDevice> no_permission_device1 = + new MockUsbDevice(0xffff, 0x567b, "ACME", "Frobinator II", + MockPermissionProvider::kRestrictedSerialNumber); + scoped_refptr<MockUsbDevice> no_permission_device2 = + new MockUsbDevice(0xffff, 0x567c, "ACME", "Frobinator Xtreme", + MockPermissionProvider::kRestrictedSerialNumber); + + device_client_.usb_service()->AddDevice(device0); + device_client_.usb_service()->AddDevice(no_permission_device1); + + UsbDeviceManagerPtr device_manager = ConnectToDeviceManager(); + MockDeviceManagerClient mock_client; + device_manager->SetClient(mock_client.CreateInterfacePtrAndBind()); + + { + // Call GetDevices once to make sure the device manager is up and running + // and the client is set or else we could block forever waiting for calls. + // The site has no permission to access |no_permission_device1| and + // |no_permission_device2|, so result of GetDevices() should only contain + // the |guid| of |device0|. + std::set<std::string> guids; + guids.insert(device0->guid()); + base::RunLoop loop; + device_manager->GetDevices( + nullptr, + base::BindOnce(&ExpectDevicesAndThen, guids, loop.QuitClosure())); + loop.Run(); + } + + device_client_.usb_service()->AddDevice(device1); + device_client_.usb_service()->AddDevice(no_permission_device2); + device_client_.usb_service()->RemoveDevice(device0); + device_client_.usb_service()->RemoveDevice(device1); + device_client_.usb_service()->RemoveDevice(no_permission_device1); + device_client_.usb_service()->RemoveDevice(no_permission_device2); + + { + base::RunLoop loop; + base::RepeatingClosure barrier = + base::BarrierClosure(3, loop.QuitClosure()); + testing::InSequence s; + EXPECT_CALL(mock_client, DoOnDeviceAdded(_)) + .Times(1) + .WillOnce(ExpectGuidAndThen(device1->guid(), barrier)); + EXPECT_CALL(mock_client, DoOnDeviceRemoved(_)) + .Times(2) + .WillOnce(ExpectGuidAndThen(device0->guid(), barrier)) + .WillOnce(ExpectGuidAndThen(device1->guid(), barrier)); + loop.Run(); + } +}
diff --git a/chrome/browser/web_applications/components/BUILD.gn b/chrome/browser/web_applications/components/BUILD.gn index d762b72..5aaea282 100644 --- a/chrome/browser/web_applications/components/BUILD.gn +++ b/chrome/browser/web_applications/components/BUILD.gn
@@ -8,10 +8,23 @@ "pending_app_manager.h", "web_app_helpers.cc", "web_app_helpers.h", + + # TODO(nigeltao): move these two files from + # //chrome/browser/web_applications/components to a stand-alone + # //components/web_app_icon_downloader? + # + # There's also //components/favicon, //components/image_fetcher as well as + # code split between //content/public/browser/manifest_icon_downloader.h + # and //content/browser/manfest/manifest_icon_downloader.cc. Some or all of + # those might be similar enough to merge. + "web_app_icon_downloader.cc", + "web_app_icon_downloader.h", ] deps = [ "//base", + "//content/public/browser", + "//skia", ] } @@ -20,10 +33,13 @@ sources = [ "web_app_helpers_unittest.cc", + "web_app_icon_downloader_unittest.cc", ] deps = [ ":components", + "//content/public/browser", + "//skia", "//testing/gtest", "//url", ]
diff --git a/chrome/browser/extensions/favicon_downloader.cc b/chrome/browser/web_applications/components/web_app_icon_downloader.cc similarity index 85% rename from chrome/browser/extensions/favicon_downloader.cc rename to chrome/browser/web_applications/components/web_app_icon_downloader.cc index 7587e62..9cfd1595 100644 --- a/chrome/browser/extensions/favicon_downloader.cc +++ b/chrome/browser/web_applications/components/web_app_icon_downloader.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/favicon_downloader.h" +#include "chrome/browser/web_applications/components/web_app_icon_downloader.h" #include "base/bind.h" #include "base/message_loop/message_loop_current.h" @@ -14,11 +14,11 @@ #include "third_party/skia/include/core/SkBitmap.h" #include "ui/gfx/geometry/size.h" -FaviconDownloader::FaviconDownloader( +WebAppIconDownloader::WebAppIconDownloader( content::WebContents* web_contents, const std::vector<GURL>& extra_favicon_urls, const char* https_status_code_class_histogram_name, - FaviconDownloaderCallback callback) + WebAppIconDownloaderCallback callback) : content::WebContentsObserver(web_contents), need_favicon_urls_(true), extra_favicon_urls_(extra_favicon_urls), @@ -27,14 +27,13 @@ https_status_code_class_histogram_name), weak_ptr_factory_(this) {} -FaviconDownloader::~FaviconDownloader() { -} +WebAppIconDownloader::~WebAppIconDownloader() {} -void FaviconDownloader::SkipPageFavicons() { +void WebAppIconDownloader::SkipPageFavicons() { need_favicon_urls_ = false; } -void FaviconDownloader::Start() { +void WebAppIconDownloader::Start() { // If the candidates aren't loaded, icons will be fetched when // DidUpdateFaviconURL() is called. FetchIcons(extra_favicon_urls_); @@ -49,18 +48,18 @@ } } -int FaviconDownloader::DownloadImage(const GURL& url) { +int WebAppIconDownloader::DownloadImage(const GURL& url) { return web_contents()->DownloadImage( url, true, // is_favicon 0, // no max size false, // normal cache policy - base::BindOnce(&FaviconDownloader::DidDownloadFavicon, + base::BindOnce(&WebAppIconDownloader::DidDownloadFavicon, weak_ptr_factory_.GetWeakPtr())); } std::vector<content::FaviconURL> - FaviconDownloader::GetFaviconURLsFromWebContents() { +WebAppIconDownloader::GetFaviconURLsFromWebContents() { favicon::ContentFaviconDriver* content_favicon_driver = web_contents() ? favicon::ContentFaviconDriver::FromWebContents(web_contents()) @@ -71,7 +70,7 @@ : std::vector<content::FaviconURL>(); } -void FaviconDownloader::FetchIcons( +void WebAppIconDownloader::FetchIcons( const std::vector<content::FaviconURL>& favicon_urls) { std::vector<GURL> urls; for (std::vector<content::FaviconURL>::const_iterator it = @@ -83,7 +82,7 @@ FetchIcons(urls); } -void FaviconDownloader::FetchIcons(const std::vector<GURL>& urls) { +void WebAppIconDownloader::FetchIcons(const std::vector<GURL>& urls) { // Download icons; put their download ids into |in_progress_requests_| and // their urls into |processed_urls_|. for (std::vector<GURL>::const_iterator it = urls.begin(); @@ -101,7 +100,7 @@ } } -void FaviconDownloader::DidDownloadFavicon( +void WebAppIconDownloader::DidDownloadFavicon( int id, int http_status_code, const GURL& image_url, @@ -126,7 +125,7 @@ } // content::WebContentsObserver overrides: -void FaviconDownloader::DidFinishNavigation( +void WebAppIconDownloader::DidFinishNavigation( content::NavigationHandle* navigation_handle) { if (!navigation_handle->IsInMainFrame() || !navigation_handle->HasCommitted()) return; @@ -137,7 +136,7 @@ std::move(callback_).Run(false, favicon_map_); } -void FaviconDownloader::DidUpdateFaviconURL( +void WebAppIconDownloader::DidUpdateFaviconURL( const std::vector<content::FaviconURL>& candidates) { // Only consider the first candidates we are given. This prevents pages that // change their favicon from spamming us.
diff --git a/chrome/browser/extensions/favicon_downloader.h b/chrome/browser/web_applications/components/web_app_icon_downloader.h similarity index 78% rename from chrome/browser/extensions/favicon_downloader.h rename to chrome/browser/web_applications/components/web_app_icon_downloader.h index 3ddd10bc3..80b58f5d 100644 --- a/chrome/browser/extensions/favicon_downloader.h +++ b/chrome/browser/web_applications/components/web_app_icon_downloader.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_EXTENSIONS_FAVICON_DOWNLOADER_H_ -#define CHROME_BROWSER_EXTENSIONS_FAVICON_DOWNLOADER_H_ +#ifndef CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_WEB_APP_ICON_DOWNLOADER_H_ +#define CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_WEB_APP_ICON_DOWNLOADER_H_ #include <map> #include <set> @@ -30,15 +30,16 @@ class Size; } -// Class to help download all favicons for a tab. -class FaviconDownloader : public content::WebContentsObserver { +// Class to help download all icons (including favicons and web app manifest +// icons) for a tab. +class WebAppIconDownloader : public content::WebContentsObserver { public: typedef std::map<GURL, std::vector<SkBitmap> > FaviconMap; typedef base::OnceCallback<void( bool, /* success */ /* A map of icon urls to the bitmaps provided by that url. */ const FaviconMap&)> - FaviconDownloaderCallback; + WebAppIconDownloaderCallback; // |extra_favicon_urls| allows callers to provide icon urls that aren't // provided by the renderer (e.g touch icons on non-android environments). // |skip_page_favicons| instructs the downloader to not query the page @@ -46,18 +47,18 @@ // |extra_favicon_urls|). // |https_status_code_class_histogram_name| optionally specifies a histogram // to use for logging http status code class results from fetch attempts. - FaviconDownloader(content::WebContents* web_contents, - const std::vector<GURL>& extra_favicon_urls, - const char* https_status_code_class_histogram_name, - FaviconDownloaderCallback callback); - ~FaviconDownloader() override; + WebAppIconDownloader(content::WebContents* web_contents, + const std::vector<GURL>& extra_favicon_urls, + const char* https_status_code_class_histogram_name, + WebAppIconDownloaderCallback callback); + ~WebAppIconDownloader() override; void SkipPageFavicons(); void Start(); private: - friend class TestFaviconDownloader; + friend class TestWebAppIconDownloader; FRIEND_TEST_ALL_PREFIXES( extensions::BookmarkAppHelperExtensionServiceInstallableSiteTest, CreateBookmarkAppWithManifestIcons); @@ -107,14 +108,14 @@ std::set<GURL> processed_urls_; // Callback to run on favicon download completion. - FaviconDownloaderCallback callback_; + WebAppIconDownloaderCallback callback_; // The histogram name to log individual fetch results under. std::string https_status_code_class_histogram_name_; - base::WeakPtrFactory<FaviconDownloader> weak_ptr_factory_; + base::WeakPtrFactory<WebAppIconDownloader> weak_ptr_factory_; - DISALLOW_COPY_AND_ASSIGN(FaviconDownloader); + DISALLOW_COPY_AND_ASSIGN(WebAppIconDownloader); }; -#endif // CHROME_BROWSER_EXTENSIONS_FAVICON_DOWNLOADER_H_ +#endif // CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_WEB_APP_ICON_DOWNLOADER_H_
diff --git a/chrome/browser/extensions/favicon_downloader_unittest.cc b/chrome/browser/web_applications/components/web_app_icon_downloader_unittest.cc similarity index 79% rename from chrome/browser/extensions/favicon_downloader_unittest.cc rename to chrome/browser/web_applications/components/web_app_icon_downloader_unittest.cc index 57440d6e..bfc0981 100644 --- a/chrome/browser/extensions/favicon_downloader_unittest.cc +++ b/chrome/browser/web_applications/components/web_app_icon_downloader_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/extensions/favicon_downloader.h" +#include "chrome/browser/web_applications/components/web_app_icon_downloader.h" #include <stddef.h> @@ -31,36 +31,35 @@ return bitmaps; } -class FaviconDownloaderTest : public ChromeRenderViewHostTestHarness { +class WebAppIconDownloaderTest : public ChromeRenderViewHostTestHarness { protected: - FaviconDownloaderTest() { - } + WebAppIconDownloaderTest() {} - ~FaviconDownloaderTest() override {} + ~WebAppIconDownloaderTest() override {} protected: base::HistogramTester histogram_tester_; private: - DISALLOW_COPY_AND_ASSIGN(FaviconDownloaderTest); + DISALLOW_COPY_AND_ASSIGN(WebAppIconDownloaderTest); }; -const char* kTestHistogramName = "FaviconDownloader.TestHistogram"; +const char* kTestHistogramName = "WebAppIconDownloader.TestHistogram"; } // namespace -class TestFaviconDownloader : public FaviconDownloader { +class TestWebAppIconDownloader : public WebAppIconDownloader { public: - TestFaviconDownloader(content::WebContents* web_contents, - std::vector<GURL> extra_favicon_urls) - : FaviconDownloader( + TestWebAppIconDownloader(content::WebContents* web_contents, + std::vector<GURL> extra_favicon_urls) + : WebAppIconDownloader( web_contents, extra_favicon_urls, kTestHistogramName, - base::BindOnce(&TestFaviconDownloader::DownloadsComplete, + base::BindOnce(&TestWebAppIconDownloader::DownloadsComplete, base::Unretained(this))), id_counter_(0) {} - ~TestFaviconDownloader() override {} + ~TestWebAppIconDownloader() override {} int DownloadImage(const GURL& url) override { return id_counter_++; } @@ -68,29 +67,26 @@ return initial_favicon_urls_; } - size_t pending_requests() const { - return in_progress_requests_.size(); - } + size_t pending_requests() const { return in_progress_requests_.size(); } void DownloadsComplete(bool success, - const FaviconDownloader::FaviconMap& map) { + const WebAppIconDownloader::FaviconMap& map) { favicon_map_ = map; } - FaviconDownloader::FaviconMap favicon_map() const { - return favicon_map_; - } + WebAppIconDownloader::FaviconMap favicon_map() const { return favicon_map_; } void CompleteImageDownload( int id, const GURL& image_url, const std::vector<gfx::Size>& original_bitmap_sizes) { - FaviconDownloader::DidDownloadFavicon(id, 200, image_url, - CreateTestBitmaps(original_bitmap_sizes), original_bitmap_sizes); + WebAppIconDownloader::DidDownloadFavicon( + id, 200, image_url, CreateTestBitmaps(original_bitmap_sizes), + original_bitmap_sizes); } void UpdateFaviconURLs(const std::vector<content::FaviconURL>& candidates) { - FaviconDownloader::DidUpdateFaviconURL(candidates); + WebAppIconDownloader::DidUpdateFaviconURL(candidates); } void set_initial_favicon_urls(const std::vector<content::FaviconURL>& urls) { @@ -99,14 +95,14 @@ private: std::vector<content::FaviconURL> initial_favicon_urls_; - FaviconDownloader::FaviconMap favicon_map_; + WebAppIconDownloader::FaviconMap favicon_map_; int id_counter_; - DISALLOW_COPY_AND_ASSIGN(TestFaviconDownloader); + DISALLOW_COPY_AND_ASSIGN(TestWebAppIconDownloader); }; -TEST_F(FaviconDownloaderTest, SimpleDownload) { +TEST_F(WebAppIconDownloaderTest, SimpleDownload) { const GURL favicon_url("http://www.google.com/favicon.ico"); - TestFaviconDownloader downloader(web_contents(), std::vector<GURL>()); + TestWebAppIconDownloader downloader(web_contents(), std::vector<GURL>()); std::vector<content::FaviconURL> favicon_urls; favicon_urls.push_back( @@ -127,9 +123,9 @@ histogram_tester_.ExpectUniqueSample(kTestHistogramName, 2, 1); } -TEST_F(FaviconDownloaderTest, DownloadWithUrlsFromWebContentsNotification) { +TEST_F(WebAppIconDownloaderTest, DownloadWithUrlsFromWebContentsNotification) { const GURL favicon_url("http://www.google.com/favicon.ico"); - TestFaviconDownloader downloader(web_contents(), std::vector<GURL>()); + TestWebAppIconDownloader downloader(web_contents(), std::vector<GURL>()); std::vector<content::FaviconURL> favicon_urls; favicon_urls.push_back( @@ -153,7 +149,7 @@ histogram_tester_.ExpectUniqueSample(kTestHistogramName, 2, 1); } -TEST_F(FaviconDownloaderTest, DownloadMultipleUrls) { +TEST_F(WebAppIconDownloaderTest, DownloadMultipleUrls) { const GURL empty_favicon("http://www.google.com/empty_favicon.ico"); const GURL favicon_url_1("http://www.google.com/favicon.ico"); const GURL favicon_url_2("http://www.google.com/favicon2.ico"); @@ -164,7 +160,7 @@ // This is duplicated in the favicon urls and should only be downloaded once. extra_urls.push_back(empty_favicon); - TestFaviconDownloader downloader(web_contents(), extra_urls); + TestWebAppIconDownloader downloader(web_contents(), extra_urls); std::vector<content::FaviconURL> favicon_urls; favicon_urls.push_back(content::FaviconURL( favicon_url_1, content::FaviconURL::IconType::kFavicon, @@ -201,14 +197,14 @@ histogram_tester_.ExpectUniqueSample(kTestHistogramName, 2, 3); } -TEST_F(FaviconDownloaderTest, SkipPageFavicons) { +TEST_F(WebAppIconDownloaderTest, SkipPageFavicons) { const GURL favicon_url_1("http://www.google.com/favicon.ico"); const GURL favicon_url_2("http://www.google.com/favicon2.ico"); std::vector<GURL> extra_urls; extra_urls.push_back(favicon_url_1); - TestFaviconDownloader downloader(web_contents(), extra_urls); + TestWebAppIconDownloader downloader(web_contents(), extra_urls); // This favicon URL should be ignored. std::vector<content::FaviconURL> favicon_urls;
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 2401118b..e37b1c2 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -208,7 +208,7 @@ // Enables or disables windowing related features for desktop PWAs. const base::Feature kDesktopPWAWindowing { "DesktopPWAWindowing", -#if defined(OS_CHROMEOS) +#if defined(OS_CHROMEOS) || defined(OS_WIN) || defined(OS_LINUX) base::FEATURE_ENABLED_BY_DEFAULT #else base::FEATURE_DISABLED_BY_DEFAULT
diff --git a/chrome/common/extensions/api/_api_features.json b/chrome/common/extensions/api/_api_features.json index 908164e..0b59bc10 100644 --- a/chrome/common/extensions/api/_api_features.json +++ b/chrome/common/extensions/api/_api_features.json
@@ -91,6 +91,10 @@ "dependencies": ["permission:appview"], "contexts": ["blessed_extension"] }, + "arcAppsPrivate": { + "dependencies": ["permission:arcAppsPrivate"], + "contexts": ["blessed_extension"] + }, "autofillPrivate": [{ "dependencies": ["permission:autofillPrivate"], "contexts": ["blessed_extension"]
diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json index c2e1a32d..1db083d 100644 --- a/chrome/common/extensions/api/_permission_features.json +++ b/chrome/common/extensions/api/_permission_features.json
@@ -47,6 +47,14 @@ "5107DE9024C329EEA9C9A72D94C16723790C6422" // Apps Developer Tool Dev. ] }, + "arcAppsPrivate": { + "channel": "trunk", + "extension_types": ["platform_app"], + "whitelist": [ + "D8524F339305807AB2439035774F746F739D0983" // Test platform app + // TODO(crbug.com/819404): Whitelist the Highlights app. + ] + }, "autofillPrivate": { "channel": "trunk", "extension_types": ["extension", "platform_app"],
diff --git a/chrome/common/extensions/api/api_sources.gni b/chrome/common/extensions/api/api_sources.gni index 412e2f18..ea34622 100644 --- a/chrome/common/extensions/api/api_sources.gni +++ b/chrome/common/extensions/api/api_sources.gni
@@ -90,6 +90,7 @@ if (is_chromeos) { schema_sources_ += [ + "arc_apps_private.idl", "certificate_provider.idl", "certificate_provider_internal.idl", "easy_unlock_private.idl",
diff --git a/chrome/common/extensions/api/arc_apps_private.idl b/chrome/common/extensions/api/arc_apps_private.idl new file mode 100644 index 0000000..c6ac109 --- /dev/null +++ b/chrome/common/extensions/api/arc_apps_private.idl
@@ -0,0 +1,30 @@ +// Copyright 2018 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. + +// Use the <code>chrome.arcAppsPrivate</code> API to manage ARC apps. +[platforms=("chromeos"), + implemented_in="chrome/browser/chromeos/extensions/arc_apps_private_api.h", + nodoc] +namespace arcAppsPrivate { + + dictionary AppInfo { + // The app id. + DOMString id; + }; + + callback VoidCallback = void (); + callback GetLaunchableAppsCallback = void (AppInfo[] apps_info); + + interface Functions { + // Returns info of the installed ARC apps that are launchable, including + // ready and non-ready apps. + static void getLaunchableApps(GetLaunchableAppsCallback callback); + + // Launches the ARC app with |app_id|, which must be returned by + // |getLaunchableApps|. The app is launched immediately if it's ready, + // otherwise it will be launched when it becomes ready. The callback is + // called as soon as the launch is scheduled. + static void launchApp(DOMString app_id, optional VoidCallback callback); + }; +}; \ No newline at end of file
diff --git a/chrome/common/extensions/permissions/chrome_api_permissions.cc b/chrome/common/extensions/permissions/chrome_api_permissions.cc index bd278e9..83af3c74 100644 --- a/chrome/common/extensions/permissions/chrome_api_permissions.cc +++ b/chrome/common/extensions/permissions/chrome_api_permissions.cc
@@ -188,6 +188,7 @@ {APIPermission::kResourcesPrivate, "resourcesPrivate", APIPermissionInfo::kFlagCannotBeOptional}, {APIPermission::kSafeBrowsingPrivate, "safeBrowsingPrivate"}, + {APIPermission::kArcAppsPrivate, "arcAppsPrivate"}, // Full url access permissions. {APIPermission::kDebugger, "debugger",
diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc index 47d3a91..5619fdf 100644 --- a/chrome/common/extensions/permissions/permission_set_unittest.cc +++ b/chrome/common/extensions/permissions/permission_set_unittest.cc
@@ -823,6 +823,7 @@ // These are private. skip.insert(APIPermission::kAccessibilityPrivate); + skip.insert(APIPermission::kArcAppsPrivate); skip.insert(APIPermission::kAutoTestPrivate); skip.insert(APIPermission::kBookmarkManagerPrivate); skip.insert(APIPermission::kBrailleDisplayPrivate);
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index d56dc0ba..a7639af 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -2512,6 +2512,7 @@ #endif #if BUILDFLAG(ENABLE_OFFLINE_PAGES) +const char kOfflinePrefetchEnabled[] = "offline_prefetch.enabled"; const char kOfflinePrefetchBackoff[] = "offline_prefetch.backoff"; // The following set of Prefs is used by OfflineMetricsCollectorImpl to
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index d2184936b..09d1b496 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -877,6 +877,7 @@ #endif #if BUILDFLAG(ENABLE_OFFLINE_PAGES) +extern const char kOfflinePrefetchEnabled[]; extern const char kOfflinePrefetchBackoff[]; extern const char kOfflineUsageStartObserved[]; extern const char kOfflineUsageOnlineObserved[];
diff --git a/chrome/installer/linux/BUILD.gn b/chrome/installer/linux/BUILD.gn index ca093fd..de0836f 100644 --- a/chrome/installer/linux/BUILD.gn +++ b/chrome/installer/linux/BUILD.gn
@@ -53,6 +53,10 @@ [ "$root_out_dir/$widevine_cdm_path/libwidevinecdm.so" ] } +if (!libcpp_is_static && use_custom_libcxx) { + packaging_files_shlibs += [ "$root_out_dir/libc++.so" ] +} + packaging_files_binaries = packaging_files_executables + packaging_files_shlibs # TODO(mmoss) Any convenient way to get all the relevant build files? @@ -369,6 +373,10 @@ if (!is_chromeos) { public_deps += [ ":rpm_packaging_files" ] } + + if (!libcpp_is_static && use_custom_libcxx) { + public_deps += [ "//buildtools/third_party/libc++:libc++" ] + } } # Creates .deb and .rpm (RPM for non-ChromeOS only) installer packages.
diff --git a/chrome/renderer/searchbox/searchbox_extension.cc b/chrome/renderer/searchbox/searchbox_extension.cc index 49ce578..05d2288b 100644 --- a/chrome/renderer/searchbox/searchbox_extension.cc +++ b/chrome/renderer/searchbox/searchbox_extension.cc
@@ -835,10 +835,8 @@ if (!ntp_tiles::IsCustomLinksEnabled()) return; SearchBox* search_box = GetSearchBoxForCurrentContext(); - if (!search_box || !(HasOrigin(GURL(chrome::kChromeSearchMostVisitedUrl)) || - HasOrigin(GURL(chrome::kChromeSearchLocalNtpUrl)))) { + if (!search_box || !HasOrigin(GURL(chrome::kChromeSearchMostVisitedUrl))) return; - } search_box->ResetCustomLinks(); }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 61a5adab..8876571 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1567,6 +1567,7 @@ "../browser/chromeos/drive/drive_integration_service_browsertest.cc", "../browser/chromeos/extensions/accessibility_features_apitest.cc", "../browser/chromeos/extensions/action_handlers/action_handlers_apitest.cc", + "../browser/chromeos/extensions/arc_apps_private_apitest.cc", "../browser/chromeos/extensions/default_keyboard_extension_browser_test.cc", "../browser/chromeos/extensions/default_keyboard_extension_browser_test.h", "../browser/chromeos/extensions/echo_private_apitest.cc", @@ -2837,6 +2838,7 @@ "//device/base:mocks", "//device/bluetooth:mocks", "//device/usb:test_support", + "//device/usb/mojo:test_support", "//extensions/buildflags", "//google_apis", "//gpu:test_support", @@ -2890,6 +2892,7 @@ "../browser/offline_pages/offline_page_utils_unittest.cc", "../browser/offline_pages/prefetch/offline_metrics_collector_impl_unittest.cc", "../browser/offline_pages/prefetch/prefetch_background_task_handler_impl_unittest.cc", + "../browser/offline_pages/prefetch/prefetch_configuration_impl_unittest.cc", "../browser/offline_pages/prefetch/prefetch_instance_id_proxy_unittest.cc", "../browser/offline_pages/prefetch/prefetched_pages_notifier_unittest.cc", "../browser/offline_pages/prefetch/thumbnail_fetcher_impl_unittest.cc", @@ -3137,6 +3140,7 @@ "../browser/usb/usb_chooser_context_unittest.cc", "../browser/usb/usb_chooser_controller_unittest.cc", "../browser/usb/web_usb_detector_unittest.cc", + "../browser/usb/web_usb_device_manager_unittest.cc", # The importer code is not used on Android. "../common/importer/firefox_importer_utils_unittest.cc", @@ -3546,7 +3550,6 @@ "../browser/extensions/external_pref_loader_unittest.cc", "../browser/extensions/external_provider_impl_chromeos_unittest.cc", "../browser/extensions/external_provider_impl_unittest.cc", - "../browser/extensions/favicon_downloader_unittest.cc", "../browser/extensions/forced_extensions/installation_tracker_unittest.cc", "../browser/extensions/install_tracker_unittest.cc", "../browser/extensions/install_verifier_unittest.cc",
diff --git a/chrome/test/base/in_process_browser_test.cc b/chrome/test/base/in_process_browser_test.cc index 5aba7401..466f44c1 100644 --- a/chrome/test/base/in_process_browser_test.cc +++ b/chrome/test/base/in_process_browser_test.cc
@@ -53,7 +53,7 @@ #include "chrome/test/base/chrome_test_suite.h" #include "chrome/test/base/test_launcher_utils.h" #include "chrome/test/base/testing_browser_process.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/os_crypt/os_crypt_mocker.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/notification_service.h"
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py index 39db8395..393ca05 100755 --- a/chrome/test/chromedriver/test/run_py_tests.py +++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -80,9 +80,6 @@ 'MobileEmulationCapabilityTest.testClickElement', 'MobileEmulationCapabilityTest.testNetworkConnectionTypeIsAppliedToAllTabs', 'MobileEmulationCapabilityTest.testNetworkConnectionTypeIsAppliedToAllTabsImmediately', - # Flaky on Win. See http://crbug.com/865842. - 'ChromeDriverTest.testCanClickInIframes', - 'ChromeDriverTest.testMoveToElementAndClick' ] _VERSION_SPECIFIC_FILTER = {}
diff --git a/chrome/test/data/background_fetch/sw.js b/chrome/test/data/background_fetch/sw.js index f1331964..e6203c0 100644 --- a/chrome/test/data/background_fetch/sw.js +++ b/chrome/test/data/background_fetch/sw.js
@@ -14,5 +14,12 @@ } // Background Fetch event listeners. -self.addEventListener('backgroundfetched', e => postToWindowClients(e.type)); -self.addEventListener('backgroundfetchfail', e => postToWindowClients(e.type)); \ No newline at end of file +self.addEventListener('backgroundfetched', e => { + e.waitUntil(e.updateUI({title: 'New Fetched Title!'}).then( + () => postToWindowClients(e.type))); +}); + +self.addEventListener('backgroundfetchfail', e => { + e.waitUntil(e.updateUI({title: 'New Failed Title!'}).then( + () => postToWindowClients(e.type))); +}); \ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/arc_app_launcher/manifest.json b/chrome/test/data/extensions/api_test/arc_app_launcher/manifest.json new file mode 100644 index 0000000..deee5a5 --- /dev/null +++ b/chrome/test/data/extensions/api_test/arc_app_launcher/manifest.json
@@ -0,0 +1,12 @@ +{ + "key": "MIGqAgEAAiEAuTqZKXReYjq0LqmxcPXj5BhO4l43YRxiPm1A+Y6IqG8CAwEAAQIhAIwbSucUYqAij1AMg29STwFbL08USDm7SxcNgsW7aJzhAhEA6cjXcL5MFxl2geM2ZowcTQIRAMrUkXe2RyL2wuBDnV0VRasCEAkABWM+wDknbsuDTsXV4QUCEA5o66zFlmg1f8LPCu8CA+ECEC2UbOIhswH8ZhEictgqd5k=", + "name": "Launch Arc Apps test app", + "version": "1", + "manifest_version": 2, + "permissions": ["arcAppsPrivate"], + "app": { + "background": { + "scripts": ["test.js"] + } + } +} \ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/arc_app_launcher/test.js b/chrome/test/data/extensions/api_test/arc_app_launcher/test.js new file mode 100644 index 0000000..6a21a73f --- /dev/null +++ b/chrome/test/data/extensions/api_test/arc_app_launcher/test.js
@@ -0,0 +1,27 @@ +// Copyright 2018 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. + +chrome.app.runtime.onLaunched.addListener(function() { + var EXPECTED_APP_ID = null; + + chrome.test.runTests([ + function getConfig() { + chrome.test.getConfig(chrome.test.callbackPass(config => { + EXPECTED_APP_ID = config.customArg; + })); + }, + + function getAppIdAndLaunchApp() { + chrome.arcAppsPrivate.launchApp( + 'invalid app id', chrome.test.callbackFail('Launch failed')); + chrome.test.assertTrue(!!EXPECTED_APP_ID); + chrome.arcAppsPrivate.getLaunchableApps( + chrome.test.callbackPass(appsInfo => { + chrome.test.assertEq([{id: EXPECTED_APP_ID}], appsInfo); + chrome.arcAppsPrivate.launchApp( + appsInfo[0].id, chrome.test.callbackPass()); + })); + } + ]); +}); \ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/worker/background.js b/chrome/test/data/extensions/api_test/worker/background.js index 47fe310..a16517a 100644 --- a/chrome/test/data/extensions/api_test/worker/background.js +++ b/chrome/test/data/extensions/api_test/worker/background.js
@@ -101,13 +101,11 @@ crossOriginRedirectTest.bind( undefined, () => { return new Worker(crossOriginRedirectedWorkerUrl) }), - // TODO(crbug.com/861965): Forbid cross-origin redirects for module - // dedicated workers. - // crossOriginRedirectTest.bind( - // undefined, - // () => { - // return new Worker(crossOriginRedirectedWorkerUrl, {type: 'module'}); - // }), + crossOriginRedirectTest.bind( + undefined, + () => { + return new Worker(crossOriginRedirectedWorkerUrl, {type: 'module'}); + }), crossOriginRedirectTest.bind( undefined, () => { return new SharedWorker(crossOriginRedirectedSharedWorkerUrl) }),
diff --git a/chrome/test/vr/auto_bisect.py b/chrome/test/vr/auto_bisect.py index 9235e38..5f2e4f1 100755 --- a/chrome/test/vr/auto_bisect.py +++ b/chrome/test/vr/auto_bisect.py
@@ -359,10 +359,10 @@ '${platform}:git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c', '.swarming_module:infra/tools/luci/vpython-native/' - '${platform}:git_revision:b9c4670197dcefd8762d6e509302acd3efc6e303', + '${platform}:git_revision:03693197fef4b7d6f2d717f99e9e616bb4f4d8a8', '.swarming_module:infra/tools/luci/vpython/' - '${platform}:git_revision:b9c4670197dcefd8762d6e509302acd3efc6e303', + '${platform}:git_revision:03693197fef4b7d6f2d717f99e9e616bb4f4d8a8', ] for package in cipd_packages: swarming_args.extend(['--cipd-package', package])
diff --git a/chrome_elf/third_party_dlls/main_unittest.cc b/chrome_elf/third_party_dlls/main_unittest.cc index 5b58213a..3fe18a5c7 100644 --- a/chrome_elf/third_party_dlls/main_unittest.cc +++ b/chrome_elf/third_party_dlls/main_unittest.cc
@@ -18,6 +18,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/test_reg_util_win.h" #include "base/test/test_timeouts.h" +#include "build/build_config.h" #include "chrome/install_static/install_util.h" #include "chrome_elf/nt_registry/nt_registry.h" #include "chrome_elf/sha1/sha1.h" @@ -487,8 +488,15 @@ 0); } +// Flaky: crbug.com/868233 +#if defined(OS_WIN) +#define MAYBE_PathCaseSensitive DISABLED_PathCaseSensitive +#else +#define MAYBE_PathCaseSensitive PathCaseSensitive +#endif + // Test that full section path is left alone, in terms of case. -TEST_F(ThirdPartyTest, PathCaseSensitive) { +TEST_F(ThirdPartyTest, MAYBE_PathCaseSensitive) { // Rename module to have mixed case. ASSERT_TRUE(MakeFileCopy(GetExeDir(), kTestDllName2, GetScopedTempDirValue(), kTestDllName1MixedCase));
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn index d3e3eda..cc811c4 100644 --- a/chromecast/browser/BUILD.gn +++ b/chromecast/browser/BUILD.gn
@@ -305,8 +305,8 @@ } deps += [ - "//chromecast/common/extensions_api:api_registration_bundle_generator_registration", - "//chromecast/common/extensions_api:api_schema_generator", + "//chromecast/common/extensions_api:api", + "//chromecast/common/extensions_api:api_registration", "//components/guest_view/browser", "//components/keyed_service/content", "//components/pref_registry",
diff --git a/chromecast/common/BUILD.gn b/chromecast/common/BUILD.gn index c2e4faa..88a77dd 100644 --- a/chromecast/common/BUILD.gn +++ b/chromecast/common/BUILD.gn
@@ -43,12 +43,11 @@ deps += [ "//chromecast/common/extensions_api:api", "//chromecast/common/extensions_api:api_registration", - "//chromecast/common/extensions_api:api_schema_generator", "//chromecast/common/extensions_api:extensions_features", "//components/version_info", "//extensions:extensions_resources_grd_grit", "//extensions/common", - "//extensions/common/api:generated_api_bundle_generator_schema", + "//extensions/common/api:generated_api", "//extensions/shell:resources", "//extensions/shell:resources_grit", ]
diff --git a/chromecast/media/cma/backend/fuchsia/mixer_output_stream_fuchsia.cc b/chromecast/media/cma/backend/fuchsia/mixer_output_stream_fuchsia.cc index 74f5ca90..880d41a7 100644 --- a/chromecast/media/cma/backend/fuchsia/mixer_output_stream_fuchsia.cc +++ b/chromecast/media/cma/backend/fuchsia/mixer_output_stream_fuchsia.cc
@@ -54,11 +54,11 @@ fit::bind_member(this, &MixerOutputStreamFuchsia::OnRendererError)); // Configure the renderer. - fuchsia::media::AudioPcmFormat format; + fuchsia::media::AudioStreamType format; format.sample_format = fuchsia::media::AudioSampleFormat::FLOAT; format.channels = channels_; format.frames_per_second = sample_rate_; - audio_renderer_->SetPcmFormat(std::move(format)); + audio_renderer_->SetPcmStreamType(std::move(format)); // Use number of samples to specify media position. audio_renderer_->SetPtsUnits(sample_rate_, 1);
diff --git a/chromeos/dbus/concierge_client.cc b/chromeos/dbus/concierge_client.cc index 2359d4dc..3a713195 100644 --- a/chromeos/dbus/concierge_client.cc +++ b/chromeos/dbus/concierge_client.cc
@@ -112,8 +112,11 @@ return; } + // TODO(nverne): revert to TIMEOUT_USE_DEFAULT when StartVm no longer + // requires unnecessary long running crypto calculations. + constexpr int kStartVmTimeoutMs = 160 * 1000; concierge_proxy_->CallMethod( - &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + &method_call, kStartVmTimeoutMs, base::BindOnce(&ConciergeClientImpl::OnDBusProtoResponse< vm_tools::concierge::StartVmResponse>, weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
diff --git a/chromeos/dbus/cros_disks_client.cc b/chromeos/dbus/cros_disks_client.cc index 885f9d62..01e74258 100644 --- a/chromeos/dbus/cros_disks_client.cc +++ b/chromeos/dbus/cros_disks_client.cc
@@ -146,18 +146,6 @@ weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } - // CrosDisksClient override. - void EnumerateAutoMountableDevices( - const EnumerateDevicesCallback& callback, - const base::Closure& error_callback) override { - dbus::MethodCall method_call(cros_disks::kCrosDisksInterface, - cros_disks::kEnumerateAutoMountableDevices); - proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, - base::BindOnce(&CrosDisksClientImpl::OnEnumerateDevices, - weak_ptr_factory_.GetWeakPtr(), callback, - error_callback)); - } - void EnumerateDevices(const EnumerateDevicesCallback& callback, const base::Closure& error_callback) override { dbus::MethodCall method_call(cros_disks::kCrosDisksInterface,
diff --git a/chromeos/dbus/cros_disks_client.h b/chromeos/dbus/cros_disks_client.h index db0e191..c77a8d6 100644 --- a/chromeos/dbus/cros_disks_client.h +++ b/chromeos/dbus/cros_disks_client.h
@@ -267,8 +267,8 @@ // by callbacks. class CHROMEOS_EXPORT CrosDisksClient : public DBusClient { public: - // A callback to handle the result of EnumerateAutoMountableDevices and - // EnumerateDevices. The argument is the enumerated device paths. + // A callback to handle the result of EnumerateDevices. + // The argument is the enumerated device paths. typedef base::Callback<void(const std::vector<std::string>& device_paths)> EnumerateDevicesCallback; @@ -334,12 +334,6 @@ UnmountOptions options, VoidDBusMethodCallback callback) = 0; - // Calls EnumerateAutoMountableDevices method. |callback| is called after the - // method call succeeds, otherwise, |error_callback| is called. - virtual void EnumerateAutoMountableDevices( - const EnumerateDevicesCallback& callback, - const base::Closure& error_callback) = 0; - // Calls EnumerateDevices method. |callback| is called after the // method call succeeds, otherwise, |error_callback| is called. virtual void EnumerateDevices(const EnumerateDevicesCallback& callback,
diff --git a/chromeos/dbus/fake_cros_disks_client.cc b/chromeos/dbus/fake_cros_disks_client.cc index 88a239e..645e4835 100644 --- a/chromeos/dbus/fake_cros_disks_client.cc +++ b/chromeos/dbus/fake_cros_disks_client.cc
@@ -169,10 +169,6 @@ unmount_listener_.Run(); } -void FakeCrosDisksClient::EnumerateAutoMountableDevices( - const EnumerateDevicesCallback& callback, - const base::Closure& error_callback) {} - void FakeCrosDisksClient::EnumerateDevices( const EnumerateDevicesCallback& callback, const base::Closure& error_callback) {}
diff --git a/chromeos/dbus/fake_cros_disks_client.h b/chromeos/dbus/fake_cros_disks_client.h index e22bd422..f2284f2 100644 --- a/chromeos/dbus/fake_cros_disks_client.h +++ b/chromeos/dbus/fake_cros_disks_client.h
@@ -47,9 +47,6 @@ void Unmount(const std::string& device_path, UnmountOptions options, VoidDBusMethodCallback callback) override; - void EnumerateAutoMountableDevices( - const EnumerateDevicesCallback& callback, - const base::Closure& error_callback) override; void EnumerateDevices(const EnumerateDevicesCallback& callback, const base::Closure& error_callback) override; void EnumerateMountEntries(const EnumerateMountEntriesCallback& callback,
diff --git a/chromeos/dbus/services/vm_applications_service_provider.cc b/chromeos/dbus/services/vm_applications_service_provider.cc index de391173..cc8d5893 100644 --- a/chromeos/dbus/services/vm_applications_service_provider.cc +++ b/chromeos/dbus/services/vm_applications_service_provider.cc
@@ -27,6 +27,13 @@ weak_ptr_factory_.GetWeakPtr()), base::BindRepeating(&VmApplicationsServiceProvider::OnExported, weak_ptr_factory_.GetWeakPtr())); + exported_object->ExportMethod( + vm_tools::apps::kVmApplicationsServiceInterface, + vm_tools::apps::kVmApplicationsServiceLaunchTerminalMethod, + base::BindRepeating(&VmApplicationsServiceProvider::LaunchTerminal, + weak_ptr_factory_.GetWeakPtr()), + base::BindRepeating(&VmApplicationsServiceProvider::OnExported, + weak_ptr_factory_.GetWeakPtr())); } void VmApplicationsServiceProvider::OnExported( @@ -57,4 +64,24 @@ response_sender.Run(dbus::Response::FromMethodCall(method_call)); } +void VmApplicationsServiceProvider::LaunchTerminal( + dbus::MethodCall* method_call, + dbus::ExportedObject::ResponseSender response_sender) { + dbus::MessageReader reader(method_call); + + vm_tools::apps::TerminalParams request; + + if (!reader.PopArrayOfBytesAsProto(&request)) { + constexpr char error_message[] = + "Unable to parse TerminalParams from message"; + LOG(ERROR) << error_message; + response_sender.Run(dbus::ErrorResponse::FromMethodCall( + method_call, DBUS_ERROR_INVALID_ARGS, error_message)); + return; + } + + delegate_->LaunchTerminal(request); + response_sender.Run(dbus::Response::FromMethodCall(method_call)); +} + } // namespace chromeos
diff --git a/chromeos/dbus/services/vm_applications_service_provider.h b/chromeos/dbus/services/vm_applications_service_provider.h index 04e65981..88c7db8 100644 --- a/chromeos/dbus/services/vm_applications_service_provider.h +++ b/chromeos/dbus/services/vm_applications_service_provider.h
@@ -21,6 +21,7 @@ namespace vm_tools { namespace apps { class ApplicationList; +class TerminalParams; } // namespace apps } // namespace vm_tools @@ -40,6 +41,8 @@ virtual void UpdateApplicationList( const vm_tools::apps::ApplicationList& app_list) = 0; + virtual void LaunchTerminal( + const vm_tools::apps::TerminalParams& terminal_params) = 0; private: DISALLOW_COPY_AND_ASSIGN(Delegate); @@ -62,6 +65,8 @@ void UpdateApplicationList( dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender); + void LaunchTerminal(dbus::MethodCall* method_call, + dbus::ExportedObject::ResponseSender response_sender); std::unique_ptr<Delegate> delegate_;
diff --git a/components/arc/intent_helper/DEPS b/components/arc/intent_helper/DEPS index 18765ba0..8deb491 100644 --- a/components/arc/intent_helper/DEPS +++ b/components/arc/intent_helper/DEPS
@@ -5,7 +5,7 @@ "+ash/public", "+ash/shell.h", "+ash/shell_delegate.h", - "+components/google/core/browser", + "+components/google/core", "+components/url_formatter", "+content/public/common/service_manager_connection.h", "+services/service_manager/public/cpp/connector.h",
diff --git a/components/arc/intent_helper/link_handler_model.cc b/components/arc/intent_helper/link_handler_model.cc index 748515b5..5d045f8 100644 --- a/components/arc/intent_helper/link_handler_model.cc +++ b/components/arc/intent_helper/link_handler_model.cc
@@ -12,7 +12,7 @@ #include "components/arc/arc_bridge_service.h" #include "components/arc/arc_service_manager.h" #include "components/arc/intent_helper/arc_intent_helper_bridge.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "url/url_util.h" namespace arc {
diff --git a/components/arc/metrics/arc_metrics_constants.h b/components/arc/metrics/arc_metrics_constants.h index 41df5d7d..aa46a6d8 100644 --- a/components/arc/metrics/arc_metrics_constants.h +++ b/components/arc/metrics/arc_metrics_constants.h
@@ -52,6 +52,9 @@ // TODO(crbug.com/855381): Record this. APP_CONTENT_WINDOW_INTERACTION = 11, + // User started an app from chrome.arcAppsPrivate.launchApp. + APP_STARTED_FROM_EXTENSION_API = 12, + // The size of this enum; keep last. SIZE, };
diff --git a/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc b/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc index 1f9c88f0..50c00da 100644 --- a/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc +++ b/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc
@@ -93,9 +93,10 @@ input_pixel_format_ = input_format; visible_size_ = visible_size; + const media::VideoEncodeAccelerator::Config config( + input_pixel_format_, visible_size_, output_profile, initial_bitrate); accelerator_ = media::GpuVideoEncodeAcceleratorFactory::CreateVEA( - input_pixel_format_, visible_size_, output_profile, initial_bitrate, this, - gpu_preferences_); + config, this, gpu_preferences_); if (accelerator_ == nullptr) { DLOG(ERROR) << "Failed to create a VideoEncodeAccelerator."; std::move(callback).Run(false);
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc index a448ffc6..74f7b0a3 100644 --- a/components/bookmarks/browser/bookmark_model.cc +++ b/components/bookmarks/browser/bookmark_model.cc
@@ -154,7 +154,7 @@ store_ = std::make_unique<BookmarkStorage>(this, profile_path, io_task_runner.get()); // Creating ModelLoader schedules the load on |io_task_runner|. - model_loader_ = base::MakeRefCounted<ModelLoader>( + model_loader_ = ModelLoader::Create( profile_path.Append(kBookmarksFileName), io_task_runner.get(), std::make_unique<BookmarkLoadDetails>(client_.get()), base::BindOnce(&BookmarkModel::DoneLoading, weak_factory_.GetWeakPtr()));
diff --git a/components/bookmarks/browser/model_loader.cc b/components/bookmarks/browser/model_loader.cc index a20019b..f1316cd 100644 --- a/components/bookmarks/browser/model_loader.cc +++ b/components/bookmarks/browser/model_loader.cc
@@ -12,23 +12,31 @@ namespace bookmarks { -ModelLoader::ModelLoader(const base::FilePath& profile_path, - base::SequencedTaskRunner* load_sequenced_task_runner, - std::unique_ptr<BookmarkLoadDetails> details, - LoadCallback callback) - : loaded_signal_(base::WaitableEvent::ResetPolicy::MANUAL, - base::WaitableEvent::InitialState::NOT_SIGNALED) { +// static +scoped_refptr<ModelLoader> ModelLoader::Create( + const base::FilePath& profile_path, + base::SequencedTaskRunner* load_sequenced_task_runner, + std::unique_ptr<BookmarkLoadDetails> details, + LoadCallback callback) { + // Note: base::MakeRefCounted is not available here, as ModelLoader's + // constructor is private. + auto model_loader = base::WrapRefCounted(new ModelLoader()); load_sequenced_task_runner->PostTask( FROM_HERE, - base::BindOnce(&ModelLoader::DoLoadOnBackgroundThread, this, profile_path, - base::ThreadTaskRunnerHandle::Get(), std::move(details), - std::move(callback))); + base::BindOnce(&ModelLoader::DoLoadOnBackgroundThread, model_loader, + profile_path, base::ThreadTaskRunnerHandle::Get(), + std::move(details), std::move(callback))); + return model_loader; } void ModelLoader::BlockTillLoaded() { loaded_signal_.Wait(); } +ModelLoader::ModelLoader() + : loaded_signal_(base::WaitableEvent::ResetPolicy::MANUAL, + base::WaitableEvent::InitialState::NOT_SIGNALED) {} + ModelLoader::~ModelLoader() = default; void ModelLoader::DoLoadOnBackgroundThread(
diff --git a/components/bookmarks/browser/model_loader.h b/components/bookmarks/browser/model_loader.h index 924c17e..1a1477cb 100644 --- a/components/bookmarks/browser/model_loader.h +++ b/components/bookmarks/browser/model_loader.h
@@ -33,10 +33,11 @@ // Creates the ModelLoader, and schedules loading on // |load_sequenced_task_runner|. |callback| is run once loading // completes (on the main thread). - ModelLoader(const base::FilePath& profile_path, - base::SequencedTaskRunner* load_sequenced_task_runner, - std::unique_ptr<BookmarkLoadDetails> details, - LoadCallback callback); + static scoped_refptr<ModelLoader> Create( + const base::FilePath& profile_path, + base::SequencedTaskRunner* load_sequenced_task_runner, + std::unique_ptr<BookmarkLoadDetails> details, + LoadCallback callback); // Blocks until loaded. This is intended for usage on a thread other than // the main thread. @@ -50,6 +51,7 @@ private: friend class base::RefCountedThreadSafe<ModelLoader>; + ModelLoader(); ~ModelLoader(); // Performs the load on a background thread.
diff --git a/components/download/database/download_db.h b/components/download/database/download_db.h index c77cf2e8..321df4f 100644 --- a/components/download/database/download_db.h +++ b/components/download/database/download_db.h
@@ -5,6 +5,7 @@ #ifndef COMPONENTS_DOWNLOAD_DATABASE_DOWNLOAD_DB_H_ #define COMPONENTS_DOWNLOAD_DATABASE_DOWNLOAD_DB_H_ +#include <memory> #include <string> #include "base/callback_forward.h"
diff --git a/components/drive/chromeos/search_metadata.cc b/components/drive/chromeos/search_metadata.cc index 5c80e66b..f588d35 100644 --- a/components/drive/chromeos/search_metadata.cc +++ b/components/drive/chromeos/search_metadata.cc
@@ -5,6 +5,7 @@ #include "components/drive/chromeos/search_metadata.h" #include <algorithm> +#include <map> #include <queue> #include <utility> @@ -85,9 +86,11 @@ HiddenEntryClassifier(ResourceMetadata* metadata, const std::string& mydrive_local_id) : metadata_(metadata) { - // Only things under My Drive and drive/other are not hidden. + // Only things under My Drive, drive/other and drive/team_drives are not + // hidden. is_hiding_child_[mydrive_local_id] = false; is_hiding_child_[util::kDriveOtherDirLocalId] = false; + is_hiding_child_[util::kDriveTeamDrivesDirLocalId] = false; // Everything else is hidden, including the directories mentioned above // themselves.
diff --git a/components/drive/chromeos/search_metadata.h b/components/drive/chromeos/search_metadata.h index a6a5d41..9237438 100644 --- a/components/drive/chromeos/search_metadata.h +++ b/components/drive/chromeos/search_metadata.h
@@ -25,7 +25,8 @@ class ResourceMetadata; -typedef base::Callback<bool(const ResourceEntry&)> SearchMetadataPredicate; +typedef base::RepeatingCallback<bool(const ResourceEntry&)> + SearchMetadataPredicate; // Searches the local resource metadata, and returns the entries // |at_most_num_matches| that contain |query| in their base names. Search is
diff --git a/components/drive/search_metadata_unittest.cc b/components/drive/search_metadata_unittest.cc index 635c728..79861ca 100644 --- a/components/drive/search_metadata_unittest.cc +++ b/components/drive/search_metadata_unittest.cc
@@ -146,6 +146,26 @@ entry.mutable_file_specific_info()->set_content_mime_type( drive::util::kGoogleDocumentMimeType); EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry(entry, &local_id)); + + // drive/team_drives + EXPECT_EQ(FILE_ERROR_OK, + resource_metadata_->GetIdByPath( + util::GetDriveTeamDrivesRootPath(), &local_id)); + const std::string team_drive_root_local_id = local_id; + + // drive/team_drives/TD-1 + EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry( + GetDirectoryEntry("TD-1", "team_drive1", 1, 1, + team_drive_root_local_id), + &local_id)); + const std::string team_drive_dir1_local_id = local_id; + + // drive/team_drives/TD-1/TD File 1.txt + EXPECT_EQ(FILE_ERROR_OK, + resource_metadata_->AddEntry( + GetFileEntry("TD File 1.txt", "team_drive1_file1a", 2, 99, + team_drive_dir1_local_id), + &local_id)); } ResourceEntry GetFileEntry(const std::string& name, @@ -219,6 +239,23 @@ result->at(0).path.AsUTF8Unsafe()); } +TEST_F(SearchMetadataTest, SearchMetadata_TeamDrive_RegularFile) { + FileError error = FILE_ERROR_FAILED; + std::unique_ptr<MetadataSearchResultVector> result; + + SearchMetadata( + base::ThreadTaskRunnerHandle::Get(), resource_metadata_.get(), + "TD File 1.txt", base::BindRepeating(&MatchesType, SEARCH_METADATA_ALL), + kDefaultAtMostNumMatches, MetadataSearchOrder::LAST_ACCESSED, + google_apis::test_util::CreateCopyResultCallback(&error, &result)); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(FILE_ERROR_OK, error); + ASSERT_TRUE(result); + ASSERT_EQ(1U, result->size()); + EXPECT_EQ("drive/team_drives/TD-1/TD File 1.txt", + result->at(0).path.AsUTF8Unsafe()); +} + // This test checks if |FindAndHighlightWrapper| does case-insensitive search. // Tricker test cases for |FindAndHighlightWrapper| can be found below. TEST_F(SearchMetadataTest, SearchMetadata_CaseInsensitiveSearch) { @@ -317,6 +354,22 @@ EXPECT_EQ("drive/root/Directory-1", result->at(0).path.AsUTF8Unsafe()); } +TEST_F(SearchMetadataTest, SearchMetadata_TeamDrive_Directory) { + FileError error = FILE_ERROR_FAILED; + std::unique_ptr<MetadataSearchResultVector> result; + + SearchMetadata( + base::ThreadTaskRunnerHandle::Get(), resource_metadata_.get(), "TD-1", + base::BindRepeating(&MatchesType, SEARCH_METADATA_ALL), + kDefaultAtMostNumMatches, MetadataSearchOrder::LAST_ACCESSED, + google_apis::test_util::CreateCopyResultCallback(&error, &result)); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(FILE_ERROR_OK, error); + ASSERT_TRUE(result); + ASSERT_EQ(1U, result->size()); + EXPECT_EQ("drive/team_drives/TD-1", result->at(0).path.AsUTF8Unsafe()); +} + TEST_F(SearchMetadataTest, SearchMetadata_HostedDocument) { FileError error = FILE_ERROR_FAILED; std::unique_ptr<MetadataSearchResultVector> result;
diff --git a/components/error_page/common/localized_error.cc b/components/error_page/common/localized_error.cc index dfb40c84..1717cca 100644 --- a/components/error_page/common/localized_error.cc +++ b/components/error_page/common/localized_error.cc
@@ -39,10 +39,6 @@ #include "base/win/windows_version.h" #endif -#if defined(OS_ANDROID) -#include "components/offline_pages/core/offline_page_feature.h" -#endif - namespace error_page { namespace { @@ -1077,15 +1073,6 @@ error_strings->SetPath({"downloadButton", "disabledMsg"}, base::Value(l10n_util::GetStringUTF16( IDS_ERRORPAGES_BUTTON_DOWNLOADING))); - - if (offline_pages::ShouldShowAlternateDinoPage()) { - // Under the experiment, we will show a disabled reload button - // in addition to an enabled download button. - error_strings->SetPath( - {"reloadButton", "msg"}, - base::Value(l10n_util::GetStringUTF16(IDS_ERRORPAGES_BUTTON_RELOAD))); - error_strings->SetKey("alternateDownloadButtonStyle", base::Value(true)); - } } #endif // defined(OS_ANDROID) }
diff --git a/components/exo/buffer.cc b/components/exo/buffer.cc index d8d97281..e18f661 100644 --- a/components/exo/buffer.cc +++ b/components/exo/buffer.cc
@@ -102,7 +102,8 @@ ~Texture() override; // Overridden from ui::ContextFactoryObserver: - void OnLostResources() override; + void OnLostSharedContext() override; + void OnLostVizProcess() override; // Returns true if GLES2 resources for texture have been lost. bool IsLost(); @@ -209,13 +210,15 @@ context_factory_->RemoveObserver(this); } -void Buffer::Texture::OnLostResources() { +void Buffer::Texture::OnLostSharedContext() { DestroyResources(); context_factory_->RemoveObserver(this); context_provider_ = nullptr; context_factory_ = nullptr; } +void Buffer::Texture::OnLostVizProcess() {} + bool Buffer::Texture::IsLost() { if (context_provider_) { gpu::gles2::GLES2Interface* gles2 = context_provider_->ContextGL();
diff --git a/components/exo/buffer_unittest.cc b/components/exo/buffer_unittest.cc index 460d61a..85a9ca9 100644 --- a/components/exo/buffer_unittest.cc +++ b/components/exo/buffer_unittest.cc
@@ -141,7 +141,7 @@ static_cast<ui::InProcessContextFactory*>( aura::Env::GetInstance()->context_factory()) - ->SendOnLostResources(); + ->SendOnLostSharedContext(); } TEST_F(BufferTest, SurfaceTreeHostDestruction) {
diff --git a/components/exo/shell_surface_base.cc b/components/exo/shell_surface_base.cc index 76219d6..6873fa4 100644 --- a/components/exo/shell_surface_base.cc +++ b/components/exo/shell_surface_base.cc
@@ -1199,10 +1199,6 @@ aura::Window* window = widget_->GetNativeWindow(); window->SetName("ExoShellSurface"); - // TODO(yawano): This needs to be set to false if TalkBack is handling this - // window. - window->SetProperty(aura::client::kAccessibilityFocusFallsbackToWidgetKey, - true); window->AddChild(host_window()); // Use DESCENDANTS_ONLY event targeting policy for mus/mash. // TODO(https://crbug.com/839521): Revisit after event dispatching code is
diff --git a/components/exo/surface_tree_host.cc b/components/exo/surface_tree_host.cc index cdf3894..53912d0 100644 --- a/components/exo/surface_tree_host.cc +++ b/components/exo/surface_tree_host.cc
@@ -195,13 +195,15 @@ //////////////////////////////////////////////////////////////////////////////// // ui::ContextFactoryObserver overrides: -void SurfaceTreeHost::OnLostResources() { +void SurfaceTreeHost::OnLostSharedContext() { if (!host_window_->GetSurfaceId().is_valid() || !root_surface_) return; root_surface_->SurfaceHierarchyResourcesLost(); SubmitCompositorFrame(); } +void SurfaceTreeHost::OnLostVizProcess() {} + //////////////////////////////////////////////////////////////////////////////// // SurfaceTreeHost, protected:
diff --git a/components/exo/surface_tree_host.h b/components/exo/surface_tree_host.h index bc519b6..89bae81d 100644 --- a/components/exo/surface_tree_host.h +++ b/components/exo/surface_tree_host.h
@@ -76,7 +76,8 @@ void OnSetApplicationId(const char* application_id) override {} // Overridden from ui::ContextFactoryObserver: - void OnLostResources() override; + void OnLostSharedContext() override; + void OnLostVizProcess() override; protected: // Call this to submit a compositor frame.
diff --git a/components/gcm_driver/BUILD.gn b/components/gcm_driver/BUILD.gn index 4455430..ac5404b 100644 --- a/components/gcm_driver/BUILD.gn +++ b/components/gcm_driver/BUILD.gn
@@ -47,9 +47,7 @@ "//components/gcm_driver/common", "//components/gcm_driver/crypto", "//components/gcm_driver/instance_id", - "//crypto", ] - deps = [ ":gcm_buildflags", "//base:i18n", @@ -67,7 +65,6 @@ "//net", "//services/identity/public/cpp", "//services/network/public/cpp", - "//services/network/public/mojom", "//url:url", ] @@ -144,7 +141,6 @@ "//net", "//services/network:test_support", "//services/network/public/cpp", - "//services/network/public/mojom", "//testing/gtest", ]
diff --git a/components/gcm_driver/DEPS b/components/gcm_driver/DEPS index d20d270..952417e 100644 --- a/components/gcm_driver/DEPS +++ b/components/gcm_driver/DEPS
@@ -18,7 +18,6 @@ "+net", "+services/identity/public", "+services/network/public/cpp", - "+services/network/public/mojom", "+services/network/test", "+third_party/leveldatabase", # Only used for tests. ]
diff --git a/components/gcm_driver/account_tracker.cc b/components/gcm_driver/account_tracker.cc index 713527b..61f31fa 100644 --- a/components/gcm_driver/account_tracker.cc +++ b/components/gcm_driver/account_tracker.cc
@@ -81,7 +81,7 @@ return; DVLOG(1) << "AVAILABLE " << account_id; - UpdateSignInState(account_id, true); + UpdateSignInState(account_id, /*is_signed_in=*/true); } void AccountTracker::OnRefreshTokenRevoked(const std::string& account_id) { @@ -89,7 +89,7 @@ "account_key", account_id); DVLOG(1) << "REVOKED " << account_id; - UpdateSignInState(account_id, false); + UpdateSignInState(account_id, /*is_signed_in=*/false); } void AccountTracker::GoogleSigninSucceeded(const std::string& account_id, @@ -102,7 +102,7 @@ for (std::vector<std::string>::const_iterator it = accounts.begin(); it != accounts.end(); ++it) { - OnRefreshTokenAvailable(*it); + UpdateSignInState(*it, /*is_signed_in=*/true); } } @@ -150,7 +150,7 @@ if (base::ContainsKey(accounts_, account_key)) { AccountState& account = accounts_[account_key]; if (!account.ids.gaia.empty()) { - UpdateSignInState(account_key, false); + UpdateSignInState(account_key, /*is_signed_in=*/false); } accounts_.erase(account_key); }
diff --git a/components/gcm_driver/fake_gcm_client.cc b/components/gcm_driver/fake_gcm_client.cc index 6115c5d2..adbb8f9 100644 --- a/components/gcm_driver/fake_gcm_client.cc +++ b/components/gcm_driver/fake_gcm_client.cc
@@ -75,9 +75,8 @@ const ChromeBuildInfo& chrome_build_info, const base::FilePath& store_path, const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + const scoped_refptr<net::URLRequestContextGetter>& + url_request_context_getter, const scoped_refptr<network::SharedURLLoaderFactory>& url_loader_factory, std::unique_ptr<Encryptor> encryptor, Delegate* delegate) {
diff --git a/components/gcm_driver/fake_gcm_client.h b/components/gcm_driver/fake_gcm_client.h index 15be54d4..e1500d0 100644 --- a/components/gcm_driver/fake_gcm_client.h +++ b/components/gcm_driver/fake_gcm_client.h
@@ -46,9 +46,8 @@ const ChromeBuildInfo& chrome_build_info, const base::FilePath& store_path, const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + const scoped_refptr<net::URLRequestContextGetter>& + url_request_context_getter, const scoped_refptr<network::SharedURLLoaderFactory>& url_loader_factory, std::unique_ptr<Encryptor> encryptor, Delegate* delegate) override;
diff --git a/components/gcm_driver/gcm_client.h b/components/gcm_driver/gcm_client.h index e8bd9d6..79a7789 100644 --- a/components/gcm_driver/gcm_client.h +++ b/components/gcm_driver/gcm_client.h
@@ -16,7 +16,6 @@ #include "components/gcm_driver/common/gcm_messages.h" #include "components/gcm_driver/gcm_activity.h" #include "components/gcm_driver/registration_info.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" template <class T> class scoped_refptr; @@ -28,6 +27,7 @@ namespace net { class IPEndPoint; +class URLRequestContextGetter; } namespace network { @@ -235,18 +235,16 @@ // |chrome_build_info|: chrome info, i.e., version, channel and etc. // |store_path|: path to the GCM store. // |blocking_task_runner|: for running blocking file tasks. - // |get_socket_factory_callback|: a callback that can accept a request for a - // network::mojom::ProxyResolvingSocketFactoryPtr. It needs to be safe to - // run on any thread. + // |url_request_context_getter|: for url requests. The GCMClient must be + // deleted before the Getter's underlying URLRequestContext. // |delegate|: the delegate whose methods will be called asynchronously in // response to events and messages. virtual void Initialize( const ChromeBuildInfo& chrome_build_info, const base::FilePath& store_path, const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + const scoped_refptr<net::URLRequestContextGetter>& + url_request_context_getter, const scoped_refptr<network::SharedURLLoaderFactory>& url_loader_factory, std::unique_ptr<Encryptor> encryptor, Delegate* delegate) = 0;
diff --git a/components/gcm_driver/gcm_client_impl.cc b/components/gcm_driver/gcm_client_impl.cc index 44a050f0..45c5cb4 100644 --- a/components/gcm_driver/gcm_client_impl.cc +++ b/components/gcm_driver/gcm_client_impl.cc
@@ -41,6 +41,7 @@ #include "google_apis/gcm/monitoring/gcm_stats_recorder.h" #include "google_apis/gcm/protocol/checkin.pb.h" #include "google_apis/gcm/protocol/mcs.pb.h" +#include "net/url_request/url_request_context.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "url/gurl.h" @@ -278,13 +279,10 @@ std::unique_ptr<ConnectionFactory> GCMInternalsBuilder::BuildConnectionFactory( const std::vector<GURL>& endpoints, const net::BackoffEntry::Policy& backoff_policy, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + net::URLRequestContext* url_request_context, GCMStatsRecorder* recorder) { - return std::make_unique<ConnectionFactoryImpl>( - endpoints, backoff_policy, std::move(get_socket_factory_callback), - recorder); + return base::WrapUnique<ConnectionFactory>(new ConnectionFactoryImpl( + endpoints, backoff_policy, url_request_context, recorder)); } GCMClientImpl::CheckinInfo::CheckinInfo() @@ -320,6 +318,7 @@ start_mode_(DELAYED_START), clock_(internals_builder_->GetClock()), gcm_store_reset_(false), + url_request_context_getter_(nullptr), periodic_checkin_ptr_factory_(this), destroying_gcm_store_ptr_factory_(this), weak_ptr_factory_(this) {} @@ -331,16 +330,16 @@ const ChromeBuildInfo& chrome_build_info, const base::FilePath& path, const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + const scoped_refptr<net::URLRequestContextGetter>& + url_request_context_getter, const scoped_refptr<network::SharedURLLoaderFactory>& url_loader_factory, std::unique_ptr<Encryptor> encryptor, GCMClient::Delegate* delegate) { DCHECK_EQ(UNINITIALIZED, state_); + DCHECK(url_request_context_getter); DCHECK(delegate); - get_socket_factory_callback_ = std::move(get_socket_factory_callback); + url_request_context_getter_ = url_request_context_getter; url_loader_factory_ = url_loader_factory; chrome_build_info_ = chrome_build_info; @@ -498,8 +497,8 @@ if (fallback_endpoint.is_valid()) endpoints.push_back(fallback_endpoint); connection_factory_ = internals_builder_->BuildConnectionFactory( - endpoints, GetGCMBackoffPolicy(), get_socket_factory_callback_, - &recorder_); + endpoints, GetGCMBackoffPolicy(), + url_request_context_getter_->GetURLRequestContext(), &recorder_); connection_factory_->SetConnectionListener(this); mcs_client_ = internals_builder_->BuildMCSClient( chrome_build_info_.version, clock_, connection_factory_.get(),
diff --git a/components/gcm_driver/gcm_client_impl.h b/components/gcm_driver/gcm_client_impl.h index 5f9edd6..d2c730a3 100644 --- a/components/gcm_driver/gcm_client_impl.h +++ b/components/gcm_driver/gcm_client_impl.h
@@ -29,7 +29,7 @@ #include "google_apis/gcm/protocol/android_checkin.pb.h" #include "google_apis/gcm/protocol/checkin.pb.h" #include "net/http/http_status_code.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" +#include "net/url_request/url_request_context_getter.h" class GURL; @@ -42,6 +42,10 @@ class DataMessageStanza; } // namespace mcs_proto +namespace net { +class URLRequestContext; +} // namespace net + namespace network { class SharedURLLoaderFactory; } // namespace network @@ -69,9 +73,7 @@ virtual std::unique_ptr<ConnectionFactory> BuildConnectionFactory( const std::vector<GURL>& endpoints, const net::BackoffEntry::Policy& backoff_policy, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + net::URLRequestContext* url_request_context, GCMStatsRecorder* recorder); }; @@ -110,9 +112,8 @@ const ChromeBuildInfo& chrome_build_info, const base::FilePath& store_path, const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + const scoped_refptr<net::URLRequestContextGetter>& + url_request_context_getter, const scoped_refptr<network::SharedURLLoaderFactory>& url_loader_factory, std::unique_ptr<Encryptor> encryptor, GCMClient::Delegate* delegate) override; @@ -368,10 +369,7 @@ bool gcm_store_reset_; std::unique_ptr<ConnectionFactory> connection_factory_; - base::RepeatingCallback<void( - network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback_; - + scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; // Controls receiving and sending of packets and reliable message queueing.
diff --git a/components/gcm_driver/gcm_client_impl_unittest.cc b/components/gcm_driver/gcm_client_impl_unittest.cc index f4404026..a2895c0e 100644 --- a/components/gcm_driver/gcm_client_impl_unittest.cc +++ b/components/gcm_driver/gcm_client_impl_unittest.cc
@@ -9,7 +9,6 @@ #include <initializer_list> #include <memory> -#include "base/bind_helpers.h" #include "base/command_line.h" #include "base/files/file_path.h" #include "base/files/file_util.h" @@ -231,9 +230,7 @@ std::unique_ptr<ConnectionFactory> BuildConnectionFactory( const std::vector<GURL>& endpoints, const net::BackoffEntry::Policy& backoff_policy, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + net::URLRequestContext* url_request_context, GCMStatsRecorder* recorder) override; private: @@ -263,9 +260,7 @@ FakeGCMInternalsBuilder::BuildConnectionFactory( const std::vector<GURL>& endpoints, const net::BackoffEntry::Policy& backoff_policy, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + net::URLRequestContext* url_request_context, GCMStatsRecorder* recorder) { return base::WrapUnique<ConnectionFactory>(new FakeConnectionFactory()); } @@ -627,7 +622,8 @@ chrome_build_info.version = kChromeVersion; chrome_build_info.product_category_for_subtypes = kProductCategoryForSubtypes; gcm_client_->Initialize( - chrome_build_info, gcm_store_path(), task_runner_, base::DoNothing(), + chrome_build_info, gcm_store_path(), task_runner_, + url_request_context_getter_, base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( &test_url_loader_factory_), base::WrapUnique<Encryptor>(new FakeEncryptor), this);
diff --git a/components/gcm_driver/gcm_desktop_utils.cc b/components/gcm_driver/gcm_desktop_utils.cc index 57c82121..e1c9cfd 100644 --- a/components/gcm_driver/gcm_desktop_utils.cc +++ b/components/gcm_driver/gcm_desktop_utils.cc
@@ -93,9 +93,7 @@ std::unique_ptr<GCMClientFactory> gcm_client_factory, PrefService* prefs, const base::FilePath& store_path, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + const scoped_refptr<net::URLRequestContextGetter>& request_context, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, version_info::Channel channel, const std::string& product_category_for_subtypes, @@ -106,8 +104,8 @@ std::move(gcm_client_factory), GetChromeBuildInfo(channel, product_category_for_subtypes), GetChannelStatusRequestUrl(channel), GetUserAgent(channel), prefs, - store_path, get_socket_factory_callback, url_loader_factory, - ui_task_runner, io_task_runner, blocking_task_runner)); + store_path, request_context, url_loader_factory, ui_task_runner, + io_task_runner, blocking_task_runner)); } } // namespace gcm
diff --git a/components/gcm_driver/gcm_desktop_utils.h b/components/gcm_driver/gcm_desktop_utils.h index 105cd20..8663fb4 100644 --- a/components/gcm_driver/gcm_desktop_utils.h +++ b/components/gcm_driver/gcm_desktop_utils.h
@@ -10,13 +10,16 @@ #include "base/memory/ref_counted.h" #include "base/sequenced_task_runner.h" #include "components/version_info/version_info.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" class PrefService; namespace base { class FilePath; } +namespace net { +class URLRequestContextGetter; +} + namespace network { class SharedURLLoaderFactory; } @@ -30,9 +33,7 @@ std::unique_ptr<GCMClientFactory> gcm_client_factory, PrefService* prefs, const base::FilePath& store_path, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + const scoped_refptr<net::URLRequestContextGetter>& request_context, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, version_info::Channel channel, const std::string& product_category_for_subtypes,
diff --git a/components/gcm_driver/gcm_driver_desktop.cc b/components/gcm_driver/gcm_driver_desktop.cc index b8c20c0..c8f6908a 100644 --- a/components/gcm_driver/gcm_driver_desktop.cc +++ b/components/gcm_driver/gcm_driver_desktop.cc
@@ -26,6 +26,7 @@ #include "components/gcm_driver/system_encryptor.h" #include "google_apis/gcm/engine/account_mapping.h" #include "net/base/ip_endpoint.h" +#include "net/url_request/url_request_context_getter.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #if defined(OS_CHROMEOS) @@ -72,9 +73,7 @@ std::unique_ptr<GCMClientFactory> gcm_client_factory, const GCMClient::ChromeBuildInfo& chrome_build_info, const base::FilePath& store_path, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + const scoped_refptr<net::URLRequestContextGetter>& request_context, std::unique_ptr<network::SharedURLLoaderFactoryInfo> loader_factory_info, const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner); void Start(GCMClient::StartMode start_mode, @@ -146,9 +145,7 @@ std::unique_ptr<GCMClientFactory> gcm_client_factory, const GCMClient::ChromeBuildInfo& chrome_build_info, const base::FilePath& store_path, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + const scoped_refptr<net::URLRequestContextGetter>& request_context, std::unique_ptr<network::SharedURLLoaderFactoryInfo> loader_factory_info, const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) { DCHECK(io_thread_->RunsTasksInCurrentSequence()); @@ -159,8 +156,7 @@ network::SharedURLLoaderFactory::Create(std::move(loader_factory_info)); gcm_client_->Initialize(chrome_build_info, store_path, blocking_task_runner, - std::move(get_socket_factory_callback), - url_loader_factory_for_io, + request_context, url_loader_factory_for_io, std::make_unique<SystemEncryptor>(), this); } @@ -531,9 +527,7 @@ const std::string& user_agent, PrefService* prefs, const base::FilePath& store_path, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + const scoped_refptr<net::URLRequestContextGetter>& request_context, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_for_ui, const scoped_refptr<base::SequencedTaskRunner>& ui_thread, const scoped_refptr<base::SequencedTaskRunner>& io_thread, @@ -568,7 +562,7 @@ base::BindOnce(&GCMDriverDesktop::IOWorker::Initialize, base::Unretained(io_worker_.get()), std::move(gcm_client_factory), chrome_build_info, - store_path, std::move(get_socket_factory_callback), + store_path, request_context, // ->Clone() permits creation of an equivalent // SharedURLLoaderFactory on IO thread. url_loader_factory_for_ui->Clone(), blocking_task_runner));
diff --git a/components/gcm_driver/gcm_driver_desktop.h b/components/gcm_driver/gcm_driver_desktop.h index 697dcc8..c2713e12 100644 --- a/components/gcm_driver/gcm_driver_desktop.h +++ b/components/gcm_driver/gcm_driver_desktop.h
@@ -22,7 +22,6 @@ #include "components/gcm_driver/gcm_client.h" #include "components/gcm_driver/gcm_connection_observer.h" #include "components/gcm_driver/gcm_driver.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" class PrefService; @@ -31,6 +30,10 @@ class SequencedTaskRunner; } +namespace net { +class URLRequestContextGetter; +} + namespace network { class SharedURLLoaderFactory; } @@ -54,9 +57,7 @@ const std::string& user_agent, PrefService* prefs, const base::FilePath& store_path, - base::RepeatingCallback< - void(network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, + const scoped_refptr<net::URLRequestContextGetter>& request_context, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_for_ui, const scoped_refptr<base::SequencedTaskRunner>& ui_thread, const scoped_refptr<base::SequencedTaskRunner>& io_thread,
diff --git a/components/gcm_driver/gcm_driver_desktop_unittest.cc b/components/gcm_driver/gcm_driver_desktop_unittest.cc index 636fd29..3b90067 100644 --- a/components/gcm_driver/gcm_driver_desktop_unittest.cc +++ b/components/gcm_driver/gcm_driver_desktop_unittest.cc
@@ -243,15 +243,15 @@ new net::TestURLRequestContextGetter(io_thread_.task_runner()); GCMClient::ChromeBuildInfo chrome_build_info; chrome_build_info.product_category_for_subtypes = "com.chrome.macosx"; - driver_ = std::make_unique<GCMDriverDesktop>( + driver_.reset(new GCMDriverDesktop( std::unique_ptr<GCMClientFactory>(new FakeGCMClientFactory( base::ThreadTaskRunnerHandle::Get(), io_thread_.task_runner())), chrome_build_info, kTestChannelStatusRequestURL, "user-agent-string", - &prefs_, temp_dir_.GetPath(), base::DoNothing(), + &prefs_, temp_dir_.GetPath(), request_context, base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( &test_url_loader_factory_), base::ThreadTaskRunnerHandle::Get(), io_thread_.task_runner(), - message_loop_.task_runner()); + message_loop_.task_runner())); gcm_app_handler_.reset(new FakeGCMAppHandler); gcm_connection_observer_.reset(new FakeGCMConnectionObserver);
diff --git a/components/gcm_driver/gcm_profile_service.cc b/components/gcm_driver/gcm_profile_service.cc index abb9c5d..46e3cc44 100644 --- a/components/gcm_driver/gcm_profile_service.cc +++ b/components/gcm_driver/gcm_profile_service.cc
@@ -150,10 +150,6 @@ PrefService* prefs, base::FilePath path, net::URLRequestContextGetter* request_context, - base::RepeatingCallback< - void(base::WeakPtr<GCMProfileService>, - network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, version_info::Channel channel, const std::string& product_category_for_subtypes, @@ -170,9 +166,7 @@ request_context_(request_context) { driver_ = CreateGCMDriverDesktop( std::move(gcm_client_factory), prefs, - path.Append(gcm_driver::kGCMStoreDirname), - base::BindRepeating(get_socket_factory_callback, - weak_ptr_factory_.GetWeakPtr()), + path.Append(gcm_driver::kGCMStoreDirname), request_context_, url_loader_factory, channel, product_category_for_subtypes, ui_task_runner, io_task_runner, blocking_task_runner);
diff --git a/components/gcm_driver/gcm_profile_service.h b/components/gcm_driver/gcm_profile_service.h index d0afc442..800f1c4 100644 --- a/components/gcm_driver/gcm_profile_service.h +++ b/components/gcm_driver/gcm_profile_service.h
@@ -13,14 +13,12 @@ #include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" #include "build/build_config.h" #include "components/gcm_driver/gcm_buildflags.h" #include "components/keyed_service/core/keyed_service.h" #include "components/signin/core/browser/profile_oauth2_token_service.h" #include "components/signin/core/browser/signin_manager.h" #include "components/version_info/version_info.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" class PrefService; @@ -48,9 +46,6 @@ // Providing GCM service, via GCMDriver. class GCMProfileService : public KeyedService { public: - using GetProxyResolvingFactoryCallback = base::RepeatingCallback<void( - network::mojom::ProxyResolvingSocketFactoryRequest)>; - #if BUILDFLAG(USE_GCM_FROM_PLATFORM) GCMProfileService( base::FilePath path, @@ -60,10 +55,6 @@ PrefService* prefs, base::FilePath path, net::URLRequestContextGetter* request_context, - base::RepeatingCallback< - void(base::WeakPtr<GCMProfileService>, - network::mojom::ProxyResolvingSocketFactoryRequest)> - get_socket_factory_callback, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, version_info::Channel channel, const std::string& product_category_for_subtypes, @@ -107,11 +98,6 @@ std::unique_ptr<IdentityObserver> identity_observer_; #endif - GetProxyResolvingFactoryCallback get_socket_factory_callback_; - - // WeakPtr generated by the factory must be dereferenced on the UI thread. - base::WeakPtrFactory<GCMProfileService> weak_ptr_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(GCMProfileService); };
diff --git a/components/gcm_driver/instance_id/BUILD.gn b/components/gcm_driver/instance_id/BUILD.gn index 5a316155..b0936a1 100644 --- a/components/gcm_driver/instance_id/BUILD.gn +++ b/components/gcm_driver/instance_id/BUILD.gn
@@ -22,7 +22,6 @@ "//components/keyed_service/core:core", "//components/prefs:prefs", "//crypto", - "//services/network/public/mojom", ] if (use_gcm_from_platform) {
diff --git a/components/google/DEPS b/components/google/DEPS index 21c1e50..683dd04 100644 --- a/components/google/DEPS +++ b/components/google/DEPS
@@ -1,5 +1,4 @@ include_rules = [ - "+components/prefs", "+components/url_formatter", "+net", ]
diff --git a/components/google/core/browser/BUILD.gn b/components/google/core/browser/BUILD.gn index 5585b30..c107f106 100644 --- a/components/google/core/browser/BUILD.gn +++ b/components/google/core/browser/BUILD.gn
@@ -6,21 +6,16 @@ sources = [ "google_pref_names.cc", "google_pref_names.h", - "google_switches.cc", - "google_switches.h", - "google_tld_list.h", "google_url_tracker.cc", "google_url_tracker.h", "google_url_tracker_client.cc", "google_url_tracker_client.h", - "google_util.cc", - "google_util.h", ] public_deps = [ "//base", + "//components/google/core/common", "//components/keyed_service/core", - "//net", "//url", ] @@ -29,7 +24,6 @@ "//components/pref_registry", "//components/prefs", "//components/strings", - "//components/url_formatter", "//services/network/public/cpp", "//services/network/public/mojom", ]
diff --git a/components/google/core/browser/DEPS b/components/google/core/browser/DEPS index 1b29f86..fd80fa9 100644 --- a/components/google/core/browser/DEPS +++ b/components/google/core/browser/DEPS
@@ -1,6 +1,7 @@ include_rules = [ "+components/data_use_measurement/core", "+components/keyed_service/core", + "+components/prefs", "+components/pref_registry", "+services/network/public", "+services/network/test",
diff --git a/components/google/core/browser/google_tld_list.h b/components/google/core/browser/google_tld_list.h deleted file mode 100644 index 99d618b..0000000 --- a/components/google/core/browser/google_tld_list.h +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2016 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_GOOGLE_CORE_BROWSER_GOOGLE_TLD_LIST_H_ -#define COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_TLD_LIST_H_ - -// DO NOT EDIT. This file is generated by a script. See crbug.com/674712 -// for details. - -#define GOOGLE_TLD_LIST "ac", "ad", "ae", "af", "ag", "al", "am", "as", "at", \ -"aw", "az", "ba", "be", "bf", "bg", "bi", "bj", "bm", "bn", "bo", "bs", "bt", \ -"by", "ca", "cat", "cc", "cd", "cf", "cg", "ch", "ci", "cl", "cm", "cn", "co", \ -"co.ao", "co.bw", "co.ck", "co.cr", "co.gy", "co.hu", "co.id", "co.il", \ -"co.im", "co.in", "co.je", "co.jp", "co.ke", "co.kr", "co.ls", "co.ma", \ -"co.mz", "co.nz", "co.rs", "co.th", "co.tz", "co.ug", "co.uk", "co.uz", \ -"co.ve", "co.vi", "co.za", "co.zm", "co.zw", "com", "com.af", "com.ag", \ -"com.ai", "com.ar", "com.au", "com.bd", "com.bh", "com.bi", "com.bn", \ -"com.bo", "com.br", "com.by", "com.bz", "com.cn", "com.co", "com.cu", \ -"com.cy", "com.do", "com.dz", "com.ec", "com.eg", "com.er", "com.et", \ -"com.fj", "com.ge", "com.gh", "com.gi", "com.gp", "com.gr", "com.gt", \ -"com.gy", "com.hk", "com.ht", "com.iq", "com.jm", "com.jo", "com.kh", \ -"com.kw", "com.kz", "com.lb", "com.lv", "com.ly", "com.mm", "com.mt", \ -"com.mx", "com.my", "com.na", "com.nc", "com.nf", "com.ng", "com.ni", \ -"com.np", "com.nr", "com.om", "com.pa", "com.pe", "com.pg", "com.ph", \ -"com.pk", "com.pl", "com.pr", "com.ps", "com.pt", "com.py", "com.qa", \ -"com.ru", "com.sa", "com.sb", "com.sg", "com.sl", "com.sv", "com.tj", \ -"com.tm", "com.tn", "com.tr", "com.tw", "com.ua", "com.uy", "com.vc", \ -"com.ve", "com.vn", "cv", "cz", "de", "dj", "dk", "dm", "do", "dz", "ec", \ -"ee", "es", "eu", "fi", "fm", "fr", "ga", "gd", "ge", "gf", "gg", "gl", "gm", \ -"gp", "gr", "gw", "gy", "hk", "hn", "hr", "ht", "hu", "ie", "im", "in", \ -"info", "io", "iq", "is", "it", "it.ao", "je", "jo", "jobs", "jp", "kg", "ki", \ -"km", "kr", "kz", "la", "li", "lk", "lt", "lu", "lv", "ma", "md", "me", "mg", \ -"mh", "mk", "ml", "mn", "mr", "ms", "mu", "mv", "mw", "mx", "ne", "ne.jp", \ -"net", "ng", "nl", "no", "nr", "nu", "off.ai", "org", "pf", "ph", "pk", "pl", \ -"pn", "ps", "pt", "qa", "re", "ro", "rs", "ru", "rw", "sc", "se", "sg", "sh", \ -"si", "sk", "sl", "sm", "sn", "so", "sr", "st", "sz", "td", "tel", "tg", "tk", \ -"tl", "tm", "tn", "to", "tt", "tw", "ua", "us", "uz", "vg", "vn", "vu", "ws", \ -"yt" - -#endif // COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_TLD_LIST_H_ -
diff --git a/components/google/core/browser/google_url_tracker.cc b/components/google/core/browser/google_url_tracker.cc index 133dbfe..8a3f41e 100644 --- a/components/google/core/browser/google_url_tracker.cc +++ b/components/google/core/browser/google_url_tracker.cc
@@ -15,8 +15,8 @@ #include "base/threading/thread_task_runner_handle.h" #include "components/data_use_measurement/core/data_use_user_data.h" #include "components/google/core/browser/google_pref_names.h" -#include "components/google/core/browser/google_switches.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_switches.h" +#include "components/google/core/common/google_util.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" #include "net/base/load_flags.h"
diff --git a/components/google/core/browser/google_util_unittest.cc b/components/google/core/browser/google_util_unittest.cc index 477d3ae..a6ef4c5 100644 --- a/components/google/core/browser/google_util_unittest.cc +++ b/components/google/core/browser/google_util_unittest.cc
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "components/google/core/common/google_util.h" #include "base/command_line.h" #include "base/macros.h" #include "base/strings/stringprintf.h" -#include "components/google/core/browser/google_switches.h" #include "components/google/core/browser/google_url_tracker.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_switches.h" #include "testing/gtest/include/gtest/gtest.h" using google_util::IsGoogleDomainUrl;
diff --git a/components/google/core/common/BUILD.gn b/components/google/core/common/BUILD.gn new file mode 100644 index 0000000..d558cb1 --- /dev/null +++ b/components/google/core/common/BUILD.gn
@@ -0,0 +1,22 @@ +# Copyright 2018 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. + +static_library("common") { + sources = [ + "google_switches.cc", + "google_switches.h", + "google_tld_list.h", + "google_util.cc", + "google_util.h", + ] + + public_deps = [ + "//base", + "//net", + ] + + deps = [ + "//components/url_formatter", + ] +}
diff --git a/components/google/core/browser/google_switches.cc b/components/google/core/common/google_switches.cc similarity index 70% rename from components/google/core/browser/google_switches.cc rename to components/google/core/common/google_switches.cc index 2daf836..4fbc0dc 100644 --- a/components/google/core/browser/google_switches.cc +++ b/components/google/core/common/google_switches.cc
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/google/core/browser/google_switches.h" +#include "components/google/core/common/google_switches.h" namespace switches { // Specifies an alternate URL to use for speaking to Google. Useful for testing. -const char kGoogleBaseURL[] = "google-base-url"; +const char kGoogleBaseURL[] = "google-base-url"; } // namespace switches
diff --git a/components/google/core/browser/google_switches.h b/components/google/core/common/google_switches.h similarity index 68% rename from components/google/core/browser/google_switches.h rename to components/google/core/common/google_switches.h index eadc91a..43e8239a 100644 --- a/components/google/core/browser/google_switches.h +++ b/components/google/core/common/google_switches.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_SWITCHES_H_ -#define COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_SWITCHES_H_ +#ifndef COMPONENTS_GOOGLE_CORE_COMMON_GOOGLE_SWITCHES_H_ +#define COMPONENTS_GOOGLE_CORE_COMMON_GOOGLE_SWITCHES_H_ namespace switches { @@ -13,4 +13,4 @@ } // namespace switches -#endif // COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_SWITCHES_H_ +#endif // COMPONENTS_GOOGLE_CORE_COMMON_GOOGLE_SWITCHES_H_
diff --git a/components/google/core/common/google_tld_list.h b/components/google/core/common/google_tld_list.h new file mode 100644 index 0000000..ce6277d5 --- /dev/null +++ b/components/google/core/common/google_tld_list.h
@@ -0,0 +1,42 @@ +// Copyright 2016 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_GOOGLE_CORE_COMMON_GOOGLE_TLD_LIST_H_ +#define COMPONENTS_GOOGLE_CORE_COMMON_GOOGLE_TLD_LIST_H_ + +// DO NOT EDIT. This file is generated by a script. See crbug.com/674712 +// for details. + +#define GOOGLE_TLD_LIST \ + "ac", "ad", "ae", "af", "ag", "al", "am", "as", "at", "aw", "az", "ba", \ + "be", "bf", "bg", "bi", "bj", "bm", "bn", "bo", "bs", "bt", "by", "ca", \ + "cat", "cc", "cd", "cf", "cg", "ch", "ci", "cl", "cm", "cn", "co", \ + "co.ao", "co.bw", "co.ck", "co.cr", "co.gy", "co.hu", "co.id", "co.il", \ + "co.im", "co.in", "co.je", "co.jp", "co.ke", "co.kr", "co.ls", "co.ma", \ + "co.mz", "co.nz", "co.rs", "co.th", "co.tz", "co.ug", "co.uk", "co.uz", \ + "co.ve", "co.vi", "co.za", "co.zm", "co.zw", "com", "com.af", "com.ag", \ + "com.ai", "com.ar", "com.au", "com.bd", "com.bh", "com.bi", "com.bn", \ + "com.bo", "com.br", "com.by", "com.bz", "com.cn", "com.co", "com.cu", \ + "com.cy", "com.do", "com.dz", "com.ec", "com.eg", "com.er", "com.et", \ + "com.fj", "com.ge", "com.gh", "com.gi", "com.gp", "com.gr", "com.gt", \ + "com.gy", "com.hk", "com.ht", "com.iq", "com.jm", "com.jo", "com.kh", \ + "com.kw", "com.kz", "com.lb", "com.lv", "com.ly", "com.mm", "com.mt", \ + "com.mx", "com.my", "com.na", "com.nc", "com.nf", "com.ng", "com.ni", \ + "com.np", "com.nr", "com.om", "com.pa", "com.pe", "com.pg", "com.ph", \ + "com.pk", "com.pl", "com.pr", "com.ps", "com.pt", "com.py", "com.qa", \ + "com.ru", "com.sa", "com.sb", "com.sg", "com.sl", "com.sv", "com.tj", \ + "com.tm", "com.tn", "com.tr", "com.tw", "com.ua", "com.uy", "com.vc", \ + "com.ve", "com.vn", "cv", "cz", "de", "dj", "dk", "dm", "do", "dz", \ + "ec", "ee", "es", "eu", "fi", "fm", "fr", "ga", "gd", "ge", "gf", "gg", \ + "gl", "gm", "gp", "gr", "gw", "gy", "hk", "hn", "hr", "ht", "hu", "ie", \ + "im", "in", "info", "io", "iq", "is", "it", "it.ao", "je", "jo", "jobs", \ + "jp", "kg", "ki", "km", "kr", "kz", "la", "li", "lk", "lt", "lu", "lv", \ + "ma", "md", "me", "mg", "mh", "mk", "ml", "mn", "mr", "ms", "mu", "mv", \ + "mw", "mx", "ne", "ne.jp", "net", "ng", "nl", "no", "nr", "nu", \ + "off.ai", "org", "pf", "ph", "pk", "pl", "pn", "ps", "pt", "qa", "re", \ + "ro", "rs", "ru", "rw", "sc", "se", "sg", "sh", "si", "sk", "sl", "sm", \ + "sn", "so", "sr", "st", "sz", "td", "tel", "tg", "tk", "tl", "tm", "tn", \ + "to", "tt", "tw", "ua", "us", "uz", "vg", "vn", "vu", "ws", "yt" + +#endif // COMPONENTS_GOOGLE_CORE_COMMON_GOOGLE_TLD_LIST_H_
diff --git a/components/google/core/browser/google_util.cc b/components/google/core/common/google_util.cc similarity index 95% rename from components/google/core/browser/google_util.cc rename to components/google/core/common/google_util.cc index 5d712f7..c01ba58 100644 --- a/components/google/core/browser/google_util.cc +++ b/components/google/core/common/google_util.cc
@@ -2,23 +2,24 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include <stddef.h> +#include <set> #include <string> #include <vector> #include "base/command_line.h" #include "base/macros.h" +#include "base/stl_util.h" #include "base/strings/string16.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" -#include "components/google/core/browser/google_switches.h" -#include "components/google/core/browser/google_tld_list.h" -#include "components/google/core/browser/google_url_tracker.h" +#include "components/google/core/common/google_switches.h" +#include "components/google/core/common/google_tld_list.h" #include "components/url_formatter/url_fixer.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "net/base/url_util.h" @@ -166,8 +167,8 @@ GURL AppendGoogleLocaleParam(const GURL& url, const std::string& application_locale) { - return net::AppendQueryParameter( - url, "hl", GetGoogleLocale(application_locale)); + return net::AppendQueryParameter(url, "hl", + GetGoogleLocale(application_locale)); } std::string GetGoogleCountryCode(const GURL& google_homepage_url) { @@ -271,15 +272,15 @@ // Check for query parameter in URL parameter and hash fragment, depending on // the path type. return HasGoogleSearchQueryParam(url.ref_piece()) || - (!is_home_page_base && HasGoogleSearchQueryParam(url.query_piece())); + (!is_home_page_base && HasGoogleSearchQueryParam(url.query_piece())); } bool IsYoutubeDomainUrl(const GURL& url, SubdomainPermission subdomain_permission, PortPermission port_permission) { return IsValidURL(url, port_permission) && - IsValidHostName(url.host_piece(), "youtube", subdomain_permission, - nullptr); + IsValidHostName(url.host_piece(), "youtube", subdomain_permission, + nullptr); } const std::vector<std::string>& GetGoogleRegistrableDomains() {
diff --git a/components/google/core/browser/google_util.h b/components/google/core/common/google_util.h similarity index 96% rename from components/google/core/browser/google_util.h rename to components/google/core/common/google_util.h index 77ded28..cf768d66 100644 --- a/components/google/core/browser/google_util.h +++ b/components/google/core/common/google_util.h
@@ -4,8 +4,8 @@ // // Some Google related utility functions. -#ifndef COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_UTIL_H_ -#define COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_UTIL_H_ +#ifndef COMPONENTS_GOOGLE_CORE_COMMON_GOOGLE_UTIL_H_ +#define COMPONENTS_GOOGLE_CORE_COMMON_GOOGLE_UTIL_H_ #include <string> #include <vector> @@ -116,4 +116,4 @@ } // namespace google_util -#endif // COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_UTIL_H_ +#endif // COMPONENTS_GOOGLE_CORE_COMMON_GOOGLE_UTIL_H_
diff --git a/components/history/core/browser/BUILD.gn b/components/history/core/browser/BUILD.gn index b0d5360..7f6bbb3 100644 --- a/components/history/core/browser/BUILD.gn +++ b/components/history/core/browser/BUILD.gn
@@ -105,7 +105,7 @@ "//base:i18n", "//components/data_use_measurement/core", "//components/favicon_base", - "//components/google/core/browser", + "//components/google/core/common", "//components/history/core/common", "//components/keyed_service/core", "//components/prefs",
diff --git a/components/history/core/browser/DEPS b/components/history/core/browser/DEPS index 26e3a1cc..1553d3ec 100644 --- a/components/history/core/browser/DEPS +++ b/components/history/core/browser/DEPS
@@ -1,6 +1,6 @@ include_rules = [ "+components/data_use_measurement/core", - "+components/google/core/browser/google_util.h", + "+components/google/core/common/google_util.h", "+components/variations", "+services/identity/public", ]
diff --git a/components/history/core/browser/visit_database.cc b/components/history/core/browser/visit_database.cc index 785f197..cf76ed7 100644 --- a/components/history/core/browser/visit_database.cc +++ b/components/history/core/browser/visit_database.cc
@@ -17,7 +17,7 @@ #include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "base/time/time.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/history/core/browser/history_backend.h" #include "components/history/core/browser/url_database.h" #include "sql/statement.h"
diff --git a/components/neterror/resources/neterror.css b/components/neterror/resources/neterror.css index 3fd07fd..2f1c1c5 100644 --- a/components/neterror/resources/neterror.css +++ b/components/neterror/resources/neterror.css
@@ -344,7 +344,7 @@ height: 48px; } -.download-button { +#download-button { box-shadow: none; position: relative; } @@ -362,7 +362,7 @@ vertical-align: middle; } -.download-button:disabled { +#download-button:disabled { background: rgb(180, 206, 249); color: rgb(255, 255, 255); } @@ -375,45 +375,6 @@ height: 48px; } -/* Overriding default control button styles */ -#control-buttons .download-button-alternate, -#control-buttons .download-button-alternate-disabled { - background: none; - box-shadow: none; -} - -#control-buttons .download-button-alternate:active { - background: rgba(66, 133, 244, 0.12); -} - -.download-button-alternate { - color: rgb(66, 133, 244); -} - -.download-button-alternate:before { - margin-inline-end: 4px; - background: -webkit-image-set( - url(../../resources/default_100_percent/neterror/download_blue.png) 1x, - url(../../resources/default_200_percent/neterror/download_blue.png) 2x) - no-repeat; - content: ''; - display: inline-block; - width: 24px; - height: 24px; - vertical-align: middle; -} - -.download-button-alternate-disabled { - color: rgba(0, 0, 0, 0.38); -} - -.download-button-alternate-disabled:before { - background: -webkit-image-set( - url(../../resources/default_100_percent/neterror/download_grey.png) 1x, - url(../../resources/default_200_percent/neterror/download_grey.png) 2x) - no-repeat; -} - #buttons::after { clear: both; content: '';
diff --git a/components/neterror/resources/neterror.js b/components/neterror/resources/neterror.js index 2dd11a9..a7bc9348 100644 --- a/components/neterror/resources/neterror.js +++ b/components/neterror/resources/neterror.js
@@ -118,9 +118,6 @@ if (window.errorPageController) { errorPageController.downloadButtonClick(); var downloadButton = document.getElementById('download-button'); - if (downloadButton.classList.contains('download-button-alternate')) { - downloadButton.classList.add('download-button-alternate-disabled'); - } downloadButton.disabled = true; downloadButton.textContent = downloadButton.disabledText; } @@ -202,16 +199,6 @@ detailsButton.classList.add('singular'); } - // Check for customization of downloadButton style if it's visible. - if (downloadButtonVisible && - loadTimeData.valueExists('alternateDownloadButtonStyle')) { - downloadButton.classList.add('download-button-alternate'); - reloadButton.disabled = true; - reloadButton.classList.add('reload-button-alternate'); - } else if (downloadButtonVisible) { - downloadButton.classList.add('download-button'); - } - // Show control buttons. if (reloadButtonVisible || showSavedCopyButtonVisible || downloadButtonVisible) {
diff --git a/components/ntp_tiles/DEPS b/components/ntp_tiles/DEPS index 5339a09..bdfe17c 100644 --- a/components/ntp_tiles/DEPS +++ b/components/ntp_tiles/DEPS
@@ -2,7 +2,7 @@ "+components/data_use_measurement/core", "+components/favicon", "+components/favicon_base", - "+components/google/core/browser", + "+components/google/core", "+components/grit", "+components/image_fetcher", "+components/history/core/browser",
diff --git a/components/ntp_tiles/most_visited_sites.cc b/components/ntp_tiles/most_visited_sites.cc index 644b5213..7a17663 100644 --- a/components/ntp_tiles/most_visited_sites.cc +++ b/components/ntp_tiles/most_visited_sites.cc
@@ -210,8 +210,8 @@ if (!custom_links_ || !current_tiles_.has_value()) return; - if (custom_links_->Initialize(current_tiles_.value())) - BuildCurrentTiles(); + custom_links_->Initialize(current_tiles_.value()); + BuildCurrentTiles(); } void MostVisitedSites::UninitializeCustomLinks() { @@ -235,24 +235,21 @@ if (!custom_links_) return; - if (custom_links_->AddLink(url, title)) - BuildCurrentTiles(); + custom_links_->AddLink(url, title); } void MostVisitedSites::DeleteCustomLink(const GURL& url) { if (!custom_links_) return; - if (custom_links_->DeleteLink(url)) - BuildCurrentTiles(); + custom_links_->DeleteLink(url); } void MostVisitedSites::UndoDeleteCustomLink() { if (!custom_links_) return; - if (custom_links_->UndoDeleteLink()) - BuildCurrentTiles(); + custom_links_->UndoDeleteLink(); } void MostVisitedSites::AddOrRemoveBlacklistedUrl(const GURL& url,
diff --git a/components/ntp_tiles/most_visited_sites_unittest.cc b/components/ntp_tiles/most_visited_sites_unittest.cc index 9bf6b1b..fce76cf 100644 --- a/components/ntp_tiles/most_visited_sites_unittest.cc +++ b/components/ntp_tiles/most_visited_sites_unittest.cc
@@ -1099,7 +1099,7 @@ ElementsAre(MatchesTile(kTestTitle, kTestUrl, TileSource::TOP_SITES))); // Initialize custom links and rebuild tiles. Tiles should be custom links. - EXPECT_CALL(*mock_custom_links_, Initialize(_)).WillOnce(Return(true)); + EXPECT_CALL(*mock_custom_links_, Initialize(_)); EXPECT_CALL(*mock_custom_links_, IsInitialized()).WillOnce(Return(true)); EXPECT_CALL(*mock_custom_links_, GetLinks()) .WillOnce(ReturnRef(expected_links));
diff --git a/components/ntp_tiles/popular_sites_impl.cc b/components/ntp_tiles/popular_sites_impl.cc index 6f4f99f..75f9baf 100644 --- a/components/ntp_tiles/popular_sites_impl.cc +++ b/components/ntp_tiles/popular_sites_impl.cc
@@ -20,7 +20,7 @@ #include "base/values.h" #include "build/build_config.h" #include "components/data_use_measurement/core/data_use_user_data.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/ntp_tiles/constants.h" #include "components/ntp_tiles/pref_names.h" #include "components/ntp_tiles/switches.h"
diff --git a/components/offline_pages/core/prefetch/prefetch_configuration.h b/components/offline_pages/core/prefetch/prefetch_configuration.h index 93064949..d8e6225 100644 --- a/components/offline_pages/core/prefetch/prefetch_configuration.h +++ b/components/offline_pages/core/prefetch/prefetch_configuration.h
@@ -13,14 +13,14 @@ public: virtual ~PrefetchConfiguration() = default; - // Returns true if all needed flags and settings allows the prefetching of - // offline pages to run. Note that this result can change in the course of the - // application lifetime. Should not be overridden by subclasses. + // Returns true if all needed flags and settings allow the prefetching of + // offline pages to run. Note that this a runtime value that can change in the + // course of the application lifetime. Should not be overridden by subclasses. bool IsPrefetchingEnabled(); - protected: - // Returns true if user settings allow the prefetching of offline pages to - // run. Should not be called by users of this class. + // Returns true if the user controlled setting allows the prefetching of + // offline pages to run. Note that this a runtime value that can change in the + // course of the application lifetime. virtual bool IsPrefetchingEnabledBySettings() = 0; };
diff --git a/components/password_manager/core/browser/new_password_form_manager.cc b/components/password_manager/core/browser/new_password_form_manager.cc index 585933f..184be713 100644 --- a/components/password_manager/core/browser/new_password_form_manager.cc +++ b/components/password_manager/core/browser/new_password_form_manager.cc
@@ -6,6 +6,7 @@ #include "base/metrics/histogram_macros.h" #include "components/autofill/core/browser/form_structure.h" +#include "components/password_manager/core/browser/android_affiliation/affiliation_utils.h" #include "components/password_manager/core/browser/browser_save_password_progress_logger.h" #include "components/password_manager/core/browser/form_fetcher_impl.h" #include "components/password_manager/core/browser/form_parsing/form_parser.h" @@ -20,6 +21,7 @@ using autofill::FormSignature; using autofill::FormStructure; using autofill::PasswordForm; +using autofill::ValueElementPair; using base::TimeDelta; using base::TimeTicks; @@ -37,10 +39,10 @@ std::unique_ptr<PasswordForm> ParseFormAndMakeLogging( PasswordManagerClient* client, const FormData& form, - const base::Optional<FormPredictions>& predictions) { + const base::Optional<FormPredictions>& predictions, + FormParsingMode mode) { std::unique_ptr<PasswordForm> password_form = - ParseFormData(form, predictions ? &predictions.value() : nullptr, - FormParsingMode::FILLING); + ParseFormData(form, predictions ? &predictions.value() : nullptr, mode); if (password_manager_util::IsLoggingActive(client)) { BrowserSavePasswordProgressLogger logger(client->GetLogManager()); @@ -52,6 +54,35 @@ return password_form; } +ValueElementPair PasswordToSave(const PasswordForm& form) { + if (form.new_password_element.empty() || form.new_password_value.empty()) + return {form.password_value, form.password_element}; + return {form.new_password_value, form.new_password_element}; +} + +// Update |credential| to reflect usage. +void UpdateMetadataForUsage(PasswordForm* credential) { + ++credential->times_used; + + // Remove alternate usernames. At this point we assume that we have found + // the right username. + credential->other_possible_usernames.clear(); +} + +// Copies field properties masks from the form |from| to the form |to|. +void CopyFieldPropertiesMasks(const FormData& from, FormData* to) { + // Skip copying if the number of fields is different. + if (from.fields.size() != to->fields.size()) + return; + + for (size_t i = 0; i < from.fields.size(); ++i) { + to->fields[i].properties_mask = + to->fields[i].name == from.fields[i].name + ? from.fields[i].properties_mask + : autofill::FieldPropertiesFlags::ERROR_OCCURRED; + } +} + } // namespace NewPasswordFormManager::NewPasswordFormManager( @@ -70,6 +101,9 @@ true /* should_migrate_http_passwords */, true /* should_query_suppressed_https_forms */)), form_fetcher_(form_fetcher ? form_fetcher : owned_form_fetcher_.get()), + // TODO(https://crbug.com/831123): set correctly + // |is_possible_change_password_form| in |votes_uploader_| constructor + votes_uploader_(client, false /* is_possible_change_password_form */), weak_ptr_factory_(this) { metrics_recorder_ = base::MakeRefCounted<PasswordFormMetricsRecorder>( client_->IsMainFrameSecure(), client_->GetUkmSourceId()); @@ -79,11 +113,12 @@ owned_form_fetcher_->Fetch(); form_fetcher_->AddConsumer(this); - // The folloing code is for development and debugging purposes. + // The following code is for development and debugging purposes. // TODO(https://crbug.com/831123): remove it when NewPasswordFormManager will // be production ready. if (password_manager_util::IsLoggingActive(client_)) - ParseFormAndMakeLogging(client_, observed_form_, predictions_); + ParseFormAndMakeLogging(client_, observed_form_, predictions_, + FormParsingMode::FILLING); } NewPasswordFormManager::~NewPasswordFormManager() = default; @@ -114,15 +149,11 @@ } const PasswordForm& NewPasswordFormManager::GetPendingCredentials() const { - // TODO(https://crbug.com/831123): Implement. - DCHECK(false); - static PasswordForm dummy_form; - return dummy_form; + return pending_credentials_; } metrics_util::CredentialSourceType NewPasswordFormManager::GetCredentialSource() { - // TODO(https://crbug.com/831123): Implement. return metrics_util::CredentialSourceType::kPasswordManager; } @@ -140,8 +171,7 @@ } bool NewPasswordFormManager::IsPasswordOverridden() const { - // TODO(https://crbug.com/831123): Implement. - return false; + return password_overridden_; } const PasswordForm* NewPasswordFormManager::GetPreferredMatch() const { @@ -174,9 +204,8 @@ form->scheme == PasswordForm::SCHEME_HTML; }); - std::vector<const PasswordForm*> not_best_matches; password_manager_util::FindBestMatches(matches, &best_matches_, - ¬_best_matches, &preferred_match_); + ¬_best_matches_, &preferred_match_); // Copy out blacklisted matches. blacklisted_matches_.clear(); @@ -207,6 +236,7 @@ return false; submitted_form_ = submitted_form; is_submitted_ = true; + CreatePendingCredentials(); return true; } @@ -229,7 +259,8 @@ // filling and saving mode might be different so it is better not to cache // parse result, but to parse each time again. std::unique_ptr<PasswordForm> observed_password_form = - ParseFormAndMakeLogging(client_, observed_form_, predictions_); + ParseFormAndMakeLogging(client_, observed_form_, predictions_, + FormParsingMode::FILLING); if (!observed_password_form) return; @@ -295,4 +326,249 @@ } } +void NewPasswordFormManager::CreatePendingCredentials() { + DCHECK(is_submitted_); + // TODO(https://crbug.com/831123): Process correctly the case when saved + // credentials are not received from the store yet. + std::unique_ptr<PasswordForm> submitted_password_form = + ParseFormAndMakeLogging(client_, submitted_form_, predictions_, + FormParsingMode::SAVING); + if (!submitted_password_form) + return; + + ValueElementPair password_to_save(PasswordToSave(*submitted_password_form)); + + // Look for the actually submitted credentials in the list of previously saved + // credentials that were available to autofilling. + const PasswordForm* saved_form = + FindBestSavedMatch(submitted_password_form.get()); + if (saved_form) { + // The user signed in with a login we autofilled. + pending_credentials_ = *saved_form; + SetPasswordOverridden(pending_credentials_.password_value != + password_to_save.first); + + if (pending_credentials_.is_public_suffix_match) { + // If the autofilled credentials were a PSL match or credentials stored + // from Android apps, store a copy with the current origin and signon + // realm. This ensures that on the next visit, a precise match is found. + is_new_login_ = true; + SetUserAction(password_overridden_ ? UserAction::kOverridePassword + : UserAction::kChoosePslMatch); + + // Update credential to reflect that it has been used for submission. + // If this isn't updated, then password generation uploads are off for + // sites where PSL matching is required to fill the login form, as two + // PASSWORD votes are uploaded per saved password instead of one. + UpdateMetadataForUsage(&pending_credentials_); + + // Update |pending_credentials_| in order to be able correctly save it. + pending_credentials_.origin = submitted_form_.origin; + pending_credentials_.signon_realm = submitted_password_form->signon_realm; + + // Normally, the copy of the PSL matched credentials, adapted for the + // current domain, is saved automatically without asking the user, because + // the copy likely represents the same account, i.e., the one for which + // the user already agreed to store a password. + // + // However, if the user changes the suggested password, it might indicate + // that the autofilled credentials and |submitted_password_form| + // actually correspond to two different accounts (see + // http://crbug.com/385619). In that case the user should be asked again + // before saving the password. This is ensured by setting + // |password_overriden_| on |pending_credentials_| to false. + // + // There is still the edge case when the autofilled credentials represent + // the same account as |submitted_password_form| but the stored password + // was out of date. In that case, the user just had to manually enter the + // new password, which is now in |submitted_password_form|. The best + // thing would be to save automatically, and also update the original + // credentials. However, we have no way to tell if this is the case. + // This will likely happen infrequently, and the inconvenience put on the + // user by asking them is not significant, so we are fine with asking + // here again. + if (password_overridden_) { + pending_credentials_.is_public_suffix_match = false; + SetPasswordOverridden(false); + } + } else { // Not a PSL match but a match of an already stored credential. + is_new_login_ = false; + if (password_overridden_) + SetUserAction(UserAction::kOverridePassword); + } + } else if (!best_matches_.empty() && + submitted_password_form->type != PasswordForm::TYPE_API && + submitted_password_form->username_value.empty()) { + // This branch deals with the case that the submitted form has no username + // element and needs to decide whether to offer to update any credentials. + // In that case, the user can select any previously stored credential as + // the one to update, but we still try to find the best candidate. + + // Find the best candidate to select by default in the password update + // bubble. If no best candidate is found, any one can be offered. + const PasswordForm* best_update_match = + FindBestMatchForUpdatePassword(submitted_password_form->password_value); + + // A retry password form is one that consists of only an "old password" + // field, i.e. one that is not a "new password". + retry_password_form_password_update_ = + submitted_password_form->username_value.empty() && + submitted_password_form->new_password_value.empty(); + + is_new_login_ = false; + if (best_update_match) { + // Chose |best_update_match| to be updated. + pending_credentials_ = *best_update_match; + } else if (has_generated_password_) { + // If a password was generated and we didn't find a match, we have to save + // it in a separate entry since we have to store it but we don't know + // where. + CreatePendingCredentialsForNewCredentials(*submitted_password_form, + password_to_save.second); + is_new_login_ = true; + } else { + // We don't have a good candidate to choose as the default credential for + // the update bubble and the user has to pick one. + // We set |pending_credentials_| to the bare minimum, which is the correct + // origin. + pending_credentials_.origin = submitted_form_.origin; + } + } else { + is_new_login_ = true; + // No stored credentials can be matched to the submitted form. Offer to + // save new credentials. + CreatePendingCredentialsForNewCredentials(*submitted_password_form, + password_to_save.second); + // Generate username correction votes. + bool username_correction_found = + votes_uploader_.FindCorrectedUsernameElement( + best_matches_, not_best_matches_, + submitted_password_form->username_value, + submitted_password_form->password_value); + UMA_HISTOGRAM_BOOLEAN("PasswordManager.UsernameCorrectionFound", + username_correction_found); + if (username_correction_found) { + metrics_recorder_->RecordDetailedUserAction( + password_manager::PasswordFormMetricsRecorder::DetailedUserAction:: + kCorrectedUsernameInForm); + } + } + + if (!IsValidAndroidFacetURI(pending_credentials_.signon_realm)) + pending_credentials_.action = submitted_form_.action; + + pending_credentials_.password_value = password_to_save.first; + pending_credentials_.preferred = true; + pending_credentials_.form_has_autofilled_value = + submitted_password_form->form_has_autofilled_value; + pending_credentials_.all_possible_passwords = + submitted_password_form->all_possible_passwords; + CopyFieldPropertiesMasks(submitted_form_, &pending_credentials_.form_data); + + // If we're dealing with an API-driven provisionally saved form, then take + // the server provided values. We don't do this for non-API forms, as + // those will never have those members set. + if (submitted_password_form->type == PasswordForm::TYPE_API) { + pending_credentials_.skip_zero_click = + submitted_password_form->skip_zero_click; + pending_credentials_.display_name = submitted_password_form->display_name; + pending_credentials_.federation_origin = + submitted_password_form->federation_origin; + pending_credentials_.icon_url = submitted_password_form->icon_url; + // It's important to override |signon_realm| for federated credentials + // because it has format "federation://" + origin_host + "/" + + // federation_host + pending_credentials_.signon_realm = submitted_password_form->signon_realm; + } + + if (has_generated_password_) + pending_credentials_.type = PasswordForm::TYPE_GENERATED; +} + +const PasswordForm* NewPasswordFormManager::FindBestMatchForUpdatePassword( + const base::string16& password) const { + // This function is called for forms that do not contain a username field. + // This means that we cannot update credentials based on a matching username + // and that we may need to show an update prompt. + if (best_matches_.size() == 1 && !has_generated_password_) { + // In case the submitted form contained no username but a password, and if + // the user has only one credential stored, return it as the one that should + // be updated. + return best_matches_.begin()->second; + } + if (password.empty()) + return nullptr; + + // Return any existing credential that has the same |password| saved already. + for (const auto& key_value : best_matches_) { + if (key_value.second->password_value == password) + return key_value.second; + } + return nullptr; +} + +const PasswordForm* NewPasswordFormManager::FindBestSavedMatch( + const PasswordForm* submitted_form) const { + if (!submitted_form->federation_origin.unique()) + return nullptr; + + // Return form with matching |username_value|. + auto it = best_matches_.find(submitted_form->username_value); + if (it != best_matches_.end()) + return it->second; + + // Match Credential API forms only by username. Stop here if nothing was found + // above. + if (submitted_form->type == PasswordForm::TYPE_API) + return nullptr; + + // Verify that the submitted form has no username and no "new password" + // and bail out with a nullptr otherwise. + bool submitted_form_has_username = !submitted_form->username_value.empty(); + bool submitted_form_has_new_password_element = + !submitted_form->new_password_value.empty(); + if (submitted_form_has_username || submitted_form_has_new_password_element) + return nullptr; + + // At this line we are certain that the submitted form contains only a + // password field that is not a "new password". Now we can check whether we + // have a match by password of an already saved credential. + for (const auto& stored_match : best_matches_) { + if (stored_match.second->password_value == submitted_form->password_value) + return stored_match.second; + } + return nullptr; +} + +void NewPasswordFormManager::CreatePendingCredentialsForNewCredentials( + const PasswordForm& submitted_password_form, + const base::string16& password_element) { + // User typed in a new, unknown username. + SetUserAction(UserAction::kOverrideUsernameAndPassword); + // TODO(https://crbug.com/831123): Replace parsing of the observed form with + // usage of already parsed submitted form. + pending_credentials_ = *ParseFormAndMakeLogging( + client_, observed_form_, predictions_, FormParsingMode::FILLING); + pending_credentials_.username_element = + submitted_password_form.username_element; + pending_credentials_.username_value = submitted_password_form.username_value; + pending_credentials_.other_possible_usernames = + submitted_password_form.other_possible_usernames; + pending_credentials_.all_possible_passwords = + submitted_password_form.all_possible_passwords; + + // The password value will be filled in later, remove any garbage for now. + pending_credentials_.password_value.clear(); + // The password element should be determined earlier in |PasswordToSave|. + pending_credentials_.password_element = password_element; + // The new password's value and element name should be empty. + pending_credentials_.new_password_value.clear(); + pending_credentials_.new_password_element.clear(); +} + +void NewPasswordFormManager::SetUserAction(UserAction user_action) { + user_action_ = user_action; + metrics_recorder_->SetUserAction(user_action); +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/new_password_form_manager.h b/components/password_manager/core/browser/new_password_form_manager.h index b3dfdf8..f0dac9a 100644 --- a/components/password_manager/core/browser/new_password_form_manager.h +++ b/components/password_manager/core/browser/new_password_form_manager.h
@@ -18,6 +18,8 @@ #include "components/password_manager/core/browser/form_fetcher.h" #include "components/password_manager/core/browser/form_parsing/password_field_prediction.h" #include "components/password_manager/core/browser/password_form_manager_for_ui.h" +#include "components/password_manager/core/browser/password_form_user_action.h" +#include "components/password_manager/core/browser/votes_uploader.h" namespace autofill { class FormStructure; @@ -116,6 +118,37 @@ // the autofill server responding to the lookup request. void ReportTimeBetweenStoreAndServerUMA(); + // Create pending credentials from |submitted_form_| and forms received from + // the password store. + void CreatePendingCredentials(); + + // Create pending credentials from provisionally saved form when this form + // represents credentials that were not previosly saved. + void CreatePendingCredentialsForNewCredentials( + const autofill::PasswordForm& submitted_password_form, + const base::string16& password_element); + + // If |best_matches_| contains only one entry, then return this entry. + // Otherwise for empty |password| return nullptr and for non-empty |password| + // returns the any entry in |best_matches_| with the same password, if it + // exists, and nullptr otherwise. + const autofill::PasswordForm* FindBestMatchForUpdatePassword( + const base::string16& password) const; + + // Try to return a member of |best_matches_| which is most likely to represent + // the same credential as |form|. Return null if there is none. This is used + // to tell whether the user submitted a credential filled by Chrome. + const autofill::PasswordForm* FindBestSavedMatch( + const autofill::PasswordForm* form) const; + + // Sets |user_action_| and records some metrics. + void SetUserAction(UserAction user_action); + + void SetPasswordOverridden(bool password_overridden) { + password_overridden_ = password_overridden; + votes_uploader_.set_password_overridden(password_overridden); + } + // The client which implements embedder-specific PasswordManager operations. PasswordManagerClient* client_; @@ -128,6 +161,13 @@ // by |form_fetcher_|. std::map<base::string16, const autofill::PasswordForm*> best_matches_; + // Set of forms from PasswordStore that correspond to the current site and + // that are not in |best_matches_|. They are owned by |form_fetcher_|. + // It is leftover from the old PasswordFormManager. + // TODO(https://crbug.com/831123): update all places where it is used with + // saved credentials from |form_fetcher_|. + std::vector<const autofill::PasswordForm*> not_best_matches_; + // Set of blacklisted forms from the PasswordStore that best match the current // form. They are owned by |form_fetcher_|. std::vector<const autofill::PasswordForm*> blacklisted_matches_; @@ -136,7 +176,7 @@ // as preferred. This is only allowed to be null if there are no best matches // at all, since there will always be one preferred login when there are // multiple matches (when first saved, a login is marked preferred). - const autofill::PasswordForm* preferred_match_; + const autofill::PasswordForm* preferred_match_ = nullptr; // Takes care of recording metrics and events for |*this|. scoped_refptr<PasswordFormMetricsRecorder> metrics_recorder_; @@ -147,11 +187,40 @@ // FormFetcher instance which owns the login data from PasswordStore. FormFetcher* form_fetcher_; + VotesUploader votes_uploader_; + // |is_submitted_| = true means that a submission of the managed form was seen // and then |submitted_form_| contains the submitted form. bool is_submitted_ = false; autofill::FormData submitted_form_; + // Stores updated credentials when the form was submitted but success is still + // unknown. This variable contains credentials that are ready to be written + // (saved or updated) to a password store. It is calculated based on + // |submitted_form_| and |best_matches_|. + autofill::PasswordForm pending_credentials_; + + // Whether |pending_credentials_| stores a new login or is an update to an + // existing one. + bool is_new_login_ = true; + + // Whether this form has an auto generated password. + bool has_generated_password_ = false; + + // Whether the saved password was overridden. + bool password_overridden_ = false; + + // A form is considered to be "retry" password if it has only one field which + // is a current password field. + // This variable is true if the password passed through ProvisionallySave() is + // a password that is not part of any password form stored for this origin + // and it was entered on a retry password form. + bool retry_password_form_password_update_ = false; + + // Records the action the user has taken while interacting with the password + // form. + UserAction user_action_ = UserAction::kNone; + base::Optional<FormPredictions> predictions_; // True when the managed form was already filled.
diff --git a/components/password_manager/core/browser/new_password_form_manager_unittest.cc b/components/password_manager/core/browser/new_password_form_manager_unittest.cc index 9a74df6..daad122 100644 --- a/components/password_manager/core/browser/new_password_form_manager_unittest.cc +++ b/components/password_manager/core/browser/new_password_form_manager_unittest.cc
@@ -41,13 +41,31 @@ MOCK_METHOD1(AllowPasswordGenerationForForm, void(const PasswordForm&)); }; +void CheckPendingCredentials(const PasswordForm& expected, + const PasswordForm& actual) { + EXPECT_EQ(expected.signon_realm, actual.signon_realm); + EXPECT_EQ(expected.origin, actual.origin); + EXPECT_EQ(expected.action, actual.action); + EXPECT_EQ(expected.username_value, actual.username_value); + EXPECT_EQ(expected.password_value, actual.password_value); + EXPECT_EQ(expected.username_element, actual.username_element); + EXPECT_EQ(expected.password_element, actual.password_element); + EXPECT_EQ(expected.blacklisted_by_user, actual.blacklisted_by_user); + EXPECT_EQ(expected.form_data, actual.form_data); +} + } // namespace +// TODO(https://crbug.com/831123): Test sending metrics. +// TODO(https://crbug.com/831123): Test create pending credentials when +// generation happened. +// TODO(https://crbug.com/831123): Test create pending credentials with +// Credential API. class NewPasswordFormManagerTest : public testing::Test { public: NewPasswordFormManagerTest() : task_runner_(new TestMockTimeTaskRunner) { - GURL origin = GURL("http://accounts.google.com/a/ServiceLoginAuth"); - GURL action = GURL("http://accounts.google.com/a/ServiceLogin"); + GURL origin = GURL("https://accounts.google.com/a/ServiceLoginAuth"); + GURL action = GURL("https://accounts.google.com/a/ServiceLogin"); observed_form_.origin = origin; observed_form_.action = action; @@ -55,6 +73,8 @@ observed_form_.unique_renderer_id = 1; observed_form_.is_form_tag = true; + observed_form_only_password_fields_ = observed_form_; + FormFieldData field; field.name = ASCIIToUTF16("firstname"); field.form_control_type = "text"; @@ -72,23 +92,38 @@ field.form_control_type = "password"; field.unique_renderer_id = 3; observed_form_.fields.push_back(field); + observed_form_only_password_fields_.fields.push_back(field); + + field.name = ASCIIToUTF16("password2"); + field.id = field.name; + field.form_control_type = "password"; + field.unique_renderer_id = 5; + observed_form_only_password_fields_.fields.push_back(field); saved_match_.origin = origin; saved_match_.action = action; + saved_match_.signon_realm = "https://accounts.google.com/"; saved_match_.preferred = true; saved_match_.username_value = ASCIIToUTF16("test@gmail.com"); saved_match_.password_value = ASCIIToUTF16("test1"); saved_match_.is_public_suffix_match = false; saved_match_.scheme = PasswordForm::SCHEME_HTML; + parsed_form_ = saved_match_; + parsed_form_.form_data = observed_form_; + parsed_form_.username_element = observed_form_.fields[1].name; + parsed_form_.password_element = observed_form_.fields[2].name; + blacklisted_match_ = saved_match_; blacklisted_match_.blacklisted_by_user = true; } protected: FormData observed_form_; + FormData observed_form_only_password_fields_; PasswordForm saved_match_; PasswordForm blacklisted_match_; + PasswordForm parsed_form_; StubPasswordManagerClient client_; MockPasswordManagerDriver driver_; scoped_refptr<TestMockTimeTaskRunner> task_runner_; @@ -292,4 +327,164 @@ fetcher.SetNonFederated({&saved_match_}, 0u); } +// Tests creating pending credentials when the password store is empty. +TEST_F(NewPasswordFormManagerTest, CreatePendingCredentialsEmptyStore) { + TestMockTimeTaskRunner::ScopedContext scoped_context(task_runner_.get()); + FakeFormFetcher fetcher; + fetcher.Fetch(); + NewPasswordFormManager form_manager(&client_, driver_.AsWeakPtr(), + observed_form_, &fetcher); + fetcher.SetNonFederated({}, 0u); + + FormData submitted_form = observed_form_; + submitted_form.fields[1].value = ASCIIToUTF16("user1"); + submitted_form.fields[2].value = ASCIIToUTF16("pw1"); + + PasswordForm expected = parsed_form_; + expected.username_value = ASCIIToUTF16("user1"); + expected.password_value = ASCIIToUTF16("pw1"); + + EXPECT_TRUE( + form_manager.SetSubmittedFormIfIsManaged(submitted_form, &driver_)); + CheckPendingCredentials(expected, form_manager.GetPendingCredentials()); +} + +// Tests creating pending credentials when new credentials are submitted and the +// store has another credentials saved. +TEST_F(NewPasswordFormManagerTest, CreatePendingCredentialsNewCredentials) { + TestMockTimeTaskRunner::ScopedContext scoped_context(task_runner_.get()); + FakeFormFetcher fetcher; + fetcher.Fetch(); + NewPasswordFormManager form_manager(&client_, driver_.AsWeakPtr(), + observed_form_, &fetcher); + fetcher.SetNonFederated({&saved_match_}, 0u); + + FormData submitted_form = observed_form_; + base::string16 username = saved_match_.username_value + ASCIIToUTF16("1"); + base::string16 password = saved_match_.password_value + ASCIIToUTF16("1"); + submitted_form.fields[1].value = username; + submitted_form.fields[2].value = password; + PasswordForm expected = parsed_form_; + expected.username_value = username; + expected.password_value = password; + + EXPECT_TRUE( + form_manager.SetSubmittedFormIfIsManaged(submitted_form, &driver_)); + CheckPendingCredentials(expected, form_manager.GetPendingCredentials()); +} + +// Tests that when submitted credentials are equal to already saved one then +// pending credentials equal to saved match. +TEST_F(NewPasswordFormManagerTest, CreatePendingCredentialsAlreadySaved) { + TestMockTimeTaskRunner::ScopedContext scoped_context(task_runner_.get()); + FakeFormFetcher fetcher; + fetcher.Fetch(); + NewPasswordFormManager form_manager(&client_, driver_.AsWeakPtr(), + observed_form_, &fetcher); + fetcher.SetNonFederated({&saved_match_}, 0u); + + FormData submitted_form = observed_form_; + submitted_form.fields[1].value = saved_match_.username_value; + submitted_form.fields[2].value = saved_match_.password_value; + EXPECT_TRUE( + form_manager.SetSubmittedFormIfIsManaged(submitted_form, &driver_)); + CheckPendingCredentials(/* expected */ saved_match_, + form_manager.GetPendingCredentials()); +} + +// Tests that when submitted credentials are equal to already saved PSL +// credentials. +TEST_F(NewPasswordFormManagerTest, CreatePendingCredentialsPSLMatchSaved) { + TestMockTimeTaskRunner::ScopedContext scoped_context(task_runner_.get()); + FakeFormFetcher fetcher; + fetcher.Fetch(); + NewPasswordFormManager form_manager(&client_, driver_.AsWeakPtr(), + observed_form_, &fetcher); + PasswordForm expected = saved_match_; + + saved_match_.origin = GURL("https://m.accounts.google.com/auth"); + saved_match_.signon_realm = "https://m.accounts.google.com/"; + saved_match_.is_public_suffix_match = true; + + fetcher.SetNonFederated({&saved_match_}, 0u); + + FormData submitted_form = observed_form_; + submitted_form.fields[1].value = saved_match_.username_value; + submitted_form.fields[2].value = saved_match_.password_value; + + EXPECT_TRUE( + form_manager.SetSubmittedFormIfIsManaged(submitted_form, &driver_)); + CheckPendingCredentials(expected, form_manager.GetPendingCredentials()); +} + +// Tests creating pending credentials when new credentials are different only in +// password with already saved one. +TEST_F(NewPasswordFormManagerTest, CreatePendingCredentialsPasswordOverriden) { + TestMockTimeTaskRunner::ScopedContext scoped_context(task_runner_.get()); + FakeFormFetcher fetcher; + fetcher.Fetch(); + NewPasswordFormManager form_manager(&client_, driver_.AsWeakPtr(), + observed_form_, &fetcher); + fetcher.SetNonFederated({&saved_match_}, 0u); + + PasswordForm expected = saved_match_; + expected.password_value += ASCIIToUTF16("1"); + + FormData submitted_form = observed_form_; + submitted_form.fields[1].value = saved_match_.username_value; + submitted_form.fields[2].value = expected.password_value; + EXPECT_TRUE( + form_manager.SetSubmittedFormIfIsManaged(submitted_form, &driver_)); + CheckPendingCredentials(expected, form_manager.GetPendingCredentials()); +} + +// Tests that when submitted credentials are equal to already saved one then +// pending credentials equal to saved match. +TEST_F(NewPasswordFormManagerTest, CreatePendingCredentialsUpdate) { + TestMockTimeTaskRunner::ScopedContext scoped_context(task_runner_.get()); + FakeFormFetcher fetcher; + fetcher.Fetch(); + NewPasswordFormManager form_manager(&client_, driver_.AsWeakPtr(), + observed_form_, &fetcher); + fetcher.SetNonFederated({&saved_match_}, 0u); + + FormData submitted_form = observed_form_only_password_fields_; + submitted_form.fields[0].value = ASCIIToUTF16("strongpassword"); + submitted_form.fields[1].value = ASCIIToUTF16("verystrongpassword"); + + PasswordForm expected = saved_match_; + expected.password_value = ASCIIToUTF16("verystrongpassword"); + + EXPECT_TRUE( + form_manager.SetSubmittedFormIfIsManaged(submitted_form, &driver_)); + CheckPendingCredentials(expected, form_manager.GetPendingCredentials()); +} + +// Tests creating pending credentials when a change password form is submitted +// and there are multipe saved forms. +TEST_F(NewPasswordFormManagerTest, + CreatePendingCredentialsUpdateMultipleSaved) { + TestMockTimeTaskRunner::ScopedContext scoped_context(task_runner_.get()); + FakeFormFetcher fetcher; + fetcher.Fetch(); + NewPasswordFormManager form_manager(&client_, driver_.AsWeakPtr(), + observed_form_, &fetcher); + PasswordForm another_saved_match = saved_match_; + another_saved_match.username_value += ASCIIToUTF16("1"); + fetcher.SetNonFederated({&saved_match_, &another_saved_match}, 0u); + + FormData submitted_form = observed_form_only_password_fields_; + submitted_form.fields[0].value = ASCIIToUTF16("strongpassword"); + submitted_form.fields[1].value = ASCIIToUTF16("verystrongpassword"); + + PasswordForm expected; + expected.origin = observed_form_.origin; + expected.action = observed_form_.action; + expected.password_value = ASCIIToUTF16("verystrongpassword"); + + EXPECT_TRUE( + form_manager.SetSubmittedFormIfIsManaged(submitted_form, &driver_)); + CheckPendingCredentials(expected, form_manager.GetPendingCredentials()); +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/password_form_manager.h b/components/password_manager/core/browser/password_form_manager.h index 339b764..a7b38aca 100644 --- a/components/password_manager/core/browser/password_form_manager.h +++ b/components/password_manager/core/browser/password_form_manager.h
@@ -293,8 +293,8 @@ bool UpdatePendingCredentialsIfUsernameChanged( const autofill::PasswordForm& form); - // Create pending credentials from provisionally saved form and forms received - // from password store. + // Create pending credentials from |submitted_form_| and forms received from + // the password store. void CreatePendingCredentials(); // Create pending credentials from provisionally saved form when this form
diff --git a/components/policy/core/browser/DEPS b/components/policy/core/browser/DEPS index 9f5ba78b..c2ed8c6 100644 --- a/components/policy/core/browser/DEPS +++ b/components/policy/core/browser/DEPS
@@ -1,6 +1,6 @@ include_rules = [ "+components/bookmarks", - "+components/google/core/browser", + "+components/google/core", "+components/pref_registry", "+components/proxy_config", "+components/strings/grit/components_strings.h",
diff --git a/components/policy/core/browser/url_util.cc b/components/policy/core/browser/url_util.cc index ddc4d92..994ff03 100644 --- a/components/policy/core/browser/url_util.cc +++ b/components/policy/core/browser/url_util.cc
@@ -9,7 +9,7 @@ #include "base/logging.h" #include "base/macros.h" #include "base/no_destructor.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/url_formatter/url_fixer.h" #include "net/base/escape.h" #include "net/base/url_util.h"
diff --git a/components/policy/core/common/cloud/cloud_policy_util.cc b/components/policy/core/common/cloud/cloud_policy_util.cc index 417a5ba..897d87f3 100644 --- a/components/policy/core/common/cloud/cloud_policy_util.cc +++ b/components/policy/core/common/cloud/cloud_policy_util.cc
@@ -46,9 +46,9 @@ #if defined(OS_MACOSX) #include "base/mac/scoped_cftyperef.h" -#include "base/sys_info.h" #include "base/strings/string_util.h" #include "base/strings/sys_string_conversions.h" +#include "base/sys_info.h" #endif #if defined(OS_LINUX) && !defined(OS_CHROMEOS) @@ -57,6 +57,8 @@ namespace policy { +namespace em = enterprise_management; + std::string GetMachineName() { #if defined(OS_LINUX) && !defined(OS_CHROMEOS) char hostname[HOST_NAME_MAX]; @@ -156,4 +158,19 @@ #endif } +em::Channel ConvertToProtoChannel(version_info::Channel channel) { + switch (channel) { + case version_info::Channel::UNKNOWN: + return em::CHANNEL_UNKNOWN; + case version_info::Channel::CANARY: + return em::CHANNEL_CANARY; + case version_info::Channel::DEV: + return em::CHANNEL_DEV; + case version_info::Channel::BETA: + return em::CHANNEL_BETA; + case version_info::Channel::STABLE: + return em::CHANNEL_STABLE; + } +} + } // namespace policy
diff --git a/components/policy/core/common/cloud/cloud_policy_util.h b/components/policy/core/common/cloud/cloud_policy_util.h index 8381b2f4..5d7a00bd 100644 --- a/components/policy/core/common/cloud/cloud_policy_util.h +++ b/components/policy/core/common/cloud/cloud_policy_util.h
@@ -8,6 +8,8 @@ #include <string> #include "components/policy/policy_export.h" +#include "components/policy/proto/device_management_backend.pb.h" +#include "components/version_info/channel.h" namespace policy { @@ -28,6 +30,10 @@ // the domain, whereas on POSIX, this just returns the username. POLICY_EXPORT std::string GetOSUsername(); +// Converts |version_info::Channel| to |enterprise_management::Channel|. +POLICY_EXPORT enterprise_management::Channel ConvertToProtoChannel( + version_info::Channel channel); + } // namespace policy #endif // COMPONENTS_POLICY_CORE_COMMON_CLOUD_CLOUD_POLICY_UTIL_H_
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto index dafb516c..71d494e 100644 --- a/components/policy/proto/device_management_backend.proto +++ b/components/policy/proto/device_management_backend.proto
@@ -748,6 +748,15 @@ optional int32 cpu_temp = 2; } +// Chrome release channel, shared for different reports. +enum Channel { + CHANNEL_UNKNOWN = 0; + CHANNEL_CANARY = 1; + CHANNEL_DEV = 2; + CHANNEL_BETA = 3; + CHANNEL_STABLE = 4; +} + // Report device level status. message DeviceStatusReportRequest { reserved 4, 7, 13, 20; @@ -807,6 +816,9 @@ // TPM version information. optional TpmVersionInfo tpm_version_info = 21; + + // Release channel (stable, beta, etc.). + optional Channel channel = 22; } message OsUpdateStatus { @@ -890,14 +902,7 @@ // user agent. optional string browser_version = 1; - // Chrome browser channel, - enum Channel { - UNKNOWN = 0; - CANARY = 1; - DEV = 2; - BETA = 3; - STABLE = 4; - } + // Release channel (stable, beta, etc.). optional Channel channel = 2; // Required. The path to the browser executable so that we can uniquely
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb index c5c6dae..52d7de8 100644 --- a/components/policy/resources/policy_templates_am.xtb +++ b/components/policy/resources/policy_templates_am.xtb
@@ -713,7 +713,6 @@ ይህ መመሪያ ካልተዋቀረ <ph name="PRINTERS_ALLOW_ALL" /> እንደሆነ ይገመታል። </translation> <translation id="2908277604670530363">ከተኪ አገልጋዩ ጋር ያለው ከፍተኛ የተጓዳኝ ግንኙነቶች ብዛት</translation> -<translation id="2951386431828317490">ለመገለጫዎች ራስ-ሙላን ያንቁ</translation> <translation id="2956777931324644324">ይህ መመሪያ ከ <ph name="PRODUCT_NAME" /> ስሪት 36 ጀምሮ አገልግሎት መስጠት አቁሟል። የTLS ጎራ ጋር የተሳሰረው የምስክር ወረቀቶች ቅጥያ መንቃት እንዳለበት ይገልጻል። @@ -1535,11 +1534,6 @@ ይህ መመሪያ ወደ ሐሰት ከተዋቀረ ተጠቃሚዎች ይዘትን ወደ መሣሪያቸው cast ማድረግ አይችሉም። ይህ መመሪያ ወደ እውነት ከተዋቀረ ተጠቃሚዎች ይዘትን cast እንዲያደርጉ ይፈቀድላቸዋል። ይህ መመሪያ ካልተዋቀረ ተጠቃሚዎች ይዘትን ወደተመዘገቡ የChrome OS መሣሪያዎች cast እንዲያደርጉ አይፈቀድላቸውም፣ ነገር ግን ወዳልተመዘገቡ መሣሪያዎች cast ማድረግ ይችላሉ።</translation> <translation id="5330684698007383292"><ph name="PRODUCT_FRAME_NAME" /> የሚከተሉትን የይዘት አይነቶች እንዲቆጣጠር ይፍቀዱለት</translation> -<translation id="5360146044009867539">የ<ph name="PRODUCT_NAME" /> ራስ-ሙላ ባህሪን ያነቃል፣ እና ተጠቃሚዎች ከዚህ ቀደም የተከማቸ መረጃን በመጠቀም የመገለጫ እና የአድራሻ መረጃን በድር ቅጾች ላይ በራስ-እንዲያጠናቅቁ ያስችላቸዋል። - - ይህ ቅንብር ከተሰናከለ ራስ-ሙላ በጭራሽ የአድራሻ መረጃን አይጠቁምም ወይም አይሞላም፣ እንዲሁም ተጠቃሚው ድሩን እያሰሰ ሳለ ሊያስገባ የሚችለውን የክሬድቲ ካርድ መረጃን አያስቀምጥም። - - ይህን ቅንብር ከነቃ ወይም እሴት ከሌለው ተጠቃሚው በዩአይ ውስጥ ለአድራሻ ራስ-ሙላን መቆጣጠር ይችላል።</translation> <translation id="5365946944967967336">መነሻ አዝራር በመሳሪያ አሞሌው ላይ አሳይ</translation> <translation id="5366745336748853475">ጣቢያው የእውቅና ማረጋገጫ የሚጠይቅ ከሆነ በራስ-ሰር የደንበኛ እውቅና ማረጋገጫ ሲመረጥላቸው በSAML ፍሰተ ላይ አስተናጋጅ በሆነው ክፈፍ ውስጥ በተመረጠው በመለያ መግቢያ ማያ ገጽ ላይ የሚገቡ የዩአርኤል ሥርዓተ ጥለቶችን ዝርዝር እንዲጠቅሱ ያስችልዎታል።
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb index a0e125b7..e01c4e2 100644 --- a/components/policy/resources/policy_templates_ar.xtb +++ b/components/policy/resources/policy_templates_ar.xtb
@@ -691,7 +691,6 @@ في حال عدم تعيين هذه السياسة، تكون <ph name="PRINTERS_ALLOW_ALL" /> هي السياسة المفروضة. </translation> <translation id="2908277604670530363">أقصى عدد من الاتصالات المتزامنة للخادم الوكيل</translation> -<translation id="2951386431828317490">تفعيل "الملء التلقائي" للملفات الشخصية</translation> <translation id="2956777931324644324">تم إيقاف هذه السياسة اعتبارًا من <ph name="PRODUCT_NAME" /> الإصدار 36. تحدد إذا ما كان يجب تفعيل إضافة شهادات تعتمد على نطاق TLS. يتم استخدام هذا الإعداد لتفعيل إضافة شهادات تعتمد على نطاق TLS للاختبار. سيتم حذف هذا الإعداد التجريبي مستقبلاً.</translation> @@ -1464,11 +1463,6 @@ عند تعيين هذه السياسة على False، لن يتمكن المستخدمون من إرسال المحتوى إلى جهازهم. وعند تعيين هذه السياسة على True، سيتم السماح للمستخدمين بإرسال المحتوى. وفي حال لم يتم تعيين هذه السياسة، لن يتم السماح للمستخدمين بإرسال المحتوى إلى أجهزة نظام تشغيل Chrome المُسجَّلة لكن يمكنهم الإرسال إلى أجهزة غير مُسجَّلة.</translation> <translation id="5330684698007383292">السماح لـ <ph name="PRODUCT_FRAME_NAME" /> بالتعامل مع أنواع المحتوى التالية</translation> -<translation id="5360146044009867539">تفعّل هذه السياسة ميزة "الملء التلقائي" في <ph name="PRODUCT_NAME" /> وتسمح للمستخدمين بإكمال معلومات العنوان والملف الشخصي في نماذج الويب تلقائيًا باستخدام المعلومات المخزنة مسبقًا. - - في حال إيقاف هذا الإعداد، لن تقترح ميزة "الملء التلقائي" معلومات العنوان أو تملأها مطلقًا ولن تحفظ معلومات العنوان الإضافية التي قد يرسلها المستخدم أثناء تصفُّح الويب. - - وفي حال تفعيل هذا الإعداد أو عدم تحديد قيمة، سيتمكن المستخدم من التحكُّم في ميزة "الملء التلقائي" للعناوين في واجهة المستخدم.</translation> <translation id="5365946944967967336">عرض زر الصفحة الرئيسية في شريط الأدوات</translation> <translation id="5366745336748853475">تسمح لك بتعيين قائمة بأنماط عناوين URL التي تحدد المواقع التي يتم تحديد شهادات العميل لها تلقائيًا على شاشة تسجيل الدخول في الإطار الذي يستضيف تدفق SAML، وذلك في حال طلب الموقع لشهادة. والغرض من استخدام مثال هو تهيئة شهادة على مستوى الجهاز ليتم تقديمها إلى SAML IdP.
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb index 5656d67..774041b 100644 --- a/components/policy/resources/policy_templates_bg.xtb +++ b/components/policy/resources/policy_templates_bg.xtb
@@ -697,7 +697,6 @@ Ако правилото не е зададено, се използва <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Максимален брой едновременни връзки с прокси сървъра</translation> -<translation id="2951386431828317490">Активиране на автоматичното попълване за потребителските профили</translation> <translation id="2956777931324644324">Това правило е оттеглено от версия 36 на <ph name="PRODUCT_NAME" />. Посочва дали разширението за обвързани с домейна сертификати за TLS трябва да бъде активирано. @@ -1481,11 +1480,6 @@ Ако това правило е false, потребителите няма да могат да предават съдържание към устройството си. При true предаването ще е разрешено. В случай че правилото не е зададено, потребителите ще могат да предават към нерегистрирани устройства, но не и към регистрираните с Chrome OS.</translation> <translation id="5330684698007383292">Разрешаване на <ph name="PRODUCT_FRAME_NAME" /> да обработва следните типове съдържание</translation> -<translation id="5360146044009867539">Активира функцията на <ph name="PRODUCT_NAME" /> за автоматично попълване и позволява на потребителите да попълват автоматично уеб формуляри чрез вече съхранена информация за потребителски профили и адреси. - -При деактивиране на тази настройка функцията няма да предлага или попълва информация за адреси, нито ще запазва допълнителни данни за адреси, ако потребителят въведе такива, докато сърфира в мрежата. - -В случай че настройката е активирана или няма стойност, потребителят ще може да контролира функцията за автоматично попълване на адреси в ПИ.</translation> <translation id="5365946944967967336">Показване на бутона „Начало“ в лентата с инструменти</translation> <translation id="5366745336748853475">Позволява да съставите списък с образци на URL адреси, указващи за кои от сайтовете, изискващи клиентски сертификат, той да се избира автоматично в рамката на екрана за вход, хостваща процеса за влизане чрез SAML. Можете например да конфигурирате доставчикът на удостоверителни услуги чрез SAML да получава сертификат на ниво устройство.
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb index 688220b..6bc8856e 100644 --- a/components/policy/resources/policy_templates_bn.xtb +++ b/components/policy/resources/policy_templates_bn.xtb
@@ -106,7 +106,7 @@ <translation id="1353966721814789986">প্রারম্ভ পৃষ্ঠা</translation> <translation id="1354452738176731363">যখন এই নীতি মিথ্যাতে সেট করা হয়, ব্যবহারকারী লগ-ইন করা থাকলে ডিভাইসে অডিও আউটপুট থাকবে না। - এই নীতি শুধুমাত্র অন্তর্ভুক্ত স্পিকারকেই নয়, সব ধরণের অডিও আউটপুটকে প্রভাবিত করে। এই নীতির মাধ্যমে অডিও অ্যাক্সেসিবিলিটি বৈশিষ্ট্যগুলিও রোধ করা হয়। যদি কোনও ব্যবহারকারীর স্ক্রিন রিডার প্রয়োজন হয় তাহলে এই নীতি সক্ষম করবেন না। + এই নীতি শুধুমাত্র অন্তর্ভুক্ত স্পিকারকেই নয়, সব ধরনের অডিও আউটপুটকে প্রভাবিত করে। এই নীতির মাধ্যমে অডিও অ্যাক্সেসিবিলিটি বৈশিষ্ট্যগুলিও রোধ করা হয়। যদি কোনও ব্যবহারকারীর স্ক্রিন রিডার প্রয়োজন হয় তাহলে এই নীতি চালু করবেন না। যদি এই সেটিংটি সত্যতে সেট করা থাকে বা কনফিগার না করে রাখা হয় তাহলে ব্যবহারকারীরা তাদের ডিভাইসে যে সমস্ত অডিও আউটপুট কাজ করে সেগুলি ব্যবহার করতে পারবেন।</translation> <translation id="1359553908012294236">এই নীতিটি সত্যতে সেট থাকলে বা কনফিগার করা না থাকলে, <ph name="PRODUCT_NAME" /> অতিথি লগইন সক্ষম করবে। অতিথি লগইন হলো <ph name="PRODUCT_NAME" /> প্রোফাইল যেখানে সব উইন্ডোগুলি ছদ্মবেশী মোডে থাকে। @@ -423,11 +423,11 @@ এই নীতিটি সেট করা না থাকলে, ডিফল্ট মান ০ ডিগ্রী এবং ব্যবহারকারী এটি ইচ্ছেমতো পরিবর্তন করতে পারবেন। এই ক্ষেত্রে, ডিফল্ট মানটি পুনর্সূচনার সময় আবার প্রয়োগ হবে না।</translation> <translation id="21394354835637379">কোন কোন URL কে এক্সটেনশন, অ্যাপ আর থিম ইনস্টল করার অনুমতি দেওয়া হবে নির্দেশ করতে আপনাকে সাহায্য করে। - <ph name="PRODUCT_NAME" /> 21 থেকে শুরু করে, Chrome ওয়েব স্টোরের এর বাইরে থেকে এক্সটেনশন, অ্যাপ আর ইউজার স্ক্রিপ্ট ইনস্টল করা আরও কঠিন। আগে ব্যবহারকারীরা একটি *.crx ফাইলের লিঙ্কে ক্লিক করলে কিছু সতর্কতামূলক মেসেজ দিয়ে <ph name="PRODUCT_NAME" /> সেটি ইনস্টল করার প্রস্তাব দিত। <ph name="PRODUCT_NAME" /> 21এর পর, সেই ধরণের ফাইলগুলিকে ডাউনলোড করে <ph name="PRODUCT_NAME" /> এর সেটিংস পৃষ্ঠায় টেনে আনতে হবে। এই সেটিংয়ের মাধ্যমে কিছু নির্দিষ্ট URL এ পুরনো, সহজতর ইনস্টলেশন পদ্ধতি ব্যবহার করা যায়। + <ph name="PRODUCT_NAME" /> 21 থেকে শুরু করে, Chrome ওয়েব স্টোরের এর বাইরে থেকে এক্সটেনশন, অ্যাপ আর ইউজার স্ক্রিপ্ট ইনস্টল করা আরও কঠিন। আগে ব্যবহারকারীরা একটি *.crx ফাইলের লিঙ্কে ক্লিক করলে কিছু সতর্কতামূলক মেসেজ দিয়ে <ph name="PRODUCT_NAME" /> সেটি ইনস্টল করার প্রস্তাব দিত। <ph name="PRODUCT_NAME" /> 21এর পর, সেই ধরনের ফাইলগুলিকে ডাউনলোড করে <ph name="PRODUCT_NAME" /> এর সেটিংস পৃষ্ঠায় টেনে আনতে হবে। এই সেটিংয়ের মাধ্যমে কিছু নির্দিষ্ট URL এ পুরনো, সহজতর ইনস্টলেশন পদ্ধতি ব্যবহার করা যায়। - এই তালিকার প্রতিটি আইটেম হল একটি এক্সটেনশন-শৈলী মিল ধরণ (https://developer.chrome.com/extensions/match_patterns দেখুন)। ব্যবহারকারীরা সেগুলিকে এমন যেকোনও URL থেকে সহজেই ইনস্টল করতে পারবে যা এই তালিকাতে থাকা কোনও আইটেমের সাথে মেলে। *.crx ফাইল ও যেখান থেকে ডাউনলোড শুরু হয় সেই পৃষ্ঠা (অর্থাত উল্লেখকারী) উভয়কেই এই ধরণগুলির দ্বারা অবশ্যই মঞ্জুরিপ্রাপ্ত হতে হবে। + এই তালিকার প্রতিটি আইটেম হল একটি এক্সটেনশন-শৈলী মিল ধরন (https://developer.chrome.com/extensions/match_patterns দেখুন)। ব্যবহারকারীরা সেগুলিকে এমন যেকোনও URL থেকে সহজেই ইনস্টল করতে পারবে যা এই তালিকাতে থাকা কোনও আইটেমের সাথে মেলে। *.crx ফাইল ও যেখান থেকে ডাউনলোড শুরু হয় সেই পৃষ্ঠা (অর্থাত উল্লেখকারী) উভয়কেই এই ধরনগুলির দ্বারা অবশ্যই মঞ্জুরিপ্রাপ্ত হতে হবে। - <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> এই নীতিতে অগ্রগণ্যতা নেয়। এটি হল, কালোতালিকাতে একটি এক্সটেনশন যা এই তালিকাতে থাকা কোনও সাইট থেকে হলেও ইনস্টল হবে না।</translation> + <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> এই নীতিতে অগ্রগণ্যতা নেয়। এটি হল, কালো তালিকাতে একটি এক্সটেনশন যা এই তালিকাতে থাকা কোনও সাইট থেকে হলেও ইনস্টল হবে না।</translation> <translation id="2156132677421487971"><ph name="PRODUCT_NAME" /> এর জন্য নীতি কনফিগার করে, যা ব্রাউজার থেকে ট্যাব, সাইট বা ডেস্কটপকে দূরবর্তী দেখায় বা সাউন্ড সিস্টেমে পাঠায় এমন এক বৈশিষ্ট্য।</translation> <translation id="2166472654199325139">প্রাপ্তবয়স্কদের কন্টেন্টের সাইটগুলি ফিল্টার করবেন না</translation> <translation id="2168397434410358693">AC পাওয়ার চলাকালীন নিষ্ক্রিয়তা বিলম্ব</translation> @@ -521,9 +521,9 @@ নীতির প্রতিটি তালিকা আইটেম একটি স্ট্রিং হয় যাতে একটি এক্সটেনশন আইডি রয়েছে এবং ঐচ্ছিকভাবে, একটি "আপডেট" ইউআরএল-একটি সেমিকোলন (<ph name="SEMICOLON" />) দ্বারা পৃথকীকৃত। <ph name="CHROME_EXTENSIONS_LINK" /> ডেভেলপার মোডে এক্সটেনশন আইডি হল ৩২-অক্ষরের স্ট্রিং। "আপডেট" ইউআরএলটি, যদি নির্দিষ্ট করা থাকে, <ph name="LINK_TO_EXTENSION_DOC1" /> এ বর্ণনা অনুযায়ী একটি আপডেট ম্যানিফেস্ট XML ডকুমেন্টে নির্দেশ করা উচিত। স্বভাবত, Chrome ওয়েব স্টোর আপডেট ইউআরএল ব্যবহৃত হয় (যা বর্তমানে "https://clients2.google.com/service/update2/crx" হয়)। উল্লেখ্য যে এই নীতিতে সেট করা "আপডেট" ইউআরএল শুধুমাত্র প্রাথমিক ইনস্টলেশনের জন্য ব্যবহৃত হয়; এক্সটেনশনের পরবর্তী আপডেটগুলি এক্সটেনশনের ম্যানিফেস্টের মধ্যে নির্দেশিত আপডেট ইউআরএল-এ সদ্ব্যবহার করা হয়। এছাড়াও উল্লেখ্য যে "আপডেট" ইউআরএল উল্লেখ করা স্পষ্টভাবে <ph name="PRODUCT_NAME" /> ভার্সন পর্যন্ত এবং 67 সহ বাধ্যতামূলক ছিল। - যেমন, <ph name="EXTENSION_POLICY_EXAMPLE" /> স্ট্যান্ডার্ড Chrome ওয়েব ষ্টোর "আপডেট" ইউআরএল থেকে <ph name="EXTENSION_POLICY_EXAMPLE_EXTENSION_NAME" /> অ্যাপ্লিকেশনটি ইনস্টল করে। হোস্টিং এক্সটেনশন সম্পর্কে আরও তথ্যের জন্য, দেখুন: <ph name="LINK_TO_EXTENSION_DOC2" />।. + যেমন, <ph name="EXTENSION_POLICY_EXAMPLE" /> স্ট্যান্ডার্ড Chrome ওয়েব ষ্টোর "আপডেট" ইউআরএল থেকে <ph name="EXTENSION_POLICY_EXAMPLE_EXTENSION_NAME" /> অ্যাপটি ইনস্টল করে। হোস্টিং এক্সটেনশন সম্পর্কে আরও তথ্যের জন্য, দেখুন: <ph name="LINK_TO_EXTENSION_DOC2" />।. - যদি এই নীতিটি সেট না করে ছেড়ে দেওয়া হয়, তাহলে কোনও অ্যাপ্লিকেশন বা এক্সটেনশন নিজে থেকে ইনস্টল করা হয় না এবং ব্যবহারকারী <ph name="PRODUCT_NAME" /> এ কোন অ্যাপ বা এক্সটেনশন আন-ইনস্টল করতে পারে।</translation> + যদি এই নীতিটি সেট না করে ছেড়ে দেওয়া হয়, তাহলে কোনও অ্যাপ বা এক্সটেনশন নিজে থেকে ইনস্টল করা হয় না এবং ব্যবহারকারী <ph name="PRODUCT_NAME" /> এ কোন অ্যাপ বা এক্সটেনশন আন-ইনস্টল করতে পারে।</translation> <translation id="2292084646366244343">বানান ভুল সমস্যা সমাধানে সহায়তা করতে <ph name="PRODUCT_NAME" /> একটি Google ওয়েব পরিষেবা ব্যবহার করতে পারে৷ এই সেটিং সক্ষম থাকলে, এই পরিষেবা সর্বদা ব্যবহার করা যাবে৷ এই সেটিং অক্ষম থাকলে, এই পরিষেবা কখনও ব্যবহার করা যাবে না৷ একটি ডাউনলোড করা অভিধান ব্যাবহার করে বানান এখনও পরীক্ষা করা যেতে পারে; এই নীতি কেবল অনলাইন পরিষেবার ব্যবহারকে নিয়ন্ত্রণ করে৷ @@ -803,7 +803,6 @@ যদি এই নীতিটি সেট করা না থাকে তাহলে <ph name="PRINTERS_ALLOW_ALL" /> নীতি মেনে চলা হয়। </translation> <translation id="2908277604670530363">প্রক্সি সার্ভারের জন্য সংঘটনশীল সংযোগের সর্বধিক সংখ্যা</translation> -<translation id="2951386431828317490">প্রোফাইলগুলির জন্য AutoFill বিকল্প চালু করা</translation> <translation id="2956777931324644324">এই নীতিটি <ph name="PRODUCT_NAME" /> সংস্করণ ৩৬ এর হিসাবে অপসারণ করা হয়েছে। TLS ডোমেন-বাউন্ড সার্টিফিকেট এক্সটেনশান সক্ষম করা হবে কিনা তা নির্দিষ্ট করে। @@ -1082,7 +1081,7 @@ আপনি এই সেটিংটি সক্ষম করলে, <ph name="PRODUCT_NAME" /> এবং ARC-অ্যাপ্লিকেশানগুলি প্রক্সী সংক্রান্ত সমস্ত বিকল্প কমান্ড লাইন থেকে এড়িয়ে যায়। এই নীতিগুলি সেট না করে ছেড়ে যাওয়া হলে, ব্যবহারকারী নিজে থেকে প্রক্সী সেটিং চয়ন করার অনুমতি পায়।</translation> -<translation id="3758249152301468420">ডেভেলপারের টুল অক্ষম করুন</translation> +<translation id="3758249152301468420">ডেভেলপার টুল বন্ধ করুন</translation> <translation id="3764248359515129699">লিগ্যাসি সার্টিফিকেট কর্তৃপক্ষের একটি তালিকার জন্য সার্টিফিকেট ট্রান্সপারেন্সির প্রয়োজনীয়তা জারিকরণ বন্ধ করে। এই নীতিটি সার্টিফিকেট চেইনের জন্য সার্টিফিকেট ট্রান্সপারেন্সি প্রকাশের প্রয়োজনীয়তা বন্ধ করার অনুমতি দেয় যেগুলিতে নির্দিষ্ট subjectPublicKeyInfo হ্যাশ সহ সার্টিফিকেট রয়েছে। এটি এমন সার্টিফিকেটের অনুমতি দেয় যা অন্যথায় অবিশ্বস্ত হবে, কারণ এন্টারপ্রাইজ হোস্টগুলির জন্য ব্যবহার করা চালিয়ে যেতে সেগুলি সঠিকভাবে সর্বজনীনভাবে প্রকাশ করা হয়নি। @@ -1409,7 +1408,7 @@ <translation id="4474167089968829729">পাসওয়ার্ড পরিচালকে পাসওয়ার্ড সংরক্ষণ করা সক্ষম করুন</translation> <translation id="4476769083125004742">এই নীতিটি <ph name="BLOCK_GEOLOCATION_SETTING" /> এ সেট করা হলে, Android অ্যাপ্লিকেশানগুলি অবস্থানের তথ্য অ্যাক্সেস করতে পারে না। আপনি যদি এই নীতিটি অন্য যেকোনো মানে সেট করেন বা সেট না করে ছেড়ে যান, তাহলে কোনো Android অ্যাপ্লিকেশান অবস্থানের তথ্য অ্যাক্সেস করতে চাইলে ব্যবহারকারীর সম্মতি চাওয়া হয়।</translation> <translation id="4480694116501920047">ফোর্স SafeSearch</translation> -<translation id="4482640907922304445"><ph name="PRODUCT_NAME" /> টুলবারের মধ্যে হোম বোতাম দেখান৷ +<translation id="4482640907922304445"><ph name="PRODUCT_NAME" /> টুলবারের মধ্যে হোম বোতাম দেখুন৷ যদি আপনি এই সেটিংটি চালু করেন, হোম বোতাম সব সময় দেখা যাবে৷ @@ -1428,9 +1427,9 @@ যদি নীতির মান ০ হয়, তবে ডিফল্ট ক্যাশের মাপ ব্যবহার করা হবে, কিন্তু ব্যবহারকারী এটিকে পরিবর্তন করতে পারবেন না৷ নীতিটি ডিফল্ট মাপে সেট করা না থাকলে ডিফল্ট মাপ ব্যবহার করা হবে এবং ব্যবহারকারী --মিডিয়া-ক্যাশে-মাপ পতাকা দিয়ে এটিকে ওভাররাইড করতে পারবেন৷</translation> -<translation id="4508686775017063528">যদি এই নীতিটি সত্যতে সেট করা হয় বা সেট না করা হয়, তাহলে <ph name="PRODUCT_NAME" /> সক্ষম করা হবে, এবং ব্যবহারকারী এটি অ্যাপ মেনু থেকে লঞ্চ করতে পারবে, মিডিয়া নিয়ন্ত্রণগুলি এবং,মিডিয়া নিয়ন্ত্রণগুলি এবং (যদি দেখানো হয় তাহলে) Cast টুল দণ্ড আইকন থেকে এটি লঞ্চ করতে সক্ষম হবে। +<translation id="4508686775017063528">যদি এই নীতিটি সত্যতে সেট করা হয় বা সেট না করা হয়, তাহলে <ph name="PRODUCT_NAME" /> চালু করা হবে, এবং ব্যবহারকারী এটি অ্যাপ মেনু থেকে লঞ্চ করতে পারবে, মিডিয়া নিয়ন্ত্রণগুলি এবং মিডিয়া নিয়ন্ত্রণগুলি এবং (যদি দেখানো হয় তাহলে) Cast টুলবার আইকন থেকে এটি লঞ্চ করতে চালু হবে। - এই নীতিটি মিথ্যাতে সেট করা হলে, <ph name="PRODUCT_NAME" /> অক্ষম হয়ে যাবে।</translation> + এই নীতিটি মিথ্যাতে সেট করা হলে, <ph name="PRODUCT_NAME" /> বন্ধ হয়ে যাবে।</translation> <translation id="4515404363392014383">বিশ্বস্ত সূত্রের ক্ষেত্রে নিরাপদ ব্রাউজিং চালু করুন</translation> <translation id="4518251772179446575">যখনই কোনও সাইট ব্যবহারকারীদের ভৌত অবস্থানটি ট্র্যাক করতে চায় তখনই জিজ্ঞাসা করুন</translation> <translation id="4519046672992331730"><ph name="PRODUCT_NAME" /> এর বহুউপযোগী ক্ষেত্রে সার্চের প্রস্তাবনাগুলি সক্ষম করে এবং ব্যবহারকারীদের এই সেটিং পরিবর্তন করতে বাধা দেয়৷ @@ -1751,12 +1750,7 @@ এই নীতিটি যদি মিথ্যাতে সেট করা থাকে তাহলে ব্যবহারকারীরা তাদের ডিভাইসে কন্টেন্ট কাস্ট করতে পারবেন না। যদি এই নীতিটি সত্যতে সেট করা থাকে তাহলে ব্যবহারকারীদের কন্টেন্ট কাস্ট করার অনুমতি দেওয়া হয়। যদি নীতিটি সেট করা না থাকে তাহলে ব্যবহারকারীদেরকে তালিকাভুক্ত Chrome OS ডিভাইসে কাস্ট করার অনুমতি দেওয়া হয় না, কিন্তু তারা তালিকাভুক্ত নয় এমন ডিভাইসে কাস্ট করতে পারেন।</translation> <translation id="5330684698007383292">নিম্নোক্ত সামগ্রী প্রকার পরিচালনা করতে <ph name="PRODUCT_FRAME_NAME" /> কে মঞ্জুরি দিন৷</translation> -<translation id="5360146044009867539"><ph name="PRODUCT_NAME" />-এর AutoFill বৈশিষ্ট্যটি চালু করে এবং ব্যবহারকারীদের ঠিকানা বা ক্রেডিট কার্ডের তথ্যের মতো আগে থেকে থাকা তথ্য ব্যবহার করে ওয়েব ফর্ম পূরণ করার অনুমতি দেয়। - - যদি আপনি এই সেটিসংটি বন্ধ করেন তবে AutoFill ঠিকানার তথ্য পূরণের সুপারিশ করবে না বা এটি ঠিকানার অতিরিক্ত তথ্য সেভ হয়ত করবে না যা ওয়েব ব্রাউজ করার সময় ব্যবহারকারী জমা দিতে পারে। - - আপনি যদি এই সেটিংটি চালু করেন বা একটি মান সেট না করেন তবে ব্যবহারকারী UI-তে সমগ্র AutoFill বৈশিষ্ট্য নিয়ন্ত্রণ করতে পারবেন।</translation> -<translation id="5365946944967967336">টুলবারে হোম বোতাম দেখান</translation> +<translation id="5365946944967967336">টুলবারে হোম বোতাম দেখুন</translation> <translation id="5366745336748853475">কোনও সাইটে যদি সার্টিফিকেট প্রয়োজন হয় তাহলে এই নীতির মাধ্যমে আপনি URL প্যাটার্নের একটি তালিকা নির্দিষ্ট করতে পারেন যেখানে এমন সাইট উল্লেখ করা থাকবে যেগুলির ক্ষেত্রে SAML ফ্লো হোস্ট করা ফ্রেমের সাইন-ইন স্ক্রিনে ক্লায়েন্ট সার্টিফিকেট নিজে থেকেই বেছে নেওয়া হয়। ডিভাইসের সমস্ত কাজে প্রযোজ্য যে সার্টিফিকেট SAML IdP তে জমা দিতে হয়, সেটি কনফিগার করার ক্ষেত্রে এটি ব্যবহার করা হয়। এই মানটিতে স্ট্রিং এর আকারে সাজানো এক গুচ্ছ JSON ডিকশনারি থাকতে হবে। প্রতিটি ডিকশনারি নির্দিষ্ট ভাবে সাজাতে হবে { "pattern": "$URL_PATTERN", "filter" : $FILTER }, যেখানে $URL_PATTERN হল কন্টেন্ট সেট করার প্যাটার্ন। কোন ক্লায়েন্ট সার্টিফিকেটগুলির মধ্যে থেকে ব্রাউজার বিশেষ কোনওটি নিজে থেকে বেছে নেবে, তা $FILTER নিয়ন্ত্রণ করে। ফিল্টার ব্যবহার না করলে শুধুমাত্র সেই সার্টিফিকেটগুলিই বেছে নেওয়া হয় যেগুলি সার্ভারের সার্টিফিকেট রিকোয়েস্টের সাথে মেলে। $FILTER যদি এইভাবে দেওয়া থাকে { "ISSUER": { "CN": "$ISSUER_CN" } } তাহলে শুধুমাত্র সেই ক্লায়েন্ট সার্টিফিকেটগুলিই বেছে নেওয়া হয় যেগুলি CommonName $ISSUER_CN সার্টিফিকেটের মাধ্যমে ইস্যু করা হয়েছে। $FILTER হিসেবে যদি ফাঁকা ডিকশনারি {} সেট করা থাকে তাহলে ক্লায়েন্ট সার্টিফিকেট বেছে নেওয়ার উপরে কোনও অতিরিক্ত বিধিনিষেধ আরোপ করা হয় না। @@ -2201,7 +2195,7 @@ <translation id="654303922206238013">ecryptfs এর জন্য মাইগ্রেশনের কৌশল</translation> <translation id="6544897973797372144">যদি এই নীতিটি সত্যতে সেট থাকে এবং ChromeOsReleaseChannel নীতি নির্দিষ্ট করা না থাকে তাহলে নথিভুক্ত ডোমেনের ব্যবহারকারীরা ডিভাইসের প্রকাশ চ্যানেল পরিবর্তন করার জন্য মঞ্জুরিপ্রাপ্ত হবে৷ এই নীতিটি যদি মিথ্যাতে সেট থাকে তাহলে, শেষবার এটিকে যে চ্যানেলেই সেট করা হোক না কেন ডিভাইসটি লক হবে৷ - ব্যবহারকারী নির্বাচিত চ্যানেল ChromeOsReleaseChannel নীতি দ্বারা ওভাররাইড হবে, কিন্তু নীতি চ্যানেলটি যদি ডিভাইসে যেটি ইনস্টল করা আছে তার চেয়ে আরও স্থায়ী হয় তাহলে, চ্যানেলটি কেবল তখনই পাল্টাবে যখন আরও স্থায়ী চ্যানেলটি ডিভাইসে যেটি ইনস্টল করা আছে তার চেয়ে উচ্চতর সংস্করণে পৌঁছাবে৷</translation> + ব্যবহারকারী নির্বাচিত চ্যানেল ChromeOsReleaseChannel নীতি দ্বারা ওভাররাইড হবে, কিন্তু নীতি চ্যানেলটি যদি ডিভাইসে যেটি ইনস্টল করা আছে তার চেয়ে আরও স্থায়ী হয় তাহলে, চ্যানেলটি কেবল তখনই পাল্টাবে যখন আরও স্থায়ী চ্যানেলটি ডিভাইসে যেটি ইনস্টল করা আছে তার চেয়ে উচ্চতর ভার্সনে পৌঁছাবে৷</translation> <translation id="6559057113164934677">ক্যামেরা ও মাইক্রোফোনে অ্যাক্সেসের মঞ্জুরি কোনো সাইটকে দেবেন না</translation> <translation id="6561396069801924653">সিস্টেম ট্রের মেনুতে অ্যাক্সেসযোগ্যতার বিকল্পগুলি দেখান</translation> <translation id="6565312346072273043">লগইন স্ক্রীণে অন-স্ক্রীণ কীবোর্ড অ্যাক্সেযোগ্যতা বৈশিষ্ট্যটির ডিফল্ট স্থিতি সেট করুন৷ @@ -2327,11 +2321,11 @@ <ph name="PRODUCT_NAME" /> চালু করার সময় তাতে যে ফ্ল্যাগগুলি প্রয়োগ করা হবে সেগুলিকে নির্দিষ্ট করে। নির্দিষ্ট ফ্ল্যাগগুলি শুধুমাত্র লগ-ইন স্ক্রিনে প্রয়োগ করা হয়। এই নীতির মাধ্যমে সেট করা ফ্ল্যাগগুলি ব্যবহারকারী সেশনে প্রযোজ্য হয় না।</translation> <translation id="685769593149966548">YouTube এর জন্য কঠোর সীমাবদ্ধ মোড বলবৎ করুন</translation> <translation id="686079137349561371">Microsoft Windows 7 অথবা তার পরবর্তী ভার্সন</translation> -<translation id="687046793986382807"><ph name="PRODUCT_NAME" /> সংস্করণ ৩৫ থেকে এই নীতিটিকে বাতিল করা হয়েছে৷ +<translation id="687046793986382807"><ph name="PRODUCT_NAME" /> ভার্সন ৩৫ থেকে এই নীতিটিকে বাতিল করা হয়েছে৷ -বিকল্প মান নির্বিশেষে পৃষ্ঠাটিতে কোনোভাবে মেমরি তথ্যের প্রতিবেদন করা হয়েছে, কিন্তু প্রতিবেদন করা আকারগুলি +বিকল্প মান নির্বিশেষে পৃষ্ঠাটিতে কোনওভাবে মেমরি তথ্যের প্রতিবেদন করা হয়েছে, কিন্তু প্রতিবেদন করা আকারগুলি নিরবচ্ছিন্ন ভাবে রাখা হয়নি এবং সুরক্ষার কারণে আপডেটের রেটকে সীমিত করা হয়েছে৷ রিয়েল-টাইমে নির্ভুল ডেটা পাওয়ার জন্য, -দয়া করে টেলিমেট্রির মতো টুল ব্যবহার করুন৷</translation> +অনুগ্রহ করে টেলিমেট্রির মতো টুল ব্যবহার করুন৷</translation> <translation id="6894178810167845842">নতুন ট্যাব পৃষ্ঠার URL</translation> <translation id="6899705656741990703">স্বতঃসনাক্ত প্রক্সি সেটিংস</translation> <translation id="6903814433019432303">এই নীতি খুচরা মোডে শুধুমাত্র সক্রিয়৷ @@ -3206,13 +3200,13 @@ <translation id="8858642179038618439">YouTube নিরাপত্তা মোড বলবৎ করে</translation> <translation id="8860342862142842017">subjectPublicKeyInfo হ্যাশের জন্য শংসাপত্রের স্বচ্ছতার প্রয়োগ বন্ধ করুন</translation> <translation id="8864975621965365890">যখন একটি সাইট <ph name="PRODUCT_FRAME_NAME" /> এর দ্বারা রেন্ডার করা হয় তখন এতে প্রদর্শিত প্রত্যাখ্যানের বিজ্ঞপ্তিটিকে গোপন করে৷</translation> -<translation id="8867464911288727016"><ph name="PRODUCT_NAME" /> এ সমন্বিত Google অনুবাদ পরিষেবা সক্ষম করে। +<translation id="8867464911288727016"><ph name="PRODUCT_NAME" /> এ সমন্বিত Google অনুবাদ পরিষেবা চালু করে। - আপনি যদি এই সেটিং সক্ষম করেন তাহলে <ph name="PRODUCT_NAME" /> ব্যবহারকারীর জন্য পৃষ্ঠাটি অনুবাদ করার প্রস্তাব দিয়ে একটি সমন্বিত অনুবাদ টুলবার (সমুচিত ক্ষেত্রে) এবং ডান-ক্লিকের কন্টেক্সট মেনুতে একটি অনুবাদের বিকল্প দেখাবে। + আপনি যদি এই সেটিং চালু করেন তাহলে <ph name="PRODUCT_NAME" /> ব্যবহারকারীর জন্য পৃষ্ঠাটি অনুবাদ করার প্রস্তাব দিয়ে একটি সমন্বিত অনুবাদ টুলবার (সমুচিত ক্ষেত্রে) এবং ডান-ক্লিকের কন্টেক্সট মেনুতে একটি অনুবাদের বিকল্প দেখাবে। - আপনি যদি সেটিংটি অক্ষম করেন তাহলে সব অন্তর্ভুক্ত অনুবাদ বৈশিষ্ট্য অক্ষম হয়ে যাবে। + আপনি যদি সেটিংটি বন্ধ করেন তাহলে সব অন্তর্ভুক্ত অনুবাদ বৈশিষ্ট্য বন্ধ হয়ে যাবে। - আপনি যদি এই সেটিংটি সক্ষম অথবা অক্ষম করেন তাহলে ব্যবহারকারীরা <ph name="PRODUCT_NAME" /> এর মধ্যে এই সেটিংটি পরিবর্তন অথবা ওভাররাইড করতে পারবেন না। + আপনি যদি এই সেটিংটি চালু অথবা বন্ধ করেন তাহলে ব্যবহারকারীরা <ph name="PRODUCT_NAME" /> এর মধ্যে এই সেটিংটি পরিবর্তন অথবা ওভাররাইড করতে পারবেন না। যদি এই সেটিংটি সেট না থাকা হিসেবে ছেড়ে যাওয়া হয় তাহলে ব্যবহারকারী এই ক্রিয়াটি ব্যবহার করবেন কিনা তার সিদ্ধান্ত তিনি নিজেই নিতে পারেন।</translation> <translation id="8870318296973696995">হোম পৃষ্ঠা</translation>
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb index 1e70d28..dd4b1f3 100644 --- a/components/policy/resources/policy_templates_ca.xtb +++ b/components/policy/resources/policy_templates_ca.xtb
@@ -692,7 +692,6 @@ Si aquesta política no es defineix, es pressuposa que s'aplica <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Nombre màxim de connexions paral·leles al servidor intermediari</translation> -<translation id="2951386431828317490">Activa Emplenament automàtic per als perfils</translation> <translation id="2956777931324644324">Aquesta política s'ha retirat a partir de <ph name="PRODUCT_NAME" />, versió 36. Especifica si l'extensió de certificats lligats al domini TLS ha d'estar activada. @@ -1121,6 +1120,15 @@ Si aquesta política es deixa sense establir, s'utilitzarà el valor general predeterminat de la política "DefaultKeygenSetting" (si està configurada) per a tots els llocs web, o bé s'utilitzarà la configuració personal de l'usuari.</translation> <translation id="4239720644496144453">La memòria cau no s'utilitza a les aplicacions per a Android. Si diversos usuaris instal·len la mateixa aplicació per a Android, es baixarà de nou en cada cas.</translation> +<translation id="4243336580717651045">Activa la recopilació de dades anònimes i amb claus d'URL a <ph name="PRODUCT_NAME" /> impedeix que els usuaris puguin canviar aquesta opció. + + La recopilació de dades anònimes i amb claus d'URL envia a Google els URL de pàgines que l'usuari visita per millorar les cerques i la navegació. + + Si actives aquesta política, la recopilació de dades anònimes i amb claus d'URL estarà sempre activa. + + Si desactives aquesta política, la recopilació de dades anònimes i amb claus d'URL no estarà mai activa. + + Si aquesta política es deixa sense definir, la recopilació de dades anònimes i amb claus d'URL s'activarà però l'usuari podrà canviar aquesta opció.</translation> <translation id="4250680216510889253">No</translation> <translation id="4261820385751181068">Configuració regional de la pantalla d'inici de sessió del dispositiu</translation> <translation id="427220754384423013">Especifica les impressores que un usuari pot fer servir. @@ -1470,11 +1478,6 @@ Si aquesta política es defineix com a "false", els usuaris no podran emetre contingut al seu dispositiu. Si es defineix com a "true", els usuaris podran emetre contingut. Si no es defineix, els usuaris no podran emetre contingut en dispositius de Chrome OS inscrits, però sí que ho podran fer en dispositius no inscrits.</translation> <translation id="5330684698007383292">Permet que <ph name="PRODUCT_FRAME_NAME" /> gestioni els tipus de contingut següents</translation> -<translation id="5360146044009867539">Activa la funció Emplenament automàtic de <ph name="PRODUCT_NAME" /> i permet que els usuaris emplenin la informació de perfils i d'adreces automàticament als formularis web amb dades emmagatzemades anteriorment. - - Si es desactiva aquesta opció, Emplenament automàtic mai no suggerirà ni emplenarà la informació d'adreces, ni tampoc desarà la informació addicional d'adreces que l'usuari enviï mentre navega pel web. - - Si s'activa aquesta opció o no s'hi defineix cap valor, l'usuari podrà controlar el funcionament d'Emplenament automàtic amb les adreces a la IU.</translation> <translation id="5365946944967967336">Mostra el botó Pàgina d'inici a la barra d'eines</translation> <translation id="5366745336748853475">Et permet definir una llista de patrons d'URL en què s'especifiquin els llocs web per als quals se selecciona un certificat de client automàticament a la pantalla d'inici de sessió del marc que allotja el flux SAML, en cas que el lloc web sol·liciti un certificat. Per exemple, es pot configurar un certificat per a tot el dispositiu per oferir-lo al proveïdor d'identitat SAML. @@ -1746,6 +1749,7 @@ Per bloquejar la pantalla en mode inactiu, us recomanem que activeu el bloqueig de pantalla en mode de suspensió i que configureu <ph name="PRODUCT_OS_NAME" /> perquè se suspengui després del temps d'inactivitat. Aquesta política només s'ha d'utilitzar quan el bloqueig de pantalla s'hagi de produir molt abans que la suspensió o quan no vulgueu emprar la suspensió en mode inactiu. El valor de la política s'ha d'especificar en mil·lisegons. Els valors es fixen perquè siguin inferiors al temps d'inactivitat.</translation> +<translation id="6097601282776163274">Activa la recopilació de dades anònimes i amb claus d'URL</translation> <translation id="6111936128861357925">Permet el joc sorpresa del dinosaure</translation> <translation id="6114416803310251055">obsolet</translation> <translation id="6133088669883929098">Permet que tots els llocs utilitzin la generació de claus</translation>
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb index 0d295b8..eab78cc 100644 --- a/components/policy/resources/policy_templates_cs.xtb +++ b/components/policy/resources/policy_templates_cs.xtb
@@ -71,7 +71,7 @@ <translation id="1221359380862872747">Načíst konkrétní adresy URL při přihlášení do ukázky</translation> <translation id="1223789468190631420">Stav povolení Bezpečného prohlížení pro důvěryhodné zdroje</translation> <translation id="123081309365616809">Povoluje odesílání obsahu do zařízení</translation> -<translation id="1243570869342663665">Ovládat filtrování obsahu pouze pro dospělé pomocí funkce SafeSites.</translation> +<translation id="1243570869342663665">Ovládat filtrování obsahu pro dospělé pomocí funkce SafeSites.</translation> <translation id="1257550411839719984">Nastavit výchozí adresář pro stahování</translation> <translation id="1265053460044691532">Omezit dobu, po kterou se uživatel ověřený pomocí technologie SAML může přihlásit offline</translation> <translation id="1291880496936992484">Upozornění: Po verzi 52 (přibližně v září 2016) bude šifrovací algoritmus RC4 z prohlížeče <ph name="PRODUCT_NAME" /> zcela odstraněn a tato zásada přestane fungovat. @@ -692,7 +692,6 @@ Pokud tato zásada není nastavena, předpokládá se použití možnosti <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Maximální počet současných připojení k proxy serveru</translation> -<translation id="2951386431828317490">Povoluje automatické vyplňování pro profily</translation> <translation id="2956777931324644324">Podpora této zásady byla ve verzi 36 prohlížeče <ph name="PRODUCT_NAME" /> ukončena. Určuje, zda má být povoleno rozšíření certifikátů svázaných s doménami. @@ -1312,7 +1311,7 @@ Pokud je tato zásada nastavená na hodnotu false, návrhy se načítat ani zobrazovat nebudou.</translation> <translation id="4788252609789586009">Aktivuje v prohlížeči <ph name="PRODUCT_NAME" /> funkci Automatické vyplňování a umožňuje uživatelům automaticky ve webových formulářích vyplňovat informace o platebních kartách pomocí dříve uložených údajů. - Pokud je toto nastavení zakázáno, nebude automatické vyplňování navrhovat ani vyplňovat informace o platebních kartách a nebude ani ukládat další informace o platebních kartách, které uživatel při prohlížení webu odešle. + Pokud je toto nastavení vypnuto, nebude automatické vyplňování navrhovat ani vyplňovat informace o platebních kartách a nebude ani ukládat další informace o platebních kartách, které uživatel při prohlížení webu odešle. Pokud je toto nastavení zapnuto nebo nemá žádnou hodnotu, uživatel bude moci automatické vyplňování pro platební karty ovládat v uživatelském rozhraní.</translation> <translation id="4791031774429044540">Aktivuje funkci usnadnění přístupu pomocí velkého kurzoru. @@ -1504,11 +1503,6 @@ Je-li tato zásada nastavena na hodnotu False, uživatelé do svého zařízení nebudou moci odesílat obsah. Je-li tato zásada nastavena na hodnotu True, uživatelé obsah odesílat mohou. Pokud tato zásada není nastavena, uživatelé nemohou odesílat obsah do zaregistrovaných zařízení se systémem Chrome OS, ale do nezaregistrovaných zařízení jej odesílat mohou.</translation> <translation id="5330684698007383292">Umožnit pluginu <ph name="PRODUCT_FRAME_NAME" /> zpracovávat následující typy obsahu</translation> -<translation id="5360146044009867539">Aktivuje v prohlížeči <ph name="PRODUCT_NAME" /> funkci Automatické vyplňování a umožňuje uživatelům automaticky ve webových formulářích vyplňovat informace o profilu a adresách pomocí dříve uložených údajů. - - Pokud je toto nastavení zakázáno, automatické vyplňování nebude navrhovat ani vyplňovat informace o adresách a nebude ani ukládat další informace o adresách, které uživatel při prohlížení webu odešle. - - Pokud je toto nastavení zapnuto nebo nemá žádnou hodnotu, uživatel bude moci automatické vyplňování adres ovládat v uživatelském rozhraní.</translation> <translation id="5365946944967967336">Zobrazit na liště tlačítko Domů</translation> <translation id="5366745336748853475">Umožňuje zadat seznam vzorů adres URL webů, pro které se na přihlašovací obrazovce v rámci procesu SAML automaticky vybere certifikát klienta, pokud o něj daný web požádá. Tuto zásadu lze využít například k nakonfigurování certifikátu pro celé zařízení, který bude předkládán poskytovateli identity SAML.
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb index 4d17a4c..3039799 100644 --- a/components/policy/resources/policy_templates_da.xtb +++ b/components/policy/resources/policy_templates_da.xtb
@@ -701,7 +701,6 @@ Hvis politikken ikke angives, anvendes <ph name="PRINTERS_ALLOW_ALL" /> som standard. </translation> <translation id="2908277604670530363">Maksimalt antal samtidige forbindelser til proxyserveren</translation> -<translation id="2951386431828317490">Aktivér AutoFyld for profiler</translation> <translation id="2956777931324644324">Denne politik udgik fra og med <ph name="PRODUCT_NAME" /> version 36. Angiver, om udvidelsen for certifikater, der er bundet af TLS-domænet, skal aktiveres. @@ -1315,7 +1314,7 @@ Hvis denne indstilling er deaktiveret, foreslår eller udfylder AutoFyld aldrig betalingskortoplysninger, og der gemmes heller ikke yderligere betalingskortoplysninger, som brugeren muligvis indsender, når vedkommende er på nettet. - Hvis denne indstilling er aktiveret, kan brugeren administrere den overordnede AutoFyld-funktion for betalingskort i brugerfladen.</translation> + Hvis denne indstilling er aktiveret eller ingen værdi har kan brugeren administrere den overordnede AutoFyld-funktion for betalingskort i brugerfladen.</translation> <translation id="4791031774429044540">Aktivér hjælpefunktionen Stor markør. Hvis denne politik angives som sand, vil den store markør altid være aktiveret. @@ -1489,11 +1488,6 @@ Hvis denne politik er angivet som Falsk, kan brugerne ikke caste indhold til deres enheder. Hvis denne politik er angivet som Sand, kan brugerne caste indhold. Hvis politikken ikke er angivet, kan brugerne ikke caste indhold til tilmeldte Chrome OS-enheder, men de kan caste indhold til enheder, der ikke er tilmeldt.</translation> <translation id="5330684698007383292">Tillad, at <ph name="PRODUCT_FRAME_NAME" /> håndterer følgende indholdstyper</translation> -<translation id="5360146044009867539">Aktiverer funktionen AutoFyld for <ph name="PRODUCT_NAME" /> og giver brugerne mulighed for automatisk at udfylde webformularer med profil- og adresseoplysninger, der er gemt tidligere. - - Hvis denne indstilling er deaktiveret, foreslår eller udfylder AutoFyld aldrig adresseoplysninger, og der gemmes heller ikke yderligere adresseoplysninger, som brugeren muligvis indsender, når vedkommende er på nettet. - - Hvis denne indstilling er aktiveret, kan brugeren administrere den overordnede AutoFyld-funktion for adresser i brugerfladen.</translation> <translation id="5365946944967967336">Vis knap til startsiden på værktøjslinjen</translation> <translation id="5366745336748853475">Giver dig mulighed for at angive en liste over webadressemønstre, som angiver websites, hvor der automatisk vælges et klientcertifikat på loginskærmen i rammen for SAML-flowet, hvis websitet anmoder om et certifikat. Et eksempel på brug er at konfigurere et certifikat for hele enheden, der præsenteres for SAML IdP.
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index ce925094..29add80 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -695,7 +695,6 @@ Wenn diese Richtlinie nicht konfiguriert ist, wird angenommen, dass <ph name="PRINTERS_ALLOW_ALL" /> ausgewählt ist. </translation> <translation id="2908277604670530363">Maximale Anzahl gleichzeitiger Verbindungen zum Proxyserver</translation> -<translation id="2951386431828317490">AutoFill für Profile aktivieren</translation> <translation id="2956777931324644324">Diese Richtlinie wird seit <ph name="PRODUCT_NAME" /> Version 36 nicht mehr verwendet. Sie legt fest, ob die Erweiterung für domaingebundene TLS-Zertifikate aktiviert werden soll. @@ -1474,11 +1473,6 @@ Wird diese Richtlinie auf "false" gesetzt, ist es Nutzern nicht möglich, Inhalte auf ihr Gerät zu streamen. Wird diese Richtlinie auf "true" gesetzt, können Nutzer Inhalte streamen. Ist diese Richtlinie nicht definiert, so können Nutzer zwar keine Inhalte an angemeldete Chrome OS-Geräte streamen, aber an andere Geräte.</translation> <translation id="5330684698007383292">Verarbeitung der folgenden Inhaltstypen durch <ph name="PRODUCT_FRAME_NAME" /> zulassen</translation> -<translation id="5360146044009867539">Aktiviert die AutoFill-Funktion von <ph name="PRODUCT_NAME" /> und ermöglicht es Nutzern, Profil- und Adressinformationen in Webformularen automatisch mit zuvor gespeicherten Informationen ausfüllen zu lassen. - - Wenn diese Einstellung deaktiviert ist, schlägt AutoFill weder Adressinformationen vor oder füllt sie automatisch aus noch werden zusätzliche Adressinformationen gespeichert, die der Nutzer während des Surfens im Web möglicherweise sendet. - - Falls diese Einstellung aktiviert ist oder keinen Wert hat, kann der Nutzer die AutoFill-Funktion in der UI für Adressen steuern.</translation> <translation id="5365946944967967336">Startseiten-Schaltfläche auf Symbolleiste anzeigen</translation> <translation id="5366745336748853475">Ermöglicht Ihnen die Zusammenstellung einer Liste mit URL-Mustern, die Websites angeben, für die auf dem Anmeldebildschirm im Frame, der den SAML-Flow hostet, automatisch ein Clientzertifikat ausgewählt wird, wenn die Website ein Zertifikat anfordert. Zum Beispiel kann damit ein geräteübergreifendes Zertifikat konfiguriert werden, das dem SAML IdP präsentiert wird.
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb index 214f7089..947330a 100644 --- a/components/policy/resources/policy_templates_el.xtb +++ b/components/policy/resources/policy_templates_el.xtb
@@ -718,7 +718,6 @@ Εάν δεν οριστεί αυτή η πολιτική, θεωρείται ότι ισχύει η επιλογή <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Μέγιστος αριθμός ταυτόχρονων συνδέσεων στον διακομιστή μεσολάβησης</translation> -<translation id="2951386431828317490">Ενεργοποίηση της Αυτόματης Συμπλήρωσης για προφίλ</translation> <translation id="2956777931324644324">Αυτή η πολιτική έχει αποσυρθεί από την έκδοση 36 του <ph name="PRODUCT_NAME" /> και έπειτα. Καθορίζει εάν θα πρέπει να ενεργοποιείται η επέκταση πιστοποιητικών TLS βάσει τομέα. @@ -1538,11 +1537,6 @@ Εάν αυτή η πολιτική οριστεί ως False (ψευδής), οι χρήστες δεν θα μπορούν να μεταδώσουν περιεχόμενο στη συσκευή τους. Εάν αυτή η πολιτική οριστεί ως True (αληθής), επιτρέπεται η μετάδοση περιεχομένου από τους χρήστες. Εάν αυτή η πολιτική δεν οριστεί, δεν επιτρέπεται στους χρήστες να μεταδίδουν περιεχόμενο σε εγγεγραμμένες συσκευές Chrome OS, αλλά η μετάδοση περιεχομένου επιτρέπεται σε μη εγγεγραμμένες συσκευές.</translation> <translation id="5330684698007383292">Να επιτρέπεται στο <ph name="PRODUCT_FRAME_NAME" /> η διαχείριση των παρακάτω τύπων περιεχομένου</translation> -<translation id="5360146044009867539">Ενεργοποιεί τη λειτουργία Αυτόματης Συμπλήρωσης του <ph name="PRODUCT_NAME" /> και επιτρέπει στους χρήστες την αυτόματη συμπλήρωση προφίλ και πληροφοριών διεύθυνσης σε φόρμες ιστού που με χρήση πληροφοριών που αποθηκεύτηκαν στο παρελθόν. - - Εάν αυτή η ρύθμιση απενεργοποιηθεί, η Αυτόματη Συμπλήρωση δεν θα προτείνει ποτέ ή δεν θα συμπληρώνει τις πληροφορίες διεύθυνσης, ούτε θα αποθηκεύει επιπλέον πληροφορίες διεύθυνσης που μπορεί να υποβάλει ο χρήστης κατά την περιήγηση στον ιστό. - - Εάν αυτή η ρύθμιση ενεργοποιηθεί ή δεν έχει τιμή, ο χρήστης θα έχει τη δυνατότητα να ελέγξει την Αυτόματη Συμπλήρωση για διευθύνσεις στη διεπαφή χρήστη.</translation> <translation id="5365946944967967336">Εμφάνιση του κουμπιού Αρχικής σελίδας στη γραμμή εργαλείων</translation> <translation id="5366745336748853475">Σας επιτρέπει να προσδιορίσετε μια λίστα προτύπων url που καθορίζουν ιστοτόπους για τους οποίους επιλέγεται αυτόματα ένα πιστοποιητικό πελάτη στην οθόνη σύνδεσης στο πλαίσιο που φιλοξενεί τη ροή SAML, εάν ο ιστότοπος απαιτεί κάποιο πιστοποιητικό. Ένα παράδειγμα χρήσης είναι η διαμόρφωση ενός πιστοποιητικού εύρους συσκευής προκειμένου να παρουσιάζεται στο SAML IdP.
diff --git a/components/policy/resources/policy_templates_en-GB.xtb b/components/policy/resources/policy_templates_en-GB.xtb index dd9945f..3306d68 100644 --- a/components/policy/resources/policy_templates_en-GB.xtb +++ b/components/policy/resources/policy_templates_en-GB.xtb
@@ -725,7 +725,6 @@ If this policy is not set, <ph name="PRINTERS_ALLOW_ALL" /> is assumed. </translation> <translation id="2908277604670530363">Maximum number of concurrent connections to the proxy server</translation> -<translation id="2951386431828317490">Enable Auto-Fill for profiles</translation> <translation id="2956777931324644324">This policy has been retired as of <ph name="PRODUCT_NAME" /> version 36. Specifies whether the TLS domain-bound certificates extension should be enabled. @@ -1173,6 +1172,15 @@ If this policy is left not set the global default value will be used for all sites either from the 'DefaultKeygenSetting' policy if it is set or the user's personal configuration otherwise.</translation> <translation id="4239720644496144453">The cache is not used for Android apps. If multiple users install the same Android app, it will be downloaded anew for each user.</translation> +<translation id="4243336580717651045">Enable URL-keyed anonymised data collection in <ph name="PRODUCT_NAME" /> and prevents users from changing this setting. + + URL-keyed anonymised data collection sends URLs of pages that the user visits to Google to make searches and browsing better. + + If you enable this policy, URL-keyed anonymised data collection is always active. + + If you disable this policy, URL-keyed anonymised data collection is never active. + + If this policy is left not set, URL-keyed anonymised data collection will be enabled but the user will be able to change it.</translation> <translation id="4250680216510889253">No</translation> <translation id="4261820385751181068">Device sign-in screen locale</translation> <translation id="427220754384423013">Specifies the printers which a user can use. @@ -1550,11 +1558,6 @@ If this policy is set to False, users will not be able to cast content to their device. If this policy is set to True, users are allowed to cast content. If this policy is not set, users are not allowed to cast content to enrolled Chrome OS devices, but can cast to non-enrolled devices.</translation> <translation id="5330684698007383292">Allow <ph name="PRODUCT_FRAME_NAME" /> to handle the following content types</translation> -<translation id="5360146044009867539">Enables <ph name="PRODUCT_NAME" />'s Auto-Fill feature and allows users to auto-complete profile and address information in web forms using previously stored information. - - If this setting is disabled, Auto-fill will never suggest or fill in address information, nor will it save additional address information that the user might submit while browsing the web. - - If this setting is enabled or has no value, the user will be able to control Auto-fill for addresses in the UI.</translation> <translation id="5365946944967967336">Show Home button on the toolbar</translation> <translation id="5366745336748853475">Allows you to specify a list of URL patterns that specify sites for which a client certificate is automatically selected on the sign-in screen in the frame hosting the SAML flow, if the site requests a certificate. An example usage is to configure a device-wide certificate to be presented to the SAML IdP. @@ -1841,6 +1844,7 @@ The recommended way to lock the screen on idle is to enable screen locking on suspend and have <ph name="PRODUCT_OS_NAME" /> suspend after the idle delay. This policy should only be used when screen locking should occur a significant amount of time sooner than suspend or when suspend on idle is not desired at all. The policy value should be specified in milliseconds. Values are clamped to be less than the idle delay.</translation> +<translation id="6097601282776163274">Enable URL-keyed anonymised data collection</translation> <translation id="6111936128861357925">Allow Dinosaur Easter Egg Game</translation> <translation id="6114416803310251055">deprecated</translation> <translation id="6133088669883929098">Allow all sites to use key generation</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 6c08e33..60fb9a6f 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -693,7 +693,6 @@ Si no se establece esta política, se utiliza <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Cantidad máxima de conexiones simultáneas con el servidor proxy</translation> -<translation id="2951386431828317490">Habilitar la función "Autocompletar" para perfiles</translation> <translation id="2956777931324644324">Esta política cayó en desuso a partir de la versión 36 de <ph name="PRODUCT_NAME" />. Especifica si debe habilitarse la extensión TLS de certificados vinculados al dominio. @@ -1476,11 +1475,6 @@ Si se establece esta política como falsa, los usuarios no podrán transmitir contenido al dispositivo. Si se establece como verdadera, los usuarios podrán transmitir contenido. Si no se establece, los usuarios no podrán transmitir contenido a dispositivos con Sistema operativo Chrome, pero sí podrán hacerlo a otros dispositivos.</translation> <translation id="5330684698007383292">Permitir que <ph name="PRODUCT_FRAME_NAME" /> gestione los siguientes tipos de contenido</translation> -<translation id="5360146044009867539">Habilita la función "Autocompletar" de <ph name="PRODUCT_NAME" /> y permite que los usuarios completen automáticamente formularios web con información ya almacenada de la dirección o el perfil. - - Si se inhabilita esta configuración, "Autocompletar" nunca sugerirá ni completará direcciones. Tampoco guardará información adicional de direcciones que el usuario haya enviado cuando navegaba en la Web. - - Si se habilita esta configuración o no se establece ningún valor, el usuario podrá controlar la función "Autocompletar" para las direcciones en la IU.</translation> <translation id="5365946944967967336">Mostrar el botón "Página principal" en la barra de herramientas</translation> <translation id="5366745336748853475">Te permite definir una lista de los patrones URL que especifican sitios para los que se selecciona automáticamente un certificado de cliente en la pantalla de acceso, en el marco que aloja el flujo de SAML, si el sitio lo solicita. Un ejemplo de uso es configurar un certificado en todo el dispositivo para presentarlo en el IdP de SAML.
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 9aa4af3..366f31d4 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -723,7 +723,6 @@ Si no se establece esta política, se utilizará <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Número máximo de conexiones simultáneas con el servidor proxy</translation> -<translation id="2951386431828317490">Habilitar la función Autocompletar para perfiles</translation> <translation id="2956777931324644324">Esta política no está disponible a partir de la versión 36 de <ph name="PRODUCT_NAME" />. Especifica si se debe habilitar la extensión de certificados TLS limitados a dominios. @@ -1549,11 +1548,6 @@ Si se asigna el valor "False" a esta política, los usuarios no podrán enviar contenido a su dispositivo. Si se le asigna el valor "True", los usuarios podrán enviar contenido. Si no se establece esta política, los usuarios no podrán enviar contenido a los dispositivos Chrome OS registrados, pero sí lo podrán hacer a dispositivos no registrados.</translation> <translation id="5330684698007383292">Permitir que <ph name="PRODUCT_FRAME_NAME" /> procese los tipos de contenido que se indican a continuación</translation> -<translation id="5360146044009867539">Habilita la función Autocompletar de <ph name="PRODUCT_NAME" /> y permite que los usuarios rellenen automáticamente formularios web con información almacenada anteriormente, como la información de la dirección o el perfil. - - Si inhabilitas esta opción, la función Autocompletar no hará sugerencias ni rellenará la información de la dirección, y tampoco guardará información adicional de la dirección que el usuario envíe cuando esté navegando por la Web. - - Si habilitas esta opción o no estableces ningún valor, el usuario podrá controlar la función Autocompletar para información de la dirección en la IU.</translation> <translation id="5365946944967967336">Mostrar botón de página principal en la barra de herramientas</translation> <translation id="5366745336748853475">Te permite definir una lista de patrones de URL que especifican los sitios web en los que se selecciona automáticamente un certificado de cliente (si se solicita) en la pantalla de inicio de sesión del marco en el que se aloja el flujo SAML. Un ejemplo de uso es configurar un certificado a nivel de dispositivo para presentarlo a un proveedor de identidad SAML.
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb index acb56f1..e7a7c50 100644 --- a/components/policy/resources/policy_templates_et.xtb +++ b/components/policy/resources/policy_templates_et.xtb
@@ -723,7 +723,6 @@ Kui see reegel on määramata, kasutatakse väärtust <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Puhverserveri samaaegsete ühenduste maksimaalne arv</translation> -<translation id="2951386431828317490">Automaattäite lubamine profiilidel</translation> <translation id="2956777931324644324">Selle reegli pakkumine lõpetati toote <ph name="PRODUCT_NAME" /> versiooniga 36. Määrab, kas TLS-i domeenisuunaline sertifikaatide laiendus peab olema lubatud. @@ -1536,11 +1535,6 @@ Kui selle reegli väärtuseks on määratud Väär, ei saa kasutajad sisu oma seadmesse üle kanda. Kui selle reegli väärtuseks on määratud Tõene, lubatakse kasutajatel sisu üle kanda. Kui see reegel jäetakse määramata, ei lubata kasutajatel sisu registreeritud Chrome OS-i seadmetesse üle kanda, kuid registreerimata seadmete puhul saab seda teha.</translation> <translation id="5330684698007383292">Pistikprogrammil <ph name="PRODUCT_FRAME_NAME" /> järgmiste sisutüüpide töötlemise lubamine</translation> -<translation id="5360146044009867539">Lubab rakenduse <ph name="PRODUCT_NAME" /> automaattäite funktsiooni ja võimaldab kasutajatel profiili- ja aadressiteabe automaatselt veebivormidele sisestada, kasutades varem salvestatud teavet. - - Selle seade keelamisel ei anna automaattäite funktsioon soovitusi ega sisesta aadressiteavet. Samuti ei salvesta see aadressi lisateavet, mille kasutaja võib veebi sirvimisel esitada. - - Selle seade lubamisel või määramata jätmisel saab kasutaja kasutajaliideses aadresside automaattäite funktsiooni juhtida.</translation> <translation id="5365946944967967336">Kuva tööriistaribal nuppu Avaleht</translation> <translation id="5366745336748853475">Võimaldab määrata URL-i mustrite loendi, mis täpsustab saidid, mille jaoks valitakse sisselogimisekraanil SAML-voogu hostivas raamis automaatselt kliendisertifikaat, kui sait nõuab sertifikaati. Näidiskasutus on seadistada seadmeülene sertifikaat, mis esitatakse SAML IdP-le.
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb index bda76b24..bdaea2d 100644 --- a/components/policy/resources/policy_templates_fa.xtb +++ b/components/policy/resources/policy_templates_fa.xtb
@@ -695,7 +695,6 @@ اگر این خطمشی تنظیم نشده باشد، <ph name="PRINTERS_ALLOW_ALL" /> مورد استفاده قرار میگیرد. </translation> <translation id="2908277604670530363">حداکثر تعداد اتصالات همزمان به سرور پراکسی</translation> -<translation id="2951386431828317490">فعال کردن تکمیل خودکار برای نمایهها</translation> <translation id="2956777931324644324">این خطمشی از زمان <ph name="PRODUCT_NAME" /> نسخه ۳۶ کنار گذاشته شده است. تعیین میکند آیا برنامه افزودنی مجوزهای مربوط به دامنه TLS باید فعال شوند. @@ -1472,11 +1471,6 @@ اگر این خطمشی روی نادرست تنظیم شود، کاربران نمیتوانند محتوا را به دستگاهشان ارسال کنند. اگر این خطمشی روی درست تنظیم شود، کاربران اجازه دارند محتوا را ارسال کنند. اگر این خطمشی تنظیم نشود کاربران اجازه ندارند محتوا را به دستگاههای ثبتشده دارای سیستمعامل Chrome ارسال کنند اما میتوانند به دستگاههای ثبتنشده محتوا ارسال کنند.</translation> <translation id="5330684698007383292"><ph name="PRODUCT_FRAME_NAME" /> بتواند با انواع محتوای زیر کار کند</translation> -<translation id="5360146044009867539">قابلیت «تکمیل خودکار» <ph name="PRODUCT_NAME" /> را فعال میکند و به کاربران اجازه میدهد با استفاده از اطلاعات ذخیرهشده قبلی، اطلاعات نمایه و نشانی را بهطور خودکار در فرمهای وب تکمیل کنند. - - اگر این تنظیم غیرفعال شود، «تکمیل خودکار» هیچگاه اطلاعات نشانی را پیشنهاد یا تکمیل نمیکند و یا اطلاعات تکمیلی نشانی را که ممکن است کاربر درحین مرور وب ارسال کند ذخیره نمیکند. - - اگر این تنظیم فعال شود یا مقداری نداشته باشد، کاربر میتواند قابلیت «تکمیل خودکار» را در رابط کاربری کنترل کند.</translation> <translation id="5365946944967967336">نمایش دکمه صفحهٔ اصلی روی نوارابزار</translation> <translation id="5366745336748853475">به شما امکان میدهد فهرستی از الگوهای نشانی وب تعیین کنید که مشخصکننده سایتهایی هستند که در صورت درخواست گواهی از طرف سایت، گواهی کارخواه را بهطور خودکار در صفحه ورود به سیستم در قاب میزبانی جریان SAML انتخاب کند.
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb index 2db1335..ffd01fa 100644 --- a/components/policy/resources/policy_templates_fi.xtb +++ b/components/policy/resources/policy_templates_fi.xtb
@@ -700,7 +700,6 @@ Jos tätä käytäntöä ei ole määritetty, oletusarvo on <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Enimmäismäärä samanaikaisia yhteyksiä välityspalvelimeen</translation> -<translation id="2951386431828317490">Salli profiilien automaattinen täyttö</translation> <translation id="2956777931324644324">Tämä käytäntö on poistettu käytöstä tuotteen <ph name="PRODUCT_NAME" /> versiosta 36 alkaen. Määrittää, tuleeko TLS domain-bound -varmennelaajennuksien olla käytössä. @@ -1483,11 +1482,6 @@ Jos tämän käytännön arvo on epätosi, käyttäjät eivät voi suoratoistaa sisältöä laitteeseen. Jos arvo on tosi, käyttäjät saavat suoratoistaa sisältöä. Jos tätä käytäntöä ei ole määritetty, käyttäjät eivät voi suoratoistaa sisältöä rekisteröityihin Chrome-käyttöjärjestelmää käyttäviin laitteisiin, mutta he voivat suoratoistaa sisältöä rekisteröimättömiin laitteisiin.</translation> <translation id="5330684698007383292">Anna tuotteen <ph name="PRODUCT_FRAME_NAME" /> käsitellä seuraavia sisältötyyppejä</translation> -<translation id="5360146044009867539">Kun tämä on käytössä, <ph name="PRODUCT_NAME" /> voi täyttää kenttiä automaattisesti. Käyttäjät voivat täyttää verkkolomakkeita aiemmin tallennetuilla profiili- ja osoitetiedoilla. - - Jos asetus poistetaan käytöstä, automaattinen täyttö ei ehdota osoitetietoja, täytä niitä tai tallenna uusia osoitetietoja myöhempää käyttöä varten selailun yhteydessä. - - Jos tämä asetus on käytössä tai sille ei ole määritetty arvoa, käyttäjä voi hallita osoitteiden automaattista täyttöä käyttöliittymässä.</translation> <translation id="5365946944967967336">Näytä etusivupainike työkalupalkissa</translation> <translation id="5366745336748853475">Antaa määrittää URL-osoitemallien luettelon, jota vastaaville sivustoille valitaan kirjautumisnäytöltä automaattisesti käyttöoikeusvarmenne SAML-työnkulkua isännöivässä kehyksessä, jos sivusto pyytää varmennetta. Tätä voidaan käyttää esimerkiksi niin, että määritetään laitteen laajuinen varmenne, joka näytetään SAML-tunnistuspalvelulle.
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb index bb07396..5668d13ee 100644 --- a/components/policy/resources/policy_templates_fil.xtb +++ b/components/policy/resources/policy_templates_fil.xtb
@@ -721,7 +721,6 @@ Kung hindi nakatakda ang patakarang ito, ipagpapalagay na pinili ang <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Pinakamataas na bilang ng sabay-sabay na koneksyon sa proxy server</translation> -<translation id="2951386431828317490">Ine-enable ang AutoFill para sa mga profile</translation> <translation id="2956777931324644324">Itinigil na ang patakarang ito simula ng bersyon 36 ng <ph name="PRODUCT_NAME" /> . Tinutukoy kung dapat i-enable ang mga extension ng TLS domain-bound na certificate. @@ -1535,11 +1534,6 @@ Kung nakatakda ang patakarang ito sa False, hindi makakapag-cast ng content ang mga user sa kanilang device. Kung nakatakda ang patakarang ito sa True, pinapayagan ang mga user na mag-cast ng content. Kung hindi nakatakda ang patakarang ito, hindi pinapayagan ang mga user na mag-cast ng content sa mga naka-enroll na Chrome OS device, ngunit makakapag-cast ang mga user sa mga device na hindi naka-enroll.</translation> <translation id="5330684698007383292">Payagan ang <ph name="PRODUCT_FRAME_NAME" /> na pangasiwaan ang mga sumusunod na uri ng nilalaman</translation> -<translation id="5360146044009867539">Ine-enable ang feature na AutoFill ng <ph name="PRODUCT_NAME" /> at binibigyang-daan ang mga user na awtomatikong kumpletuhin ang impormasyon ng profile at address sa mga web form gamit ang dati nang na-store na impormasyon. - - Kung idi-disable ang setting na ito, hindi kailanman magmumungkahi o magkukumpleto ang AutoFill ng impormasyon ng address, o hindi nito ise-save ang karagdagang impormasyon ng address na maaaring isumite ng user habang nagba-browse siya sa web. - - Kung ie-enable o walang value ang setting na ito, makokontrol ng user ang AutoFill para sa mga address sa UI.</translation> <translation id="5365946944967967336">Ipakita ang button na Home sa toolbar</translation> <translation id="5366745336748853475">Nagbibigay-daan sa iyong tumukoy ng listahan ng mga pattern ng url na tumutukoy sa mga site kung saan awtomatikong pinipili ang isang certificate ng client sa screen ng pag-sign in sa frame na nagho-host sa flow ng SAML, kung humihiling ng certificate ang site. Ang isang halimbawa ng paggamit ay ang pag-configure ng certificate para sa buong device na ipapakita sa SAML IdP.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index b781c8e7..a3a5d04 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -733,7 +733,6 @@ Si cette règle n'est pas définie, <ph name="PRINTERS_ALLOW_ALL" /> est supposé s'appliquer. </translation> <translation id="2908277604670530363">Nombre maximal de connexions simultanées au serveur proxy</translation> -<translation id="2951386431828317490">Activer la saisie automatique pour les profils</translation> <translation id="2956777931324644324">Cette règle a été supprimée dès la version 36 de <ph name="PRODUCT_NAME" />. Elle indique si l'extension des certificats TLS liés au domaine doit être activée. @@ -1558,11 +1557,6 @@ Si cette règle est définie sur "False", les utilisateurs ne peuvent pas caster de contenu sur leur appareil. Si elle est définie sur "True", les utilisateurs sont autorisés à caster du contenu. Si elle n'est pas définie, les utilisateurs ne peuvent pas caster de contenu sur les appareils Chrome OS enregistrés, mais ils peuvent le faire sur des appareils non enregistrés.</translation> <translation id="5330684698007383292">Autoriser <ph name="PRODUCT_FRAME_NAME" /> à gérer les types de contenu suivants</translation> -<translation id="5360146044009867539">Active la fonctionnalité de saisie automatique de <ph name="PRODUCT_NAME" />, qui permet à l'utilisateur de remplir automatiquement des formulaires Web à partir de données stockées précédemment, telles que des informations relatives à son profil et à son adresse. - - Si ce paramètre est désactivé, ces informations ne sont jamais suggérées ni saisies automatiquement. De même, les informations complémentaires relatives à l'adresse que l'utilisateur est susceptible de fournir sur une page Web ne sont pas enregistrées. - - Si ce paramètre est activé ou vide, l'utilisateur peut contrôler la saisie automatique pour les adresses dans l'interface utilisateur.</translation> <translation id="5365946944967967336">Afficher le bouton Accueil sur la barre d'outils</translation> <translation id="5366745336748853475">Vous permet de spécifier une liste de formats d'URL indiquant les sites pour lesquels un certificat client est sélectionné automatiquement sur l'écran de connexion (dans le cadre où se trouve le flux SAML), lorsque le site nécessite un certificat. Par exemple, vous pouvez configurer un certificat applicable à l'intégralité de l'appareil afin de le présenter au fournisseur d'identité SAML.
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb index 8e0df35..670995f 100644 --- a/components/policy/resources/policy_templates_gu.xtb +++ b/components/policy/resources/policy_templates_gu.xtb
@@ -806,7 +806,6 @@ જો આ નીતિ સેટ કરેલ ન હોય, તો <ph name="PRINTERS_ALLOW_ALL" />ને માની લેવામાં આવે છે. </translation> <translation id="2908277604670530363">પ્રતિ પ્રોક્સી સર્વર માટેના સમવર્તી કનેક્શંસની મહત્તમ સંખ્યા</translation> -<translation id="2951386431828317490">ફૉર્મ માટે સ્વતઃભરણ ચાલુ કરો</translation> <translation id="2956777931324644324">આ નીતિને <ph name="PRODUCT_NAME" /> સંસ્કરણ 36 ની સાથે જ સમાપ્ત કરવામાં આવી છે. TLS ડોમેન-બાઉન્ડ પ્રમાણપત્રો એક્સ્ટેન્શનને સક્ષમ કરવું જોઈએ કે કેમ તેનો ઉલ્લેખ કરે છે. @@ -1743,11 +1742,6 @@ જો નીતિ False પર સેટ કરેલી હશે, તો વપરાશકર્તાઓ તેમના ઉપકરણ પર કન્ટેન્ટને કાસ્ટ નહીં કરી શકે. જો નીતિ True પર સેટ કરેલી હશે, તો વપરાશકર્તાઓ કન્ટેન્ટને કાસ્ટ કરી શકશે. જો આ નીતિ સેટ કરેલી નહીં હોય, તો વપરાશકર્તાઓને નોંધણી કરાવેલ Chrome OS ઉપકરણો પર કન્ટેન્ટને કાસ્ટ કરવાની મંજૂરી નથી, પરંતુ તેઓ નોંધણી ન કરાવેલ ઉપકરણો પર કાસ્ટ કરી શકશે.</translation> <translation id="5330684698007383292"><ph name="PRODUCT_FRAME_NAME" /> ને નીચે આપેલા સામગ્રી પ્રકારોને હેન્ડલ કરવાની મંજૂરી આપો</translation> -<translation id="5360146044009867539"><ph name="PRODUCT_NAME" />ની સ્વતઃભરણ સુવિધા ચાલુ કરે છે અને વપરાશકર્તાઓને પહેલાં સંગ્રહ કરેલી માહિતીનો ઉપયોગ કરીને પ્રોફાઇલ તથા સરનામાની માહિતી આપમેળે ભરાય તે માટેની મંજૂરી આપે છે. - - જો આ સેટિંગ બંધ કરેલ હશે, તો સ્વતઃભરણ ક્યારેય સૂચન નહીં આપે, સરનામાની માહિતી નહીં ભરે અથવા વેબને બ્રાઉઝ કરતી વખતે વપરાશકર્તાએ સબમિટ કરી હોઈ શકે તેવી સરનામા વિશેની વધારાની માહિતી નહીં સાચવે. - - જો આ સેટિંગ ચાલુ કરેલ હશે અથવા તેમાં કોઈ મૂલ્ય નહીં હોય, તો વપરાશકર્તા UIમાં સરનામા માટે સ્વતઃભરણનું નિયંત્રણ કરી શકશે.</translation> <translation id="5365946944967967336">ટૂલબાર પર હોમ બટન બતાવો</translation> <translation id="5366745336748853475">જો સાઇટ પ્રમાણપત્રની વિનંતી કરે, તો SAML પ્રવાહ ફ્રેમ હોસ્ટિંગમાં સાઇન ઇન સ્ક્રીન પર તમને URL પૅટર્નની એક સૂચિનો ઉલ્લેખ કરવાની મંજૂરી આપે છે જે એવી સાઇટનો ઉલ્લેખ કરે છે જેના ક્લાયન્ટ પ્રમાણપત્ર આપમેળે પસંદ કરવામાં આવે છે. એક ઉદાહરણનો ઉપયોગ એ SAML IdPને પ્રસ્તુત કરતી વખતે ઉપકરણ પ્રમાણે પ્રમાણપત્ર ગોઠવવા માટે થાય છે.
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb index 8f3e012a..9304ddbf1 100644 --- a/components/policy/resources/policy_templates_hi.xtb +++ b/components/policy/resources/policy_templates_hi.xtb
@@ -725,7 +725,6 @@ अगर यह नीति सेट नहीं की जाती है, तो <ph name="PRINTERS_ALLOW_ALL" /> की स्थिति मानी जाती है. </translation> <translation id="2908277604670530363">प्रॉक्सी सर्वर के समवर्ती कनेक्शन की अधिकतम संख्या</translation> -<translation id="2951386431828317490">प्रोफ़ाइल के लिए 'अपने आप भरने की सुविधा (ऑटो फ़िल)' चालू करती है</translation> <translation id="2956777931324644324">यह नीति <ph name="PRODUCT_NAME" /> वर्शन 36 से निकाल दी गई है. निर्दिष्ट करती है कि क्या TLS डोमेन-सीमित प्रमाणपत्रों को सक्षम किया जाना चाहिए. @@ -1548,11 +1547,6 @@ अगर यह नीति गलत पर सेट की जाती है, तो उपयोगकर्ता उपने डिवाइस पर सामग्री कास्ट नहीं कर पाएंगे. अगर यह नीति सही पर सेट की जाती है, तो उपयोगकर्ता सामग्री कास्ट कर सकते हैं. अगर यह नीति सेट नहीं की जाती है, तो उपयोगकर्ता नामांकित Chrome OS डिवाइसों पर सामग्री कास्ट नहीं कर सकते हैं, लेकिन वे नामांकित नहीं किए गए डिवाइसों पर कास्ट कर सकते हैं.</translation> <translation id="5330684698007383292"><ph name="PRODUCT_FRAME_NAME" /> को सामग्री के निम्न प्रकारों को प्रबंधित करने दें</translation> -<translation id="5360146044009867539">यह नीति, <ph name="PRODUCT_NAME" /> की 'अपने आप भरने की सुविधा (ऑटो फ़िल)' चालू करती है और इसके ज़रिए उपयोगकर्ताओं को प्रोफ़ाइल और पते से जुड़ी जानकारी जैसी पहले से संग्रहित जानकारी की मदद से वेब फ़ॉर्म अपने आप भरने की सुविधा मिलती है. - - अगर यह सेटिंग बंद होती है, तो 'अपने आप भरने की सुविधा' कभी कोई सुझाव नहीं देगी या पते की जानकारी अपने आप नहीं भरेगी. साथ ही यह, पते की उस और भी जानकारी को सेव नहीं करेगी जिसे उपयोगकर्ता ने शायद वेब ब्राउज़ करते समय सबमिट किया हो. - - अगर यह सेटिंग चालू होती है या कोई मान नहीं दिया जाता है, तो उपयोगकर्ता यूज़र इंटरफ़ेस (यूआई) में पतों के लिए 'अपने आप भरने की सुविधा' को नियंत्रित कर पाएगा.</translation> <translation id="5365946944967967336">टूलबार पर मुख्यपृष्ठ बटन दिखाएं</translation> <translation id="5366745336748853475">अगर साइट कोई प्रमाणपत्र मांगती है, तो यह आपको ऐसे यूआरएल पैटर्न की सूची तय करने देती है जिसमें ऐसी साइटें होती हैं जिनके लिए SAML फ़्लो होस्ट करने वाली फ़्रेम में साइन-इन स्क्रीन पर क्लाइंट प्रमाणपत्र अपने आप चुना जाता है. SAML IdP को प्रस्तुत किया जाने वाला डिवाइस-व्यापी प्रमाणपत्र कॉन्फ़िगर करना इसके इस्तेमाल का एक उदाहरण है.
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb index 0b29e44..73f34f3 100644 --- a/components/policy/resources/policy_templates_hr.xtb +++ b/components/policy/resources/policy_templates_hr.xtb
@@ -703,7 +703,6 @@ Ako se to pravilo ne postavi, pretpostavlja se da vrijedi <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Maksimalan broj istodobnih veza na proxy poslužitelju</translation> -<translation id="2951386431828317490">Omogući Automatsko popunjavanje za profile</translation> <translation id="2956777931324644324">To je pravilo ukinuto od verzije <ph name="PRODUCT_NAME" /> 36. Određuje hoće li proširenje TLS certifikata vezanih uz domenu biti omogućeno. @@ -1489,11 +1488,6 @@ Ako se to pravilo postavi na False, korisnici neće moći emitirati sadržaj na svom uređaju. Ako se pravilo postavi na True, korisnici će moći emitirati sadržaj. Ako se pravilo ne postavi, korisnici neće moći emitirati sadržaj na registrirane uređaje s OS-om Chrome, ali će moći emitirati na neregistrirane uređaje.</translation> <translation id="5330684698007383292">Dopusti proizvodu <ph name="PRODUCT_FRAME_NAME" /> rukovanje sljedećim vrstama sadržaja</translation> -<translation id="5360146044009867539">Omogućuje značajku Automatsko popunjavanje na usluzi <ph name="PRODUCT_NAME" /> i omogućuje korisnicima automatsko unošenje podataka o profilu i adresi u web-obrasce pomoću prethodno pohranjenih podataka. - - Ako se ta postavka onemogući, Automatsko popunjavanje nikad neće predlagati niti unositi podatke o adresi niti će spremati dodatne podatke o adresi koje korisnik može unijeti tijekom pregledavanja weba. - - Ako se ta postavka omogući ili nema vrijednost, korisnik će moći kontrolirati Automatsko popunjavanje za adrese na korisničkom sučelju.</translation> <translation id="5365946944967967336">Prikaži gumb Početna na alatnoj traci</translation> <translation id="5366745336748853475">Omogućuje vam da navedete popis uzoraka URL-ova koji određuju web-lokacije za koje je certifikat klijenta automatski odabran na zaslonu za prijavu u okviru koji hostira SAML protok, ako web-lokacija zahtijeva certifikat. Primjer upotrebe je konfiguracija certifikata za cijeli uređaj koji će se pojaviti za SAML IdP.
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb index fdfef48..02d5dae 100644 --- a/components/policy/resources/policy_templates_hu.xtb +++ b/components/policy/resources/policy_templates_hu.xtb
@@ -701,7 +701,6 @@ Ha a házirend nincs beállítva, akkor az <ph name="PRINTERS_ALLOW_ALL" /> van érvényben. </translation> <translation id="2908277604670530363">Egyidejű kapcsolatok maximális száma a proxyszerverhez</translation> -<translation id="2951386431828317490">Automatikus kitöltés engedélyezése profilokhoz</translation> <translation id="2956777931324644324">Ezt a házirendet a <ph name="PRODUCT_NAME" /> 36-os verziójától kezdve visszavontuk. Azt adja meg, hogy a TLS-domainhez kötött tanúsítványbővítmények engedélyezve legyenek-e. @@ -1479,11 +1478,6 @@ Ha a házirend értéke hamis, a felhasználók nem tudnak tartalmat átküldeni eszközükre. Ha a házirend értéke igaz, a felhasználók átküldhetnek tartalmat. Ha a házirend nincs beállítva, a felhasználók a regisztrált Chrome OS-t használó eszközökre nem küldhetnek át tartalmat, de a nem regisztráltakra igen.</translation> <translation id="5330684698007383292">A következő tartalomtípusok kezelésének engedélyezése a(z) <ph name="PRODUCT_FRAME_NAME" /> számára</translation> -<translation id="5360146044009867539">Engedélyezi a <ph name="PRODUCT_NAME" /> automatikus kitöltés funkcióját, és lehetővé teszi a felhasználók számára az internetes űrlapok automatikus kitöltését korábban eltárolt profil- és címadatokkal. - - Ha le van tiltva ez a beállítás, az automatikus kitöltés funkció nem ajánlja fel és nem végzi el a címadatok kitöltését, és nem ment további címadatokat, amelyeket a felhasználó az interneten való böngészés közben ad meg. - - Ha engedélyezve van ez a beállítás, vagy nincs értéke, a felhasználó vezérelheti az automatikus kitöltés funkció címekkel kapcsolatos használatát a kezelőfelületen.</translation> <translation id="5365946944967967336">Kezdőoldal gomb megjelenítése az eszköztáron</translation> <translation id="5366745336748853475">Lehetővé teszi olyan URL-mintákból álló lista megadását, amelyek meghatározzák azokat a webhelyeket, amelyeknél automatikusan megtörténik az ügyféltanúsítvány kiválasztása a bejelentkezési képernyőn a SAML-folyamatot tároló keretben, amennyiben a webhelynek szüksége van tanúsítványra. Használati példa: eszközre vonatkozó tanúsítvány konfigurálása, amely a SAML IdP-nek lesz bemutatva.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 544e857..ea3f78e 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -695,7 +695,6 @@ Jika kebijakan ini tidak disetel, <ph name="PRINTERS_ALLOW_ALL" /> akan diterapkan. </translation> <translation id="2908277604670530363">Jumlah maksimal sambungan serentak ke server proxy</translation> -<translation id="2951386431828317490">Mengaktifkan IsiOtomatis untuk profil</translation> <translation id="2956777931324644324">Kebijakan ini dihentikan sejak <ph name="PRODUCT_NAME" /> versi 36. Menentukan apakah ekstensi sertifikat terikat domain TLS sebaiknya diaktifkan atau tidak. @@ -1128,6 +1127,15 @@ Jika kebijakan ini tidak disetel, nilai default global akan digunakan untuk semua situs dari kebijakan 'DefaultKeygenSetting' jika disetel, atau dari konfigurasi pribadi pengguna.</translation> <translation id="4239720644496144453">Cache tidak digunakan untuk aplikasi Android. Jika beberapa pengguna memasang aplikasi Android yang sama, aplikasi akan didownload lagi untuk setiap pengguna.</translation> +<translation id="4243336580717651045">Mengaktifkan pengumpulan data anonim yang dimasukkan dengan URL di <ph name="PRODUCT_NAME" /> dan mencegah pengguna mengubah setelan ini. + + Pengumpulan data anonim yang dimasukkan dengan URL mengirimkan URL halaman yang dibuka oleh pengguna ke Google untuk membuat penelusuran dan browsing lebih baik. + + Jika Anda mengaktifkan kebijakan ini, pengumpulan data anonim yang dimasukkan dengan URL selalu aktif. + + Jika Anda menonaktifkan kebijakan ini, pengumpulan data anonim yang dimasukkan dengan URL tidak pernah aktif. + + Jika kebijakan ini dibiarkan tidak disetel, pengumpulan data anonim yang dimasukkan dengan URL akan diaktifkan, namun pengguna dapat mengubahnya.</translation> <translation id="4250680216510889253">Tidak</translation> <translation id="4261820385751181068">Lokal layar login perangkat</translation> <translation id="427220754384423013">Menentukan printer yang dapat digunakan pengguna. @@ -1479,11 +1487,6 @@ Jika kebijakan ini disetel ke False, pengguna tidak akan dapat mentransmisikan konten ke perangkat mereka. Jika kebijakan ini disetel ke True, pengguna diizinkan untuk mentransmisikan konten. Jika kebijakan ini tidak disetel, pengguna tidak diizinkan untuk mentransmisikan konten ke perangkat Chrome OS yang terdaftar, namun dapat mentransmisikan ke perangkat yang tidak terdaftar.</translation> <translation id="5330684698007383292">Izinkan <ph name="PRODUCT_FRAME_NAME" /> menangani jenis konten berikut</translation> -<translation id="5360146044009867539">Mengaktifkan fitur IsiOtomatis <ph name="PRODUCT_NAME" /> dan memungkinkan pengguna mengisi otomatis profil dan informasi alamat di formulir web menggunakan informasi yang disimpan sebelumnya. - - Jika setelan ini dinonaktifkan, IsiOtomatis tidak akan menyarankan atau mengisi informasi alamat, serta tidak akan menyimpan informasi alamat tambahan yang mungkin dikirim oleh pengguna saat browsing web. - - Jika setelan ini diaktifkan atau tidak memiliki nilai, pengguna dapat mengontrol fitur IsiOtomatis untuk alamat di UI.</translation> <translation id="5365946944967967336">Tampilkan tombol Layar Utama di toolbar</translation> <translation id="5366745336748853475">Memungkinkan Anda menentukan daftar pola URL yang menetapkan situs tempat sertifikat klien dipilih otomatis pada layar login dalam bingkai yang menjadi host alur SAML, jika situs meminta sertifikat. Contoh penggunaan adalah mengonfigurasi sertifikat tingkat perangkat untuk dimunculkan ke SAML IdP. @@ -1757,6 +1760,7 @@ Cara yang disarankan untuk mengunci layar saat menganggur adalah dengan mengaktifkan penangguhan penguncian layar dan meminta <ph name="PRODUCT_OS_NAME" /> menangguhkan setelah penundaan waktu menganggur. Sebaiknya hanya gunakan kebijakan ini saat penguncian layar perlu terjadi jauh lebih awal dibandingkan penangguhan atau saat penangguhan ketika menganggur tidak diinginkan sama sekali. Nilai kebijakan harus ditetapkan dalam milidetik. Nilai dijepit agar kurang dari penundaan waktu menganggur.</translation> +<translation id="6097601282776163274">Mengaktifkan pengumpulan data anonim yang dimasukkan dengan URL</translation> <translation id="6111936128861357925">Izinkan Game Dinosaur Easter Egg</translation> <translation id="6114416803310251055">tak lagi digunakan</translation> <translation id="6133088669883929098">Izinkan semua situs menggunakan pembuatan kunci</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index cf95411b..1ec333d 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -684,7 +684,6 @@ Se questa norma non viene impostata, viene usata l'opzione <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Numero massimo di connessioni simultanee al server proxy</translation> -<translation id="2951386431828317490">Attiva la Compilazione automatica per i profili</translation> <translation id="2956777931324644324">Questa norma è stata ritirata a partire dalla versione 36 di <ph name="PRODUCT_NAME" />. Consente di specificare se attivare o meno l'estensione di certificati associati al dominio TLS. @@ -1451,11 +1450,6 @@ Se questa norma viene impostata su False, gli utenti non potranno trasmettere contenuti al proprio dispositivo. Se questa norma viene impostata su True, gli utenti potranno trasmettere contenuti. Se questa norma non viene impostata, gli utenti non potranno trasmettere contenuti a dispositivi Chrome OS registrati, ma potranno trasmetterli a dispositivi non registrati.</translation> <translation id="5330684698007383292">Consenti a <ph name="PRODUCT_FRAME_NAME" /> di gestire i seguenti tipi di contenuti</translation> -<translation id="5360146044009867539">Consente di attivare la funzione Compilazione automatica di <ph name="PRODUCT_NAME" /> e di permettere agli utenti di eseguire il completamento automatico dei moduli web utilizzando informazioni memorizzate in precedenza, come i dati del profilo e l'indirizzo. - - Se questa impostazione è disattivata, la funzione Compilazione automatica non suggerirà o non inserirà mai i dati relativi all'indirizzo, né memorizzerà altre informazioni relative ad altri indirizzi che l'utente potrebbe inviare durante la navigazione sul Web. - - Se questa impostazione è attivata o non vi è impostato alcun valore, l'utente potrà gestire la funzione Compilazione automatica globale per gli indirizzi nell'interfaccia utente.</translation> <translation id="5365946944967967336">Mostra il pulsante Pagina iniziale nella barra degli strumenti</translation> <translation id="5366745336748853475">Ti consente di specificare un elenco di pattern URL relativi ai siti che richiedono certificati per cui viene selezionato automaticamente un certificato client nella schermata di accesso all'interno del frame che ospita il flusso SAML. Un esempio di utilizzo è la configurazione di un certificato a livello di dispositivo da presentare all'IdP SAML.
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb index d4889576..99a16eb 100644 --- a/components/policy/resources/policy_templates_iw.xtb +++ b/components/policy/resources/policy_templates_iw.xtb
@@ -695,7 +695,6 @@ אם המדיניות הזו לא מוגדרת, נעשה שימוש באפשרות <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">מספר מרבי של חיבורים בו זמניים לשרת proxy</translation> -<translation id="2951386431828317490">הפעלת מילוי אוטומטי בשביל פרופילים</translation> <translation id="2956777931324644324">המדיניות הזו הוצאה משימוש החל מגרסה 36 של <ph name="PRODUCT_NAME" />. מציינת האם יש להפעיל את תוסף האישורים המאוגד לדומיין TLS. @@ -1476,11 +1475,6 @@ אם המדיניות הזו מוגדרת כ-False, המשתמשים לא יוכלו להעביר תוכן למכשיר שלהם. אם המדיניות מוגדרת כ-True, המשתמשים יוכלו להעביר תוכן. אם המדיניות לא מוגדרת, המשתמשים לא יוכלו להעביר תוכן למכשירי Chrome OS רשומים, אבל הם יוכלו להעביר תוכן למכשירים שאינם רשומים.</translation> <translation id="5330684698007383292">אפשר ל-<ph name="PRODUCT_FRAME_NAME" /> לטפל בסוגי התוכן הבאים.</translation> -<translation id="5360146044009867539">המדיניות מפעילה את תכונת המילוי האוטומטי של <ph name="PRODUCT_NAME" /> ומאפשרת למשתמשים להשלים באופן אוטומטי פרטים של פרופיל וכתובת בטפסים באינטרנט, באמצעות מידע שאוחסן בעבר. - - אם ההגדרה הזו מושבתת, המילוי האוטומטי לא יציע למלא פרטי פרופיל ולא יעשה זאת באופן אוטומטי. כמו כן לא יישמרו פרטי פרופיל נוספים שהמשתמש יזין בזמן גלישה באינטרנט. - - אם ההגדרה הזו מופעלת או אם לא נקבע הערך שלה, המשתמש יוכל לקבוע דרך ממשק המשתמש את ההגדרות של תכונת המילוי האוטומטי לכתובות.</translation> <translation id="5365946944967967336">הצג את לחצן 'דף הבית' בסרגל הכלים</translation> <translation id="5366745336748853475">מאפשרת לציין רשימה של דפוסי כתובות אתרים המציינים אתרים שעבורם נבחר באופן אוטומטי אישור לקוח במסך הכניסה במסגרת שמארחת את תהליך SAML, אם האתר מבקש אישור. דוגמה למקרה שימוש היא בהגדרת אישור לכל המכשירים שיוצג ל-SAML IdP.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 7470b9d..c2e40c7 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -696,7 +696,6 @@ このポリシーが未設定の場合は、<ph name="PRINTERS_ALLOW_ALL" /> が選択された場合と同じ動作になります。 </translation> <translation id="2908277604670530363">プロキシ サーバーへの最大同時接続数</translation> -<translation id="2951386431828317490">プロフィールの自動入力を有効にします</translation> <translation id="2956777931324644324">このポリシーは <ph name="PRODUCT_NAME" /> バージョン 36 で廃止されました。 TLS ドメイン固定証明書の拡張機能を有効にするかどうかを指定します。 @@ -1479,11 +1478,6 @@ このポリシーが false に設定されている場合、ユーザーはデバイスにコンテンツをキャストできません。このポリシーが true に設定されている場合、ユーザーはコンテンツをキャストできます。このポリシーが未設定の場合、ユーザーは登録済みの Chrome OS デバイスにはコンテンツをキャストできませんが、それ以外のデバイスであればキャストできます。</translation> <translation id="5330684698007383292">次のコンテンツ タイプの処理を <ph name="PRODUCT_FRAME_NAME" /> に対して許可する</translation> -<translation id="5360146044009867539"><ph name="PRODUCT_NAME" /> の自動入力機能を有効にし、ユーザーが以前に保存した情報を使ってウェブフォームにプロフィールや住所情報を自動入力できるようにします。 - - この設定を無効にした場合は、住所情報が候補として表示されたり、自動入力されたりすることはありません。また、ユーザーがウェブの利用中に送信した住所情報が追加で保存されることもありません。 - - この設定を有効にするか、値を設定しない場合、ユーザーは UI で住所の自動入力を制御できます。</translation> <translation id="5365946944967967336">ツールバーにホーム ボタンを表示する</translation> <translation id="5366745336748853475">SAML フローをホストするログイン画面のフレーム内でリクエスト時にクライアント証明書を自動的に選択するサイトを、URL パターンのリストで指定します。この設定は、SAML IdP に提示する端末全体の証明書を設定する場合などに使用します。 @@ -2633,11 +2627,11 @@ パターンの例については、https://www.chromium.org/developers/how-tos/chrome-frame-getting-started をご覧ください。</translation> <translation id="8493645415242333585">ブラウザの履歴の保存を無効にする</translation> -<translation id="8498293625012059298">パスワード変更用の URL を設定します(HTTP と HTTPS スキームのみ)。ブラウザで警告が表示された後でパスワードを変更するユーザーは、パスワード保護サービスによってこの URL にリダイレクトされます。 +<translation id="8498293625012059298">パスワード変更用の URL を設定します(HTTP と HTTPS スキームのみ)。ブラウザで警告が表示された後、ユーザーはパスワード保護サービスによってこの URL にリダイレクトされます。 このパスワード変更ページで、新しい指紋によるパスワード認証が <ph name="PRODUCT_NAME" /> で正しく処理されるようにするには、パスワード変更ページが https://www.chromium.org/developers/design-documents/create-amazing-password-forms のガイドラインに沿っていることを確認してください。 - この設定が有効な場合、ブラウザで警告が表示された後でパスワードを変更するユーザーは、パスワード保護サービスによってこの URL にリダイレクトされます。 - この設定が無効または未設定の場合、パスワードを変更するユーザーは、パスワード保護サービスによって https://myaccounts.google.com にリダイレクトされます。 + この設定が有効な場合、ブラウザで警告が表示された後、ユーザーはパスワード保護サービスによってこの URL にリダイレクトされます。 + この設定が無効または未設定の場合、ユーザーはパスワード保護サービスによって https://myaccounts.google.com にリダイレクトされます。 このポリシーは、<ph name="MS_AD_NAME" /> ドメインに登録されていない Windows インスタンスでは使用できません。</translation> <translation id="8499172469244085141">デフォルト設定(ユーザーによるオーバーライド可能)</translation> <translation id="8507835864888987300">自動更新の対象バージョンを設定します。
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb index a7906e6..40877f6 100644 --- a/components/policy/resources/policy_templates_kn.xtb +++ b/components/policy/resources/policy_templates_kn.xtb
@@ -746,7 +746,6 @@ <translation id="2907992746861405243"><ph name="BULK_PRINTERS_POLICY" /> ಯಿಂದ ಯಾವ ಪ್ರಿಂಟರ್ಗಳು ಬಳಕೆದಾರರಿಗೆ ಲಭ್ಯವಿವೆ ಎನ್ನುವುದನ್ನು ನಿಯಂತ್ರಿಸುತ್ತದೆ. ದೊಡ್ಡ ಪ್ರಮಾಣದಲ್ಲಿ ಪ್ರಿಂಟರ್ಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಯಾವ ಪ್ರವೇಶ ಕಾರ್ಯನೀತಿಯನ್ನು ಬಳಸಬೇಕು ಎನ್ನುವುದನ್ನು ನಿಗದಿಪಡಿಸುತ್ತದೆ. <ph name="PRINTERS_ALLOW_ALL" /> ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿದರೆ, ಎಲ್ಲ ಪ್ರಿಂಟರ್ಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತದೆ. <ph name="PRINTERS_BLACKLIST" /> ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿದರೆ, ನಿರ್ದಿಷ್ಟ ಪ್ರಿಂಟರ್ಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ನಿರ್ಬಂಧಿಸಲು <ph name="BULK_PRINTERS_BLACKLIST" /> ಅನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. <ph name="PRINTERS_WHITELIST" /> ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿದರೆ, ಆಯ್ಕೆ ಮಾಡಬಹುದಾದ ಪ್ರಿಂಟರ್ಗಳನ್ನು ಮಾತ್ರ <ph name="BULK_PRINTERS_WHITELIST" /> ನಿಗದಿಪಡಿಸುತ್ತದೆ. ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, <ph name="PRINTERS_ALLOW_ALL" /> ಎಂದು ಭಾವಿಸಿಕೊಳ್ಳಲಾಗುತ್ತದೆ. </translation> <translation id="2908277604670530363">ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್ಗೆ ಏಕಕಾಲೀನ ಸಂಪರ್ಕಗಳ ಗರಿಷ್ಠ ಸಂಖ್ಯೆ</translation> -<translation id="2951386431828317490">ಪ್ರೊಫೈಲ್ಗಳಿಗೆ ಸ್ವಯಂ ಭರ್ತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="2956777931324644324">ಈ ನೀತಿಯನ್ನು <ph name="PRODUCT_NAME" /> ಆವೃತ್ತಿ 36 ರ ರೂಪದಲ್ಲಿ ಹಿಂತೆಗೆದುಕೊಳ್ಳಲಾಗಿದೆ. TLS ಡೊಮೇನ್-ಪರಿಧಿ ಪ್ರಮಾಣಪತ್ರಗಳ ವಿಸ್ತರಣೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕೇ ಎಂಬುದನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. @@ -1610,11 +1609,6 @@ <translation id="5318185076587284965">ರಿಮೋಟ್ ಪ್ರವೇಶದ ಹೋಸ್ಟ್ ಮೂಲಕ ಅವಲಂಬಿತ ಸರ್ವರ್ಗಳ ಬಳಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="5323128137188992869"><ph name="PRODUCT_NAME" /> ಅನ್ನು ಬಳಸಿಕೊಂಡು ಸಾಧನಕ್ಕೆ ಬಿತ್ತರಿಸಬೇಕಾದ ವಿಷಯವನ್ನು ಅನುಮತಿಸಿ. ಈ ನೀತಿಯನ್ನು ತಪ್ಪು ಎಂದು ಹೊಂದಿಸಿದ್ದರೆ, ಬಳಕೆದಾರರು ತಮ್ಮ ಸಾಧನಕ್ಕೆ ವಿಷಯವನ್ನು ಬಿತ್ತರಿಸಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಈ ನೀತಿಯನ್ನು ಸರಿ ಎಂದು ಹೊಂದಿಸಿದರೆ, ಬಳಕೆದಾರರು ವಿಷಯವನ್ನು ಬಿತ್ತರಿಸಲು ಅನುಮತಿಸಲಾಗುತ್ತದೆ. ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ, Chrome OS ಸಾಧನಗಳ ನೋಂದಾಯಿಸುವುದಕ್ಕೆ ವಿಷಯವನ್ನು ಬಿತ್ತರಿಸಲು ಬಳಕೆದಾರರು ಅನುಮತಿಸುವುದಿಲ್ಲ, ಆದರೆ ನೋಂದಾಯಿಸಲಾಗಿಲ್ಲದ ಸಾಧನಗಳಿಗೆ ಬಿತ್ತರಿಸಬಹುದಾಗಿದೆ.</translation> <translation id="5330684698007383292">ಮುಂದಿನ ವಿಷಯದ ಪ್ರಕಾರಗಳನ್ನು ನಿರ್ವಹಿಸಲು <ph name="PRODUCT_FRAME_NAME" /> ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ.</translation> -<translation id="5360146044009867539"><ph name="PRODUCT_NAME" /> ನ ಸ್ವಯಂಭರ್ತಿ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಬಳಕೆದಾರರು ಹಿಂದೆ ಸಂಗ್ರಹಿಸಿದ ಮಾಹಿತಿಯನ್ನು ಬಳಸಿಕೊಂಡು ವೆಬ್ ಫಾರ್ಮ್ಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಪ್ರೊಫೈಲ್ ಮತ್ತು ವಿಳಾಸ ಡೇಟಾವನ್ನು ತುಂಬಲು ಅನುಮತಿಸುತ್ತದೆ. - - ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, "ಸ್ವಯಂಭರ್ತಿ" ವಿಳಾಸಗಳಿಗೆ ಡೇಟಾವನ್ನು ಸೂಚಿಸುವುದಿಲ್ಲ ಅಥವಾ ತುಂಬುವುದಿಲ್ಲ, ಅಥವಾ ವೆಬ್ ಬ್ರೌಸ್ ಮಾಡುವಾಗ ಬಳಕೆದಾರರು ಸಲ್ಲಿಸಬಹುದಾದ ವಿಳಾಸಗಳ ಬಗ್ಗೆ ಹೆಚ್ಚಿನ ಮಾಹಿತಿಯನ್ನು ಉಳಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ. - - ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ ಅಥವಾ ಯಾವುದೇ ಮೌಲ್ಯವನ್ನು ಹೊಂದಿಲ್ಲದಿದ್ದರೆ, ಬಳಕೆದಾರರು UI ನಲ್ಲಿರುವ ವಿಳಾಸಗಳಿಗೆ ಸ್ವಯಂಭರ್ತಿಯನ್ನು ನಿಯಂತ್ರಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ.</translation> <translation id="5365946944967967336">ಪರಿಕರ ಪಟ್ಟಿಯಲ್ಲಿ ಮುಖಪುಟ ಬಟನ್ ಅನ್ನು ತೋರಿಸು</translation> <translation id="5366745336748853475">ಸೈಟ್ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಕೋರಿದರೆ, SAML ಹರಿವನ್ನು ಹೋಸ್ಟ್ ಮಾಡುವ ಚೌಕಟ್ಟಿನಲ್ಲಿನ ಸೈನ್-ಇನ್ ಪರದೆಯಲ್ಲಿ ಕ್ಲೈಂಟ್ ಪ್ರಮಾಣಪತ್ರವು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಆಯ್ಕೆಮಾಡಲ್ಪಡುವ ಸೈಟ್ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುವ url ಪ್ಯಾಟರ್ನ್ಗಳ ಪಟ್ಟಿಯನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. SAML IdP ಗೆ ಒದಗಿಸುವ ಸಾಧನ-ವಿಸ್ತಾರದ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುವುದು ಒಂದು ಉದಾಹರಣೆಯಾಗಿದೆ.
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 7ec30094..a5a9c20e 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -723,7 +723,6 @@ 이 정책이 설정되어 있지 않으면 <ph name="PRINTERS_ALLOW_ALL" />이(가) 기본적으로 사용됩니다. </translation> <translation id="2908277604670530363">프록시 서버에 대한 최대 동시 연결 수</translation> -<translation id="2951386431828317490">프로필 정보 자동 완성 사용</translation> <translation id="2956777931324644324">이 정책은 <ph name="PRODUCT_NAME" /> 버전 36을 기준으로 지원 중단되었습니다. TLS 도메인 바인딩 인증서 확장 프로그램 사용 설정 여부를 지정합니다. @@ -1538,11 +1537,6 @@ 이 정책을 'False'로 설정하면 사용자가 콘텐츠를 기기로 전송할 수 없게 됩니다. 반면에 'True'로 설정하면 사용자가 콘텐츠를 전송할 수 있습니다. 이 정책을 설정하지 않으면 사용자가 콘텐츠를 등록된 Chrome OS 기기로 전송할 수 없지만, 등록되지 않은 기기로는 전송할 수 있습니다.</translation> <translation id="5330684698007383292"><ph name="PRODUCT_FRAME_NAME" />이(가) 다음 콘텐츠 유형을 다루도록 허용</translation> -<translation id="5360146044009867539"><ph name="PRODUCT_NAME" />의 자동 완성 기능을 사용 설정하면 사용자가 이전에 저장된 정보를 사용하여 웹 양식에서 주소 정보를 자동으로 입력할 수 있습니다. - - 설정이 사용 중지되면 주소 정보 자동 완성이 제안되거나 실행되지 않으며, 사용자가 웹 탐색 중에 제출하는 주소 정보가 추가로 저장되지도 않습니다. - - 설정이 사용되거나 값이 지정되지 않으면 사용자가 UI에서 주소 정보 자동 완성 기능을 관리할 수 있게 됩니다.</translation> <translation id="5365946944967967336">툴바에 홈 버튼 표시</translation> <translation id="5366745336748853475">사이트에서 인증서를 요청하는 경우 SAML 플로를 호스팅하는 프레임의 로그인 화면에서 자동으로 클라이언트 인증서가 선택된 사이트를 지정하는 URL 패턴 목록을 지정하게 합니다. 사용 사례는 SAMP IdP로 기기 전체 인증서가 제출되게 설정하는 것입니다.
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb index 0eb7893..1a3cba9 100644 --- a/components/policy/resources/policy_templates_lt.xtb +++ b/components/policy/resources/policy_templates_lt.xtb
@@ -723,7 +723,6 @@ Jei ši politika nenustatyta, taikoma „<ph name="PRINTERS_ALLOW_ALL" />“. </translation> <translation id="2908277604670530363">Didžiausias jungčių prie tarpinio serverio vienu metu skaičius</translation> -<translation id="2951386431828317490">Profilių automatinio pildymo funkcijos įgalinimas</translation> <translation id="2956777931324644324">Ši politika nebenaudojama nuo 36 versijos „<ph name="PRODUCT_NAME" />“. Nurodoma, ar TLS domeno sertifikatų plėtinys turėtų būti įgalintas. @@ -1547,11 +1546,6 @@ Jei ši politika nustatyta kaip „False“ (netiesa), naudotojai negalės perduoti turinio į įrenginį. Jei ši politika nustatyta kaip „True“ (tiesa), naudotojai perduoti turinį galės. Jei ši politika nenustatyta, naudotojai negalės perduoti turinio į užregistruotus „Chrome“ OS įrenginius, bet galės perduoti į neužregistruotus įrenginius.</translation> <translation id="5330684698007383292">Leisti „<ph name="PRODUCT_FRAME_NAME" />“ naudoti šių tipų turinį</translation> -<translation id="5360146044009867539">Įgalinama „<ph name="PRODUCT_NAME" />“ automatinio pildymo funkcija ir naudotojams leidžiama automatiškai užpildyti žiniatinklio formas, naudojant anksčiau išsaugotą informaciją, pvz., profilio ir adreso informaciją. - - Jei šis nustatymas išjungtas, Automatinio pildymo funkcija niekada nesiūlys ir automatiškai nepildys adreso informacijos, taip pat neišsaugos papildomos adreso informacijos, kurią naudotojas gali pateikti naršydamas žiniatinklyje. - - Jei šis nustatymas įgalintas arba vertė nenustatyta, naudotojas galės valdyti adreso informacijos Automatinio pildymo funkciją naudotojo sąsajoje.</translation> <translation id="5365946944967967336">Rodyti įrankių juostoje pagrindinio puslapio mygtuką</translation> <translation id="5366745336748853475">Galima sudaryti URL šablonų sąrašą, nurodantį, kurioms svetainėms prisijungimo ekrane, kur rėmelyje priglobiama SAML eiga, automatiškai pasirenkamas kliento sertifikatas (jei svetainėje jo reikalaujama). Naudojimo pavyzdys – sukonfigūruoti įrenginio sertifikatą, kad jis būtų pateiktas „SAML IdP“ eigoje.
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb index c32eb4db..5be99e9 100644 --- a/components/policy/resources/policy_templates_lv.xtb +++ b/components/policy/resources/policy_templates_lv.xtb
@@ -726,7 +726,6 @@ Ja šī politika nav iestatīta, tiek izmantota vērtība <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Maksimālais vienlaikus iespējamais savienojumu skaits ar starpniekserveri</translation> -<translation id="2951386431828317490">Automātiskās aizpildes iespējošana profiliem</translation> <translation id="2956777931324644324">Kopš <ph name="PRODUCT_NAME" /> versijas 36 izlaišanas šī politika vairs netiek izmantota. Norāda, vai jāiespējo TLS domēnam piesaistītais sertifikātu paplašinājums. @@ -1545,11 +1544,6 @@ Ja šai politikai tiks iestatīta vērtība “False”, lietotāji nevarēs apraidīt saturu savā ierīcē. Ja šai politikai tiks iestatīta vērtība “True”, lietotājiem būs atļauts apraidīt saturu. Ja šī politika nebūs iestatīta, lietotājiem nebūs atļauts apraidīt saturu reģistrētajās Chrome OS ierīcēs, taču viņi varēs apraidīt saturu nereģistrētajās ierīcēs.</translation> <translation id="5330684698007383292">Atļauja produktam <ph name="PRODUCT_FRAME_NAME" /> apstrādāt tālāk norādītos satura veidus</translation> -<translation id="5360146044009867539">Iespējo pārlūka <ph name="PRODUCT_NAME" /> funkciju Automātiskā aizpilde un ļauj lietotājiem automātiski aizpildīt profilu un adrešu informāciju tīmekļa veidlapās, izmantojot iepriekš saglabāto informāciju. - - Ja šis iestatījums ir atspējots, funkcija Automātiskā aizpilde nekad nerādīs adrešu informācijas ieteikumus un neaizpildīs šo informāciju, kā arī nesaglabās papildu adrešu informāciju, ko lietotājs var norādīt, pārlūkojot tīmekli. - - Ja šis iestatījums ir iespējots vai tā vērtība nav norādīta, lietotājs varēs kontrolēt adrešu informācijas automātisko aizpildi lietotāja saskarnē.</translation> <translation id="5365946944967967336">Rīkjoslā parāda pogu Sākums</translation> <translation id="5366745336748853475">Ļauj norādīt URL modeļu sarakstu ar vietnēm, kurām klienta sertifikāts tiek automātiski atlasīts pierakstīšanās ekrāna rāmī, kas mitina SAML plūsmu (ja vietne pieprasa sertifikātu). Piemēram, var konfigurēt, lai ierīces sertifikāts tiktu rādīts SAML identitātes nodrošinātājam.
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb index c097504..a1ad915a 100644 --- a/components/policy/resources/policy_templates_ml.xtb +++ b/components/policy/resources/policy_templates_ml.xtb
@@ -800,7 +800,6 @@ ഈ നയം സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, <ph name="PRINTERS_ALLOW_ALL" /> അനുമാനിക്കപ്പെടും. </translation> <translation id="2908277604670530363">പ്രോക്സി സെർവറിനായി ഒരേ സമയമുള്ള പരമാവധി എണ്ണം കണക്ഷനുകൾ</translation> -<translation id="2951386431828317490">പ്രൊഫൈലുകൾക്കായി സ്വമേധയാ പൂരിപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="2956777931324644324"><ph name="PRODUCT_NAME" /> പതിപ്പ് 36 മുതൽ ഈ നയം റദ്ദാക്കി. TLS ഡൊമെയ്ൻ-ബൗണ്ട് സർട്ടിഫിക്കറ്റ് വിപുലീകരണം പ്രവർത്തനക്ഷമമാക്കണോയെന്ന് വ്യക്തമാക്കുന്നു. @@ -1738,11 +1737,6 @@ ഈ നയം 'തെറ്റ്' എന്ന് സജ്ജീകരിച്ചാൽ, ഉപയോക്താക്കൾക്ക് അവരുടെ ഉപകരണത്തിലേക്ക് ഉള്ളടക്കം കാസ്റ്റ് ചെയ്യാനാകില്ല. ഈ നയം 'ശരി' എന്ന് സജ്ജീകരിച്ചാൽ ഉപയോക്താക്കൾക്ക് ഉള്ളടക്കം കാസ്റ്റ് ചെയ്യാൻ അനുവാദമുണ്ടാകും. ഈ നയം സജ്ജീകരിച്ചില്ലെങ്കിൽ എൻറോൾ ചെയ്ത Chrome OS ഉപകരണങ്ങളിലേക്ക് ഉപയോക്താക്കൾക്ക് ഉള്ളടക്കം കാസ്റ്റ് ചെയ്യാനാകില്ല, പക്ഷേ എൻറോൾ ചെയ്യാത്ത ഉപകരണങ്ങളിലേക്ക് കാസ്റ്റ് ചെയ്യാനാകും.</translation> <translation id="5330684698007383292">ഇനിപ്പറയുന്ന ഉള്ളടക്ക തരങ്ങള് കൈകാര്യം ചെയ്യാന് <ph name="PRODUCT_FRAME_NAME" /> എന്നതിനെ അനുവദിക്കുക</translation> -<translation id="5360146044009867539"><ph name="PRODUCT_NAME" />-ന്റെ സ്വമേധയാ പൂരിപ്പിക്കൽ ഫീച്ചർ പ്രവർത്തനക്ഷമമാക്കുകയും മുമ്പ് സംഭരിച്ച വിവരം ഉപയോഗിച്ച് വെബ് ഫോമുകളിൽ പ്രൊഫൈൽ, വിലാസ വിവരം എന്നിവ സ്വമേധയാ പൂർത്തിയാക്കാൻ ഉപയോക്താക്കളെ അനുവദിക്കുകയും ചെയ്യുന്നു. - - ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കിയാൽ, സ്വമേധയാ പൂരിപ്പിക്കൽ ഒരിക്കലും വിലാസ വിവരം നിർദേശിക്കുകയോ പൂരിപ്പിക്കുകയോ ഇല്ല, വെബ് ബ്രൗസ് ചെയ്യുമ്പോൾ ഉപയോക്താവ് സമർപ്പിച്ചേക്കാവുന്ന അധിക വിലാസ വിവരം സംരക്ഷിക്കുകയുമില്ല. - - ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കിയാലോ അതിന് മൂല്യം ഇല്ലെങ്കിലോ, UI-യിൽ വിലാസത്തിനായി സ്വമേധയാ പൂരിപ്പിക്കൽ നിയന്ത്രിക്കാൻ ഉപയോക്താവിന് കഴിയും.</translation> <translation id="5365946944967967336">ഉപകരണബാറില് ഹോം ബട്ടണ് കാണിക്കുക</translation> <translation id="5366745336748853475">സൈറ്റ് ഒരു സർട്ടിഫിക്കറ്റ് അഭ്യർത്ഥിക്കുകയാണെങ്കിൽ, SAML ഫ്ലോ ഹോസ്റ്റ് ചെയ്യുന്ന ഫ്രെയിമിലെ സൈൻ ഇൻ സ്ക്രീനിൽ ഒരു ക്ലയന്റ് സർട്ടിഫിക്കറ്റ് സ്വമേധയാ തിരഞ്ഞെടുക്കുന്നതിന് സൈറ്റുകൾ വ്യക്തമാക്കാൻ URL പാറ്റേണുകളുടെ ലിസ്റ്റ് നിർദ്ദേശിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. SAML IdP-യ്ക്ക് സമർപ്പിക്കേണ്ട, ഉപകരണത്തിൽ ഉടനീളം പ്രാബല്യമുള്ള സർട്ടിഫിക്കറ്റ് കോൺഫിഗർ ചെയ്യുക എന്നതാണ് ഒരു ഉദാഹരണ ഉപയോഗം.
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb index 52d0a03a..dc6b007 100644 --- a/components/policy/resources/policy_templates_mr.xtb +++ b/components/policy/resources/policy_templates_mr.xtb
@@ -779,7 +779,6 @@ हे धोरण सेट केले नसल्यास, <ph name="PRINTERS_ALLOW_ALL" /> गृहित धरले जाते. </translation> <translation id="2908277604670530363">प्रॉक्सी सर्व्हरच्या सहकालिक कनेक्शनची अधिकतम संख्या</translation> -<translation id="2951386431828317490">प्रोफाइलसाठी ऑटोफिल सुरू करा</translation> <translation id="2956777931324644324">हे धोरण <ph name="PRODUCT_NAME" /> आवृत्ती 36 प्रमाणे निवृत्त केले गेले आहे. TLS डोमेन-बद्ध प्रमाणपत्रे विस्तार सक्षम केला जावा किंवा नाही हे निर्दिष्ट करते. @@ -1720,11 +1719,6 @@ हे धोरण असत्य वर सेट केले असल्यास, वापरकर्ते त्यांच्या डिव्हाइसवर आशय कास्ट करू शकणार नाहीत. हे धोरण सत्य वर सेट केले असल्यास, वापरकर्त्यांना आशय कास्ट करण्याची अनुमती आहे. हे धोरण सेट केलेले नसल्यास, वापरकर्त्यांना नोंदणी केलेल्या Chrome OS डिव्हाइसवर आशय कास्ट करण्याची अनुमती नाही, परंतु ते नोंदणी न केलेल्या डिव्हाइसवर कास्ट करू शकतात.</translation> <translation id="5330684698007383292">खालील सामग्री प्रकार हाताळण्यास <ph name="PRODUCT_FRAME_NAME" /> ला अनुमती द्या</translation> -<translation id="5360146044009867539"><ph name="PRODUCT_NAME" /> चे ऑटोफिल वैशिष्ट्य सुरू करते आणि यापूर्वी स्टोअर केलेली माहिती वापरून वापरकर्त्यांना वेब फॉर्ममध्ये प्रोफाइल आणि पत्ता माहिती आपोआप पूर्ण करण्याची अनुमती देते. - - हे सेटिंग बंद केल्यास, ऑटोफिल कधीही पत्ता माहिती सुचवणार किंवा भरणार नाही तसेच ब्राउझ करत असताना वापरकर्त्याने कदाचित सबमिट केलेली अतिरिक्त पत्त्याची माहिती ते सेव्ह करणार नाही. - - हे सेटिंग सुरू केल्यास किंवा मूल्य नसल्यास, वापरकर्त्याला UI मध्ये पत्त्यांसाठी ऑटोफिल नियंत्रित करता येईल.</translation> <translation id="5365946944967967336">टूलबारवर मुख्यपृष्ठ बटण दर्शवा</translation> <translation id="5366745336748853475">तुम्हाला url पॅटर्नची सूची निर्दिष्ट करण्याची अनुमती दिली जाते ज्यासाठी फ्रेम होस्टिंग SAML फ्लोमध्ये साइन-इन स्क्रीनवर आपोआप निवडलेल्या क्लायंट सर्टिफिकेटसाठी साइट निर्दिष्ट केल्या आहेत, जर साइट सर्टिफिकेटची विनंती करत असेल.
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb index 9d35dba..33ddefd2 100644 --- a/components/policy/resources/policy_templates_ms.xtb +++ b/components/policy/resources/policy_templates_ms.xtb
@@ -723,7 +723,6 @@ Jika dasar ini tidak ditetapkan, <ph name="PRINTERS_ALLOW_ALL" /> akan digunakan. </translation> <translation id="2908277604670530363">Bilangan maksimum sambungan serentak kepada pelayan proksi</translation> -<translation id="2951386431828317490">Dayakan Autolengkap untuk profil</translation> <translation id="2956777931324644324">Dasar ini telah dihentikan mengikut <ph name="PRODUCT_NAME" /> versi 36. Menyatakan sama ada sambungan sijil hala domain TLS harus didayakan. @@ -1170,6 +1169,15 @@ Jika dasar ini dibiarkan tanpa ditetapkan, nilai lalai global akan digunakan untuk semua tapak, sama ada daripada dasar 'DefaultKeygenSetting' jika ditetapkan atau konfigurasi peribadi pengguna jika tidak ditetapkan.</translation> <translation id="4239720644496144453">Cache tidak digunakan untuk apl Android. Jika beberapa orang pengguna memasang apl Android yang sama, apl yang baharu akan dimuat turun untuk setiap pengguna.</translation> +<translation id="4243336580717651045">Mendayakan pengumpulan data awanama URL berkunci dalam <ph name="PRODUCT_NAME" /> dan menghalang pengguna daripada menukar tetapan ini. + + Pengumpulan data awanama URL berkunci menghantar URL halaman yang dilawati pengguna kepada Google untuk menambah baik carian dan penyemakan imbas. + + Jika anda mendayakan dasar ini, pengumpulan data awanama URL berkunci akan sentiasa aktif. + + Jika anda melumpuhkan dasar ini, pengumpulan data awanama URL berkunci tidak akan diaktifkan. + + Jika dasar ini dibiarkan tanpa ditetapkan, pengumpulan data awanama URL berkunci akan didayakan, tetapi pengguna akan dapat menukarnya.</translation> <translation id="4250680216510889253">Tidak</translation> <translation id="4261820385751181068">Tempat peristiwa skrin log masuk peranti</translation> <translation id="427220754384423013">Menentukan pencetak yang boleh digunakan oleh pengguna. @@ -1542,11 +1550,6 @@ Jika dasar ini ditetapkan kepada Palsu, pengguna tidak akan dapat menghantar kandungan ke peranti mereka. Jika dasar ini ditetapkan kepada Benar, pengguna dibenarkan menghantar kandungan. Jika dasar ini tidak ditetapkan, pengguna tidak dibenarkan menghantar kandungan ke peranti OS Chrome berdaftar, tetapi dibenarkan berbuat demikian ke peranti OS Chrome tidak berdaftar.</translation> <translation id="5330684698007383292">Benarkan <ph name="PRODUCT_FRAME_NAME" /> mengendalikan jenis kandungan berikut</translation> -<translation id="5360146044009867539">Mendayakan ciri Autolengkap <ph name="PRODUCT_NAME" /> dan membolehkan pengguna mengisikan maklumat profil dan alamat dalam borang web secara automatik dengan menggunakan maklumat yang disimpan sebelum itu. - - Jika tetapan ini dilumpuhkan, Autolengkap tidak akan mencadangkan atau mengisikan maklumat alamat atau menyimpan maklumat alamat tambahan yang mungkin diserahkan oleh pengguna semasa menyemak imbas web. - - Jika tetapan ini didayakan atau tiada nilai, pengguna akan dapat mengawal ciri Autolengkap untuk alamat dalam UI.</translation> <translation id="5365946944967967336">Paparkan butang Halaman Utama pada bar alat</translation> <translation id="5366745336748853475">Membolehkan anda menentukan senarai pola url yang menentukan tapak yang sijil pelanggannya dipilih secara automatik pada skrin log masuk dalam bingkai yang mengehoskan aliran SAML, jika tapak tersebut meminta sijil. Satu contoh penggunaan adalah untuk mengkonfigurasikan sijil seluruh peranti yang akan disampaikan kepada SAML IdP. @@ -1833,6 +1836,7 @@ Cara yang disyorkan untuk mengunci skrin semasa melahu adalah dengan mendayakan penguncian skrin semasa tergantung dan membuatkan <ph name="PRODUCT_OS_NAME" /> tergantung selepas kelewatan melahu. Dasar ini harus digunakan hanya apabila penguncian skrin berlaku jauh lebih awal daripada masa tergantung atau apabila tergantung yang berlaku semasa melahu tidak diingini sama sekali. Nilai dasar mesti dinyatakan dalam milisaat. Nilai diketatkan menjadi kurang daripada kelewatan melahu.</translation> +<translation id="6097601282776163274">Dayakan pengumpulan data awanama URL berkunci</translation> <translation id="6111936128861357925">Benarkan Permainan Telur Easter Dinosaur</translation> <translation id="6114416803310251055">dikecam</translation> <translation id="6133088669883929098">Benarkan semua tapak untuk menggunakan penghasilan kunci</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 0905b8b..d00eafd 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -710,7 +710,6 @@ Als dit beleid niet is ingesteld, wordt er uitgegaan van <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Maximaal aantal gelijktijdige verbindingen met de proxyserver</translation> -<translation id="2951386431828317490">Automatisch aanvullen inschakelen voor profielen</translation> <translation id="2956777931324644324">Dit beleid is buiten gebruik gesteld vanaf <ph name="PRODUCT_NAME" /> versie 36. Geeft aan of de extensie voor TLS-domeingebonden certificaten moet worden ingeschakeld. @@ -1528,11 +1527,6 @@ Als dit beleid is ingesteld op 'False' (Onwaar), kunnen gebruikers geen content casten naar hun apparaat. Als dit beleid is ingesteld op 'True' (Waar), mogen gebruikers content casten. Als dit beleid niet is ingesteld, mogen gebruikers geen content naar geregistreerde Chrome OS-apparaten casten, maar wel naar niet-geregistreerde apparaten.</translation> <translation id="5330684698007383292"><ph name="PRODUCT_FRAME_NAME" /> toestaan de volgende soorten content te verwerken.</translation> -<translation id="5360146044009867539">Hiermee wordt de functie 'Automatisch aanvullen' van <ph name="PRODUCT_NAME" /> ingeschakeld zodat en gebruikers profiel- en adresgegevens automatisch kunnen invullen op webformulieren aan de hand van eerder opgeslagen gegevens. - - Als deze instelling is uitgeschakeld, worden er nooit adresgegevens voorgesteld of ingevuld door 'Automatisch aanvullen'. Er worden ook geen aanvullende adresgegevens opgeslagen die de gebruiker mogelijk verzendt terwijl deze browset op internet. - - Als deze instelling is ingeschakeld of er geen waarde is ingesteld, kan de gebruiker 'Automatisch aanvullen' voor adressen beheren in de UI.</translation> <translation id="5365946944967967336">Knop 'Homepage' in de werkbalk weergeven</translation> <translation id="5366745336748853475">Hiermee kun je een lijst met URL-patronen opgeven die sites specificeren waarvoor automatisch een clientcertificaat moet worden geselecteerd op het inlogscherm in het frame waarin de SAML-procedure wordt gehost als de site vraagt om een certificaat. Een voorbeeld van het gebruik is een certificaat voor het hele apparaat configureren om te presenteren aan de SAML IdP.
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb index cf0f3d6..98882d8 100644 --- a/components/policy/resources/policy_templates_pl.xtb +++ b/components/policy/resources/policy_templates_pl.xtb
@@ -700,7 +700,6 @@ Jeśli ta zasada nie została skonfigurowana, domyślnie stosowana jest opcja <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Maksymalna liczba jednoczesnych połączeń z serwerem proxy</translation> -<translation id="2951386431828317490">Włącz autouzupełnianie dla profili</translation> <translation id="2956777931324644324">Ta zasada została wycofana w wersji 36 <ph name="PRODUCT_NAME" />. Określa, czy ma być włączone rozszerzenie certyfikatów TLS powiązanych z domeną. @@ -1473,11 +1472,6 @@ Jeśli ta zasada jest ustawiona na wartość fałsz, użytkownicy nie mogą przesyłać treści na urządzenie. Jeśli jest ustawiona na wartość prawda – mogą to robić. Jeśli ta zasada nie jest ustawiona, użytkownicy nie mogą przesyłać treści na zarejestrowane urządzenia z Chrome OS. Mogą przesyłać treści na urządzenia niezarejestrowane.</translation> <translation id="5330684698007383292">Zezwalaj <ph name="PRODUCT_FRAME_NAME" /> na obsługę tych typów treści</translation> -<translation id="5360146044009867539">Włącza funkcję autouzupełniania w <ph name="PRODUCT_NAME" /> i umożliwia użytkownikom automatyczne wprowadzanie wcześniej zapisanych informacji profilowych i adresowych w formularzach na stronach internetowych. - - Jeśli to ustawienie jest wyłączone, autouzupełnianie nie będzie podpowiadać ani wypełniać adresu, nie będzie też zapisywać dodatkowych informacji adresowych, które użytkownik może podawać na stronach internetowych. - - Jeśli to ustawienie jest włączone lub nieskonfigurowane, użytkownik może samodzielnie skonfigurować autouzupełnianie dla adresów w interfejsie.</translation> <translation id="5365946944967967336">Pokaż przycisk strony startowej na pasku narzędzi</translation> <translation id="5366745336748853475">Umożliwia określenie listy wzorców adresu URL definiujących witryny, dla których jest automatycznie wybierany certyfikat klienta na ekranie logowania w ramce obsługującej proces SAML, jeśli witryna zażąda certyfikatu. Przykładowe użycie to skonfigurowanie certyfikatu dla całego urządzenia, który będzie okazywany dostawcy tożsamości SAML.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 1973c8e..db0e565 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -695,7 +695,6 @@ Se esta política não for definida, a opção <ph name="PRINTERS_ALLOW_ALL" /> será adotada. </translation> <translation id="2908277604670530363">Número máximo de conexões simultâneas ao servidor proxy</translation> -<translation id="2951386431828317490">Ativa o preenchimento automático de perfis</translation> <translation id="2956777931324644324">Esta política foi retirada de circulação a partir da versão 36 do <ph name="PRODUCT_NAME" />. Especifica se a extensão dos certificados vinculados ao domínio TLS deve ser ativada. @@ -1474,11 +1473,6 @@ Se essa política for definida como falso, os usuários não poderão transmitir conteúdo para o dispositivo deles. Se essa política for definida como verdadeiro, os usuários poderão transmitir conteúdo. Se essa política não for definida, os usuários não poderão transmitir conteúdo para dispositivos Chrome OS inscritos, mas poderão transmitir para dispositivos não inscritos.</translation> <translation id="5330684698007383292">Permitir que o <ph name="PRODUCT_FRAME_NAME" /> trabalhe com os tipos de conteúdo a seguir</translation> -<translation id="5360146044009867539">Ativa o recurso de preenchimento automático do <ph name="PRODUCT_NAME" /> e permite que os usuários preencham automaticamente informações sobre perfil e endereço em formulários da Web usando informações previamente armazenadas. - - Se essa configuração estiver desativada, o preenchimento automático nunca sugerirá ou preencherá informações sobre endereço, nem salvará outras informações de endereço que o usuário possa enviar ao navegar na Web. - - Se essa configuração estiver ativada ou não tiver um valor definido, o usuário poderá controlar o recurso de preenchimento automático para endereços na IU.</translation> <translation id="5365946944967967336">Exibir o botão da Página inicial na barra de ferramentas</translation> <translation id="5366745336748853475">Permite que você defina uma lista de padrões de URL que especifique sites para os quais um certificado de cliente é selecionado automaticamente na tela de login do quadro que hospeda o fluxo SAML, se o site solicitar um certificado. Um exemplo de uso é a configuração de um certificado de dispositivos que será apresentado ao IdP SAML. @@ -1512,7 +1506,7 @@ Se esta política for definida como uma lista de identificadores de método de entrada, os métodos de entrada fornecidos ficarão disponíveis na tela de login. O primeiro método de entrada fornecido será pré-selecionado. Enquanto um grupo de usuários estiver focado na tela de login, o último método de entrada usado pelo usuário ficará disponível juntamente com os métodos de entrada fornecidos por esta política. Se esta política não for definida, os métodos de entrada na tela de login serão derivados da localidade em que a tela de login é exibida. Os valores que não forem identificadores de método de entrada válidos serão ignorados.</translation> <translation id="5423001109873148185">Caso ativada, esta política força mecanismos de pesquisa a serem importados do navegador padrão atual. Se ativada, esta política também afeta a caixa de diálogo de importação. Caso seja desativada, o mecanismo de pesquisa padrão não é importado. Se não for definida, o usuário pode ser solicitado a responder se deseja importar ou permitir a importação automática.</translation> <translation id="5423197884968724595">Nome de restrição do Android WebView:</translation> -<translation id="5442026853063570579">Esta política também controla o acesso às Opções do desenvolvedor do Android. Se esta política for definida como "DeveloperToolsDisallowed" (valor 2), os usuários não poderão acessar as Opções do desenvolvedor. Se for definida como falsa ou se não for definida, os usuários poderão acessar as Opções do desenvolvedor tocando sete vezes no número da versão no app de configurações do Android.</translation> +<translation id="5442026853063570579">Esta política também controla o acesso às Opções do desenvolvedor Android. Se esta política for definida como "DeveloperToolsDisallowed" (valor 2), os usuários não poderão acessar as Opções do desenvolvedor. Se for definida como falsa ou se não for definida, os usuários poderão acessar as Opções do desenvolvedor tocando sete vezes no número da versão no app de configurações do Android.</translation> <translation id="5447306928176905178">Ativar relatórios de informação de memória (JS tamanho da pilha) para a página (obsoleta)</translation> <translation id="5457065417344056871">Ativar o modo visitante no navegador</translation> <translation id="5457924070961220141">Permite configurar o processador HTML padrão quando <ph name="PRODUCT_FRAME_NAME" /> estiver instalado. A configuração padrão utilizada quando esta política é deixada sem definição é permitir que o navegador host faça o processamento, mas você pode, opcionalmente, substituí-la para que <ph name="PRODUCT_FRAME_NAME" /> processe as páginas HTML por padrão.</translation>
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb index eb1d5a9..0551ffc 100644 --- a/components/policy/resources/policy_templates_pt-PT.xtb +++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -708,7 +708,6 @@ Se esta política não estiver definida, é assumida a opção <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Número máximo de ligações simultâneas ao servidor proxy</translation> -<translation id="2951386431828317490">Ativar o Preenchimento automático para perfis</translation> <translation id="2956777931324644324">Esta política foi retirada a partir da versão 36 do <ph name="PRODUCT_NAME" />. Especifica se a extensão de certificados de vinculação ao domínio TLS deveria ser ativada. @@ -1314,7 +1313,7 @@ Se esta definição estiver definida como falsa, as sugestões não serão obtidas nem apresentadas.</translation> <translation id="4788252609789586009">Ativa a funcionalidade de Preenchimento automático do <ph name="PRODUCT_NAME" /> e permite que os utilizadores preencham automaticamente as informações de cartões de crédito em formulários Web ao utilizar informações armazenadas anteriormente. - Se esta definição estiver desativada, o Preenchimento automático nunca sugere nem preenche com informações de cartões de crédito e também não guarda informações adicionais de cartões de crédito que o utilizador pode enviar enquanto navega na Web. + Se esta definição estiver desativada, o Preenchimento automático nunca sugere nem preenche formulários com informações de cartões de crédito e também não guarda informações adicionais de cartões de crédito que o utilizador possa enviar enquanto navega na Web. Se esta definição estiver ativada ou não tiver qualquer valor, o utilizador pode controlar a funcionalidade de preenchimento automático para os cartões de crédito na IU.</translation> <translation id="4791031774429044540">Ativar a funcionalidade de acessibilidade do cursor grande. @@ -1441,7 +1440,7 @@ Se esta política for definida como Verdadeiro, o <ph name="PRODUCT_OS_NAME" /> impedirá o dispositivo de arrancar no modo de programador. O sistema recusar-se-á a arrancar e apresentará um ecrã de erro quando o botão do programador for ligado. Se esta política não for definida ou for definida para Falso, o modo de programador continuará disponível para o dispositivo.</translation> -<translation id="520403427390290017">A funcionalidade de ciclos de vida dos separadores recupera a CPU e, finalmente, a memória associada à execução de separadores que não são utilizados durante um longo período de tempo, ao primeiro controlá-los e, em seguida, ao bloqueá-los e, por último, ao rejeitá-los. +<translation id="520403427390290017">A funcionalidade de ciclos de vida dos separadores recupera a CPU e, finalmente, a memória associada à execução de separadores que não são utilizados durante um longo período de tempo, ao primeiro controlá-los, em seguida, ao bloqueá-los e, por último, ao rejeitá-los. Se a política estiver definida como falsa, os ciclos de vida dos separadores são desativados e todos os separadores continuam a ser executados normalmente. @@ -1491,11 +1490,6 @@ Se esta política estiver definida como falsa, os utilizadores não podem transmitir conteúdo para o dispositivo. Se esta política estiver definida como verdadeira, os utilizadores podem transmitir conteúdo. Se esta política não estiver definida, os utilizadores não podem transmitir conteúdo para os dispositivos do Chrome OS inscritos, mas podem fazê-lo para dispositivos não inscritos.</translation> <translation id="5330684698007383292">Permitir que o <ph name="PRODUCT_FRAME_NAME" /> processe os seguintes tipos de conteúdo</translation> -<translation id="5360146044009867539">Ativa a funcionalidade de Preenchimento automático do <ph name="PRODUCT_NAME" /> e permite que os utilizadores preencham automaticamente informações de endereços e de perfis em formulários Web ao utilizar informações armazenadas anteriormente. - - Se esta definição estiver desativada, o Preenchimento automático nunca sugere nem preenche com informações de endereços e também não guarda informações adicionais de endereços que o utilizador pode enviar enquanto navega na Web. - - Se esta definição estiver ativada ou não tiver qualquer valor, o utilizador pode controlar a funcionalidade de preenchimento automático para os endereços na IU.</translation> <translation id="5365946944967967336">Mostrar o botão Página Inicial na barra de ferramentas</translation> <translation id="5366745336748853475">Permite especificar uma lista de padrões do URL que especificam sites para os quais é automaticamente selecionado um certificado de cliente no ecrã de início de sessão, no frame que aloja o fluxo SAML, se o site solicitar um certificado. Serve, por exemplo, para configurar um certificado ao nível do dispositivo que deve ser apresentado ao SAML IdP.
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb index 8bc19d0..df31a46 100644 --- a/components/policy/resources/policy_templates_ro.xtb +++ b/components/policy/resources/policy_templates_ro.xtb
@@ -704,7 +704,6 @@ Dacă politica nu este configurată, se va folosi <ph name="PRINTERS_ALLOW_ALL" /> în mod prestabilit. </translation> <translation id="2908277604670530363">Numărul maxim de conexiuni simultane la serverul proxy</translation> -<translation id="2951386431828317490">Activează completarea automată pentru profiluri</translation> <translation id="2956777931324644324">Această politică a fost retrasă începând cu <ph name="PRODUCT_NAME" /> versiunea 36. Specifică dacă extensia pentru certificatele TLS legate la domeniu trebuie să fie activată. @@ -1497,11 +1496,6 @@ Dacă această politică este dezactivată, utilizatorii nu vor putea să proiecteze conținut pe dispozitivul lor. Dacă această politică este activată, utilizatorii pot să proiecteze conținut. Dacă această politică nu este configurată, utilizatorii nu pot să proiecteze conținut pe dispozitivele cu sistemul de operare Chrome înregistrate, însă pot să facă acest lucru pe dispozitive neînregistrate.</translation> <translation id="5330684698007383292">Permiteți ca <ph name="PRODUCT_FRAME_NAME" /> să gestioneze următoarele tipuri de conținut</translation> -<translation id="5360146044009867539">Activează funcția de completare automată din <ph name="PRODUCT_NAME" /> și permite utilizatorilor să completeze automat informațiile despre carduri de credit și adrese în formularele web folosind informațiile stocate anterior. - - Dacă această setare este dezactivată, completarea automată nu va sugera și nu va completa niciodată informațiile despre adrese information, nici nu va salva informațiile suplimentare despre adrese pe care utilizatorul le-ar putea trimite când navighează pe web - - Dacă setarea este activată sau nu are nicio valoare, utilizatorul va putea controla funcția de completare automată pentru adrese în interfața de utilizare.</translation> <translation id="5365946944967967336">Afișează butonul Pagina principală în bara de instrumente</translation> <translation id="5366745336748853475">Îți permite să specifici o listă de șabloane de adrese URL care stabilesc site-urile pentru care este selectat automat un certificat de client pe ecranul de conectare din cadrul care găzduiește fluxul SAML, dacă site-ul solicită un astfel de certificat. Un exemplu de utilizare este configurarea unui certificat la nivel de dispozitiv care trebuie prezentat furnizorului de identitate SAML.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index d3f54f6a..bcd2948 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -683,7 +683,6 @@ Если правило не настроено, используется параметр <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Максимальное количество одновременных подключений к прокси-серверу</translation> -<translation id="2951386431828317490">Правило включает автозаполнение профилей</translation> <translation id="2956777931324644324">Это правило не используется, начиная с версии <ph name="PRODUCT_NAME" /> 36. Оно определяет, использовать ли TLS-расширение для сертификатов, привязанных к домену. @@ -1463,11 +1462,6 @@ Если выбрать значение False, пользователи не смогут транслировать контент на свои устройства. Чтобы разрешить это делать, укажите значение True. Когда правило не настроено, транслировать контент на зарегистрированные устройства с Chrome OS нельзя, но можно использовать другие устройства.</translation> <translation id="5330684698007383292">Типы содержания, которые <ph name="PRODUCT_FRAME_NAME" /> может обрабатывать</translation> -<translation id="5360146044009867539">Правило включает в <ph name="PRODUCT_NAME" /> функцию автозаполнения и разрешает пользователям автоматически заполнять профили и данные об адресе в веб-формах, используя ранее сохраненную информацию. - - Если правило отключено, пользователи не будут видеть предложение внести информацию автоматически. Данные об адресе, которые пользователи указывают на веб-сайтах, также сохраняться не будут. - - Если правило включено или его значение не указано, пользователи смогут сами управлять автозаполнением через пользовательский интерфейс.</translation> <translation id="5365946944967967336">Отображать кнопку "Главная страница" на панели инструментов</translation> <translation id="5366745336748853475">Позволяет указать список шаблонов URL тех сайтов, для которых сертификат клиента будет автоматически выбран на экране входа во фрейме с потоком SAML (если сайту требуется сертификат). Например, можно настроить, чтобы сертификат для устройств предоставлялся поставщику услуг SAML.
diff --git a/components/policy/resources/policy_templates_sk.xtb b/components/policy/resources/policy_templates_sk.xtb index a8e840e0..6302334 100644 --- a/components/policy/resources/policy_templates_sk.xtb +++ b/components/policy/resources/policy_templates_sk.xtb
@@ -705,7 +705,6 @@ Ak toto pravidlo nenastavíte, bude platiť možnosť <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Maximálny počet súčasných pripojení k serveru proxy</translation> -<translation id="2951386431828317490">Povoliť Automatické dopĺňanie pre profily</translation> <translation id="2956777931324644324">Podpora tohto pravidla bola ukončená vo verzii 36 aplikácie <ph name="PRODUCT_NAME" />. Určuje, či má byť povolené rozšírenie pre certifikáty TLS typu domain-bound. @@ -1520,11 +1519,6 @@ Ak toto pravidlo nastavíte na hodnotu False, používatelia nebudú môcť do svojho zariadenia prenášať obsah. Ak ho nastavíte na hodnotu True, používatelia budú môcť prenášať obsah. Ak ho nenastavíte, používatelia nebudú môcť prenášať obsah do registrovaných zariadení Chrome OS, ale v prípade iných zariadení to bude povolené.</translation> <translation id="5330684698007383292">Povoliť doplnku <ph name="PRODUCT_FRAME_NAME" /> spracovávať nasledujúce typy obsahu</translation> -<translation id="5360146044009867539">Povolí v prehliadači <ph name="PRODUCT_NAME" /> funkciu Automatické dopĺňanie, ktorá používateľom umožňuje automaticky dopĺňať údaje profilu a adresy do webových formulárov na základe predtým uložených informácií. - - Ak toto nastavenie deaktivujete, Automatické dopĺňanie nebude nikdy navrhovať ani vyplňovať údaje adresy ani ukladať informácie o ďalších adresách, ktoré môže používateľ odoslať počas prehliadania webu. - - Ak ho povolíte alebo preň nenastavíte žiadnu hodnotu, používateľ bude môcť ovládať funkciu Automatické dopĺňanie pre adresy v používateľskom rozhraní.</translation> <translation id="5365946944967967336">Zobraziť tlačidlo Domov na paneli s nástrojmi</translation> <translation id="5366745336748853475">Umožňuje určiť zoznam vzorov webových adries označujúcich weby, v prípade ktorých sa na prihlasovacej obrazovke v rámci hosťujúcom postup SAML automaticky vyberie certifikát klienta, keď určitý web požaduje certifikát. Príklad využitia: Konfigurácia poskytovania certifikátu pre celé zariadenie v poskytovateľovi identity SAML.
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb index 791ba6e..aeba988d 100644 --- a/components/policy/resources/policy_templates_sl.xtb +++ b/components/policy/resources/policy_templates_sl.xtb
@@ -725,7 +725,6 @@ Če ta pravilnik ni nastavljen, se predvideva uporaba pravilnika <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Največje dovoljeno število hkratnih povezav s strežnikom proxy</translation> -<translation id="2951386431828317490">Omogočanje samodejnega izpolnjevanja za profile</translation> <translation id="2956777931324644324">Ta pravilnik se ne uporablja od uveljavitve različice brskalnika <ph name="PRODUCT_NAME" /> 36. Določa, ali mora biti razširitev za potrdila, domensko vezana na TLS, omogočena. @@ -1552,11 +1551,6 @@ Če je ta pravilnik onemogočen, uporabniki ne bodo mogli predvajati vsebine v tej napravi. Če je pravilnik omogočen, je uporabnikom dovoljeno predvajanje vsebine. Če ta pravilnik ni nastavljen, uporabnikom ni dovoljeno predvajati vsebine v včlanjenih napravah OS Chrome, vendar jo lahko predvajajo v napravah, ki niso včlanjene.</translation> <translation id="5330684698007383292">Dovoli, da <ph name="PRODUCT_FRAME_NAME" /> obravnava te vrste vsebine.</translation> -<translation id="5360146044009867539">Omogoči funkcijo za samodejno izpolnjevanje v brskalniku <ph name="PRODUCT_NAME" /> in uporabnikom omogoča samodejno izpolnjevanje podatkov o profilu in naslovu v spletnih obrazcih s predhodno shranjenimi podatki. - - Če je ta nastavitev onemogočena, samodejno izpolnjevanje ne bo nikoli predlagalo ali vneslo podatkov o naslovu in prav tako ne bo shranilo dodatnih podatkov o naslovu, ki jih uporabnik lahko pošlje med brskanjem v spletu. - - Če je ta nastavitev omogočena ali nima nastavljene vrednosti, bo uporabnik lahko nadziral samodejno izpolnjevanje za naslove v uporabniškem vmesniku.</translation> <translation id="5365946944967967336">V orodni vrstici pokaži gumb »Domov«</translation> <translation id="5366745336748853475">Omogoča, da določite seznam vzorcev URL-jev, ki določajo spletna mesta, za katera je potrdilo odjemalca samodejno izbrano na zaslonu za prijavo v okviru, v katerem gostuje potek SAML, če spletno mesto zahteva potrdilo. Primer uporabe je konfiguriranje potrdila v napravi, ki je predloženo SAML IdP.
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb index 882a73f..b3848ee 100644 --- a/components/policy/resources/policy_templates_sr.xtb +++ b/components/policy/resources/policy_templates_sr.xtb
@@ -722,7 +722,6 @@ Ако не подесите ове смернице, подразумева се да важе смернице <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Максималан број истовремених веза са прокси сервером</translation> -<translation id="2951386431828317490">Омогућавају Аутоматско попуњавање за профиле</translation> <translation id="2956777931324644324">Ове смернице су повучене од <ph name="PRODUCT_NAME" /> верзије 36. Одређују да ли треба омогућити додатак за TLS сертификате упућене на домен. @@ -1538,11 +1537,6 @@ Ако подесите ове смернице на „нетачно“, корисници неће моћи да пребацују садржај на свој уређај. Ако подесите ове смернице на „тачно“, корисницима ће бити дозвољено да пребацују садржај. Ако не подесите ове смернице, корисници неће моћи да пребацују садржај на регистроване Chrome ОС уређаје, али ће моћи да га пребацују на нерегистроване уређаје.</translation> <translation id="5330684698007383292">Дозволи <ph name="PRODUCT_FRAME_NAME" />-у да рукује следећим типовима садржаја</translation> -<translation id="5360146044009867539">Омогућавају функцију Аутоматско попуњавање у <ph name="PRODUCT_NAME" />-у и омогућавају корисницима да аутоматски довршавају податке о профилу и адреси у веб-обрасцима помоћу раније сачуваних података. - - Ако је ово подешавање онемогућено, Аутоматско попуњавање никада неће предлагати или попуњавати податке о адреси нити ће чувати додатне податке о адреси које корисник може да пошаље док прегледа веб. - - Ако је ово подешавање омогућено или није подешено, корисник ће моћи да контролише функцију аутоматског попуњавања за адресе у корисничком интерфејсу.</translation> <translation id="5365946944967967336">Прикажи дугме Почетна на траци са алаткама</translation> <translation id="5366745336748853475">Омогућавају вам да наведете листу URL образаца који наводе сајтове за које се сертификат клијента аутоматски бира на екрану за пријављивање у оквиру који хостује SAML ток, ако сајт захтева сертификат. Пример употребе је конфигурисање сертификата на нивоу уређаја који се приказује SAML IdP-у.
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb index fb9fcca6..bf060c0 100644 --- a/components/policy/resources/policy_templates_sv.xtb +++ b/components/policy/resources/policy_templates_sv.xtb
@@ -724,7 +724,6 @@ Om inget värde anges för principen används <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Högsta antalet samtidiga anslutningar till proxyservern</translation> -<translation id="2951386431828317490">Aktivera autofyll för profiler</translation> <translation id="2956777931324644324">Den här policyn har gäller inte för version 36 och senare av <ph name="PRODUCT_NAME" />. Anger om domänbundna TLS-certifikattillägg ska aktiveras. @@ -1549,11 +1548,6 @@ Om principen är inställd på falskt kan användarna inte casta till enheten. Om principen är inställd på sant får användarna casta innehåll. Om principen lämnas utan inställning får användarna inte casta till registrerade Chrome OS-enheter, men däremot till enheter som inte är registrerade.</translation> <translation id="5330684698007383292">Tillåt att <ph name="PRODUCT_FRAME_NAME" /> hanterar följande innehållstyper</translation> -<translation id="5360146044009867539">Aktiverar funktionen Autofyll i <ph name="PRODUCT_NAME" /> så att användarna kan fylla i webbformulär automatiskt med profil- och adressuppgifter som har sparats sedan tidigare. - - Om inställningen inaktiveras visas inga förslag med Autofyll och inga adressuppgifter fylls i. Ytterligare adressuppgifter som användaren kan ange på webben sparas inte heller. - - Om inställningen aktiveras eller lämnas utan värde kan användarna själva styra Autofyll för adresser i användargränssnittet.</translation> <translation id="5365946944967967336">Visa hemknappen i verktygsfältet</translation> <translation id="5366745336748853475">Låter dig ange en lista med webbadressmönster som anger webbplatser för vilka ett klientcertifikat väljs automatiskt på inloggningsskärmen i den ram som står värd för SAML-flödet, om webbplatsen kräver ett certifikat. Ett möjligt användningsområde är att konfigurera ett certifikat för hela enheten som ska uppvisas för SAML-identitetsleverantören.
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb index 99a1d7b..3e4f14f9 100644 --- a/components/policy/resources/policy_templates_sw.xtb +++ b/components/policy/resources/policy_templates_sw.xtb
@@ -702,7 +702,6 @@ Ikiwa sera haijawekwa, <ph name="PRINTERS_ALLOW_ALL" /> itaendelea kufuatwa. </translation> <translation id="2908277604670530363">Kiwango cha juu kabisa cha miunganisho ya wakati mmoja kwenye seva ya proksi</translation> -<translation id="2951386431828317490">Washa kipengele cha Kujaza Kiotomatiki katika wasifu</translation> <translation id="2956777931324644324">Sera hii imeondolewa kuanzia toleo la 36 la <ph name="PRODUCT_NAME" />. Inabainisha ikiwa kiendelezi cha vyeti vilivyo katika kikoa cha TLS kinastahili kuwashwa. @@ -1521,11 +1520,6 @@ Ikiwa sera hii imewekwa kuwa Sivyo, watumiaji hawataweza kutuma maudhui kwenye vifaa vyao. Ikiwa sera hii imewekwa kuwa Ndivyo, watumiaji wataruhusiwa kutuma maudhui. Sera hii isipowekwa, watumiaji hawataruhusiwa kutuma maudhui kwenye vifaa vya mfumo wa uendeshaji wa Chrome vilivyosajiliwa, lakini wataruhusiwa kutuma kwenye vifaa vingine ambavyo havijasajiliwa.</translation> <translation id="5330684698007383292">Ruhusu <ph name="PRODUCT_FRAME_NAME" /> kushughulikia aina zifuatazo za maudhui</translation> -<translation id="5360146044009867539">Huwasha kipengele cha Kujaza Kiotomatiki cha <ph name="PRODUCT_NAME" /> na kuruhusu watumiaji wajaze kiotomatiki maelezo ya anwani na wasifu katika fomu za wavuti wakitumia maelezo waliyohifadhi awali. - - Iwapo mipangilio hii imezimwa, kipengele cha kujaza kiotomatiki hakitawahi kupendekeza wala kujaza maelezo ya anwani. Pia hakitaweza kuhifadhi maelezo ya ziada ya anwani ambayo huenda mtumiaji atawasilisha anapovinjari wavuti. - - Iwapo mipangilio hii imewashwa au haina thamani yoyote, mtumiaji ataweza kudhibiti kipengele cha Kujaza Kiotomatiki katika anwani kwenye kiolesura.</translation> <translation id="5365946944967967336">Onyesha kitufe cha Mwazo kwenye upauzana</translation> <translation id="5366745336748853475">Inakuruhusu kubainisha orodha ya michoro ya url inayobainsha tovuti ambazo cheti cha mteja kinachaguliwa kiotomatiki kwenye skrini ya kuingia katika akaunti katika fremu inayopangisha mtiririko wa SAML, tovuti ikiomba cheti. Mfano wa matumizi ni kusanidi cheti cha matumizi pana ya kifaa kitakachowasilishwa kwenye SAML IdP.
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb index c1cc9d9..794f8f9 100644 --- a/components/policy/resources/policy_templates_ta.xtb +++ b/components/policy/resources/policy_templates_ta.xtb
@@ -685,7 +685,6 @@ இந்தக் கொள்கை அமைக்கப்படவில்லை என்றால், <ph name="PRINTERS_ALLOW_ALL" /> பயன்படுத்தப்படும். </translation> <translation id="2908277604670530363">ப்ராக்ஸி சேவையகத்திற்கான அதிகபட்ச உடன்நிகழ்வு இணைப்புகளின் எண்ணிக்கை</translation> -<translation id="2951386431828317490">சுயவிவரங்களுக்கு, தன்னிரப்பியை இயக்கும்</translation> <translation id="2956777931324644324">இந்தக் கொள்கை <ph name="PRODUCT_NAME" /> பதிப்பு 36 உடன் காலாவதியானது. TLS டொமைன்-சார்ந்த சான்றிதழ்களின் நீட்டிப்பு இயக்கப்பட்டிருக்க வேண்டுமா என்பதைக் குறிப்பிடுகிறது. @@ -1501,11 +1500,6 @@ இந்தக் கொள்கையைத் தவறு என அமைத்தால், பயனர்களால் அவர்களது சாதனத்திற்கு உள்ளடக்கத்தை அனுப்ப முடியாது. இந்தக் கொள்கையைச் சரி என அமைத்தால், பயனர்களால் உள்ளடக்கத்தை அனுப்ப முடியும். இந்தக் கொள்கையை அமைக்கவில்லை எனில், பதிவுசெய்த Chrome OS சாதனங்களுக்கு உள்ளடக்கத்தை அனுப்ப, பயனர்கள் அனுமதிக்கப்படமாட்டார்கள். ஆனால், பதிவுசெய்யாத சாதனங்களுக்கு அனுப்ப அனுமதிக்கப்படுவார்கள்.</translation> <translation id="5330684698007383292">பின்வரும் உள்ளடக்க வகைகளைக் கையாள <ph name="PRODUCT_FRAME_NAME" /> ஐ அனுமதி</translation> -<translation id="5360146044009867539"><ph name="PRODUCT_NAME" /> இன் தன்னிரப்பி அம்சத்தை இயக்கும். மேலும் ஏற்கனவே சேமிக்கப்பட்ட தகவல்களைப் பயன்படுத்தி, இணையதளப் படிவங்களில் பயனர்கள் தங்களுடைய சுயவிவரம் மற்றும் முகவரித் தகவலைத் தானாக நிரப்ப அனுமதிக்கும். - - இந்த அமைப்பை முடக்கினால், தன்னிரப்பி அம்சமானது முகவரித் தகவலைப் பரிந்துரைக்காது அல்லது நிரப்பாது. மேலும், இணையத்தில் உலாவும்போது பயனர் சமர்ப்பிக்கக்கூடிய கூடுதல் முகவரித் தகவலையும் சேமிக்காது. - - இந்த அமைப்பை இயக்கினால் அல்லது அதற்கென எந்தவொரு மதிப்பையும் அமைக்கவில்லை என்றால், பயனர் இடைமுகத்தில் முகவரிகளுக்கான தன்னிரப்பி அம்சத்தைப் பயனர் கட்டுப்படுத்த முடியும்.</translation> <translation id="5365946944967967336">கருவிப்பட்டியில் முகப்புப் பொத்தானைக் காண்பி</translation> <translation id="5366745336748853475">தளம் சான்றிதழைக் கோரினால், SAML செயல்பாட்டை ஹோஸ்ட் செய்யும் ஃப்ரேமில் உள்ள உள்நுழைவுத் திரையில், கிளையன்ட் சான்றிதழைத் தானாகத் தேர்ந்தெடுக்க வேண்டிய தளங்களைக் குறிப்பிடும் url வடிவங்களின் பட்டியலைக் குறிப்பிட உங்களை அனுமதிக்கும். SAML IdPக்கு வழங்குவதற்காக, சாதன அளவிலான சான்றிதழை உள்ளமைப்பதை இதற்கு உதாரணமாகக் குறிப்பிடலாம்.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 7daf41c..356da03b 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -692,7 +692,6 @@ ถ้าไม่ได้ตั้งค่านโยบายนี้ไว้ ระบบจะถือว่าเลือก <ph name="PRINTERS_ALLOW_ALL" /> </translation> <translation id="2908277604670530363">จำนวนสูงสุดของการเชื่อมต่อพร็อกซีเซิร์ฟเวอร์พร้อมกัน</translation> -<translation id="2951386431828317490">เปิดใช้ป้อนข้อความอัตโนมัติสำหรับโปรไฟล์</translation> <translation id="2956777931324644324">นโยบายนี้เลิกใช้งานแล้วตั้งแต่ <ph name="PRODUCT_NAME" /> เวอร์ชัน 36 ระบุว่าควรเปิดใช้ส่วนขยายใบรับรองที่ผูกกับโดเมน TLS ไหม @@ -1470,11 +1469,6 @@ หากตั้งค่านโยบายนี้เป็น False ผู้ใช้จะไม่สามารถแคสต์เนื้อหาไปยังอุปกรณ์ หากตั้งค่าเป็น True ผู้ใช้จะแคสต์เนื้อหาได้ และหากไม่ได้ตั้งค่านโยบาย ผู้ใช้จะไม่สามารถแคสต์เนื้อหาไปยังอุปกรณ์ที่ใช้ Chrome OS ที่ลงทะเบียนไว้ แต่จะแคสต์ไปยังอุปกรณ์ที่ไม่ได้ลงทะเบียนได้</translation> <translation id="5330684698007383292">อนุญาตให้ <ph name="PRODUCT_FRAME_NAME" /> จัดการประเภทเนื้อหาดังต่อไปนี้</translation> -<translation id="5360146044009867539">เปิดใช้ฟีเจอร์ป้อนข้อความอัตโนมัติของ <ph name="PRODUCT_NAME" /> และอนุญาตให้ผู้ใช้ป้อนข้อมูลโปรไฟล์และที่อยู่ในแบบฟอร์มในเว็บโดยอัตโนมัติด้วยข้อมูลที่เก็บไว้ก่อนหน้านี้ - - หากคุณปิดใช้การตั้งค่านี้ ฟีเจอร์ป้อนข้อความอัตโนมัติจะไม่แนะนำหรือเติมข้อมูลที่อยู่ให้โดยอัตโนมัติ และจะไม่บันทึกข้อมูลที่อยู่เพิ่มเติมที่ผู้ใช้อาจส่งมาขณะเรียกดูเว็บ - - หากคุณเปิดใช้การตั้งค่านี้หรือไม่ได้กำหนดค่าไว้ ผู้ใช้จะควบคุมฟีเจอร์ป้อนข้อความอัตโนมัติสำหรับที่อยู่ได้ใน UI</translation> <translation id="5365946944967967336">แสดงปุ่ม "หน้าแรก" บนแถบเครื่องมือ</translation> <translation id="5366745336748853475">ช่วยให้คุณระบุรายการรูปแบบ URL ซึ่งระบุเว็บไซต์ที่มีการเลือกใบรับรองไคลเอ็นต์โดยอัตโนมัติในหน้าจอลงชื่อเข้าใช้ในเฟรมที่โฮสต์ขั้นตอน SAML หากเว็บไซต์นั้นขอใบรับรอง ตัวอย่างการใช้งานคือเพื่อกำหนดค่าใบรับรองสำหรับทั้งอุปกรณ์เพื่อแสดงต่อ SAML IdP
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 475d485..d166002 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -720,7 +720,6 @@ Bu politika ayarlanmazsa <ph name="PRINTERS_ALLOW_ALL" /> uygulanır. </translation> <translation id="2908277604670530363">Proxy sunucusuyla yapılabilecek maksimum eşzamanlı bağlantı sayısı</translation> -<translation id="2951386431828317490">Profiller için Otomatik Doldurma özelliğini etkinleştirme</translation> <translation id="2956777931324644324">Bu politika, <ph name="PRODUCT_NAME" /> 36. sürümü itibariyle geri çekilmiştir. TLS alan adına bağlı sertifikalar uzantısının etkinleştirilip etkinleştirilmeyeceğini belirtir. @@ -1530,11 +1529,6 @@ Bu politika False (Yanlış) değerine ayarlanırsa kullanıcılar içeriği cihazlarına yayınlayamaz. Bu politika True (Doğru) değerine ayarlanırsa kullanıcıların içerik yayınlamasına izin verilir. Bu politika ayarlanmazsa kullanıcıların kayıtlı Chrome OS cihazlarına içerik yayınlamasına izin verilmez, ancak kayıtlı olmayan cihazlara içerik yayınlamasına izin verilir.</translation> <translation id="5330684698007383292"><ph name="PRODUCT_FRAME_NAME" /> için aşağıdaki içerik türlerini işlemeye izin ver</translation> -<translation id="5360146044009867539"><ph name="PRODUCT_NAME" /> Otomatik Doldurma özelliğini etkinleştirir ve kullanıcıların web formlarındaki profil ve adres bilgilerini önceden kaydedilmiş bilgilerle otomatik olarak doldurmasına olanak tanır. - - Bu ayar devre dışı bırakılırsa Otomatik Doldurma hiçbir zaman öneride bulunmaz, adres bilgilerini doldurmaz veya kullanıcının internette gezerken gönderebileceği ek adres bilgilerini kaydetmez. - - Bu ayar etkinleştirilirse veya bir değer ayarlanmazsa kullanıcı, kullanıcı arayüzündeki adresler için Otomatik Doldurma özelliğini kontrol edebilir.</translation> <translation id="5365946944967967336">Araç çubuğunda Ana Sayfa düğmesini göster</translation> <translation id="5366745336748853475">URL kalıpları listesi belirtmenize olanak tanır. Bu liste, site sertifika isteğinde bulunursa, SAML akışını barındıran çerçevedeki oturum açma ekranında bir istemci sertifikasının otomatik olarak seçileceği sitelerin belirtildiği bir listedir. SAML IdP'ye sunulması amacıyla cihaz genelinde bir sertifikanın yapılandırılması buna örnek olarak gösterilebilir.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index fbc2438c..1b32e52 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -241,7 +241,7 @@ Якщо для цього правила вказано рядок з іменем домену, <ph name="PRODUCT_OS_NAME" /> показуватиме опцію автозавершення під час входу, і користувач зможе ввести лише власне ім’я користувача без розширення імені домену. Користувач також зможе змінити це розширення імені домену.</translation> <translation id="1864382791685519617">Вмикає прогнозування мережі в <ph name="PRODUCT_NAME" /> і забороняє користувачам змінювати це налаштування. - Керує попереднім викликом DNS, попереднім з’єднанням TCP й SSL і попереднім відтворення веб-сторінок. + Керує попереднім викликом DNS, попереднім з’єднанням TCP й SSL і попереднім відтворенням веб-сторінок. Якщо це правило налаштовано, користувачі не зможуть змінити або замінити його в <ph name="PRODUCT_NAME" />. @@ -702,7 +702,6 @@ Якщо правило не налаштовано, застосовується параметр <ph name="PRINTERS_ALLOW_ALL" />. </translation> <translation id="2908277604670530363">Максимальна кількість одночасних підключень до проксі-сервера</translation> -<translation id="2951386431828317490">Вмикає функцію автозаповнення для профілів</translation> <translation id="2956777931324644324">Це правило не підтримується від 36-ї версії <ph name="PRODUCT_NAME" />. Указує, чи вмикати розширення пов’язаних із доменом сертифікатів TLS. @@ -1482,11 +1481,6 @@ Якщо для цього правила вибрано значення "False", користувачі не зможуть транслювати вміст на свої пристрої. Якщо для цього правила вибрано значення "True", користувачі зможуть транслювати вміст. Якщо це правило не налаштовано, користувачі не зможуть транслювати вміст на зареєстрованих пристроях з ОС Chrome, але матимуть змогу робити це на інших пристроях.</translation> <translation id="5330684698007383292">Дозволити <ph name="PRODUCT_FRAME_NAME" /> обробляти вказані типи вмісту</translation> -<translation id="5360146044009867539">Вмикає функцію автозаповнення в <ph name="PRODUCT_NAME" /> і автоматично вводить дані профілю й адресу у веб-форми, використовуючи раніше збережену інформацію. - - Якщо це налаштування вимкнено, функція автозаповнення не пропонуватиме та не зберігатиме адресу, а також не зберігатиме додаткові дані про адресу, які користувач може вводити під час роботи в Інтернеті. - - Якщо це налаштування ввімкнено або значення не встановлено, користувачі зможуть керувати функцією автозаповнення адреси в інтерфейсі.</translation> <translation id="5365946944967967336">Показати кнопку "Головна" на панелі інструментів</translation> <translation id="5366745336748853475">Дозволяє вказати список шаблонів URL-адрес сайтів, для яких сертифікат клієнта автоматично вибирається на екрані входу у фреймі з процесом SAML (якщо сайт надсилає запит на сертифікат). Наприклад, можна налаштувати сертифікат для всіх пристроїв, який надається постачальнику ідентифікатора SAML.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index 4dffec1f..7f173ec 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -724,7 +724,6 @@ Nếu bạn chưa đặt chính sách này, thì <ph name="PRINTERS_ALLOW_ALL" /> sẽ là tùy chọn mặc định. </translation> <translation id="2908277604670530363">Số lượng tối đa kết nối đồng thời tới máy chủ proxy</translation> -<translation id="2951386431828317490">Bật tính năng Tự động điền cho hồ sơ</translation> <translation id="2956777931324644324">Chính sách này ngừng hoạt động kể từ phiên bản 36 của <ph name="PRODUCT_NAME" />. Chỉ định xem có cần bật tiện ích chứng chỉ giới hạn miền TLS hay không. @@ -1540,11 +1539,6 @@ Nếu bạn đặt chính sách này thành False, người dùng sẽ không thể truyền nội dung đến thiết bị của họ. Nếu bạn đặt chính sách này thành True, người dùng sẽ được phép truyền nội dung. Nếu bạn không đặt chính sách này, người dùng sẽ không được phép truyền nội dung đến thiết bị Chrome OS đã đăng ký, nhưng có thể truyền đến các thiết bị không được đăng ký.</translation> <translation id="5330684698007383292">Cho phép <ph name="PRODUCT_FRAME_NAME" /> xử lý các loại nội dung sau</translation> -<translation id="5360146044009867539">Bật tính năng Tự động điền của <ph name="PRODUCT_NAME" /> và cho phép người dùng tự động hoàn thành thông tin địa chỉ và hồ sơ trong biểu mẫu web bằng cách sử dụng thông tin đã lưu trữ trước đây. - - Nếu bạn tắt tùy chọn cài đặt này, thì tính năng Tự động điền sẽ không bao giờ gợi ý hoặc điền thông tin địa chỉ, đồng thời sẽ không lưu thông tin địa chỉ bổ sung mà người dùng có thể gửi trong khi duyệt web. - - Nếu bạn bật hoặc không đặt giá trị nào cho tùy chọn cài đặt này, thì người dùng có thể kiểm soát tính năng Tự động điền cho địa chỉ trong giao diện người dùng.</translation> <translation id="5365946944967967336">Hiển thị nút Trang chủ trên thanh công cụ</translation> <translation id="5366745336748853475">Cho phép bạn chỉ định danh sách mẫu url. Những mẫu url này chỉ định các trang web có chứng chỉ ứng dụng được chọn tự động trên màn hình đăng nhập trong khung lưu trữ luồng SAML nếu trang web yêu cầu chứng chỉ. Việc sử dụng mẫu là để định cấu hình chứng chỉ sẽ được hiển thị cho SAML IdP cho toàn bộ thiết bị.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index f42be6f..e6da3c3 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -670,7 +670,6 @@ 如果未设置此政策,系统将会默认使用 <ph name="PRINTERS_ALLOW_ALL" />。 </translation> <translation id="2908277604670530363">可同时连接到代理服务器的连接数上限</translation> -<translation id="2951386431828317490">允许使用“自动填充”功能填写个人资料</translation> <translation id="2956777931324644324">此政策自36版<ph name="PRODUCT_NAME" />起已停止使用。 用于指定是否启用TLS网域绑定证书扩展程序。 @@ -1439,11 +1438,6 @@ 如果此政策设为 False,用户将无法向其设备投射内容。如果此政策设为 True,用户将能够投射内容。如果此政策未设置,用户将被禁止向已注册的 Chrome 操作系统设备投射内容,但可将内容投射到未注册的设备。</translation> <translation id="5330684698007383292">允许 <ph name="PRODUCT_FRAME_NAME" />处理以下内容类型</translation> -<translation id="5360146044009867539">启用 <ph name="PRODUCT_NAME" /> 的“自动填充”功能,并允许用户使用以前存储的信息自动填写网络表单中的个人资料信息和地址信息。 - - 如果您停用了此设置,“自动填充”功能将不会提示或填充地址信息,也不会保存用户在浏览网页时可能提交的其他地址信息。 - - 如果启用了此设置或未设置任何值,那么用户将能够在界面中控制地址信息的自动填充。</translation> <translation id="5365946944967967336">在工具栏上显示“主页”按钮</translation> <translation id="5366745336748853475">可让您指定一系列网址格式,从而指定要在 SAML 流程托管框架的登录屏幕上自动为哪些网站选择客户端证书(如果相应网站要求提供证书)。例如,配置一个要向 SAML IdP 出示的设备级证书。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index e9475fe8..9d3d9fa0 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -700,7 +700,6 @@ 如果未設定這項政策,系統會自動採用 <ph name="PRINTERS_ALLOW_ALL" />。 </translation> <translation id="2908277604670530363">Proxy 伺服器的並行連線數量上限</translation> -<translation id="2951386431828317490">啟用個人資料的自動填入功能</translation> <translation id="2956777931324644324">我們已於 <ph name="PRODUCT_NAME" /> 版本 36 中移除這項政策。 指定是否要啟用 TLS 網域專屬憑證擴充功能。 @@ -1481,11 +1480,6 @@ 如果這項政策設為 False,使用者就無法將內容投放至自己的裝置。如果這項政策設為 True,則使用者可投放內容。如果未設定這項政策,使用者就無法將內容投放至已註冊的 Chrome 作業系統裝置,但可投放至未註冊的裝置。</translation> <translation id="5330684698007383292">允許 <ph name="PRODUCT_FRAME_NAME" /> 處理列出的內容類型</translation> -<translation id="5360146044009867539">啟用 <ph name="PRODUCT_NAME" /> 的自動填入功能,並允許使用者使用先前儲存的個人資料和地址資訊自動填寫網路表單。 - - 如果停用這項設定,自動填入功能就不會提出填寫建議或填入地址資訊,也無法儲存使用者在瀏覽網路時提交的其他地址資訊。 - - 如果啟用這項設定或未設定任何值,使用者就能透過 UI 控制地址資訊的自動填入功能。</translation> <translation id="5365946944967967336">在工具列上顯示 [首頁] 按鈕</translation> <translation id="5366745336748853475">允許以清單列出網址模式,指定要在 SAML 流程代管架構的登入畫面自動選取用戶端憑證的網站 (如果網站要求憑證的話)。實際應用範例為設定要提供給 SAML IdP 的裝置通用憑證。
diff --git a/components/resources/default_100_percent/neterror/OWNERS b/components/resources/default_100_percent/neterror/OWNERS new file mode 100644 index 0000000..3546fc7 --- /dev/null +++ b/components/resources/default_100_percent/neterror/OWNERS
@@ -0,0 +1,2 @@ +mmenke@chromium.org +file://net/OWNERS
diff --git a/components/resources/default_100_percent/neterror/download_blue.png b/components/resources/default_100_percent/neterror/download_blue.png deleted file mode 100644 index 4c249f4..0000000 --- a/components/resources/default_100_percent/neterror/download_blue.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_100_percent/neterror/download_grey.png b/components/resources/default_100_percent/neterror/download_grey.png deleted file mode 100644 index 32e8fb4..0000000 --- a/components/resources/default_100_percent/neterror/download_grey.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/neterror/OWNERS b/components/resources/default_200_percent/neterror/OWNERS new file mode 100644 index 0000000..3546fc7 --- /dev/null +++ b/components/resources/default_200_percent/neterror/OWNERS
@@ -0,0 +1,2 @@ +mmenke@chromium.org +file://net/OWNERS
diff --git a/components/resources/default_200_percent/neterror/download_blue.png b/components/resources/default_200_percent/neterror/download_blue.png deleted file mode 100644 index 3a33155f..0000000 --- a/components/resources/default_200_percent/neterror/download_blue.png +++ /dev/null Binary files differ
diff --git a/components/resources/default_200_percent/neterror/download_grey.png b/components/resources/default_200_percent/neterror/download_grey.png deleted file mode 100644 index 038941c..0000000 --- a/components/resources/default_200_percent/neterror/download_grey.png +++ /dev/null Binary files differ
diff --git a/components/safe_search_api/BUILD.gn b/components/safe_search_api/BUILD.gn index 086b2ea..6a65818a 100644 --- a/components/safe_search_api/BUILD.gn +++ b/components/safe_search_api/BUILD.gn
@@ -10,7 +10,7 @@ deps = [ "//base", - "//components/google/core/browser", + "//components/google/core/common", "//google_apis", "//net", "//services/network/public/cpp",
diff --git a/components/safe_search_api/DEPS b/components/safe_search_api/DEPS index 83e61e1..0dded31 100644 --- a/components/safe_search_api/DEPS +++ b/components/safe_search_api/DEPS
@@ -1,5 +1,5 @@ include_rules = [ - "+components/google/core/browser", + "+components/google/core/common", "+google_apis", "+net", "+services/network",
diff --git a/components/safe_search_api/url_checker.cc b/components/safe_search_api/url_checker.cc index 6a68d13..c36b3221 100644 --- a/components/safe_search_api/url_checker.cc +++ b/components/safe_search_api/url_checker.cc
@@ -17,7 +17,7 @@ #include "base/strings/stringprintf.h" #include "base/time/time.h" #include "base/values.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "google_apis/google_api_keys.h" #include "net/base/escape.h" #include "net/base/load_flags.h"
diff --git a/components/search_engines/template_url.cc b/components/search_engines/template_url.cc index 1c945fe..f1cf611 100644 --- a/components/search_engines/template_url.cc +++ b/components/search_engines/template_url.cc
@@ -24,7 +24,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/trace_event/memory_usage_estimator.h" #include "build/build_config.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/search_engines/search_engines_switches.h" #include "components/search_engines/search_terms_data.h" #include "components/search_engines/template_url_prepopulate_data.h"
diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc index 0c686f6e..81e9948 100644 --- a/components/search_engines/template_url_prepopulate_data.cc +++ b/components/search_engines/template_url_prepopulate_data.cc
@@ -15,7 +15,7 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" #include "components/search_engines/prepopulated_engines.h"
diff --git a/components/search_engines/template_url_prepopulate_data_unittest.cc b/components/search_engines/template_url_prepopulate_data_unittest.cc index 27de40b7..0f50cf1 100644 --- a/components/search_engines/template_url_prepopulate_data_unittest.cc +++ b/components/search_engines/template_url_prepopulate_data_unittest.cc
@@ -14,7 +14,7 @@ #include "base/macros.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" -#include "components/google/core/browser/google_switches.h" +#include "components/google/core/common/google_switches.h" #include "components/search_engines/prepopulated_engines.h" #include "components/search_engines/search_engines_pref_names.h" #include "components/search_engines/search_terms_data.h"
diff --git a/components/search_engines/template_url_unittest.cc b/components/search_engines/template_url_unittest.cc index cf40cb3..c2ff342 100644 --- a/components/search_engines/template_url_unittest.cc +++ b/components/search_engines/template_url_unittest.cc
@@ -11,7 +11,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/search_engines/search_engines_switches.h" #include "components/search_engines/search_terms_data.h" #include "components/search_engines/template_url.h"
diff --git a/components/security_interstitials/DEPS b/components/security_interstitials/DEPS index 76345d4..4958397 100644 --- a/components/security_interstitials/DEPS +++ b/components/security_interstitials/DEPS
@@ -1,5 +1,5 @@ include_rules = [ - "+components/google/core/browser", + "+components/google/core", "+components/history/core/browser", "+components/metrics", "+components/prefs",
diff --git a/components/security_interstitials/core/controller_client.cc b/components/security_interstitials/core/controller_client.cc index e416177..020103c9 100644 --- a/components/security_interstitials/core/controller_client.cc +++ b/components/security_interstitials/core/controller_client.cc
@@ -6,7 +6,7 @@ #include <utility> -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/prefs/pref_service.h" #include "components/security_interstitials/core/metrics_helper.h" #include "components/security_interstitials/core/urls.h"
diff --git a/components/security_interstitials/core/safe_browsing_loud_error_ui.cc b/components/security_interstitials/core/safe_browsing_loud_error_ui.cc index 06f0b5c..2003d5d 100644 --- a/components/security_interstitials/core/safe_browsing_loud_error_ui.cc +++ b/components/security_interstitials/core/safe_browsing_loud_error_ui.cc
@@ -8,7 +8,7 @@ #include "base/metrics/histogram_macros.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/grit/components_resources.h" #include "components/security_interstitials/core/common_string_util.h" #include "components/security_interstitials/core/metrics_helper.h"
diff --git a/components/security_interstitials/core/safe_browsing_quiet_error_ui.cc b/components/security_interstitials/core/safe_browsing_quiet_error_ui.cc index 65ad7085..e63635e 100644 --- a/components/security_interstitials/core/safe_browsing_quiet_error_ui.cc +++ b/components/security_interstitials/core/safe_browsing_quiet_error_ui.cc
@@ -8,7 +8,7 @@ #include "base/metrics/histogram_macros.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/grit/components_resources.h" #include "components/security_interstitials/core/common_string_util.h" #include "components/security_interstitials/core/metrics_helper.h"
diff --git a/components/signin/core/browser/chrome_connected_header_helper.cc b/components/signin/core/browser/chrome_connected_header_helper.cc index 3a39e08..d31cd38 100644 --- a/components/signin/core/browser/chrome_connected_header_helper.cc +++ b/components/signin/core/browser/chrome_connected_header_helper.cc
@@ -10,7 +10,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/signin/core/browser/cookie_settings_util.h" #include "google_apis/gaia/gaia_auth_util.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
diff --git a/components/signin/core/browser/signin_header_helper.cc b/components/signin/core/browser/signin_header_helper.cc index 4a0cc964..741ffbbf 100644 --- a/components/signin/core/browser/signin_header_helper.cc +++ b/components/signin/core/browser/signin_header_helper.cc
@@ -10,7 +10,7 @@ #include "base/macros.h" #include "base/metrics/histogram_functions.h" #include "base/strings/string_split.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/signin/core/browser/chrome_connected_header_helper.h" #include "google_apis/gaia/gaia_auth_util.h" #include "net/base/escape.h"
diff --git a/components/signin/ios/browser/account_consistency_service.mm b/components/signin/ios/browser/account_consistency_service.mm index 6d45d9f..5fbcaceb 100644 --- a/components/signin/ios/browser/account_consistency_service.mm +++ b/components/signin/ios/browser/account_consistency_service.mm
@@ -10,7 +10,7 @@ #import "base/mac/foundation_util.h" #include "base/macros.h" #include "base/strings/sys_string_conversions.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/scoped_user_pref_update.h" #include "components/signin/core/browser/account_reconcilor.h"
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index bb1b696b..b68c027c 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -1064,7 +1064,7 @@ <translation id="8790007591277257123">إعادة الح&ذف</translation> <translation id="8792621596287649091">قد تفقد إمكانية الوصول إلى حسابك على <ph name="ORG_NAME" /> أو تتعرض لسرقة هويتك. لذا يوصي Chromium بتغيير كلمة مرورك الآن.</translation> <translation id="8800988563907321413">تظهر اقتراحاتك "المجاورة" هنا</translation> -<translation id="8820817407110198400">إشارات</translation> +<translation id="8820817407110198400">الإشارات المرجعية</translation> <translation id="883848425547221593">إشارات أخرى</translation> <translation id="884264119367021077">عنوان الشحن</translation> <translation id="884923133447025588">لم يتمّ العثور على أي آلبة إبطال.</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index ce1d988..d2ce0c5 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -312,7 +312,7 @@ <translation id="3154506275960390542">এই পৃষ্ঠাতে একটি ফর্ম আছে যেটি জমা দেওয়া নিরাপদ নাও হতে পারে। আপনার পাঠানো ডেটা সার্ভারে পৌঁছানোর আগে অন্যরা সেটি দেখতে পেতে পারেন, অথবা কেউ সেটি পরিবর্তন করে দিতে পারেন যাতে আপনার ডেটা সঠিকভাবে সার্ভারে না পৌঁছায়।</translation> <translation id="3157931365184549694">পুনরুদ্ধার করুন</translation> <translation id="3162559335345991374">আপনি যে Wi-Fiটি ব্যবহার করছেন সেটির জন্য অপনাকে এটির লগ ইন পৃষ্ঠাতে যেতে হতে পরে৷</translation> -<translation id="3167968892399408617">ছদ্মবেশী ট্যাবগুলিতে আপনি যে পৃষ্ঠাগুলি দেখেন সেগুলি আপনার সব ছদ্মবেশী ট্যাব বন্ধ করে দেওয়ার পর ব্রাউজারের ইতিহাস, কুকি স্টোর বা সার্চ ইতিহাসে থাকবে না। আপনি ডাউনলোড করেছেন এমন ফাইল বা বুকমার্ক তৈরি করছেন এমন সবগুলি রেখে দেওয়া হবে।</translation> +<translation id="3167968892399408617">ছদ্মবেশি ট্যাবগুলিতে আপনি যে পৃষ্ঠাগুলি দেখেন সেগুলি আপনার সব ছদ্মবেশি ট্যাব বন্ধ করে দেওয়ার পর ব্রাউজারের ইতিহাস, কুকি স্টোর বা সার্চ ইতিহাসে থাকবে না। আপনি ডাউনলোড করেছেন এমন ফাইল বা বুকমার্ক তৈরি করছেন এমন সবগুলি রেখে দেওয়া হবে।</translation> <translation id="3169472444629675720">আবিষ্কার করুন</translation> <translation id="3174168572213147020">দ্বীপ</translation> <translation id="3176929007561373547">প্রক্সী সার্ভার কাজ করছে কি না, তা নিশ্চিত করতে আপনার প্রক্সী সেটিংস পরীক্ষা করুন
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 70c8e7cf..d732029 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -810,6 +810,7 @@ <translation id="6897140037006041989">Agent d'usuari</translation> <translation id="6903319715792422884">Per ajudar a millorar Navegació segura, envia a Google <ph name="BEGIN_WHITEPAPER_LINK" />algunes dades del sistema i contingut de les pàgines<ph name="END_WHITEPAPER_LINK" />. <ph name="PRIVACY_PAGE_LINK" /></translation> <translation id="6915804003454593391">Usuari:</translation> +<translation id="6944692733090228304">Has introduït la contrasenya en un lloc web que no està gestionat per <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Per protegir el teu compte, no facis servir la mateixa contrasenya en altres aplicacions ni llocs web.</translation> <translation id="6945221475159498467">Selecciona</translation> <translation id="6948701128805548767">Per veure els mètodes i els requisits de recollida, selecciona una adreça</translation> <translation id="6949872517221025916">Restableix la contrasenya</translation> @@ -1034,6 +1035,7 @@ <translation id="8498891568109133222"><ph name="HOST_NAME" /> ha tardat massa a respondre.</translation> <translation id="8503559462189395349">Contrasenyes de Chrome</translation> <translation id="8503813439785031346">Nom d'usuari</translation> +<translation id="8508648098325802031">Icona de la cerca</translation> <translation id="8543181531796978784">Podeu <ph name="BEGIN_ERROR_LINK" />informar d'un problema de detecció<ph name="END_ERROR_LINK" /> o, si enteneu els riscos que això comporta per a la vostra seguretat, <ph name="BEGIN_LINK" />visiteu aquest lloc no segur<ph name="END_LINK" />.</translation> <translation id="8543556556237226809">Tens preguntes? Contacta amb la persona que et supervisa el perfil.</translation> <translation id="8553075262323480129">S'ha produït un error en fer la traducció perquè no s'ha pogut determinar l'idioma de la pàgina.</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index 6335b87..5a996e39 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -810,6 +810,7 @@ <translation id="6897140037006041989">User Agent</translation> <translation id="6903319715792422884">Help improve Safe Browsing by sending some <ph name="BEGIN_WHITEPAPER_LINK" />system information and page content<ph name="END_WHITEPAPER_LINK" /> to Google. <ph name="PRIVACY_PAGE_LINK" /></translation> <translation id="6915804003454593391">User:</translation> +<translation id="6944692733090228304">You entered your password on a site that’s not managed by <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. To protect your account, don’t reuse your password on other apps and sites.</translation> <translation id="6945221475159498467">Select</translation> <translation id="6948701128805548767">To see pickup methods and requirements, select an address</translation> <translation id="6949872517221025916">Reset password</translation> @@ -1034,6 +1035,7 @@ <translation id="8498891568109133222"><ph name="HOST_NAME" /> took too long to respond.</translation> <translation id="8503559462189395349">Chrome Passwords</translation> <translation id="8503813439785031346">Username</translation> +<translation id="8508648098325802031">Search icon</translation> <translation id="8543181531796978784">You can <ph name="BEGIN_ERROR_LINK" />report a detection problem<ph name="END_ERROR_LINK" /> or, if you understand the risks to your security, <ph name="BEGIN_LINK" />visit this unsafe site<ph name="END_LINK" />.</translation> <translation id="8543556556237226809">Questions? Contact the person who supervises your profile.</translation> <translation id="8553075262323480129">The translation failed because the page's language could not be determined.</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 15c8d239..a239df12 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -810,6 +810,7 @@ <translation id="6897140037006041989">Agen Pengguna</translation> <translation id="6903319715792422884">Bantu sempurnakan Safe Browsing dengan mengirimkan sebagian <ph name="BEGIN_WHITEPAPER_LINK" />informasi sistem dan konten halaman<ph name="END_WHITEPAPER_LINK" /> ke Google. <ph name="PRIVACY_PAGE_LINK" /></translation> <translation id="6915804003454593391">Pengguna:</translation> +<translation id="6944692733090228304">Anda memasukkan sandi di situs yang tidak dikelola oleh <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Untuk melindungi akun, jangan gunakan sandi yang sama di aplikasi dan situs lain.</translation> <translation id="6945221475159498467">Pilih</translation> <translation id="6948701128805548767">Untuk melihat persyaratan dan metode pengambilan, pilih alamat</translation> <translation id="6949872517221025916">Setel Ulang Sandi</translation> @@ -1034,6 +1035,7 @@ <translation id="8498891568109133222"><ph name="HOST_NAME" /> membutuhkan terlalu banyak waktu untuk merespons.</translation> <translation id="8503559462189395349">Sandi Chrome</translation> <translation id="8503813439785031346">Nama Pengguna</translation> +<translation id="8508648098325802031">Ikon penelusuran</translation> <translation id="8543181531796978784">Anda dapat <ph name="BEGIN_ERROR_LINK" />melaporkan masalah pendeteksian<ph name="END_ERROR_LINK" /> atau, jika memahami risiko bagi keamanan, Anda dapat <ph name="BEGIN_LINK" />mengunjungi situs yang tidak aman<ph name="END_LINK" />.</translation> <translation id="8543556556237226809">Ada pertanyaan? Hubungi orang yang memantau profil Anda.</translation> <translation id="8553075262323480129">Terjemahan gagal karena bahasa halaman tidak dapat ditentukan.</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index 8df151c1..1b148b6 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -811,6 +811,7 @@ <translation id="6897140037006041989">Ejen Pengguna</translation> <translation id="6903319715792422884">Bantu dalam meningkatkan Penyemakan Imbas Selamat dengan menghantar beberapa <ph name="BEGIN_WHITEPAPER_LINK" />maklumat sistem dan kandungan halaman<ph name="END_WHITEPAPER_LINK" /> kepada Google. <ph name="PRIVACY_PAGE_LINK" /></translation> <translation id="6915804003454593391">Pengguna:</translation> +<translation id="6944692733090228304">Anda memasukkan kata laluan di tapak yang tidak diurus oleh <ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" />. Untuk melindungi akaun anda, jangan gunakan semula kata laluan anda pada apl dan tapak lain.</translation> <translation id="6945221475159498467">Pilih</translation> <translation id="6948701128805548767">Pilih alamat untuk melihat kaedah dan syarat pengambilan</translation> <translation id="6949872517221025916">Tetapkan Semula Kata Laluan</translation> @@ -1035,6 +1036,7 @@ <translation id="8498891568109133222"><ph name="HOST_NAME" /> mengambil masa terlalu lama untuk bertindak balas.</translation> <translation id="8503559462189395349">Kata Laluan Chrome</translation> <translation id="8503813439785031346">Nama pengguna</translation> +<translation id="8508648098325802031">Ikon Carian</translation> <translation id="8543181531796978784">Anda boleh <ph name="BEGIN_ERROR_LINK" />laporkan masalah pengesanan<ph name="END_ERROR_LINK" /> atau jika anda memahami risikonya kepada keselamatan anda, <ph name="BEGIN_LINK" />lawati tapak yang tidak selamat ini<ph name="END_LINK" />.</translation> <translation id="8543556556237226809">Ada soalan? Hubungi orang yang menyelia profil anda.</translation> <translation id="8553075262323480129">Gagal terjemahan kerana bahasa halaman tidak dapat ditentukan.</translation>
diff --git a/components/suggestions/DEPS b/components/suggestions/DEPS index c0d5d78..8089d35 100644 --- a/components/suggestions/DEPS +++ b/components/suggestions/DEPS
@@ -1,6 +1,6 @@ include_rules = [ "+components/data_use_measurement/core", - "+components/google/core/browser", + "+components/google/core", "+components/image_fetcher", "+components/keyed_service/core", "+components/leveldb_proto", @@ -13,6 +13,8 @@ "+google_apis", "+net", "+services/identity/public/cpp", + "+services/network/public", + "+services/network/test", "+skia/ext", "+ui", "+url",
diff --git a/components/suggestions/suggestions_service_impl.cc b/components/suggestions/suggestions_service_impl.cc index b76a8e4..78ef389 100644 --- a/components/suggestions/suggestions_service_impl.cc +++ b/components/suggestions/suggestions_service_impl.cc
@@ -12,12 +12,13 @@ #include "base/metrics/field_trial_params.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" +#include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "components/data_use_measurement/core/data_use_user_data.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/suggestions/blacklist_store.h" #include "components/suggestions/features.h" @@ -38,6 +39,10 @@ #include "net/url_request/url_request_status.h" #include "services/identity/public/cpp/identity_manager.h" #include "services/identity/public/cpp/primary_account_access_token_fetcher.h" +#include "services/network/public/cpp/resource_request.h" +#include "services/network/public/cpp/resource_response.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "services/network/public/cpp/simple_url_loader.h" using base::TimeDelta; @@ -99,9 +104,6 @@ const char kDeviceType[] = "1"; #endif -// Format string for OAuth2 authentication headers. -const char kAuthorizationHeaderFormat[] = "Authorization: Bearer %s"; - const char kFaviconURL[] = "https://s2.googleusercontent.com/s2/favicons?domain_url=%s&alt=s&sz=32"; @@ -119,7 +121,7 @@ SuggestionsServiceImpl::SuggestionsServiceImpl( identity::IdentityManager* identity_manager, syncer::SyncService* sync_service, - net::URLRequestContextGetter* url_request_context, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, std::unique_ptr<SuggestionsStore> suggestions_store, std::unique_ptr<ImageManager> thumbnail_manager, std::unique_ptr<BlacklistStore> blacklist_store, @@ -128,7 +130,7 @@ sync_service_(sync_service), sync_service_observer_(this), history_sync_state_(syncer::UploadState::INITIALIZING), - url_request_context_(url_request_context), + url_loader_factory_(url_loader_factory), suggestions_store_(std::move(suggestions_store)), thumbnail_manager_(std::move(thumbnail_manager)), blacklist_store_(std::move(blacklist_store)), @@ -243,24 +245,22 @@ } // static -bool SuggestionsServiceImpl::GetBlacklistedUrl(const net::URLFetcher& request, - GURL* url) { +bool SuggestionsServiceImpl::GetBlacklistedUrl(const GURL& original_url, + GURL* blacklisted_url) { bool is_blacklist_request = base::StartsWith( - request.GetOriginalURL().spec(), BuildSuggestionsBlacklistURLPrefix(), + original_url.spec(), BuildSuggestionsBlacklistURLPrefix(), base::CompareCase::SENSITIVE); if (!is_blacklist_request) return false; // Extract the blacklisted URL from the blacklist request. std::string blacklisted; - if (!net::GetValueForKeyInQuery(request.GetOriginalURL(), - kSuggestionsBlacklistURLParam, + if (!net::GetValueForKeyInQuery(original_url, kSuggestionsBlacklistURLParam, &blacklisted)) { return false; } - GURL blacklisted_url(blacklisted); - blacklisted_url.Swap(url); + *blacklisted_url = GURL(blacklisted); return true; } @@ -408,11 +408,16 @@ const std::string& access_token) { DCHECK(!access_token.empty()); pending_request_ = CreateSuggestionsRequest(url, access_token); - pending_request_->Start(); + // Unretained is safe because the SimpleURLLoader in |pending_request_| will + // not call the callback after it is deleted. + auto callback = base::BindOnce(&SuggestionsServiceImpl::OnURLFetchComplete, + base::Unretained(this), url); + pending_request_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( + url_loader_factory_.get(), std::move(callback)); last_request_started_time_ = tick_clock_->NowTicks(); } -std::unique_ptr<net::URLFetcher> +std::unique_ptr<network::SimpleURLLoader> SuggestionsServiceImpl::CreateSuggestionsRequest( const GURL& url, const std::string& access_token) { @@ -447,52 +452,63 @@ } } })"); - std::unique_ptr<net::URLFetcher> request = net::URLFetcher::Create( - 0, url, net::URLFetcher::GET, this, traffic_annotation); - data_use_measurement::DataUseUserData::AttachToFetcher( - request.get(), data_use_measurement::DataUseUserData::SUGGESTIONS); - int load_flags = net::LOAD_DISABLE_CACHE | net::LOAD_DO_NOT_SEND_COOKIES | - net::LOAD_DO_NOT_SAVE_COOKIES; - - request->SetLoadFlags(load_flags); - request->SetRequestContext(url_request_context_); + auto resource_request = std::make_unique<network::ResourceRequest>(); + resource_request->url = url; + resource_request->method = "GET"; + resource_request->load_flags = net::LOAD_DISABLE_CACHE | + net::LOAD_DO_NOT_SEND_COOKIES | + net::LOAD_DO_NOT_SAVE_COOKIES; // Add Chrome experiment state to the request headers. - net::HttpRequestHeaders headers; // TODO: We should call AppendVariationHeaders with explicit // variations::SignedIn::kNo If the access_token is empty variations::AppendVariationHeadersUnknownSignedIn( - request->GetOriginalURL(), variations::InIncognito::kNo, &headers); - request->SetExtraRequestHeaders(headers.ToString()); + url, variations::InIncognito::kNo, &resource_request->headers); if (!access_token.empty()) { - request->AddExtraRequestHeader( - base::StringPrintf(kAuthorizationHeaderFormat, access_token.c_str())); + resource_request->headers.SetHeader( + "Authorization", base::StrCat({"Bearer ", access_token})); } - return request; + + // TODO(https://crbug.com/808498): re-add data use measurement once + // SimpleURLLoader supports it. + // ID=data_use_measurement::DataUseUserData::SUGGESTIONS + auto loader = network::SimpleURLLoader::Create(std::move(resource_request), + traffic_annotation); + + // We use non-200 error codes as a signal to clear the cache in + // OnURLFetchComplete. + loader->SetAllowHttpErrorResults(true); + return loader; } -void SuggestionsServiceImpl::OnURLFetchComplete(const net::URLFetcher* source) { +void SuggestionsServiceImpl::OnURLFetchComplete( + const GURL& original_url, + std::unique_ptr<std::string> suggestions_data) { DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK_EQ(pending_request_.get(), source); - // The fetcher will be deleted when the request is handled. - std::unique_ptr<const net::URLFetcher> request(std::move(pending_request_)); + // The SimpleURLLoader will be deleted when the request is handled. + std::unique_ptr<const network::SimpleURLLoader> request = + std::move(pending_request_); + DCHECK(request); - const net::URLRequestStatus& request_status = request->GetStatus(); - if (request_status.status() != net::URLRequestStatus::SUCCESS) { + bool valid_request = suggestions_data && request->NetError() == net::OK; + if (!valid_request) { // This represents network errors (i.e. the server did not provide a // response). base::UmaHistogramSparse("Suggestions.FailedRequestErrorCode", - -request_status.error()); + -request->NetError()); DVLOG(1) << "Suggestions server request failed with error: " - << request_status.error() << ": " - << net::ErrorToString(request_status.error()); + << request->NetError() << ": " + << net::ErrorToString(request->NetError()); blacklist_upload_backoff_.InformOfRequest(/*succeeded=*/false); ScheduleBlacklistUpload(); return; } - const int response_code = request->GetResponseCode(); + int response_code = 0; + if (request->ResponseInfo() && request->ResponseInfo()->headers) + response_code = request->ResponseInfo()->headers->response_code(); base::UmaHistogramSparse("Suggestions.FetchResponseCode", response_code); + if (response_code != net::HTTP_OK) { // A non-200 response code means that server has no (longer) suggestions for // this user. Aggressively clear the cache. @@ -508,20 +524,17 @@ // Handle a successful blacklisting. GURL blacklisted_url; - if (GetBlacklistedUrl(*source, &blacklisted_url)) + if (GetBlacklistedUrl(original_url, &blacklisted_url)) blacklist_store_->RemoveUrl(blacklisted_url); - std::string suggestions_data; - bool success = request->GetResponseAsString(&suggestions_data); - DCHECK(success); // Parse the received suggestions and update the cache, or take proper action // in the case of invalid response. SuggestionsProfile suggestions; - if (suggestions_data.empty()) { + if (suggestions_data->empty()) { LogResponseState(RESPONSE_EMPTY); suggestions_store_->ClearSuggestions(); - } else if (suggestions.ParseFromString(suggestions_data)) { + } else if (suggestions.ParseFromString(*suggestions_data)) { LogResponseState(RESPONSE_VALID); int64_t now_usec = (base::Time::NowFromSystemTime() - base::Time::UnixEpoch()) @@ -562,10 +575,11 @@ TimeDelta time_delta; if (blacklist_store_->GetTimeUntilReadyForUpload(&time_delta)) { // Blacklist cache is not empty: schedule. + // TODO: Use BindOnce when OnceTimer supports it. blacklist_upload_timer_.Start( FROM_HERE, time_delta + blacklist_upload_backoff_.GetTimeUntilRelease(), - base::Bind(&SuggestionsServiceImpl::UploadOneFromBlacklist, - weak_ptr_factory_.GetWeakPtr())); + base::BindRepeating(&SuggestionsServiceImpl::UploadOneFromBlacklist, + weak_ptr_factory_.GetWeakPtr())); } }
diff --git a/components/suggestions/suggestions_service_impl.h b/components/suggestions/suggestions_service_impl.h index 9b6a7fe1..f0eccfb 100644 --- a/components/suggestions/suggestions_service_impl.h +++ b/components/suggestions/suggestions_service_impl.h
@@ -36,9 +36,10 @@ class PrimaryAccountAccessTokenFetcher; } // namespace identity -namespace net { -class URLRequestContextGetter; -} // namespace net +namespace network { +class SharedURLLoaderFactory; +class SimpleURLLoader; +} // namespace network namespace syncer { class SyncService; @@ -56,16 +57,16 @@ // Actual (non-test) implementation of the SuggestionsService interface. class SuggestionsServiceImpl : public SuggestionsService, - public net::URLFetcherDelegate, public syncer::SyncServiceObserver { public: - SuggestionsServiceImpl(identity::IdentityManager* identity_manager, - syncer::SyncService* sync_service, - net::URLRequestContextGetter* url_request_context, - std::unique_ptr<SuggestionsStore> suggestions_store, - std::unique_ptr<ImageManager> thumbnail_manager, - std::unique_ptr<BlacklistStore> blacklist_store, - const base::TickClock* tick_clock); + SuggestionsServiceImpl( + identity::IdentityManager* identity_manager, + syncer::SyncService* sync_service, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + std::unique_ptr<SuggestionsStore> suggestions_store, + std::unique_ptr<ImageManager> thumbnail_manager, + std::unique_ptr<BlacklistStore> blacklist_store, + const base::TickClock* tick_clock); ~SuggestionsServiceImpl() override; // SuggestionsService implementation. @@ -86,14 +87,18 @@ base::TimeDelta BlacklistDelayForTesting() const; bool HasPendingRequestForTesting() const; - // Determines which URL a blacklist request was for, irrespective of the - // request's status. Returns false if |request| is not a blacklist request. - static bool GetBlacklistedUrl(const net::URLFetcher& request, GURL* url); + // Determines which URL a blacklist request URL was for. Returns whether if + // |original_url| is a blacklist request, and puts the URL to be blacklisted + // in |blacklisted_url|, which must not be |nullptr|. + static bool GetBlacklistedUrl(const GURL& original_url, + GURL* blacklisted_url); // Register SuggestionsService related prefs in the Profile prefs. static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); private: + friend class SuggestionsServiceTest; + // Establishes the different sync states that matter to SuggestionsService. enum SyncState { // State: Sync service is not initialized, yet not disabled. History sync @@ -152,14 +157,14 @@ // Creates a request to the suggestions service, properly setting headers. // If OAuth2 authentication is enabled, |access_token| should be a valid // OAuth2 access token, and will be written into an auth header. - std::unique_ptr<net::URLFetcher> CreateSuggestionsRequest( + std::unique_ptr<network::SimpleURLLoader> CreateSuggestionsRequest( const GURL& url, const std::string& access_token); - // net::URLFetcherDelegate implementation. // Called when fetch request completes. Parses the received suggestions data, // and dispatches them to callbacks stored in queue. - void OnURLFetchComplete(const net::URLFetcher* source) override; + void OnURLFetchComplete(const GURL& original_url, + std::unique_ptr<std::string> suggestions_data); // KeyedService implementation. void Shutdown() override; @@ -185,7 +190,7 @@ // The state of history sync, i.e. are we uploading history data to Google? syncer::UploadState history_sync_state_; - net::URLRequestContextGetter* url_request_context_; + const scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; // The cache for the suggestions. std::unique_ptr<SuggestionsStore> suggestions_store_; @@ -210,7 +215,7 @@ // Contains the current suggestions fetch request. Will only have a value // while a request is pending, and will be reset by |OnURLFetchComplete| or // if cancelled. - std::unique_ptr<net::URLFetcher> pending_request_; + std::unique_ptr<network::SimpleURLLoader> pending_request_; // The start time of the previous suggestions request. This is used to measure // the latency of requests. Initially zero.
diff --git a/components/suggestions/suggestions_service_impl_unittest.cc b/components/suggestions/suggestions_service_impl_unittest.cc index 59a105d..f836aa9 100644 --- a/components/suggestions/suggestions_service_impl_unittest.cc +++ b/components/suggestions/suggestions_service_impl_unittest.cc
@@ -30,6 +30,9 @@ #include "net/url_request/url_request_test_util.h" #include "services/identity/public/cpp/identity_manager.h" #include "services/identity/public/cpp/identity_test_environment.h" +#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" +#include "services/network/test/test_url_loader_factory.h" +#include "services/network/test/test_utils.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/image/image.h" @@ -139,12 +142,7 @@ protected: SuggestionsServiceTest() : task_runner_(new base::TestMockTimeTaskRunner( - base::TestMockTimeTaskRunner::Type::kBoundToThread)), - request_context_( - new net::TestURLRequestContextGetter(task_runner_.get())), - mock_thumbnail_manager_(nullptr), - mock_blacklist_store_(nullptr), - test_suggestions_store_(nullptr) { + base::TestMockTimeTaskRunner::Type::kBoundToThread)) { identity_test_env_.MakePrimaryAccountAvailable(kEmail); identity_test_env_.SetAutomaticIssueOfAccessTokens(true); } @@ -190,35 +188,50 @@ mock_blacklist_store_ = new StrictMock<MockBlacklistStore>(); suggestions_service_ = std::make_unique<SuggestionsServiceImpl>( identity_test_env_.identity_manager(), &mock_sync_service_, - request_context_.get(), base::WrapUnique(test_suggestions_store_), + base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( + url_loader_factory()), + base::WrapUnique(test_suggestions_store_), base::WrapUnique(mock_thumbnail_manager_), base::WrapUnique(mock_blacklist_store_), task_runner_->GetMockTickClock()); } GURL GetCurrentlyQueriedUrl() { - net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); - if (!fetcher) { + if (url_loader_factory()->NumPending() == 0) return GURL(); - } - return fetcher->GetOriginalURL(); + + return url_loader_factory()->pending_requests()->front().request.url; } - void RespondToFetch(const std::string& response_body, + bool RespondToSuggestionsFetch(const std::string& response_body, + net::HttpStatusCode response_code, + int net_error = net::OK) { + return RespondToFetch(SuggestionsServiceImpl::BuildSuggestionsURL(), + response_body, response_code, net_error); + } + + bool RespondToBlacklistFetch(const std::string& response_body, + net::HttpStatusCode response_code, + int net_error = net::OK) { + return RespondToFetch(SuggestionsServiceImpl::BuildSuggestionsBlacklistURL( + GURL(kBlacklistedUrl)), + response_body, response_code, net_error); + } + + bool RespondToFetchWithProfile(const SuggestionsProfile& suggestions) { + return RespondToFetch(SuggestionsServiceImpl::BuildSuggestionsURL(), + suggestions.SerializeAsString(), net::HTTP_OK); + } + + bool RespondToFetch(const GURL& url, + const std::string& response_body, net::HttpStatusCode response_code, - net::URLRequestStatus status) { - net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); - ASSERT_TRUE(fetcher) << "Tried to respond to fetch that is not ongoing!"; - fetcher->SetResponseString(response_body); - fetcher->set_response_code(response_code); - fetcher->set_status(status); - fetcher->delegate()->OnURLFetchComplete(fetcher); - } - - void RespondToFetchWithProfile(const SuggestionsProfile& suggestions) { - RespondToFetch( - suggestions.SerializeAsString(), net::HTTP_OK, - net::URLRequestStatus(net::URLRequestStatus::SUCCESS, net::OK)); + int net_error = net::OK) { + bool rv = url_loader_factory()->SimulateResponseForPendingRequest( + url, network::URLLoaderCompletionStatus(net_error), + network::CreateResourceResponseHead(response_code), response_body); + task_runner()->RunUntilIdle(); + return rv; } base::TestMockTimeTaskRunner* task_runner() { return task_runner_.get(); } @@ -239,16 +252,20 @@ return &identity_test_env_; } + network::TestURLLoaderFactory* url_loader_factory() { + return &url_loader_factory_; + } + private: scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; - net::TestURLFetcherFactory factory_; identity::IdentityTestEnvironment identity_test_env_; MockSyncService mock_sync_service_; - scoped_refptr<net::TestURLRequestContextGetter> request_context_; + network::TestURLLoaderFactory url_loader_factory_; + // Owned by the SuggestionsService. - MockImageManager* mock_thumbnail_manager_; - MockBlacklistStore* mock_blacklist_store_; - TestSuggestionsStore* test_suggestions_store_; + MockImageManager* mock_thumbnail_manager_ = nullptr; + MockBlacklistStore* mock_blacklist_store_ = nullptr; + TestSuggestionsStore* test_suggestions_store_ = nullptr; std::unique_ptr<SuggestionsServiceImpl> suggestions_service_; @@ -273,7 +290,7 @@ task_runner()->RunUntilIdle(); ASSERT_TRUE(GetCurrentlyQueriedUrl().is_valid()); EXPECT_EQ(GetCurrentlyQueriedUrl().path(), kSuggestionsUrlPath); - RespondToFetchWithProfile(CreateSuggestionsProfile()); + ASSERT_TRUE(RespondToFetchWithProfile(CreateSuggestionsProfile())); SuggestionsProfile suggestions; suggestions_store()->LoadSuggestions(&suggestions); @@ -379,7 +396,7 @@ EXPECT_TRUE(net::GetValueForKeyInQuery(GetCurrentlyQueriedUrl(), "num", &min_suggestions)); EXPECT_EQ(min_suggestions, "0"); - RespondToFetchWithProfile(CreateSuggestionsProfile()); + ASSERT_TRUE(RespondToFetchWithProfile(CreateSuggestionsProfile())); } TEST_F(SuggestionsServiceTest, FetchSuggestionsDataSyncNotInitializedEnabled) { @@ -460,9 +477,8 @@ // Wait for the eventual network request. task_runner()->RunUntilIdle(); - RespondToFetch("irrelevant", net::HTTP_OK, - net::URLRequestStatus(net::URLRequestStatus::FAILED, - net::ERR_INVALID_RESPONSE)); + ASSERT_TRUE(RespondToSuggestionsFetch("irrelevant", net::HTTP_OK, + net::ERR_INVALID_RESPONSE)); } TEST_F(SuggestionsServiceTest, FetchingSuggestionsClearsStoreIfResponseNotOK) { @@ -477,9 +493,7 @@ // Wait for the eventual network request. task_runner()->RunUntilIdle(); - RespondToFetch( - "irrelevant", net::HTTP_BAD_REQUEST, - net::URLRequestStatus(net::URLRequestStatus::SUCCESS, net::OK)); + ASSERT_TRUE(RespondToSuggestionsFetch("irrelevant", net::HTTP_BAD_REQUEST)); SuggestionsProfile empty_suggestions; EXPECT_FALSE(suggestions_store()->LoadSuggestions(&empty_suggestions)); @@ -512,7 +526,11 @@ task_runner()->FastForwardUntilNoTasksRemain(); EXPECT_EQ(GetCurrentlyQueriedUrl().path(), kBlacklistUrlPath); - RespondToFetchWithProfile(CreateSuggestionsProfile()); + // The blacklist fetch needs to contain a valid profile or the favicon will + // not be set. + ASSERT_TRUE(RespondToBlacklistFetch( + CreateSuggestionsProfile().SerializeAsString(), net::HTTP_OK)); + task_runner()->RunUntilIdle(); SuggestionsProfile suggestions; suggestions_store()->LoadSuggestions(&suggestions); @@ -559,9 +577,8 @@ task_runner()->FastForwardUntilNoTasksRemain(); ASSERT_TRUE(GetCurrentlyQueriedUrl().is_valid()); EXPECT_EQ(GetCurrentlyQueriedUrl().path(), kBlacklistUrlPath); - RespondToFetch("irrelevant", net::HTTP_OK, - net::URLRequestStatus(net::URLRequestStatus::FAILED, - net::ERR_INVALID_RESPONSE)); + ASSERT_TRUE(RespondToBlacklistFetch("irrelevant", net::HTTP_OK, + net::ERR_INVALID_RESPONSE)); // Assert that the failure was processed as expected. Mock::VerifyAndClearExpectations(thumbnail_manager()); @@ -583,7 +600,8 @@ ASSERT_TRUE(suggestions_service()->HasPendingRequestForTesting()); ASSERT_TRUE(GetCurrentlyQueriedUrl().is_valid()); EXPECT_EQ(GetCurrentlyQueriedUrl().path(), kBlacklistUrlPath); - RespondToFetchWithProfile(CreateSuggestionsProfile()); + ASSERT_TRUE(RespondToBlacklistFetch( + CreateSuggestionsProfile().SerializeAsString(), net::HTTP_OK)); SuggestionsProfile suggestions; suggestions_store()->LoadSuggestions(&suggestions); @@ -715,15 +733,13 @@ // Delay unchanged on success. suggestions_service()->FetchSuggestionsData(); task_runner()->RunUntilIdle(); - RespondToFetchWithProfile(CreateSuggestionsProfile()); + ASSERT_TRUE(RespondToFetchWithProfile(CreateSuggestionsProfile())); EXPECT_EQ(initial_delay, suggestions_service()->BlacklistDelayForTesting()); // Delay increases on failure. suggestions_service()->FetchSuggestionsData(); task_runner()->RunUntilIdle(); - RespondToFetch( - "irrelevant", net::HTTP_BAD_REQUEST, - net::URLRequestStatus(net::URLRequestStatus::SUCCESS, net::OK)); + ASSERT_TRUE(RespondToSuggestionsFetch("irrelevant", net::HTTP_BAD_REQUEST)); base::TimeDelta delay_after_fail = suggestions_service()->BlacklistDelayForTesting(); EXPECT_GT(delay_after_fail, initial_delay); @@ -732,7 +748,7 @@ // time has passed, the actual current delay stays the same. suggestions_service()->FetchSuggestionsData(); task_runner()->RunUntilIdle(); - RespondToFetchWithProfile(CreateSuggestionsProfile()); + ASSERT_TRUE(RespondToFetchWithProfile(CreateSuggestionsProfile())); EXPECT_EQ(delay_after_fail, suggestions_service()->BlacklistDelayForTesting()); @@ -740,7 +756,7 @@ task_runner()->FastForwardBy(delay_after_fail); suggestions_service()->FetchSuggestionsData(); task_runner()->RunUntilIdle(); - RespondToFetchWithProfile(CreateSuggestionsProfile()); + ASSERT_TRUE(RespondToFetchWithProfile(CreateSuggestionsProfile())); EXPECT_EQ(initial_delay, suggestions_service()->BlacklistDelayForTesting()); } @@ -759,7 +775,7 @@ suggestion->set_title(kTestTitle); suggestion->set_url(kTestUrl); suggestion->set_expiry_ts(kTestSetExpiry); - RespondToFetchWithProfile(profile); + ASSERT_TRUE(RespondToFetchWithProfile(profile)); SuggestionsProfile suggestions; suggestions_store()->LoadSuggestions(&suggestions);
diff --git a/components/translate/content/renderer/translate_helper.cc b/components/translate/content/renderer/translate_helper.cc index c72b74ae..a36cfabf 100644 --- a/components/translate/content/renderer/translate_helper.cc +++ b/components/translate/content/renderer/translate_helper.cc
@@ -222,7 +222,8 @@ if (!main_frame) return std::string(); - v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + v8::HandleScope handle_scope(isolate); WebScriptSource source = WebScriptSource(WebString::FromASCII(script)); v8::Local<v8::Value> result = main_frame->ExecuteScriptInIsolatedWorldAndReturnValue(world_id_, source); @@ -232,9 +233,9 @@ } v8::Local<v8::String> v8_str = result.As<v8::String>(); - int length = v8_str->Utf8Length() + 1; + int length = v8_str->Utf8Length(isolate) + 1; std::unique_ptr<char[]> str(new char[length]); - v8_str->WriteUtf8(str.get(), length); + v8_str->WriteUtf8(isolate, str.get(), length); return std::string(str.get()); }
diff --git a/components/unified_consent/url_keyed_data_collection_consent_helper.cc b/components/unified_consent/url_keyed_data_collection_consent_helper.cc index 067b9592..6ad5213 100644 --- a/components/unified_consent/url_keyed_data_collection_consent_helper.cc +++ b/components/unified_consent/url_keyed_data_collection_consent_helper.cc
@@ -26,7 +26,6 @@ // UrlKeyedDataCollectionConsentHelper: bool IsEnabled() override; - bool IsShutDown() override; private: void OnPrefChanged(); @@ -47,7 +46,6 @@ // UrlKeyedDataCollectionConsentHelper: bool IsEnabled() override; - bool IsShutDown() override; // syncer::SyncServiceObserver: void OnStateChanged(syncer::SyncService* sync) override; @@ -77,10 +75,6 @@ prefs::kUrlKeyedAnonymizedDataCollectionEnabled); } -bool PrefBasedUrlKeyedDataCollectionConsentHelper::IsShutDown() { - return false; -} - void PrefBasedUrlKeyedDataCollectionConsentHelper::OnPrefChanged() { FireOnStateChanged(); } @@ -109,10 +103,6 @@ return sync_data_type_upload_state_ == syncer::UploadState::ACTIVE; } -bool SyncBasedUrlKeyedDataCollectionConsentHelper::IsShutDown() { - return !sync_service_; -} - void SyncBasedUrlKeyedDataCollectionConsentHelper::OnStateChanged( syncer::SyncService* sync_service) { DCHECK_EQ(sync_service_, sync_service); @@ -127,11 +117,8 @@ void SyncBasedUrlKeyedDataCollectionConsentHelper::OnSyncShutdown( syncer::SyncService* sync_service) { DCHECK_EQ(sync_service_, sync_service); - DCHECK_EQ(syncer::UploadState::NOT_ACTIVE, sync_data_type_upload_state_); - sync_service_->RemoveObserver(this); sync_service_ = nullptr; - FireOnShutDown(); } } // namespace @@ -180,9 +167,4 @@ observer.OnUrlKeyedDataCollectionConsentStateChanged(this); } -void UrlKeyedDataCollectionConsentHelper::FireOnShutDown() { - for (auto& observer : observer_list_) - observer.OnUrlKeyedDataCollectionConsentHelperShutDown(this); -} - } // namespace unified_consent
diff --git a/components/unified_consent/url_keyed_data_collection_consent_helper.h b/components/unified_consent/url_keyed_data_collection_consent_helper.h index 455883a1..f4d8486 100644 --- a/components/unified_consent/url_keyed_data_collection_consent_helper.h +++ b/components/unified_consent/url_keyed_data_collection_consent_helper.h
@@ -25,12 +25,6 @@ // Called when the state of the URL-keyed data collection changes. virtual void OnUrlKeyedDataCollectionConsentStateChanged( UrlKeyedDataCollectionConsentHelper* consent_helper) = 0; - - // Called when |consent_helper| is shut down. - // See UrlKeyedDataCollectionConsentHelper::IsShutDown for more information - // on when a UrlKeyedDataCollectionConsentHelper is shut down. - virtual void OnUrlKeyedDataCollectionConsentHelperShutDown( - UrlKeyedDataCollectionConsentHelper* consent_helper){}; }; // Creates a new |UrlKeyedDataCollectionConsentHelper| instance that checks @@ -73,16 +67,6 @@ // collection. virtual bool IsEnabled() = 0; - // Returns true if this UrlKeyedDataCollectionConsentHelper was shut down. - // For sync backed implementations of consent helper, this matches the state - // when the underlying sync service was shut down. - // - // When |UrlKeyedDataCollectionConsentHelper| is shut down, it is guaranteed - // that calls to |IsEnabled| will always return false. - // |UrlKeyedDataCollectionConsentHelper| that are shut down will never again - // become active. - virtual bool IsShutDown() = 0; - // Methods to register or remove observers. void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); @@ -93,9 +77,6 @@ // Fires |OnUrlKeyedDataCollectionConsentStateChanged| on all the observers. void FireOnStateChanged(); - // Fires |OnUrlKeyedDataCollectionConsentHelperShutDown| on all the observers. - void FireOnShutDown(); - private: base::ObserverList<Observer, true> observer_list_;
diff --git a/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc b/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc index 70d0c70..d677ccb 100644 --- a/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc +++ b/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc
@@ -28,10 +28,6 @@ for (auto& observer : observers_) observer.OnStateChanged(this); } - void FireOnSyncShutdownOnAllObservers() { - for (auto& observer : observers_) - observer.OnSyncShutdown(this); - } // syncer::FakeSyncService: int GetDisableReasons() const override { return DISABLE_REASON_NONE; } @@ -87,18 +83,12 @@ void OnUrlKeyedDataCollectionConsentStateChanged( UrlKeyedDataCollectionConsentHelper* consent_helper) override { - state_changed_notifications_.push_back(consent_helper->IsEnabled()); - } - - void OnUrlKeyedDataCollectionConsentHelperShutDown( - UrlKeyedDataCollectionConsentHelper* consent_helper) override { - shutdown_notifications_.push_back(consent_helper->IsShutDown()); + state_changed_notifications.push_back(consent_helper->IsEnabled()); } protected: sync_preferences::TestingPrefServiceSyncable pref_service_; - std::vector<bool> state_changed_notifications_; - std::vector<bool> shutdown_notifications_; + std::vector<bool> state_changed_notifications; TestSyncService sync_service_; }; @@ -110,20 +100,20 @@ &sync_service_); helper->AddObserver(this); EXPECT_FALSE(helper->IsEnabled()); - EXPECT_TRUE(state_changed_notifications_.empty()); + EXPECT_TRUE(state_changed_notifications.empty()); pref_service_.SetBoolean(prefs::kUrlKeyedAnonymizedDataCollectionEnabled, true); EXPECT_TRUE(helper->IsEnabled()); - ASSERT_EQ(1U, state_changed_notifications_.size()); - EXPECT_TRUE(state_changed_notifications_[0]); + ASSERT_EQ(1U, state_changed_notifications.size()); + EXPECT_TRUE(state_changed_notifications[0]); - state_changed_notifications_.clear(); + state_changed_notifications.clear(); pref_service_.SetBoolean(prefs::kUrlKeyedAnonymizedDataCollectionEnabled, false); EXPECT_FALSE(helper->IsEnabled()); - ASSERT_EQ(1U, state_changed_notifications_.size()); - EXPECT_FALSE(state_changed_notifications_[0]); + ASSERT_EQ(1U, state_changed_notifications.size()); + EXPECT_FALSE(state_changed_notifications[0]); helper->RemoveObserver(this); } @@ -135,14 +125,14 @@ &sync_service_); helper->AddObserver(this); EXPECT_FALSE(helper->IsEnabled()); - EXPECT_TRUE(state_changed_notifications_.empty()); + EXPECT_TRUE(state_changed_notifications.empty()); sync_service_.set_sync_initialized(true); sync_service_.set_sync_active_data_type( syncer::ModelType::HISTORY_DELETE_DIRECTIVES); sync_service_.FireOnStateChangeOnAllObservers(); EXPECT_TRUE(helper->IsEnabled()); - ASSERT_EQ(1U, state_changed_notifications_.size()); + ASSERT_EQ(1U, state_changed_notifications.size()); helper->RemoveObserver(this); } @@ -163,13 +153,13 @@ NewPersonalizedDataCollectionConsentHelper(true, &sync_service_); helper->AddObserver(this); EXPECT_FALSE(helper->IsEnabled()); - EXPECT_TRUE(state_changed_notifications_.empty()); + EXPECT_TRUE(state_changed_notifications.empty()); sync_service_.set_sync_initialized(true); sync_service_.set_sync_active_data_type(syncer::ModelType::USER_EVENTS); sync_service_.FireOnStateChangeOnAllObservers(); EXPECT_TRUE(helper->IsEnabled()); - ASSERT_EQ(1U, state_changed_notifications_.size()); + ASSERT_EQ(1U, state_changed_notifications.size()); helper->RemoveObserver(this); } @@ -180,44 +170,34 @@ NewPersonalizedDataCollectionConsentHelper(false, &sync_service_); helper->AddObserver(this); EXPECT_FALSE(helper->IsEnabled()); - EXPECT_TRUE(state_changed_notifications_.empty()); + EXPECT_TRUE(state_changed_notifications.empty()); sync_service_.set_sync_initialized(true); sync_service_.set_sync_active_data_type( syncer::ModelType::HISTORY_DELETE_DIRECTIVES); sync_service_.FireOnStateChangeOnAllObservers(); EXPECT_TRUE(helper->IsEnabled()); - ASSERT_EQ(1U, state_changed_notifications_.size()); + ASSERT_EQ(1U, state_changed_notifications.size()); helper->RemoveObserver(this); } TEST_F(UrlKeyedDataCollectionConsentHelperTest, PersonalizedDataCollection_NullSyncService) { - for (bool is_unified_consent_enabled : {true, false}) { + { std::unique_ptr<UrlKeyedDataCollectionConsentHelper> helper = UrlKeyedDataCollectionConsentHelper:: NewPersonalizedDataCollectionConsentHelper( - is_unified_consent_enabled, nullptr /* sync_service */); + false /* is_unified_consent_enabled */, + nullptr /* sync_service */); EXPECT_FALSE(helper->IsEnabled()); - EXPECT_TRUE(helper->IsShutDown()); } -} - -TEST_F(UrlKeyedDataCollectionConsentHelperTest, - PersonalizedDataCollection_ShutDown) { - for (bool is_unified_consent_enabled : {true, false}) { - ASSERT_TRUE(shutdown_notifications_.empty()); + { std::unique_ptr<UrlKeyedDataCollectionConsentHelper> helper = UrlKeyedDataCollectionConsentHelper:: NewPersonalizedDataCollectionConsentHelper( - is_unified_consent_enabled, &sync_service_); - helper->AddObserver(this); - EXPECT_FALSE(helper->IsShutDown()); - sync_service_.FireOnSyncShutdownOnAllObservers(); - EXPECT_TRUE(helper->IsShutDown()); - EXPECT_EQ(1U, shutdown_notifications_.size()); - helper->RemoveObserver(this); - shutdown_notifications_.clear(); + true /* is_unified_consent_enabled */, + nullptr /* sync_service */); + EXPECT_FALSE(helper->IsEnabled()); } }
diff --git a/components/variations/net/variations_http_headers.cc b/components/variations/net/variations_http_headers.cc index a2d0782..790856b 100644 --- a/components/variations/net/variations_http_headers.cc +++ b/components/variations/net/variations_http_headers.cc
@@ -11,7 +11,7 @@ #include "base/macros.h" #include "base/metrics/histogram_macros.h" #include "base/strings/string_util.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/variations/variations_http_header_provider.h" #include "net/http/http_request_headers.h" #include "net/traffic_annotation/network_traffic_annotation.h"
diff --git a/components/viz/service/display/display_scheduler.h b/components/viz/service/display/display_scheduler.h index 11fa355..c88ab358 100644 --- a/components/viz/service/display/display_scheduler.h +++ b/components/viz/service/display/display_scheduler.h
@@ -89,7 +89,30 @@ const BeginFrameArgs& args) override; protected: - enum class BeginFrameDeadlineMode { kImmediate, kRegular, kLate, kNone }; + // These values inidicate how a response to the BeginFrame should be + // scheduled. + enum class BeginFrameDeadlineMode { + // Respond immediately. This means either all clients have responded with a + // BeginFrameAck so there is nothing to wait for, or DrawAndSwap cannot + // happen anymore (for example, OutputSurface is lost) and we might as well + // respond right now. + kImmediate, + // Schedule a task at the the end of BeginFrame interval minus the estimated + // time to run DrawAndSwap. This indicates that all requirements for calling + // DrawAndSwap are met, but we just want to give clients as much time as + // possible to send CompositorFrames. + kRegular, + // Schedule a response at the end of the BeginFrame interval. This usually + // indicates that some requirements for calling DrawAndSwap are not + // currently met (for example, the previous swap is not acked yet) and + // we would like to wait as long as possible to see if DrawAndSwap becomes + // possible. + kLate, + // A response to the BeginFrame cannot be scheduled right now. This means we + // have an unlimited deadline and some clients haven't responded to the + // BeginFrame yet so we need to wait longer. + kNone + }; base::TimeTicks DesiredBeginFrameDeadlineTime() const; BeginFrameDeadlineMode AdjustedBeginFrameDeadlineMode() const; BeginFrameDeadlineMode DesiredBeginFrameDeadlineMode() const;
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc index d216f4b3..bbdf378b 100644 --- a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc +++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
@@ -121,6 +121,7 @@ } DCHECK(surface->HasActiveFrame()); + surface->UpdateSurfaceReferences(); // Check if this is a display root surface and the SurfaceId is changing. if (is_root_ && (!referenced_local_surface_id_ ||
diff --git a/components/viz/service/frame_sinks/surface_synchronization_unittest.cc b/components/viz/service/frame_sinks/surface_synchronization_unittest.cc index c8acf3c..81218655 100644 --- a/components/viz/service/frame_sinks/surface_synchronization_unittest.cc +++ b/components/viz/service/frame_sinks/surface_synchronization_unittest.cc
@@ -2525,79 +2525,5 @@ EXPECT_EQ(parent_id, parent_support().last_activated_surface_id()); } -// This test verifies that once a Surface is activated, the latest in flight -// surface for each SurfaceRange in the submitted CompositorFrame will be added -// to the referenced surfaces. -TEST_F(SurfaceSynchronizationTest, ReferencesAfterActivationSameFrameSink) { - SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); - - SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); - SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink1, 2); - SurfaceId child_id3 = MakeSurfaceId(kChildFrameSink1, 3); - - DisableAssignTemporaryReferences(); - - child_support1().SubmitCompositorFrame(child_id1.local_surface_id(), - MakeDefaultCompositorFrame()); - - child_support1().SubmitCompositorFrame(child_id2.local_surface_id(), - MakeDefaultCompositorFrame()); - - parent_support().SubmitCompositorFrame( - parent_id.local_surface_id(), - MakeCompositorFrame(empty_surface_ids(), - {SurfaceRange(child_id1, child_id3)}, - std::vector<TransferableResource>())); - - const base::flat_set<SurfaceId>& child_references = - GetChildReferences(parent_id); - - // |child_id2| is the latest active surface so we return it. - EXPECT_EQ(child_references.size(), 1u); - EXPECT_THAT(child_references, UnorderedElementsAre(child_id2)); -} - -// This test verifies that once a Surface is activated by a CompositorFrame -// referencing a SurfaceRange with differing frame sinks, fallback surface will -// be returned by GetLatestInFlightSurface. -TEST_F(SurfaceSynchronizationTest, - ReferencesAfterActivationDifferentFrameSink) { - SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); - - SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); - SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink1, 2); - SurfaceId child_id3 = MakeSurfaceId(kChildFrameSink2, 3); - - DisableAssignTemporaryReferences(); - - child_support1().SubmitCompositorFrame(child_id1.local_surface_id(), - MakeDefaultCompositorFrame()); - - child_support1().SubmitCompositorFrame(child_id2.local_surface_id(), - MakeDefaultCompositorFrame()); - - parent_support().SubmitCompositorFrame( - parent_id.local_surface_id(), - MakeCompositorFrame(empty_surface_ids(), - {SurfaceRange(child_id1, child_id3)}, - std::vector<TransferableResource>())); - - const base::flat_set<SurfaceId>& child_references = - GetChildReferences(parent_id); - - // Since frame sink ids are different parent will reference fallback surface. - // However, after (crbug.com/857575) parent should reference |child_id2| - // instead. - EXPECT_THAT(child_references, UnorderedElementsAre(child_id1)); - - parent_support().SubmitCompositorFrame( - parent_id.local_surface_id(), - MakeCompositorFrame(empty_surface_ids(), - {SurfaceRange(child_id2, child_id3)}, - std::vector<TransferableResource>())); - - EXPECT_THAT(child_references, UnorderedElementsAre(child_id2)); -} - } // namespace test } // namespace viz
diff --git a/components/viz/service/surfaces/surface.cc b/components/viz/service/surfaces/surface.cc index b995b0c4f..813bd4a8 100644 --- a/components/viz/service/surfaces/surface.cc +++ b/components/viz/service/surfaces/surface.cc
@@ -329,28 +329,12 @@ active_frame_data_ = std::move(frame_data); - // Extract the latest in flight surface from the ranges in the frame then - // notify SurfaceManager of the new references. active_referenced_surfaces_.clear(); - for (const SurfaceRange& surface_range : + for (SurfaceRange surface_range : active_frame_data_->frame.metadata.referenced_surfaces) { - // TODO(akaba): remove this case when GetLatestInFlightSurface is able to - // return primary. - Surface* primary_surface = - surface_manager_->GetSurfaceForId(surface_range.end()); - if (primary_surface && primary_surface->HasActiveFrame()) { - active_referenced_surfaces_.emplace_back(surface_range.end()); - continue; - } - - if (surface_range.start()) { - Surface* surface = surface_manager_->GetLatestInFlightSurface( - surface_range.end(), *surface_range.start()); - if (surface) - active_referenced_surfaces_.emplace_back(surface->surface_id()); - } + if (surface_range.start()) + active_referenced_surfaces_.emplace_back(*surface_range.start()); } - UpdateSurfaceReferences(); for (auto& copy_request : old_copy_requests) RequestCopyOfOutput(std::move(copy_request));
diff --git a/components/web_resource/web_resource_service.cc b/components/web_resource/web_resource_service.cc index 05d6ceb..0767fdb 100644 --- a/components/web_resource/web_resource_service.cc +++ b/components/web_resource/web_resource_service.cc
@@ -16,7 +16,7 @@ #include "base/time/time.h" #include "base/values.h" #include "components/data_use_measurement/core/data_use_user_data.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/prefs/pref_service.h" #include "net/base/load_flags.h" #include "services/network/public/cpp/resource_request.h"
diff --git a/content/browser/background_fetch/background_fetch_context.cc b/content/browser/background_fetch/background_fetch_context.cc index 2e6f1b9..bf049b8e 100644 --- a/content/browser/background_fetch/background_fetch_context.cc +++ b/content/browser/background_fetch/background_fetch_context.cc
@@ -265,12 +265,13 @@ void BackgroundFetchContext::OnUpdatedUI( const BackgroundFetchRegistrationId& registration_id, - const std::string& title) { + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) { DCHECK_CURRENTLY_ON(BrowserThread::IO); auto iter = job_controllers_.find(registration_id.unique_id()); if (iter != job_controllers_.end()) - iter->second->UpdateUI(title); + iter->second->UpdateUI(title, icon); } void BackgroundFetchContext::OnRegistrationDeleted(
diff --git a/content/browser/background_fetch/background_fetch_context.h b/content/browser/background_fetch/background_fetch_context.h index 683595b..dfba99c 100644 --- a/content/browser/background_fetch/background_fetch_context.h +++ b/content/browser/background_fetch/background_fetch_context.h
@@ -125,7 +125,8 @@ const SkBitmap& icon, int num_requests) override; void OnUpdatedUI(const BackgroundFetchRegistrationId& registration_id, - const std::string& title) override; + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) override; void OnServiceWorkerDatabaseCorrupted( int64_t service_worker_registration_id) override;
diff --git a/content/browser/background_fetch/background_fetch_data_manager_observer.h b/content/browser/background_fetch/background_fetch_data_manager_observer.h index 1436f40b..a3b63d8 100644 --- a/content/browser/background_fetch/background_fetch_data_manager_observer.h +++ b/content/browser/background_fetch/background_fetch_data_manager_observer.h
@@ -7,6 +7,8 @@ #include <memory> +#include "base/optional.h" + class SkBitmap; namespace content { @@ -28,10 +30,11 @@ const SkBitmap& icon, int num_requests) = 0; - // Called when the |title| for the Background Fetch |registration_id| has been - // updated in the data store. + // Called when the UI options for the Background Fetch |registration_id| have + // been updated in the data store. virtual void OnUpdatedUI(const BackgroundFetchRegistrationId& registration_id, - const std::string& title) = 0; + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) = 0; // Called if corrupted data is found in the Service Worker database. virtual void OnServiceWorkerDatabaseCorrupted(
diff --git a/content/browser/background_fetch/background_fetch_data_manager_unittest.cc b/content/browser/background_fetch/background_fetch_data_manager_unittest.cc index b94712f..6629f520 100644 --- a/content/browser/background_fetch/background_fetch_data_manager_unittest.cc +++ b/content/browser/background_fetch/background_fetch_data_manager_unittest.cc
@@ -510,9 +510,10 @@ const BackgroundFetchOptions& options, const SkBitmap& icon, int num_requests)); - MOCK_METHOD2(OnUpdatedUI, + MOCK_METHOD3(OnUpdatedUI, void(const BackgroundFetchRegistrationId& registration, - const std::string& title)); + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon)); MOCK_METHOD1(OnServiceWorkerDatabaseCorrupted, void(int64_t service_worker_registration_id)); @@ -876,7 +877,9 @@ // Update only the title. { - EXPECT_CALL(*this, OnUpdatedUI(registration_id, kUpdatedTitle)); + EXPECT_CALL(*this, + OnUpdatedUI(registration_id, + base::Optional<std::string>(kUpdatedTitle), _)); UpdateRegistrationUI(registration_id, kUpdatedTitle, base::nullopt, &error); ASSERT_EQ(error, blink::mojom::BackgroundFetchError::NONE); @@ -891,8 +894,7 @@ // Update only the icon. { - // TODO(crbug.com/865063): Icon updates are not supported yet. - EXPECT_CALL(*this, OnUpdatedUI(registration_id, kUpdatedTitle)).Times(0); + EXPECT_CALL(*this, OnUpdatedUI(registration_id, _, _)); UpdateRegistrationUI(registration_id, base::nullopt, CreateTestIcon(24 /* size */), &error); @@ -908,7 +910,9 @@ // Update both the title and icon. { - EXPECT_CALL(*this, OnUpdatedUI(registration_id, kInitialTitle)); + EXPECT_CALL(*this, + OnUpdatedUI(registration_id, + base::Optional<std::string>(kInitialTitle), _)); UpdateRegistrationUI(registration_id, kInitialTitle, CreateTestIcon(66 /* size */), &error); @@ -924,7 +928,9 @@ // New title and an icon that's too large. { - EXPECT_CALL(*this, OnUpdatedUI(registration_id, kUpdatedTitle)); + EXPECT_CALL(*this, + OnUpdatedUI(registration_id, + base::Optional<std::string>(kUpdatedTitle), _)); UpdateRegistrationUI(registration_id, kUpdatedTitle, CreateTestIcon(512 /* size */), &error);
diff --git a/content/browser/background_fetch/background_fetch_delegate_proxy.cc b/content/browser/background_fetch/background_fetch_delegate_proxy.cc index 90f63f92..999bea3 100644 --- a/content/browser/background_fetch/background_fetch_delegate_proxy.cc +++ b/content/browser/background_fetch/background_fetch_delegate_proxy.cc
@@ -143,11 +143,13 @@ delegate_->Abort(job_unique_id); } - void UpdateUI(const std::string& job_unique_id, const std::string& title) { + void UpdateUI(const std::string& job_unique_id, + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (delegate_) - delegate_->UpdateUI(job_unique_id, title); + delegate_->UpdateUI(job_unique_id, title, icon); } // BackgroundFetchDelegate::Client implementation: @@ -313,13 +315,15 @@ job_unique_id, origin, request)); } -void BackgroundFetchDelegateProxy::UpdateUI(const std::string& job_unique_id, - const std::string& title) { +void BackgroundFetchDelegateProxy::UpdateUI( + const std::string& job_unique_id, + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - BrowserThread::PostTask( - BrowserThread::UI, FROM_HERE, - base::BindOnce(&Core::UpdateUI, ui_core_ptr_, job_unique_id, title)); + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, + base::BindOnce(&Core::UpdateUI, ui_core_ptr_, + job_unique_id, title, icon)); } void BackgroundFetchDelegateProxy::Abort(const std::string& job_unique_id) {
diff --git a/content/browser/background_fetch/background_fetch_delegate_proxy.h b/content/browser/background_fetch/background_fetch_delegate_proxy.h index 1084985..e17eb0b 100644 --- a/content/browser/background_fetch/background_fetch_delegate_proxy.h +++ b/content/browser/background_fetch/background_fetch_delegate_proxy.h
@@ -14,6 +14,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/optional.h" #include "content/browser/background_fetch/background_fetch_request_info.h" #include "content/public/browser/background_fetch_delegate.h" #include "content/public/browser/background_fetch_description.h" @@ -87,8 +88,11 @@ scoped_refptr<BackgroundFetchRequestInfo> request); // Updates the representation of this registration in the user interface to - // match the given |title|. Called from the Controller (on the IO thread). - void UpdateUI(const std::string& job_unique_id, const std::string& title); + // match the given |title| or |icon|. + // Called from the Controller (on the IO thread). + void UpdateUI(const std::string& job_unique_id, + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon); // Aborts in progress downloads for the given registration. Called from the // Controller (on the IO thread) after it is aborted. May occur even if all
diff --git a/content/browser/background_fetch/background_fetch_delegate_proxy_unittest.cc b/content/browser/background_fetch/background_fetch_delegate_proxy_unittest.cc index 3b3a88a0..f1b7187 100644 --- a/content/browser/background_fetch/background_fetch_delegate_proxy_unittest.cc +++ b/content/browser/background_fetch/background_fetch_delegate_proxy_unittest.cc
@@ -63,15 +63,16 @@ } void UpdateUI(const std::string& job_unique_id, - const std::string& title) override { - ++title_update_count_; + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) override { + ++ui_update_count_; } void set_complete_downloads(bool complete_downloads) { complete_downloads_ = complete_downloads; } - int title_update_count_ = 0; + int ui_update_count_ = 0; private: void CompleteDownload(const std::string& job_unique_id, @@ -267,9 +268,9 @@ EXPECT_TRUE(controller.request_started_); EXPECT_TRUE(controller.request_completed_); - delegate_proxy_.UpdateUI(kExampleUniqueId, "Job 1 Complete!"); + delegate_proxy_.UpdateUI(kExampleUniqueId, "Job 1 Complete!", base::nullopt); base::RunLoop().RunUntilIdle(); - EXPECT_EQ(delegate_.title_update_count_, 1); + EXPECT_EQ(delegate_.ui_update_count_, 1); } } // namespace content
diff --git a/content/browser/background_fetch/background_fetch_job_controller.cc b/content/browser/background_fetch/background_fetch_job_controller.cc index 2b9a7e66..5dee99e3 100644 --- a/content/browser/background_fetch/background_fetch_job_controller.cc +++ b/content/browser/background_fetch/background_fetch_job_controller.cc
@@ -115,10 +115,12 @@ request_manager_->MarkRequestAsComplete(registration_id(), request.get()); } -void BackgroundFetchJobController::UpdateUI(const std::string& title) { +void BackgroundFetchJobController::UpdateUI( + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - delegate_proxy_->UpdateUI(registration_id().unique_id(), title); + delegate_proxy_->UpdateUI(registration_id().unique_id(), title, icon); } uint64_t BackgroundFetchJobController::GetInProgressDownloadedBytes() {
diff --git a/content/browser/background_fetch/background_fetch_job_controller.h b/content/browser/background_fetch/background_fetch_job_controller.h index 780791d..01152d1 100644 --- a/content/browser/background_fetch/background_fetch_job_controller.h +++ b/content/browser/background_fetch/background_fetch_job_controller.h
@@ -13,6 +13,7 @@ #include "base/callback.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/optional.h" #include "content/browser/background_fetch/background_fetch_delegate_proxy.h" #include "content/browser/background_fetch/background_fetch_registration_id.h" #include "content/browser/background_fetch/background_fetch_request_info.h" @@ -69,9 +70,10 @@ // Gets the number of bytes downloaded for jobs that are currently running. uint64_t GetInProgressDownloadedBytes(); - // Updates the UI (currently only job title) that's shown to the user as part - // of a notification for instance. - void UpdateUI(const std::string& title); + // Updates the UI that's shown to the user as part of a notification for + // instance. + void UpdateUI(const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon); // Returns the options with which this job is fetching data. const BackgroundFetchOptions& options() const { return options_; }
diff --git a/content/browser/background_fetch/mock_background_fetch_delegate.cc b/content/browser/background_fetch/mock_background_fetch_delegate.cc index 72a0985..c9934a8 100644 --- a/content/browser/background_fetch/mock_background_fetch_delegate.cc +++ b/content/browser/background_fetch/mock_background_fetch_delegate.cc
@@ -149,8 +149,10 @@ aborted_jobs_.insert(job_unique_id); } -void MockBackgroundFetchDelegate::UpdateUI(const std::string& job_unique_id, - const std::string& title) {} +void MockBackgroundFetchDelegate::UpdateUI( + const std::string& job_unique_id, + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) {} void MockBackgroundFetchDelegate::RegisterResponse( const GURL& url,
diff --git a/content/browser/background_fetch/mock_background_fetch_delegate.h b/content/browser/background_fetch/mock_background_fetch_delegate.h index 587f071..6d12cd4 100644 --- a/content/browser/background_fetch/mock_background_fetch_delegate.h +++ b/content/browser/background_fetch/mock_background_fetch_delegate.h
@@ -12,7 +12,9 @@ #include <vector> #include "base/files/scoped_temp_dir.h" +#include "base/optional.h" #include "content/public/browser/background_fetch_delegate.h" +#include "third_party/skia/include/core/SkBitmap.h" #include "url/gurl.h" namespace net { @@ -75,7 +77,8 @@ const net::HttpRequestHeaders& headers) override; void Abort(const std::string& job_unique_id) override; void UpdateUI(const std::string& job_unique_id, - const std::string& title) override; + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) override; void RegisterResponse(const GURL& url, std::unique_ptr<TestResponse> response);
diff --git a/content/browser/background_fetch/storage/update_registration_ui_task.cc b/content/browser/background_fetch/storage/update_registration_ui_task.cc index 206af94..7f81f6b3 100644 --- a/content/browser/background_fetch/storage/update_registration_ui_task.cc +++ b/content/browser/background_fetch/storage/update_registration_ui_task.cc
@@ -109,10 +109,8 @@ void UpdateRegistrationUITask::FinishWithError( blink::mojom::BackgroundFetchError error) { - for (auto& observer : data_manager()->observers()) { - if (title_) - observer.OnUpdatedUI(registration_id_, *title_); - } + for (auto& observer : data_manager()->observers()) + observer.OnUpdatedUI(registration_id_, title_, icon_); std::move(callback_).Run(error); Finished(); // Destroys |this|.
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc index 20fa233..511d805 100644 --- a/content/browser/compositor/gpu_process_transport_factory.cc +++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -741,7 +741,7 @@ // If there are any observer left at this point, make sure they clean up // before we destroy the GLHelper. for (auto& observer : observer_list_) - observer.OnLostResources(); + observer.OnLostSharedContext(); helper.reset(); DCHECK(!gl_helper_) << "Destroying the GLHelper should not cause a new " @@ -1019,7 +1019,7 @@ std::unique_ptr<viz::GLHelper> lost_gl_helper = std::move(gl_helper_); for (auto& observer : observer_list_) - observer.OnLostResources(); + observer.OnLostSharedContext(); // Kill things that use the shared context before killing the shared context. lost_gl_helper.reset();
diff --git a/content/browser/compositor/image_transport_factory_browsertest.cc b/content/browser/compositor/image_transport_factory_browsertest.cc index ed18a62..659533c 100644 --- a/content/browser/compositor/image_transport_factory_browsertest.cc +++ b/content/browser/compositor/image_transport_factory_browsertest.cc
@@ -22,7 +22,8 @@ class MockContextFactoryObserver : public ui::ContextFactoryObserver { public: - MOCK_METHOD0(OnLostResources, void()); + MOCK_METHOD0(OnLostSharedContext, void()); + MOCK_METHOD0(OnLostVizProcess, void()); }; // Flaky on ChromeOS: crbug.com/394083 @@ -44,7 +45,7 @@ factory->GetContextFactory()->AddObserver(&observer); base::RunLoop run_loop; - EXPECT_CALL(observer, OnLostResources()) + EXPECT_CALL(observer, OnLostSharedContext()) .WillOnce(testing::Invoke(&run_loop, &base::RunLoop::Quit)); scoped_refptr<viz::ContextProvider> context_provider =
diff --git a/content/browser/compositor/owned_mailbox.cc b/content/browser/compositor/owned_mailbox.cc index 69e1687c..f1eddad0 100644 --- a/content/browser/compositor/owned_mailbox.cc +++ b/content/browser/compositor/owned_mailbox.cc
@@ -41,9 +41,11 @@ gl_helper_ = nullptr; } -void OwnedMailbox::OnLostResources() { +void OwnedMailbox::OnLostSharedContext() { if (gl_helper_) Destroy(); } +void OwnedMailbox::OnLostVizProcess() {} + } // namespace content
diff --git a/content/browser/compositor/owned_mailbox.h b/content/browser/compositor/owned_mailbox.h index d703dfa5..9880759 100644 --- a/content/browser/compositor/owned_mailbox.h +++ b/content/browser/compositor/owned_mailbox.h
@@ -41,7 +41,8 @@ ~OwnedMailbox() override; // ImageTransportFactoryObserver implementation. - void OnLostResources() override; + void OnLostSharedContext() override; + void OnLostVizProcess() override; private: friend class base::RefCounted<OwnedMailbox>;
diff --git a/content/browser/compositor/test/test_image_transport_factory.cc b/content/browser/compositor/test/test_image_transport_factory.cc index 4b13c638..0e74486 100644 --- a/content/browser/compositor/test/test_image_transport_factory.cc +++ b/content/browser/compositor/test/test_image_transport_factory.cc
@@ -74,7 +74,7 @@ std::unique_ptr<viz::GLHelper> lost_gl_helper = std::move(gl_helper_); for (auto& observer : observer_list_) - observer.OnLostResources(); + observer.OnLostSharedContext(); } void TestImageTransportFactory::CreateLayerTreeFrameSink(
diff --git a/content/browser/compositor/viz_process_transport_factory.cc b/content/browser/compositor/viz_process_transport_factory.cc index 0aa2fef..b541375c 100644 --- a/content/browser/compositor/viz_process_transport_factory.cc +++ b/content/browser/compositor/viz_process_transport_factory.cc
@@ -324,15 +324,8 @@ // Reconnect HostFrameSinkManager to new GPU process. ConnectHostFrameSinkManager(); - // If we're using GPU compositing then OnLostResources() will get triggered by - // the loss of the shared context. If we're using software compositing there - // is no shared context so trigger OnLostResources() from here. - if (is_gpu_compositing_disabled()) { - // TODO(kylechar): Split OnLostResources() into OnLostSharedContext() and - // OnLostGpuProcess() to differentiate between the two cases. - for (auto& observer : observer_list_) - observer.OnLostResources(); - } + for (auto& observer : observer_list_) + observer.OnLostVizProcess(); } void VizProcessTransportFactory::OnEstablishedGpuChannel( @@ -456,7 +449,7 @@ } for (auto& observer : observer_list_) - observer.OnLostResources(); + observer.OnLostSharedContext(); } } // namespace content
diff --git a/content/browser/devtools/devtools_session.cc b/content/browser/devtools/devtools_session.cc index 327d671..7e85f6d 100644 --- a/content/browser/devtools/devtools_session.cc +++ b/content/browser/devtools/devtools_session.cc
@@ -81,9 +81,10 @@ const blink::mojom::DevToolsAgentAssociatedPtr& agent) { blink::mojom::DevToolsSessionHostAssociatedPtrInfo host_ptr_info; binding_.Bind(mojo::MakeRequest(&host_ptr_info)); - agent->AttachDevToolsSession( - std::move(host_ptr_info), mojo::MakeRequest(&session_ptr_), - mojo::MakeRequest(&io_session_ptr_), state_cookie_); + agent->AttachDevToolsSession(std::move(host_ptr_info), + mojo::MakeRequest(&session_ptr_), + mojo::MakeRequest(&io_session_ptr_), + state_cookie_, session_state_cookie_.Clone()); session_ptr_.set_connection_error_handler(base::BindOnce( &DevToolsSession::MojoConnectionDestroyed, base::Unretained(this))); @@ -105,6 +106,8 @@ // Set cookie to an empty string to reattach next time instead of attaching. if (!state_cookie_.has_value()) state_cookie_ = std::string(); + if (!session_state_cookie_) + session_state_cookie_ = blink::mojom::DevToolsSessionState::New(); } void DevToolsSession::SendResponse( @@ -218,9 +221,11 @@ void DevToolsSession::DispatchProtocolResponse( const std::string& message, int call_id, - const base::Optional<std::string>& state) { + const base::Optional<std::string>& state, + blink::mojom::DevToolsSessionStatePtr updates) { if (state.has_value()) state_cookie_ = state.value(); + ApplySessionStateUpdates(std::move(updates)); waiting_for_response_messages_.erase(call_id); client_->DispatchProtocolMessage(agent_host_, message); // |this| may be deleted at this point. @@ -228,11 +233,26 @@ void DevToolsSession::DispatchProtocolNotification( const std::string& message, - const base::Optional<std::string>& state) { + const base::Optional<std::string>& state, + blink::mojom::DevToolsSessionStatePtr updates) { if (state.has_value()) state_cookie_ = state.value(); + ApplySessionStateUpdates(std::move(updates)); client_->DispatchProtocolMessage(agent_host_, message); // |this| may be deleted at this point. } +void DevToolsSession::ApplySessionStateUpdates( + blink::mojom::DevToolsSessionStatePtr updates) { + if (!updates) + return; + if (!session_state_cookie_) + session_state_cookie_ = blink::mojom::DevToolsSessionState::New(); + for (auto& entry : updates->entries) { + if (entry.second.has_value()) + session_state_cookie_->entries[entry.first] = std::move(entry.second); + else + session_state_cookie_->entries.erase(entry.first); + } +} } // namespace content
diff --git a/content/browser/devtools/devtools_session.h b/content/browser/devtools/devtools_session.h index 80d6f24..b7f372d 100644 --- a/content/browser/devtools/devtools_session.h +++ b/content/browser/devtools/devtools_session.h
@@ -88,10 +88,15 @@ void DispatchProtocolResponse( const std::string& message, int call_id, - const base::Optional<std::string>& state) override; + const base::Optional<std::string>& state, + blink::mojom::DevToolsSessionStatePtr updates) override; void DispatchProtocolNotification( const std::string& message, - const base::Optional<std::string>& state) override; + const base::Optional<std::string>& state, + blink::mojom::DevToolsSessionStatePtr updates) override; + + // Merges the |updates| received from the renderer into session_state_cookie_. + void ApplySessionStateUpdates(blink::mojom::DevToolsSessionStatePtr updates); mojo::AssociatedBinding<blink::mojom::DevToolsSessionHost> binding_; blink::mojom::DevToolsSessionAssociatedPtr session_ptr_; @@ -127,6 +132,7 @@ // any of the waiting for response messages have been handled. // Note that |state_cookie_| is not present only before first attach. base::Optional<std::string> state_cookie_; + blink::mojom::DevToolsSessionStatePtr session_state_cookie_; base::WeakPtrFactory<DevToolsSession> weak_factory_; };
diff --git a/content/browser/renderer_host/delegated_frame_host.cc b/content/browser/renderer_host/delegated_frame_host.cc index d1f257e1..cbd2743 100644 --- a/content/browser/renderer_host/delegated_frame_host.cc +++ b/content/browser/renderer_host/delegated_frame_host.cc
@@ -445,28 +445,21 @@ } //////////////////////////////////////////////////////////////////////////////// -// DelegatedFrameHost, ImageTransportFactoryObserver implementation: +// DelegatedFrameHost, ContextFactoryObserver implementation: -void DelegatedFrameHost::OnLostResources() { - // TODO(kylechar): This isn't called consistently without OOP-D. It's tied to - // losing the shared main thread context which is only used on Chrome OS. +void DelegatedFrameHost::OnLostSharedContext() {} - // With OOP-D renderer surface was destroyed if the GPU process crashed. - // Without OOP-D the renderer surface may use invalid resources so we evict - // it. Reset the fallback Surface but leave the primary so we embed the - // renderer surface as soon as it gets created again. +void DelegatedFrameHost::OnLostVizProcess() { + // With OOP-D renderer surface was destroyed if the GPU process crashed. Reset + // the fallback Surface but leave the primary so we embed the renderer surface + // again. if (HasFallbackSurface()) { client_->DelegatedFrameHostGetLayer()->SetFallbackSurfaceId( viz::SurfaceId()); } - if (HasSavedFrame()) { - // Without OOP-D evict the renderer surface so OnFirstSurfaceActivation() - // fires when the renderer submits a new CompositorFrame. - if (!enable_viz_) - GetHostFrameSinkManager()->EvictSurfaces({GetCurrentSurfaceId()}); + if (HasSavedFrame()) frame_evictor_->DiscardedFrame(); - } } ////////////////////////////////////////////////////////////////////////////////
diff --git a/content/browser/renderer_host/delegated_frame_host.h b/content/browser/renderer_host/delegated_frame_host.h index 64fe5d8..d8f5261c 100644 --- a/content/browser/renderer_host/delegated_frame_host.h +++ b/content/browser/renderer_host/delegated_frame_host.h
@@ -87,7 +87,8 @@ void OnCompositingShuttingDown(ui::Compositor* compositor) override; // ui::ContextFactoryObserver implementation. - void OnLostResources() override; + void OnLostSharedContext() override; + void OnLostVizProcess() override; // FrameEvictorClient implementation. void EvictDelegatedFrame() override;
diff --git a/content/browser/renderer_host/render_message_filter.cc b/content/browser/renderer_host/render_message_filter.cc index b551c967..e00d79d 100644 --- a/content/browser/renderer_host/render_message_filter.cc +++ b/content/browser/renderer_host/render_message_filter.cc
@@ -29,6 +29,9 @@ #include "content/browser/cache_storage/cache_storage_cache_handle.h" #include "content/browser/cache_storage/cache_storage_context_impl.h" #include "content/browser/cache_storage/cache_storage_manager.h" +#include "content/browser/child_process_security_policy_impl.h" +#include "content/browser/code_cache/generated_code_cache.h" +#include "content/browser/code_cache/generated_code_cache_context.h" #include "content/browser/gpu/gpu_data_manager_impl.h" #include "content/browser/gpu/gpu_process_host.h" #include "content/browser/loader/resource_dispatcher_host_impl.h" @@ -229,6 +232,40 @@ data.size()); } +void RenderMessageFilter::FetchCachedCode(const GURL& url, + FetchCachedCodeCallback callback) { + GURL requesting_url = + ChildProcessSecurityPolicyImpl::GetInstance()->GetOriginLock( + render_process_id_); + // If the url isn't valid then render process may not be locked to an origin + // yet so we don't allow fetches from code cache. + if (!requesting_url.is_valid() || !url.is_valid()) { + std::move(callback).Run(std::vector<uint8_t>()); + return; + } + + url::Origin requesting_origin = url::Origin::Create(requesting_url); + base::RepeatingCallback<void(scoped_refptr<net::IOBufferWithSize>)> + read_callback = base::BindRepeating( + &RenderMessageFilter::OnReceiveCachedCode, + weak_ptr_factory_.GetWeakPtr(), base::Passed(&callback)); + generated_code_cache_context_->generated_code_cache()->FetchEntry( + url, requesting_origin, read_callback); +} + +void RenderMessageFilter::OnReceiveCachedCode( + FetchCachedCodeCallback callback, + scoped_refptr<net::IOBufferWithSize> buffer) { + if (!buffer) { + std::move(callback).Run(std::vector<uint8_t>()); + return; + } + // TODO(crbug.com/867848): Pass the data as a mojo data pipe instead + // of vector<uint8> + std::vector<uint8_t> data(buffer->data(), buffer->data() + buffer->size()); + std::move(callback).Run(data); +} + void RenderMessageFilter::DidGenerateCacheableMetadataInCacheStorage( const GURL& url, base::Time expected_response_time,
diff --git a/content/browser/renderer_host/render_message_filter.h b/content/browser/renderer_host/render_message_filter.h index 3f9f5e6..4bd7f96 100644 --- a/content/browser/renderer_host/render_message_filter.h +++ b/content/browser/renderer_host/render_message_filter.h
@@ -105,6 +105,7 @@ void DidGenerateCacheableMetadata(const GURL& url, base::Time expected_response_time, const std::vector<uint8_t>& data) override; + void FetchCachedCode(const GURL& url, FetchCachedCodeCallback) override; void DidGenerateCacheableMetadataInCacheStorage( const GURL& url, base::Time expected_response_time, @@ -124,6 +125,8 @@ base::ThreadPriority priority); #endif + void OnReceiveCachedCode(FetchCachedCodeCallback callback, + scoped_refptr<net::IOBufferWithSize> buffer); void OnCacheStorageOpenCallback(const GURL& url, base::Time expected_response_time, scoped_refptr<net::IOBuffer> buf,
diff --git a/content/browser/shared_worker/mock_shared_worker.cc b/content/browser/shared_worker/mock_shared_worker.cc index 829d18dc..9b197d5 100644 --- a/content/browser/shared_worker/mock_shared_worker.cc +++ b/content/browser/shared_worker/mock_shared_worker.cc
@@ -102,6 +102,7 @@ blink::mojom::WorkerContentSettingsProxyPtr content_settings, mojom::ServiceWorkerProviderInfoForSharedWorkerPtr service_worker_provider_info, + int appcache_host_id, network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory_ptr_info, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders,
diff --git a/content/browser/shared_worker/mock_shared_worker.h b/content/browser/shared_worker/mock_shared_worker.h index 7d99113..b871481 100644 --- a/content/browser/shared_worker/mock_shared_worker.h +++ b/content/browser/shared_worker/mock_shared_worker.h
@@ -71,6 +71,7 @@ blink::mojom::WorkerContentSettingsProxyPtr content_settings, mojom::ServiceWorkerProviderInfoForSharedWorkerPtr service_worker_provider_info, + int appcache_host_id, network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory_ptr_info, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders,
diff --git a/content/browser/shared_worker/shared_worker_host.cc b/content/browser/shared_worker/shared_worker_host.cc index aa29ba3..3184042 100644 --- a/content/browser/shared_worker/shared_worker_host.cc +++ b/content/browser/shared_worker/shared_worker_host.cc
@@ -190,8 +190,11 @@ factory_->CreateSharedWorker( std::move(info), pause_on_start, devtools_worker_token, renderer_preferences, std::move(content_settings), - std::move(service_worker_provider_info), std::move(script_loader_factory), - std::move(factory_bundle), std::move(host), std::move(worker_request_), + std::move(service_worker_provider_info), + appcache_handle_ ? appcache_handle_->appcache_host_id() + : kAppCacheNoHostId, + std::move(script_loader_factory), std::move(factory_bundle), + std::move(host), std::move(worker_request_), std::move(interface_provider)); // Monitor the lifetime of the worker.
diff --git a/content/browser/tracing/background_tracing_rule.cc b/content/browser/tracing/background_tracing_rule.cc index b39524d3..88b260a 100644 --- a/content/browser/tracing/background_tracing_rule.cc +++ b/content/browser/tracing/background_tracing_rule.cc
@@ -267,6 +267,12 @@ return; } + // Add the histogram name and its corresponding value to the trace. + TRACE_EVENT_INSTANT2("toplevel", + "BackgroundTracingRule::OnHistogramTrigger", + TRACE_EVENT_SCOPE_THREAD, "histogram_name", + histogram_name, "value", actual_value); + OnHistogramTrigger(histogram_name); }
diff --git a/content/browser/webauth/authenticator_impl.cc b/content/browser/webauth/authenticator_impl.cc index caf24411..4be57bd 100644 --- a/content/browser/webauth/authenticator_impl.cc +++ b/content/browser/webauth/authenticator_impl.cc
@@ -18,6 +18,7 @@ #include "content/browser/bad_message.h" #include "content/browser/webauth/authenticator_type_converters.h" #include "content/public/browser/authenticator_request_client_delegate.h" +#include "content/public/browser/browser_context.h" #include "content/public/browser/content_browser_client.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_frame_host.h" @@ -501,7 +502,7 @@ std::move(authenticator_selection_criteria), base::BindOnce(&AuthenticatorImpl::OnRegisterResponse, weak_factory_.GetWeakPtr()), - base::BindOnce(&AuthenticatorImpl::MaybeCreatePlatformAuthenticator, + base::BindOnce(&AuthenticatorImpl::CreatePlatformAuthenticatorIfAvailable, base::Unretained(this))); } @@ -586,17 +587,31 @@ std::move(alternative_application_parameter)), base::BindOnce(&AuthenticatorImpl::OnSignResponse, weak_factory_.GetWeakPtr()), - base::BindOnce(&AuthenticatorImpl::MaybeCreatePlatformAuthenticator, + base::BindOnce(&AuthenticatorImpl::CreatePlatformAuthenticatorIfAvailable, base::Unretained(this))); } void AuthenticatorImpl::IsUserVerifyingPlatformAuthenticatorAvailable( IsUserVerifyingPlatformAuthenticatorAvailableCallback callback) { - bool result = false; + const bool result = IsUserVerifyingPlatformAuthenticatorAvailableImpl(); + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); +} + +bool AuthenticatorImpl::IsUserVerifyingPlatformAuthenticatorAvailableImpl() { #if defined(OS_MACOSX) - result = device::fido::mac::TouchIdAuthenticator::IsAvailable(); + if (browser_context()->IsOffTheRecord()) { + return false; + } + + // Check whether Touch ID is supported by the hardware and enrolled in the + // OS. Also check whether the (embedder-specific) request delegate provides a + // Touch ID authenticator config. + return device::fido::mac::TouchIdAuthenticator::IsAvailable() && + request_delegate_->GetTouchIdAuthenticatorConfig(); +#else + return false; #endif - std::move(callback).Run(result); } void AuthenticatorImpl::DidFinishNavigation( @@ -810,18 +825,32 @@ echo_appid_extension_ = false; } +BrowserContext* AuthenticatorImpl::browser_context() const { + return content::WebContents::FromRenderFrameHost(render_frame_host_) + ->GetBrowserContext(); +} + std::unique_ptr<device::FidoAuthenticator> -AuthenticatorImpl::MaybeCreatePlatformAuthenticator() { +AuthenticatorImpl::CreatePlatformAuthenticatorIfAvailable() { #if defined(OS_MACOSX) + // Incognito mode disables platform authenticators, so check for availability + // first. + if (!IsUserVerifyingPlatformAuthenticatorAvailableImpl()) { + return nullptr; + } + + // Not all embedders may provide an authenticator config. auto opt_authenticator_config = request_delegate_->GetTouchIdAuthenticatorConfig(); - if (opt_authenticator_config) { - return device::fido::mac::TouchIdAuthenticator::CreateIfAvailable( - std::move(opt_authenticator_config->keychain_access_group), - std::move(opt_authenticator_config->metadata_secret)); + if (!opt_authenticator_config) { + return nullptr; } -#endif // defined(OS_MACOSX) + return device::fido::mac::TouchIdAuthenticator::CreateIfAvailable( + std::move(opt_authenticator_config->keychain_access_group), + std::move(opt_authenticator_config->metadata_secret)); +#else return nullptr; +#endif } } // namespace content
diff --git a/content/browser/webauth/authenticator_impl.h b/content/browser/webauth/authenticator_impl.h index 538b06b5..38688303 100644 --- a/content/browser/webauth/authenticator_impl.h +++ b/content/browser/webauth/authenticator_impl.h
@@ -48,6 +48,7 @@ namespace content { class AuthenticatorRequestClientDelegate; +class BrowserContext; class RenderFrameHost; namespace client_data { @@ -108,6 +109,9 @@ void IsUserVerifyingPlatformAuthenticatorAvailable( IsUserVerifyingPlatformAuthenticatorAvailableCallback callback) override; + // Synchronous implementation of IsUserVerfyingPlatformAuthenticatorAvailable. + bool IsUserVerifyingPlatformAuthenticatorAvailableImpl(); + // WebContentsObserver: void DidFinishNavigation(NavigationHandle* navigation_handle) override; @@ -142,7 +146,10 @@ blink::mojom::GetAssertionAuthenticatorResponsePtr response); void Cleanup(); - std::unique_ptr<device::FidoAuthenticator> MaybeCreatePlatformAuthenticator(); + std::unique_ptr<device::FidoAuthenticator> + CreatePlatformAuthenticatorIfAvailable(); + + BrowserContext* browser_context() const; RenderFrameHost* const render_frame_host_; service_manager::Connector* connector_ = nullptr;
diff --git a/content/common/render_message_filter.mojom b/content/common/render_message_filter.mojom index 15d97f9..4b94587a 100644 --- a/content/common/render_message_filter.mojom +++ b/content/common/render_message_filter.mojom
@@ -31,6 +31,10 @@ mojo_base.mojom.Time expected_response_time, array<uint8> data); + // TODO(crbug.com/867848) Pass the data as mojo data_pipe instead of + // array<unit8>. + FetchCachedCode(url.mojom.Url url) => (array<uint8> data); + // Requests that the browser cache |data| for the specified CacheStorage entry. DidGenerateCacheableMetadataInCacheStorage( url.mojom.Url url, mojo_base.mojom.Time expected_response_time,
diff --git a/content/common/shared_worker/shared_worker_factory.mojom b/content/common/shared_worker/shared_worker_factory.mojom index 50332f4..8995774 100644 --- a/content/common/shared_worker/shared_worker_factory.mojom +++ b/content/common/shared_worker/shared_worker_factory.mojom
@@ -36,11 +36,17 @@ blink.mojom.WorkerContentSettingsProxy content_settings, // S13nServiceWorker: - // The info about the host in the browser process that provides support - // for this shared worker to be a service worker client. Null when - // S13nServiceWorker is disabled. + // The info about the service worker host in the browser process that + // provides support for this shared worker to be a service worker client. + // Null when S13nServiceWorker is disabled. ServiceWorkerProviderInfoForSharedWorker? service_worker_provider_info, + // NetworkService: + // The ID of the AppCacheHost in the browser process that serves resources + // for this shared worker. This is kAppCacheNoHostId when NetworkService + // is disabled or AppCache doesn't serve resources for this shared worker. + int32 appcache_host_id, + // S13nServiceWorker: // The URLLoaderFactory to use to request the shared worker's script // (just the main script resource; importScripts() should go through the
diff --git a/content/public/browser/background_fetch_delegate.h b/content/public/browser/background_fetch_delegate.h index bf9e3ff..10a79b2 100644 --- a/content/public/browser/background_fetch_delegate.h +++ b/content/public/browser/background_fetch_delegate.h
@@ -13,7 +13,9 @@ #include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/optional.h" #include "content/common/content_export.h" +#include "third_party/skia/include/core/SkBitmap.h" class GURL; @@ -118,9 +120,10 @@ virtual void Abort(const std::string& job_unique_id) = 0; // Updates the UI shown for the fetch job associated with |job_unique_id| to - // display a new |title|. + // display a new |title| or |icon|. virtual void UpdateUI(const std::string& job_unique_id, - const std::string& title) = 0; + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) = 0; // Set the client that the delegate should communicate changes to. void SetDelegateClient(base::WeakPtr<Client> client) { client_ = client; }
diff --git a/content/public/test/mock_render_thread.cc b/content/public/test/mock_render_thread.cc index 64e8c08c..2df105a 100644 --- a/content/public/test/mock_render_thread.cc +++ b/content/public/test/mock_render_thread.cc
@@ -72,6 +72,11 @@ NOTREACHED(); } + void FetchCachedCode(const GURL& url, + FetchCachedCodeCallback callback) override { + NOTREACHED(); + } + void DidGenerateCacheableMetadataInCacheStorage( const GURL& url, base::Time expected_response_time,
diff --git a/content/renderer/media/stream/media_stream_audio_processor.cc b/content/renderer/media/stream/media_stream_audio_processor.cc index d71f259..536537cc 100644 --- a/content/renderer/media/stream/media_stream_audio_processor.cc +++ b/content/renderer/media/stream/media_stream_audio_processor.cc
@@ -777,7 +777,8 @@ main_thread_runner_->PostTask( FROM_HERE, - base::BindOnce(&MediaStreamAudioProcessor::UpdateAecStats, this)); + base::BindOnce(&MediaStreamAudioProcessor::UpdateAecStats, + rtc::scoped_refptr<MediaStreamAudioProcessor>(this))); // Return 0 if the volume hasn't been changed, and otherwise the new volume. return (agc->stream_analog_level() == volume) ?
diff --git a/content/renderer/media/webrtc/rtc_peer_connection_handler.cc b/content/renderer/media/webrtc/rtc_peer_connection_handler.cc index 403e6a4..d0ca776 100644 --- a/content/renderer/media/webrtc/rtc_peer_connection_handler.cc +++ b/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
@@ -344,8 +344,10 @@ void OnSuccess(webrtc::SessionDescriptionInterface* desc) override { if (!main_thread_->BelongsToCurrentThread()) { main_thread_->PostTask( - FROM_HERE, base::BindOnce(&CreateSessionDescriptionRequest::OnSuccess, - this, desc)); + FROM_HERE, + base::BindOnce( + &CreateSessionDescriptionRequest::OnSuccess, + rtc::scoped_refptr<CreateSessionDescriptionRequest>(this), desc)); return; } @@ -365,8 +367,11 @@ void OnFailure(webrtc::RTCError error) override { if (!main_thread_->BelongsToCurrentThread()) { main_thread_->PostTask( - FROM_HERE, base::BindOnce(&CreateSessionDescriptionRequest::OnFailure, - this, std::move(error))); + FROM_HERE, + base::BindOnce( + &CreateSessionDescriptionRequest::OnFailure, + rtc::scoped_refptr<CreateSessionDescriptionRequest>(this), + std::move(error))); return; } @@ -443,7 +448,8 @@ main_thread_->PostTaskAndReply( FROM_HERE, - base::BindOnce(&StatsResponse::DeliverCallback, this, + base::BindOnce(&StatsResponse::DeliverCallback, + rtc::scoped_refptr<StatsResponse>(this), base::Unretained(report_copies)), base::BindOnce(&StatsResponse::DeleteReports, base::Unretained(report_copies)));
diff --git a/content/renderer/media/webrtc/rtc_stats.cc b/content/renderer/media/webrtc/rtc_stats.cc index a24ef5bc..8471bdb 100644 --- a/content/renderer/media/webrtc/rtc_stats.cc +++ b/content/renderer/media/webrtc/rtc_stats.cc
@@ -322,8 +322,8 @@ main_thread_->PostTask( FROM_HERE, base::BindOnce( - &RTCStatsCollectorCallbackImpl::OnStatsDeliveredOnMainThread, this, - report)); + &RTCStatsCollectorCallbackImpl::OnStatsDeliveredOnMainThread, + rtc::scoped_refptr<RTCStatsCollectorCallbackImpl>(this), report)); } void RTCStatsCollectorCallbackImpl::OnStatsDeliveredOnMainThread(
diff --git a/content/renderer/media/webrtc/rtc_video_encoder.cc b/content/renderer/media/webrtc/rtc_video_encoder.cc index 69f49db..3ecf311 100644 --- a/content/renderer/media/webrtc/rtc_video_encoder.cc +++ b/content/renderer/media/webrtc/rtc_video_encoder.cc
@@ -322,8 +322,9 @@ return; } input_visible_size_ = input_visible_size; - if (!video_encoder_->Initialize(media::PIXEL_FORMAT_I420, input_visible_size_, - profile, bitrate * 1000, this)) { + const media::VideoEncodeAccelerator::Config config( + media::PIXEL_FORMAT_I420, input_visible_size_, profile, bitrate * 1000); + if (!video_encoder_->Initialize(config, this)) { LogAndNotifyError(FROM_HERE, "Error initializing video_encoder", media::VideoEncodeAccelerator::kInvalidArgumentError); return;
diff --git a/content/renderer/media/webrtc/rtc_video_encoder_unittest.cc b/content/renderer/media/webrtc/rtc_video_encoder_unittest.cc index 2d142d5..460fe99 100644 --- a/content/renderer/media/webrtc/rtc_video_encoder_unittest.cc +++ b/content/renderer/media/webrtc/rtc_video_encoder_unittest.cc
@@ -77,7 +77,7 @@ EXPECT_CALL(*mock_gpu_factories_.get(), DoCreateVideoEncodeAccelerator()) .WillRepeatedly(Return(mock_vea)); - EXPECT_CALL(*mock_vea, Initialize(_, _, _, _, _)) + EXPECT_CALL(*mock_vea, Initialize(_, _)) .WillOnce(Invoke(this, &RTCVideoEncoderTest::Initialize)); EXPECT_CALL(*mock_vea, UseOutputBitstreamBuffer(_)).Times(AtLeast(3)); EXPECT_CALL(*mock_vea, Destroy()).Times(1); @@ -129,15 +129,12 @@ } // media::VideoEncodeAccelerator implementation. - bool Initialize(media::VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - media::VideoCodecProfile output_profile, - uint32_t initial_bitrate, + bool Initialize(const media::VideoEncodeAccelerator::Config& config, media::VideoEncodeAccelerator::Client* client) { DVLOG(3) << __func__; client_ = client; - client_->RequireBitstreamBuffers(0, input_visible_size, - input_visible_size.GetArea()); + client_->RequireBitstreamBuffers(0, config.input_visible_size, + config.input_visible_size.GetArea()); return true; }
diff --git a/content/renderer/media/webrtc/webrtc_audio_renderer.cc b/content/renderer/media/webrtc/webrtc_audio_renderer.cc index c1ea5615..874d23a 100644 --- a/content/renderer/media/webrtc/webrtc_audio_renderer.cc +++ b/content/renderer/media/webrtc/webrtc_audio_renderer.cc
@@ -534,8 +534,10 @@ // object is an exception (bug?). So, to work around that, we need to make // sure we call SetVolume on the signaling thread. signaling_thread_->PostTask( - FROM_HERE, base::BindOnce(&webrtc::AudioSourceInterface::SetVolume, - source, volume)); + FROM_HERE, + base::BindOnce(&webrtc::AudioSourceInterface::SetVolume, + rtc::scoped_refptr<webrtc::AudioSourceInterface>(source), + volume)); } else { source->SetVolume(volume); }
diff --git a/content/renderer/media_recorder/vea_encoder.cc b/content/renderer/media_recorder/vea_encoder.cc index 269eabb..f1de169 100644 --- a/content/renderer/media_recorder/vea_encoder.cc +++ b/content/renderer/media_recorder/vea_encoder.cc
@@ -254,11 +254,10 @@ input_visible_size_ = size; vea_requested_input_coded_size_ = gfx::Size(); video_encoder_ = gpu_factories_->CreateVideoEncodeAccelerator(); - if (!video_encoder_ || - !video_encoder_->Initialize(media::PIXEL_FORMAT_I420, input_visible_size_, - codec_, bits_per_second_, this)) { + const media::VideoEncodeAccelerator::Config config( + media::PIXEL_FORMAT_I420, input_visible_size_, codec_, bits_per_second_); + if (!video_encoder_ || !video_encoder_->Initialize(config, this)) NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); - } } void VEAEncoder::DestroyOnEncodingTaskRunner(
diff --git a/content/renderer/pepper/pepper_video_encoder_host.cc b/content/renderer/pepper/pepper_video_encoder_host.cc index 8c3565b..cf8e633 100644 --- a/content/renderer/pepper/pepper_video_encoder_host.cc +++ b/content/renderer/pepper/pepper_video_encoder_host.cc
@@ -266,10 +266,10 @@ return PP_ERROR_NOTSUPPORTED; initialize_reply_context_ = context->MakeReplyMessageContext(); - if (encoder_->Initialize(media_input_format_, input_size, media_profile, - initial_bitrate, this)) { + const media::VideoEncodeAccelerator::Config config( + media_input_format_, input_size, media_profile, initial_bitrate); + if (encoder_->Initialize(config, this)) return PP_OK_COMPLETIONPENDING; - } initialize_reply_context_ = ppapi::host::ReplyMessageContext(); Close();
diff --git a/content/renderer/pepper/video_encoder_shim.cc b/content/renderer/pepper/video_encoder_shim.cc index a8ce1b77..0c2d9e7 100644 --- a/content/renderer/pepper/video_encoder_shim.cc +++ b/content/renderer/pepper/video_encoder_shim.cc
@@ -97,10 +97,7 @@ explicit EncoderImpl(const base::WeakPtr<VideoEncoderShim>& shim); ~EncoderImpl(); - void Initialize(media::VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - media::VideoCodecProfile output_profile, - uint32_t initial_bitrate); + void Initialize(const media::VideoEncodeAccelerator::Config& config); void Encode(const scoped_refptr<media::VideoFrame>& frame, bool force_keyframe); void UseOutputBitstreamBuffer(const media::BitstreamBuffer& buffer, @@ -158,23 +155,19 @@ vpx_codec_destroy(&encoder_); } -void VideoEncoderShim::EncoderImpl::Initialize( - media::VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - media::VideoCodecProfile output_profile, - uint32_t initial_bitrate) { - gfx::Size coded_size = - media::VideoFrame::PlaneSize(input_format, 0, input_visible_size); +void VideoEncoderShim::EncoderImpl::Initialize(const Config& config) { + gfx::Size coded_size = media::VideoFrame::PlaneSize( + config.input_format, 0, config.input_visible_size); // Only VP9 profile 0 is supported by PPAPI at the moment. VP9 profiles 1-3 // are not supported due to backward compatibility. - DCHECK_NE(output_profile, media::VP9PROFILE_PROFILE1); - DCHECK_NE(output_profile, media::VP9PROFILE_PROFILE2); - DCHECK_NE(output_profile, media::VP9PROFILE_PROFILE3); + DCHECK_NE(config.output_profile, media::VP9PROFILE_PROFILE1); + DCHECK_NE(config.output_profile, media::VP9PROFILE_PROFILE2); + DCHECK_NE(config.output_profile, media::VP9PROFILE_PROFILE3); vpx_codec_iface_t* vpx_codec; int32_t min_quantizer, max_quantizer, cpu_used; - GetVpxCodecParameters(output_profile, &vpx_codec, &min_quantizer, + GetVpxCodecParameters(config.output_profile, &vpx_codec, &min_quantizer, &max_quantizer, &cpu_used); // Populate encoder configuration with default values. @@ -183,15 +176,15 @@ return; } - config_.g_w = input_visible_size.width(); - config_.g_h = input_visible_size.height(); + config_.g_w = config.input_visible_size.width(); + config_.g_h = config.input_visible_size.height(); framerate_ = config_.g_timebase.den; config_.g_lag_in_frames = 0; config_.g_timebase.num = 1; config_.g_timebase.den = base::Time::kMicrosecondsPerSecond; - config_.rc_target_bitrate = initial_bitrate / 1000; + config_.rc_target_bitrate = config.initial_bitrate / 1000; config_.rc_min_quantizer = min_quantizer; config_.rc_max_quantizer = max_quantizer; // Do not saturate CPU utilization just for encoding. On a lower-end system @@ -202,10 +195,10 @@ // Use Q/CQ mode if no target bitrate is given. Note that in the VP8/CQ case // the meaning of rc_target_bitrate changes to target maximum rate. - if (initial_bitrate == 0) { - if (output_profile == media::VP9PROFILE_PROFILE0) { + if (config.initial_bitrate == 0) { + if (config.output_profile == media::VP9PROFILE_PROFILE0) { config_.rc_end_usage = VPX_Q; - } else if (output_profile == media::VP8PROFILE_ANY) { + } else if (config.output_profile == media::VP8PROFILE_ANY) { config_.rc_end_usage = VPX_CQ; config_.rc_target_bitrate = kVp8MaxCQBitrate; } @@ -230,7 +223,7 @@ return; } - if (output_profile == media::VP9PROFILE_PROFILE0) { + if (config.output_profile == media::VP9PROFILE_PROFILE0) { if (vpx_codec_control(&encoder_, VP9E_SET_AQ_MODE, kVp9AqModeCyclicRefresh) != VPX_CODEC_OK) { NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); @@ -408,26 +401,21 @@ } bool VideoEncoderShim::Initialize( - media::VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - media::VideoCodecProfile output_profile, - uint32_t initial_bitrate, + const media::VideoEncodeAccelerator::Config& config, media::VideoEncodeAccelerator::Client* client) { DCHECK(RenderThreadImpl::current()); DCHECK_EQ(client, host_); - if (input_format != media::PIXEL_FORMAT_I420) + if (config.input_format != media::PIXEL_FORMAT_I420) return false; - if (output_profile != media::VP8PROFILE_ANY && - output_profile != media::VP9PROFILE_PROFILE0) + if (config.output_profile != media::VP8PROFILE_ANY && + config.output_profile != media::VP9PROFILE_PROFILE0) return false; media_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&VideoEncoderShim::EncoderImpl::Initialize, - base::Unretained(encoder_impl_.get()), input_format, - input_visible_size, output_profile, initial_bitrate)); + FROM_HERE, base::BindOnce(&VideoEncoderShim::EncoderImpl::Initialize, + base::Unretained(encoder_impl_.get()), config)); return true; }
diff --git a/content/renderer/pepper/video_encoder_shim.h b/content/renderer/pepper/video_encoder_shim.h index e48700b1..771fa5ea 100644 --- a/content/renderer/pepper/video_encoder_shim.h +++ b/content/renderer/pepper/video_encoder_shim.h
@@ -39,10 +39,7 @@ // media::VideoEncodeAccelerator implementation. media::VideoEncodeAccelerator::SupportedProfiles GetSupportedProfiles() override; - bool Initialize(media::VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - media::VideoCodecProfile output_profile, - uint32_t initial_bitrate, + bool Initialize(const media::VideoEncodeAccelerator::Config& config, media::VideoEncodeAccelerator::Client* client) override; void Encode(const scoped_refptr<media::VideoFrame>& frame, bool force_keyframe) override;
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc index ede9e6ca..650d72ea 100644 --- a/content/renderer/renderer_blink_platform_impl.cc +++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -467,6 +467,13 @@ ->DidGenerateCacheableMetadata(url, response_time, copy); } +void RendererBlinkPlatformImpl::FetchCachedCode( + const blink::WebURL& url, + base::OnceCallback<void(const std::vector<uint8_t>&)> callback) { + RenderThreadImpl::current()->render_message_filter()->FetchCachedCode( + url, std::move(callback)); +} + void RendererBlinkPlatformImpl::CacheMetadataInCacheStorage( const blink::WebURL& url, base::Time response_time,
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h index 54f59bc..a303827 100644 --- a/content/renderer/renderer_blink_platform_impl.h +++ b/content/renderer/renderer_blink_platform_impl.h
@@ -83,6 +83,9 @@ base::Time, const char*, size_t) override; + void FetchCachedCode( + const blink::WebURL&, + base::OnceCallback<void(const std::vector<uint8_t>&)>) override; void CacheMetadataInCacheStorage( const blink::WebURL&, base::Time,
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.cc b/content/renderer/shared_worker/embedded_shared_worker_stub.cc index 7e04773..5d5966a 100644 --- a/content/renderer/shared_worker/embedded_shared_worker_stub.cc +++ b/content/renderer/shared_worker/embedded_shared_worker_stub.cc
@@ -53,11 +53,12 @@ : public WebApplicationCacheHostImpl { public: SharedWorkerWebApplicationCacheHostImpl( - blink::WebApplicationCacheHostClient* client) + blink::WebApplicationCacheHostClient* client, + int appcache_host_id) : WebApplicationCacheHostImpl( client, RenderThreadImpl::current()->appcache_dispatcher()->backend_proxy(), - kAppCacheNoHostId) {} + appcache_host_id) {} // Main resource loading is different for workers. The main resource is // loaded by the worker using WorkerClassicScriptLoader. @@ -199,6 +200,7 @@ blink::mojom::WorkerContentSettingsProxyPtr content_settings, mojom::ServiceWorkerProviderInfoForSharedWorkerPtr service_worker_provider_info, + int appcache_host_id, network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory_info, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders, @@ -209,7 +211,13 @@ host_(std::move(host)), name_(info->name), url_(info->url), - renderer_preferences_(renderer_preferences) { + renderer_preferences_(renderer_preferences), + appcache_host_id_(appcache_host_id) { + // The ID of the precreated AppCacheHost can be valid only when the + // NetworkService is enabled. + DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService) || + appcache_host_id == kAppCacheNoHostId); + impl_ = blink::WebSharedWorker::Create(this); if (pause_on_start) { // Pause worker context when it starts and wait until either DevTools client @@ -314,7 +322,8 @@ EmbeddedSharedWorkerStub::CreateApplicationCacheHost( blink::WebApplicationCacheHostClient* client) { std::unique_ptr<WebApplicationCacheHostImpl> host = - std::make_unique<SharedWorkerWebApplicationCacheHostImpl>(client); + std::make_unique<SharedWorkerWebApplicationCacheHostImpl>( + client, appcache_host_id_); app_cache_host_ = host.get(); return std::move(host); }
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.h b/content/renderer/shared_worker/embedded_shared_worker_stub.h index 6014d199..05eb2e6 100644 --- a/content/renderer/shared_worker/embedded_shared_worker_stub.h +++ b/content/renderer/shared_worker/embedded_shared_worker_stub.h
@@ -64,6 +64,7 @@ blink::mojom::WorkerContentSettingsProxyPtr content_settings, mojom::ServiceWorkerProviderInfoForSharedWorkerPtr service_worker_provider_info, + int appcache_host_id, network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory_info, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders, @@ -116,6 +117,7 @@ std::vector<PendingChannel> pending_channels_; ScopedChildProcessReference process_ref_; + const int appcache_host_id_; WebApplicationCacheHostImpl* app_cache_host_ = nullptr; // Not owned. // S13nServiceWorker: The info needed to connect to the
diff --git a/content/renderer/shared_worker/shared_worker_factory_impl.cc b/content/renderer/shared_worker/shared_worker_factory_impl.cc index 48a5091..7f6eaa52 100644 --- a/content/renderer/shared_worker/shared_worker_factory_impl.cc +++ b/content/renderer/shared_worker/shared_worker_factory_impl.cc
@@ -28,6 +28,7 @@ blink::mojom::WorkerContentSettingsProxyPtr content_settings, mojom::ServiceWorkerProviderInfoForSharedWorkerPtr service_worker_provider_info, + int appcache_host_id, network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory_ptr_info, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders, @@ -38,7 +39,7 @@ new EmbeddedSharedWorkerStub( std::move(info), pause_on_start, devtools_worker_token, renderer_preferences, std::move(content_settings), - std::move(service_worker_provider_info), + std::move(service_worker_provider_info), appcache_host_id, std::move(script_loader_factory_ptr_info), std::move(subresource_loaders), std::move(host), std::move(request), std::move(interface_provider)); }
diff --git a/content/renderer/shared_worker/shared_worker_factory_impl.h b/content/renderer/shared_worker/shared_worker_factory_impl.h index 78aef010..226ec923 100644 --- a/content/renderer/shared_worker/shared_worker_factory_impl.h +++ b/content/renderer/shared_worker/shared_worker_factory_impl.h
@@ -29,6 +29,7 @@ blink::mojom::WorkerContentSettingsProxyPtr content_settings, mojom::ServiceWorkerProviderInfoForSharedWorkerPtr service_worker_provider_info, + int appcache_host_id, network::mojom::URLLoaderFactoryAssociatedPtrInfo script_loader_factory_ptr_info, std::unique_ptr<URLLoaderFactoryBundleInfo> subresource_loaders,
diff --git a/content/shell/browser/layout_test/layout_test_background_fetch_delegate.cc b/content/shell/browser/layout_test/layout_test_background_fetch_delegate.cc index fac0ba57..4be2439b 100644 --- a/content/shell/browser/layout_test/layout_test_background_fetch_delegate.cc +++ b/content/shell/browser/layout_test/layout_test_background_fetch_delegate.cc
@@ -223,6 +223,7 @@ void LayoutTestBackgroundFetchDelegate::UpdateUI( const std::string& job_unique_id, - const std::string& title) {} + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) {} } // namespace content
diff --git a/content/shell/browser/layout_test/layout_test_background_fetch_delegate.h b/content/shell/browser/layout_test/layout_test_background_fetch_delegate.h index 40ebe8e..a960a7f 100644 --- a/content/shell/browser/layout_test/layout_test_background_fetch_delegate.h +++ b/content/shell/browser/layout_test/layout_test_background_fetch_delegate.h
@@ -8,6 +8,7 @@ #include <memory> #include "base/macros.h" +#include "base/optional.h" #include "components/download/public/background_service/client.h" #include "content/public/browser/background_fetch_delegate.h" @@ -36,7 +37,8 @@ const net::HttpRequestHeaders& headers) override; void Abort(const std::string& job_unique_id) override; void UpdateUI(const std::string& job_unique_id, - const std::string& title) override; + const base::Optional<std::string>& title, + const base::Optional<SkBitmap>& icon) override; private: class LayoutTestBackgroundFetchDownloadClient;
diff --git a/content/shell/test_runner/BUILD.gn b/content/shell/test_runner/BUILD.gn index 6419cce..2b56e563 100644 --- a/content/shell/test_runner/BUILD.gn +++ b/content/shell/test_runner/BUILD.gn
@@ -115,7 +115,6 @@ "//gpu/command_buffer/client:gles2_interface", "//media/midi:mojo", "//net", - "//services/device/public/cpp/generic_sensor:shared_with_blink", "//services/device/public/mojom", "//skia", "//third_party/blink/public:blink",
diff --git a/content/shell/test_runner/test_common.cc b/content/shell/test_runner/test_common.cc index e89a0b4..8bf67ee7 100644 --- a/content/shell/test_runner/test_common.cc +++ b/content/shell/test_runner/test_common.cc
@@ -78,10 +78,11 @@ } } -blink::WebString V8StringToWebString(v8::Local<v8::String> v8_str) { - int length = v8_str->Utf8Length() + 1; +blink::WebString V8StringToWebString(v8::Isolate* isolate, + v8::Local<v8::String> v8_str) { + int length = v8_str->Utf8Length(isolate) + 1; std::unique_ptr<char[]> chars(new char[length]); - v8_str->WriteUtf8(chars.get(), length); + v8_str->WriteUtf8(isolate, chars.get(), length); return blink::WebString::FromUTF8(chars.get()); }
diff --git a/content/shell/test_runner/test_common.h b/content/shell/test_runner/test_common.h index 040b42f..20887b6 100644 --- a/content/shell/test_runner/test_common.h +++ b/content/shell/test_runner/test_common.h
@@ -31,7 +31,8 @@ const char* WebNavigationPolicyToString( const blink::WebNavigationPolicy& policy); -blink::WebString V8StringToWebString(v8::Local<v8::String> v8_str); +blink::WebString V8StringToWebString(v8::Isolate* isolate, + v8::Local<v8::String> v8_str); } // namespace test_runner
diff --git a/content/shell/test_runner/test_runner.cc b/content/shell/test_runner/test_runner.cc index 0aa3eca3..1fced00 100644 --- a/content/shell/test_runner/test_runner.cc +++ b/content/shell/test_runner/test_runner.cc
@@ -38,8 +38,6 @@ #include "gin/handle.h" #include "gin/object_template_builder.h" #include "gin/wrappable.h" -#include "services/device/public/cpp/generic_sensor/motion_data.h" -#include "services/device/public/cpp/generic_sensor/orientation_data.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_registration.h" #include "third_party/blink/public/platform/web_data.h" #include "third_party/blink/public/platform/web_point.h" @@ -2173,7 +2171,7 @@ } else if (key == "WebKitDefaultTextEncodingName") { v8::Isolate* isolate = blink::MainThreadIsolate(); prefs->default_text_encoding_name = - V8StringToWebString(value->ToString(isolate)); + V8StringToWebString(isolate, value->ToString(isolate)); } else if (key == "WebKitJavaScriptEnabled") { prefs->java_script_enabled = value->BooleanValue(); } else if (key == "WebKitSupportsMultipleWindows") {
diff --git a/content/shell/test_runner/test_runner_for_specific_view.cc b/content/shell/test_runner/test_runner_for_specific_view.cc index 21a227d..dce1c04b 100644 --- a/content/shell/test_runner/test_runner_for_specific_view.cc +++ b/content/shell/test_runner/test_runner_for_specific_view.cc
@@ -592,8 +592,8 @@ WebSecurityOrigin web_origin; if (origin->IsString()) { - web_origin = WebSecurityOrigin::CreateFromString( - V8StringToWebString(origin.As<v8::String>())); + web_origin = WebSecurityOrigin::CreateFromString(V8StringToWebString( + blink::MainThreadIsolate(), origin.As<v8::String>())); } web_view()->FocusedFrame()->SetIsolatedWorldSecurityOrigin(world_id, web_origin);
diff --git a/content/test/layouttest_support.cc b/content/test/layouttest_support.cc index f762f44..c8bac12 100644 --- a/content/test/layouttest_support.cc +++ b/content/test/layouttest_support.cc
@@ -50,8 +50,6 @@ #include "content/shell/test_runner/web_view_test_proxy.h" #include "content/shell/test_runner/web_widget_test_proxy.h" #include "gpu/ipc/service/image_transport_surface.h" -#include "services/device/public/cpp/generic_sensor/motion_data.h" -#include "services/device/public/cpp/generic_sensor/orientation_data.h" #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h" #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h" #include "third_party/blink/public/platform/web_float_rect.h" @@ -75,8 +73,6 @@ #include "ui/gfx/win/direct_write.h" #endif -using device::MotionData; -using device::OrientationData; using blink::WebRect; using blink::WebSize;
diff --git a/device/BUILD.gn b/device/BUILD.gn index a36c191..60b2c45 100644 --- a/device/BUILD.gn +++ b/device/BUILD.gn
@@ -163,8 +163,6 @@ "test/test_device_client.h", "usb/mojo/device_impl_unittest.cc", "usb/mojo/device_manager_impl_unittest.cc", - "usb/mojo/mock_permission_provider.cc", - "usb/mojo/mock_permission_provider.h", "usb/public/cpp/filter_utils_unittest.cc", "usb/usb_descriptors_unittest.cc", "usb/usb_device_handle_unittest.cc", @@ -178,6 +176,7 @@ "//device/usb", "//device/usb:test_support", "//device/usb/mojo", + "//device/usb/mojo:test_support", "//device/usb/public/cpp", "//device/usb/public/mojom", "//net:test_support",
diff --git a/device/fido/mac/authenticator.h b/device/fido/mac/authenticator.h index 5030f64..89a3c54e 100644 --- a/device/fido/mac/authenticator.h +++ b/device/fido/mac/authenticator.h
@@ -21,6 +21,11 @@ public: // IsAvailable returns whether Touch ID is available and enrolled on the // current device. + // + // Note that this may differ from the result of + // AuthenticatorImpl::IsUserVerifyingPlatformAuthenticatorAvailable, which + // also checks whether the embedder supports this authenticator, and if the + // request occurs from an off-the-record/incognito context. static bool IsAvailable(); // CreateIfAvailable returns a TouchIdAuthenticator if IsAvailable() returns @@ -36,9 +41,8 @@ ~TouchIdAuthenticator() override; // FidoAuthenticator - void MakeCredential( - CtapMakeCredentialRequest request, - MakeCredentialCallback callback) override; + void MakeCredential(CtapMakeCredentialRequest request, + MakeCredentialCallback callback) override; void GetAssertion(CtapGetAssertionRequest request, GetAssertionCallback callback) override; void Cancel() override;
diff --git a/device/usb/mojo/BUILD.gn b/device/usb/mojo/BUILD.gn index 0a556a86..e9f3308f 100644 --- a/device/usb/mojo/BUILD.gn +++ b/device/usb/mojo/BUILD.gn
@@ -23,3 +23,24 @@ "//net", ] } + +static_library("test_support") { + testonly = true + + sources = [ + "mock_permission_provider.cc", + "mock_permission_provider.h", + ] + + deps = [ + "//base", + "//device/usb:usb", + "//device/usb/mojo:mojo", + "//device/usb/public/mojom", + "//testing/gtest", + ] + + public_deps = [ + "//testing/gmock", + ] +}
diff --git a/device/usb/mojo/mock_permission_provider.cc b/device/usb/mojo/mock_permission_provider.cc index 6906880..7d4d20b1 100644 --- a/device/usb/mojo/mock_permission_provider.cc +++ b/device/usb/mojo/mock_permission_provider.cc
@@ -7,6 +7,7 @@ #include <stddef.h> #include <utility> +#include "base/strings/utf_string_conversions.h" #include "device/usb/public/mojom/device.mojom.h" using ::testing::Return; @@ -15,12 +16,19 @@ namespace device { namespace usb { -MockPermissionProvider::MockPermissionProvider() : weak_factory_(this) { - ON_CALL(*this, HasDevicePermission(_)).WillByDefault(Return(true)); -} +const char MockPermissionProvider::kRestrictedSerialNumber[] = "no_permission"; + +MockPermissionProvider::MockPermissionProvider() : weak_factory_(this) {} MockPermissionProvider::~MockPermissionProvider() = default; +bool MockPermissionProvider::HasDevicePermission( + scoped_refptr<const UsbDevice> device) const { + return device->serial_number() == base::ASCIIToUTF16(kRestrictedSerialNumber) + ? false + : true; +} + base::WeakPtr<PermissionProvider> MockPermissionProvider::GetWeakPtr() { return weak_factory_.GetWeakPtr(); }
diff --git a/device/usb/mojo/mock_permission_provider.h b/device/usb/mojo/mock_permission_provider.h index c558323..dc34ac33 100644 --- a/device/usb/mojo/mock_permission_provider.h +++ b/device/usb/mojo/mock_permission_provider.h
@@ -17,12 +17,14 @@ class MockPermissionProvider : public PermissionProvider { public: + static const char kRestrictedSerialNumber[]; + MockPermissionProvider(); ~MockPermissionProvider() override; base::WeakPtr<PermissionProvider> GetWeakPtr(); - MOCK_CONST_METHOD1(HasDevicePermission, - bool(scoped_refptr<const UsbDevice> device)); + bool HasDevicePermission( + scoped_refptr<const UsbDevice> device) const override; MOCK_METHOD0(IncrementConnectionCount, void()); MOCK_METHOD0(DecrementConnectionCount, void()); @@ -34,4 +36,4 @@ } // namespace usb } // namespace device -#endif // DEVICE_USB_MOCK_MOJO_PERMISSION_PROVIDER_H_ +#endif // DEVICE_USB_MOJO_MOCK_PERMISSION_PROVIDER_H_
diff --git a/device/vr/oculus/oculus_device.cc b/device/vr/oculus/oculus_device.cc index eeb68ee..adccd7e 100644 --- a/device/vr/oculus/oculus_device.cc +++ b/device/vr/oculus/oculus_device.cc
@@ -105,6 +105,11 @@ OculusDevice::~OculusDevice() { StopOvrSession(); + // Wait for the render loop to stop before completing destruction. This will + // ensure that bindings are closed on the correct thread. + if (render_loop_ && render_loop_->IsRunning()) + render_loop_->Stop(); + device::GamepadDataFetcherManager::GetInstance()->RemoveSourceFactory( device::GAMEPAD_SOURCE_OCULUS); data_fetcher_ = nullptr;
diff --git a/device/vr/openvr/openvr_device.cc b/device/vr/openvr/openvr_device.cc index e3d4aa2..e74618a 100644 --- a/device/vr/openvr/openvr_device.cc +++ b/device/vr/openvr/openvr_device.cc
@@ -166,7 +166,7 @@ // Wait for the render loop to stop before completing destruction. This will // ensure that the IVRSystem doesn't get shutdown until the render loop is no // longer referencing it. - if (render_loop_->IsRunning()) + if (render_loop_ && render_loop_->IsRunning()) render_loop_->Stop(); }
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn index a6a1539..ebee53e 100644 --- a/extensions/browser/BUILD.gn +++ b/extensions/browser/BUILD.gn
@@ -538,6 +538,7 @@ "api/networking_private/networking_private_chromeos_unittest.cc", "api/power/power_api_unittest.cc", "api/runtime/restart_after_delay_api_unittest.cc", + "api/socket/mojo_data_pump_unittest.cc", "api/sockets_tcp/sockets_tcp_api_unittest.cc", "api/sockets_udp/sockets_udp_api_unittest.cc", "api/storage/settings_quota_unittest.cc",
diff --git a/extensions/browser/api/socket/mojo_data_pump.cc b/extensions/browser/api/socket/mojo_data_pump.cc index fdc22f73..1500136 100644 --- a/extensions/browser/api/socket/mojo_data_pump.cc +++ b/extensions/browser/api/socket/mojo_data_pump.cc
@@ -69,28 +69,24 @@ DCHECK(read_callback_); DCHECK_NE(0u, read_size_); - if (result != MOJO_RESULT_OK) { - read_size_ = 0; - std::move(read_callback_).Run(net::ERR_FAILED, nullptr); - return; - } - uint32_t num_bytes = read_size_; - auto io_buffer = - base::MakeRefCounted<net::IOBuffer>(static_cast<size_t>(num_bytes)); - result = receive_stream_->ReadData(io_buffer->data(), &num_bytes, - MOJO_READ_DATA_FLAG_NONE); - if (result != MOJO_RESULT_OK) { - read_size_ = 0; - std::move(read_callback_).Run(net::ERR_FAILED, nullptr); - return; - } + scoped_refptr<net::IOBuffer> io_buffer; + if (result == MOJO_RESULT_OK) { + io_buffer = + base::MakeRefCounted<net::IOBuffer>(static_cast<size_t>(num_bytes)); + result = receive_stream_->ReadData(io_buffer->data(), &num_bytes, + MOJO_READ_DATA_FLAG_NONE); + } if (result == MOJO_RESULT_SHOULD_WAIT) { receive_stream_watcher_.ArmOrNotify(); return; } read_size_ = 0; + if (result != MOJO_RESULT_OK) { + std::move(read_callback_).Run(net::ERR_FAILED, nullptr); + return; + } std::move(read_callback_).Run(num_bytes, io_buffer); } @@ -99,8 +95,10 @@ DCHECK(write_callback_); uint32_t num_bytes = pending_write_buffer_size_; - result = send_stream_->WriteData(pending_write_buffer_->data(), &num_bytes, - MOJO_WRITE_DATA_FLAG_NONE); + if (result == MOJO_RESULT_OK) { + result = send_stream_->WriteData(pending_write_buffer_->data(), &num_bytes, + MOJO_WRITE_DATA_FLAG_NONE); + } if (result == MOJO_RESULT_SHOULD_WAIT) { send_stream_watcher_.ArmOrNotify(); return;
diff --git a/extensions/browser/api/socket/mojo_data_pump_unittest.cc b/extensions/browser/api/socket/mojo_data_pump_unittest.cc new file mode 100644 index 0000000..c6512cf --- /dev/null +++ b/extensions/browser/api/socket/mojo_data_pump_unittest.cc
@@ -0,0 +1,107 @@ +// Copyright 2018 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 "extensions/browser/api/socket/mojo_data_pump.h" + +#include <memory> +#include <utility> +#include <string> + +#include "base/run_loop.h" +#include "base/test/bind_test_util.h" +#include "base/test/scoped_task_environment.h" +#include "mojo/public/cpp/system/data_pipe.h" +#include "net/base/test_completion_callback.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace extensions { + +// Tests that if |MojoDataPump::receive_stream_| is not ready, MojoDataPump will +// wait and not error out. +TEST(MojoDataPumpTest, ReceiveStreamNotReady) { + base::test::ScopedTaskEnvironment scoped_task_environment; + mojo::DataPipe receive_pipe; + mojo::DataPipe send_pipe; + auto pump = + std::make_unique<MojoDataPump>(std::move(receive_pipe.consumer_handle), + std::move(send_pipe.producer_handle)); + std::string data("dummy"); + base::RunLoop run_loop; + bool callback_called = false; + pump->Read(10 /*count*/, + base::BindLambdaForTesting( + [&](int result, scoped_refptr<net::IOBuffer> io_buffer) { + callback_called = true; + ASSERT_EQ(static_cast<int>(data.size()), result); + EXPECT_EQ(data, + std::string(io_buffer->data(), result)); + run_loop.Quit(); + })); + + // Spin the message loop so that MojoDataPump::ReceiveMore() is called but the + // callback will not be executed yet because there is no data to read. + base::RunLoop().RunUntilIdle(); + EXPECT_FALSE(callback_called); + + mojo::ScopedDataPipeProducerHandle receive_pipe_producer = + std::move(receive_pipe.producer_handle); + + uint32_t num_bytes = data.size(); + // WriteData() completes synchronously because |data| is much smaller than + // data pipe's internal buffer. + MojoResult r = receive_pipe_producer->WriteData(data.data(), &num_bytes, + MOJO_WRITE_DATA_FLAG_NONE); + ASSERT_EQ(MOJO_RESULT_OK, r); + ASSERT_EQ(data.size(), num_bytes); + + // Now pump->Read() should complete. + run_loop.Run(); + EXPECT_TRUE(callback_called); +} + +// Tests that if |MojoDataPump::receive_stream_| is closed, an error is +// propagated. +TEST(MojoDataPumpTest, ReceiveStreamClosed) { + base::test::ScopedTaskEnvironment scoped_task_environment; + mojo::DataPipe receive_pipe; + mojo::DataPipe send_pipe; + auto pump = + std::make_unique<MojoDataPump>(std::move(receive_pipe.consumer_handle), + std::move(send_pipe.producer_handle)); + base::RunLoop run_loop; + pump->Read(10 /*count*/, + base::BindLambdaForTesting( + [&](int result, scoped_refptr<net::IOBuffer> io_buffer) { + EXPECT_EQ(net::ERR_FAILED, result); + EXPECT_EQ(nullptr, io_buffer); + run_loop.Quit(); + })); + + mojo::ScopedDataPipeProducerHandle receive_pipe_producer = + std::move(receive_pipe.producer_handle); + receive_pipe_producer.reset(); + + // Now pump->Read() should complete. + run_loop.Run(); +} + +// Tests that if |MojoDataPump::send_stream_| is closed, Write() will fail. +TEST(MojoDataPumpTest, SendStreamClosed) { + base::test::ScopedTaskEnvironment scoped_task_environment; + mojo::DataPipe receive_pipe; + mojo::DataPipe send_pipe; + auto pump = + std::make_unique<MojoDataPump>(std::move(receive_pipe.consumer_handle), + std::move(send_pipe.producer_handle)); + scoped_refptr<net::StringIOBuffer> write_buffer = + base::MakeRefCounted<net::StringIOBuffer>("dummy"); + net::TestCompletionCallback callback; + mojo::ScopedDataPipeConsumerHandle send_pipe_consumer = + std::move(send_pipe.consumer_handle); + send_pipe_consumer.reset(); + pump->Write(write_buffer.get(), write_buffer->size(), callback.callback()); + EXPECT_EQ(net::ERR_FAILED, callback.WaitForResult()); +} + +} // namespace extensions
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 9ff1ebd..402b3919 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1325,6 +1325,8 @@ USERSPRIVATE_GETLOGINSTATUS = 1262, FILEMANAGERPRIVATEINTERNAL_INSTALLLINUXPACKAGE = 1263, VIRTUALKEYBOARDPRIVATE_SETHITTESTBOUNDS = 1264, + ARCAPPSPRIVATE_GETLAUNCHABLEAPPS = 1265, + ARCAPPSPRIVATE_LAUNCHAPP = 1266, // Last entry: Add new entries above, then run: // python tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/extensions/common/BUILD.gn b/extensions/common/BUILD.gn index d8d9299..c663e07b37 100644 --- a/extensions/common/BUILD.gn +++ b/extensions/common/BUILD.gn
@@ -403,6 +403,7 @@ "manifest_handlers/shared_module_manifest_unittest.cc", "message_bundle_unittest.cc", "one_shot_event_unittest.cc", + "permissions/api_permission_unittest.cc", "permissions/api_permission_set_unittest.cc", "permissions/manifest_permission_set_unittest.cc", "permissions/socket_permission_unittest.cc", @@ -442,5 +443,10 @@ if (is_chromeos) { sources += [ "manifest_handlers/action_handlers_handler_unittest.cc" ] } + + data = [ + "//extensions/common/permissions/api_permission.h", + "//tools/metrics/histograms/enums.xml", + ] } } # enable_extensions
diff --git a/extensions/common/permissions/api_permission.h b/extensions/common/permissions/api_permission.h index da8e29a..8281f3f 100644 --- a/extensions/common/permissions/api_permission.h +++ b/extensions/common/permissions/api_permission.h
@@ -37,229 +37,230 @@ // PermissionID. enum ID { // Error codes. - kInvalid, - kUnknown, + kInvalid = 0, + kUnknown = 1, // Actual permission IDs. Not all of these are valid permissions on their // own; some are just needed by various manifest permissions to represent // their permission message rule combinations. - kAccessibilityFeaturesModify, - kAccessibilityFeaturesRead, - kAccessibilityPrivate, - kActiveTab, - kActivityLogPrivate, - kAlarms, - kAlphaEnabled, - kAlwaysOnTopWindows, - kAppView, - kAudio, - kAudioCapture, - kDeleted_AudioModem, - kAutofillPrivate, - kAutomation, - kAutoTestPrivate, - kBackground, - kBluetoothPrivate, - kBookmark, - kBookmarkManagerPrivate, - kBrailleDisplayPrivate, - kBrowser, - kBrowsingData, - kCast, - kCastStreaming, - kChromeosInfoPrivate, - kClipboardRead, - kClipboardWrite, - kCloudPrintPrivate, - kCommandLinePrivate, - kCommandsAccessibility, - kContentSettings, - kContextMenus, - kCookie, - kDeleted_Copresence, - kDeleted_CopresencePrivate, - kCryptotokenPrivate, - kDataReductionProxy, - kDiagnostics, - kDeleted_Dial, // API removed. - kDebugger, - kDeclarative, - kDeclarativeContent, - kDeclarativeWebRequest, - kDesktopCapture, - kDesktopCapturePrivate, - kDeveloperPrivate, - kDevtools, - kDns, - kDocumentScan, - kDownloads, - kDownloadsInternal, - kDownloadsOpen, - kDownloadsShelf, - kEasyUnlockPrivate, - kEchoPrivate, - kEmbeddedExtensionOptions, - kEnterprisePlatformKeys, - kEnterprisePlatformKeysPrivate, - kDeleted_ExperienceSamplingPrivate, - kExperimental, - kExtensionView, - kExternallyConnectableAllUrls, - kFeedbackPrivate, - kFileBrowserHandler, - kFileBrowserHandlerInternal, - kFileManagerPrivate, - kFileSystem, - kFileSystemDirectory, - kFileSystemProvider, - kFileSystemRequestFileSystem, - kFileSystemRetainEntries, - kFileSystemWrite, - kDeleted_FileSystemWriteDirectory, - kFirstRunPrivate, - kFontSettings, - kFullscreen, - kDeleted_GcdPrivate, - kGcm, - kGeolocation, - kHid, - kHistory, - kHomepage, - kHotwordPrivate, - kIdentity, - kIdentityEmail, - kIdentityPrivate, - kIdltest, - kIdle, - kImeWindowEnabled, - kInlineInstallPrivate, - kInput, - kInputMethodPrivate, - kDeleted_InterceptAllKeys, - kLauncherSearchProvider, - kLocation, - kDeleted_LogPrivate, - kManagement, - kMediaGalleries, - kMediaPlayerPrivate, - kMediaRouterPrivate, - kMetricsPrivate, - kMDns, - kMusicManagerPrivate, - kNativeMessaging, - kNetworkingConfig, - kNetworkingPrivate, - kDeleted_NotificationProvider, - kNotifications, - kOverrideEscFullscreen, - kPageCapture, - kPointerLock, - kPlatformKeys, - kDeleted_Plugin, - kPower, - kPreferencesPrivate, - kDeleted_PrincipalsPrivate, - kPrinterProvider, - kPrivacy, - kProcesses, - kProxy, - kImageWriterPrivate, - kDeleted_ReadingListPrivate, - kRtcPrivate, - kSearchProvider, - kSearchEnginesPrivate, - kSerial, - kSessions, - kSettingsPrivate, - kSignedInDevices, - kSocket, - kStartupPages, - kStorage, - kStreamsPrivate, - kSyncFileSystem, - kSystemPrivate, - kSystemDisplay, - kSystemStorage, - kTab, - kTabCapture, - kTabCaptureForTab, - kTerminalPrivate, - kTopSites, - kTts, - kTtsEngine, - kUnlimitedStorage, - kU2fDevices, - kUsb, - kUsbDevice, - kVideoCapture, - kVirtualKeyboardPrivate, - kVpnProvider, - kWallpaper, - kWallpaperPrivate, - kWebcamPrivate, - kWebConnectable, // for externally_connectable manifest key - kWebNavigation, - kWebRequest, - kWebRequestBlocking, - kWebrtcAudioPrivate, - kWebrtcDesktopCapturePrivate, - kWebrtcLoggingPrivate, - kWebstorePrivate, - kWebstoreWidgetPrivate, - kWebView, - kWindowShape, - kScreenlockPrivate, - kSystemCpu, - kSystemMemory, - kSystemNetwork, - kSystemInfoCpu, - kSystemInfoMemory, - kBluetooth, - kBluetoothDevices, - kFavicon, - kFullAccess, - kHostReadOnly, - kHostReadWrite, - kHostsAll, - kHostsAllReadOnly, - kMediaGalleriesAllGalleriesCopyTo, - kMediaGalleriesAllGalleriesDelete, - kMediaGalleriesAllGalleriesRead, - kNetworkState, - kOverrideBookmarksUI, - kShouldWarnAllHosts, - kSocketAnyHost, - kSocketDomainHosts, - kSocketSpecificHosts, - kDeleted_UsbDeviceList, - kUsbDeviceUnknownProduct, - kUsbDeviceUnknownVendor, - kUsersPrivate, - kPasswordsPrivate, - kLanguageSettingsPrivate, - kEnterpriseDeviceAttributes, - kCertificateProvider, - kResourcesPrivate, - kDisplaySource, - kClipboard, - kNetworkingOnc, - kVirtualKeyboard, - kNetworkingCastPrivate, - kMediaPerceptionPrivate, - kLockScreen, - kNewTabPageOverride, - kDeclarativeNetRequest, - kLockWindowFullscreenPrivate, - kWebrtcLoggingPrivateAudioDebug, - kEnterpriseReportingPrivate, - kCecPrivate, - kSafeBrowsingPrivate, - kFileSystemRequestDownloads, - kSystemPowerSource, + kAccessibilityFeaturesModify = 2, + kAccessibilityFeaturesRead = 3, + kAccessibilityPrivate = 4, + kActiveTab = 5, + kActivityLogPrivate = 6, + kAlarms = 7, + kAlphaEnabled = 8, + kAlwaysOnTopWindows = 9, + kAppView = 10, + kAudio = 11, + kAudioCapture = 12, + kDeleted_AudioModem = 13, + kAutofillPrivate = 14, + kAutomation = 15, + kAutoTestPrivate = 16, + kBackground = 17, + kBluetoothPrivate = 18, + kBookmark = 19, + kBookmarkManagerPrivate = 20, + kBrailleDisplayPrivate = 21, + kBrowser = 22, + kBrowsingData = 23, + kCast = 24, + kCastStreaming = 25, + kChromeosInfoPrivate = 26, + kClipboardRead = 27, + kClipboardWrite = 28, + kCloudPrintPrivate = 29, + kCommandLinePrivate = 30, + kCommandsAccessibility = 31, + kContentSettings = 32, + kContextMenus = 33, + kCookie = 34, + kDeleted_Copresence = 35, + kDeleted_CopresencePrivate = 36, + kCryptotokenPrivate = 37, + kDataReductionProxy = 38, + kDiagnostics = 39, + kDeleted_Dial = 40, // API removed. + kDebugger = 41, + kDeclarative = 42, + kDeclarativeContent = 43, + kDeclarativeWebRequest = 44, + kDesktopCapture = 45, + kDesktopCapturePrivate = 46, + kDeveloperPrivate = 47, + kDevtools = 48, + kDns = 49, + kDocumentScan = 50, + kDownloads = 51, + kDownloadsInternal = 52, + kDownloadsOpen = 53, + kDownloadsShelf = 54, + kEasyUnlockPrivate = 55, + kEchoPrivate = 56, + kEmbeddedExtensionOptions = 57, + kEnterprisePlatformKeys = 58, + kEnterprisePlatformKeysPrivate = 59, + kDeleted_ExperienceSamplingPrivate = 60, + kExperimental = 61, + kExtensionView = 62, + kExternallyConnectableAllUrls = 63, + kFeedbackPrivate = 64, + kFileBrowserHandler = 65, + kFileBrowserHandlerInternal = 66, + kFileManagerPrivate = 67, + kFileSystem = 68, + kFileSystemDirectory = 69, + kFileSystemProvider = 70, + kFileSystemRequestFileSystem = 71, + kFileSystemRetainEntries = 72, + kFileSystemWrite = 73, + kDeleted_FileSystemWriteDirectory = 74, + kFirstRunPrivate = 75, + kFontSettings = 76, + kFullscreen = 77, + kDeleted_GcdPrivate = 78, + kGcm = 79, + kGeolocation = 80, + kHid = 81, + kHistory = 82, + kHomepage = 83, + kHotwordPrivate = 84, + kIdentity = 85, + kIdentityEmail = 86, + kIdentityPrivate = 87, + kIdltest = 88, + kIdle = 89, + kImeWindowEnabled = 90, + kInlineInstallPrivate = 91, + kInput = 92, + kInputMethodPrivate = 93, + kDeleted_InterceptAllKeys = 94, + kLauncherSearchProvider = 95, + kLocation = 96, + kDeleted_LogPrivate = 97, + kManagement = 98, + kMediaGalleries = 99, + kMediaPlayerPrivate = 100, + kMediaRouterPrivate = 101, + kMetricsPrivate = 102, + kMDns = 103, + kMusicManagerPrivate = 104, + kNativeMessaging = 105, + kNetworkingConfig = 106, + kNetworkingPrivate = 107, + kDeleted_NotificationProvider = 108, + kNotifications = 109, + kOverrideEscFullscreen = 110, + kPageCapture = 111, + kPointerLock = 112, + kPlatformKeys = 113, + kDeleted_Plugin = 114, + kPower = 115, + kPreferencesPrivate = 116, + kDeleted_PrincipalsPrivate = 117, + kPrinterProvider = 118, + kPrivacy = 119, + kProcesses = 120, + kProxy = 121, + kImageWriterPrivate = 122, + kDeleted_ReadingListPrivate = 123, + kRtcPrivate = 124, + kSearchProvider = 125, + kSearchEnginesPrivate = 126, + kSerial = 127, + kSessions = 128, + kSettingsPrivate = 129, + kSignedInDevices = 130, + kSocket = 131, + kStartupPages = 132, + kStorage = 133, + kStreamsPrivate = 134, + kSyncFileSystem = 135, + kSystemPrivate = 136, + kSystemDisplay = 137, + kSystemStorage = 138, + kTab = 139, + kTabCapture = 140, + kTabCaptureForTab = 141, + kTerminalPrivate = 142, + kTopSites = 143, + kTts = 144, + kTtsEngine = 145, + kUnlimitedStorage = 146, + kU2fDevices = 147, + kUsb = 148, + kUsbDevice = 149, + kVideoCapture = 150, + kVirtualKeyboardPrivate = 151, + kVpnProvider = 152, + kWallpaper = 153, + kWallpaperPrivate = 154, + kWebcamPrivate = 155, + kWebConnectable = 156, // for externally_connectable manifest key + kWebNavigation = 157, + kWebRequest = 158, + kWebRequestBlocking = 159, + kWebrtcAudioPrivate = 160, + kWebrtcDesktopCapturePrivate = 161, + kWebrtcLoggingPrivate = 162, + kWebstorePrivate = 163, + kWebstoreWidgetPrivate = 164, + kWebView = 165, + kWindowShape = 166, + kScreenlockPrivate = 167, + kSystemCpu = 168, + kSystemMemory = 169, + kSystemNetwork = 170, + kSystemInfoCpu = 171, + kSystemInfoMemory = 172, + kBluetooth = 173, + kBluetoothDevices = 174, + kFavicon = 175, + kFullAccess = 176, + kHostReadOnly = 177, + kHostReadWrite = 178, + kHostsAll = 179, + kHostsAllReadOnly = 180, + kMediaGalleriesAllGalleriesCopyTo = 181, + kMediaGalleriesAllGalleriesDelete = 182, + kMediaGalleriesAllGalleriesRead = 183, + kNetworkState = 184, + kOverrideBookmarksUI = 185, + kShouldWarnAllHosts = 186, + kSocketAnyHost = 187, + kSocketDomainHosts = 188, + kSocketSpecificHosts = 189, + kDeleted_UsbDeviceList = 190, + kUsbDeviceUnknownProduct = 191, + kUsbDeviceUnknownVendor = 192, + kUsersPrivate = 193, + kPasswordsPrivate = 194, + kLanguageSettingsPrivate = 195, + kEnterpriseDeviceAttributes = 196, + kCertificateProvider = 197, + kResourcesPrivate = 198, + kDisplaySource = 199, + kClipboard = 200, + kNetworkingOnc = 201, + kVirtualKeyboard = 202, + kNetworkingCastPrivate = 203, + kMediaPerceptionPrivate = 204, + kLockScreen = 205, + kNewTabPageOverride = 206, + kDeclarativeNetRequest = 207, + kLockWindowFullscreenPrivate = 208, + kWebrtcLoggingPrivateAudioDebug = 209, + kEnterpriseReportingPrivate = 210, + kCecPrivate = 211, + kSafeBrowsingPrivate = 212, + kFileSystemRequestDownloads = 213, + kSystemPowerSource = 214, + kArcAppsPrivate = 215, // Last entry: Add new entries above and ensure to update the // "ExtensionPermission3" enum in tools/metrics/histograms/histograms.xml // (by running update_extension_permission.py). - kEnumBoundary + kEnumBoundary, }; struct CheckParam {
diff --git a/extensions/common/permissions/api_permission_unittest.cc b/extensions/common/permissions/api_permission_unittest.cc new file mode 100644 index 0000000..3d50eba2 --- /dev/null +++ b/extensions/common/permissions/api_permission_unittest.cc
@@ -0,0 +1,55 @@ +// Copyright 2018 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 "extensions/common/permissions/api_permission.h" + +#include <map> +#include <set> +#include <string> + +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/path_service.h" +#include "base/strings/stringprintf.h" +#include "base/test/metrics/histogram_enum_reader.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace extensions { + +// Tests that the ExtensionPermission3 enum in enums.xml exactly matches the +// APIPermission::ID enum in C++. +TEST(ExtensionAPIPermissionTest, CheckEnums) { + base::Optional<base::HistogramEnumEntryMap> enums = + base::ReadEnumFromEnumsXml("ExtensionPermission3"); + ASSERT_TRUE(enums); + // The number of enums in the histogram entry should be equal to the number of + // enums in the C++ file. + EXPECT_EQ(enums->size(), APIPermission::kEnumBoundary); + + base::FilePath src_root; + ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &src_root)); + base::FilePath permission_histogram_value = + src_root.AppendASCII("extensions") + .AppendASCII("common") + .AppendASCII("permissions") + .AppendASCII("api_permission.h"); + ASSERT_TRUE(base::PathExists(permission_histogram_value)); + + std::string file_contents; + ASSERT_TRUE( + base::ReadFileToString(permission_histogram_value, &file_contents)); + + for (const auto& entry : *enums) { + // Check that the C++ file has a definition equal to the histogram file. + // For now, we do this in a simple, but reasonably effective, manner: + // expecting to find the string "ENTRY = <value>" somewhere in the file. + std::string expected_string = + base::StringPrintf("%s = %d", entry.second.c_str(), entry.first); + EXPECT_NE(std::string::npos, file_contents.find(expected_string)) + << "Failed to find entry " << entry.second << " with value " + << entry.first; + } +} + +} // namespace extensions
diff --git a/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder_vea.cc b/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder_vea.cc index 9eefe06e..df6fdc4 100644 --- a/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder_vea.cc +++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_video_encoder_vea.cc
@@ -124,9 +124,9 @@ WiFiDisplayVideoEncoderVEA::InitOnMediaThread(const InitParameters& params) { media::VideoCodecProfile profile = (params.profile == wds::CHP) ? media::H264PROFILE_HIGH : media::H264PROFILE_BASELINE; - bool success = - vea_->Initialize(media::PIXEL_FORMAT_I420, params.frame_size, - profile, params.bit_rate, this); + const media::VideoEncodeAccelerator::Config config( + media::PIXEL_FORMAT_I420, params.frame_size, profile, params.bit_rate); + bool success = vea_->Initialize(config, this); if (success) return this;
diff --git a/extensions/shell/installer/linux/BUILD.gn b/extensions/shell/installer/linux/BUILD.gn index 1f07d353..bd60b49 100644 --- a/extensions/shell/installer/linux/BUILD.gn +++ b/extensions/shell/installer/linux/BUILD.gn
@@ -136,6 +136,10 @@ "//ppapi/native_client:irt", ] } + + if (!libcpp_is_static && use_custom_libcxx) { + public_deps += [ "//buildtools/third_party/libc++:libc++" ] + } } # Creates .deb installer package. @@ -162,6 +166,10 @@ ] } + if (!libcpp_is_static && use_custom_libcxx) { + packaging_files_binaries += [ "$root_out_dir/libc++.so" ] + } + deb_target_name = "${target_name}_deb" action(deb_target_name) { visibility = [ ":*" ]
diff --git a/extensions/strings/extensions_strings_el.xtb b/extensions/strings/extensions_strings_el.xtb index d6c41479..eb44d67 100644 --- a/extensions/strings/extensions_strings_el.xtb +++ b/extensions/strings/extensions_strings_el.xtb
@@ -56,7 +56,7 @@ <translation id="7003844668372540529">Άγνωστο προϊόν <ph name="PRODUCT_ID" /> από <ph name="VENDOR_NAME" /></translation> <translation id="7068383018033524534">Το αρχείο μανιφέστου δεν είναι έγκυρο</translation> <translation id="7217838517480956708">Ο διαχειριστής αυτού του υπολογιστή απαιτεί την εγκατάσταση της επέκτασης <ph name="EXTENSION_NAME" />. Δεν είναι δυνατή η κατάργηση ή η τροποποίησή της.</translation> -<translation id="7939686037314084444">Δεν ήταν δυνατή η σωστή φόρτωσης της επέκτασης. Μπορεί να μην είναι σε θέση να ματαιώνει αιτήματα δικτύου.</translation> +<translation id="7939686037314084444">Δεν ήταν δυνατή η σωστή φόρτωσης της επέκτασης. Μπορεί να μην είναι σε θέση να λαμβάνει αιτήματα δικτύου.</translation> <translation id="7972881773422714442">Επιλογές: <ph name="EXTENSIONOPTIONS_TAG_NAME" /></translation> <translation id="8035920974645200807">Μπροστινή κάμερα</translation> <translation id="8047248493720652249">Η επέκταση δεν κατόρθωσε να ονομάσει τη λήψη "<ph name="ATTEMPTED_FILENAME" />" επειδή μια άλλη επέκταση (<ph name="EXTENSION_NAME" />) καθόρισε ένα διαφορετικό όνομα "<ph name="ACTUAL_FILENAME" />".</translation>
diff --git a/gin/v8_initializer.cc b/gin/v8_initializer.cc index be2b9149..cf51b27 100644 --- a/gin/v8_initializer.cc +++ b/gin/v8_initializer.cc
@@ -243,10 +243,10 @@ v8::V8::InitializePlatform(V8Platform::Get()); - if (base::FeatureList::IsEnabled(features::kV8OptimizeJavascript)) { - static const char optimize[] = "--opt"; - v8::V8::SetFlagsFromString(optimize, sizeof(optimize) - 1); - } else { + if (!base::FeatureList::IsEnabled(features::kV8OptimizeJavascript)) { + // We avoid explicitly passing --opt if kV8OptimizeJavascript is enabled + // since it is the default, and doing so would override flags passed + // explicitly, e.g., via --js-flags=--no-opt. static const char no_optimize[] = "--no-opt"; v8::V8::SetFlagsFromString(no_optimize, sizeof(no_optimize) - 1); }
diff --git a/google_apis/gcm/BUILD.gn b/google_apis/gcm/BUILD.gn index bc2bef948..97642da9 100644 --- a/google_apis/gcm/BUILD.gn +++ b/google_apis/gcm/BUILD.gn
@@ -66,10 +66,9 @@ deps = [ "//base", "//base/third_party/dynamic_annotations", - "//mojo/public/cpp/system:system", "//net", + "//services/network:network_service", "//services/network/public/cpp", - "//services/network/public/mojom", "//third_party/leveldatabase", "//url", ] @@ -108,7 +107,6 @@ ] deps = [ "//base", - "//mojo/public/cpp/system:system", "//net", "//net:test_support", "//testing/gtest", @@ -166,10 +164,8 @@ "//base", "//base/test:test_support", "//mojo/core/embedder", - "//mojo/public/cpp/system:system", "//net", "//net:test_support", - "//services/network:network_service", "//services/network:test_support", "//testing/gtest", "//third_party/protobuf:protobuf_lite",
diff --git a/google_apis/gcm/DEPS b/google_apis/gcm/DEPS index ad4f5f8..a044cbe8 100644 --- a/google_apis/gcm/DEPS +++ b/google_apis/gcm/DEPS
@@ -11,5 +11,4 @@ "+net", "+third_party/leveldatabase", "+services/network", - "+mojo/public/cpp", ]
diff --git a/google_apis/gcm/base/socket_stream.cc b/google_apis/gcm/base/socket_stream.cc index 964005c..6674d9c 100644 --- a/google_apis/gcm/base/socket_stream.cc +++ b/google_apis/gcm/base/socket_stream.cc
@@ -21,22 +21,15 @@ } // namespace -SocketInputStream::SocketInputStream(mojo::ScopedDataPipeConsumerHandle stream) - : stream_(std::move(stream)), - stream_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL), - read_size_(0), +SocketInputStream::SocketInputStream(net::StreamSocket* socket) + : socket_(socket), io_buffer_(new net::IOBuffer(kDefaultBufferSize)), - read_buffer_( - new net::DrainableIOBuffer(io_buffer_.get(), kDefaultBufferSize)), + read_buffer_(new net::DrainableIOBuffer(io_buffer_.get(), + kDefaultBufferSize)), next_pos_(0), last_error_(net::OK), weak_ptr_factory_(this) { - stream_watcher_.Watch( - stream_.get(), - MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, - MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED, - base::BindRepeating(&SocketInputStream::ReadMore, - base::Unretained(this))); + DCHECK(socket->IsConnected()); } SocketInputStream::~SocketInputStream() { @@ -92,74 +85,39 @@ return read_buffer_->BytesConsumed() - next_pos_; } -net::Error SocketInputStream::Refresh(base::OnceClosure callback, +net::Error SocketInputStream::Refresh(const base::Closure& callback, int byte_limit) { - DCHECK(!read_callback_); DCHECK_NE(GetState(), CLOSED); DCHECK_NE(GetState(), READING); DCHECK_GT(byte_limit, 0); if (byte_limit > read_buffer_->BytesRemaining()) { LOG(ERROR) << "Out of buffer space, closing input stream."; - CloseStream(net::ERR_FILE_TOO_BIG); + CloseStream(net::ERR_FILE_TOO_BIG, base::Closure()); return net::OK; } - read_size_ = byte_limit; - read_callback_ = std::move(callback); - stream_watcher_.ArmOrNotify(); - last_error_ = net::ERR_IO_PENDING; - return net::ERR_IO_PENDING; -} - -void SocketInputStream::ReadMore( - MojoResult result, - const mojo::HandleSignalsState& /* ignored */) { - DCHECK(read_callback_); - DCHECK_NE(0u, read_size_); - - uint32_t num_bytes = read_size_; - if (result == MOJO_RESULT_OK) { - DVLOG(1) << "Refreshing input stream, limit of " << num_bytes << " bytes."; - result = stream_->ReadData(read_buffer_->data(), &num_bytes, - MOJO_READ_DATA_FLAG_NONE); - DVLOG(1) << "Read returned mojo result" << result; + if (!socket_->IsConnected()) { + LOG(ERROR) << "Socket was disconnected, closing input stream"; + CloseStream(net::ERR_CONNECTION_CLOSED, base::Closure()); + return net::OK; } - if (result == MOJO_RESULT_SHOULD_WAIT) { - stream_watcher_.ArmOrNotify(); - return; + DVLOG(1) << "Refreshing input stream, limit of " << byte_limit << " bytes."; + int result = + socket_->Read(read_buffer_.get(), + byte_limit, + base::Bind(&SocketInputStream::RefreshCompletionCallback, + weak_ptr_factory_.GetWeakPtr(), + callback)); + DVLOG(1) << "Read returned " << result; + if (result == net::ERR_IO_PENDING) { + last_error_ = net::ERR_IO_PENDING; + return net::ERR_IO_PENDING; } - read_size_ = 0; - if (result != MOJO_RESULT_OK) { - CloseStream(net::ERR_FAILED); - std::move(read_callback_).Run(); - return; - } - - // If an EOF has been received, close the stream. - if (result == MOJO_RESULT_OK && num_bytes == 0) { - CloseStream(net::ERR_CONNECTION_CLOSED); - std::move(read_callback_).Run(); - return; - } - - // If an error occurred before the completion callback could complete, ignore - // the result. - if (GetState() == CLOSED) - return; - - last_error_ = net::OK; - read_buffer_->DidConsume(num_bytes); - // TODO(zea): investigating crbug.com/409985 - CHECK_GT(UnreadByteCount(), 0); - - DVLOG(1) << "Refresh complete with " << num_bytes << " new bytes. " - << "Current position " << next_pos_ << " of " - << read_buffer_->BytesConsumed() << "."; - - std::move(read_callback_).Run(); + RefreshCompletionCallback(base::Closure(), result); + return net::OK; } void SocketInputStream::RebuildBuffer() { @@ -204,6 +162,39 @@ return READY; } +void SocketInputStream::RefreshCompletionCallback( + const base::Closure& callback, int result) { + // If an error occurred before the completion callback could complete, ignore + // the result. + if (GetState() == CLOSED) + return; + + // Result == 0 implies EOF, which is treated as an error. + if (result == 0) + result = net::ERR_CONNECTION_CLOSED; + + DCHECK_NE(result, net::ERR_IO_PENDING); + + if (result < net::OK) { + DVLOG(1) << "Failed to refresh socket: " << result; + CloseStream(static_cast<net::Error>(result), callback); + return; + } + + DCHECK_GT(result, 0); + last_error_ = net::OK; + read_buffer_->DidConsume(result); + // TODO(zea): investigating crbug.com/409985 + CHECK_GT(UnreadByteCount(), 0); + + DVLOG(1) << "Refresh complete with " << result << " new bytes. " + << "Current position " << next_pos_ + << " of " << read_buffer_->BytesConsumed() << "."; + + if (!callback.is_null()) + callback.Run(); +} + void SocketInputStream::ResetInternal() { read_buffer_->SetOffset(0); next_pos_ = 0; @@ -211,27 +202,26 @@ weak_ptr_factory_.InvalidateWeakPtrs(); // Invalidate any callbacks. } -void SocketInputStream::CloseStream(net::Error error) { +void SocketInputStream::CloseStream(net::Error error, + const base::Closure& callback) { DCHECK_LT(error, net::ERR_IO_PENDING); ResetInternal(); last_error_ = error; LOG(ERROR) << "Closing stream with result " << error; + if (!callback.is_null()) + callback.Run(); } SocketOutputStream::SocketOutputStream( - mojo::ScopedDataPipeProducerHandle stream) - : stream_(std::move(stream)), - stream_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::MANUAL), + net::StreamSocket* socket, + const net::NetworkTrafficAnnotationTag& traffic_annotation) + : socket_(socket), io_buffer_(new net::IOBufferWithSize(kDefaultBufferSize)), next_pos_(0), last_error_(net::OK), + traffic_annotation_(traffic_annotation), weak_ptr_factory_(this) { - stream_watcher_.Watch( - stream_.get(), - MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, - MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED, - base::BindRepeating(&SocketOutputStream::WriteMore, - base::Unretained(this))); + DCHECK(socket->IsConnected()); } SocketOutputStream::~SocketOutputStream() { @@ -264,8 +254,7 @@ return next_pos_; } -net::Error SocketOutputStream::Flush(base::OnceClosure callback) { - DCHECK(!write_callback_); +net::Error SocketOutputStream::Flush(const base::Closure& callback) { DCHECK_EQ(GetState(), READY); if (!write_buffer_) { @@ -273,52 +262,27 @@ io_buffer_.get(), next_pos_); } - last_error_ = net::ERR_IO_PENDING; - stream_watcher_.ArmOrNotify(); - write_callback_ = std::move(callback); - return net::ERR_IO_PENDING; -} + if (!socket_->IsConnected()) { + LOG(ERROR) << "Socket was disconnected, closing output stream"; + last_error_ = net::ERR_CONNECTION_CLOSED; + return net::OK; + } -void SocketOutputStream::WriteMore(MojoResult result, - const mojo::HandleSignalsState& state) { - DCHECK(write_callback_); - DCHECK(write_buffer_); + DVLOG(1) << "Flushing " << write_buffer_->BytesRemaining() + << " bytes into socket."; + int result = + socket_->Write(write_buffer_.get(), write_buffer_->BytesRemaining(), + base::Bind(&SocketOutputStream::FlushCompletionCallback, + weak_ptr_factory_.GetWeakPtr(), callback), + traffic_annotation_); + DVLOG(1) << "Write returned " << result; + if (result == net::ERR_IO_PENDING) { + last_error_ = net::ERR_IO_PENDING; + return net::ERR_IO_PENDING; + } - uint32_t num_bytes = write_buffer_->BytesRemaining(); - DVLOG(1) << "Flushing " << num_bytes << " bytes into socket."; - if (result == MOJO_RESULT_OK) { - result = stream_->WriteData(write_buffer_->data(), &num_bytes, - MOJO_WRITE_DATA_FLAG_NONE); - } - if (result == MOJO_RESULT_SHOULD_WAIT) { - stream_watcher_.ArmOrNotify(); - return; - } - if (result != MOJO_RESULT_OK) { - LOG(ERROR) << "Failed to flush socket."; - last_error_ = net::ERR_FAILED; - std::move(write_callback_).Run(); - return; - } - DVLOG(1) << "Wrote " << num_bytes; - // If an error occurred before the completion callback could complete, ignore - // the result. - if (GetState() == CLOSED) - return; - - DCHECK_GE(num_bytes, 0u); - last_error_ = net::OK; - write_buffer_->DidConsume(num_bytes); - if (write_buffer_->BytesRemaining() > 0) { - DVLOG(1) << "Partial flush complete. Retrying."; - // Only a partial write was completed. Flush again to finish the write. - Flush(std::move(write_callback_)); - return; - } - DVLOG(1) << "Socket flush complete."; - write_buffer_ = nullptr; - next_pos_ = 0; - std::move(write_callback_).Run(); + FlushCompletionCallback(base::Closure(), result); + return net::OK; } SocketOutputStream::State SocketOutputStream::GetState() const{ @@ -339,4 +303,43 @@ return last_error_; } +void SocketOutputStream::FlushCompletionCallback( + const base::Closure& callback, int result) { + // If an error occurred before the completion callback could complete, ignore + // the result. + if (GetState() == CLOSED) + return; + + // Result == 0 implies EOF, which is treated as an error. + if (result == 0) + result = net::ERR_CONNECTION_CLOSED; + + DCHECK_NE(result, net::ERR_IO_PENDING); + + if (result < net::OK) { + LOG(ERROR) << "Failed to flush socket."; + last_error_ = static_cast<net::Error>(result); + if (!callback.is_null()) + callback.Run(); + return; + } + + DCHECK_GT(result, net::OK); + last_error_ = net::OK; + write_buffer_->DidConsume(result); + + if (write_buffer_->BytesRemaining() > 0) { + DVLOG(1) << "Partial flush complete. Retrying."; + // Only a partial write was completed. Flush again to finish the write. + Flush(callback); + return; + } + + DVLOG(1) << "Socket flush complete."; + write_buffer_ = nullptr; + next_pos_ = 0; + if (!callback.is_null()) + callback.Run(); +} + } // namespace gcm
diff --git a/google_apis/gcm/base/socket_stream.h b/google_apis/gcm/base/socket_stream.h index 63556b2..c68acd00 100644 --- a/google_apis/gcm/base/socket_stream.h +++ b/google_apis/gcm/base/socket_stream.h
@@ -2,15 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Protobuf ZeroCopy[Input/Output]Stream implementations capable of using -// mojo data pipes. Built to work with Protobuf CodedStreams. +// Protobuf ZeroCopy[Input/Output]Stream implementations capable of using a +// net::StreamSocket. Built to work with Protobuf CodedStreams. #ifndef GOOGLE_APIS_GCM_BASE_SOCKET_STREAM_H_ #define GOOGLE_APIS_GCM_BASE_SOCKET_STREAM_H_ #include <stdint.h> -#include "base/callback.h" #include "base/callback_forward.h" #include "base/compiler_specific.h" #include "base/macros.h" @@ -18,21 +17,24 @@ #include "base/memory/weak_ptr.h" #include "google/protobuf/io/zero_copy_stream.h" #include "google_apis/gcm/base/gcm_export.h" -#include "mojo/public/cpp/system/data_pipe.h" -#include "mojo/public/cpp/system/simple_watcher.h" #include "net/base/net_errors.h" +#include "net/traffic_annotation/network_traffic_annotation.h" namespace net { class DrainableIOBuffer; class IOBuffer; class IOBufferWithSize; +class StreamSocket; } // namespace net namespace gcm { -// A helper class for interacting with a mojo consumer pipe that is receiving -// protobuf encoded messages. If an error is encounters, the input stream will -// store the error in |last_error_|, and GetState() will be set to CLOSED. +// A helper class for interacting with a net::StreamSocket that is receiving +// protobuf encoded messages. A SocketInputStream does not take ownership of +// the socket itself, and it is expected that the life of the input stream +// should match the life of the socket itself (while the socket remains +// connected). If an error is encounters, the input stream will store the error +// in |last_error_|, and GetState() will be set to CLOSED. // Typical usage: // 1. Check the GetState() of the input stream before using it. If CLOSED, the // input stream must be rebuilt (and the socket likely needs to be @@ -64,7 +66,7 @@ }; // |socket| should already be connected. - explicit SocketInputStream(mojo::ScopedDataPipeConsumerHandle stream); + explicit SocketInputStream(net::StreamSocket* socket); ~SocketInputStream() override; // ZeroCopyInputStream implementation. @@ -83,7 +85,7 @@ // net::OK without invoking callback. // Note: GetState() (and possibly last_error()) should be checked upon // completion to determine whether the Refresh encountered an error. - net::Error Refresh(base::OnceClosure callback, int byte_limit); + net::Error Refresh(const base::Closure& callback, int byte_limit); // Rebuilds the buffer state by copying over any unread data to the beginning // of the buffer and resetting the buffer read/write positions. @@ -92,9 +94,7 @@ void RebuildBuffer(); // Returns the last fatal error encountered. Only valid if GetState() == - // CLOSED. Note that all network read errors will be reported as - // net::ERR_FAILED, because mojo data pipe doesn't allow surfacing a more - // specific error code. + // CLOSED. net::Error last_error() const; // Returns the current state. @@ -104,17 +104,15 @@ // Clears the local state. void ResetInternal(); - void ReadMore(MojoResult result, const mojo::HandleSignalsState& state); + // Callback for Socket::Read calls. + void RefreshCompletionCallback(const base::Closure& callback, int result); // Permanently closes the stream. - void CloseStream(net::Error error); + void CloseStream(net::Error error, const base::Closure& callback); // Internal net components. - mojo::ScopedDataPipeConsumerHandle stream_; - mojo::SimpleWatcher stream_watcher_; - uint32_t read_size_; + net::StreamSocket* const socket_; const scoped_refptr<net::IOBuffer> io_buffer_; - base::OnceClosure read_callback_; // IOBuffer implementation that wraps the data within |io_buffer_| that hasn't // been written to yet by Socket::Read calls. const scoped_refptr<net::DrainableIOBuffer> read_buffer_; @@ -133,16 +131,19 @@ DISALLOW_COPY_AND_ASSIGN(SocketInputStream); }; -// A helper class for writing to a mojo producer handle with protobuf encoded -// data. Typical usage: +// A helper class for writing to a SocketStream with protobuf encoded data. +// A SocketOutputStream does not take ownership of the socket itself, and it is +// expected that the life of the output stream should match the life of the +// socket itself (while the socket remains connected). +// Typical usage: // 1. Check the GetState() of the output stream before using it. If CLOSED, the // output stream must be rebuilt (and the socket likely needs to be // reconnected, as an error was encountered). // 2. If EMPTY, the output stream can be written via a CodedOutputStream using // the ZeroCopyOutputStream interface. // 3. Once done writing, GetState() should be READY, so call Flush(..) to write -// the buffer into the mojo producer handle. Wait for the callback to be -// invoked (it's invalid to write to an output stream while it's flushing). +// the buffer into the StreamSocket. Wait for the callback to be invoked +// (it's invalid to write to an output stream while it's flushing). // 4. Check the GetState() again to ensure the Flush was successful. GetState() // should be EMPTY again. // 5. Repeat. @@ -160,7 +161,10 @@ CLOSED, }; - explicit SocketOutputStream(mojo::ScopedDataPipeProducerHandle stream); + // |socket| should already be connected. + SocketOutputStream( + net::StreamSocket* socket, + const net::NetworkTrafficAnnotationTag& traffic_annotation); ~SocketOutputStream() override; // ZeroCopyOutputStream implementation. @@ -169,24 +173,20 @@ int64_t ByteCount() const override; // Writes the buffer into the Socket. - net::Error Flush(base::OnceClosure callback); + net::Error Flush(const base::Closure& callback); // Returns the last fatal error encountered. Only valid if GetState() == - // CLOSED. Note that All network read errors will be reported as - // net::ERR_FAILED, because mojo data pipe doesn't allow surfacing a more - // specific error code. + // CLOSED. net::Error last_error() const; // Returns the current state. State GetState() const; private: - void WriteMore(MojoResult result, const mojo::HandleSignalsState& state); + void FlushCompletionCallback(const base::Closure& callback, int result); // Internal net components. - mojo::ScopedDataPipeProducerHandle stream_; - mojo::SimpleWatcher stream_watcher_; - base::OnceClosure write_callback_; + net::StreamSocket* const socket_; const scoped_refptr<net::IOBufferWithSize> io_buffer_; // IOBuffer implementation that wraps the data within |io_buffer_| that hasn't // been written to the socket yet. @@ -201,6 +201,11 @@ // Note: last_error_ == net::ERR_IO_PENDING implies GetState() == FLUSHING. net::Error last_error_; + // Network traffic annotation for downstream socket write. SocketOutputStream + // is not reused, hence annotation can be added in constructor and used in all + // subsequent writes. + const net::NetworkTrafficAnnotationTag traffic_annotation_; + base::WeakPtrFactory<SocketOutputStream> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(SocketOutputStream);
diff --git a/google_apis/gcm/base/socket_stream_unittest.cc b/google_apis/gcm/base/socket_stream_unittest.cc index b386443..7da26d1 100644 --- a/google_apis/gcm/base/socket_stream_unittest.cc +++ b/google_apis/gcm/base/socket_stream_unittest.cc
@@ -16,16 +16,10 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/string_piece.h" -#include "base/test/bind_test_util.h" -#include "base/test/scoped_task_environment.h" #include "net/base/ip_address.h" #include "net/log/net_log_source.h" #include "net/socket/socket_test_util.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" -#include "net/url_request/url_request_test_util.h" -#include "services/network/network_context.h" -#include "services/network/network_service.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" #include "testing/gtest/include/gtest/gtest.h" namespace gcm { @@ -41,6 +35,77 @@ const char kWriteData[] = "write_data"; const int kWriteDataSize = arraysize(kWriteData) - 1; +// A net::StreamSocket that returns a partial write only for the first time. +class FirstWritePartialSocket : public net::StreamSocket { + public: + FirstWritePartialSocket() {} + ~FirstWritePartialSocket() override {} + + // Returns the data that is actually written to the socket. + const std::string& actual_data_written() { return actual_data_written_; } + + // net::Socket implementation. + int Write( + net::IOBuffer* buf, + int buf_len, + net::CompletionOnceCallback callback, + const net::NetworkTrafficAnnotationTag& traffic_annotation) override { + // Make the first write as a partial write. + if (!write_invoked_) { + write_invoked_ = true; + actual_data_written_.append(buf->data(), buf_len / 2); + return buf_len / 2; + } + // For subsequent writes, write everything that caller has passed to us. + actual_data_written_.append(buf->data(), buf_len); + return buf_len; + } + int Read(net::IOBuffer* buf, + int buf_len, + net::CompletionOnceCallback callback) override { + return net::ERR_IO_PENDING; + } + int ReadIfReady(net::IOBuffer* buf, + int buf_len, + net::CompletionOnceCallback callback) override { + return net::ERR_IO_PENDING; + } + int CancelReadIfReady() override { return net::OK; } + int SetReceiveBufferSize(int32_t size) override { return net::OK; } + int SetSendBufferSize(int32_t size) override { return net::OK; } + + // net::StreamSocket implementation. + int Connect(net::CompletionOnceCallback callback) override { return net::OK; } + void Disconnect() override {} + bool IsConnected() const override { return true; } + bool IsConnectedAndIdle() const override { return true; }; + int GetPeerAddress(net::IPEndPoint* address) const override { + return net::OK; + } + int GetLocalAddress(net::IPEndPoint* address) const override { + return net::OK; + } + const net::NetLogWithSource& NetLog() const override { return net_log_; } + bool WasEverUsed() const override { return true; } + bool WasAlpnNegotiated() const override { return false; } + net::NextProto GetNegotiatedProtocol() const override { + return net::kProtoUnknown; + } + bool GetSSLInfo(net::SSLInfo* ssl_info) override { return false; } + void GetConnectionAttempts(net::ConnectionAttempts* out) const override {} + void ClearConnectionAttempts() override {} + void AddConnectionAttempts(const net::ConnectionAttempts& attempts) override { + } + int64_t GetTotalReceivedBytes() const override { return 0; } + void ApplySocketTag(const net::SocketTag& tag) override {} + + private: + net::NetLogWithSource net_log_; + std::string actual_data_written_; + // Whether Write() has been invoked before. + bool write_invoked_ = false; +}; + class GCMSocketStreamTest : public testing::Test { public: GCMSocketStreamTest(); @@ -54,21 +119,19 @@ // Simulates a google::protobuf::io::CodedInputStream read. base::StringPiece DoInputStreamRead(int bytes); - // Simulates a google::protobuf::io::CodedOutputStream write. int DoOutputStreamWrite(const base::StringPiece& write_src); - // Simulates a google::protobuf::io::CodedOutputStream write, but do not call - // flush. - int DoOutputStreamWriteWithoutFlush(const base::StringPiece& write_src); - // Synchronous Refresh wrapper. void WaitForData(int msg_size); + base::MessageLoop* message_loop() { return &message_loop_; }; + net::StaticSocketDataProvider* data_provider() { + return data_provider_.get(); + } SocketInputStream* input_stream() { return socket_input_stream_.get(); } SocketOutputStream* output_stream() { return socket_output_stream_.get(); } - - network::mojom::ProxyResolvingSocketPtr mojo_socket_ptr_; + net::StreamSocket* socket() { return socket_.get(); } void set_socket_output_stream(std::unique_ptr<SocketOutputStream> stream) { socket_output_stream_ = std::move(stream); @@ -79,42 +142,26 @@ void ResetInputStream(); void ResetOutputStream(); - base::test::ScopedTaskEnvironment scoped_task_environment_; + void ConnectCallback(int result); // SocketStreams and their data providers. ReadList mock_reads_; WriteList mock_writes_; std::unique_ptr<net::StaticSocketDataProvider> data_provider_; - std::unique_ptr<net::SSLSocketDataProvider> ssl_data_provider_; std::unique_ptr<SocketInputStream> socket_input_stream_; std::unique_ptr<SocketOutputStream> socket_output_stream_; // net:: components. - net::AddressList address_list_; - std::unique_ptr<network::NetworkService> network_service_; - network::mojom::NetworkContextPtr network_context_ptr_; + std::unique_ptr<net::StreamSocket> socket_; net::MockClientSocketFactory socket_factory_; - net::TestURLRequestContext url_request_context_; - std::unique_ptr<network::NetworkContext> network_context_; - network::mojom::ProxyResolvingSocketFactoryPtr mojo_socket_factory_ptr_; - mojo::ScopedDataPipeConsumerHandle receive_pipe_handle_; - mojo::ScopedDataPipeProducerHandle send_pipe_handle_; + net::AddressList address_list_; + + base::MessageLoopForIO message_loop_; }; -GCMSocketStreamTest::GCMSocketStreamTest() - : scoped_task_environment_( - base::test::ScopedTaskEnvironment::MainThreadType::IO), - network_service_(network::NetworkService::CreateForTesting()), - url_request_context_(true /* delay_initialization */) { +GCMSocketStreamTest::GCMSocketStreamTest() { address_list_ = net::AddressList::CreateFromIPAddress( net::IPAddress::IPv4Localhost(), 5228); - socket_factory_.set_enable_read_if_ready(true); - url_request_context_.set_client_socket_factory(&socket_factory_); - url_request_context_.Init(); - - network_context_ = std::make_unique<network::NetworkContext>( - network_service_.get(), mojo::MakeRequest(&network_context_ptr_), - &url_request_context_); } GCMSocketStreamTest::~GCMSocketStreamTest() {} @@ -123,12 +170,9 @@ const WriteList& write_list) { mock_reads_ = read_list; mock_writes_ = write_list; - data_provider_ = std::make_unique<net::StaticSocketDataProvider>( - mock_reads_, mock_writes_); - ssl_data_provider_ = - std::make_unique<net::SSLSocketDataProvider>(net::SYNCHRONOUS, net::OK); + data_provider_.reset( + new net::StaticSocketDataProvider(mock_reads_, mock_writes_)); socket_factory_.AddSocketDataProvider(data_provider_.get()); - socket_factory_.AddSSLSocketDataProvider(ssl_data_provider_.get()); OpenConnection(); ResetInputStream(); ResetOutputStream(); @@ -170,23 +214,11 @@ int GCMSocketStreamTest::DoOutputStreamWrite( const base::StringPiece& write_src) { - int total_bytes_written = DoOutputStreamWriteWithoutFlush(write_src); - base::RunLoop run_loop; - if (socket_output_stream_->Flush(run_loop.QuitClosure()) == - net::ERR_IO_PENDING) { - run_loop.Run(); - } - - return total_bytes_written; -} - -int GCMSocketStreamTest::DoOutputStreamWriteWithoutFlush( - const base::StringPiece& write_src) { DCHECK_EQ(socket_output_stream_->GetState(), SocketOutputStream::EMPTY); int total_bytes_written = 0; - void* buffer = nullptr; + void* buffer = NULL; int size = 0; - const int bytes = write_src.size(); + int bytes = write_src.size(); do { if (!socket_output_stream_->Next(&buffer, &size)) @@ -200,6 +232,12 @@ total_bytes_written += bytes_to_write; } while (total_bytes_written < bytes); + base::RunLoop run_loop; + if (socket_output_stream_->Flush(run_loop.QuitClosure()) == + net::ERR_IO_PENDING) { + run_loop.Run(); + } + return total_bytes_written; } @@ -217,49 +255,33 @@ } void GCMSocketStreamTest::OpenConnection() { - network_context_->CreateProxyResolvingSocketFactory( - mojo::MakeRequest(&mojo_socket_factory_ptr_)); - base::RunLoop run_loop; - int net_error = net::ERR_FAILED; - const GURL kDestination("https://example.com"); - mojo_socket_factory_ptr_->CreateProxyResolvingSocket( - kDestination, true /* use_tls */, - net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS), - mojo::MakeRequest(&mojo_socket_ptr_), - base::BindLambdaForTesting( - [&](int result, const base::Optional<net::IPEndPoint>& local_addr, - const base::Optional<net::IPEndPoint>& peer_addr, - mojo::ScopedDataPipeConsumerHandle receive_pipe_handle, - mojo::ScopedDataPipeProducerHandle send_pipe_handle) { - net_error = result; - receive_pipe_handle_ = std::move(receive_pipe_handle); - send_pipe_handle_ = std::move(send_pipe_handle); - run_loop.Quit(); - })); - run_loop.Run(); - + socket_ = socket_factory_.CreateTransportClientSocket( + address_list_, NULL, NULL, net::NetLogSource()); + socket_->Connect( + base::Bind(&GCMSocketStreamTest::ConnectCallback, + base::Unretained(this))); PumpLoop(); } +void GCMSocketStreamTest::ConnectCallback(int result) {} + void GCMSocketStreamTest::ResetInputStream() { - DCHECK(mojo_socket_ptr_); - socket_input_stream_ = - std::make_unique<SocketInputStream>(std::move(receive_pipe_handle_)); + DCHECK(socket_.get()); + socket_input_stream_.reset(new SocketInputStream(socket_.get())); } void GCMSocketStreamTest::ResetOutputStream() { - DCHECK(mojo_socket_ptr_); - socket_output_stream_ = - std::make_unique<SocketOutputStream>(std::move(send_pipe_handle_)); + DCHECK(socket_.get()); + socket_output_stream_.reset( + new SocketOutputStream(socket_.get(), TRAFFIC_ANNOTATION_FOR_TESTS)); } // A read where all data is already available. TEST_F(GCMSocketStreamTest, ReadDataSync) { - ReadList read_list; - read_list.push_back( - net::MockRead(net::SYNCHRONOUS, kReadData, kReadDataSize)); - read_list.push_back(net::MockRead(net::ASYNC, net::OK) /* EOF */); - BuildSocket(read_list, WriteList()); + BuildSocket(ReadList(1, net::MockRead(net::SYNCHRONOUS, + kReadData, + kReadDataSize)), + WriteList()); WaitForData(kReadDataSize); ASSERT_EQ(std::string(kReadData, kReadDataSize), @@ -279,9 +301,6 @@ net::MockRead(net::SYNCHRONOUS, &kReadData[first_read_len], second_read_len)); - // Add an EOF. - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK)); - BuildSocket(read_list, WriteList()); WaitForData(kReadDataSize); @@ -298,7 +317,6 @@ net::MockRead(net::ASYNC, kReadData, first_read_len)); read_list.push_back( net::MockRead(net::ASYNC, &kReadData[first_read_len], second_read_len)); - read_list.push_back(net::MockRead(net::ASYNC, net::OK) /* EOF */); BuildSocket(read_list, WriteList()); WaitForData(kReadDataSize); ASSERT_EQ(std::string(kReadData, kReadDataSize), @@ -309,13 +327,10 @@ TEST_F(GCMSocketStreamTest, TwoReadsAtOnce) { std::string long_data = std::string(kReadData, kReadDataSize) + std::string(kReadData2, kReadData2Size); - ReadList read_list; - read_list.push_back( - net::MockRead(net::SYNCHRONOUS, long_data.c_str(), long_data.size())); - // Add an EOF. - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK)); - - BuildSocket(read_list, WriteList()); + BuildSocket(ReadList(1, net::MockRead(net::SYNCHRONOUS, + long_data.c_str(), + long_data.size())), + WriteList()); WaitForData(kReadDataSize); ASSERT_EQ(std::string(kReadData, kReadDataSize), @@ -331,14 +346,10 @@ TEST_F(GCMSocketStreamTest, TwoReadsAtOnceWithRebuild) { std::string long_data = std::string(kReadData, kReadDataSize) + std::string(kReadData2, kReadData2Size); - ReadList read_list; - - read_list.push_back( - net::MockRead(net::SYNCHRONOUS, long_data.c_str(), long_data.size())); - // Add an EOF. - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK)); - - BuildSocket(read_list, WriteList()); + BuildSocket(ReadList(1, net::MockRead(net::SYNCHRONOUS, + long_data.c_str(), + long_data.size())), + WriteList()); WaitForData(kReadDataSize); ASSERT_EQ(std::string(kReadData, kReadDataSize), @@ -358,23 +369,23 @@ WaitForData(kReadDataSize); ASSERT_EQ(SocketInputStream::CLOSED, input_stream()->GetState()); - ASSERT_EQ(net::ERR_FAILED, input_stream()->last_error()); + ASSERT_EQ(result, input_stream()->last_error()); } // Simulate a read after the connection is closed. TEST_F(GCMSocketStreamTest, ReadDisconnected) { - BuildSocket(ReadList(1, net::MockRead(net::SYNCHRONOUS, net::ERR_IO_PENDING)), - WriteList()); - mojo_socket_ptr_.reset(); + BuildSocket(ReadList(), WriteList()); + socket()->Disconnect(); WaitForData(kReadDataSize); ASSERT_EQ(SocketInputStream::CLOSED, input_stream()->GetState()); - ASSERT_EQ(net::ERR_FAILED, input_stream()->last_error()); + ASSERT_EQ(net::ERR_CONNECTION_CLOSED, input_stream()->last_error()); } // Write a full message in one go. TEST_F(GCMSocketStreamTest, WriteFull) { - BuildSocket(ReadList(1, net::MockRead(net::SYNCHRONOUS, net::ERR_IO_PENDING)), - WriteList(1, net::MockWrite(net::SYNCHRONOUS, kWriteData, + BuildSocket(ReadList(), + WriteList(1, net::MockWrite(net::SYNCHRONOUS, + kWriteData, kWriteDataSize))); ASSERT_EQ(kWriteDataSize, DoOutputStreamWrite(base::StringPiece(kWriteData, @@ -390,8 +401,7 @@ write_list.push_back(net::MockWrite(net::SYNCHRONOUS, kWriteData + kWriteDataSize / 2, kWriteDataSize / 2)); - BuildSocket(ReadList(1, net::MockRead(net::SYNCHRONOUS, net::ERR_IO_PENDING)), - write_list); + BuildSocket(ReadList(), write_list); ASSERT_EQ(kWriteDataSize, DoOutputStreamWrite(base::StringPiece(kWriteData, kWriteDataSize))); @@ -399,75 +409,13 @@ // Regression test for crbug.com/866635. TEST_F(GCMSocketStreamTest, WritePartialWithLengthChecking) { - // Add a prefix data in front of kWriteData. - std::string prefix_data("xxxxx"); - const size_t kPrefixDataSize = 5; - // |pipe| has a capacity that is one byte smaller than |prefix_data.size()| + - // |kWriteDataSize|. This is so that the first write is a partial write - // of |prefix_data|, and the second write is a complete write of kWriteData. - // The 1 byte shortage is to simulate the partial write. - mojo::DataPipe pipe(kWriteDataSize + prefix_data.size() - 1 /* size */); - mojo::ScopedDataPipeConsumerHandle consumer_handle = - std::move(pipe.consumer_handle); - mojo::ScopedDataPipeProducerHandle producer_handle = - std::move(pipe.producer_handle); - - // Prepopulate |producer_handle| of |prefix_data|, now the pipe's capacity is - // less than |kWriteDataSize|. - uint32_t num_bytes = prefix_data.size(); - MojoResult r = producer_handle->WriteData(prefix_data.data(), &num_bytes, - MOJO_WRITE_DATA_FLAG_NONE); - ASSERT_EQ(MOJO_RESULT_OK, r); - ASSERT_EQ(prefix_data.size(), num_bytes); - - // Create a SocketOutputStream from the producer pipe. - auto socket_output_stream = - std::make_unique<SocketOutputStream>(std::move(producer_handle)); + auto socket = std::make_unique<FirstWritePartialSocket>(); + auto socket_output_stream = std::make_unique<SocketOutputStream>( + socket.get(), TRAFFIC_ANNOTATION_FOR_TESTS); set_socket_output_stream(std::move(socket_output_stream)); - - // Write but do not flush. - EXPECT_EQ(kWriteDataSize, DoOutputStreamWriteWithoutFlush(kWriteData)); - - base::RunLoop run_loop; - output_stream()->Flush(run_loop.QuitClosure()); - // Flush should be able to flush exactly 5 bytes, because of the data pipe - // capacity. - base::RunLoop().RunUntilIdle(); - - std::string contents; - // Read prefix. - char buffer[kPrefixDataSize]; - uint32_t read_size = sizeof(buffer); - ASSERT_EQ(MOJO_RESULT_OK, consumer_handle->ReadData( - buffer, &read_size, MOJO_READ_DATA_FLAG_NONE)); - ASSERT_EQ(kPrefixDataSize, read_size); - contents += std::string(buffer, read_size); - - base::RunLoop().RunUntilIdle(); - // Flush now should complete. - run_loop.Run(); - - // Closes |producer_handle|. - set_socket_output_stream(nullptr); - - // Read everything in |consumer_handle| now that |producer_handle| is closed - // to make sure data is as what we expected, and there is no trailing garbage - // data. - while (true) { - char buffer[5]; - uint32_t read_size = sizeof(buffer); - MojoResult r = - consumer_handle->ReadData(buffer, &read_size, MOJO_READ_DATA_FLAG_NONE); - if (r == MOJO_RESULT_SHOULD_WAIT) - continue; - if (r != MOJO_RESULT_OK) - break; - ASSERT_EQ(MOJO_RESULT_OK, r); - contents += std::string(buffer, read_size); - } - std::string expected(prefix_data); - expected.append(kWriteData); - EXPECT_EQ(expected, contents); + ASSERT_EQ(kWriteDataSize, + DoOutputStreamWrite(base::StringPiece(kWriteData, kWriteDataSize))); + EXPECT_EQ(kWriteData, socket->actual_data_written()); } // Write a message completely asynchronously (returns IO_PENDING before @@ -480,8 +428,7 @@ write_list.push_back(net::MockWrite(net::SYNCHRONOUS, kWriteData + kWriteDataSize / 2, kWriteDataSize / 2)); - BuildSocket(ReadList(1, net::MockRead(net::SYNCHRONOUS, net::ERR_IO_PENDING)), - write_list); + BuildSocket(ReadList(), write_list); ASSERT_EQ(kWriteDataSize, DoOutputStreamWrite(base::StringPiece(kWriteData, kWriteDataSize))); @@ -489,14 +436,11 @@ // Write a message then read a message. TEST_F(GCMSocketStreamTest, WriteThenRead) { - ReadList read_list; - read_list.push_back( - net::MockRead(net::SYNCHRONOUS, kReadData, kReadDataSize)); - // Add an EOF. - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK)); - - BuildSocket(read_list, - WriteList(1, net::MockWrite(net::SYNCHRONOUS, kWriteData, + BuildSocket(ReadList(1, net::MockRead(net::SYNCHRONOUS, + kReadData, + kReadDataSize)), + WriteList(1, net::MockWrite(net::SYNCHRONOUS, + kWriteData, kWriteDataSize))); ASSERT_EQ(kWriteDataSize, @@ -510,14 +454,11 @@ // Read a message then write a message. TEST_F(GCMSocketStreamTest, ReadThenWrite) { - ReadList read_list; - read_list.push_back( - net::MockRead(net::SYNCHRONOUS, kReadData, kReadDataSize)); - // Add an EOF. - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK)); - - BuildSocket(read_list, - WriteList(1, net::MockWrite(net::SYNCHRONOUS, kWriteData, + BuildSocket(ReadList(1, net::MockRead(net::SYNCHRONOUS, + kReadData, + kReadDataSize)), + WriteList(1, net::MockWrite(net::SYNCHRONOUS, + kWriteData, kWriteDataSize))); WaitForData(kReadDataSize); @@ -532,25 +473,20 @@ // Simulate a write that gets aborted. TEST_F(GCMSocketStreamTest, WriteError) { int result = net::ERR_ABORTED; - BuildSocket(ReadList(1, net::MockRead(net::SYNCHRONOUS, net::ERR_IO_PENDING)), + BuildSocket(ReadList(), WriteList(1, net::MockWrite(net::SYNCHRONOUS, result))); - // Mojo data pipe buffers data, so there is a delay before write error is - // observed.Continue writing if error is not observed. - while (output_stream()->GetState() != SocketOutputStream::CLOSED) { - DoOutputStreamWrite(base::StringPiece(kWriteData, kWriteDataSize)); - } + DoOutputStreamWrite(base::StringPiece(kWriteData, kWriteDataSize)); ASSERT_EQ(SocketOutputStream::CLOSED, output_stream()->GetState()); - ASSERT_EQ(net::ERR_FAILED, output_stream()->last_error()); + ASSERT_EQ(result, output_stream()->last_error()); } // Simulate a write after the connection is closed. TEST_F(GCMSocketStreamTest, WriteDisconnected) { - BuildSocket(ReadList(1, net::MockRead(net::SYNCHRONOUS, net::ERR_IO_PENDING)), - WriteList()); - mojo_socket_ptr_.reset(); + BuildSocket(ReadList(), WriteList()); + socket()->Disconnect(); DoOutputStreamWrite(base::StringPiece(kWriteData, kWriteDataSize)); ASSERT_EQ(SocketOutputStream::CLOSED, output_stream()->GetState()); - ASSERT_EQ(net::ERR_FAILED, output_stream()->last_error()); + ASSERT_EQ(net::ERR_CONNECTION_CLOSED, output_stream()->last_error()); } } // namespace
diff --git a/google_apis/gcm/engine/connection_factory.h b/google_apis/gcm/engine/connection_factory.h index fad6843..c837814 100644 --- a/google_apis/gcm/engine/connection_factory.h +++ b/google_apis/gcm/engine/connection_factory.h
@@ -7,11 +7,9 @@ #include <string> -#include "base/callback_forward.h" #include "base/time/time.h" #include "google_apis/gcm/base/gcm_export.h" #include "google_apis/gcm/engine/connection_handler.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" class GURL; @@ -25,9 +23,6 @@ namespace gcm { -using GetProxyResolvingFactoryCallback = base::RepeatingCallback<void( - network::mojom::ProxyResolvingSocketFactoryRequest)>; - // Factory for creating a ConnectionHandler and maintaining its connection. // The factory retains ownership of the ConnectionHandler and will enforce // backoff policies when attempting connections.
diff --git a/google_apis/gcm/engine/connection_factory_impl.cc b/google_apis/gcm/engine/connection_factory_impl.cc index 98c30af14..cde535e5 100644 --- a/google_apis/gcm/engine/connection_factory_impl.cc +++ b/google_apis/gcm/engine/connection_factory_impl.cc
@@ -23,7 +23,8 @@ #include "net/socket/client_socket_handle.h" #include "net/socket/client_socket_pool_manager.h" #include "net/ssl/ssl_config_service.h" -#include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/network/proxy_resolving_client_socket.h" +#include "services/network/proxy_resolving_client_socket_factory.h" namespace gcm { @@ -51,13 +52,15 @@ ConnectionFactoryImpl::ConnectionFactoryImpl( const std::vector<GURL>& mcs_endpoints, const net::BackoffEntry::Policy& backoff_policy, - GetProxyResolvingFactoryCallback get_socket_factory_callback, + net::URLRequestContext* url_request_context, GCMStatsRecorder* recorder) : mcs_endpoints_(mcs_endpoints), next_endpoint_(0), last_successful_endpoint_(0), backoff_policy_(backoff_policy), - get_socket_factory_callback_(get_socket_factory_callback), + socket_factory_( + std::make_unique<network::ProxyResolvingClientSocketFactory>( + url_request_context)), connecting_(false), waiting_for_backoff_(false), waiting_for_network_online_(false), @@ -285,6 +288,18 @@ return mcs_endpoints_[next_endpoint_]; } +net::IPEndPoint ConnectionFactoryImpl::GetPeerIP() { + if (!socket_) + return net::IPEndPoint(); + + net::IPEndPoint ip_endpoint; + int result = socket_->GetPeerAddress(&ip_endpoint); + if (result != net::OK) + return net::IPEndPoint(); + + return ip_endpoint; +} + void ConnectionFactoryImpl::ConnectImpl() { event_tracker_.StartConnectionAttempt(); StartConnection(); @@ -301,8 +316,21 @@ connecting_ = true; GURL current_endpoint = GetCurrentEndpoint(); recorder_->RecordConnectionInitiated(current_endpoint.host()); + socket_ = socket_factory_->CreateSocket(current_endpoint, true /*use_tls*/); + int status = socket_->Connect(base::BindRepeating( + &ConnectionFactoryImpl::OnConnectDone, weak_ptr_factory_.GetWeakPtr())); + if (status != net::ERR_IO_PENDING) + OnConnectDone(status); +} - get_socket_factory_callback_.Run(mojo::MakeRequest(&socket_factory_)); +void ConnectionFactoryImpl::InitHandler() { + // May be null in tests. + mcs_proto::LoginRequest login_request; + if (!request_builder_.is_null()) { + request_builder_.Run(&login_request); + DCHECK(login_request.IsInitialized()); + event_tracker_.WriteToLoginRequest(&login_request); + } net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("gcm_connection_factory", R"( @@ -340,27 +368,7 @@ "but does not have any effect on other Google Cloud messages." )"); - socket_factory_->CreateProxyResolvingSocket( - current_endpoint, true /* use_tls */, - net::MutableNetworkTrafficAnnotationTag(traffic_annotation), - mojo::MakeRequest(&socket_), - base::BindOnce(&ConnectionFactoryImpl::OnConnectDone, - base::Unretained(this))); -} - -void ConnectionFactoryImpl::InitHandler( - mojo::ScopedDataPipeConsumerHandle receive_stream, - mojo::ScopedDataPipeProducerHandle send_stream) { - mcs_proto::LoginRequest login_request; - // May be null in tests. - if (!request_builder_.is_null()) { - request_builder_.Run(&login_request); - DCHECK(login_request.IsInitialized()); - event_tracker_.WriteToLoginRequest(&login_request); - } - - connection_handler_->Init(login_request, std::move(receive_stream), - std::move(send_stream)); + connection_handler_->Init(login_request, traffic_annotation, socket_.get()); } std::unique_ptr<net::BackoffEntry> ConnectionFactoryImpl::CreateBackoffEntry( @@ -382,12 +390,7 @@ return base::TimeTicks::Now(); } -void ConnectionFactoryImpl::OnConnectDone( - int result, - const base::Optional<net::IPEndPoint>& local_addr, - const base::Optional<net::IPEndPoint>& peer_addr, - mojo::ScopedDataPipeConsumerHandle receive_stream, - mojo::ScopedDataPipeProducerHandle send_stream) { +void ConnectionFactoryImpl::OnConnectDone(int result) { DCHECK_NE(net::ERR_IO_PENDING, result); if (result != net::OK) { LOG(ERROR) << "Failed to connect to MCS endpoint with error " << result; @@ -423,11 +426,7 @@ connecting_ = false; handshake_in_progress_ = true; DVLOG(1) << "MCS endpoint socket connection success, starting login."; - // |peer_addr| is only non-null if result == net::OK and the connection is not - // through a proxy. - if (peer_addr) - peer_addr_ = peer_addr.value(); - InitHandler(std::move(receive_stream), std::move(send_stream)); + InitHandler(); } void ConnectionFactoryImpl::ConnectionHandlerCallback(int result) { @@ -452,7 +451,7 @@ event_tracker_.ConnectionAttemptSucceeded(); if (listener_) - listener_->OnConnected(GetCurrentEndpoint(), peer_addr_); + listener_->OnConnected(GetCurrentEndpoint(), GetPeerIP()); } void ConnectionFactoryImpl::CloseSocket() { @@ -461,8 +460,9 @@ if (connection_handler_) connection_handler_->Reset(); - socket_.reset(); - peer_addr_ = net::IPEndPoint(); + if (socket_) + socket_->Disconnect(); + socket_ = nullptr; } } // namespace gcm
diff --git a/google_apis/gcm/engine/connection_factory_impl.h b/google_apis/gcm/engine/connection_factory_impl.h index 4bd944c..67c5412 100644 --- a/google_apis/gcm/engine/connection_factory_impl.h +++ b/google_apis/gcm/engine/connection_factory_impl.h
@@ -9,20 +9,26 @@ #include <stddef.h> -#include "base/callback.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "google_apis/gcm/engine/connection_event_tracker.h" #include "google_apis/gcm/engine/connection_handler.h" #include "google_apis/gcm/protocol/mcs.pb.h" -#include "mojo/public/cpp/system/data_pipe.h" #include "net/base/backoff_entry.h" #include "net/base/network_change_notifier.h" #include "net/log/net_log_with_source.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" #include "url/gurl.h" +namespace network { +class ProxyResolvingClientSocket; +class ProxyResolvingClientSocketFactory; +} + +namespace net { +class URLRequestContext; +} + namespace gcm { class GCMStatsRecorder; @@ -31,12 +37,12 @@ public ConnectionFactory, public net::NetworkChangeNotifier::NetworkChangeObserver { public: - ConnectionFactoryImpl( - const std::vector<GURL>& mcs_endpoints, - const net::BackoffEntry::Policy& backoff_policy, - GetProxyResolvingFactoryCallback get_socket_factory_callback, - // need task runner here. - GCMStatsRecorder* recorder); + // The caller is responsible for making sure the ConnectionFactoryImpl is + // destroyed before the |url_request_context|. + ConnectionFactoryImpl(const std::vector<GURL>& mcs_endpoints, + const net::BackoffEntry::Policy& backoff_policy, + net::URLRequestContext* url_request_context, + GCMStatsRecorder* recorder); ~ConnectionFactoryImpl() override; // ConnectionFactory implementation. @@ -61,6 +67,10 @@ // attempt will be made. GURL GetCurrentEndpoint() const; + // Returns the IPEndpoint to which the factory is currently connected. If no + // connection is active, returns an empty IPEndpoint. + net::IPEndPoint GetPeerIP(); + protected: // Initiate the connection to the GCM server. // Virtual for testing. @@ -68,8 +78,7 @@ // Helper method for initalizing the connection hander. // Virtual for testing. - virtual void InitHandler(mojo::ScopedDataPipeConsumerHandle receive_stream, - mojo::ScopedDataPipeProducerHandle send_stream); + virtual void InitHandler(); // Helper method for creating a backoff entry. // Virtual for testing. @@ -88,12 +97,8 @@ // Virtual for testing. virtual base::TimeTicks NowTicks(); - // Callback for Socket connection completion. This is public for testing. - void OnConnectDone(int result, - const base::Optional<net::IPEndPoint>& local_addr, - const base::Optional<net::IPEndPoint>& peer_addr, - mojo::ScopedDataPipeConsumerHandle receive_stream, - mojo::ScopedDataPipeProducerHandle send_stream); + // Callback for Socket connection completion. + void OnConnectDone(int result); // ConnectionHandler callback for connection issues. void ConnectionHandlerCallback(int result); @@ -133,15 +138,11 @@ // The backoff policy to use. const net::BackoffEntry::Policy backoff_policy_; - // ---- network:: components for establishing connections. ---- + // ---- net:: components for establishing connections. ---- // Socket factory for creating new GCM connections. - GetProxyResolvingFactoryCallback get_socket_factory_callback_; - network::mojom::ProxyResolvingSocketFactoryPtr socket_factory_; + std::unique_ptr<network::ProxyResolvingClientSocketFactory> socket_factory_; // The handle to the socket for the current connection, if one exists. - network::mojom::ProxyResolvingSocketPtr socket_; - // Peer address of |socket_|. - net::IPEndPoint peer_addr_; - + std::unique_ptr<network::ProxyResolvingClientSocket> socket_; // Current backoff entry. std::unique_ptr<net::BackoffEntry> backoff_entry_; // Backoff entry from previous connection attempt. Updated on each login
diff --git a/google_apis/gcm/engine/connection_factory_impl_unittest.cc b/google_apis/gcm/engine/connection_factory_impl_unittest.cc index 8440d03..a707f908 100644 --- a/google_apis/gcm/engine/connection_factory_impl_unittest.cc +++ b/google_apis/gcm/engine/connection_factory_impl_unittest.cc
@@ -9,9 +9,7 @@ #include <utility> #include "base/message_loop/message_loop.h" -#include "base/optional.h" #include "base/run_loop.h" -#include "base/test/scoped_task_environment.h" #include "base/test/simple_test_tick_clock.h" #include "base/threading/thread_task_runner_handle.h" #include "google_apis/gcm/base/mcs_util.h" @@ -20,9 +18,6 @@ #include "net/base/backoff_entry.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "net/url_request/url_request_test_util.h" -#include "services/network/network_context.h" -#include "services/network/network_service.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" #include "testing/gtest/include/gtest/gtest.h" class Policy; @@ -91,17 +86,15 @@ // backoff policy. class TestConnectionFactoryImpl : public ConnectionFactoryImpl { public: - TestConnectionFactoryImpl( - GetProxyResolvingFactoryCallback get_socket_factory_callback, - const base::Closure& finished_callback); + TestConnectionFactoryImpl(net::URLRequestContext* request_context, + const base::Closure& finished_callback); ~TestConnectionFactoryImpl() override; void InitializeFactory(); // Overridden stubs. void StartConnection() override; - void InitHandler(mojo::ScopedDataPipeConsumerHandle receive_stream, - mojo::ScopedDataPipeProducerHandle send_stream) override; + void InitHandler() override; std::unique_ptr<net::BackoffEntry> CreateBackoffEntry( const net::BackoffEntry::Policy* const policy) override; std::unique_ptr<ConnectionHandler> CreateConnectionHandler( @@ -146,17 +139,14 @@ FakeConnectionHandler* fake_handler_; // Dummy GCM Stats recorder. FakeGCMStatsRecorder dummy_recorder_; - // Dummy mojo pipes. - mojo::DataPipe receive_pipe_; - mojo::DataPipe send_pipe_; }; TestConnectionFactoryImpl::TestConnectionFactoryImpl( - GetProxyResolvingFactoryCallback get_socket_factory_callback, + net::URLRequestContext* request_context, const base::Closure& finished_callback) : ConnectionFactoryImpl(BuildEndpoints(), net::BackoffEntry::Policy(), - get_socket_factory_callback, + request_context, &dummy_recorder_), connect_result_(net::ERR_UNEXPECTED), num_expected_attempts_(0), @@ -179,12 +169,8 @@ ASSERT_GT(num_expected_attempts_, 0); ASSERT_FALSE(GetConnectionHandler()->CanSendMessage()); std::unique_ptr<mcs_proto::LoginRequest> request(BuildLoginRequest(0, 0, "")); - GetConnectionHandler()->Init(*request, - std::move(receive_pipe_.consumer_handle), - std::move(send_pipe_.producer_handle)); - OnConnectDone(connect_result_, net::IPEndPoint(), net::IPEndPoint(), - mojo::ScopedDataPipeConsumerHandle(), - mojo::ScopedDataPipeProducerHandle()); + GetConnectionHandler()->Init(*request, TRAFFIC_ANNOTATION_FOR_TESTS, NULL); + OnConnectDone(connect_result_); if (!NextRetryAttempt().is_null()) { // Advance the time to the next retry time. base::TimeDelta time_till_retry = @@ -199,9 +185,7 @@ } } -void TestConnectionFactoryImpl::InitHandler( - mojo::ScopedDataPipeConsumerHandle receive_stream, - mojo::ScopedDataPipeProducerHandle send_stream) { +void TestConnectionFactoryImpl::InitHandler() { EXPECT_NE(connect_result_, net::ERR_UNEXPECTED); if (!delay_login_) ConnectionHandlerCallback(net::OK); @@ -288,44 +272,31 @@ } private: - void GetProxyResolvingSocketFactory( - network::mojom::ProxyResolvingSocketFactoryRequest request) { - network_context_->CreateProxyResolvingSocketFactory(std::move(request)); - } void ConnectionsComplete(); - base::test::ScopedTaskEnvironment scoped_task_environment_; + base::MessageLoop message_loop_; + + // Dummy request context that is not used to make network requests, and is + // added to make ProxyResolvingClientSocketFactory to not DCHECK on a null + // context. + net::TestURLRequestContext request_context_; + TestConnectionFactoryImpl factory_; std::unique_ptr<base::RunLoop> run_loop_; GURL connected_server_; - std::unique_ptr<network::NetworkService> network_service_; - network::mojom::NetworkContextPtr network_context_ptr_; - std::unique_ptr<network::NetworkContext> network_context_; }; ConnectionFactoryImplTest::ConnectionFactoryImplTest() - : scoped_task_environment_( - base::test::ScopedTaskEnvironment::MainThreadType::IO), - factory_(base::BindRepeating( - &ConnectionFactoryImplTest::GetProxyResolvingSocketFactory, - base::Unretained(this)), + : factory_(&request_context_, base::Bind(&ConnectionFactoryImplTest::ConnectionsComplete, base::Unretained(this))), - run_loop_(new base::RunLoop()), - network_service_(network::NetworkService::CreateForTesting()) { - network::mojom::NetworkContextParamsPtr params = - network::mojom::NetworkContextParams::New(); - // Use a fixed proxy config, to avoid dependencies on local network - // configuration. - params->initial_proxy_config = net::ProxyConfigWithAnnotation::CreateDirect(); - network_context_ = std::make_unique<network::NetworkContext>( - network_service_.get(), mojo::MakeRequest(&network_context_ptr_), - std::move(params)); + run_loop_(new base::RunLoop()) { factory()->SetConnectionListener(this); - factory()->Initialize(ConnectionFactory::BuildLoginRequestCallback(), - ConnectionHandler::ProtoReceivedCallback(), - ConnectionHandler::ProtoSentCallback()); + factory()->Initialize( + ConnectionFactory::BuildLoginRequestCallback(), + ConnectionHandler::ProtoReceivedCallback(), + ConnectionHandler::ProtoSentCallback()); } ConnectionFactoryImplTest::~ConnectionFactoryImplTest() {}
diff --git a/google_apis/gcm/engine/connection_handler.h b/google_apis/gcm/engine/connection_handler.h index 857e657..ee110c11 100644 --- a/google_apis/gcm/engine/connection_handler.h +++ b/google_apis/gcm/engine/connection_handler.h
@@ -9,7 +9,7 @@ #include "base/callback.h" #include "google_apis/gcm/base/gcm_export.h" -#include "mojo/public/cpp/system/data_pipe.h" +#include "net/traffic_annotation/network_traffic_annotation.h" namespace net{ class StreamSocket; @@ -48,8 +48,8 @@ // Note: It is correct and expected to call Init more than once, as connection // issues are encountered and new connections must be made. virtual void Init(const mcs_proto::LoginRequest& login_request, - mojo::ScopedDataPipeConsumerHandle receive_stream, - mojo::ScopedDataPipeProducerHandle send_stream) = 0; + const net::NetworkTrafficAnnotationTag& traffic_annotation, + net::StreamSocket* socket) = 0; // Resets the handler and any internal state. Should be called any time // a connection reset happens externally to the handler.
diff --git a/google_apis/gcm/engine/connection_handler_impl.cc b/google_apis/gcm/engine/connection_handler_impl.cc index f6812988..887a4bea 100644 --- a/google_apis/gcm/engine/connection_handler_impl.cc +++ b/google_apis/gcm/engine/connection_handler_impl.cc
@@ -50,6 +50,7 @@ const ProtoSentCallback& write_callback, const ConnectionChangedCallback& connection_callback) : read_timeout_(read_timeout), + socket_(NULL), handshake_complete_(false), message_tag_(0), message_size_(0), @@ -65,8 +66,8 @@ void ConnectionHandlerImpl::Init( const mcs_proto::LoginRequest& login_request, - mojo::ScopedDataPipeConsumerHandle receive_stream, - mojo::ScopedDataPipeProducerHandle send_stream) { + const net::NetworkTrafficAnnotationTag& traffic_annotation, + net::StreamSocket* socket) { DCHECK(!read_callback_.is_null()); DCHECK(!write_callback_.is_null()); DCHECK(!connection_callback_.is_null()); @@ -77,8 +78,9 @@ handshake_complete_ = false; message_tag_ = 0; message_size_ = 0; - input_stream_.reset(new SocketInputStream(std::move(receive_stream))); - output_stream_.reset(new SocketOutputStream(std::move(send_stream))); + socket_ = socket; + input_stream_.reset(new SocketInputStream(socket_)); + output_stream_.reset(new SocketOutputStream(socket_, traffic_annotation)); Login(login_request); } @@ -479,6 +481,9 @@ void ConnectionHandlerImpl::CloseConnection() { DVLOG(1) << "Closing connection."; read_timeout_timer_.Stop(); + if (socket_) + socket_->Disconnect(); + socket_ = NULL; handshake_complete_ = false; message_tag_ = 0; message_size_ = 0;
diff --git a/google_apis/gcm/engine/connection_handler_impl.h b/google_apis/gcm/engine/connection_handler_impl.h index e88749cc..5cd1749 100644 --- a/google_apis/gcm/engine/connection_handler_impl.h +++ b/google_apis/gcm/engine/connection_handler_impl.h
@@ -43,8 +43,8 @@ // ConnectionHandler implementation. void Init(const mcs_proto::LoginRequest& login_request, - mojo::ScopedDataPipeConsumerHandle receive_stream, - mojo::ScopedDataPipeProducerHandle send_stream) override; + const net::NetworkTrafficAnnotationTag& traffic_annotation, + net::StreamSocket* socket) override; void Reset() override; bool CanSendMessage() const override; void SendMessage(const google::protobuf::MessageLite& message) override; @@ -103,7 +103,8 @@ const base::TimeDelta read_timeout_; base::OneShotTimer read_timeout_timer_; - // This connection's input/output streams. + // This connection's socket and the input/output streams attached to it. + net::StreamSocket* socket_; std::unique_ptr<SocketInputStream> input_stream_; std::unique_ptr<SocketOutputStream> output_stream_;
diff --git a/google_apis/gcm/engine/connection_handler_impl_unittest.cc b/google_apis/gcm/engine/connection_handler_impl_unittest.cc index cde76454..ff7393a 100644 --- a/google_apis/gcm/engine/connection_handler_impl_unittest.cc +++ b/google_apis/gcm/engine/connection_handler_impl_unittest.cc
@@ -14,8 +14,6 @@ #include "base/message_loop/message_loop.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" -#include "base/test/bind_test_util.h" -#include "base/test/scoped_task_environment.h" #include "base/test/test_timeouts.h" #include "google/protobuf/io/coded_stream.h" #include "google/protobuf/io/zero_copy_stream_impl_lite.h" @@ -30,10 +28,6 @@ #include "net/socket/stream_socket.h" #include "net/test/gtest_util.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" -#include "net/url_request/url_request_test_util.h" -#include "services/network/network_context.h" -#include "services/network/network_service.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" #include "testing/gtest/include/gtest/gtest.h" namespace gcm { @@ -153,14 +147,19 @@ GCMConnectionHandlerImplTest(); ~GCMConnectionHandlerImplTest() override; - void BuildSocket(const ReadList& read_list, const WriteList& write_list); + net::StreamSocket* BuildSocket(const ReadList& read_list, + const WriteList& write_list); - // Pump |run_loop_|, and reset |run_loop_| after completion. + // Pump |message_loop_|, resetting |run_loop_| after completion. void PumpLoop(); ConnectionHandlerImpl* connection_handler() { return connection_handler_.get(); } + base::MessageLoop* message_loop() { return &message_loop_; } + net::StaticSocketDataProvider* data_provider() { + return data_provider_.get(); + } int last_error() const { return last_error_; } // Initialize the connection handler, setting |dst_proto| as the destination @@ -170,16 +169,15 @@ // Runs the message loop until a message is received. void WaitForMessage(); - network::mojom::ProxyResolvingSocketPtr mojo_socket_ptr_; - private: void ReadContinuation(ScopedMessage* dst_proto, ScopedMessage new_proto); void WriteContinuation(); void ConnectionContinuation(int error); // SocketStreams and their data provider. - std::vector<std::unique_ptr<net::StaticSocketDataProvider>> data_providers_; - std::vector<std::unique_ptr<net::SSLSocketDataProvider>> ssl_data_providers_; + ReadList mock_reads_; + WriteList mock_writes_; + std::unique_ptr<net::StaticSocketDataProvider> data_provider_; // The connection handler being tested. std::unique_ptr<ConnectionHandlerImpl> connection_handler_; @@ -187,71 +185,45 @@ // The last connection error received. int last_error_; - net::AddressList address_list_; - base::test::ScopedTaskEnvironment scoped_task_environment_; - std::unique_ptr<base::RunLoop> run_loop_; - std::unique_ptr<network::NetworkService> network_service_; - network::mojom::NetworkContextPtr network_context_ptr_; + // net:: components. + std::unique_ptr<net::StreamSocket> socket_; net::MockClientSocketFactory socket_factory_; - net::TestURLRequestContext url_request_context_; - std::unique_ptr<network::NetworkContext> network_context_; - network::mojom::ProxyResolvingSocketFactoryPtr mojo_socket_factory_ptr_; - mojo::ScopedDataPipeConsumerHandle receive_pipe_handle_; - mojo::ScopedDataPipeProducerHandle send_pipe_handle_; + net::AddressList address_list_; + + base::MessageLoopForIO message_loop_; + std::unique_ptr<base::RunLoop> run_loop_; }; GCMConnectionHandlerImplTest::GCMConnectionHandlerImplTest() - : last_error_(0), - scoped_task_environment_( - base::test::ScopedTaskEnvironment::MainThreadType::IO), - network_service_(network::NetworkService::CreateForTesting()), - url_request_context_(true /* delay_initialization */) { + : last_error_(0) { address_list_ = net::AddressList::CreateFromIPAddress( net::IPAddress::IPv4Localhost(), kMCSPort); - socket_factory_.set_enable_read_if_ready(true); - url_request_context_.set_client_socket_factory(&socket_factory_); - url_request_context_.Init(); - - network_context_ = std::make_unique<network::NetworkContext>( - network_service_.get(), mojo::MakeRequest(&network_context_ptr_), - &url_request_context_); } GCMConnectionHandlerImplTest::~GCMConnectionHandlerImplTest() { } -void GCMConnectionHandlerImplTest::BuildSocket(const ReadList& read_list, - const WriteList& write_list) { - data_providers_.push_back( - std::make_unique<net::StaticSocketDataProvider>(read_list, write_list)); - socket_factory_.AddSocketDataProvider(data_providers_.back().get()); - ssl_data_providers_.push_back( - std::make_unique<net::SSLSocketDataProvider>(net::SYNCHRONOUS, net::OK)); - socket_factory_.AddSSLSocketDataProvider(ssl_data_providers_.back().get()); - +net::StreamSocket* GCMConnectionHandlerImplTest::BuildSocket( + const ReadList& read_list, + const WriteList& write_list) { + mock_reads_ = read_list; + mock_writes_ = write_list; + data_provider_ = std::make_unique<net::StaticSocketDataProvider>( + mock_reads_, mock_writes_); + socket_factory_.AddSocketDataProvider(data_provider_.get()); run_loop_ = std::make_unique<base::RunLoop>(); - network_context_->CreateProxyResolvingSocketFactory( - mojo::MakeRequest(&mojo_socket_factory_ptr_)); - base::RunLoop run_loop; - int net_error = net::ERR_FAILED; - const GURL kDestination("https://example.com"); - mojo_socket_factory_ptr_->CreateProxyResolvingSocket( - kDestination, true /* use_tls */, - net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS), - mojo::MakeRequest(&mojo_socket_ptr_), - base::BindLambdaForTesting( - [&](int result, const base::Optional<net::IPEndPoint>& local_addr, - const base::Optional<net::IPEndPoint>& peer_addr, - mojo::ScopedDataPipeConsumerHandle receive_pipe_handle, - mojo::ScopedDataPipeProducerHandle send_pipe_handle) { - net_error = result; - receive_pipe_handle_ = std::move(receive_pipe_handle); - send_pipe_handle_ = std::move(send_pipe_handle); - run_loop.Quit(); - })); - run_loop.Run(); - ASSERT_EQ(net::OK, net_error); + socket_ = socket_factory_.CreateTransportClientSocket( + address_list_, NULL, NULL, net::NetLogSource()); + net::TestCompletionCallback callback; + int rv = socket_->Connect(callback.callback()); + EXPECT_THAT(rv, net::test::IsError(net::ERR_IO_PENDING)); + + rv = callback.WaitForResult(); + EXPECT_THAT(rv, net::test::IsOk()); + + EXPECT_TRUE(socket_->IsConnected()); + return socket_.get(); } void GCMConnectionHandlerImplTest::PumpLoop() { @@ -271,8 +243,7 @@ base::Unretained(this))); EXPECT_FALSE(connection_handler()->CanSendMessage()); connection_handler_->Init(*BuildLoginRequest(kAuthId, kAuthToken, ""), - std::move(receive_pipe_handle_), - std::move(send_pipe_handle_)); + TRAFFIC_ANNOTATION_FOR_TESTS, socket_.get()); } void GCMConnectionHandlerImplTest::ReadContinuation( @@ -306,10 +277,9 @@ handshake_request.c_str(), handshake_request.size())); std::string handshake_response = EncodeHandshakeResponse(); - ReadList read_list; - read_list.push_back(net::MockRead(net::ASYNC, handshake_response.c_str(), - handshake_response.size())); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); + ReadList read_list(1, net::MockRead(net::ASYNC, + handshake_response.c_str(), + handshake_response.size())); BuildSocket(read_list, write_list); ScopedMessage received_message; @@ -332,10 +302,9 @@ std::string handshake_response = EncodeHandshakeResponse(); // Overwrite the version byte. handshake_response[0] = 37; - ReadList read_list; - read_list.push_back(net::MockRead(net::ASYNC, handshake_response.c_str(), - handshake_response.size())); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); + ReadList read_list(1, net::MockRead(net::ASYNC, + handshake_response.c_str(), + handshake_response.size())); BuildSocket(read_list, write_list); ScopedMessage received_message; @@ -412,13 +381,10 @@ // Build a new socket and reconnect, successfully this time. std::string handshake_response = EncodeHandshakeResponse(); - WriteList write_list2(1, net::MockWrite(net::ASYNC, handshake_request.c_str(), - handshake_request.size())); - ReadList read_list2; - read_list2.push_back(net::MockRead(net::ASYNC, handshake_response.c_str(), - handshake_response.size())); - read_list2.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); - BuildSocket(read_list2, write_list2); + read_list[0] = net::MockRead(net::ASYNC, + handshake_response.c_str(), + handshake_response.size()); + BuildSocket(read_list, write_list); Connect(&received_message); EXPECT_FALSE(connection_handler()->CanSendMessage()); WaitForMessage(); // The login send. @@ -447,7 +413,6 @@ read_list.push_back(net::MockRead(net::ASYNC, data_message_pkt.c_str(), data_message_pkt.size())); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); BuildSocket(read_list, write_list); ScopedMessage received_message; @@ -482,7 +447,6 @@ read_list.push_back(net::MockRead(net::SYNCHRONOUS, data_message_pkt.c_str(), data_message_pkt.size())); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); BuildSocket(read_list, write_list); ScopedMessage received_message; @@ -519,7 +483,6 @@ read_list.push_back(net::MockRead(net::ASYNC, data_message_pkt.c_str(), data_message_pkt.size())); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); BuildSocket(read_list, write_list); ScopedMessage received_message; @@ -559,7 +522,6 @@ bytes_in_first_message, data_message_pkt.size() - bytes_in_first_message)); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); BuildSocket(read_list, write_list); ScopedMessage received_message; @@ -595,7 +557,6 @@ read_list.push_back(net::MockRead(net::SYNCHRONOUS, data_message_pkt.c_str(), data_message_pkt.size())); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); BuildSocket(read_list, write_list); ScopedMessage received_message; @@ -670,7 +631,6 @@ read_list.push_back(net::MockRead(net::ASYNC, data_message_pkt.c_str(), data_message_pkt.size())); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); BuildSocket(read_list, write_list); ScopedMessage received_message; @@ -732,14 +692,14 @@ handshake_response.c_str(), handshake_response.size())); read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::ERR_IO_PENDING)); - BuildSocket(read_list, write_list); + net::StreamSocket* socket = BuildSocket(read_list, write_list); ScopedMessage received_message; Connect(&received_message); WaitForMessage(); // The login send. WaitForMessage(); // The login response. EXPECT_TRUE(connection_handler()->CanSendMessage()); - mojo_socket_ptr_.reset(); + socket->Disconnect(); mcs_proto::DataMessageStanza data_message; data_message.set_from(kDataMsgFrom); data_message.set_category(kDataMsgCategory); @@ -747,7 +707,7 @@ EXPECT_FALSE(connection_handler()->CanSendMessage()); WaitForMessage(); // The message send. Should result in an error EXPECT_FALSE(connection_handler()->CanSendMessage()); - EXPECT_EQ(net::ERR_FAILED, last_error()); + EXPECT_EQ(net::ERR_CONNECTION_CLOSED, last_error()); } // Receive a message with a custom data packet that is larger than the @@ -772,7 +732,6 @@ read_list.push_back(net::MockRead(net::ASYNC, data_message_pkt.c_str(), data_message_pkt.size())); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); BuildSocket(read_list, write_list); ScopedMessage received_message; @@ -810,7 +769,6 @@ read_list.push_back(net::MockRead(net::SYNCHRONOUS, data_message_pkt.c_str(), data_message_pkt.size())); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); BuildSocket(read_list, write_list); ScopedMessage received_message; @@ -847,7 +805,6 @@ read_list.push_back(net::MockRead(net::ASYNC, invalid_message_pkt.c_str(), invalid_message_pkt.size())); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); BuildSocket(read_list, write_list); ScopedMessage received_message; @@ -885,7 +842,6 @@ read_list.push_back(net::MockRead(net::ASYNC, data_message_pkt.c_str() + 2, data_message_pkt.size() - 2)); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); BuildSocket(read_list, write_list); ScopedMessage received_message; @@ -914,7 +870,6 @@ handshake_response.size())); read_list.push_back(net::MockRead(net::ASYNC, invalid_message_pkt.c_str(), invalid_message_pkt.size())); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); BuildSocket(read_list, write_list); ScopedMessage received_message; @@ -945,7 +900,6 @@ handshake_response.size())); read_list.push_back(net::MockRead(net::ASYNC, invalid_message_pkt.c_str(), invalid_message_pkt.size())); - read_list.push_back(net::MockRead(net::SYNCHRONOUS, net::OK) /* EOF */); BuildSocket(read_list, write_list); ScopedMessage received_message;
diff --git a/google_apis/gcm/engine/fake_connection_factory.cc b/google_apis/gcm/engine/fake_connection_factory.cc index ee6df98..4631e573 100644 --- a/google_apis/gcm/engine/fake_connection_factory.cc +++ b/google_apis/gcm/engine/fake_connection_factory.cc
@@ -6,7 +6,6 @@ #include "google_apis/gcm/engine/fake_connection_handler.h" #include "google_apis/gcm/protocol/mcs.pb.h" -#include "mojo/public/cpp/system/data_pipe.h" #include "net/socket/stream_socket.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" @@ -37,8 +36,7 @@ void FakeConnectionFactory::Connect() { mcs_proto::LoginRequest login_request; request_builder_.Run(&login_request); - connection_handler_->Init(login_request, mojo::ScopedDataPipeConsumerHandle(), - mojo::ScopedDataPipeProducerHandle()); + connection_handler_->Init(login_request, TRAFFIC_ANNOTATION_FOR_TESTS, NULL); } bool FakeConnectionFactory::IsEndpointReachable() const {
diff --git a/google_apis/gcm/engine/fake_connection_handler.cc b/google_apis/gcm/engine/fake_connection_handler.cc index 4797f11..34da9b1 100644 --- a/google_apis/gcm/engine/fake_connection_handler.cc +++ b/google_apis/gcm/engine/fake_connection_handler.cc
@@ -44,8 +44,8 @@ void FakeConnectionHandler::Init( const mcs_proto::LoginRequest& login_request, - mojo::ScopedDataPipeConsumerHandle receive_stream, - mojo::ScopedDataPipeProducerHandle send_stream) { + const net::NetworkTrafficAnnotationTag& traffic_annotation, + net::StreamSocket* socket) { ASSERT_GE(expected_outgoing_messages_.size(), 1U); EXPECT_EQ(expected_outgoing_messages_.front().SerializeAsString(), login_request.SerializeAsString());
diff --git a/google_apis/gcm/engine/fake_connection_handler.h b/google_apis/gcm/engine/fake_connection_handler.h index 70afb649..9afee54 100644 --- a/google_apis/gcm/engine/fake_connection_handler.h +++ b/google_apis/gcm/engine/fake_connection_handler.h
@@ -10,7 +10,7 @@ #include "base/macros.h" #include "google_apis/gcm/base/mcs_message.h" #include "google_apis/gcm/engine/connection_handler.h" -#include "mojo/public/cpp/system/data_pipe.h" +#include "net/traffic_annotation/network_traffic_annotation.h" namespace gcm { @@ -25,8 +25,8 @@ // ConnectionHandler implementation. void Init(const mcs_proto::LoginRequest& login_request, - mojo::ScopedDataPipeConsumerHandle receive_stream, - mojo::ScopedDataPipeProducerHandle send_stream) override; + const net::NetworkTrafficAnnotationTag& traffic_annotation, + net::StreamSocket* socket) override; void Reset() override; bool CanSendMessage() const override; void SendMessage(const google::protobuf::MessageLite& message) override;
diff --git a/google_apis/gcm/tools/mcs_probe.cc b/google_apis/gcm/tools/mcs_probe.cc index 4b75874..61f9e0ae 100644 --- a/google_apis/gcm/tools/mcs_probe.cc +++ b/google_apis/gcm/tools/mcs_probe.cc
@@ -59,7 +59,7 @@ #include "services/network/network_context.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" +#include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #if defined(OS_MACOSX) @@ -220,8 +220,6 @@ uint64_t secret() const { return secret_; } private: - void RequestProxyResolvingSocketFactory( - network::mojom::ProxyResolvingSocketFactoryRequest request); void CheckIn(); void InitializeNetworkState(); @@ -323,9 +321,7 @@ connection_factory_ = std::make_unique<ConnectionFactoryImpl>( endpoints, kDefaultBackoffPolicy, - base::BindRepeating(&MCSProbe::RequestProxyResolvingSocketFactory, - base::Unretained(this)), - &recorder_); + url_request_context_getter_->GetURLRequestContext(), &recorder_); gcm_store_ = std::make_unique<GCMStoreImpl>( gcm_store_path_, file_thread_.task_runner(), std::make_unique<FakeEncryptor>()); @@ -421,12 +417,6 @@ LOG(INFO) << "MCS error happened"; } -void MCSProbe::RequestProxyResolvingSocketFactory( - network::mojom::ProxyResolvingSocketFactoryRequest request) { - return network_context_->CreateProxyResolvingSocketFactory( - std::move(request)); -} - void MCSProbe::CheckIn() { LOG(INFO) << "Check-in request initiated."; checkin_proto::ChromeBuildProto chrome_build_proto;
diff --git a/gpu/config/process_json.py b/gpu/config/process_json.py index de09c6b..43410e0 100755 --- a/gpu/config/process_json.py +++ b/gpu/config/process_json.py
@@ -117,10 +117,10 @@ return feature_set -def write_features(entry_id, feature_set, feature_name_prefix, +def write_features(feature_set, feature_name_prefix, var_name, data_helper_file): - data_helper_file.write('const int kFeatureListForEntry%d[%d] = {\n' % - (entry_id, len(feature_set))) + data_helper_file.write('const int %s[%d] = {\n' % + (var_name, len(feature_set))) for feature in feature_set: data_helper_file.write(feature_name_prefix + feature.upper()) data_helper_file.write(',\n') @@ -147,9 +147,9 @@ def write_gl_strings(entry_id, is_exception, exception_id, data, - data_file, data_helper_file): + unique_symbol_id, data_file, data_helper_file): if data: - var_name = 'kGLStringsForEntry' + str(entry_id) + var_name = 'kGLStringsFor%sEntry%d' % (unique_symbol_id, entry_id) if is_exception: var_name += 'Exception' + str(exception_id) # define the GL strings @@ -204,8 +204,9 @@ def write_driver_info(entry_id, is_exception, exception_id, driver_vendor, - driver_version, driver_date, data_file, data_helper_file): - var_name = 'kDriverInfoForEntry' + str(entry_id) + driver_version, driver_date, unique_symbol_id, + data_file, data_helper_file): + var_name = 'kDriverInfoFor%sEntry%d' % (unique_symbol_id, entry_id) if is_exception: var_name += 'Exception' + str(exception_id) # define the GL strings @@ -220,9 +221,10 @@ def write_number_list(entry_id, data_type, name_tag, data, is_exception, - exception_id, data_file, data_helper_file): + exception_id, unique_symbol_id, data_file, + data_helper_file): if data: - var_name = 'k' + name_tag + 'ForEntry' + str(entry_id) + var_name = 'k%sFor%sEntry%d' % (name_tag, unique_symbol_id, entry_id) if is_exception: var_name += 'Exception' + str(exception_id) # define the list @@ -342,7 +344,8 @@ def write_conditions(entry_id, is_exception, exception_id, entry, - data_file, data_helper_file, _data_exception_file): + unique_symbol_id, data_file, data_helper_file, + _data_exception_file): os_type = '' os_version = None vendor_id = 0 @@ -457,13 +460,15 @@ data_file.write(format(vendor_id, '#04x')) data_file.write(', // vendor_id\n') write_number_list(entry_id, 'uint32_t', 'DeviceIDs', device_id, is_exception, - exception_id, data_file, data_helper_file) + exception_id, unique_symbol_id, data_file, + data_helper_file) write_multi_gpu_category(multi_gpu_category, data_file) write_multi_gpu_style(multi_gpu_style, data_file) # group driver info if driver_vendor != '' or driver_version != None or driver_date != None: write_driver_info(entry_id, is_exception, exception_id, driver_vendor, - driver_version, driver_date, data_file, data_helper_file) + driver_version, driver_date, unique_symbol_id, + data_file, data_helper_file) else: data_file.write('nullptr, // driver info\n') # group GL strings @@ -472,7 +477,7 @@ gl_version_string != ''): gl_strings = [gl_vendor, gl_renderer, gl_extensions, gl_version_string] write_gl_strings(entry_id, is_exception, exception_id, gl_strings, - data_file, data_helper_file) + unique_symbol_id, data_file, data_helper_file) # group machine model info write_machine_model_info(entry_id, is_exception, exception_id, machine_model_name, machine_model_version, @@ -551,7 +556,8 @@ def write_entry(entry, total_feature_set, feature_name_prefix, - data_file, data_helper_file, data_exception_file): + unique_symbol_id, data_file, data_helper_file, + data_exception_file): data_file.write('{\n') # ID entry_id = entry['id'] @@ -559,12 +565,12 @@ data_file.write('"%s",\n' % entry['description']); # Features if 'features' in entry: + var_name = 'kFeatureListFor%sEntry%d' % (unique_symbol_id, entry_id) features = entry['features'] feature_set = get_feature_set(features, total_feature_set) - data_file.write('base::size(kFeatureListForEntry%d), // features size\n' % - entry_id) - data_file.write('kFeatureListForEntry%d, // features\n' % entry_id) - write_features(entry_id, feature_set, feature_name_prefix, data_helper_file) + data_file.write('base::size(%s), // features size\n' % var_name) + data_file.write('%s, // features\n' % var_name) + write_features(feature_set, feature_name_prefix, var_name, data_helper_file) else: data_file.write('0, // feature size\n') data_file.write('nullptr, // features\n') @@ -582,11 +588,11 @@ if 'cr_bugs' in entry: cr_bugs = entry['cr_bugs'] write_number_list(entry_id, 'uint32_t', 'CrBugs', cr_bugs, False, -1, - data_file, data_helper_file) + unique_symbol_id, data_file, data_helper_file) # Conditions data_file.write('{\n') - write_conditions(entry_id, False, -1, entry, data_file, data_helper_file, - data_exception_file) + write_conditions(entry_id, False, -1, entry, unique_symbol_id, + data_file, data_helper_file, data_exception_file) data_file.write('},\n') # Exceptions if 'exceptions' in entry: @@ -601,7 +607,7 @@ assert 'vendor_id' in entry exception['vendor_id'] = entry['vendor_id'] data_exception_file.write('{\n') - write_conditions(entry_id, True, index, exception, + write_conditions(entry_id, True, index, exception, unique_symbol_id, data_exception_file, data_helper_file, None) data_exception_file.write('},\n') data_exception_file.write('};\n\n') @@ -635,7 +641,7 @@ feature_header_filename, total_features, feature_tag, output_header_filepath, output_data_filepath, output_helper_filepath, output_exception_filepath, path, - export_tag, git_format, os_filter): + export_tag, git_format, os_filter, unique_symbol_id): output_header_filename = os.path.basename(output_header_filepath) output_helper_filename = os.path.basename(output_helper_filepath) output_exception_filename = os.path.basename(output_exception_filepath) @@ -679,7 +685,7 @@ if os_filter != None and os_type != os_filter: continue entry_count += 1 - write_entry(entry, total_features, feature_tag, + write_entry(entry, total_features, feature_tag, unique_symbol_id, data_file, data_helper_file, data_exception_file) data_file.write('};\n') data_file.write('const size_t k%sEntryCount = %d;\n' % @@ -732,7 +738,8 @@ 'gpu/config', 'GPU_EXPORT ', False, - os_filter) + os_filter, + 'Software') def process_gpu_driver_bug_list(script_dir, output_dir, os_filter): @@ -752,7 +759,8 @@ 'gpu/config', 'GPU_EXPORT ', False, - os_filter) + os_filter, + 'Workarounds') def process_gpu_control_list_testing(script_dir, output_dir): @@ -771,7 +779,8 @@ 'gpu/config', '', True, - None) + None, + 'GpuControlTesting') def process_gpu_data_manager_testing(script_dir, output_dir): @@ -791,7 +800,8 @@ 'content/browser/gpu', '', True, - None) + None, + 'GpuManagerTesting') def write_test_entry_enums(input_json_filepath, output_entry_enums_filepath,
diff --git a/infra/config/global/OWNERS b/infra/config/global/OWNERS index 510579d4..a2b6590 100644 --- a/infra/config/global/OWNERS +++ b/infra/config/global/OWNERS
@@ -7,3 +7,10 @@ smut@google.com tandrii@chromium.org vadimsh@chromium.org + +# For build parallelism configs. +per-file cr-buildbucket.cfg=shinyak@chromium.org +per-file cr-buildbucket.cfg=sque@chromium.org +per-file cr-buildbucket.cfg=tikuta@chromium.org +per-file cr-buildbucket.cfg=ukai@chromium.org +per-file cr-buildbucket.cfg=yyanagisawa@chromium.org
diff --git a/infra/config/global/luci-logdog-dev.cfg b/infra/config/global/luci-logdog-dev.cfg index e89bf41..7057d02 100644 --- a/infra/config/global/luci-logdog-dev.cfg +++ b/infra/config/global/luci-logdog-dev.cfg
@@ -3,7 +3,7 @@ # found in the LICENSE file. # # For the schema of this file and documentation, see ProjectConfig message in -# https://luci-config.appspot.com/schemas/services/luci-logdog:logdog.cfg +# https://luci-config.appspot.com/schemas/projects:luci-logdog.cfg # Auth groups who can read log streams. reader_auth_groups: "all"
diff --git a/infra/config/global/luci-logdog.cfg b/infra/config/global/luci-logdog.cfg index 12b7a31..29302eb 100644 --- a/infra/config/global/luci-logdog.cfg +++ b/infra/config/global/luci-logdog.cfg
@@ -3,7 +3,7 @@ # found in the LICENSE file. # # For the schema of this file and documentation, see ProjectConfig message in -# https://luci-config.appspot.com/schemas/services/luci-logdog:logdog.cfg +# https://luci-config.appspot.com/schemas/projects:luci-logdog.cfg # Auth groups who can read log streams. reader_auth_groups: "all"
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm index 3d0bf44..0659cf4 100644 --- a/ios/chrome/app/main_controller.mm +++ b/ios/chrome/app/main_controller.mm
@@ -19,6 +19,7 @@ #include "base/mac/bundle_locations.h" #include "base/mac/foundation_util.h" #include "base/macros.h" +#include "base/metrics/histogram_macros.h" #include "base/path_service.h" #include "base/strings/sys_string_conversions.h" #include "base/task_scheduler/post_task.h" @@ -284,6 +285,21 @@ completionBlock:completion]; } +// Possible results of snapshotting at the moment the user enters the tab +// switcher. These values are persisted to logs. Entries should not be +// renumbered and numeric values should never be reused. +enum class ShowTabSwitcherSnapshotResult { + // Snapshot was not attempted, since the loading page will result in a stale + // snapshot. + kSnapshotNotAttemptedBecausePageIsLoading = 0, + // Snapshot was attempted, but the image is either the default image or nil. + kSnapshotAttemptedAndFailed = 1, + // Snapshot successfully taken. + kSnapshotSucceeded = 2, + // kMaxValue should share the value of the highest enumerator. + kMaxValue = kSnapshotSucceeded, +}; + } // namespace @interface MainController ()<BrowserStateStorageSwitching, @@ -1937,9 +1953,14 @@ ->SetSnapshotCoalescingEnabled(false); })); - // Do not take a snapshot if the web state is loading, since it will be - // stale. + // Capture metrics on snapshotting. + ShowTabSwitcherSnapshotResult snapshotResult = + ShowTabSwitcherSnapshotResult::kSnapshotSucceeded; if (currentTab.webState->IsLoading()) { + // Do not take a snapshot if the web state is loading, since it will be + // stale. + snapshotResult = ShowTabSwitcherSnapshotResult:: + kSnapshotNotAttemptedBecausePageIsLoading; SnapshotTabHelper::FromWebState(currentTab.webState)->RemoveSnapshot(); } else { UIImage* snapshot = SnapshotTabHelper::FromWebState(currentTab.webState) @@ -1950,9 +1971,13 @@ // generation fails, the stale snapshot should be removed so as not to // display an old snapshot. if (snapshot == SnapshotTabHelper::GetDefaultSnapshotImage()) { + snapshotResult = + ShowTabSwitcherSnapshotResult::kSnapshotAttemptedAndFailed; SnapshotTabHelper::FromWebState(currentTab.webState)->RemoveSnapshot(); } } + UMA_HISTOGRAM_ENUMERATION("IOS.ShowTabSwitcherSnapshotResult", + snapshotResult); } if (!_tabSwitcher) {
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb index f7cdd0b..22b79a3 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
@@ -10,7 +10,7 @@ <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Todos los derechos reservados.</translation> <translation id="2342981853652716282">Inicia sesión en Chrome para sincronizar los marcadores, las contraseñas y mucho más en todos tus dispositivos.</translation> <translation id="2347208864470321755">Cuando se activa esta función, Chrome ofrece la posibilidad de traducir páginas escritas en otros idiomas con el Traductor de Google. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> -<translation id="2436117022029368436">Se comunica con Google para mejorar la navegación y Chrome</translation> +<translation id="2436117022029368436">Se comunican con Google para mejorar la navegación y Chrome</translation> <translation id="2441696206556358796">Para guardar las imágenes, toca Configuración para permitir que Chrome utilice tus fotos</translation> <translation id="2576431527583832481">Chrome sigue mejorando. Hay una nueva versión disponible.</translation> <translation id="257708665678654955">¿Quieres que Google Chrome te ofrezca la posibilidad de traducir las páginas en <ph name="LANGUAGE_NAME" /> de este sitio web la próxima vez?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb index ba67bff..3571bd2 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_vi.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="vi"> -<translation id="114721135501989771">Dùng các tính năng thông minh của Google trong Chrome</translation> +<translation id="114721135501989771">Trải nghiệm Google thông minh trong Chrome</translation> <translation id="1326317727527857210">Để có các tab từ các thiết bị khác của bạn, hãy đăng nhập vào Chrome.</translation> <translation id="1759842336958782510">Chrome</translation> <translation id="1816764564654397850">T.báo b.mật của Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index e534f78..5658bf2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -90,7 +90,7 @@ <translation id="2386793615875593361">تم تحديد عنصر واحد</translation> <translation id="2435457462613246316">عرض كلمة المرور</translation> <translation id="2481538920734869610">إضافة حساب</translation> -<translation id="2523184218357549926">يُرسِل عناوين URL للصفحات التي تزورها إلى Google.</translation> +<translation id="2523184218357549926">يتم إرسال عناوين URL للصفحات التي تزورها إلى Google.</translation> <translation id="2523363575747517183">يحاول موقع الويب هذا فتح تطبيق آخر بشكلٍ متكرر.</translation> <translation id="2529021024822217800">فتح الكل</translation> <translation id="2572712655377361602">حظرت سياسة الجهاز الدخول إلى صورك</translation> @@ -402,7 +402,7 @@ <translation id="7947953824732555851">قبول وتسجيل الدخول</translation> <translation id="7961015016161918242">مطلقًا</translation> <translation id="7971521879845308059">حظر النوافذ المنبثقة</translation> -<translation id="7981313251711023384">التحميل المُسبق للصفحات للحصول على أداء أسرع للتصفح والبحث</translation> +<translation id="7981313251711023384">التحميل المُسبق للصفحات للحصول على أداء أسرع أثناء التصفّح والبحث</translation> <translation id="7982789257301363584">الشبكة</translation> <translation id="8019783059653722575">هذا يتيح لك حفظ الصور وتحميلها.</translation> <translation id="802154636333426148">تعذّر التنزيل</translation> @@ -446,7 +446,7 @@ <translation id="8730621377337864115">تم</translation> <translation id="8741995161408053644">قد يتضمن حسابك في Google على نماذج أخرى من سجل التصفح في <ph name="BEGIN_LINK" /> history.google.com <ph name="END_LINK" />.</translation> <translation id="8775144690796719618">عنوان URL غير صالح</translation> -<translation id="8820817407110198400">إشارات</translation> +<translation id="8820817407110198400">الإشارات المرجعية</translation> <translation id="8840513115188359703">لن يتم تسجيل خروجك من حساب Google.</translation> <translation id="8870413625673593573">العناصر المغلقة مؤخرًا</translation> <translation id="8881801611828450202">البحث في <ph name="SEARCH_ENGINE" /> عن هذه الصورة</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index 23c0858..adfcffd8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -23,6 +23,7 @@ <translation id="127138278192656016">Fes servir la sincronització i tots els serveis</translation> <translation id="1272079795634619415">Atura</translation> <translation id="1323735185997015385">Suprimeix</translation> +<translation id="132390688737681464">Desa i emplena les adreces</translation> <translation id="132683371494960526">Feu doble toc per canviar la carpeta principal.</translation> <translation id="1340643665687018190">Tanca el menú</translation> <translation id="1375321115329958930">Contrasenyes desades</translation> @@ -39,6 +40,7 @@ <translation id="1532451416480227577">Mostra les adreces i les targetes de crèdit de Google Pay</translation> <translation id="1540800554400757039">Adreça 1</translation> <translation id="1545749641540134597">Escaneja el codi QR</translation> +<translation id="1558704936695638228">Mantén premut el botó per veure més opcions de les pestanyes</translation> <translation id="1580783302095112590">Correu enviat.</translation> <translation id="1582732959743469162">S'aturarà completament la baixada actual.</translation> <translation id="1605658421715042784">Copia la imatge</translation> @@ -239,6 +241,7 @@ <translation id="5062321486222145940">Instal. de Google Drive</translation> <translation id="5083464117946352670">No es determina mida fitxer.</translation> <translation id="5094827893301452931">S'ha completat el tuit.</translation> +<translation id="5123982333065001601">Desa i emplena les targetes de crèdit</translation> <translation id="5173593619615111996">Tanca pestanyes d'incògnit</translation> <translation id="5181140330217080051">S'està baixant</translation> <translation id="5186185447130319458">Privat</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index c1a6bc7..1fe8bea 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -23,6 +23,7 @@ <translation id="127138278192656016">Use sync and all services</translation> <translation id="1272079795634619415">Stop</translation> <translation id="1323735185997015385">Delete</translation> +<translation id="132390688737681464">Save and Fill Addresses</translation> <translation id="132683371494960526">Double tap to change the parent folder.</translation> <translation id="1340643665687018190">Close menu</translation> <translation id="1375321115329958930">Saved Passwords</translation> @@ -39,6 +40,7 @@ <translation id="1532451416480227577">Show addresses and credit cards from Google Pay</translation> <translation id="1540800554400757039">Address 1</translation> <translation id="1545749641540134597">Scan QR Code</translation> +<translation id="1558704936695638228">Press and hold for more tab options</translation> <translation id="1580783302095112590">Mail sent.</translation> <translation id="1582732959743469162">This will stop all progress for your current download.</translation> <translation id="1605658421715042784">Copy image</translation> @@ -239,6 +241,7 @@ <translation id="5062321486222145940">Install Google Drive</translation> <translation id="5083464117946352670">Cannot determine file size.</translation> <translation id="5094827893301452931">Tweet completed.</translation> +<translation id="5123982333065001601">Save and Fill Credit Cards</translation> <translation id="5173593619615111996">Close all incognito tabs</translation> <translation id="5181140330217080051">Downloading</translation> <translation id="5186185447130319458">Private</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index 029ec81f..34ebf1d4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -23,6 +23,7 @@ <translation id="127138278192656016">Gunakan sinkronisasi dan semua layanan</translation> <translation id="1272079795634619415">Berhenti</translation> <translation id="1323735185997015385">Hapus</translation> +<translation id="132390688737681464">Simpan dan Isi Alamat</translation> <translation id="132683371494960526">Ketuk dua kali untuk mengubah folder induk.</translation> <translation id="1340643665687018190">Tutup Menu</translation> <translation id="1375321115329958930">Sandi Tersimpan</translation> @@ -39,6 +40,7 @@ <translation id="1532451416480227577">Tampilkan alamat dan kartu kredit dari Google Pay</translation> <translation id="1540800554400757039">Alamat 1</translation> <translation id="1545749641540134597">Pindai Kode QR</translation> +<translation id="1558704936695638228">Tekan dan tahan untuk menampilkan opsi tab lainnya</translation> <translation id="1580783302095112590">Email terkirim.</translation> <translation id="1582732959743469162">Ini akan menghentikan semua progres download Anda saat ini.</translation> <translation id="1605658421715042784">Salin Gambar</translation> @@ -239,6 +241,7 @@ <translation id="5062321486222145940">Instal Google Drive</translation> <translation id="5083464117946352670">Tidak dapat menentukan ukuran file.</translation> <translation id="5094827893301452931">Tweet selesai.</translation> +<translation id="5123982333065001601">Simpan dan Isi Kartu Kredit</translation> <translation id="5173593619615111996">Tutup Semua Tab Penyamaran</translation> <translation id="5181140330217080051">Mendownload</translation> <translation id="5186185447130319458">Pribadi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index bfe95b6..683d79c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -23,6 +23,7 @@ <translation id="127138278192656016">Gunakan penyegerakan dan semua perkhidmatan</translation> <translation id="1272079795634619415">Berhenti</translation> <translation id="1323735185997015385">Padam</translation> +<translation id="132390688737681464">Simpan dan Lengkapkan Alamat</translation> <translation id="132683371494960526">Ketik dua kali untuk menukar folder induk.</translation> <translation id="1340643665687018190">Tutup Menu</translation> <translation id="1375321115329958930">Kata Laluan Disimpan</translation> @@ -39,6 +40,7 @@ <translation id="1532451416480227577">Tunjukkan alamat dan kad kredit daripada Google Pay</translation> <translation id="1540800554400757039">Alamat 1</translation> <translation id="1545749641540134597">Imbas Kod QR</translation> +<translation id="1558704936695638228">Tekan dan tahan untuk mendapatkan lagi pilihan tab</translation> <translation id="1580783302095112590">Mel dihantar.</translation> <translation id="1582732959743469162">Ini akan menghentikan semua kemajuan bagi muat turun semasa anda.</translation> <translation id="1605658421715042784">Salin Imej</translation> @@ -239,6 +241,7 @@ <translation id="5062321486222145940">Pasang Google Drive</translation> <translation id="5083464117946352670">Tidak dapat menentukan saiz fail.</translation> <translation id="5094827893301452931">Tweet selesai.</translation> +<translation id="5123982333065001601">Simpan dan Lengkapkan Kad Kredit</translation> <translation id="5173593619615111996">Tutup Semua Tab Inkognito</translation> <translation id="5181140330217080051">Memuat turun</translation> <translation id="5186185447130319458">Peribadi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index 93bc0d95..4a69b97 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -82,7 +82,7 @@ <translation id="2267753748892043616">Thêm tài khoản</translation> <translation id="2273327106802955778">Menu khác</translation> <translation id="2320166752086256636">Ẩn bàn phím</translation> -<translation id="2339560363438331454">Đồng bộ hóa và dịch vụ của Google</translation> +<translation id="2339560363438331454">Đồng bộ hóa và các dịch vụ của Google</translation> <translation id="2351097562818989364">Đã đặt lại cài đặt dịch của bạn.</translation> <translation id="2354750644801399986">'Không theo dõi'</translation> <translation id="2359808026110333948">Tiếp tục</translation> @@ -245,7 +245,7 @@ <translation id="5190835502935405962">Thanh Dấu trang</translation> <translation id="5197255632782567636">Internet</translation> <translation id="5228579091201413441">Bật đồng bộ hóa</translation> -<translation id="5244474230056479698">Đồng bộ hóa với <ph name="EMAIL" /></translation> +<translation id="5244474230056479698">Đang đồng bộ hóa với <ph name="EMAIL" /></translation> <translation id="527973086555161537">Mở một tab để duyệt web ở chế độ riêng tư.</translation> <translation id="5300589172476337783">Hiển thị</translation> <translation id="5317780077021120954">Lưu</translation>
diff --git a/ios/chrome/browser/DEPS b/ios/chrome/browser/DEPS index a5b89bc..6c856b1 100644 --- a/ios/chrome/browser/DEPS +++ b/ios/chrome/browser/DEPS
@@ -22,7 +22,7 @@ "+components/feature_engagement", "+components/flags_ui", "+components/gcm_driver", - "+components/google/core/browser", + "+components/google/core", "+components/handoff", "+components/history/core/browser", "+components/history/ios/browser",
diff --git a/ios/chrome/browser/app_launcher/BUILD.gn b/ios/chrome/browser/app_launcher/BUILD.gn index 476393e..6db4b35a 100644 --- a/ios/chrome/browser/app_launcher/BUILD.gn +++ b/ios/chrome/browser/app_launcher/BUILD.gn
@@ -13,7 +13,10 @@ ] deps = [ "//base", + "//components/reading_list/core:core", "//ios/chrome/browser", + "//ios/chrome/browser/reading_list", + "//ios/chrome/browser/tabs", "//ios/chrome/browser/web:web_internal", "//ios/web/public", "//url", @@ -29,6 +32,7 @@ deps = [ ":app_launcher", "//base", + "//ios/chrome/browser", "//ios/chrome/browser/web:web_internal", "//ios/web/public/test/fakes", "//testing/gtest",
diff --git a/ios/chrome/browser/app_launcher/app_launcher_tab_helper.h b/ios/chrome/browser/app_launcher/app_launcher_tab_helper.h index c004b16..cf666f2 100644 --- a/ios/chrome/browser/app_launcher/app_launcher_tab_helper.h +++ b/ios/chrome/browser/app_launcher/app_launcher_tab_helper.h
@@ -54,6 +54,9 @@ AppLauncherAbuseDetector* abuse_detector, id<AppLauncherTabHelperDelegate> delegate); + // The WebState that this object is attached to. + web::WebState* web_state_ = nullptr; + // Used to check for repeated launches and provide policy for launching apps. AppLauncherAbuseDetector* abuse_detector_ = nil;
diff --git a/ios/chrome/browser/app_launcher/app_launcher_tab_helper.mm b/ios/chrome/browser/app_launcher/app_launcher_tab_helper.mm index 82897d17..514aafd 100644 --- a/ios/chrome/browser/app_launcher/app_launcher_tab_helper.mm +++ b/ios/chrome/browser/app_launcher/app_launcher_tab_helper.mm
@@ -8,8 +8,16 @@ #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" +#import "base/strings/sys_string_conversions.h" +#include "components/reading_list/core/reading_list_model.h" #import "ios/chrome/browser/app_launcher/app_launcher_tab_helper_delegate.h" +#import "ios/chrome/browser/chrome_url_util.h" +#include "ios/chrome/browser/reading_list/reading_list_model_factory.h" +#import "ios/chrome/browser/tabs/legacy_tab_helper.h" +#import "ios/chrome/browser/tabs/tab.h" #import "ios/chrome/browser/web/app_launcher_abuse_detector.h" +#import "ios/web/public/navigation_item.h" +#import "ios/web/public/navigation_manager.h" #import "ios/web/public/url_scheme_util.h" #import "ios/web/public/web_client.h" #import "net/base/mac/url_conversions.h" @@ -21,6 +29,35 @@ DEFINE_WEB_STATE_USER_DATA_KEY(AppLauncherTabHelper); +namespace { + +bool IsValidAppUrl(const GURL& app_url) { + if (!app_url.is_valid()) + return false; + + if (!app_url.has_scheme()) + return false; + + // If the url is a direct FIDO U2F x-callback call, consider it as invalid, to + // prevent pages from spoofing requests with different origins. + if (app_url.SchemeIs("u2f-x-callback")) + return false; + + // Block attempts to open this application's settings in the native system + // settings application. + if (app_url.SchemeIs("app-settings")) + return false; + return true; +} + +// Returns True if |app_url| has a Chrome bundle URL scheme. +bool HasChromeAppScheme(const GURL& app_url) { + NSArray* chrome_schemes = + [[ChromeAppConstants sharedInstance] getAllBundleURLSchemes]; + NSString* app_url_scheme = base::SysUTF8ToNSString(app_url.scheme()); + return [chrome_schemes containsObject:app_url_scheme]; +} + // This enum used by the Applauncher to log to UMA, if App launching request was // allowed or blocked. // These values are persisted to logs. Entries should not be renumbered and @@ -32,6 +69,8 @@ kCount, }; +} // namespace + void AppLauncherTabHelper::CreateForWebState( web::WebState* web_state, AppLauncherAbuseDetector* abuse_detector, @@ -49,6 +88,7 @@ AppLauncherAbuseDetector* abuse_detector, id<AppLauncherTabHelperDelegate> delegate) : web::WebStatePolicyDecider(web_state), + web_state_(web_state), abuse_detector_(abuse_detector), delegate_(delegate), weak_factory_(this) {} @@ -58,9 +98,6 @@ bool AppLauncherTabHelper::RequestToLaunchApp(const GURL& url, const GURL& source_page_url, bool link_tapped) { - if (!url.is_valid() || !url.has_scheme()) - return false; - // Don't open external application if chrome is not active. if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateActive) { @@ -118,31 +155,65 @@ bool AppLauncherTabHelper::ShouldAllowRequest( NSURLRequest* request, const web::WebStatePolicyDecider::RequestInfo& request_info) { - GURL requestURL = net::GURLWithNSURL(request.URL); - if (web::UrlHasWebScheme(requestURL) || - web::GetWebClient()->IsAppSpecificURL(requestURL) || - requestURL.SchemeIs(url::kFileScheme) || - requestURL.SchemeIs(url::kAboutScheme)) { + GURL request_url = net::GURLWithNSURL(request.URL); + if (web::UrlHasWebScheme(request_url) || + web::GetWebClient()->IsAppSpecificURL(request_url) || + request_url.SchemeIs(url::kFileScheme) || + request_url.SchemeIs(url::kAboutScheme)) { // This URL can be handled by the WebState and doesn't require App launcher // handling. return true; } - ExternalURLRequestStatus request_status = ExternalURLRequestStatus::kCount; - - if (request_info.target_frame_is_main) { - // TODO(crbug.com/852489): Check if the source frame should also be - // considered. - request_status = ExternalURLRequestStatus::kMainFrameRequestAllowed; - } else { - request_status = request_info.has_user_gesture - ? ExternalURLRequestStatus::kSubFrameRequestAllowed - : ExternalURLRequestStatus::kSubFrameRequestBlocked; + ExternalURLRequestStatus request_status = + ExternalURLRequestStatus::kMainFrameRequestAllowed; + // TODO(crbug.com/852489): Check if the source frame should also be + // considered. + if (!request_info.target_frame_is_main) { + request_status = ExternalURLRequestStatus::kSubFrameRequestAllowed; + // Don't allow navigations from iframe to apps if there is no user gesture + // or the URL scheme is for Chrome app. + if (!request_info.has_user_gesture || HasChromeAppScheme(request_url)) { + request_status = ExternalURLRequestStatus::kSubFrameRequestBlocked; + } } - - DCHECK_NE(request_status, ExternalURLRequestStatus::kCount); UMA_HISTOGRAM_ENUMERATION("WebController.ExternalURLRequestBlocking", request_status, ExternalURLRequestStatus::kCount); + // Request is blocked. + if (request_status == ExternalURLRequestStatus::kSubFrameRequestBlocked) + return false; - return request_status != ExternalURLRequestStatus::kSubFrameRequestBlocked; + Tab* tab = LegacyTabHelper::GetTabForWebState(web_state_); + + // If this is a Universal 2nd Factory (U2F) call, the origin needs to be + // checked to make sure it's secure and then update the |request_url| with + // the generated x-callback GURL based on x-callback-url specs. + if (request_url.SchemeIs("u2f")) { + GURL origin = web_state_->GetNavigationManager() + ->GetLastCommittedItem() + ->GetURL() + .GetOrigin(); + request_url = [tab XCallbackFromRequestURL:request_url originURL:origin]; + } + + const GURL& source_url = request_info.source_url; + bool is_link_transition = ui::PageTransitionTypeIncludingQualifiersIs( + request_info.transition_type, ui::PAGE_TRANSITION_LINK); + if (IsValidAppUrl(request_url) && + RequestToLaunchApp(request_url, source_url, is_link_transition)) { + // Clears pending navigation history after successfully launching the + // external app. + web_state_->GetNavigationManager()->DiscardNonCommittedItems(); + + // When opening applications, the navigation is cancelled. Report the + // opening of the application to the ReadingListWebStateObserver to mark the + // entry as read if needed. + if (source_url.is_valid()) { + ReadingListModel* model = + ReadingListModelFactory::GetForBrowserState(tab.browserState); + if (model && model->loaded()) + model->SetReadStatus(source_url, true); + } + } + return false; }
diff --git a/ios/chrome/browser/app_launcher/app_launcher_tab_helper_unittest.mm b/ios/chrome/browser/app_launcher/app_launcher_tab_helper_unittest.mm index ff1156d1..a56796cb 100644 --- a/ios/chrome/browser/app_launcher/app_launcher_tab_helper_unittest.mm +++ b/ios/chrome/browser/app_launcher/app_launcher_tab_helper_unittest.mm
@@ -8,7 +8,9 @@ #include "base/compiler_specific.h" #import "ios/chrome/browser/app_launcher/app_launcher_tab_helper_delegate.h" +#import "ios/chrome/browser/chrome_url_util.h" #import "ios/chrome/browser/web/app_launcher_abuse_detector.h" +#import "ios/web/public/test/fakes/test_navigation_manager.h" #import "ios/web/public/test/fakes/test_web_state.h" #include "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" @@ -66,6 +68,19 @@ } @end +namespace { +// A fake NavigationManager to be used by the WebState object for the +// AppLauncher. +class FakeNavigationManager : public web::TestNavigationManager { + public: + FakeNavigationManager() = default; + + // web::NavigationManager implementation. + void DiscardNonCommittedItems() override {} + + DISALLOW_COPY_AND_ASSIGN(FakeNavigationManager); +}; + // Test fixture for AppLauncherTabHelper class. class AppLauncherTabHelperTest : public PlatformTest { protected: @@ -74,12 +89,15 @@ delegate_([[FakeAppLauncherTabHelperDelegate alloc] init]) { AppLauncherTabHelper::CreateForWebState(&web_state_, abuse_detector_, delegate_); + // Allow is the default policy for this test. + abuse_detector_.policy = ExternalAppLaunchPolicyAllow; + web_state_.SetNavigationManager(std::make_unique<FakeNavigationManager>()); tab_helper_ = AppLauncherTabHelper::FromWebState(&web_state_); } - bool VerifyRequestAllowed(NSString* url_string, - bool target_frame_is_main, - bool has_user_gesture) WARN_UNUSED_RESULT { + bool TestShouldAllowRequest(NSString* url_string, + bool target_frame_is_main, + bool has_user_gesture) WARN_UNUSED_RESULT { NSURL* url = [NSURL URLWithString:url_string]; web::WebStatePolicyDecider::RequestInfo request_info( ui::PageTransition::PAGE_TRANSITION_LINK, @@ -95,34 +113,22 @@ AppLauncherTabHelper* tab_helper_; }; -// Tests that an empty URL does not show alert or launch app. -TEST_F(AppLauncherTabHelperTest, EmptyUrl) { - tab_helper_->RequestToLaunchApp(GURL::EmptyGURL(), GURL::EmptyGURL(), false); - EXPECT_EQ(0U, delegate_.countOfAlertsShown); - EXPECT_EQ(0U, delegate_.countOfAppsLaunched); -} - -// Tests that an invalid URL does not show alert or launch app. -TEST_F(AppLauncherTabHelperTest, InvalidUrl) { - tab_helper_->RequestToLaunchApp(GURL("invalid"), GURL::EmptyGURL(), false); - EXPECT_EQ(0U, delegate_.countOfAlertsShown); - EXPECT_EQ(0U, delegate_.countOfAppsLaunched); -} - -// Tests that a valid URL does launch app. -TEST_F(AppLauncherTabHelperTest, ValidUrl) { +// Tests that a valid URL launches app. +TEST_F(AppLauncherTabHelperTest, AbuseDetectorPolicyAllowedForValidUrl) { abuse_detector_.policy = ExternalAppLaunchPolicyAllow; - tab_helper_->RequestToLaunchApp(GURL("valid://1234"), GURL::EmptyGURL(), - false); + EXPECT_FALSE(TestShouldAllowRequest(@"valid://1234", + /*target_frame_is_main=*/true, + /*has_user_gesture=*/false)); EXPECT_EQ(1U, delegate_.countOfAppsLaunched); EXPECT_EQ(GURL("valid://1234"), delegate_.lastLaunchedAppURL); } // Tests that a valid URL does not launch app when launch policy is to block. -TEST_F(AppLauncherTabHelperTest, ValidUrlBlocked) { +TEST_F(AppLauncherTabHelperTest, AbuseDetectorPolicyBlockedForValidUrl) { abuse_detector_.policy = ExternalAppLaunchPolicyBlock; - tab_helper_->RequestToLaunchApp(GURL("valid://1234"), GURL::EmptyGURL(), - false); + EXPECT_FALSE(TestShouldAllowRequest(@"valid://1234", + /*target_frame_is_main=*/true, + /*has_user_gesture=*/false)); EXPECT_EQ(0U, delegate_.countOfAlertsShown); EXPECT_EQ(0U, delegate_.countOfAppsLaunched); } @@ -132,8 +138,10 @@ TEST_F(AppLauncherTabHelperTest, ValidUrlPromptUserAccepts) { abuse_detector_.policy = ExternalAppLaunchPolicyPrompt; delegate_.simulateUserAcceptingPrompt = YES; - tab_helper_->RequestToLaunchApp(GURL("valid://1234"), GURL::EmptyGURL(), - false); + EXPECT_FALSE(TestShouldAllowRequest(@"valid://1234", + /*target_frame_is_main=*/true, + /*has_user_gesture=*/false)); + EXPECT_EQ(1U, delegate_.countOfAlertsShown); EXPECT_EQ(1U, delegate_.countOfAppsLaunched); EXPECT_EQ(GURL("valid://1234"), delegate_.lastLaunchedAppURL); @@ -144,37 +152,95 @@ TEST_F(AppLauncherTabHelperTest, ValidUrlPromptUserRejects) { abuse_detector_.policy = ExternalAppLaunchPolicyPrompt; delegate_.simulateUserAcceptingPrompt = NO; - tab_helper_->RequestToLaunchApp(GURL("valid://1234"), GURL::EmptyGURL(), - false); + EXPECT_FALSE(TestShouldAllowRequest(@"valid://1234", + /*target_frame_is_main=*/true, + /*has_user_gesture=*/false)); EXPECT_EQ(0U, delegate_.countOfAppsLaunched); } -// Tests that ShouldAllowRequest only allows requests for App Urls in main -// frame, or iframe when there was a recent user interaction. +// Tests that ShouldAllowRequest only launches apps for App Urls in main frame, +// or iframe when there was a recent user interaction. TEST_F(AppLauncherTabHelperTest, ShouldAllowRequestWithAppUrl) { NSString* url_string = @"itms-apps://itunes.apple.com/us/app/appname/id123"; - EXPECT_TRUE(VerifyRequestAllowed(url_string, /*target_frame_is_main=*/true, - /*has_user_gesture=*/false)); - EXPECT_TRUE(VerifyRequestAllowed(url_string, /*target_frame_is_main=*/true, - /*has_user_gesture=*/true)); - EXPECT_FALSE(VerifyRequestAllowed(url_string, /*target_frame_is_main=*/false, - /*has_user_gesture=*/false)); - EXPECT_TRUE(VerifyRequestAllowed(url_string, /*target_frame_is_main=*/false, - /*has_user_gesture=*/true)); + EXPECT_FALSE(TestShouldAllowRequest(url_string, /*target_frame_is_main=*/true, + /*has_user_gesture=*/false)); + EXPECT_EQ(1U, delegate_.countOfAppsLaunched); + + EXPECT_FALSE(TestShouldAllowRequest(url_string, /*target_frame_is_main=*/true, + /*has_user_gesture=*/true)); + EXPECT_EQ(2U, delegate_.countOfAppsLaunched); + + EXPECT_FALSE(TestShouldAllowRequest(url_string, + /*target_frame_is_main=*/false, + /*has_user_gesture=*/false)); + EXPECT_EQ(2U, delegate_.countOfAppsLaunched); + + EXPECT_FALSE(TestShouldAllowRequest(url_string, + /*target_frame_is_main=*/false, + /*has_user_gesture=*/true)); + EXPECT_EQ(3U, delegate_.countOfAppsLaunched); } -// Tests that ShouldAllowRequest always allows requests for non App Urls. +// Tests that ShouldAllowRequest always allows requests and does not launch +// apps for non App Urls. TEST_F(AppLauncherTabHelperTest, ShouldAllowRequestWithNonAppUrl) { - EXPECT_TRUE(VerifyRequestAllowed( + EXPECT_TRUE(TestShouldAllowRequest( @"http://itunes.apple.com/us/app/appname/id123", /*target_frame_is_main=*/true, /*has_user_gesture=*/false)); - EXPECT_TRUE(VerifyRequestAllowed(@"file://a/b/c", - /*target_frame_is_main=*/true, - /*has_user_gesture=*/true)); - EXPECT_TRUE(VerifyRequestAllowed(@"about://test", - /*target_frame_is_main=*/false, - /*has_user_gesture=*/false)); - EXPECT_TRUE(VerifyRequestAllowed(@"data://test", - /*target_frame_is_main=*/false, - /*has_user_gesture=*/true)); + EXPECT_TRUE(TestShouldAllowRequest(@"file://a/b/c", + /*target_frame_is_main=*/true, + /*has_user_gesture=*/true)); + EXPECT_TRUE(TestShouldAllowRequest(@"about://test", + /*target_frame_is_main=*/false, + /*has_user_gesture=*/false)); + EXPECT_TRUE(TestShouldAllowRequest(@"data://test", + /*target_frame_is_main=*/false, + /*has_user_gesture=*/true)); + EXPECT_EQ(0U, delegate_.countOfAppsLaunched); } + +// Tests that invalid Urls are completely blocked. +TEST_F(AppLauncherTabHelperTest, InvalidUrls) { + EXPECT_FALSE(TestShouldAllowRequest(@"", + /*target_frame_is_main=*/true, + /*has_user_gesture=*/false)); + EXPECT_FALSE(TestShouldAllowRequest(@"invalid", + /*target_frame_is_main=*/true, + /*has_user_gesture=*/false)); + EXPECT_EQ(0U, delegate_.countOfAppsLaunched); +} + +// Tests that URLs with schemes that might be a security risk are blocked. +TEST_F(AppLauncherTabHelperTest, InsecureUrls) { + EXPECT_FALSE(TestShouldAllowRequest(@"app-settings://", + /*target_frame_is_main=*/true, + /*has_user_gesture=*/false)); + EXPECT_FALSE(TestShouldAllowRequest(@"u2f-x-callback://test", + /*target_frame_is_main=*/true, + /*has_user_gesture=*/false)); + EXPECT_EQ(0U, delegate_.countOfAppsLaunched); +} + +// Tests that URLs with Chrome Bundle schemes are blocked on iframes. +TEST_F(AppLauncherTabHelperTest, ChromeBundleUrlScheme) { + // Get the test bundle URL Scheme. + NSString* scheme = [[ChromeAppConstants sharedInstance] getBundleURLScheme]; + NSString* url = [NSString stringWithFormat:@"%@://www.google.com", scheme]; + EXPECT_FALSE(TestShouldAllowRequest(url, + /*target_frame_is_main=*/false, + /*has_user_gesture=*/false)); + EXPECT_EQ(0U, delegate_.countOfAppsLaunched); + + EXPECT_FALSE(TestShouldAllowRequest(url, + /*target_frame_is_main=*/false, + /*has_user_gesture=*/true)); + EXPECT_EQ(0U, delegate_.countOfAppsLaunched); + + // Chrome Bundle URL scheme is only allowed from main frames. + EXPECT_FALSE(TestShouldAllowRequest(url, + /*target_frame_is_main=*/true, + /*has_user_gesture=*/false)); + + EXPECT_EQ(1U, delegate_.countOfAppsLaunched); +} +} // namespace
diff --git a/ios/chrome/browser/application_context_impl.cc b/ios/chrome/browser/application_context_impl.cc index 6ba494d65..8f79074 100644 --- a/ios/chrome/browser/application_context_impl.cc +++ b/ios/chrome/browser/application_context_impl.cc
@@ -57,30 +57,6 @@ #include "services/metrics/public/cpp/ukm_recorder.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" -namespace { - -// Requests a network::mojom::ProxyResolvingSocketFactory on the UI thread. -// Note that this cannot be called on a thread that is not the UI thread. -void RequestProxyResolvingSocketFactoryOnUIThread( - ApplicationContextImpl* app_context, - network::mojom::ProxyResolvingSocketFactoryRequest request) { - network::mojom::NetworkContext* network_context = - app_context->GetSystemNetworkContext(); - network_context->CreateProxyResolvingSocketFactory(std::move(request)); -} - -// Wrapper on top of the method above. This does a PostTask to the UI thread. -void RequestProxyResolvingSocketFactory( - ApplicationContextImpl* app_context, - network::mojom::ProxyResolvingSocketFactoryRequest request) { - web::WebThread::GetTaskRunnerForThread(web::WebThread::UI) - ->PostTask(FROM_HERE, - base::BindOnce(&RequestProxyResolvingSocketFactoryOnUIThread, - app_context, std::move(request))); -} - -} // namespace - ApplicationContextImpl::ApplicationContextImpl( base::SequencedTaskRunner* local_state_task_runner, const base::CommandLine& command_line, @@ -396,11 +372,7 @@ gcm_driver_ = gcm::CreateGCMDriverDesktop( base::WrapUnique(new gcm::GCMClientFactory), GetLocalState(), store_path, - // Because ApplicationContextImpl is destroyed after all WebThreads have - // been shut down, base::Unretained() is safe here. - base::BindRepeating(&RequestProxyResolvingSocketFactory, - base::Unretained(this)), - GetSharedURLLoaderFactory(), ::GetChannel(), + GetSystemURLRequestContext(), GetSharedURLLoaderFactory(), ::GetChannel(), IOSChromeGCMProfileServiceFactory::GetProductCategoryForSubtypes(), web::WebThread::GetTaskRunnerForThread(web::WebThread::UI), web::WebThread::GetTaskRunnerForThread(web::WebThread::IO),
diff --git a/ios/chrome/browser/chrome_url_util.h b/ios/chrome/browser/chrome_url_util.h index 4579acf..d00317e7 100644 --- a/ios/chrome/browser/chrome_url_util.h +++ b/ios/chrome/browser/chrome_url_util.h
@@ -35,6 +35,9 @@ // Returns the URL scheme that launches Chrome. - (NSString*)getBundleURLScheme; +// Returns all the URL schemes that are registered on the Application Bundle. +- (NSArray*)getAllBundleURLSchemes; + // Method to set the scheme to callback Chrome iOS for testing. - (void)setCallbackSchemeForTesting:(NSString*)callbackScheme;
diff --git a/ios/chrome/browser/chrome_url_util.mm b/ios/chrome/browser/chrome_url_util.mm index 583bc16..ca5b44ab 100644 --- a/ios/chrome/browser/chrome_url_util.mm +++ b/ios/chrome/browser/chrome_url_util.mm
@@ -51,6 +51,7 @@ @implementation ChromeAppConstants { NSString* _callbackScheme; + NSArray* _schemes; } + (ChromeAppConstants*)sharedInstance { @@ -63,22 +64,29 @@ NSSet* allowableSchemes = [NSSet setWithObjects:@"googlechrome", @"chromium", @"ios-chrome-unittests.http", nil]; - NSDictionary* info = [[NSBundle mainBundle] infoDictionary]; - NSArray* urlTypes = [info objectForKey:@"CFBundleURLTypes"]; - for (NSDictionary* urlType in urlTypes) { - DCHECK([urlType isKindOfClass:[NSDictionary class]]); - NSArray* schemes = - base::mac::ObjCCastStrict<NSArray>(urlType[@"CFBundleURLSchemes"]); - for (NSString* scheme in schemes) { - if ([allowableSchemes containsObject:scheme]) - _callbackScheme = [scheme copy]; - } + NSArray* schemes = [self getAllBundleURLSchemes]; + for (NSString* scheme in schemes) { + if ([allowableSchemes containsObject:scheme]) + _callbackScheme = [scheme copy]; } } DCHECK([_callbackScheme length]); return _callbackScheme; } +- (NSArray*)getAllBundleURLSchemes { + if (!_schemes) { + NSDictionary* info = [[NSBundle mainBundle] infoDictionary]; + NSArray* urlTypes = [info objectForKey:@"CFBundleURLTypes"]; + for (NSDictionary* urlType in urlTypes) { + DCHECK([urlType isKindOfClass:[NSDictionary class]]); + _schemes = [base::mac::ObjCCastStrict<NSArray>( + urlType[@"CFBundleURLSchemes"]) copy]; + } + } + return _schemes; +} + - (void)setCallbackSchemeForTesting:(NSString*)scheme { _callbackScheme = [scheme copy]; }
diff --git a/ios/chrome/browser/chrome_url_util_unittest.mm b/ios/chrome/browser/chrome_url_util_unittest.mm index a898f46..dd94630 100644 --- a/ios/chrome/browser/chrome_url_util_unittest.mm +++ b/ios/chrome/browser/chrome_url_util_unittest.mm
@@ -72,4 +72,15 @@ [constants setCallbackSchemeForTesting:originalScheme]; } +TEST_F(ChromeURLUtilTest, GetAllBundleURLSchemes) { + // Verifies that there is at least 3 scheme (regular, secure and callback). + ChromeAppConstants* constants = [ChromeAppConstants sharedInstance]; + NSArray* schemes = [constants getAllBundleURLSchemes]; + EXPECT_GT([schemes count], 2U); + + // Verifies that at least the main unit test scheme is in returned schemes. + NSString* unittestScheme = @"ios-chrome-unittests.http"; + EXPECT_TRUE([schemes containsObject:unittestScheme]); +} + } // namespace
diff --git a/ios/chrome/browser/gcm/ios_chrome_gcm_profile_service_factory.cc b/ios/chrome/browser/gcm/ios_chrome_gcm_profile_service_factory.cc index 3717c26..c587e2e6 100644 --- a/ios/chrome/browser/gcm/ios_chrome_gcm_profile_service_factory.cc +++ b/ios/chrome/browser/gcm/ios_chrome_gcm_profile_service_factory.cc
@@ -20,35 +20,6 @@ #include "ios/chrome/common/channel_info.h" #include "ios/web/public/web_thread.h" #include "services/network/public/cpp/shared_url_loader_factory.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" - -namespace { - -// Requests a ProxyResolvingSocketFactoryPtr on the UI thread. Note that a -// WeakPtr of GCMProfileService is needed to detect when the KeyedService shuts -// down, and avoid calling into |profile| which might have also been destroyed. -void RequestProxyResolvingSocketFactoryOnUIThread( - web::BrowserState* context, - base::WeakPtr<gcm::GCMProfileService> service, - network::mojom::ProxyResolvingSocketFactoryRequest request) { - if (!service) - return; - context->GetProxyResolvingSocketFactory(std::move(request)); -} - -// A thread-safe wrapper to request a ProxyResolvingSocketFactoryPtr. -void RequestProxyResolvingSocketFactory( - web::BrowserState* context, - base::WeakPtr<gcm::GCMProfileService> service, - network::mojom::ProxyResolvingSocketFactoryRequest request) { - web::WebThread::GetTaskRunnerForThread(web::WebThread::UI) - ->PostTask( - FROM_HERE, - base::BindOnce(&RequestProxyResolvingSocketFactoryOnUIThread, context, - std::move(service), std::move(request))); -} - -} // namespace // static gcm::GCMProfileService* IOSChromeGCMProfileServiceFactory::GetForBrowserState( @@ -97,7 +68,6 @@ return std::make_unique<gcm::GCMProfileService>( browser_state->GetPrefs(), browser_state->GetStatePath(), browser_state->GetRequestContext(), - base::BindRepeating(&RequestProxyResolvingSocketFactory, context), browser_state->GetSharedURLLoaderFactory(), ::GetChannel(), GetProductCategoryForSubtypes(), IdentityManagerFactory::GetForBrowserState(browser_state),
diff --git a/ios/chrome/browser/geolocation/omnibox_geolocation_controller.mm b/ios/chrome/browser/geolocation/omnibox_geolocation_controller.mm index 44497be..a173d16e 100644 --- a/ios/chrome/browser/geolocation/omnibox_geolocation_controller.mm +++ b/ios/chrome/browser/geolocation/omnibox_geolocation_controller.mm
@@ -12,7 +12,7 @@ #include "base/logging.h" #include "base/metrics/histogram_macros.h" #include "base/version.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/version_info/version_info.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/geolocation/CLLocation+OmniboxGeolocation.h"
diff --git a/ios/chrome/browser/metrics/new_tab_page_uma.mm b/ios/chrome/browser/metrics/new_tab_page_uma.mm index 77b54e8..ff0121ba 100644 --- a/ios/chrome/browser/metrics/new_tab_page_uma.mm +++ b/ios/chrome/browser/metrics/new_tab_page_uma.mm
@@ -5,7 +5,7 @@ #import "ios/chrome/browser/metrics/new_tab_page_uma.h" #include "base/metrics/histogram_macros.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/chrome_url_constants.h" #import "ios/chrome/browser/tabs/tab.h"
diff --git a/ios/chrome/browser/prerender/preload_controller.mm b/ios/chrome/browser/prerender/preload_controller.mm index f2ac0d69..ee2953f 100644 --- a/ios/chrome/browser/prerender/preload_controller.mm +++ b/ios/chrome/browser/prerender/preload_controller.mm
@@ -500,16 +500,6 @@ [self schedulePrerenderCancel]; } -#pragma mark - CRWWebDelegate protocol - -- (BOOL)openExternalURL:(const GURL&)URL - sourceURL:(const GURL&)sourceURL - linkClicked:(BOOL)linkClicked { - DCHECK(webState_); - Tab* tab = LegacyTabHelper::GetTabForWebState(webState_.get()); - return [tab openExternalURL:URL sourceURL:sourceURL linkClicked:linkClicked]; -} - #pragma mark - ManageAccountsDelegate - (void)onManageAccounts {
diff --git a/ios/chrome/browser/reading_list/reading_list_distiller_page.mm b/ios/chrome/browser/reading_list/reading_list_distiller_page.mm index b29225f5..6c9fa81 100644 --- a/ios/chrome/browser/reading_list/reading_list_distiller_page.mm +++ b/ios/chrome/browser/reading_list/reading_list_distiller_page.mm
@@ -10,7 +10,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/threading/thread_task_runner_handle.h" #include "components/favicon/ios/web_favicon_driver.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "ios/chrome/browser/reading_list/favicon_web_state_dispatcher_impl.h" #import "ios/web/public/navigation_item.h" #import "ios/web/public/navigation_manager.h"
diff --git a/ios/chrome/browser/search_engines/ui_thread_search_terms_data.cc b/ios/chrome/browser/search_engines/ui_thread_search_terms_data.cc index 714ef84..b4433f8 100644 --- a/ios/chrome/browser/search_engines/ui_thread_search_terms_data.cc +++ b/ios/chrome/browser/search_engines/ui_thread_search_terms_data.cc
@@ -7,7 +7,7 @@ #include "base/logging.h" #include "base/strings/string16.h" #include "components/google/core/browser/google_url_tracker.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/omnibox/browser/omnibox_field_trial.h" #include "components/version_info/version_info.h" #include "ios/chrome/browser/application_context.h"
diff --git a/ios/chrome/browser/suggestions/suggestions_service_factory.mm b/ios/chrome/browser/suggestions/suggestions_service_factory.mm index 7cbd4ad..41b6224c 100644 --- a/ios/chrome/browser/suggestions/suggestions_service_factory.mm +++ b/ios/chrome/browser/suggestions/suggestions_service_factory.mm
@@ -95,9 +95,10 @@ new ImageManager(std::move(image_fetcher), std::move(db), database_dir)); return std::make_unique<SuggestionsServiceImpl>( - identity_manager, sync_service, browser_state->GetRequestContext(), - std::move(suggestions_store), std::move(thumbnail_manager), - std::move(blacklist_store), base::DefaultTickClock::GetInstance()); + identity_manager, sync_service, + browser_state->GetSharedURLLoaderFactory(), std::move(suggestions_store), + std::move(thumbnail_manager), std::move(blacklist_store), + base::DefaultTickClock::GetInstance()); } void SuggestionsServiceFactory::RegisterBrowserStatePrefs(
diff --git a/ios/chrome/browser/tabs/tab.h b/ios/chrome/browser/tabs/tab.h index 66dbd8f..108f36e 100644 --- a/ios/chrome/browser/tabs/tab.h +++ b/ios/chrome/browser/tabs/tab.h
@@ -162,8 +162,15 @@ // Evaluates U2F result. - (void)evaluateU2FResultFromURL:(const GURL&)url; +// Generates a GURL compliant with the x-callback-url specs for FIDO Universal +// 2nd Factory (U2F) requests. Returns empty GURL if origin is not secure. +// See http://x-callback-url.com/specifications/ for specifications. +- (GURL)XCallbackFromRequestURL:(const GURL&)requestURL + originURL:(const GURL&)originURL; + // Sends a notification to indicate that |url| is going to start loading. - (void)notifyTabOfUrlMayStartLoading:(const GURL&)url; + @end #endif // IOS_CHROME_BROWSER_TABS_TAB_H_
diff --git a/ios/chrome/browser/tabs/tab.mm b/ios/chrome/browser/tabs/tab.mm index 998bb35..ff7113c 100644 --- a/ios/chrome/browser/tabs/tab.mm +++ b/ios/chrome/browser/tabs/tab.mm
@@ -25,7 +25,7 @@ #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/history/core/browser/history_context.h" #include "components/history/core/browser/history_service.h" #include "components/history/core/browser/top_sites.h" @@ -38,7 +38,6 @@ #include "components/search_engines/template_url_service.h" #include "components/strings/grit/components_strings.h" #include "components/url_formatter/url_formatter.h" -#import "ios/chrome/browser/app_launcher/app_launcher_tab_helper.h" #include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/chrome_url_constants.h" @@ -402,6 +401,18 @@ webState:self.webState]; } +- (GURL)XCallbackFromRequestURL:(const GURL&)requestURL + originURL:(const GURL&)originURL { + // Create U2FController object lazily. + if (!_secondFactorController) + _secondFactorController = [[U2FController alloc] init]; + return [_secondFactorController + XCallbackFromRequestURL:requestURL + originURL:originURL + tabURL:self.webState->GetLastCommittedURL() + tabID:self.tabId]; +} + #pragma mark - CRWWebStateObserver protocol - (void)webState:(web::WebState*)webState @@ -447,69 +458,6 @@ _webStateImpl = nullptr; } -#pragma mark - CRWWebDelegate protocol - -- (BOOL)openExternalURL:(const GURL&)url - sourceURL:(const GURL&)sourceURL - linkClicked:(BOOL)linkClicked { - // Make a local url copy for possible modification. - GURL finalURL = url; - - // Check if it's a direct FIDO U2F x-callback call. If so, do not open it, to - // prevent pages from spoofing requests with different origins. - if (finalURL.SchemeIs("u2f-x-callback")) - return NO; - - // Block attempts to open this application's settings in the native system - // settings application. - if (finalURL.SchemeIs("app-settings")) - return NO; - - // Check if it's a FIDO U2F call. - if (finalURL.SchemeIs("u2f")) { - // Create U2FController object lazily. - if (!_secondFactorController) - _secondFactorController = [[U2FController alloc] init]; - - DCHECK([self navigationManager]); - GURL origin = - [self navigationManager]->GetLastCommittedItem()->GetURL().GetOrigin(); - - // Compose u2f-x-callback URL and update urlToOpen. - finalURL = [_secondFactorController - XCallbackFromRequestURL:finalURL - originURL:origin - tabURL:self.webState->GetLastCommittedURL() - tabID:self.tabId]; - - if (!finalURL.is_valid()) - return NO; - } - - AppLauncherTabHelper* appLauncherTabHelper = - AppLauncherTabHelper::FromWebState(self.webState); - if (appLauncherTabHelper->RequestToLaunchApp(finalURL, sourceURL, - linkClicked)) { - // Clears pending navigation history after successfully launching the - // external app. - DCHECK([self navigationManager]); - [self navigationManager]->DiscardNonCommittedItems(); - // Ensure the UI reflects the current entry, not the just-discarded pending - // entry. - [_parentTabModel notifyTabChanged:self]; - - if (sourceURL.is_valid()) { - ReadingListModel* model = - ReadingListModelFactory::GetForBrowserState(_browserState); - if (model && model->loaded()) - model->SetReadStatus(sourceURL, true); - } - - return YES; - } - return NO; -} - #pragma mark - Private methods - (OpenInController*)openInController {
diff --git a/ios/chrome/browser/tabs/tab_unittest.mm b/ios/chrome/browser/tabs/tab_unittest.mm index 5cb9f1f..28f2a5f 100644 --- a/ios/chrome/browser/tabs/tab_unittest.mm +++ b/ios/chrome/browser/tabs/tab_unittest.mm
@@ -68,7 +68,6 @@ #undef catch namespace { -const char kAppSettingsUrl[] = "app-settings://"; const char kNewTabUrl[] = "chrome://newtab/"; const char kGoogleUserUrl[] = "http://google.com"; const char kGoogleRedirectUrl[] = "http://www.google.fr/"; @@ -317,13 +316,6 @@ CheckCurrentItem(results[0]); } -TEST_F(TabTest, FailToOpenAppSettings) { - GURL app_settings_url = GURL(kAppSettingsUrl); - BOOL will_open_app_settings = - [tab_ openExternalURL:app_settings_url sourceURL:GURL() linkClicked:YES]; - EXPECT_FALSE(will_open_app_settings); -} - // TODO(crbug.com/378098): Disabled because forward/back is now implemented in // CRWWebController, so this test cannot function with a mock CRWWebController. // Rewrite and re-enable this test when it becomes a CRWWebController or
diff --git a/ios/chrome/browser/u2f/u2f_controller.mm b/ios/chrome/browser/u2f/u2f_controller.mm index 148c5ade7..e55fe043 100644 --- a/ios/chrome/browser/u2f/u2f_controller.mm +++ b/ios/chrome/browser/u2f/u2f_controller.mm
@@ -9,7 +9,7 @@ #include "base/strings/stringprintf.h" #import "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "crypto/random.h" #import "ios/chrome/browser/chrome_url_util.h" #include "ios/chrome/common/x_callback_url.h"
diff --git a/ios/chrome/browser/ui/authentication/signin_confirmation_view_controller.mm b/ios/chrome/browser/ui/authentication/signin_confirmation_view_controller.mm index d5734ac3..276bfd5 100644 --- a/ios/chrome/browser/ui/authentication/signin_confirmation_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/signin_confirmation_view_controller.mm
@@ -7,7 +7,7 @@ #import "base/mac/foundation_util.h" #include "base/metrics/user_metrics.h" #import "base/strings/sys_string_conversions.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/signin/chrome_identity_service_observer_bridge.h" #import "ios/chrome/browser/ui/authentication/account_control_item.h"
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm index cf0c232..2639b90a 100644 --- a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm
@@ -5,7 +5,7 @@ #import "ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.h" #include "base/logging.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "ios/chrome/browser/application_context.h" #import "ios/chrome/browser/ui/authentication/unified_consent/identity_picker_view.h" #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
diff --git a/ios/chrome/browser/ui/contextual_search/contextual_search_controller.mm b/ios/chrome/browser/ui/contextual_search/contextual_search_controller.mm index 72e2e23..fa66e1f 100644 --- a/ios/chrome/browser/ui/contextual_search/contextual_search_controller.mm +++ b/ios/chrome/browser/ui/contextual_search/contextual_search_controller.mm
@@ -16,7 +16,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "base/values.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/search_engines/template_url_service.h" #include "ios/chrome/browser/application_context.h" #import "ios/chrome/browser/procedural_block_types.h"
diff --git a/ios/chrome/browser/ui/contextual_search/contextual_search_delegate.cc b/ios/chrome/browser/ui/contextual_search/contextual_search_delegate.cc index 3712330..5b7bff9 100644 --- a/ios/chrome/browser/ui/contextual_search/contextual_search_delegate.cc +++ b/ios/chrome/browser/ui/contextual_search/contextual_search_delegate.cc
@@ -13,7 +13,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/search_engines/template_url_service.h" #include "components/search_engines/util.h" #include "components/variations/net/variations_http_headers.h"
diff --git a/ios/chrome/browser/ui/history/history_clear_browsing_data_coordinator.h b/ios/chrome/browser/ui/history/history_clear_browsing_data_coordinator.h index 070b25d..b19a0b7 100644 --- a/ios/chrome/browser/ui/history/history_clear_browsing_data_coordinator.h +++ b/ios/chrome/browser/ui/history/history_clear_browsing_data_coordinator.h
@@ -31,6 +31,10 @@ // Delegate used to make the Tab UI visible. @property(nonatomic, weak) id<HistoryPresentationDelegate> presentationDelegate; +// Stops this Coordinator then calls |completionHandler|. |completionHandler| +// always will be run. +- (void)stopWithCompletion:(ProceduralBlock)completionHandler; + @end #endif // IOS_CHROME_BROWSER_UI_HISTORY_HISTORY_CLEAR_BROWSING_DATA_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/history/history_clear_browsing_data_coordinator.mm b/ios/chrome/browser/ui/history/history_clear_browsing_data_coordinator.mm index 868468a..5ae326d9 100644 --- a/ios/chrome/browser/ui/history/history_clear_browsing_data_coordinator.mm +++ b/ios/chrome/browser/ui/history/history_clear_browsing_data_coordinator.mm
@@ -63,6 +63,17 @@ completion:nil]; } +- (void)stopWithCompletion:(ProceduralBlock)completionHandler { + if (self.historyClearBrowsingDataNavigationController) { + [self.historyClearBrowsingDataNavigationController + dismissViewControllerAnimated:YES + completion:completionHandler]; + self.historyClearBrowsingDataNavigationController = nil; + } else if (completionHandler) { + completionHandler(); + } +} + #pragma mark - ClearBrowsingDataLocalCommands - (void)openURL:(const GURL&)URL {
diff --git a/ios/chrome/browser/ui/history/history_coordinator.mm b/ios/chrome/browser/ui/history/history_coordinator.mm index 2cbbd85..f7a91f11 100644 --- a/ios/chrome/browser/ui/history/history_coordinator.mm +++ b/ios/chrome/browser/ui/history/history_coordinator.mm
@@ -103,10 +103,19 @@ // This method should always execute the |completionHandler|. - (void)stopWithCompletion:(ProceduralBlock)completionHandler { if (self.historyNavigationController) { - [self.historyNavigationController - dismissViewControllerAnimated:YES - completion:completionHandler]; - self.historyNavigationController = nil; + void (^dismissHistoryNavigation)(void) = ^void() { + [self.historyNavigationController + dismissViewControllerAnimated:YES + completion:completionHandler]; + self.historyNavigationController = nil; + }; + if (self.historyClearBrowsingDataCoordinator) { + [self.historyClearBrowsingDataCoordinator + stopWithCompletion:dismissHistoryNavigation]; + self.historyClearBrowsingDataCoordinator = nil; + } else { + dismissHistoryNavigation(); + } } else if (completionHandler) { completionHandler(); }
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm b/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm index 91076db..81f95c24 100644 --- a/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm +++ b/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm
@@ -9,7 +9,7 @@ #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "base/strings/sys_string_conversions.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/omnibox/browser/omnibox_edit_model.h" #include "components/search_engines/util.h" #include "components/strings/grit/components_strings.h"
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_legacy_coordinator.mm b/ios/chrome/browser/ui/location_bar/location_bar_legacy_coordinator.mm index 06abc9a..e0d9f8f 100644 --- a/ios/chrome/browser/ui/location_bar/location_bar_legacy_coordinator.mm +++ b/ios/chrome/browser/ui/location_bar/location_bar_legacy_coordinator.mm
@@ -9,7 +9,7 @@ #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "base/strings/sys_string_conversions.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/omnibox/browser/omnibox_edit_model.h" #include "components/search_engines/util.h" #include "components/strings/grit/components_strings.h"
diff --git a/ios/chrome/browser/ui/ntp/incognito_view.mm b/ios/chrome/browser/ui/ntp/incognito_view.mm index ba1ec1d..ff07130 100644 --- a/ios/chrome/browser/ui/ntp/incognito_view.mm +++ b/ios/chrome/browser/ui/ntp/incognito_view.mm
@@ -4,7 +4,7 @@ #import "ios/chrome/browser/ui/ntp/incognito_view.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/strings/grit/components_strings.h" #include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/ui/rtl_geometry.h"
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data_manager.mm b/ios/chrome/browser/ui/settings/clear_browsing_data_manager.mm index e9897b4..9c17adc 100644 --- a/ios/chrome/browser/ui/settings/clear_browsing_data_manager.mm +++ b/ios/chrome/browser/ui/settings/clear_browsing_data_manager.mm
@@ -13,7 +13,7 @@ #include "components/browsing_data/core/pref_names.h" #include "components/feature_engagement/public/event_constants.h" #include "components/feature_engagement/public/tracker.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/history/core/browser/web_history_service.h" #include "components/prefs/pref_service.h" #include "components/signin/core/browser/signin_manager.h"
diff --git a/ios/chrome/browser/ui/settings/do_not_track_collection_view_controller.mm b/ios/chrome/browser/ui/settings/do_not_track_collection_view_controller.mm index 82abd2e..f8c69a0d 100644 --- a/ios/chrome/browser/ui/settings/do_not_track_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/do_not_track_collection_view_controller.mm
@@ -5,7 +5,7 @@ #import "ios/chrome/browser/ui/settings/do_not_track_collection_view_controller.h" #include "base/mac/foundation_util.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/prefs/pref_member.h" #include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/chrome_url_constants.h"
diff --git a/ios/chrome/browser/ui/settings/privacy_collection_view_controller.mm b/ios/chrome/browser/ui/settings/privacy_collection_view_controller.mm index 8f9a6d6..3cf5bd3 100644 --- a/ios/chrome/browser/ui/settings/privacy_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/privacy_collection_view_controller.mm
@@ -8,7 +8,7 @@ #import "base/mac/foundation_util.h" #include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics_action.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/handoff/pref_names_ios.h" #include "components/metrics/metrics_pref_names.h" #include "components/payments/core/payment_prefs.h"
diff --git a/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm b/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm index 8430ce8..8cfb367 100644 --- a/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/save_passwords_collection_view_controller.mm
@@ -14,7 +14,7 @@ #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #include "components/autofill/core/common/password_form.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/keyed_service/core/service_access_type.h" #include "components/password_manager/core/browser/password_list_sorter.h" #include "components/password_manager/core/browser/password_manager_constants.h"
diff --git a/ios/chrome/browser/ui/settings/sync_encryption_collection_view_controller.mm b/ios/chrome/browser/ui/settings/sync_encryption_collection_view_controller.mm index c4adfd7..8607e5b 100644 --- a/ios/chrome/browser/ui/settings/sync_encryption_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/sync_encryption_collection_view_controller.mm
@@ -8,7 +8,7 @@ #include "base/strings/sys_string_conversions.h" #include "components/browser_sync/profile_sync_service.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/strings/grit/components_strings.h" #include "components/sync/base/sync_prefs.h" #include "ios/chrome/browser/application_context.h"
diff --git a/ios/chrome/browser/ui/settings/sync_encryption_passphrase_collection_view_controller.mm b/ios/chrome/browser/ui/settings/sync_encryption_passphrase_collection_view_controller.mm index 54d9c98..f212577 100644 --- a/ios/chrome/browser/ui/settings/sync_encryption_passphrase_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/sync_encryption_passphrase_collection_view_controller.mm
@@ -11,7 +11,7 @@ #include "base/strings/sys_string_conversions.h" #include "components/browser_sync/profile_sync_service.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/signin/core/browser/profile_oauth2_token_service.h" #import "components/signin/ios/browser/oauth2_token_service_observer_bridge.h" #include "components/strings/grit/components_strings.h"
diff --git a/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller.mm b/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller.mm index 4a3a866b..d07f164 100644 --- a/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller.mm
@@ -10,7 +10,7 @@ #include "base/mac/foundation_util.h" #include "components/autofill/core/common/autofill_pref_names.h" #include "components/browser_sync/profile_sync_service.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/prefs/pref_service.h" #include "components/signin/core/browser/account_tracker_service.h" #include "components/signin/core/browser/profile_oauth2_token_service.h"
diff --git a/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm index 550459c..440d1c03 100644 --- a/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm
@@ -10,7 +10,7 @@ #include "base/strings/sys_string_conversions.h" #include "components/autofill/core/common/autofill_pref_names.h" #include "components/browser_sync/profile_sync_service_mock.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/sync_preferences/pref_service_mock_factory.h" #include "components/sync_preferences/pref_service_syncable.h" #include "ios/chrome/browser/application_context.h"
diff --git a/ios/chrome/browser/ui/settings/translate_collection_view_controller.mm b/ios/chrome/browser/ui/settings/translate_collection_view_controller.mm index 1b12ae2f..54dec21 100644 --- a/ios/chrome/browser/ui/settings/translate_collection_view_controller.mm +++ b/ios/chrome/browser/ui/settings/translate_collection_view_controller.mm
@@ -8,7 +8,7 @@ #include <memory> #include "base/mac/foundation_util.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/prefs/pref_member.h" #include "components/prefs/pref_service.h" #include "components/translate/core/browser/translate_pref_names.h"
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_constants.h b/ios/chrome/browser/ui/tab_grid/grid/grid_constants.h index 7177735..be161b81 100644 --- a/ios/chrome/browser/ui/tab_grid/grid/grid_constants.h +++ b/ios/chrome/browser/ui/tab_grid/grid/grid_constants.h
@@ -48,6 +48,12 @@ extern const CGFloat kGridLayoutLineSpacingRegularCompact; extern const CGFloat kGridLayoutLineSpacingRegularRegular; +// GridReorderingLayout. +// Opacity for cells that aren't being moved. +extern const CGFloat kReorderingInactiveCellOpacity; +// Scale for the cell that is being moved. +extern const CGFloat kReorderingActiveCellScale; + // GridCell styling. // Common colors. extern const int kGridCellIconBackgroundColor;
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_constants.mm b/ios/chrome/browser/ui/tab_grid/grid/grid_constants.mm index 9bd1c2c..e161c48 100644 --- a/ios/chrome/browser/ui/tab_grid/grid/grid_constants.mm +++ b/ios/chrome/browser/ui/tab_grid/grid/grid_constants.mm
@@ -45,6 +45,9 @@ const CGFloat kGridLayoutLineSpacingRegularCompact = 32.0f; const CGFloat kGridLayoutLineSpacingRegularRegular = 14.0f; +const CGFloat kReorderingInactiveCellOpacity = 0.80; +const CGFloat kReorderingActiveCellScale = 1.15; + // GridCell styling. // Common colors. const int kGridCellIconBackgroundColor = 0xF1F3F4;
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_layout.h b/ios/chrome/browser/ui/tab_grid/grid/grid_layout.h index d851ae6..8668078 100644 --- a/ios/chrome/browser/ui/tab_grid/grid/grid_layout.h +++ b/ios/chrome/browser/ui/tab_grid/grid/grid_layout.h
@@ -13,4 +13,9 @@ @interface GridLayout : UICollectionViewFlowLayout @end +// A specialization of GridLayout that shows the UI in its "reordering" state, +// with the moving cell enlarged and the non-moving cells transparent. +@interface GridReorderingLayout : GridLayout +@end + #endif // IOS_CHROME_BROWSER_UI_TAB_GRID_GRID_GRID_LAYOUT_H_
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_layout.mm b/ios/chrome/browser/ui/tab_grid/grid/grid_layout.mm index e433cb1c..8fe4fb62 100644 --- a/ios/chrome/browser/ui/tab_grid/grid/grid_layout.mm +++ b/ios/chrome/browser/ui/tab_grid/grid/grid_layout.mm
@@ -151,3 +151,47 @@ } @end + +@implementation GridReorderingLayout + +#pragma mark - UICollectionViewLayout + +// Both -layoutAttributesForElementsInRect: and +// -layoutAttributesForItemAtIndexPath: need to be overridden to change the +// default layout attributes. +- (NSArray<__kindof UICollectionViewLayoutAttributes*>*) +layoutAttributesForElementsInRect:(CGRect)rect { + NSArray* baseAttributes = [super layoutAttributesForElementsInRect:rect]; + NSMutableArray<__kindof UICollectionViewLayoutAttributes*>* attributes = + [NSMutableArray array]; + for (UICollectionViewLayoutAttributes* attribute in baseAttributes) { + UICollectionViewLayoutAttributes* newAttribute = [attribute copy]; + newAttribute.alpha = kReorderingInactiveCellOpacity; + [attributes addObject:newAttribute]; + } + return [attributes copy]; +} + +- (UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath: + (NSIndexPath*)indexPath { + UICollectionViewLayoutAttributes* attributes = + [[super layoutAttributesForItemAtIndexPath:indexPath] copy]; + attributes.alpha = kReorderingInactiveCellOpacity; + return attributes; +} + +- (UICollectionViewLayoutAttributes*) +layoutAttributesForInteractivelyMovingItemAtIndexPath:(NSIndexPath*)indexPath + withTargetPosition:(CGPoint)position { + UICollectionViewLayoutAttributes* attributes = [[super + layoutAttributesForInteractivelyMovingItemAtIndexPath:indexPath + withTargetPosition:position] copy]; + // The moving item has regular opacity, but is scaled. + attributes.alpha = 1.0; + attributes.transform = + CGAffineTransformScale(attributes.transform, kReorderingActiveCellScale, + kReorderingActiveCellScale); + return attributes; +} + +@end
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm index b54acc2..a35ea49 100644 --- a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm
@@ -60,6 +60,11 @@ @property(nonatomic, assign) CGPoint itemReorderTouchPoint; // Animator to show or hide the empty state. @property(nonatomic, strong) UIViewPropertyAnimator* emptyStateAnimator; +// The default layout for the tab grid. +@property(nonatomic, strong) UICollectionViewLayout* defaultLayout; +// The layout used while the grid is being reordered. +@property(nonatomic, strong) UICollectionViewLayout* reorderingLayout; + @end @implementation GridViewController @@ -77,6 +82,8 @@ @synthesize itemReorderRecognizer = _itemReorderRecognizer; @synthesize itemReorderTouchPoint = _itemReorderTouchPoint; @synthesize emptyStateAnimator = _emptyStateAnimator; +@synthesize defaultLayout = _defaultLayout; +@synthesize reorderingLayout = _reorderingLayout; - (instancetype)init { if (self = [super init]) { @@ -87,10 +94,11 @@ } - (void)loadView { - GridLayout* layout = [[GridLayout alloc] init]; + self.defaultLayout = [[GridLayout alloc] init]; + self.reorderingLayout = [[GridReorderingLayout alloc] init]; UICollectionView* collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero - collectionViewLayout:layout]; + collectionViewLayout:self.defaultLayout]; [collectionView registerClass:[GridCell class] forCellWithReuseIdentifier:kCellIdentifier]; collectionView.dataSource = self; @@ -570,26 +578,47 @@ [self.collectionView cellForItemAtIndexPath:path].center; self.itemReorderTouchPoint = CGPointMake(location.x - cellCenter.x, location.y - cellCenter.y); + // Switch to the reordering layout. + [self.collectionView setCollectionViewLayout:self.reorderingLayout + animated:YES]; + // Immediately update the position of the moving item; otherwise, the + // collection view may relayout its subviews and briefly show the moving + // item at position (0,0). + [self updateItemReorderingForPosition:location]; } break; } - case UIGestureRecognizerStateChanged: { + case UIGestureRecognizerStateChanged: // Offset the location so it's the touch point that moves, not the cell // center. - CGPoint targetLocation = - CGPointMake(location.x - self.itemReorderTouchPoint.x, - location.y - self.itemReorderTouchPoint.y); - [self.collectionView - updateInteractiveMovementTargetPosition:targetLocation]; + [self updateItemReorderingForPosition:location]; + break; + case UIGestureRecognizerStateEnded: { + self.itemReorderTouchPoint = CGPointZero; + // End the interactive movement and transition the layout back to the + // defualt layout. These can't be simultaneous, because that will produce + // a copy of the moving cell in its final position while it animates from + // under thr user's touch. In order to fire the animated switch to the + // defualt layout at the correct time, a CATransaction is used to wrap the + // -endInteractiveMovement call which will generate the animations on the + // moving cell. The -setCollectionViewLayout: call can then be added as a + // completion block. + [CATransaction begin]; + // Note: The completion block must be added *before* any animations are + // added in the transaction. + [CATransaction setCompletionBlock:^{ + [self.collectionView setCollectionViewLayout:self.defaultLayout + animated:YES]; + }]; + [self.collectionView endInteractiveMovement]; + [CATransaction commit]; break; } - case UIGestureRecognizerStateEnded: - self.itemReorderTouchPoint = CGPointZero; - [self.collectionView endInteractiveMovement]; - break; case UIGestureRecognizerStateCancelled: self.itemReorderTouchPoint = CGPointZero; [self.collectionView cancelInteractiveMovement]; + [self.collectionView setCollectionViewLayout:self.defaultLayout + animated:YES]; // Re-enable cancelled gesture. gesture.enabled = YES; break; @@ -599,4 +628,12 @@ } } +- (void)updateItemReorderingForPosition:(CGPoint)position { + CGPoint targetLocation = + CGPointMake(position.x - self.itemReorderTouchPoint.x, + position.y - self.itemReorderTouchPoint.y); + + [self.collectionView updateInteractiveMovementTargetPosition:targetLocation]; +} + @end
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm index 8886fd6e..f6b8f4b9 100644 --- a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm
@@ -575,7 +575,7 @@ [viewController.view.bottomAnchor constraintEqualToAnchor:parentView.bottomAnchor], [viewController.view.leadingAnchor - constraintEqualToAnchor:parentView.trailingAnchor], + constraintEqualToAnchor:parentView.leadingAnchor], [viewController.view.trailingAnchor constraintEqualToAnchor:parentView.trailingAnchor], ];
diff --git a/ios/chrome/browser/voice/voice_search_url_rewriter.mm b/ios/chrome/browser/voice/voice_search_url_rewriter.mm index 0ff3565..6bcbef5 100644 --- a/ios/chrome/browser/voice/voice_search_url_rewriter.mm +++ b/ios/chrome/browser/voice/voice_search_url_rewriter.mm
@@ -7,7 +7,7 @@ #import <Foundation/Foundation.h> #import "base/strings/sys_string_conversions.h" -#include "components/google/core/browser/google_util.h" +#include "components/google/core/common/google_util.h" #include "components/prefs/pref_service.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/voice/speech_input_locale_config.h"
diff --git a/ios/web/browser_state.mm b/ios/web/browser_state.mm index bc97df0c..58d35374 100644 --- a/ios/web/browser_state.mm +++ b/ios/web/browser_state.mm
@@ -168,7 +168,13 @@ network::mojom::URLLoaderFactory* BrowserState::GetURLLoaderFactory() { if (!url_loader_factory_) { - CreateNetworkContext(); + DCHECK(!network_context_); + DCHECK(!network_context_owner_); + + net::URLRequestContextGetter* request_context = GetRequestContext(); + DCHECK(request_context); + network_context_owner_ = std::make_unique<NetworkContextOwner>( + request_context, &network_context_); auto url_loader_factory_params = network::mojom::URLLoaderFactoryParams::New(); url_loader_factory_params->process_id = network::mojom::kBrowserProcessId; @@ -181,14 +187,6 @@ return url_loader_factory_.get(); } -void BrowserState::GetProxyResolvingSocketFactory( - network::mojom::ProxyResolvingSocketFactoryRequest request) { - if (!network_context_owner_) - CreateNetworkContext(); - - network_context_->CreateProxyResolvingSocketFactory(std::move(request)); -} - scoped_refptr<network::SharedURLLoaderFactory> BrowserState::GetSharedURLLoaderFactory() { return shared_url_loader_factory_; @@ -202,16 +200,6 @@ return url_data_manager_ios_backend_; } -void BrowserState::CreateNetworkContext() { - DCHECK(!network_context_); - DCHECK(!network_context_owner_); - - net::URLRequestContextGetter* request_context = GetRequestContext(); - DCHECK(request_context); - network_context_owner_ = - std::make_unique<NetworkContextOwner>(request_context, &network_context_); -} - // static BrowserState* BrowserState::FromSupportsUserData( base::SupportsUserData* supports_user_data) {
diff --git a/ios/web/public/browser_state.h b/ios/web/public/browser_state.h index d00d7dd9..b5ff40b 100644 --- a/ios/web/public/browser_state.h +++ b/ios/web/public/browser_state.h
@@ -9,7 +9,6 @@ #include "base/supports_user_data.h" #include "services/network/public/mojom/network_service.mojom.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "services/service_manager/embedder/embedded_service_info.h" @@ -67,10 +66,6 @@ // Returns a URLLoaderFactory that is backed by GetRequestContext. network::mojom::URLLoaderFactory* GetURLLoaderFactory(); - // Binds a ProxyResolvingSocketFactory request to NetworkContext. - void GetProxyResolvingSocketFactory( - network::mojom::ProxyResolvingSocketFactoryRequest request); - // Like URLLoaderFactory, but wrapped inside SharedURLLoaderFactory scoped_refptr<network::SharedURLLoaderFactory> GetSharedURLLoaderFactory(); @@ -120,8 +115,6 @@ // Not intended for usage outside of //web. URLDataManagerIOSBackend* GetURLDataManagerIOSBackendOnIOThread(); - void CreateNetworkContext(); - network::mojom::URLLoaderFactoryPtr url_loader_factory_; scoped_refptr<network::WeakWrapperSharedURLLoaderFactory> shared_url_loader_factory_;
diff --git a/ios/web/public/web_state/ui/crw_web_delegate.h b/ios/web/public/web_state/ui/crw_web_delegate.h index 9ec04b9..f3cd463 100644 --- a/ios/web/public/web_state/ui/crw_web_delegate.h +++ b/ios/web/public/web_state/ui/crw_web_delegate.h
@@ -25,6 +25,8 @@ // TODO(crbug.com/674991): Remove this protocol. @protocol CRWWebDelegate<NSObject> +@optional + // Called when an external app needs to be opened, it also passes |linkClicked| // to track if this call was a result of user action or not. Returns YES iff // |URL| is launched in an external app.
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index f346f7d..4c064123 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -2909,23 +2909,9 @@ } } -// TODO(stuartmorgan): This is mostly logic from the original UIWebView delegate -// method, which provides less information than the WKWebView version. Audit -// this for things that should be handled in the subclass instead. - (BOOL)shouldAllowLoadWithNavigationAction:(WKNavigationAction*)action { - // Skip the logic in this method and always allow load if |_delegate| is nil. - // This is a temporary workaround for https://crbug.com/809795 until we move - // this logic out of this class. This doesn't affect Chromium app because - // |_delegate| is always set in Chromium app. - if (!_delegate) { - return YES; - } - - // The WebDelegate may instruct the CRWWebController to stop loading, and - // instead instruct the next page to be loaded in an animation. - NSURLRequest* request = action.request; - GURL requestURL = net::GURLWithNSURL(request.URL); - GURL mainDocumentURL = net::GURLWithNSURL(request.mainDocumentURL); + GURL requestURL = net::GURLWithNSURL(action.request.URL); + GURL mainDocumentURL = net::GURLWithNSURL(action.request.mainDocumentURL); DCHECK(_webView); // App specific pages have elevated privileges and WKWebView uses the same @@ -2937,18 +2923,13 @@ return NO; } - // If the URL doesn't look like one that can be shown as a web page, try to - // open the link with an external application. - // TODO(droger): Check transition type before opening an external - // application? For example, only allow it for TYPED and LINK transitions. + // If the URL doesn't look like one that can be shown as a web page, it may + // handled by the embedder. In that case, update the web controller to + // correctly reflect the current state. if (![CRWWebController webControllerCanShow:requestURL]) { if (!_webStateImpl->ShouldAllowAppLaunching()) { return NO; } - web::NavigationItem* item = self.currentNavItem; - const GURL& sourceURL = - item ? item->GetOriginalRequestURL() : GURL::EmptyGURL(); - // Stop load if navigation is believed to be happening on the main frame. if ([self isMainFrameNavigationAction:action]) [self stopLoading]; @@ -2967,31 +2948,7 @@ [self setDocumentURL:lastCommittedURL]; } } - - // TODO(crbug.com/820201): Launching External Applications shouldn't happen - // here. - // External application launcher needs |isNavigationTypeLinkActivated| to - // decide if the user intended to open the application by clicking on a - // link. - BOOL isNavigationTypeLinkActivated = - action.navigationType == WKNavigationTypeLinkActivated; - if ([_delegate openExternalURL:requestURL - sourceURL:sourceURL - linkClicked:isNavigationTypeLinkActivated]) { - if ([self shouldClosePageOnNativeApplicationLoad]) - _webStateImpl->CloseWebState(); - } - return NO; } - - if ([[request HTTPMethod] isEqualToString:@"POST"]) { - web::NavigationItemImpl* item = self.currentNavItem; - // TODO(crbug.com/570699): Remove this check once it's no longer possible to - // have no current entries. - if (item) - [self cachePOSTDataForRequest:request inNavigationItem:item]; - } - return YES; } @@ -4327,28 +4284,46 @@ web::NavigationItem* item = self.currentNavItem; const GURL& sourceURL = item ? item->GetOriginalRequestURL() : GURL::EmptyGURL(); - web::WebStatePolicyDecider::RequestInfo requestInfo( - transition, sourceURL, [self isMainFrameNavigationAction:action], + transition, sourceURL, isMainFrameNavigationAction, userInteractedWithRequestMainFrame); + // First check if the navigation action should be blocked by the controller + // and make sure to update the controller in the case that the controller + // can't handle the request URL. Then use the embedders' policyDeciders to + // either: 1- Handle the URL it self and return false to stop the controller + // from proceeding with the navigation if needed. or 2- return true to allow + // the navigation to be proceeded by the web controller. BOOL allowLoad = + [self shouldAllowLoadWithNavigationAction:action] && self.webStateImpl->ShouldAllowRequest(action.request, requestInfo); - if (!allowLoad && action.targetFrame.mainFrame) { - [_pendingNavigationInfo setCancelled:YES]; - // Discard the pending item to ensure that the current URL is not - // different from what is displayed on the view. - [self discardNonCommittedItemsIfLastCommittedWasNotNativeView]; + + if (allowLoad) { + if ([[action.request HTTPMethod] isEqualToString:@"POST"]) { + web::NavigationItemImpl* item = self.currentNavItem; + // TODO(crbug.com/570699): Remove this check once it's no longer possible + // to have no current entries. + if (item) + [self cachePOSTDataForRequest:action.request inNavigationItem:item]; + } + } else { + if (action.targetFrame.mainFrame) { + [_pendingNavigationInfo setCancelled:YES]; + // Discard the pending item to ensure that the current URL is not + // different from what is displayed on the view. + [self discardNonCommittedItemsIfLastCommittedWasNotNativeView]; + if (!_isBeingDestroyed && [self shouldClosePageOnNativeApplicationLoad]) + _webStateImpl->CloseWebState(); + } + + if (!_isBeingDestroyed) { + // Loading was started for user initiated navigations and should be + // stopped because no other WKWebView callbacks are called. + // TODO(crbug.com/767092): Loading should not start until webView.loading + // is changed to YES. + _webStateImpl->SetIsLoading(false); + } } - if (allowLoad) - allowLoad = [self shouldAllowLoadWithNavigationAction:action]; - - if (!allowLoad && !_isBeingDestroyed) { - // Loading was started for user initiated navigations and should be stopped - // because no other WKWebView callbacks are called. TODO(crbug.com/767092): - // Loading should not start until webView.loading is changed to YES. - _webStateImpl->SetIsLoading(false); - } decisionHandler(allowLoad ? WKNavigationActionPolicyAllow : WKNavigationActionPolicyCancel); }
diff --git a/ios/web_view/internal/sync/web_view_gcm_profile_service_factory.mm b/ios/web_view/internal/sync/web_view_gcm_profile_service_factory.mm index 86d0aa3..0d106038 100644 --- a/ios/web_view/internal/sync/web_view_gcm_profile_service_factory.mm +++ b/ios/web_view/internal/sync/web_view_gcm_profile_service_factory.mm
@@ -19,7 +19,6 @@ #include "ios/web_view/internal/signin/web_view_signin_manager_factory.h" #include "ios/web_view/internal/web_view_browser_state.h" #include "services/network/public/cpp/shared_url_loader_factory.h" -#include "services/network/public/mojom/proxy_resolving_socket.mojom.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -27,34 +26,6 @@ namespace ios_web_view { -namespace { - -// Requests a ProxyResolvingSocketFactoryPtr on the UI thread. Note that a -// WeakPtr of GCMProfileService is needed to detect when the KeyedService shuts -// down, and avoid calling into |profile| which might have also been destroyed. -void RequestProxyResolvingSocketFactoryOnUIThread( - web::BrowserState* context, - base::WeakPtr<gcm::GCMProfileService> service, - network::mojom::ProxyResolvingSocketFactoryRequest request) { - if (!service) - return; - context->GetProxyResolvingSocketFactory(std::move(request)); -} - -// A thread-safe wrapper to request a ProxyResolvingSocketFactoryPtr. -void RequestProxyResolvingSocketFactory( - web::BrowserState* context, - base::WeakPtr<gcm::GCMProfileService> service, - network::mojom::ProxyResolvingSocketFactoryRequest request) { - web::WebThread::GetTaskRunnerForThread(web::WebThread::UI) - ->PostTask( - FROM_HERE, - base::BindOnce(&RequestProxyResolvingSocketFactoryOnUIThread, context, - std::move(service), std::move(request))); -} - -} // namespace - // static gcm::GCMProfileService* WebViewGCMProfileServiceFactory::GetForBrowserState( WebViewBrowserState* browser_state) { @@ -98,7 +69,6 @@ return std::make_unique<gcm::GCMProfileService>( browser_state->GetPrefs(), browser_state->GetStatePath(), browser_state->GetRequestContext(), - base::BindRepeating(&RequestProxyResolvingSocketFactory, context), browser_state->GetSharedURLLoaderFactory(), version_info::Channel::UNKNOWN, GetProductCategoryForSubtypes(), WebViewIdentityManagerFactory::GetForBrowserState(browser_state),
diff --git a/media/audio/fuchsia/audio_output_stream_fuchsia.cc b/media/audio/fuchsia/audio_output_stream_fuchsia.cc index 818d73c9..d41a2039 100644 --- a/media/audio/fuchsia/audio_output_stream_fuchsia.cc +++ b/media/audio/fuchsia/audio_output_stream_fuchsia.cc
@@ -37,11 +37,11 @@ fit::bind_member(this, &AudioOutputStreamFuchsia::OnRendererError)); // Inform the |audio_renderer_| of the format required by the caller. - fuchsia::media::AudioPcmFormat format; + fuchsia::media::AudioStreamType format; format.sample_format = fuchsia::media::AudioSampleFormat::FLOAT; format.channels = parameters_.channels(); format.frames_per_second = parameters_.sample_rate(); - audio_renderer_->SetPcmFormat(std::move(format)); + audio_renderer_->SetPcmStreamType(std::move(format)); // Use number of samples to specify media position. audio_renderer_->SetPtsUnits(parameters_.sample_rate(), 1);
diff --git a/media/cast/BUILD.gn b/media/cast/BUILD.gn index 2f4f6ebf..20a5bf5 100644 --- a/media/cast/BUILD.gn +++ b/media/cast/BUILD.gn
@@ -4,6 +4,7 @@ import("//build/config/android/config.gni") import("//build/config/features.gni") +import("//build/config/jumbo.gni") import("//build/config/ui.gni") import("//testing/test.gni") import("//third_party/protobuf/proto_library.gni") @@ -15,7 +16,7 @@ } # Common code shared by all cast components. -source_set("common") { +jumbo_source_set("common") { sources = [ "cast_config.cc", "cast_config.h", @@ -70,7 +71,7 @@ ] } -source_set("net") { +jumbo_source_set("net") { sources = [ "net/cast_transport.h", "net/cast_transport_config.cc", @@ -102,6 +103,8 @@ "net/rtp/rtp_parser.h", "net/rtp/rtp_sender.cc", "net/rtp/rtp_sender.h", + "net/transport_util.cc", + "net/transport_util.h", "net/udp_packet_pipe.cc", "net/udp_packet_pipe.h", "net/udp_transport_impl.cc", @@ -122,7 +125,7 @@ ] } -source_set("sender") { +jumbo_source_set("sender") { sources = [ "cast_sender.h", "cast_sender_impl.cc", @@ -187,7 +190,7 @@ } } -source_set("receiver") { +jumbo_source_set("receiver") { sources = [ "cast_receiver.h", "net/rtp/cast_message_builder.cc",
diff --git a/media/cast/net/cast_transport_impl.cc b/media/cast/net/cast_transport_impl.cc index 5bbbbbe..171fad5 100644 --- a/media/cast/net/cast_transport_impl.cc +++ b/media/cast/net/cast_transport_impl.cc
@@ -13,32 +13,22 @@ #include "build/build_config.h" #include "media/cast/net/cast_transport_defines.h" #include "media/cast/net/rtcp/sender_rtcp_session.h" +#include "media/cast/net/transport_util.h" #include "net/base/net_errors.h" +using media::cast::transport_util::kOptionPacerMaxBurstSize; +using media::cast::transport_util::kOptionPacerTargetBurstSize; +using media::cast::transport_util::LookupOptionWithDefault; + namespace media { namespace cast { namespace { -// Options for PaceSender. -const char kOptionPacerMaxBurstSize[] = "pacer_max_burst_size"; -const char kOptionPacerTargetBurstSize[] = "pacer_target_burst_size"; - // Wifi options. const char kOptionWifiDisableScan[] = "disable_wifi_scan"; const char kOptionWifiMediaStreamingMode[] = "media_streaming_mode"; -int LookupOptionWithDefault(const base::DictionaryValue& options, - const std::string& path, - int default_value) { - int ret; - if (options.GetInteger(path, &ret)) { - return ret; - } else { - return default_value; - } -} - } // namespace std::unique_ptr<CastTransport> CastTransport::Create(
diff --git a/media/cast/net/transport_util.cc b/media/cast/net/transport_util.cc new file mode 100644 index 0000000..ecba38c --- /dev/null +++ b/media/cast/net/transport_util.cc
@@ -0,0 +1,24 @@ +// Copyright 2018 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 "media/cast/net/transport_util.h" + +namespace media { +namespace cast { +namespace transport_util { + +int LookupOptionWithDefault(const base::DictionaryValue& options, + const std::string& path, + int default_value) { + int ret; + if (options.GetInteger(path, &ret)) { + return ret; + } else { + return default_value; + } +} + +} // namespace transport_util +} // namespace cast +} // namespace media
diff --git a/media/cast/net/transport_util.h b/media/cast/net/transport_util.h new file mode 100644 index 0000000..7944386 --- /dev/null +++ b/media/cast/net/transport_util.h
@@ -0,0 +1,28 @@ +// Copyright 2018 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 MEDIA_CAST_NET_TRANSPORT_UTIL_H_ +#define MEDIA_CAST_NET_TRANSPORT_UTIL_H_ + +#include <string> + +#include "base/values.h" + +namespace media { +namespace cast { +namespace transport_util { + +// Options for PaceSender. +const char kOptionPacerMaxBurstSize[] = "pacer_max_burst_size"; +const char kOptionPacerTargetBurstSize[] = "pacer_target_burst_size"; + +int LookupOptionWithDefault(const base::DictionaryValue& options, + const std::string& path, + int default_value); + +} // namespace transport_util +} // namespace cast +} // namespace media + +#endif // MEDIA_CAST_NET_TRANSPORT_UTIL_H_
diff --git a/media/cast/net/udp_transport_impl.cc b/media/cast/net/udp_transport_impl.cc index 5227311..9c95376e 100644 --- a/media/cast/net/udp_transport_impl.cc +++ b/media/cast/net/udp_transport_impl.cc
@@ -11,12 +11,16 @@ #include "base/bind.h" #include "base/logging.h" #include "build/build_config.h" +#include "media/cast/net/transport_util.h" #include "media/cast/net/udp_packet_pipe.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" #include "net/log/net_log_source.h" #include "net/traffic_annotation/network_traffic_annotation.h" +using media::cast::transport_util::kOptionPacerMaxBurstSize; +using media::cast::transport_util::LookupOptionWithDefault; + namespace media { namespace cast { @@ -27,23 +31,11 @@ const char kOptionDisableNonBlockingIO[] = "disable_non_blocking_io"; #endif const char kOptionSendBufferMinSize[] = "send_buffer_min_size"; -const char kOptionPacerMaxBurstSize[] = "pacer_max_burst_size"; bool IsEmpty(const net::IPEndPoint& addr) { return (addr.address().empty() || addr.address().IsZero()) && !addr.port(); } -int LookupOptionWithDefault(const base::DictionaryValue& options, - const std::string& path, - int default_value) { - int ret; - if (options.GetInteger(path, &ret)) { - return ret; - } else { - return default_value; - } -} - int32_t GetTransportSendBufferSize(const base::DictionaryValue& options) { // Socket send buffer size needs to be at least greater than one burst // size.
diff --git a/media/cast/sender/external_video_encoder.cc b/media/cast/sender/external_video_encoder.cc index 46f376a..76208368 100644 --- a/media/cast/sender/external_video_encoder.cc +++ b/media/cast/sender/external_video_encoder.cc
@@ -49,7 +49,7 @@ namespace cast { // Container for the associated data of a video frame being processed. -struct InProgressFrameEncode { +struct InProgressExternalVideoFrameEncode { // The source content to encode. const scoped_refptr<VideoFrame> video_frame; @@ -67,10 +67,11 @@ // of the CastEnvironment clock, the latter of which might be simulated. const base::TimeTicks start_time; - InProgressFrameEncode(const scoped_refptr<VideoFrame>& v_frame, - base::TimeTicks r_time, - VideoEncoder::FrameEncodedCallback callback, - int bit_rate) + InProgressExternalVideoFrameEncode( + const scoped_refptr<VideoFrame>& v_frame, + base::TimeTicks r_time, + VideoEncoder::FrameEncodedCallback callback, + int bit_rate) : video_frame(v_frame), reference_time(r_time), frame_encoded_callback(callback), @@ -119,9 +120,9 @@ DCHECK(task_runner_->RunsTasksInCurrentSequence()); requested_bit_rate_ = start_bit_rate; - encoder_active_ = video_encode_accelerator_->Initialize( - media::PIXEL_FORMAT_I420, frame_size, codec_profile, start_bit_rate, - this); + const media::VideoEncodeAccelerator::Config config( + media::PIXEL_FORMAT_I420, frame_size, codec_profile, start_bit_rate); + encoder_active_ = video_encode_accelerator_->Initialize(config, this); next_frame_id_ = first_frame_id; codec_profile_ = codec_profile; @@ -162,7 +163,7 @@ const VideoEncoder::FrameEncodedCallback& frame_encoded_callback) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); - in_progress_frame_encodes_.push_back(InProgressFrameEncode( + in_progress_frame_encodes_.push_back(InProgressExternalVideoFrameEncode( video_frame, reference_time, frame_encoded_callback, requested_bit_rate_)); @@ -284,7 +285,8 @@ stream_header_.append(static_cast<const char*>(output_buffer->memory()), metadata.payload_size_bytes); } else if (!in_progress_frame_encodes_.empty()) { - const InProgressFrameEncode& request = in_progress_frame_encodes_.front(); + const InProgressExternalVideoFrameEncode& request = + in_progress_frame_encodes_.front(); std::unique_ptr<SenderEncodedFrame> encoded_frame( new SenderEncodedFrame()); @@ -563,7 +565,7 @@ std::vector<int> free_input_buffer_index_; // FIFO list. - std::list<InProgressFrameEncode> in_progress_frame_encodes_; + std::list<InProgressExternalVideoFrameEncode> in_progress_frame_encodes_; // The requested encode bit rate for the next frame. int requested_bit_rate_;
diff --git a/media/cast/sender/h264_vt_encoder.cc b/media/cast/sender/h264_vt_encoder.cc index 28a6a36..5ee06cc 100644 --- a/media/cast/sender/h264_vt_encoder.cc +++ b/media/cast/sender/h264_vt_encoder.cc
@@ -29,14 +29,14 @@ namespace { // Container for the associated data of a video frame being processed. -struct InProgressFrameEncode { +struct InProgressH264VTFrameEncode { const RtpTimeTicks rtp_timestamp; const base::TimeTicks reference_time; const VideoEncoder::FrameEncodedCallback frame_encoded_callback; - InProgressFrameEncode(RtpTimeTicks rtp, - base::TimeTicks r_time, - VideoEncoder::FrameEncodedCallback callback) + InProgressH264VTFrameEncode(RtpTimeTicks rtp, + base::TimeTicks r_time, + VideoEncoder::FrameEncodedCallback callback) : rtp_timestamp(rtp), reference_time(r_time), frame_encoded_callback(callback) {} @@ -394,9 +394,11 @@ // Wrap information we'll need after the frame is encoded in a heap object. // We'll get the pointer back from the VideoToolbox completion callback. - std::unique_ptr<InProgressFrameEncode> request(new InProgressFrameEncode( - RtpTimeTicks::FromTimeDelta(video_frame->timestamp(), kVideoFrequency), - reference_time, frame_encoded_callback)); + std::unique_ptr<InProgressH264VTFrameEncode> request( + new InProgressH264VTFrameEncode( + RtpTimeTicks::FromTimeDelta(video_frame->timestamp(), + kVideoFrequency), + reference_time, frame_encoded_callback)); // Build a suitable frame properties dictionary for keyframes. base::ScopedCFTypeRef<CFDictionaryRef> frame_props; @@ -501,8 +503,8 @@ VTEncodeInfoFlags info, CMSampleBufferRef sbuf) { auto* encoder = reinterpret_cast<H264VideoToolboxEncoder*>(encoder_opaque); - const std::unique_ptr<InProgressFrameEncode> request( - reinterpret_cast<InProgressFrameEncode*>(request_opaque)); + const std::unique_ptr<InProgressH264VTFrameEncode> request( + reinterpret_cast<InProgressH264VTFrameEncode*>(request_opaque)); bool keyframe = false; bool has_frame_data = false;
diff --git a/media/filters/BUILD.gn b/media/filters/BUILD.gn index 72ac8bd..f8ea4da 100644 --- a/media/filters/BUILD.gn +++ b/media/filters/BUILD.gn
@@ -2,10 +2,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/jumbo.gni") import("//media/media_options.gni") import("//third_party/libaom/options.gni") -source_set("filters") { +jumbo_source_set("filters") { # Do not expand the visibility here without double-checking with OWNERS, this # is a roll-up target which is part of the //media component. Most other DEPs # should be using //media and not directly DEP this roll-up target.
diff --git a/media/filters/aom_video_decoder.cc b/media/filters/aom_video_decoder.cc index fa5b8a53..b8c9da36 100644 --- a/media/filters/aom_video_decoder.cc +++ b/media/filters/aom_video_decoder.cc
@@ -27,7 +27,7 @@ namespace media { // Returns the number of threads. -static int GetThreadCount(const VideoDecoderConfig& config) { +static int GetAomVideoDecoderThreadCount(const VideoDecoderConfig& config) { // Always try to use at least two threads for video decoding. There is little // reason not to since current day CPUs tend to be multi-core and we measured // performance benefits on older machines such as P4s with hyperthreading. @@ -187,7 +187,7 @@ aom_codec_dec_cfg_t aom_config = {0}; aom_config.w = config.coded_size().width(); aom_config.h = config.coded_size().height(); - aom_config.threads = GetThreadCount(config); + aom_config.threads = GetAomVideoDecoderThreadCount(config); // TODO(dalecurtis): Refactor the MemoryPool and OffloadTaskRunner out of // VpxVideoDecoder so that they can be used here for zero copy decoding off
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc index 230c3fb..093aa3c 100644 --- a/media/filters/chunk_demuxer.cc +++ b/media/filters/chunk_demuxer.cc
@@ -26,6 +26,7 @@ #include "media/base/video_codecs.h" #include "media/base/video_decoder_config.h" #include "media/filters/frame_processor.h" +#include "media/filters/source_buffer_stream.h" #include "media/filters/stream_parser_factory.h" using base::TimeDelta;
diff --git a/media/filters/chunk_demuxer.h b/media/filters/chunk_demuxer.h index d4fdfb4c..38c84ab 100644 --- a/media/filters/chunk_demuxer.h +++ b/media/filters/chunk_demuxer.h
@@ -30,8 +30,20 @@ #include "media/filters/source_buffer_state.h" #include "media/filters/source_buffer_stream.h" +class MEDIA_EXPORT SourceBufferStream; + namespace media { +template <> +void SourceBufferStream<SourceBufferRangeByPts>::OnStartOfCodedFrameGroup( + DecodeTimestamp coded_frame_group_start_dts, + base::TimeDelta coded_frame_group_start_pts); + +template <> +void SourceBufferStream<SourceBufferRangeByDts>::OnStartOfCodedFrameGroup( + DecodeTimestamp coded_frame_group_start_dts, + base::TimeDelta coded_frame_group_start_pts); + class MEDIA_EXPORT ChunkDemuxerStream : public DemuxerStream { public: using BufferQueue = base::circular_deque<scoped_refptr<StreamParserBuffer>>;
diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc index b29c68dc..a06bb23 100644 --- a/media/filters/ffmpeg_video_decoder.cc +++ b/media/filters/ffmpeg_video_decoder.cc
@@ -31,21 +31,22 @@ namespace media { -// Always use 2 or more threads for video decoding. Most machines today will -// have 2-8 execution contexts. Using more cores generally doesn't seem to -// increase power usage and allows us to decode video faster. -// -// Handling decoding on separate threads also frees up the pipeline thread to -// continue processing. Although it'd be nice to have the option of a single -// decoding thread, FFmpeg treats having one thread the same as having zero -// threads (i.e., decoding will execute on the calling thread). Yet another -// reason for having two threads :) -static const int kDecodeThreads = 2; -static const int kMaxDecodeThreads = 16; // Returns the number of threads given the FFmpeg CodecID. Also inspects the // command line for a valid --video-threads flag. -static int GetThreadCount(const VideoDecoderConfig& config) { +static int GetFFmpegVideoDecoderThreadCount(const VideoDecoderConfig& config) { + // Always use 2 or more threads for video decoding. Most machines today will + // have 2-8 execution contexts. Using more cores generally doesn't seem to + // increase power usage and allows us to decode video faster. + // + // Handling decoding on separate threads also frees up the pipeline thread to + // continue processing. Although it'd be nice to have the option of a single + // decoding thread, FFmpeg treats having one thread the same as having zero + // threads (i.e., decoding will execute on the calling thread). Yet another + // reason for having two threads :) + constexpr int kDecodeThreads = 2; + constexpr int kMaxDecodeThreads = 16; + // Refer to http://crbug.com/93932 for tsan suppressions on decoding. int decode_threads = kDecodeThreads; @@ -414,7 +415,7 @@ codec_context_.reset(avcodec_alloc_context3(NULL)); VideoDecoderConfigToAVCodecContext(config, codec_context_.get()); - codec_context_->thread_count = GetThreadCount(config); + codec_context_->thread_count = GetFFmpegVideoDecoderThreadCount(config); codec_context_->thread_type = FF_THREAD_SLICE | (low_delay ? 0 : FF_THREAD_FRAME); codec_context_->opaque = this;
diff --git a/media/filters/media_file_checker.cc b/media/filters/media_file_checker.cc index 8c328b4..abbbf4f7 100644 --- a/media/filters/media_file_checker.cc +++ b/media/filters/media_file_checker.cc
@@ -23,7 +23,7 @@ static const int64_t kMaxCheckTimeInSeconds = 5; -static void OnError(bool* called) { +static void OnMediaFileCheckerError(bool* called) { *called = false; } @@ -39,7 +39,8 @@ bool MediaFileChecker::Start(base::TimeDelta check_time) { media::FileDataSource source(std::move(file_)); bool read_ok = true; - media::BlockingUrlProtocol protocol(&source, base::Bind(&OnError, &read_ok)); + media::BlockingUrlProtocol protocol( + &source, base::Bind(&OnMediaFileCheckerError, &read_ok)); media::FFmpegGlue glue(&protocol); AVFormatContext* format_context = glue.format_context();
diff --git a/media/filters/vpx_video_decoder.cc b/media/filters/vpx_video_decoder.cc index 2cc20b9..97e8f9f 100644 --- a/media/filters/vpx_video_decoder.cc +++ b/media/filters/vpx_video_decoder.cc
@@ -35,14 +35,14 @@ namespace media { -// Always try to use three threads for video decoding. There is little reason -// not to since current day CPUs tend to be multi-core and we measured -// performance benefits on older machines such as P4s with hyperthreading. -static const int kDecodeThreads = 2; -static const int kMaxDecodeThreads = 32; - // Returns the number of threads. -static int GetThreadCount(const VideoDecoderConfig& config) { +static int GetVpxVideoDecoderThreadCount(const VideoDecoderConfig& config) { + // Always try to use at least two threads for video decoding. There is little + // reason not to since current day CPUs tend to be multi-core and we measured + // performance benefits on older machines such as P4s with hyperthreading. + constexpr int kDecodeThreads = 2; + constexpr int kMaxDecodeThreads = 32; + // Refer to http://crbug.com/93932 for tsan suppressions on decoding. int decode_threads = kDecodeThreads; @@ -80,7 +80,7 @@ vpx_codec_dec_cfg_t vpx_config = {0}; vpx_config.w = config.coded_size().width(); vpx_config.h = config.coded_size().height(); - vpx_config.threads = GetThreadCount(config); + vpx_config.threads = GetVpxVideoDecoderThreadCount(config); vpx_codec_err_t status = vpx_codec_dec_init( context.get(),
diff --git a/media/gpu/android/android_video_encode_accelerator.cc b/media/gpu/android/android_video_encode_accelerator.cc index 770d0bf..0f59792 100644 --- a/media/gpu/android/android_video_encode_accelerator.cc +++ b/media/gpu/android/android_video_encode_accelerator.cc
@@ -138,16 +138,9 @@ return profiles; } -bool AndroidVideoEncodeAccelerator::Initialize( - VideoPixelFormat format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) { - DVLOG(3) << __func__ << " format: " << VideoPixelFormatToString(format) - << ", input_visible_size: " << input_visible_size.ToString() - << ", output_profile: " << GetProfileName(output_profile) - << ", initial_bitrate: " << initial_bitrate; +bool AndroidVideoEncodeAccelerator::Initialize(const Config& config, + Client* client) { + DVLOG(3) << __func__ << " " << config.AsHumanReadableString(); DCHECK(!media_codec_); DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(client); @@ -155,9 +148,9 @@ client_ptr_factory_.reset(new base::WeakPtrFactory<Client>(client)); if (!(MediaCodecUtil::SupportsSetParameters() && - format == PIXEL_FORMAT_I420)) { - DLOG(ERROR) << "Unexpected combo: " << format << ", " - << GetProfileName(output_profile); + config.input_format == PIXEL_FORMAT_I420)) { + DLOG(ERROR) << "Unexpected combo: " << config.input_format << ", " + << GetProfileName(config.output_profile); return false; } @@ -168,13 +161,13 @@ // need to hold onto some subset of inputs as reference pictures. uint32_t frame_input_count; uint32_t i_frame_interval; - if (output_profile == VP8PROFILE_ANY) { + if (config.output_profile == VP8PROFILE_ANY) { codec = kCodecVP8; mime_type = "video/x-vnd.on2.vp8"; frame_input_count = 1; i_frame_interval = IFRAME_INTERVAL_VPX; - } else if (output_profile == H264PROFILE_BASELINE || - output_profile == H264PROFILE_MAIN) { + } else if (config.output_profile == H264PROFILE_BASELINE || + config.output_profile == H264PROFILE_MAIN) { codec = kCodecH264; mime_type = "video/avc"; frame_input_count = 30; @@ -183,8 +176,8 @@ return false; } - frame_size_ = input_visible_size; - last_set_bitrate_ = initial_bitrate; + frame_size_ = config.input_visible_size; + last_set_bitrate_ = config.initial_bitrate; // Only consider using MediaCodec if it's likely backed by hardware. if (MediaCodecUtil::IsKnownUnaccelerated(codec, @@ -199,23 +192,25 @@ return false; } media_codec_ = MediaCodecBridgeImpl::CreateVideoEncoder( - codec, input_visible_size, initial_bitrate, INITIAL_FRAMERATE, - i_frame_interval, pixel_format); + codec, config.input_visible_size, config.initial_bitrate, + INITIAL_FRAMERATE, i_frame_interval, pixel_format); if (!media_codec_) { DLOG(ERROR) << "Failed to create/start the codec: " - << input_visible_size.ToString(); + << config.input_visible_size.ToString(); return false; } // Conservative upper bound for output buffer size: decoded size + 2KB. const size_t output_buffer_capacity = - VideoFrame::AllocationSize(format, input_visible_size) + 2048; + VideoFrame::AllocationSize(config.input_format, + config.input_visible_size) + + 2048; base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(&VideoEncodeAccelerator::Client::RequireBitstreamBuffers, client_ptr_factory_->GetWeakPtr(), frame_input_count, - input_visible_size, output_buffer_capacity)); + config.input_visible_size, output_buffer_capacity)); return true; }
diff --git a/media/gpu/android/android_video_encode_accelerator.h b/media/gpu/android/android_video_encode_accelerator.h index 91ad14b..f7bd9015 100644 --- a/media/gpu/android/android_video_encode_accelerator.h +++ b/media/gpu/android/android_video_encode_accelerator.h
@@ -40,11 +40,7 @@ // VideoEncodeAccelerator implementation. VideoEncodeAccelerator::SupportedProfiles GetSupportedProfiles() override; - bool Initialize(VideoPixelFormat format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) override; + bool Initialize(const Config& config, Client* client) override; void Encode(const scoped_refptr<VideoFrame>& frame, bool force_keyframe) override; void UseOutputBitstreamBuffer(const BitstreamBuffer& buffer) override;
diff --git a/media/gpu/gpu_video_encode_accelerator_factory.cc b/media/gpu/gpu_video_encode_accelerator_factory.cc index 94989a52..2945abf 100644 --- a/media/gpu/gpu_video_encode_accelerator_factory.cc +++ b/media/gpu/gpu_video_encode_accelerator_factory.cc
@@ -113,21 +113,16 @@ // static MEDIA_GPU_EXPORT std::unique_ptr<VideoEncodeAccelerator> GpuVideoEncodeAcceleratorFactory::CreateVEA( - VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, + const VideoEncodeAccelerator::Config& config, VideoEncodeAccelerator::Client* client, const gpu::GpuPreferences& gpu_preferences) { for (const auto& create_vea : GetVEAFactoryFunctions(gpu_preferences)) { auto vea = create_vea.Run(); if (!vea) continue; - if (!vea->Initialize(input_format, input_visible_size, output_profile, - initial_bitrate, client)) { - DLOG(ERROR) << "VEA initialize failed (" - << VideoPixelFormatToString(input_format) << ", " - << GetProfileName(output_profile) << ")"; + if (!vea->Initialize(config, client)) { + DLOG(ERROR) << "VEA initialize failed (" << config.AsHumanReadableString() + << ")"; continue; } return vea;
diff --git a/media/gpu/gpu_video_encode_accelerator_factory.h b/media/gpu/gpu_video_encode_accelerator_factory.h index 9984f3e..3cebfe2 100644 --- a/media/gpu/gpu_video_encode_accelerator_factory.h +++ b/media/gpu/gpu_video_encode_accelerator_factory.h
@@ -19,10 +19,7 @@ // if there is no implementation available on the platform or calling // VideoEncodeAccelerator::Initialize() returns false. static std::unique_ptr<VideoEncodeAccelerator> CreateVEA( - VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, + const VideoEncodeAccelerator::Config& config, VideoEncodeAccelerator::Client* client, const gpu::GpuPreferences& gpu_perferences);
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc index 425022e5..347d285 100644 --- a/media/gpu/v4l2/v4l2_video_encode_accelerator.cc +++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.cc
@@ -149,17 +149,11 @@ DestroyOutputBuffers(); } -bool V4L2VideoEncodeAccelerator::Initialize(VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, +bool V4L2VideoEncodeAccelerator::Initialize(const Config& config, Client* client) { - VLOGF(2) << ": input_format=" << VideoPixelFormatToString(input_format) - << ", input_visible_size=" << input_visible_size.ToString() - << ", output_profile=" << output_profile - << ", initial_bitrate=" << initial_bitrate; + VLOGF(2) << ": " << config.AsHumanReadableString(); - visible_size_ = input_visible_size; + visible_size_ = config.input_visible_size; client_ptr_factory_.reset(new base::WeakPtrFactory<Client>(client)); client_ = client_ptr_factory_->GetWeakPtr(); @@ -168,16 +162,17 @@ DCHECK_EQ(encoder_state_, kUninitialized); output_format_fourcc_ = - V4L2Device::VideoCodecProfileToV4L2PixFmt(output_profile, false); + V4L2Device::VideoCodecProfileToV4L2PixFmt(config.output_profile, false); if (!output_format_fourcc_) { - VLOGF(1) << "invalid output_profile=" << GetProfileName(output_profile); + VLOGF(1) << "invalid output_profile=" + << GetProfileName(config.output_profile); return false; } if (!device_->Open(V4L2Device::Type::kEncoder, output_format_fourcc_)) { VLOGF(1) << "Failed to open device for profile=" - << GetProfileName(output_profile) << ", fourcc=0x" << std::hex - << output_format_fourcc_; + << GetProfileName(config.output_profile) << ", fourcc=0x" + << std::hex << output_format_fourcc_; return false; } @@ -190,12 +185,12 @@ return false; } - if (!SetFormats(input_format, output_profile)) { + if (!SetFormats(config.input_format, config.output_profile)) { VLOGF(1) << "Failed setting up formats"; return false; } - if (input_format != device_input_format_) { + if (config.input_format != device_input_format_) { VLOGF(2) << "Input format not supported by the HW, will try to convert to " << VideoPixelFormatToString(device_input_format_); @@ -208,13 +203,14 @@ image_processor_.reset( new V4L2ImageProcessor(device, V4L2_MEMORY_USERPTR, V4L2_MEMORY_MMAP)); - // Convert from input_format to device_input_format_, keeping the size - // at visible_size_ and requiring the output buffers to be of at least - // input_allocated_size_. Unretained is safe because |this| owns image - // processor and there will be no callbacks after processor destroys. + // Convert from |config.input_format| to |device_input_format_|, keeping the + // size at |visible_size_| and requiring the output buffers to be of at + // least |input_allocated_size_|. Unretained is safe because |this| owns + // image processor and there will be no callbacks after processor destroys. if (!image_processor_->Initialize( - input_format, device_input_format_, visible_size_, visible_size_, - visible_size_, input_allocated_size_, kImageProcBufferCount, + config.input_format, device_input_format_, visible_size_, + visible_size_, visible_size_, input_allocated_size_, + kImageProcBufferCount, base::Bind(&V4L2VideoEncodeAccelerator::ImageProcessorError, base::Unretained(this)))) { VLOGF(1) << "Failed initializing image processor"; @@ -240,6 +236,9 @@ free_image_processor_output_buffers_.push_back(i); } + // TODO(johnylin): pass |config.h264_output_level| to InitControl() for + // updating the correlative V4L2_CID_MPEG_VIDEO_H264_LEVEL + // ctrl value. https://crbug.com/863327 if (!InitControls()) return false; @@ -251,7 +250,7 @@ return false; } - RequestEncodingParametersChange(initial_bitrate, kInitialFramerate); + RequestEncodingParametersChange(config.initial_bitrate, kInitialFramerate); encoder_state_ = kInitialized;
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.h b/media/gpu/v4l2/v4l2_video_encode_accelerator.h index d90b9f40..9535ff6 100644 --- a/media/gpu/v4l2/v4l2_video_encode_accelerator.h +++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.h
@@ -47,11 +47,7 @@ // VideoEncodeAccelerator implementation. VideoEncodeAccelerator::SupportedProfiles GetSupportedProfiles() override; - bool Initialize(VideoPixelFormat format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) override; + bool Initialize(const Config& config, Client* client) override; void Encode(const scoped_refptr<VideoFrame>& frame, bool force_keyframe) override; void UseOutputBitstreamBuffer(const BitstreamBuffer& buffer) override;
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc index a1248a2..aca53a66 100644 --- a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc +++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
@@ -208,60 +208,55 @@ DCHECK(!encoder_thread_.IsRunning()); } -bool VaapiVideoEncodeAccelerator::Initialize( - VideoPixelFormat format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) { +bool VaapiVideoEncodeAccelerator::Initialize(const Config& config, + Client* client) { DCHECK(child_task_runner_->BelongsToCurrentThread()); DCHECK(!encoder_thread_.IsRunning()); DCHECK_EQ(state_, kUninitialized); - VLOGF(2) << "Initializing VAVEA, input_format: " - << VideoPixelFormatToString(format) - << ", input_visible_size: " << input_visible_size.ToString() - << ", output_profile: " << GetProfileName(output_profile) - << ", initial_bitrate: " << initial_bitrate; + VLOGF(2) << "Initializing VAVEA, " << config.AsHumanReadableString(); client_ptr_factory_.reset(new base::WeakPtrFactory<Client>(client)); client_ = client_ptr_factory_->GetWeakPtr(); - codec_ = VideoCodecProfileToVideoCodec(output_profile); + codec_ = VideoCodecProfileToVideoCodec(config.output_profile); if (codec_ != kCodecH264 && codec_ != kCodecVP8) { - DVLOGF(1) << "Unsupported profile: " << GetProfileName(output_profile); + VLOGF(1) << "Unsupported profile: " + << GetProfileName(config.output_profile); return false; } - if (format != PIXEL_FORMAT_I420) { - DVLOGF(1) << "Unsupported input format: " - << VideoPixelFormatToString(format); + if (config.input_format != PIXEL_FORMAT_I420) { + VLOGF(1) << "Unsupported input format: " + << VideoPixelFormatToString(config.input_format); return false; } const SupportedProfiles& profiles = GetSupportedProfiles(); auto profile = find_if(profiles.begin(), profiles.end(), - [output_profile](const SupportedProfile& profile) { + [output_profile = config.output_profile]( + const SupportedProfile& profile) { return profile.profile == output_profile; }); if (profile == profiles.end()) { - VLOGF(1) << "Unsupported output profile " << GetProfileName(output_profile); + VLOGF(1) << "Unsupported output profile " + << GetProfileName(config.output_profile); return false; } - if (input_visible_size.width() > profile->max_resolution.width() || - input_visible_size.height() > profile->max_resolution.height()) { - VLOGF(1) << "Input size too big: " << input_visible_size.ToString() + if (config.input_visible_size.width() > profile->max_resolution.width() || + config.input_visible_size.height() > profile->max_resolution.height()) { + VLOGF(1) << "Input size too big: " << config.input_visible_size.ToString() << ", max supported size: " << profile->max_resolution.ToString(); return false; } - vaapi_wrapper_ = - VaapiWrapper::CreateForVideoCodec(VaapiWrapper::kEncode, output_profile, - base::Bind(&ReportToUMA, VAAPI_ERROR)); + vaapi_wrapper_ = VaapiWrapper::CreateForVideoCodec( + VaapiWrapper::kEncode, config.output_profile, + base::Bind(&ReportToUMA, VAAPI_ERROR)); if (!vaapi_wrapper_) { VLOGF(1) << "Failed initializing VAAPI for profile " - << GetProfileName(output_profile); + << GetProfileName(config.output_profile); return false; } @@ -275,14 +270,11 @@ // Finish remaining initialization on the encoder thread. encoder_thread_task_runner_->PostTask( FROM_HERE, base::Bind(&VaapiVideoEncodeAccelerator::InitializeTask, - base::Unretained(this), input_visible_size, - output_profile, initial_bitrate)); + base::Unretained(this), config)); return true; } -void VaapiVideoEncodeAccelerator::InitializeTask(const gfx::Size& visible_size, - VideoCodecProfile profile, - uint32_t bitrate) { +void VaapiVideoEncodeAccelerator::InitializeTask(const Config& config) { DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); DCHECK_EQ(state_, kUninitialized); VLOGF(2); @@ -305,8 +297,10 @@ return; } - if (!encoder_->Initialize(visible_size, profile, bitrate, - kDefaultFramerate)) { + // TODO(johnylin): pass |config.h264_output_level| to H264Encoder. + // https://crbug.com/863327 + if (!encoder_->Initialize(config.input_visible_size, config.output_profile, + config.initial_bitrate, kDefaultFramerate)) { NOTIFY_ERROR(kInvalidArgumentError, "Failed initializing encoder"); return; }
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.h b/media/gpu/vaapi/vaapi_video_encode_accelerator.h index f2e8ee82..3e0f7cee 100644 --- a/media/gpu/vaapi/vaapi_video_encode_accelerator.h +++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.h
@@ -34,11 +34,7 @@ // VideoEncodeAccelerator implementation. VideoEncodeAccelerator::SupportedProfiles GetSupportedProfiles() override; - bool Initialize(VideoPixelFormat format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) override; + bool Initialize(const Config& config, Client* client) override; void Encode(const scoped_refptr<VideoFrame>& frame, bool force_keyframe) override; void UseOutputBitstreamBuffer(const BitstreamBuffer& buffer) override; @@ -70,9 +66,7 @@ // Tasks for each of the VEA interface calls to be executed on the // encoder thread. // - void InitializeTask(const gfx::Size& visible_size, - VideoCodecProfile profile, - uint32_t bitrate); + void InitializeTask(const Config& config); // Enqueues |frame| onto the queue of pending inputs and attempts to continue // encoding.
diff --git a/media/gpu/video_encode_accelerator_unittest.cc b/media/gpu/video_encode_accelerator_unittest.cc index 25958a8..27ef976a 100644 --- a/media/gpu/video_encode_accelerator_unittest.cc +++ b/media/gpu/video_encode_accelerator_unittest.cc
@@ -1483,19 +1483,21 @@ uint32_t initial_bitrate, VideoEncodeAccelerator::Client* client, const gpu::GpuPreferences& gpu_preferences) { + const VideoEncodeAccelerator::Config config(input_format, input_visible_size, + output_profile, initial_bitrate); if (g_fake_encoder) { std::unique_ptr<VideoEncodeAccelerator> encoder( new FakeVideoEncodeAccelerator( scoped_refptr<base::SingleThreadTaskRunner>( base::ThreadTaskRunnerHandle::Get()))); - if (encoder->Initialize(input_format, input_visible_size, output_profile, - initial_bitrate, client)) + if (encoder->Initialize(config, client)) return encoder; return nullptr; } else { - return GpuVideoEncodeAcceleratorFactory::CreateVEA( - input_format, input_visible_size, output_profile, initial_bitrate, - client, gpu_preferences); + // TODO(johnylin): add level testing in video_encode_accelerator_unittest + // crbug.com/863327 + return GpuVideoEncodeAcceleratorFactory::CreateVEA(config, client, + gpu_preferences); } }
diff --git a/media/gpu/vt_video_encode_accelerator_mac.cc b/media/gpu/vt_video_encode_accelerator_mac.cc index 171c923..3713efc 100644 --- a/media/gpu/vt_video_encode_accelerator_mac.cc +++ b/media/gpu/vt_video_encode_accelerator_mac.cc
@@ -133,37 +133,31 @@ return profiles; } -bool VTVideoEncodeAccelerator::Initialize(VideoPixelFormat format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, +bool VTVideoEncodeAccelerator::Initialize(const Config& config, Client* client) { - DVLOG(3) << __func__ << ": input_format=" << VideoPixelFormatToString(format) - << ", input_visible_size=" << input_visible_size.ToString() - << ", output_profile=" << GetProfileName(output_profile) - << ", initial_bitrate=" << initial_bitrate; + DVLOG(3) << __func__ << ": " << config.AsHumanReadableString(); DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(client); - if (PIXEL_FORMAT_I420 != format) { + if (PIXEL_FORMAT_I420 != config.input_format) { DLOG(ERROR) << "Input format not supported= " - << VideoPixelFormatToString(format); + << VideoPixelFormatToString(config.input_format); return false; } if (std::find(std::begin(kSupportedProfiles), std::end(kSupportedProfiles), - output_profile) == std::end(kSupportedProfiles)) { + config.output_profile) == std::end(kSupportedProfiles)) { DLOG(ERROR) << "Output profile not supported= " - << GetProfileName(output_profile); + << GetProfileName(config.output_profile); return false; } - h264_profile_ = output_profile; + h264_profile_ = config.output_profile; client_ptr_factory_.reset(new base::WeakPtrFactory<Client>(client)); client_ = client_ptr_factory_->GetWeakPtr(); - input_visible_size_ = input_visible_size; + input_visible_size_ = config.input_visible_size; frame_rate_ = kMaxFrameRateNumerator / kMaxFrameRateDenominator; - initial_bitrate_ = initial_bitrate; - bitstream_buffer_size_ = input_visible_size.GetArea(); + initial_bitrate_ = config.initial_bitrate; + bitstream_buffer_size_ = config.input_visible_size.GetArea(); if (!encoder_thread_.Start()) { DLOG(ERROR) << "Failed spawning encoder thread.";
diff --git a/media/gpu/vt_video_encode_accelerator_mac.h b/media/gpu/vt_video_encode_accelerator_mac.h index 09e88a3..391e14c 100644 --- a/media/gpu/vt_video_encode_accelerator_mac.h +++ b/media/gpu/vt_video_encode_accelerator_mac.h
@@ -32,11 +32,7 @@ // VideoEncodeAccelerator implementation. VideoEncodeAccelerator::SupportedProfiles GetSupportedProfiles() override; - bool Initialize(VideoPixelFormat format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) override; + bool Initialize(const Config& config, Client* client) override; void Encode(const scoped_refptr<VideoFrame>& frame, bool force_keyframe) override; void UseOutputBitstreamBuffer(const BitstreamBuffer& buffer) override;
diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc index 302bd051..9334a0e 100644 --- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc +++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
@@ -165,26 +165,19 @@ return profiles; } -bool MediaFoundationVideoEncodeAccelerator::Initialize( - VideoPixelFormat format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) { - DVLOG(3) << __func__ << ": input_format=" << VideoPixelFormatToString(format) - << ", input_visible_size=" << input_visible_size.ToString() - << ", output_profile=" << output_profile - << ", initial_bitrate=" << initial_bitrate; +bool MediaFoundationVideoEncodeAccelerator::Initialize(const Config& config, + Client* client) { + DVLOG(3) << __func__ << ": " << config.AsHumanReadableString(); DCHECK(main_client_task_runner_->BelongsToCurrentThread()); - if (PIXEL_FORMAT_I420 != format) { + if (PIXEL_FORMAT_I420 != config.input_format) { DLOG(ERROR) << "Input format not supported= " - << VideoPixelFormatToString(format); + << VideoPixelFormatToString(config.input_format); return false; } - if (GetH264VProfile(output_profile) == eAVEncH264VProfile_unknown) { - DLOG(ERROR) << "Output profile not supported= " << output_profile; + if (GetH264VProfile(config.output_profile) == eAVEncH264VProfile_unknown) { + DLOG(ERROR) << "Output profile not supported= " << config.output_profile; return false; } @@ -202,10 +195,10 @@ main_client_weak_factory_.reset(new base::WeakPtrFactory<Client>(client)); main_client_ = main_client_weak_factory_->GetWeakPtr(); - input_visible_size_ = input_visible_size; + input_visible_size_ = config.input_visible_size; frame_rate_ = kMaxFrameRateNumerator / kMaxFrameRateDenominator; - target_bitrate_ = initial_bitrate; - bitstream_buffer_size_ = input_visible_size.GetArea(); + target_bitrate_ = config.initial_bitrate; + bitstream_buffer_size_ = config.input_visible_size.GetArea(); u_plane_offset_ = VideoFrame::PlaneSize(PIXEL_FORMAT_I420, VideoFrame::kYPlane, input_visible_size_) @@ -226,7 +219,7 @@ return false; } - if (!InitializeInputOutputSamples(output_profile)) { + if (!InitializeInputOutputSamples(config.output_profile)) { DLOG(ERROR) << "Failed initializing input-output samples."; return false; }
diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.h b/media/gpu/windows/media_foundation_video_encode_accelerator_win.h index 48b8ff0..4355387 100644 --- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.h +++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.h
@@ -40,11 +40,7 @@ // VideoEncodeAccelerator implementation. VideoEncodeAccelerator::SupportedProfiles GetSupportedProfiles() override; - bool Initialize(VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) override; + bool Initialize(const Config& config, Client* client) override; void Encode(const scoped_refptr<VideoFrame>& frame, bool force_keyframe) override; void UseOutputBitstreamBuffer(const BitstreamBuffer& buffer) override;
diff --git a/media/mojo/clients/mojo_video_encode_accelerator.cc b/media/mojo/clients/mojo_video_encode_accelerator.cc index c211bc7..12dfb8f 100644 --- a/media/mojo/clients/mojo_video_encode_accelerator.cc +++ b/media/mojo/clients/mojo_video_encode_accelerator.cc
@@ -98,16 +98,9 @@ supported_profiles_); } -bool MojoVideoEncodeAccelerator::Initialize(VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, +bool MojoVideoEncodeAccelerator::Initialize(const Config& config, Client* client) { - DVLOG(2) << __func__ - << " input_format=" << VideoPixelFormatToString(input_format) - << ", input_visible_size=" << input_visible_size.ToString() - << ", output_profile=" << GetProfileName(output_profile) - << ", initial_bitrate=" << initial_bitrate; + DVLOG(2) << __func__ << " " << config.AsHumanReadableString(); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!client) return false; @@ -119,8 +112,7 @@ client, mojo::MakeRequest(&vea_client_ptr)); bool result = false; - vea_->Initialize(input_format, input_visible_size, output_profile, - initial_bitrate, std::move(vea_client_ptr), &result); + vea_->Initialize(config, std::move(vea_client_ptr), &result); return result; }
diff --git a/media/mojo/clients/mojo_video_encode_accelerator.h b/media/mojo/clients/mojo_video_encode_accelerator.h index c39d6cd..f555e0f 100644 --- a/media/mojo/clients/mojo_video_encode_accelerator.h +++ b/media/mojo/clients/mojo_video_encode_accelerator.h
@@ -14,10 +14,6 @@ #include "media/mojo/interfaces/video_encode_accelerator.mojom.h" #include "media/video/video_encode_accelerator.h" -namespace gfx { -class Size; -} // namespace gfx - namespace media { class VideoFrame; } // namespace media @@ -38,11 +34,7 @@ // VideoEncodeAccelerator implementation. SupportedProfiles GetSupportedProfiles() override; - bool Initialize(VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) override; + bool Initialize(const Config& config, Client* client) override; void Encode(const scoped_refptr<VideoFrame>& frame, bool force_keyframe) override; void UseOutputBitstreamBuffer(const BitstreamBuffer& buffer) override;
diff --git a/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc b/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc index 6189263b..e481398 100644 --- a/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc +++ b/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc
@@ -33,22 +33,20 @@ MockMojoVideoEncodeAccelerator() = default; // mojom::VideoEncodeAccelerator impl. - void Initialize(media::VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - media::VideoCodecProfile output_profile, - uint32_t initial_bitrate, + void Initialize(const media::VideoEncodeAccelerator::Config& config, mojom::VideoEncodeAcceleratorClientPtr client, InitializeCallback success_callback) override { if (initialization_success_) { ASSERT_TRUE(client); client_ = std::move(client); - const size_t allocation_size = - VideoFrame::AllocationSize(input_format, input_visible_size); + const size_t allocation_size = VideoFrame::AllocationSize( + config.input_format, config.input_visible_size); - client_->RequireBitstreamBuffers(1, input_visible_size, allocation_size); + client_->RequireBitstreamBuffers(1, config.input_visible_size, + allocation_size); - DoInitialize(input_format, input_visible_size, output_profile, - initial_bitrate, &client); + DoInitialize(config.input_format, config.input_visible_size, + config.output_profile, config.initial_bitrate, &client); } std::move(success_callback).Run(initialization_success_); } @@ -161,9 +159,9 @@ _, kInputVisibleSize, VideoFrame::AllocationSize(PIXEL_FORMAT_I420, kInputVisibleSize))); - EXPECT_TRUE(mojo_vea()->Initialize(PIXEL_FORMAT_I420, kInputVisibleSize, - kOutputProfile, kInitialBitrate, - mock_vea_client)); + const VideoEncodeAccelerator::Config config( + PIXEL_FORMAT_I420, kInputVisibleSize, kOutputProfile, kInitialBitrate); + EXPECT_TRUE(mojo_vea()->Initialize(config, mock_vea_client)); base::RunLoop().RunUntilIdle(); } @@ -285,9 +283,10 @@ mock_mojo_vea()->set_initialization_success(false); - EXPECT_FALSE(mojo_vea()->Initialize(PIXEL_FORMAT_I420, kInputVisibleSize, - VIDEO_CODEC_PROFILE_UNKNOWN, - kInitialBitrate, mock_vea_client.get())); + const VideoEncodeAccelerator::Config config( + PIXEL_FORMAT_I420, kInputVisibleSize, VIDEO_CODEC_PROFILE_UNKNOWN, + kInitialBitrate); + EXPECT_FALSE(mojo_vea()->Initialize(config, mock_vea_client.get())); base::RunLoop().RunUntilIdle(); }
diff --git a/media/mojo/interfaces/video_encode_accelerator.mojom b/media/mojo/interfaces/video_encode_accelerator.mojom index a8eb9ec..c827b9b 100644 --- a/media/mojo/interfaces/video_encode_accelerator.mojom +++ b/media/mojo/interfaces/video_encode_accelerator.mojom
@@ -42,6 +42,17 @@ array<int32> bitrates; }; +// This defines a mojo transport format for +// media::VideoEncodeAccelerator::Config. +struct VideoEncodeAcceleratorConfig { + VideoPixelFormat input_format; + gfx.mojom.Size input_visible_size; + VideoCodecProfile output_profile; + uint32 initial_bitrate; + uint8 h264_output_level; + bool has_h264_output_level; // Whether or not config has H264 output level +}; + interface VideoEncodeAccelerator { // See media::VideoEncodeAccelerator::Error enum Error { @@ -53,10 +64,7 @@ // Responded by VideoEncodeAcceleratorClient.RequireBitstreamBuffers(). // TODO(mcasas): Update to asynchronous, https://crbug.com/744210. [Sync] - Initialize(VideoPixelFormat input_format, - gfx.mojom.Size input_visible_size, - VideoCodecProfile output_profile, - uint32 initial_bitrate, + Initialize(VideoEncodeAcceleratorConfig config, VideoEncodeAcceleratorClient client) => (bool result);
diff --git a/media/mojo/interfaces/video_encode_accelerator.typemap b/media/mojo/interfaces/video_encode_accelerator.typemap index 70be7dbf..6d0f4c3 100644 --- a/media/mojo/interfaces/video_encode_accelerator.typemap +++ b/media/mojo/interfaces/video_encode_accelerator.typemap
@@ -14,14 +14,22 @@ "//media/mojo/interfaces/video_encode_accelerator_typemap_traits.h", ] +public_deps = [ + "//base", + "//media", +] + deps = [ "//base", "//media", + "//media/base/ipc", + "//ui/gfx/geometry/mojo:struct_traits", ] type_mappings = [ "media.mojom.BitstreamBufferMetadata=media::BitstreamBufferMetadata", "media.mojom.VideoBitrateAllocation=media::VideoBitrateAllocation", "media.mojom.VideoEncodeAccelerator.Error=media::VideoEncodeAccelerator::Error", + "media.mojom.VideoEncodeAcceleratorConfig=media::VideoEncodeAccelerator::Config", "media.mojom.Vp8Metadata=media::Vp8Metadata", ]
diff --git a/media/mojo/interfaces/video_encode_accelerator_typemap_traits.cc b/media/mojo/interfaces/video_encode_accelerator_typemap_traits.cc index 3deea35e..a95c177 100644 --- a/media/mojo/interfaces/video_encode_accelerator_typemap_traits.cc +++ b/media/mojo/interfaces/video_encode_accelerator_typemap_traits.cc
@@ -5,6 +5,7 @@ #include "media/mojo/interfaces/video_encode_accelerator_typemap_traits.h" #include "base/logging.h" +#include "base/optional.h" #include "media/base/video_bitrate_allocation.h" #include "mojo/public/cpp/base/time_mojom_traits.h" @@ -114,4 +115,33 @@ out_metadata->layer_sync = data.layer_sync(); return true; } + +// static +bool StructTraits<media::mojom::VideoEncodeAcceleratorConfigDataView, + media::VideoEncodeAccelerator::Config>:: + Read(media::mojom::VideoEncodeAcceleratorConfigDataView input, + media::VideoEncodeAccelerator::Config* output) { + media::VideoPixelFormat input_format; + if (!input.ReadInputFormat(&input_format)) + return false; + + gfx::Size input_visible_size; + if (!input.ReadInputVisibleSize(&input_visible_size)) + return false; + + media::VideoCodecProfile output_profile; + if (!input.ReadOutputProfile(&output_profile)) + return false; + + base::Optional<uint8_t> h264_output_level; + if (input.has_h264_output_level()) { + h264_output_level = input.h264_output_level(); + } + + *output = media::VideoEncodeAccelerator::Config( + input_format, input_visible_size, output_profile, input.initial_bitrate(), + h264_output_level); + return true; +} + } // namespace mojo
diff --git a/media/mojo/interfaces/video_encode_accelerator_typemap_traits.h b/media/mojo/interfaces/video_encode_accelerator_typemap_traits.h index 96af90c..bc85ca2 100644 --- a/media/mojo/interfaces/video_encode_accelerator_typemap_traits.h +++ b/media/mojo/interfaces/video_encode_accelerator_typemap_traits.h
@@ -5,8 +5,11 @@ #ifndef MEDIA_MOJO_INTERFACES_VIDEO_ENCODE_ACCELERATOR_TYPEMAP_TRAITS_H_ #define MEDIA_MOJO_INTERFACES_VIDEO_ENCODE_ACCELERATOR_TYPEMAP_TRAITS_H_ +#include "media/base/ipc/media_param_traits.h" +#include "media/mojo/interfaces/media_types.mojom.h" #include "media/mojo/interfaces/video_encode_accelerator.mojom.h" #include "media/video/video_encode_accelerator.h" +#include "ui/gfx/geometry/mojo/geometry_struct_traits.h" namespace mojo { @@ -72,6 +75,43 @@ media::Vp8Metadata* out_metadata); }; +template <> +struct StructTraits<media::mojom::VideoEncodeAcceleratorConfigDataView, + media::VideoEncodeAccelerator::Config> { + static media::VideoPixelFormat input_format( + const media::VideoEncodeAccelerator::Config& input) { + return input.input_format; + } + + static const gfx::Size& input_visible_size( + const media::VideoEncodeAccelerator::Config& input) { + return input.input_visible_size; + } + + static media::VideoCodecProfile output_profile( + const media::VideoEncodeAccelerator::Config& input) { + return input.output_profile; + } + + static uint32_t initial_bitrate( + const media::VideoEncodeAccelerator::Config& input) { + return input.initial_bitrate; + } + + static uint8_t h264_output_level( + const media::VideoEncodeAccelerator::Config& input) { + return input.h264_output_level.value_or(0); + } + + static bool has_h264_output_level( + const media::VideoEncodeAccelerator::Config& input) { + return input.h264_output_level.has_value(); + } + + static bool Read(media::mojom::VideoEncodeAcceleratorConfigDataView input, + media::VideoEncodeAccelerator::Config* output); +}; + } // namespace mojo #endif // MEDIA_MOJO_INTERFACES_VIDEO_ENCODE_ACCELERATOR_TYPEMAP_TRAITS_H_
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service.cc b/media/mojo/services/mojo_video_encode_accelerator_service.cc index ba91745..edc143e4 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_service.cc +++ b/media/mojo/services/mojo_video_encode_accelerator_service.cc
@@ -44,20 +44,14 @@ } void MojoVideoEncodeAcceleratorService::Initialize( - VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, + const media::VideoEncodeAccelerator::Config& config, mojom::VideoEncodeAcceleratorClientPtr client, InitializeCallback success_callback) { - DVLOG(1) << __func__ - << " input_format=" << VideoPixelFormatToString(input_format) - << ", input_visible_size=" << input_visible_size.ToString() - << ", output_profile=" << GetProfileName(output_profile) - << ", initial_bitrate=" << initial_bitrate; + DVLOG(1) << __func__ << " " << config.AsHumanReadableString(); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!encoder_); - DCHECK_EQ(PIXEL_FORMAT_I420, input_format) << "Only I420 format supported"; + DCHECK_EQ(PIXEL_FORMAT_I420, config.input_format) + << "Only I420 format supported"; if (!client) { DLOG(ERROR) << __func__ << "null |client|"; @@ -66,18 +60,16 @@ } vea_client_ = std::move(client); - if (input_visible_size.width() > limits::kMaxDimension || - input_visible_size.height() > limits::kMaxDimension || - input_visible_size.GetArea() > limits::kMaxCanvas) { + if (config.input_visible_size.width() > limits::kMaxDimension || + config.input_visible_size.height() > limits::kMaxDimension || + config.input_visible_size.GetArea() > limits::kMaxCanvas) { DLOG(ERROR) << __func__ << "too large input_visible_size " - << input_visible_size.ToString(); + << config.input_visible_size.ToString(); std::move(success_callback).Run(false); return; } - encoder_ = - create_vea_callback_.Run(input_format, input_visible_size, output_profile, - initial_bitrate, this, gpu_preferences_); + encoder_ = create_vea_callback_.Run(config, this, gpu_preferences_); if (!encoder_) { DLOG(ERROR) << __func__ << " Error creating or initializing VEA"; std::move(success_callback).Run(false);
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service.h b/media/mojo/services/mojo_video_encode_accelerator_service.h index 0efdae6..97342d01 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_service.h +++ b/media/mojo/services/mojo_video_encode_accelerator_service.h
@@ -33,10 +33,7 @@ // Create and initialize a VEA. Returns nullptr if either part fails. using CreateAndInitializeVideoEncodeAcceleratorCallback = base::Callback<std::unique_ptr<::media::VideoEncodeAccelerator>( - VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, + const ::media::VideoEncodeAccelerator::Config& config, Client* client, const gpu::GpuPreferences& gpu_preferences)>; @@ -52,10 +49,7 @@ ~MojoVideoEncodeAcceleratorService() override; // mojom::VideoEncodeAccelerator impl. - void Initialize(VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, + void Initialize(const media::VideoEncodeAccelerator::Config& config, mojom::VideoEncodeAcceleratorClientPtr client, InitializeCallback callback) override; void Encode(const scoped_refptr<VideoFrame>& frame,
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc b/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc index ffd0943..54979aa 100644 --- a/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc +++ b/media/mojo/services/mojo_video_encode_accelerator_service_unittest.cc
@@ -27,18 +27,14 @@ std::unique_ptr<VideoEncodeAccelerator> CreateAndInitializeFakeVEA( bool will_initialization_succeed, - VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, + const VideoEncodeAccelerator::Config& config, VideoEncodeAccelerator::Client* client, const gpu::GpuPreferences& gpu_preferences) { // Use FakeVEA as scoped_ptr to guarantee proper destruction via Destroy(). auto vea = std::make_unique<FakeVideoEncodeAccelerator>( base::ThreadTaskRunnerHandle::Get()); vea->SetWillInitializationSucceed(will_initialization_succeed); - const bool result = vea->Initialize(input_format, input_visible_size, - output_profile, initial_bitrate, client); + const bool result = vea->Initialize(config, client); // Mimic the behaviour of GpuVideoEncodeAcceleratorFactory::CreateVEA(). return result ? base::WrapUnique<VideoEncodeAccelerator>(vea.release()) @@ -99,9 +95,10 @@ RequireBitstreamBuffers(_, kInputVisibleSize, _)); const uint32_t kInitialBitrate = 100000u; + const media::VideoEncodeAccelerator::Config config( + PIXEL_FORMAT_I420, kInputVisibleSize, H264PROFILE_MIN, kInitialBitrate); mojo_vea_service()->Initialize( - PIXEL_FORMAT_I420, kInputVisibleSize, H264PROFILE_MIN, kInitialBitrate, - std::move(mojo_vea_client), + config, std::move(mojo_vea_client), base::Bind([](bool success) { ASSERT_TRUE(success); })); base::RunLoop().RunUntilIdle(); } @@ -225,9 +222,10 @@ mojom::VideoEncodeAcceleratorClientPtr invalid_mojo_vea_client = nullptr; const uint32_t kInitialBitrate = 100000u; + const media::VideoEncodeAccelerator::Config config( + PIXEL_FORMAT_I420, kInputVisibleSize, H264PROFILE_MIN, kInitialBitrate); mojo_vea_service()->Initialize( - PIXEL_FORMAT_I420, kInputVisibleSize, H264PROFILE_MIN, kInitialBitrate, - std::move(invalid_mojo_vea_client), + config, std::move(invalid_mojo_vea_client), base::Bind([](bool success) { ASSERT_FALSE(success); })); base::RunLoop().RunUntilIdle(); } @@ -244,9 +242,10 @@ mojo::MakeRequest(&mojo_vea_client)); const uint32_t kInitialBitrate = 100000u; + const media::VideoEncodeAccelerator::Config config( + PIXEL_FORMAT_I420, kInputVisibleSize, H264PROFILE_MIN, kInitialBitrate); mojo_vea_service()->Initialize( - PIXEL_FORMAT_I420, kInputVisibleSize, H264PROFILE_MIN, kInitialBitrate, - std::move(mojo_vea_client), + config, std::move(mojo_vea_client), base::Bind([](bool success) { ASSERT_FALSE(success); })); base::RunLoop().RunUntilIdle();
diff --git a/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc b/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc index c9d696b6..55461b6 100644 --- a/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc +++ b/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc
@@ -28,17 +28,13 @@ static const VideoCodecProfile kValidOutputProfile = H264PROFILE_MAIN; extern std::unique_ptr<VideoEncodeAccelerator> CreateAndInitializeFakeVEA( - VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, + const VideoEncodeAccelerator::Config& config, VideoEncodeAccelerator::Client* client, const gpu::GpuPreferences& gpu_preferences) { // Use FakeVEA as scoped_ptr to guarantee proper destruction via Destroy(). auto vea = std::make_unique<FakeVideoEncodeAccelerator>( base::ThreadTaskRunnerHandle::Get()); - const bool result = vea->Initialize(input_format, input_visible_size, - output_profile, initial_bitrate, client); + const bool result = vea->Initialize(config, client); // Mimic the behaviour of GpuVideoEncodeAcceleratorFactory::CreateVEA(). return result ? base::WrapUnique<VideoEncodeAccelerator>(vea.release()) @@ -102,9 +98,10 @@ EXPECT_CALL(*mock_vea_client, RequireBitstreamBuffers(_, kInputVisibleSize, kShMemSize)); - EXPECT_TRUE(mojo_vea()->Initialize(PIXEL_FORMAT_I420, kInputVisibleSize, - kValidOutputProfile, kInitialBitrate, - mock_vea_client)); + const VideoEncodeAccelerator::Config config( + PIXEL_FORMAT_I420, kInputVisibleSize, kValidOutputProfile, + kInitialBitrate); + EXPECT_TRUE(mojo_vea()->Initialize(config, mock_vea_client)); base::RunLoop().RunUntilIdle(); } @@ -136,9 +133,10 @@ InitializeWithInvalidClientFails) { media::VideoEncodeAccelerator::Client* invalid_client = nullptr; - EXPECT_FALSE(mojo_vea()->Initialize(PIXEL_FORMAT_I420, kInputVisibleSize, - kValidOutputProfile, kInitialBitrate, - invalid_client)); + const VideoEncodeAccelerator::Config config( + PIXEL_FORMAT_I420, kInputVisibleSize, kValidOutputProfile, + kInitialBitrate); + EXPECT_FALSE(mojo_vea()->Initialize(config, invalid_client)); base::RunLoop().RunUntilIdle(); } @@ -150,9 +148,10 @@ const gfx::Size kInvalidInputVisibleSize(limits::kMaxDimension + 1, 48); - EXPECT_FALSE(mojo_vea()->Initialize( + const VideoEncodeAccelerator::Config config( PIXEL_FORMAT_I420, kInvalidInputVisibleSize, kValidOutputProfile, - kInitialBitrate, mock_vea_client.get())); + kInitialBitrate); + EXPECT_FALSE(mojo_vea()->Initialize(config, mock_vea_client.get())); base::RunLoop().RunUntilIdle(); } // This test verifies that Initialize() fails when called with an invalid codec @@ -164,9 +163,10 @@ const VideoCodecProfile kInvalidOutputProfile = VIDEO_CODEC_PROFILE_UNKNOWN; - EXPECT_FALSE(mojo_vea()->Initialize(PIXEL_FORMAT_I420, kInputVisibleSize, - kInvalidOutputProfile, kInitialBitrate, - mock_vea_client.get())); + const VideoEncodeAccelerator::Config config( + PIXEL_FORMAT_I420, kInputVisibleSize, kInvalidOutputProfile, + kInitialBitrate); + EXPECT_FALSE(mojo_vea()->Initialize(config, mock_vea_client.get())); base::RunLoop().RunUntilIdle(); }
diff --git a/media/video/fake_video_encode_accelerator.cc b/media/video/fake_video_encode_accelerator.cc index 1af316d8..cbff69a 100644 --- a/media/video/fake_video_encode_accelerator.cc +++ b/media/video/fake_video_encode_accelerator.cc
@@ -40,26 +40,21 @@ return profiles; } -bool FakeVideoEncodeAccelerator::Initialize(VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, +bool FakeVideoEncodeAccelerator::Initialize(const Config& config, Client* client) { if (!will_initialization_succeed_) { return false; } - if (output_profile == VIDEO_CODEC_PROFILE_UNKNOWN || - output_profile > VIDEO_CODEC_PROFILE_MAX) { + if (config.output_profile == VIDEO_CODEC_PROFILE_UNKNOWN || + config.output_profile > VIDEO_CODEC_PROFILE_MAX) { return false; } client_ = client; task_runner_->PostTask( FROM_HERE, base::Bind(&FakeVideoEncodeAccelerator::DoRequireBitstreamBuffers, - weak_this_factory_.GetWeakPtr(), - kMinimumInputCount, - input_visible_size, - kMinimumOutputBufferSize)); + weak_this_factory_.GetWeakPtr(), kMinimumInputCount, + config.input_visible_size, kMinimumOutputBufferSize)); return true; }
diff --git a/media/video/fake_video_encode_accelerator.h b/media/video/fake_video_encode_accelerator.h index 79dba744..445fc18e 100644 --- a/media/video/fake_video_encode_accelerator.h +++ b/media/video/fake_video_encode_accelerator.h
@@ -34,11 +34,7 @@ ~FakeVideoEncodeAccelerator() override; VideoEncodeAccelerator::SupportedProfiles GetSupportedProfiles() override; - bool Initialize(VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) override; + bool Initialize(const Config& config, Client* client) override; void Encode(const scoped_refptr<VideoFrame>& frame, bool force_keyframe) override; void UseOutputBitstreamBuffer(const BitstreamBuffer& buffer) override;
diff --git a/media/video/mock_video_encode_accelerator.h b/media/video/mock_video_encode_accelerator.h index 1557b7e0..bbc4d64 100644 --- a/media/video/mock_video_encode_accelerator.h +++ b/media/video/mock_video_encode_accelerator.h
@@ -19,11 +19,8 @@ MOCK_METHOD0(GetSupportedProfiles, VideoEncodeAccelerator::SupportedProfiles()); - MOCK_METHOD5(Initialize, - bool(VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, + MOCK_METHOD2(Initialize, + bool(const VideoEncodeAccelerator::Config& config, VideoEncodeAccelerator::Client* client)); MOCK_METHOD2(Encode, void(const scoped_refptr<VideoFrame>& frame,
diff --git a/media/video/video_encode_accelerator.cc b/media/video/video_encode_accelerator.cc index 0c3d76d..93845dc 100644 --- a/media/video/video_encode_accelerator.cc +++ b/media/video/video_encode_accelerator.cc
@@ -5,6 +5,7 @@ #include "media/video/video_encode_accelerator.h" #include "base/callback.h" +#include "base/strings/stringprintf.h" namespace media { @@ -26,6 +27,37 @@ timestamp(timestamp) {} BitstreamBufferMetadata::~BitstreamBufferMetadata() = default; +VideoEncodeAccelerator::Config::Config() = default; +VideoEncodeAccelerator::Config::Config(const Config& config) = default; + +VideoEncodeAccelerator::Config::Config( + VideoPixelFormat input_format, + const gfx::Size& input_visible_size, + VideoCodecProfile output_profile, + uint32_t initial_bitrate, + base::Optional<uint8_t> h264_output_level) + : input_format(input_format), + input_visible_size(input_visible_size), + output_profile(output_profile), + initial_bitrate(initial_bitrate), + h264_output_level(h264_output_level) {} + +VideoEncodeAccelerator::Config::~Config() = default; + +std::string VideoEncodeAccelerator::Config::AsHumanReadableString() const { + std::string str = base::StringPrintf( + "input_format: %s, input_visible_size: %s, output_profile: %s, " + "initial_bitrate: %u", + VideoPixelFormatToString(input_format).c_str(), + input_visible_size.ToString().c_str(), + GetProfileName(output_profile).c_str(), initial_bitrate); + if (h264_output_level) { + str += base::StringPrintf(", h264_output_level: %u", + h264_output_level.value()); + } + return str; +} + VideoEncodeAccelerator::~VideoEncodeAccelerator() = default; VideoEncodeAccelerator::SupportedProfile::SupportedProfile()
diff --git a/media/video/video_encode_accelerator.h b/media/video/video_encode_accelerator.h index 092b4ce..61a054a7 100644 --- a/media/video/video_encode_accelerator.h +++ b/media/video/video_encode_accelerator.h
@@ -14,6 +14,7 @@ #include "base/callback_forward.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +#include "base/optional.h" #include "base/single_thread_task_runner.h" #include "media/base/bitstream_buffer.h" #include "media/base/media_export.h" @@ -92,6 +93,43 @@ kErrorMax = kPlatformFailureError }; + // Parameters required for VEA initialization. + struct MEDIA_EXPORT Config { + Config(); + Config(const Config& config); + + Config(VideoPixelFormat input_format, + const gfx::Size& input_visible_size, + VideoCodecProfile output_profile, + uint32_t initial_bitrate, + base::Optional<uint8_t> h264_output_level = base::nullopt); + + ~Config(); + + std::string AsHumanReadableString() const; + + // Frame format of input stream (as would be reported by + // VideoFrame::format() for frames passed to Encode()). + VideoPixelFormat input_format; + + // Resolution of input stream (as would be reported by + // VideoFrame::visible_rect().size() for frames passed to Encode()). + gfx::Size input_visible_size; + + // Codec profile of encoded output stream. + VideoCodecProfile output_profile; + + // Initial bitrate of encoded output stream in bits per second. + uint32_t initial_bitrate; + + // Codec level of encoded output stream for H264 only. This value should + // be aligned to the H264 standard definition of SPS.level_idc. The only + // exception is in Main and Baseline profile we still use + // |h264_output_level|=9 for Level 1b, which should set level_idc to 11 and + // constraint_set3_flag to 1. (Spec A.3.1 and A.3.2) + base::Optional<uint8_t> h264_output_level; + }; + // Interface for clients that use VideoEncodeAccelerator. These callbacks will // not be made unless Initialize() has returned successfully. class MEDIA_EXPORT Client { @@ -146,22 +184,11 @@ // initialization is successful. // TODO(mcasas): Update to asynchronous, https://crbug.com/744210. // Parameters: - // |input_format| is the frame format of the input stream (as would be - // reported by VideoFrame::format() for frames passed to Encode()). - // |input_visible_size| is the resolution of the input stream (as would be - // reported by VideoFrame::visible_rect().size() for frames passed to - // Encode()). - // |output_profile| is the codec profile of the encoded output stream. - // |initial_bitrate| is the initial bitrate of the encoded output stream, - // in bits per second. + // |config| contains the initialization parameters. // |client| is the client of this video encoder. The provided pointer must // be valid until Destroy() is called. // TODO(sheu): handle resolution changes. http://crbug.com/249944 - virtual bool Initialize(VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) = 0; + virtual bool Initialize(const Config& config, Client* client) = 0; // Encodes the given frame. // Parameters:
diff --git a/net/proxy_resolution/proxy_resolver_v8.cc b/net/proxy_resolution/proxy_resolver_v8.cc index 9767c1b..5b46b99 100644 --- a/net/proxy_resolution/proxy_resolver_v8.cc +++ b/net/proxy_resolution/proxy_resolver_v8.cc
@@ -137,22 +137,23 @@ const size_t kMaxStringBytesForCopy = 256; // Converts a V8 String to a UTF8 std::string. -std::string V8StringToUTF8(v8::Local<v8::String> s) { +std::string V8StringToUTF8(v8::Isolate* isolate, v8::Local<v8::String> s) { int len = s->Length(); std::string result; if (len > 0) - s->WriteUtf8(base::WriteInto(&result, len + 1)); + s->WriteUtf8(isolate, base::WriteInto(&result, len + 1)); return result; } // Converts a V8 String to a UTF16 base::string16. -base::string16 V8StringToUTF16(v8::Local<v8::String> s) { +base::string16 V8StringToUTF16(v8::Isolate* isolate, v8::Local<v8::String> s) { int len = s->Length(); base::string16 result; // Note that the reinterpret cast is because on Windows string16 is an alias // to wstring, and hence has character type wchar_t not uint16_t. if (len > 0) { - s->Write(reinterpret_cast<uint16_t*>(base::WriteInto(&result, len + 1)), 0, + s->Write(isolate, + reinterpret_cast<uint16_t*>(base::WriteInto(&result, len + 1)), 0, len); } return result; @@ -205,7 +206,7 @@ v8::Local<v8::String> str_object; if (!object->ToString(isolate->GetCurrentContext()).ToLocal(&str_object)) return false; - *utf16_result = V8StringToUTF16(str_object); + *utf16_result = V8StringToUTF16(isolate, str_object); return true; } @@ -218,7 +219,7 @@ return false; const base::string16 hostname_utf16 = - V8StringToUTF16(v8::Local<v8::String>::Cast(args[0])); + V8StringToUTF16(args.GetIsolate(), v8::Local<v8::String>::Cast(args[0])); // If the hostname is already in ASCII, simply return it as is. if (base::IsStringASCII(hostname_utf16)) { @@ -476,7 +477,8 @@ return ERR_PAC_SCRIPT_FAILED; } - base::string16 ret_str = V8StringToUTF16(v8::Local<v8::String>::Cast(ret)); + base::string16 ret_str = + V8StringToUTF16(isolate_, v8::Local<v8::String>::Cast(ret)); if (!base::IsStringASCII(ret_str)) { // TODO(eroman): Rather than failing when a wide string is returned, we @@ -783,7 +785,7 @@ } std::string ip_address_list = - V8StringToUTF8(v8::Local<v8::String>::Cast(args[0])); + V8StringToUTF8(args.GetIsolate(), v8::Local<v8::String>::Cast(args[0])); if (!base::IsStringASCII(ip_address_list)) { args.GetReturnValue().SetNull(); return; @@ -809,13 +811,13 @@ } std::string ip_address = - V8StringToUTF8(v8::Local<v8::String>::Cast(args[0])); + V8StringToUTF8(args.GetIsolate(), v8::Local<v8::String>::Cast(args[0])); if (!base::IsStringASCII(ip_address)) { args.GetReturnValue().Set(false); return; } std::string ip_prefix = - V8StringToUTF8(v8::Local<v8::String>::Cast(args[1])); + V8StringToUTF8(args.GetIsolate(), v8::Local<v8::String>::Cast(args[1])); if (!base::IsStringASCII(ip_prefix)) { args.GetReturnValue().Set(false); return; @@ -835,7 +837,7 @@ } std::string hostname_utf8 = - V8StringToUTF8(v8::Local<v8::String>::Cast(args[0])); + V8StringToUTF8(args.GetIsolate(), v8::Local<v8::String>::Cast(args[0])); args.GetReturnValue().Set(IsPlainHostName(hostname_utf8)); }
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc index 5be76220..1667eee 100644 --- a/net/socket/ssl_client_socket_impl.cc +++ b/net/socket/ssl_client_socket_impl.cc
@@ -814,14 +814,6 @@ return rv; } -int SSLClientSocketImpl::CancelReadIfReady() { - int result = transport_->socket()->CancelReadIfReady(); - // Cancel |user_read_callback_|, because caller does not expect the callback - // to be invoked after they have canceled the ReadIfReady. - user_read_callback_.Reset(); - return result; -} - int SSLClientSocketImpl::Write( IOBuffer* buf, int buf_len,
diff --git a/net/socket/ssl_client_socket_impl.h b/net/socket/ssl_client_socket_impl.h index 4648ab72..150a479 100644 --- a/net/socket/ssl_client_socket_impl.h +++ b/net/socket/ssl_client_socket_impl.h
@@ -125,7 +125,6 @@ int ReadIfReady(IOBuffer* buf, int buf_len, CompletionOnceCallback callback) override; - int CancelReadIfReady() override; int Write(IOBuffer* buf, int buf_len, CompletionOnceCallback callback,
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc index 147539d..06d9473 100644 --- a/net/url_request/url_request_unittest.cc +++ b/net/url_request/url_request_unittest.cc
@@ -8791,15 +8791,16 @@ // Set headers (some of which are specific to the POST). HttpRequestHeaders headers; - headers.AddHeadersFromString( - "Content-Type: multipart/form-data; " - "boundary=----WebKitFormBoundaryAADeAA+NAAWMAAwZ\r\n" - "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9," - "text/plain;q=0.8,image/png,*/*;q=0.5\r\n" - "Accept-Language: en-US,en\r\n" - "Accept-Charset: ISO-8859-1,*,utf-8\r\n" - "Content-Length: 11\r\n" - "Origin: http://localhost:1337/"); + headers.SetHeader("Content-Type", + "multipart/form-data;" + "boundary=----WebKitFormBoundaryAADeAA+NAAWMAAwZ"); + headers.SetHeader("Accept", + "text/xml,application/xml,application/xhtml+xml," + "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); + headers.SetHeader("Accept-Language", "en-US,en"); + headers.SetHeader("Accept-Charset", "ISO-8859-1,*,utf-8"); + headers.SetHeader("Content-Length", "11"); + headers.SetHeader("Origin", "http://localhost:1337/"); req->SetExtraRequestHeaders(headers); req->Start(); d.RunUntilComplete();
diff --git a/ppapi/proxy/ppapi_command_buffer_proxy.cc b/ppapi/proxy/ppapi_command_buffer_proxy.cc index 29e976d..90f4147 100644 --- a/ppapi/proxy/ppapi_command_buffer_proxy.cc +++ b/ppapi/proxy/ppapi_command_buffer_proxy.cc
@@ -163,6 +163,9 @@ if (last_state_.error != gpu::error::kNoError) return; + if (flush_info_->flush_pending) + FlushInternal(); + Send(new PpapiHostMsg_PPBGraphics3D_DestroyTransferBuffer( ppapi::API_ID_PPB_GRAPHICS_3D, resource_, id)); }
diff --git a/remoting/codec/webrtc_video_encoder_gpu.cc b/remoting/codec/webrtc_video_encoder_gpu.cc index 7359134..4e05b26 100644 --- a/remoting/codec/webrtc_video_encoder_gpu.cc +++ b/remoting/codec/webrtc_video_encoder_gpu.cc
@@ -219,10 +219,11 @@ // per second. uint32_t initial_bitrate = kTargetFrameRate * 1024 * 1024 * 8; + const media::VideoEncodeAccelerator::Config config( + input_format, input_visible_size_, codec_profile_, initial_bitrate); video_encode_accelerator_ = media::GpuVideoEncodeAcceleratorFactory::CreateVEA( - input_format, input_visible_size_, codec_profile_, initial_bitrate, - this, CreateGpuPreferences()); + config, this, CreateGpuPreferences()); if (!video_encode_accelerator_) { LOG(ERROR) << "Could not create VideoEncodeAccelerator";
diff --git a/remoting/host/linux/BUILD.gn b/remoting/host/linux/BUILD.gn index 32ccdcc..e0a4627 100644 --- a/remoting/host/linux/BUILD.gn +++ b/remoting/host/linux/BUILD.gn
@@ -62,10 +62,10 @@ if (is_component_build) { sources += [ "$root_build_dir/libbase.so" ] deps += [ "//base:base" ] - if (use_custom_libcxx) { - sources += [ "$root_build_dir/libc++.so" ] - deps += [ "//buildtools/third_party/libc++" ] - } + } + if (!libcpp_is_static && use_custom_libcxx) { + sources += [ "$root_build_dir/libc++.so" ] + deps += [ "//buildtools/third_party/libc++" ] } }
diff --git a/remoting/host/win/rdp_client_window.cc b/remoting/host/win/rdp_client_window.cc index 4d420ae6..a053c574 100644 --- a/remoting/host/win/rdp_client_window.cc +++ b/remoting/host/win/rdp_client_window.cc
@@ -440,7 +440,8 @@ apply_resolution_attempts_ = 0; apply_resolution_timer_.Start( FROM_HERE, kReapplyResolutionPeriod, - base::Bind(&RdpClientWindow::ReapplyDesktopResolution, this)); + base::BindRepeating(&RdpClientWindow::ReapplyDesktopResolution, + Microsoft::WRL::ComPtr<RdpClientWindow>(this))); } return S_OK;
diff --git a/remoting/ios/app/app_delegate.mm b/remoting/ios/app/app_delegate.mm index bf79395..15cd74b 100644 --- a/remoting/ios/app/app_delegate.mm +++ b/remoting/ios/app/app_delegate.mm
@@ -8,6 +8,8 @@ #import "remoting/ios/app/app_delegate.h" +#import <AVFoundation/AVFoundation.h> + #import "remoting/ios/app/app_initializer.h" #import "remoting/ios/app/app_view_controller.h" #import "remoting/ios/app/first_launch_view_presenter.h" @@ -48,6 +50,10 @@ didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { [self launchRootViewController]; [RemotingTheme applyColorSchemes]; + [AVAudioSession.sharedInstance + setCategory:AVAudioSessionCategoryPlayback + withOptions:AVAudioSessionCategoryOptionMixWithOthers + error:NULL]; [AppInitializer onAppDidFinishLaunching]; return YES;
diff --git a/remoting/protocol/webrtc_audio_module.cc b/remoting/protocol/webrtc_audio_module.cc index 279b302..a5c111b4 100644 --- a/remoting/protocol/webrtc_audio_module.cc +++ b/remoting/protocol/webrtc_audio_module.cc
@@ -144,8 +144,8 @@ base::AutoLock auto_lock(lock_); if (!playing_ && audio_task_runner_) { audio_task_runner_->PostTask( - FROM_HERE, - base::Bind(&WebrtcAudioModule::StartPlayoutOnAudioThread, this)); + FROM_HERE, base::BindOnce(&WebrtcAudioModule::StartPlayoutOnAudioThread, + rtc::scoped_refptr<WebrtcAudioModule>(this))); playing_ = true; } return 0; @@ -155,8 +155,8 @@ base::AutoLock auto_lock(lock_); if (playing_) { audio_task_runner_->PostTask( - FROM_HERE, - base::Bind(&WebrtcAudioModule::StopPlayoutOnAudioThread, this)); + FROM_HERE, base::BindOnce(&WebrtcAudioModule::StopPlayoutOnAudioThread, + rtc::scoped_refptr<WebrtcAudioModule>(this))); playing_ = false; } return 0; @@ -353,9 +353,9 @@ void WebrtcAudioModule::StartPlayoutOnAudioThread() { DCHECK(audio_task_runner_->BelongsToCurrentThread()); poll_timer_ = std::make_unique<base::RepeatingTimer>(); - poll_timer_->Start( - FROM_HERE, kPollInterval, - base::Bind(&WebrtcAudioModule::PollFromSource, base::Unretained(this))); + poll_timer_->Start(FROM_HERE, kPollInterval, + base::BindRepeating(&WebrtcAudioModule::PollFromSource, + base::Unretained(this))); } void WebrtcAudioModule::StopPlayoutOnAudioThread() {
diff --git a/services/device/public/cpp/generic_sensor/BUILD.gn b/services/device/public/cpp/generic_sensor/BUILD.gn index b5a26e3c..3c503b1 100644 --- a/services/device/public/cpp/generic_sensor/BUILD.gn +++ b/services/device/public/cpp/generic_sensor/BUILD.gn
@@ -2,31 +2,6 @@ # 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 Sensors -# implementation and all Device Sensors 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 Sensors (the -# current files define structs that are used as a consistent interpretation of -# shared memory by the Device Sensor 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). -# If a file does not meet these constraints, it cannot be used by the Blink -# client and should be placed in the "generic_sensor" target below. Similarly, -# clients without Blink's constraints should depend on the "generic_sensor" -# target below rather than this one. -# Consult {platform-architecture-dev, services-dev}@chromium.org in the case -# of any uncertainty. -source_set("shared_with_blink") { - sources = [ - "motion_data.cc", - "motion_data.h", - "orientation_data.cc", - "orientation_data.h", - ] - # Do not add deps here per the above comment. -} - source_set("generic_sensor") { sources = [ "platform_sensor_configuration.cc", @@ -40,7 +15,6 @@ ] public_deps = [ - ":shared_with_blink", "//services/device/public/mojom:generic_sensor", ]
diff --git a/services/device/public/cpp/generic_sensor/motion_data.cc b/services/device/public/cpp/generic_sensor/motion_data.cc deleted file mode 100644 index b736f6c..0000000 --- a/services/device/public/cpp/generic_sensor/motion_data.cc +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2013 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 "services/device/public/cpp/generic_sensor/motion_data.h" - -#include <string.h> - -namespace device { - -MotionData::MotionData() { - // Make sure to zero out the memory so that there are no uninitialized bits. - // This object is used in the shared memory buffer and is memory copied by - // two processes. Valgrind will complain if we copy around memory that is - // only partially initialized. - memset(this, 0, sizeof(*this)); -} - -MotionData::MotionData(const MotionData& other) = default; - -} // namespace device
diff --git a/services/device/public/cpp/generic_sensor/motion_data.h b/services/device/public/cpp/generic_sensor/motion_data.h deleted file mode 100644 index ba5fd8c..0000000 --- a/services/device/public/cpp/generic_sensor/motion_data.h +++ /dev/null
@@ -1,54 +0,0 @@ -// Copyright 2013 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 SERVICES_DEVICE_PUBLIC_CPP_GENERIC_SENSOR_MOTION_DATA_H_ -#define SERVICES_DEVICE_PUBLIC_CPP_GENERIC_SENSOR_MOTION_DATA_H_ - -namespace device { - -#pragma pack(push, 1) - -class MotionData { - public: - MotionData(); - MotionData(const MotionData& other); - ~MotionData() {} - - double acceleration_x; - double acceleration_y; - double acceleration_z; - - double acceleration_including_gravity_x; - double acceleration_including_gravity_y; - double acceleration_including_gravity_z; - - double rotation_rate_alpha; - double rotation_rate_beta; - double rotation_rate_gamma; - - double interval; - - bool has_acceleration_x : 1; - bool has_acceleration_y : 1; - bool has_acceleration_z : 1; - - bool has_acceleration_including_gravity_x : 1; - bool has_acceleration_including_gravity_y : 1; - bool has_acceleration_including_gravity_z : 1; - - bool has_rotation_rate_alpha : 1; - bool has_rotation_rate_beta : 1; - bool has_rotation_rate_gamma : 1; - - bool all_available_sensors_are_active : 1; -}; - -static_assert(sizeof(MotionData) == (10 * sizeof(double) + 2 * sizeof(char)), - "MotionData has wrong size"); - -#pragma pack(pop) - -} // namespace device - -#endif // SERVICES_DEVICE_PUBLIC_CPP_GENERIC_SENSOR_MOTION_DATA_H_
diff --git a/services/device/public/cpp/generic_sensor/orientation_data.cc b/services/device/public/cpp/generic_sensor/orientation_data.cc deleted file mode 100644 index e9398edb2..0000000 --- a/services/device/public/cpp/generic_sensor/orientation_data.cc +++ /dev/null
@@ -1,19 +0,0 @@ -// Copyright 2013 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 "services/device/public/cpp/generic_sensor/orientation_data.h" - -#include <string.h> - -namespace device { - -OrientationData::OrientationData() { - // Make sure to zero out the memory so that there are no uninitialized bits. - // This object is used in the shared memory buffer and is memory copied by - // two processes. Valgrind will complain if we copy around memory that is - // only partially initialized. - memset(this, 0, sizeof(*this)); -} - -} // namespace device
diff --git a/services/device/public/cpp/generic_sensor/orientation_data.h b/services/device/public/cpp/generic_sensor/orientation_data.h deleted file mode 100644 index 3552ade..0000000 --- a/services/device/public/cpp/generic_sensor/orientation_data.h +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright 2013 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 SERVICES_DEVICE_PUBLIC_CPP_GENERIC_SENSOR_ORIENTATION_DATA_H_ -#define SERVICES_DEVICE_PUBLIC_CPP_GENERIC_SENSOR_ORIENTATION_DATA_H_ - -namespace device { - -#pragma pack(push, 1) - -class OrientationData { - public: - OrientationData(); - ~OrientationData() {} - - double alpha; - double beta; - double gamma; - - bool has_alpha : 1; - bool has_beta : 1; - bool has_gamma : 1; - - bool absolute : 1; - - bool all_available_sensors_are_active : 1; -}; - -static_assert(sizeof(OrientationData) == - (3 * sizeof(double) + 1 * sizeof(char)), - "OrientationData has wrong size"); - -#pragma pack(pop) - -} // namespace device - -#endif // SERVICES_DEVICE_PUBLIC_CPP_GENERIC_SENSOR_ORIENTATION_DATA_H_
diff --git a/services/identity/public/cpp/identity_test_environment.cc b/services/identity/public/cpp/identity_test_environment.cc index 86b00b7..0d953d2 100644 --- a/services/identity/public/cpp/identity_test_environment.cc +++ b/services/identity/public/cpp/identity_test_environment.cc
@@ -146,9 +146,10 @@ internals_->identity_manager(), email); } -void IdentityTestEnvironment::ClearPrimaryAccount() { +void IdentityTestEnvironment::ClearPrimaryAccount( + ClearPrimaryAccountPolicy policy) { identity::ClearPrimaryAccount(internals_->signin_manager(), - internals_->identity_manager()); + internals_->identity_manager(), policy); } AccountInfo IdentityTestEnvironment::MakeAccountAvailable(
diff --git a/services/identity/public/cpp/identity_test_environment.h b/services/identity/public/cpp/identity_test_environment.h index d7552600..8a368e0 100644 --- a/services/identity/public/cpp/identity_test_environment.h +++ b/services/identity/public/cpp/identity_test_environment.h
@@ -6,6 +6,7 @@ #define SERVICES_IDENTITY_PUBLIC_CPP_IDENTITY_TEST_ENVIRONMENT_H_ #include "services/identity/public/cpp/identity_manager.h" +#include "services/identity/public/cpp/identity_test_utils.h" namespace identity { @@ -50,10 +51,12 @@ // Returns the AccountInfo of the newly-available account. AccountInfo MakePrimaryAccountAvailable(const std::string& email); - // Clears the primary account. On non-ChromeOS, results in the firing of the + // Clears the primary account, with |policy| used to determine whether to keep + // or remove all accounts. On non-ChromeOS, results in the firing of the // IdentityManager and SigninManager callbacks for signout. Blocks until the // primary account is cleared. - void ClearPrimaryAccount(); + void ClearPrimaryAccount( + ClearPrimaryAccountPolicy policy = ClearPrimaryAccountPolicy::DEFAULT); // Makes an account available for the given email address, generating a GAIA // ID and refresh token that correspond uniquely to that email address. Blocks
diff --git a/services/identity/public/cpp/identity_test_utils.cc b/services/identity/public/cpp/identity_test_utils.cc index f1704081..c59694d 100644 --- a/services/identity/public/cpp/identity_test_utils.cc +++ b/services/identity/public/cpp/identity_test_utils.cc
@@ -195,7 +195,8 @@ } void ClearPrimaryAccount(SigninManagerBase* signin_manager, - IdentityManager* identity_manager) { + IdentityManager* identity_manager, + ClearPrimaryAccountPolicy policy) { #if defined(OS_CHROMEOS) // TODO(blundell): If we ever need this functionality on ChromeOS (which seems // unlikely), plumb this through to just clear the primary account info @@ -211,8 +212,25 @@ SigninManager* real_signin_manager = SigninManager::FromSigninManagerBase(signin_manager); - real_signin_manager->SignOut(signin_metrics::SIGNOUT_TEST, - signin_metrics::SignoutDelete::IGNORE_METRIC); + signin_metrics::ProfileSignout signout_source_metric = + signin_metrics::SIGNOUT_TEST; + signin_metrics::SignoutDelete signout_delete_metric = + signin_metrics::SignoutDelete::IGNORE_METRIC; + + switch (policy) { + case ClearPrimaryAccountPolicy::DEFAULT: + real_signin_manager->SignOut(signout_source_metric, + signout_delete_metric); + break; + case ClearPrimaryAccountPolicy::KEEP_ALL_ACCOUNTS: + real_signin_manager->SignOutAndKeepAllAccounts(signout_source_metric, + signout_delete_metric); + break; + case ClearPrimaryAccountPolicy::REMOVE_ALL_ACCOUNTS: + real_signin_manager->SignOutAndRemoveAllAccounts(signout_source_metric, + signout_delete_metric); + break; + } run_loop.Run(); #endif
diff --git a/services/identity/public/cpp/identity_test_utils.h b/services/identity/public/cpp/identity_test_utils.h index e72264fc..04130f9 100644 --- a/services/identity/public/cpp/identity_test_utils.h +++ b/services/identity/public/cpp/identity_test_utils.h
@@ -32,6 +32,17 @@ // code to use IdentityTestEnvironment. namespace identity { +// Controls whether to keep or remove accounts when clearing the primary +// account. +enum class ClearPrimaryAccountPolicy { + // Use the default internal policy. + DEFAULT, + // Explicitly keep all accounts. + KEEP_ALL_ACCOUNTS, + // Explicitly remove all accounts. + REMOVE_ALL_ACCOUNTS +}; + class IdentityManager; // Sets the primary account for the given email address, generating a GAIA ID @@ -76,11 +87,15 @@ IdentityManager* identity_manager, const std::string& email); -// Clears the primary account. On non-ChromeOS, results in the firing of the +// Clears the primary account, with |policy| used to determine whether to keep +// or remove all accounts. On non-ChromeOS, results in the firing of the // IdentityManager and SigninManager callbacks for signout. Blocks until the // primary account is cleared. -void ClearPrimaryAccount(SigninManagerBase* signin_manager, - IdentityManager* identity_manager); +// NOTE: See disclaimer at top of file re: direct usage. +void ClearPrimaryAccount( + SigninManagerBase* signin_manager, + IdentityManager* identity_manager, + ClearPrimaryAccountPolicy policy = ClearPrimaryAccountPolicy::DEFAULT); // Makes an account available for the given email address, generating a GAIA ID // and refresh token that correspond uniquely to that email address. Blocks
diff --git a/services/network/proxy_resolving_socket_mojo.cc b/services/network/proxy_resolving_socket_mojo.cc index 8ad0b15..c9c0542 100644 --- a/services/network/proxy_resolving_socket_mojo.cc +++ b/services/network/proxy_resolving_socket_mojo.cc
@@ -7,7 +7,6 @@ #include <utility> #include "base/logging.h" -#include "base/optional.h" #include "net/base/net_errors.h" #include "services/network/socket_data_pump.h" @@ -35,6 +34,18 @@ OnConnectCompleted(result); } +void ProxyResolvingSocketMojo::GetPeerAddress(GetPeerAddressCallback callback) { + DCHECK(socket_); + + net::IPEndPoint peer_addr; + int result = socket_->GetPeerAddress(&peer_addr); + if (result != net::OK) { + std::move(callback).Run(result, base::nullopt); + return; + } + std::move(callback).Run(result, peer_addr); +} + void ProxyResolvingSocketMojo::OnConnectCompleted(int result) { DCHECK(!connect_callback_.is_null()); DCHECK(!socket_data_pump_); @@ -43,16 +54,9 @@ if (result == net::OK) result = socket_->GetLocalAddress(&local_addr); - net::IPEndPoint peer_addr; - // If |socket_| is connected through a proxy, GetPeerAddress returns - // net::ERR_NAME_NOT_RESOLVED. - bool get_peer_address_success = - result == net::OK && (socket_->GetPeerAddress(&peer_addr) == net::OK); - if (result != net::OK) { std::move(connect_callback_) - .Run(result, base::nullopt, base::nullopt, - mojo::ScopedDataPipeConsumerHandle(), + .Run(result, base::nullopt, mojo::ScopedDataPipeConsumerHandle(), mojo::ScopedDataPipeProducerHandle()); return; } @@ -63,11 +67,7 @@ std::move(receive_pipe.producer_handle), std::move(send_pipe.consumer_handle), traffic_annotation_); std::move(connect_callback_) - .Run(net::OK, local_addr, - get_peer_address_success - ? base::make_optional<net::IPEndPoint>(peer_addr) - : base::nullopt, - std::move(receive_pipe.consumer_handle), + .Run(net::OK, local_addr, std::move(receive_pipe.consumer_handle), std::move(send_pipe.producer_handle)); }
diff --git a/services/network/proxy_resolving_socket_mojo.h b/services/network/proxy_resolving_socket_mojo.h index 78a0b9e8..9e643837 100644 --- a/services/network/proxy_resolving_socket_mojo.h +++ b/services/network/proxy_resolving_socket_mojo.h
@@ -30,6 +30,9 @@ mojom::ProxyResolvingSocketFactory::CreateProxyResolvingSocketCallback callback); + // mojom::ProxyResolvingSocket implementation. + void GetPeerAddress(GetPeerAddressCallback callback) override; + private: void OnConnectCompleted(int net_result);
diff --git a/services/network/proxy_resolving_socket_mojo_unittest.cc b/services/network/proxy_resolving_socket_mojo_unittest.cc index 9c1ee7a3..7f6936b 100644 --- a/services/network/proxy_resolving_socket_mojo_unittest.cc +++ b/services/network/proxy_resolving_socket_mojo_unittest.cc
@@ -99,7 +99,6 @@ int CreateSocketSync( mojom::ProxyResolvingSocketRequest request, - net::IPEndPoint* peer_addr_out, const GURL& url, mojo::ScopedDataPipeConsumerHandle* receive_pipe_handle_out, mojo::ScopedDataPipeProducerHandle* send_pipe_handle_out) { @@ -111,14 +110,11 @@ std::move(request), base::BindLambdaForTesting( [&](int result, const base::Optional<net::IPEndPoint>& local_addr, - const base::Optional<net::IPEndPoint>& peer_addr, mojo::ScopedDataPipeConsumerHandle receive_pipe_handle, mojo::ScopedDataPipeProducerHandle send_pipe_handle) { net_error = result; if (net_error == net::OK) EXPECT_NE(0, local_addr.value().port()); - if (peer_addr_out && peer_addr) - *peer_addr_out = peer_addr.value(); *receive_pipe_handle_out = std::move(receive_pipe_handle); *send_pipe_handle_out = std::move(send_pipe_handle); run_loop.Quit(); @@ -180,18 +176,27 @@ mojom::ProxyResolvingSocketPtr socket; mojo::ScopedDataPipeConsumerHandle client_socket_receive_handle; mojo::ScopedDataPipeProducerHandle client_socket_send_handle; - net::IPEndPoint actual_remote_addr; EXPECT_EQ(net::OK, - CreateSocketSync(mojo::MakeRequest(&socket), &actual_remote_addr, - kDestination, &client_socket_receive_handle, + CreateSocketSync(mojo::MakeRequest(&socket), kDestination, + &client_socket_receive_handle, &client_socket_send_handle)); - // Consume all read data. - base::RunLoop().RunUntilIdle(); + net::IPEndPoint actual_remote_addr; + int net_error = net::ERR_FAILED; + base::RunLoop run_loop; + socket->GetPeerAddress(base::BindLambdaForTesting( + [&](int result, const base::Optional<net::IPEndPoint>& peer_addr) { + net_error = result; + if (net_error == net::OK) + actual_remote_addr = peer_addr.value(); + run_loop.Quit(); + })); + run_loop.Run(); if (!is_direct) { - EXPECT_EQ(net::IPEndPoint(), actual_remote_addr); + EXPECT_EQ(net::ERR_NAME_NOT_RESOLVED, net_error); EXPECT_FALSE(socket_data.AllReadDataConsumed()); EXPECT_TRUE(socket_data.AllWriteDataConsumed()); } else { + EXPECT_EQ(net::OK, net_error); EXPECT_EQ(remote_addr.ToString(), actual_remote_addr.ToString()); EXPECT_TRUE(socket_data.AllReadDataConsumed()); EXPECT_FALSE(socket_data.AllWriteDataConsumed()); @@ -226,8 +231,8 @@ mojom::ProxyResolvingSocketPtr socket; mojo::ScopedDataPipeConsumerHandle client_socket_receive_handle; mojo::ScopedDataPipeProducerHandle client_socket_send_handle; - int status = CreateSocketSync(mojo::MakeRequest(&socket), nullptr, - kDestination, &client_socket_receive_handle, + int status = CreateSocketSync(mojo::MakeRequest(&socket), kDestination, + &client_socket_receive_handle, &client_socket_send_handle); if (test.is_direct) { EXPECT_EQ(net::ERR_FAILED, status); @@ -270,10 +275,9 @@ mojo::ScopedDataPipeConsumerHandle client_socket_receive_handle; mojo::ScopedDataPipeProducerHandle client_socket_send_handle; const GURL kDestination("http://example.com"); - EXPECT_EQ(net::OK, - CreateSocketSync(mojo::MakeRequest(&socket), nullptr, kDestination, - &client_socket_receive_handle, - &client_socket_send_handle)); + EXPECT_EQ(net::OK, CreateSocketSync(mojo::MakeRequest(&socket), kDestination, + &client_socket_receive_handle, + &client_socket_send_handle)); // Loop kNumIterations times to test that writes can follow reads, and reads // can follow writes. for (int j = 0; j < kNumIterations; ++j) {
diff --git a/services/network/public/mojom/proxy_resolving_socket.mojom b/services/network/public/mojom/proxy_resolving_socket.mojom index 4adf75d..18ceb08 100644 --- a/services/network/public/mojom/proxy_resolving_socket.mojom +++ b/services/network/public/mojom/proxy_resolving_socket.mojom
@@ -12,6 +12,13 @@ // and Reads are through the data pipes supplied upon construction. Consumer // can close the socket by destroying the interface pointer. interface ProxyResolvingSocket{ + // Gets the peer address. On success, |net_error| is + // net::OK and |peer_addr| contains the peer address. On failure, + // |peer_addr| is null and |net_error| is a net error code. If socket is + // connected to a proxy, |net_error| will be net::ERR_NAME_NOT_RESOLVED, and + // |peer_addr| will be empty. + GetPeerAddress() => (int32 net_error, net.interfaces.IPEndPoint? peer_addr); + // TODO(xunjieli): Add methods to configure the socket connection and allow // consumers to specify whether they want to disconnect or return the socket // to socket pools. @@ -26,9 +33,7 @@ // connection will be established on top of a TCP connection. On success, // |result| is net::OK. Caller is to use |send_stream| to send data and // |receive_stream| to receive data over the connection. On failure, |result| - // is a network error code. |local_addr| contains the local address of the - // socket. |peer_addr| contains the peer address. If socket is connected to a - // proxy, |peer_addr| will be null. + // is a network error code. // // Any sockets that are created but are yet to be destroyed will be destroyed // when the implementation of this factory goes away. @@ -37,7 +42,6 @@ ProxyResolvingSocket& socket) => (int32 result, net.interfaces.IPEndPoint? local_addr, - net.interfaces.IPEndPoint? peer_addr, handle<data_pipe_consumer>? receive_stream, handle<data_pipe_producer>? send_stream); };
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc index fb2f7ae1..68a4dcd3 100644 --- a/services/network/url_loader_unittest.cc +++ b/services/network/url_loader_unittest.cc
@@ -1596,7 +1596,8 @@ TEST_F(URLLoaderTest, RedirectModifiedHeaders) { ResourceRequest request = CreateResourceRequest( "GET", test_server()->GetURL("/redirect307-to-echo")); - request.headers.AddHeadersFromString("Header1: Value1\r\nHeader2: Value2"); + request.headers.SetHeader("Header1", "Value1"); + request.headers.SetHeader("Header2", "Value2"); base::RunLoop delete_run_loop; mojom::URLLoaderPtr loader; @@ -1640,7 +1641,8 @@ TEST_F(URLLoaderTest, RedirectRemoveHeader) { ResourceRequest request = CreateResourceRequest( "GET", test_server()->GetURL("/redirect307-to-echo")); - request.headers.AddHeadersFromString("Header1: Value1\r\nHeader2: Value2"); + request.headers.SetHeader("Header1", "Value1"); + request.headers.SetHeader("Header2", "Value2"); base::RunLoop delete_run_loop; mojom::URLLoaderPtr loader; @@ -1680,7 +1682,8 @@ TEST_F(URLLoaderTest, RedirectRemoveHeaderAndAddItBack) { ResourceRequest request = CreateResourceRequest( "GET", test_server()->GetURL("/redirect307-to-echo")); - request.headers.AddHeadersFromString("Header1: Value1\r\nHeader2: Value2"); + request.headers.SetHeader("Header1", "Value1"); + request.headers.SetHeader("Header2", "Value2"); base::RunLoop delete_run_loop; mojom::URLLoaderPtr loader;
diff --git a/services/tracing/public/cpp/perfetto/producer_client.cc b/services/tracing/public/cpp/perfetto/producer_client.cc index cd67ef57..af17180 100644 --- a/services/tracing/public/cpp/perfetto/producer_client.cc +++ b/services/tracing/public/cpp/perfetto/producer_client.cc
@@ -211,6 +211,10 @@ NOTREACHED(); } +void ProducerClient::NotifyDataSourceStopped(perfetto::DataSourceInstanceID) { + NOTREACHED(); +} + std::unique_ptr<perfetto::TraceWriter> ProducerClient::CreateTraceWriter( perfetto::BufferID target_buffer) { DCHECK(shared_memory_arbiter_);
diff --git a/services/tracing/public/cpp/perfetto/producer_client.h b/services/tracing/public/cpp/perfetto/producer_client.h index 4937b02..654a6c1 100644 --- a/services/tracing/public/cpp/perfetto/producer_client.h +++ b/services/tracing/public/cpp/perfetto/producer_client.h
@@ -88,6 +88,7 @@ void UnregisterDataSource(const std::string& name) override; size_t shared_buffer_page_size_kb() const override; void NotifyFlushComplete(perfetto::FlushRequestID) override; + void NotifyDataSourceStopped(perfetto::DataSourceInstanceID) override; static void ResetTaskRunnerForTesting();
diff --git a/services/ui/ws2/BUILD.gn b/services/ui/ws2/BUILD.gn index 2f08c7f..c1ad085 100644 --- a/services/ui/ws2/BUILD.gn +++ b/services/ui/ws2/BUILD.gn
@@ -13,6 +13,9 @@ friend = [ ":tests", ":test_support", + + # It's ok for tests to depend upon private code. + "//ash:ash_unittests", ] public = [ "gpu_interface_provider.h",
diff --git a/services/ui/ws2/server_window.cc b/services/ui/ws2/server_window.cc index fe39297..f1a4e1c 100644 --- a/services/ui/ws2/server_window.cc +++ b/services/ui/ws2/server_window.cc
@@ -126,7 +126,9 @@ public: explicit ServerWindowEventHandler(ServerWindow* server_window) : server_window_(server_window) { - window()->AddPreTargetHandler(this, ui::EventTarget::Priority::kSystem); + // Use |kDefault| so as not to conflict with other important pre-target + // handlers (such as laser pointer). + window()->AddPreTargetHandler(this, ui::EventTarget::Priority::kDefault); } ~ServerWindowEventHandler() override { window()->RemovePreTargetHandler(this);
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 6c7cf49..8040747e 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -476,8 +476,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -1091,8 +1090,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": {
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index ebf63ac..a6297514 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -232,8 +232,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -946,8 +945,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -1786,8 +1784,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -2948,8 +2945,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -4098,8 +4094,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -5110,8 +5105,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -5779,8 +5773,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -6448,8 +6441,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -7117,8 +7109,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -13015,8 +13006,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -13725,8 +13715,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -14405,8 +14394,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -15095,8 +15083,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -15795,8 +15782,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -16384,8 +16370,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -16974,8 +16959,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -17535,8 +17519,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -18204,8 +18187,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -18873,8 +18855,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -19542,8 +19523,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -20211,8 +20191,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -20880,8 +20859,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -21549,8 +21527,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -22218,8 +22195,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -22887,8 +22863,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -23556,8 +23531,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -24249,8 +24223,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -25060,8 +25033,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 7c35060..eacde93 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -447,8 +447,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -1016,8 +1015,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -1462,8 +1460,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -1646,8 +1643,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -2140,8 +2136,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -2650,8 +2645,6 @@ }, "Win cl.exe Goma Canary LocalOutputCache": { "additional_compile_targets": [ - "v8:gn_all", - "pdfium_all", "libANGLE" ] }, @@ -2696,8 +2689,6 @@ }, "WinMSVC64 Goma Canary": { "additional_compile_targets": [ - "v8:gn_all", - "pdfium_all", "libANGLE" ] }, @@ -4256,8 +4247,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -5041,8 +5031,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor,ViewsBrowserWindows", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor,ViewsBrowserWindows" ], "name": "viz_content_browsertests", "swarming": {
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index f8b5f1ee..95af137 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -1059,8 +1059,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -1914,8 +1913,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -2677,8 +2675,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -3556,8 +3553,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": {
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json index ad439c6..fc6b3d7 100644 --- a/testing/buildbot/chromium.mac.json +++ b/testing/buildbot/chromium.mac.json
@@ -130,8 +130,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -739,8 +738,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -1469,8 +1467,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -2482,8 +2479,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -3085,8 +3081,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": {
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index bce9219..3354b3fb 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -2802,7 +2802,6 @@ { "args": [ "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter", "--test-launcher-batch-limit=1", "--test-launcher-print-test-stdio=always" ], @@ -3694,8 +3693,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -4396,8 +4394,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -5009,8 +5006,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -5648,8 +5644,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -6244,8 +6239,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -6755,8 +6749,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": {
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json index af172ea..f5b4a08 100644 --- a/testing/buildbot/chromium.win.json +++ b/testing/buildbot/chromium.win.json
@@ -196,8 +196,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -935,8 +934,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -2287,8 +2285,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": { @@ -3035,8 +3032,7 @@ }, { "args": [ - "--enable-features=VizDisplayCompositor", - "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter" + "--enable-features=VizDisplayCompositor" ], "name": "viz_content_browsertests", "swarming": {
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn index eb3848a..b824c71 100644 --- a/testing/buildbot/filters/BUILD.gn +++ b/testing/buildbot/filters/BUILD.gn
@@ -42,7 +42,6 @@ "//testing/buildbot/filters/site-per-process.content_browsertests.filter", "//testing/buildbot/filters/surface_sync.content_browsertests.filter", "//testing/buildbot/filters/viz.android.content_browsertests.filter", - "//testing/buildbot/filters/viz.content_browsertests.filter", ] }
diff --git a/testing/buildbot/filters/viz.content_browsertests.filter b/testing/buildbot/filters/viz.content_browsertests.filter deleted file mode 100644 index bf0ea54..0000000 --- a/testing/buildbot/filters/viz.content_browsertests.filter +++ /dev/null
@@ -1,7 +0,0 @@ -### Mac -# BrowserSideFlingBrowserTest timing out https://crbug.com/842325 --BrowserSideFlingBrowserTest.AutoscrollFling --BrowserSideFlingBrowserTest.TouchpadFling --BrowserSideFlingBrowserTest.TouchscreenFling --SitePerProcessBrowserTest.TouchpadGestureFlingStart --SitePerProcessBrowserTest.TouchscreenGestureFlingStart
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 438c39f..036862a 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -941,10 +941,6 @@ "label": "//pdf:pdf_unittests", "type": "console_test_launcher", }, - "pdfium_all": { - "label": "//third_party/pdfium:pdfium_all", - "type": "additional_compile_target", - }, "pdfium_test": { "label": "//third_party/pdfium/samples:pdfium_test", "type": "additional_compile_target", @@ -1254,10 +1250,6 @@ "label": "//url:url_unittests", "type": "console_test_launcher", }, - "v8:gn_all": { - "label": "//v8:gn_all", - "type": "additional_compile_target", - }, "video_decode_accelerator_unittest": { "label": "//media/gpu:video_decode_accelerator_unittest", "type": "raw",
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 7dfd8a37..34a04b1 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -1860,7 +1860,6 @@ 'viz_content_browsertests': { 'args': [ '--enable-features=VizDisplayCompositor', - '--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter' ], 'swarming': { 'shards': 2, @@ -2048,7 +2047,6 @@ 'viz_content_browsertests': { 'args': [ '--enable-features=VizDisplayCompositor', - '--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter', ], 'swarming': { 'shards': 2,
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 99028e3..f0f2b00 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -2590,7 +2590,7 @@ 'Win cl.exe Goma Canary LocalOutputCache': { # Build only chromium's subproject using cl.exe. 'additional_compile_targets': [ - 'v8:gn_all', 'pdfium_all', 'libANGLE', + 'libANGLE', ], }, 'Win7 Builder (dbg) Goma Canary': { @@ -2613,7 +2613,7 @@ 'WinMSVC64 Goma Canary': { # Build only chromium's subproject using cl.exe. 'additional_compile_targets': [ - 'v8:gn_all', 'pdfium_all', 'libANGLE', + 'libANGLE', ], }, 'win-annotator-rel': {
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG index 0086f0e..4309ddd5 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -82,7 +82,6 @@ crbug.com/591099 css3/flexbox/line-wrapping.html [ Failure ] crbug.com/591099 css3/flexbox/scrollbars-auto.html [ Failure ] crbug.com/714962 css3/masking/clip-path-reference-box-inline.html [ Failure ] -crbug.com/591099 editing/selection/5232159.html [ Failure ] crbug.com/591099 editing/selection/continuations-with-move-caret-to-boundary.html [ Failure ] crbug.com/591099 editing/selection/paint-hyphen.html [ Pass ] crbug.com/591099 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11.html [ Pass ] @@ -289,6 +288,9 @@ crbug.com/591099 external/wpt/css/css-writing-modes/vertical-alignment-009.xht [ Pass ] crbug.com/591099 external/wpt/css/cssom/cssstyledeclaration-mutationrecord-001.html [ Pass ] crbug.com/591099 external/wpt/css/selectors/focus-visible-007.html [ Failure ] +crbug.com/591099 external/wpt/css/selectors/selector-placeholder-shown-type-change-001.html [ Pass ] +crbug.com/591099 external/wpt/css/selectors/selector-read-write-type-change-002.html [ Pass ] +crbug.com/591099 external/wpt/css/selectors/selector-required-type-change-002.html [ Pass ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-fallback.html [ Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-negative-invalid.html [ Failure ] crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/redefine-attr-mapping.html [ Failure ] @@ -359,7 +361,7 @@ crbug.com/591099 external/wpt/fetch/cross-origin-resource-policy/fetch.any.html [ Timeout ] crbug.com/591099 external/wpt/fetch/http-cache/basic-auth-cache-test.html [ Timeout ] crbug.com/591099 external/wpt/fullscreen/api/document-exit-fullscreen-nested-in-iframe-manual.html [ Pass ] -crbug.com/591099 external/wpt/geolocation-API/PositionOptions.https.html [ Failure Pass ] +crbug.com/591099 external/wpt/geolocation-API/PositionOptions.https.html [ Failure ] crbug.com/591099 external/wpt/html-media-capture/capture_audio_cancel-manual.html [ Failure ] crbug.com/591099 external/wpt/html-media-capture/capture_image_cancel-manual.html [ Failure ] crbug.com/591099 external/wpt/html-media-capture/capture_video_cancel-manual.html [ Failure ] @@ -368,7 +370,7 @@ crbug.com/591099 external/wpt/html/browsers/the-window-object/window-open-noopener.html?_self [ Timeout ] crbug.com/591099 external/wpt/html/editing/focus/sequential-focus-navigation-and-the-tabindex-attribute/focus-tabindex-positive.html [ Timeout ] crbug.com/863040 external/wpt/html/editing/focus/tabindex-focus-flag.html [ Crash ] -crbug.com/591099 external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/serialization-via-idb.any.worker.html [ Crash Failure ] +crbug.com/591099 external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/serialization-via-idb.any.worker.html [ Failure ] crbug.com/591099 external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-domain-success.sub.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-hr-element-0/color.html [ Failure ] crbug.com/591099 external/wpt/html/rendering/non-replaced-elements/the-page/body-margin-2j.html [ Failure ] @@ -410,7 +412,7 @@ crbug.com/591099 external/wpt/picture-in-picture/request-picture-in-picture-twice.html [ Pass ] crbug.com/591099 external/wpt/pointerevents/pointerevent_click_during_capture-manual.html [ Crash Timeout ] crbug.com/591099 external/wpt/quirks/line-height-calculation.html [ Failure ] -crbug.com/591099 external/wpt/requestidlecallback/callback-iframe.html [ Pass ] +crbug.com/591099 external/wpt/requestidlecallback/callback-iframe.html [ Pass Timeout ] crbug.com/591099 external/wpt/requestidlecallback/callback-timeout-when-busy.html [ Timeout ] crbug.com/591099 external/wpt/requestidlecallback/callback-timeout.html [ Timeout ] crbug.com/591099 external/wpt/service-workers/service-worker/navigation-preload/broken-chunked-encoding.https.html [ Failure ] @@ -518,7 +520,6 @@ crbug.com/591099 fast/css/transform-inline-style-remove.html [ Failure ] crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-auto.html [ Failure ] crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-under.html [ Failure ] -crbug.com/591099 fast/dom/HTMLAreaElement/area-download.html [ Failure ] crbug.com/591099 fast/dom/nodesFromRect/nodesFromRect-basic.html [ Failure ] crbug.com/591099 fast/dynamic/first-letter-after-list-marker.html [ Failure ] crbug.com/591099 fast/encoding/utf-16-big-endian.html [ Failure ] @@ -549,7 +550,6 @@ crbug.com/591099 fast/scrolling/content-box-smaller-than-scrollbar.html [ Failure ] crbug.com/591099 fast/scrolling/jquery-rtl-scroll-type.html [ Failure ] crbug.com/591099 fast/scrolling/scrollbar-tickmarks-hittest.html [ Failure Pass ] -crbug.com/591099 fast/shapes/shape-outside-floats/shape-outside-clip-path-selection.html [ Failure ] crbug.com/591099 fast/sub-pixel/inline-block-with-padding.html [ Failure ] crbug.com/591099 fast/sub-pixel/repaint-subpixel-layer-in-subpixel-composited-layer.html [ Failure ] crbug.com/591099 fast/sub-pixel/sub-pixel-border-2.html [ Failure ] @@ -593,7 +593,7 @@ crbug.com/855039 html/details_summary/details-writing-mode.html [ Failure ] crbug.com/591099 http/tests/devtools/console-resource-errors.js [ Failure Pass ] crbug.com/591099 http/tests/devtools/console/console-correct-suggestions.js [ Failure Pass ] -crbug.com/591099 http/tests/devtools/console/console-search.js [ Timeout ] +crbug.com/591099 http/tests/devtools/console/console-search.js [ Pass Timeout ] crbug.com/591099 http/tests/devtools/persistence/persistence-merge-editor-tabs.js [ Failure ] crbug.com/591099 http/tests/devtools/tracing/timeline-misc/timeline-grouped-invalidations.js [ Failure ] crbug.com/591099 http/tests/devtools/tracing/timeline-paint/timeline-paint-and-multiple-style-invalidations.js [ Failure ] @@ -619,6 +619,7 @@ crbug.com/591099 http/tests/security/setDomainRelaxationForbiddenForURLScheme.html [ Crash ] crbug.com/591099 http/tests/security/xssAuditor/block-does-not-leak-location.html [ Failure ] crbug.com/591099 http/tests/websocket/invalid-subprotocol-characters.html [ Pass Timeout ] +crbug.com/591099 http/tests/xmlhttprequest/xmlhttprequest-sync-no-progress-events.html [ Failure ] crbug.com/591099 idle-callback/test-runner-run-idle-tasks.html [ Pass ] crbug.com/714962 images/color-profile-background-clip-text.html [ Failure ] crbug.com/591099 images/color-profile-image-filter-all.html [ Failure ] @@ -713,7 +714,7 @@ crbug.com/591099 printing/iframe-svg-in-object-print.html [ Failure ] crbug.com/591099 scrollbars/auto-scrollbar-fit-content.html [ Failure ] crbug.com/591099 storage/indexeddb/cursor-continue-validity.html [ Timeout ] -crbug.com/591099 storage/indexeddb/index-cursor.html [ Pass Timeout ] +crbug.com/591099 storage/indexeddb/index-cursor.html [ Timeout ] crbug.com/591099 storage/indexeddb/mozilla/indexes.html [ Timeout ] crbug.com/591099 storage/indexeddb/mozilla/test_objectStore_openKeyCursor.html [ Timeout ] crbug.com/591099 storage/indexeddb/objectstore-cursor.html [ Pass Timeout ] @@ -747,16 +748,18 @@ crbug.com/591099 virtual/feature-policy-vibrate/ [ Skip ] crbug.com/591099 virtual/gpu-rasterization/images/color-profile-image-filter-all.html [ Failure ] crbug.com/591099 virtual/gpu-rasterization/images/feature-policy-max-downscaling-image.html [ Failure ] -crbug.com/591099 virtual/gpu/fast/canvas/canvas-blending-color-over-image.html [ Pass Timeout ] +crbug.com/591099 virtual/gpu/fast/canvas/canvas-blending-color-over-image.html [ Pass ] crbug.com/591099 virtual/layout_ng/ [ Skip ] crbug.com/824918 virtual/layout_ng_experimental/ [ Skip ] -crbug.com/591099 virtual/mojo-blob-urls/external/wpt/FileAPI/url/sandboxed-iframe.html [ Pass ] +crbug.com/591099 virtual/mojo-blob-urls/external/wpt/FileAPI/url/sandboxed-iframe.html [ Pass Timeout ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/background-tab-on-submit-ctrl-click.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/background-tab-on-submit-synthesized-ctrl-click.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/compositor-touch-hit-rects.html [ Failure ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/mainthread-touchpad-fling-latching.html [ Pass ] crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/wheel-scroll-latching-on-scrollbar.html [ Failure Pass ] crbug.com/591099 virtual/new-remote-playback-pipeline/ [ Skip ] +crbug.com/591099 virtual/outofblink-cors-ns/external/wpt/xhr/send-redirect-bogus-sync.htm [ Pass ] +crbug.com/591099 virtual/outofblink-cors-ns/http/tests/xmlhttprequest/xmlhttprequest-sync-no-progress-events.html [ Failure ] crbug.com/591099 virtual/outofblink-cors/ [ Skip ] crbug.com/591099 virtual/paint-timing/external/wpt/paint-timing/sibling-painting-first-image.html [ Failure ] crbug.com/591099 virtual/paint-touchaction-rects/fast/events/touch/compositor-touch-hit-rects-scroll.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService index d717819c..7a0b5c8 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-features=NetworkService
@@ -4,7 +4,7 @@ Bug(none) external/wpt/clear-site-data/storage.https.html [ Failure ] Bug(none) external/wpt/clear-site-data/navigation.https.html [ Timeout ] Bug(none) external/wpt/html/browsers/offline/appcache/workers/appcache-worker.html [ Timeout ] -crbug.com/829417 external/wpt/html/browsers/offline/appcache/workers/appcache-worker.https.html [ Crash Timeout ] +crbug.com/829417 external/wpt/html/browsers/offline/appcache/workers/appcache-worker.https.html [ Timeout ] crbug.com/771118 external/wpt/service-workers/service-worker/mime-sniffing.https.html [ Failure ] Bug(none) http/tests/misc/redirect-to-about-blank.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2 b/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2 index c44a5d46..512ca7cb3 100644 --- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2 +++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-slimming-paint-v2
@@ -1244,7 +1244,7 @@ Bug(none) compositing/overflow-trumps-transform-style.html [ Failure ] crbug.com/796768 fast/css/getComputedStyle/getComputedStyle-zoom-and-background-size.html [ Crash ] -crbug.com/796768 fast/multicol/composited-layer-will-change.html [ Crash ] +crbug.com/796768 fast/multicol/composited-layer-will-change.html [ Failure ] crbug.com/796768 fast/multicol/hit-test-gap-between-pages-flipped.html [ Crash ] crbug.com/796768 fast/multicol/hit-test-gap-between-pages.html [ Crash ] crbug.com/796768 fast/multicol/multicol-becomes-paged-fixed-height.html [ Crash ] @@ -1277,13 +1277,13 @@ crbug.com/796768 fast/pagination/div-y-vertical-rl-ltr.html [ Crash ] crbug.com/796768 fast/pagination/div-y-vertical-rl-rtl.html [ Crash ] crbug.com/796768 fast/pagination/multicol.html [ Crash ] -crbug.com/796768 fast/pagination/repeating-thead-tfoot-paged-x.html [ Crash ] -crbug.com/796768 fast/pagination/repeating-thead-tfoot-paged-y.html [ Crash ] +crbug.com/796768 fast/pagination/repeating-thead-tfoot-paged-x.html [ Failure ] +crbug.com/796768 fast/pagination/repeating-thead-tfoot-paged-y.html [ Failure ] crbug.com/796768 fast/pagination/short-pages-tall-content.html [ Crash ] crbug.com/796768 fast/text-autosizing/constrained-and-overflow-paged-x-ancestor.html [ Crash ] crbug.com/796768 paint/clipath/change-mask-clip-path-multicol-crash.html [ Crash ] -crbug.com/796768 paint/invalidation/overflow/paged-with-overflowing-block-rl.html [ Crash ] -crbug.com/796768 paint/pagination/composited-paginated-outlined-box.html [ Crash ] +crbug.com/796768 paint/invalidation/overflow/paged-with-overflowing-block-rl.html [ Failure ] +crbug.com/796768 paint/pagination/composited-paginated-outlined-box.html [ Failure ] Bug(none) css3/blending/mix-blend-mode-simple.html [ Pass Timeout ] Bug(none) css3/blending/mix-blend-mode-simple-text.html [ Pass Timeout ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 44bd3a1..f0e7fab 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -1213,7 +1213,6 @@ crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/definite-main-size.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/display-flexbox-set-get.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flex-algorithm-min-max.html [ Failure ] -crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flex-algorithm-with-margins.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flex-algorithm.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flex-align-baseline.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flex-align-column.html [ Skip ] @@ -1252,7 +1251,6 @@ crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flexbox-with-multi-column-property.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flexbox-wordwrap.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flexitem-no-margin-collapsing.html [ Failure ] -crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flexitem-percent-height-change.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flexitem-stretch-image.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flexitem-stretch-range.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/css3/flexbox/flexitem.html [ Skip ] @@ -1380,7 +1378,6 @@ crbug.com/467127 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-001.html [ Skip ] crbug.com/467127 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-002.html [ Skip ] crbug.com/467127 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-003.html [ Skip ] -crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-basis-008.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-box-wrap.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-direction-with-element-insert.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-direction.html [ Skip ] @@ -1394,7 +1391,6 @@ crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-flow-010.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-flow-011.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-flow-012.html [ Skip ] -crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-grow-001.xht [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-items-flexibility.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-margin-no-collapse.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-001.xht [ Skip ] @@ -1424,7 +1420,6 @@ crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_absolute-atomic.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-content-center.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-content-flexend.html [ Failure ] -crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-content-flexstart.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-content-spacearound.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-content-spacebetween.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-content-stretch-2.html [ Failure ] @@ -1434,8 +1429,6 @@ crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-items-center.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-items-flexend-2.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-items-flexend.html [ Failure ] -crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-items-flexstart-2.html [ Failure ] -crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-items-flexstart.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-items-stretch.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-self-auto.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-self-baseline.html [ Failure ] @@ -1611,7 +1604,6 @@ crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-align-content-end.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-align-content-space-around.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-align-content-space-between.html [ Failure ] -crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-align-content-start.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-base.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-direction-column-reverse.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-direction-column.html [ Skip ] @@ -1619,7 +1611,6 @@ crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-inline.html [ Skip ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-order.html [ Failure ] crbug.com/467127 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-wrap-reverse.html [ Failure ] -crbug.com/467127 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/ttwf-reftest-flex-wrap.html [ Failure ] ### virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-lines/ crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-reverse-column-reverse.html [ Skip ] @@ -2754,6 +2745,7 @@ crbug.com/849859 external/wpt/web-animations/timing-model/animations/pausing-an-animation.html [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 [ Mac10.12 Mac10.13 ] external/wpt/service-workers/service-worker/clients-matchall-order.https.html [ Timeout ] crbug.com/626703 external/wpt/svg/render/reftests/blending-002.svg [ Failure ] crbug.com/626703 external/wpt/svg/render/reftests/blending-001.svg [ Failure ] crbug.com/626703 [ Win7 ] external/wpt/css/css-lists/content-property/marker-text-matches-armenian.html [ Failure ] @@ -4731,7 +4723,6 @@ crbug.com/856601 [ Linux ] external/wpt/FileAPI/idlharness.worker.html [ Timeout Pass ] crbug.com/856601 [ Linux ] external/wpt/bluetooth/idl/idlharness.tentative.window.html [ Timeout Pass ] crbug.com/856601 [ Linux ] external/wpt/css/cssom-view/interfaces.html [ Timeout Pass ] -crbug.com/856601 [ Linux ] external/wpt/touch-events/idlharness.window.html [ Timeout Pass ] crbug.com/856601 [ Linux ] http/tests/event-timing/event-timing-retrievability.html [ Timeout Pass ] # Sheriff 2018-07-11 @@ -4742,7 +4733,6 @@ crbug.com/862588 [ Linux ] external/wpt/resource-timing/idlharness.any.html [ Timeout Pass ] crbug.com/862588 [ Linux ] external/wpt/resource-timing/idlharness.any.worker.html [ Timeout Pass ] crbug.com/862588 [ Linux ] external/wpt/service-workers/service-worker/interfaces-sw.https.html [ Timeout Pass ] -crbug.com/862588 [ Linux ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/idlharness.https.window.html [ Timeout Pass ] # Other timeouts crbug.com/818324 [ Linux Mac Win7 ] external/wpt/content-security-policy/embedded-enforcement/required_csp-header.html [ Timeout Pass ] @@ -4798,3 +4788,6 @@ crbug.com/867376 [ Linux ] virtual/gpu/fast/canvas/canvas-blending-image-over-color.html [ Timeout Pass ] crbug.com/867376 [ Linux ] virtual/gpu/fast/canvas/canvas-blending-image-over-image.html [ Timeout Pass ] crbug.com/867376 [ Linux ] virtual/gpu-rasterization/images/color-profile-mask-image-svg.html [ Timeout Pass ] + +crbug.com/698165 [ Mac ] external/wpt/editing/run/justifycenter.html [ Timeout Pass ] +crbug.com/698165 [ Mac ] external/wpt/editing/run/multitest.html [ Timeout Pass ]
diff --git a/third_party/WebKit/LayoutTests/css3/flexbox/block-available-size.html b/third_party/WebKit/LayoutTests/css3/flexbox/block-available-size.html new file mode 100644 index 0000000..ebd5e900 --- /dev/null +++ b/third_party/WebKit/LayoutTests/css3/flexbox/block-available-size.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<style> +#flex { + display: flex; + background: red; + width: 100px; + height: 100px; + align-items: start; +} + +#item { + width: 100px; + background: green; + height: -webkit-fill-available; +} +</style> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div id=flex> + <div id=item data-expected-height=100></div> +</div> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../../resources/check-layout-th.js"></script> +<script> +checkLayout("#flex"); +</script>
diff --git a/third_party/WebKit/LayoutTests/editing/selection/5232159.html b/third_party/WebKit/LayoutTests/editing/selection/5232159.html index 7b93004d..e9aba31 100644 --- a/third_party/WebKit/LayoutTests/editing/selection/5232159.html +++ b/third_party/WebKit/LayoutTests/editing/selection/5232159.html
@@ -55,6 +55,8 @@ position: absolute; padding-right: 11px; padding-left: 11px; + font: 10px Ahem; + line-height: 10px; } </style> <title>Test for REGRESSION: Cannot select text in RSS view</title>
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json index 98760b6f..894a2556 100644 --- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json +++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -111038,6 +111038,11 @@ {} ] ], + "css/css-animations/idlharness-expected.txt": [ + [ + {} + ] + ], "css/css-animations/support/testcommon.js": [ [ {} @@ -130338,6 +130343,11 @@ {} ] ], + "css/css-transitions/idlharness-expected.txt": [ + [ + {} + ] + ], "css/css-transitions/properties-value-001-expected.txt": [ [ {} @@ -144153,6 +144163,26 @@ {} ] ], + "fetch/sec-metadata/embed.tentative.https.sub-expected.txt": [ + [ + {} + ] + ], + "fetch/sec-metadata/object.tentative.https.sub-expected.txt": [ + [ + {} + ] + ], + "fetch/sec-metadata/report.tentative.https.sub.html.sub.headers": [ + [ + {} + ] + ], + "fetch/sec-metadata/resources/dedicatedWorker.js": [ + [ + {} + ] + ], "fetch/sec-metadata/resources/echo-as-json.py": [ [ {} @@ -144173,6 +144203,26 @@ {} ] ], + "fetch/sec-metadata/resources/record-header.py": [ + [ + {} + ] + ], + "fetch/sec-metadata/resources/sharedWorker.js": [ + [ + {} + ] + ], + "fetch/sec-metadata/resources/xslt-test.sub.xml": [ + [ + {} + ] + ], + "fetch/sec-metadata/xslt.tentative.https.sub-expected.txt": [ + [ + {} + ] + ], "fetch/security/support/embedded-credential-window.sub.html": [ [ {} @@ -159208,6 +159258,11 @@ {} ] ], + "interfaces/webgl1.idl": [ + [ + {} + ] + ], "interfaces/webrtc-pc.idl": [ [ {} @@ -162378,66 +162433,6 @@ {} ] ], - "referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/script-tag/generic.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/script-tag/generic.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/no-referrer/attr-referrer/same-origin/http-http/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/no-referrer/attr-referrer/same-origin/http-http/script-tag/generic.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/no-referrer/attr-referrer/same-origin/http-http/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/no-referrer/attr-referrer/same-origin/http-https/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/no-referrer/attr-referrer/same-origin/http-https/script-tag/generic.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/no-referrer/attr-referrer/same-origin/http-https/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], "referrer-policy/no-referrer/http-rp/cross-origin/http-http/fetch-request/generic.keep-origin-redirect.http.html.headers": [ [ {} @@ -162738,76 +162733,6 @@ {} ] ], - "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/script-tag/same-origin-insecure.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-downgrade.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-downgrade.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-downgrade.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-insecure.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-upgrade.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-upgrade.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-upgrade.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], "referrer-policy/origin-when-cross-origin/http-rp/cross-origin/http-http/fetch-request/cross-origin.keep-origin-redirect.http.html.headers": [ [ {} @@ -163208,66 +163133,6 @@ {} ] ], - "referrer-policy/origin/attr-referrer/cross-origin/http-http/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin/attr-referrer/cross-origin/http-http/script-tag/generic.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin/attr-referrer/cross-origin/http-http/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin/attr-referrer/cross-origin/http-https/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin/attr-referrer/cross-origin/http-https/script-tag/generic.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin/attr-referrer/cross-origin/http-https/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin/attr-referrer/same-origin/http-http/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin/attr-referrer/same-origin/http-http/script-tag/generic.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin/attr-referrer/same-origin/http-http/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin/attr-referrer/same-origin/http-https/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin/attr-referrer/same-origin/http-https/script-tag/generic.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/origin/attr-referrer/same-origin/http-https/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], "referrer-policy/origin/http-rp/cross-origin/http-http/fetch-request/generic.keep-origin-redirect.http.html.headers": [ [ {} @@ -163568,46 +163433,6 @@ {} ] ], - "referrer-policy/same-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/same-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/same-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/same-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/same-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/same-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/same-origin/attr-referrer/same-origin/http-http/script-tag/same-origin-insecure.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/same-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-insecure.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], "referrer-policy/same-origin/http-rp/cross-origin/http-http/fetch-request/cross-origin.keep-origin-redirect.http.html.headers": [ [ {} @@ -163868,56 +163693,6 @@ {} ] ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-insecure.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-insecure.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-insecure.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/script-tag/same-insecure.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], "referrer-policy/strict-origin-when-cross-origin/http-rp/cross-origin/http-http/fetch-request/cross-insecure.keep-origin-redirect.http.html.headers": [ [ {} @@ -164218,66 +163993,6 @@ {} ] ], - "referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/script-tag/insecure-protocol.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/script-tag/insecure-protocol.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/script-tag/insecure-protocol.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin/attr-referrer/same-origin/http-http/script-tag/insecure-protocol.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin/attr-referrer/same-origin/http-http/script-tag/insecure-protocol.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin/attr-referrer/same-origin/http-http/script-tag/insecure-protocol.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.keep-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.no-redirect.http-expected.txt": [ - [ - {} - ] - ], - "referrer-policy/strict-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.swap-origin-redirect.http-expected.txt": [ - [ - {} - ] - ], "referrer-policy/strict-origin/http-rp/cross-origin/http-http/fetch-request/insecure-protocol.keep-origin-redirect.http.html.headers": [ [ {} @@ -169138,6 +168853,11 @@ {} ] ], + "subresource-integrity/idlharness.window-expected.txt": [ + [ + {} + ] + ], "subresource-integrity/matching-digest.js": [ [ {} @@ -172158,11 +171878,6 @@ {} ] ], - "webusb/idlharness.https.any.sharedworker-expected.txt": [ - [ - {} - ] - ], "webusb/idlharness.https.any.worker-expected.txt": [ [ {} @@ -212936,12 +212651,24 @@ {} ] ], + "fetch/sec-metadata/embed.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/embed.tentative.https.sub.html", + {} + ] + ], "fetch/sec-metadata/fetch.tentative.https.sub.html": [ [ "/fetch/sec-metadata/fetch.tentative.https.sub.html", {} ] ], + "fetch/sec-metadata/font.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/font.tentative.https.sub.html", + {} + ] + ], "fetch/sec-metadata/iframe.tentative.https.sub.html": [ [ "/fetch/sec-metadata/iframe.tentative.https.sub.html", @@ -212954,12 +212681,102 @@ {} ] ], + "fetch/sec-metadata/object.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/object.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/redirect/cross-site/cross-site.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/redirect/cross-site/cross-site.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/redirect/cross-site/same-origin.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/redirect/cross-site/same-origin.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/redirect/cross-site/same-site.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/redirect/cross-site/same-site.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/redirect/same-origin/cross-site.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/redirect/same-origin/cross-site.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/redirect/same-origin/same-origin.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/redirect/same-origin/same-origin.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/redirect/same-origin/same-site.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/redirect/same-origin/same-site.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/redirect/same-site/cross-site.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/redirect/same-site/cross-site.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/redirect/same-site/same-origin.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/redirect/same-site/same-origin.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/redirect/same-site/same-site.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/redirect/same-site/same-site.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/report.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/report.tentative.https.sub.html", + {} + ] + ], "fetch/sec-metadata/script.tentative.https.sub.html": [ [ "/fetch/sec-metadata/script.tentative.https.sub.html", {} ] ], + "fetch/sec-metadata/serviceworker.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/serviceworker.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/sharedworker.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/sharedworker.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/style.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/style.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/track.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/track.tentative.https.sub.html", + {} + ] + ], "fetch/sec-metadata/window-open.tentative.https.sub.html": [ [ "/fetch/sec-metadata/window-open.tentative.https.sub.html", @@ -212968,6 +212785,18 @@ } ] ], + "fetch/sec-metadata/worker.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/worker.tentative.https.sub.html", + {} + ] + ], + "fetch/sec-metadata/xslt.tentative.https.sub.html": [ + [ + "/fetch/sec-metadata/xslt.tentative.https.sub.html", + {} + ] + ], "fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html": [ [ "/fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html", @@ -252684,12 +252513,24 @@ {} ] ], + "trusted-types/TrustedTypePolicyFactory-createPolicy.tentative.html": [ + [ + "/trusted-types/TrustedTypePolicyFactory-createPolicy.tentative.html", + {} + ] + ], "trusted-types/TrustedURL.tentative.html": [ [ "/trusted-types/TrustedURL.tentative.html", {} ] ], + "trusted-types/Window-trustedTypes.tentative.html": [ + [ + "/trusted-types/Window-trustedTypes.tentative.html", + {} + ] + ], "trusted-types/block-string-assignment-to-HTMLAnchorElement-href.tentative.html": [ [ "/trusted-types/block-string-assignment-to-HTMLAnchorElement-href.tentative.html", @@ -258802,10 +258643,6 @@ {} ], [ - "/webusb/idlharness.https.any.sharedworker.html", - {} - ], - [ "/webusb/idlharness.https.any.worker.html", {} ] @@ -258816,10 +258653,6 @@ {} ], [ - "/webusb/insecure-context.any.sharedworker.html", - {} - ], - [ "/webusb/insecure-context.any.worker.html", {} ] @@ -258860,10 +258693,6 @@ {} ], [ - "/webusb/usb.https.any.sharedworker.html", - {} - ], - [ "/webusb/usb.https.any.worker.html", {} ] @@ -258886,10 +258715,6 @@ {} ], [ - "/webusb/usbConnectionEvent.https.any.sharedworker.html", - {} - ], - [ "/webusb/usbConnectionEvent.https.any.worker.html", {} ] @@ -258906,10 +258731,6 @@ {} ], [ - "/webusb/usbDevice.https.any.sharedworker.html", - {} - ], - [ "/webusb/usbDevice.https.any.worker.html", {} ] @@ -258920,10 +258741,6 @@ {} ], [ - "/webusb/usbInTransferResult.https.any.sharedworker.html", - {} - ], - [ "/webusb/usbInTransferResult.https.any.worker.html", {} ] @@ -258934,10 +258751,6 @@ {} ], [ - "/webusb/usbIsochronousInTransferPacket.https.any.sharedworker.html", - {} - ], - [ "/webusb/usbIsochronousInTransferPacket.https.any.worker.html", {} ] @@ -258948,10 +258761,6 @@ {} ], [ - "/webusb/usbIsochronousInTransferResult.https.any.sharedworker.html", - {} - ], - [ "/webusb/usbIsochronousInTransferResult.https.any.worker.html", {} ] @@ -258962,10 +258771,6 @@ {} ], [ - "/webusb/usbIsochronousOutTransferPacket.https.any.sharedworker.html", - {} - ], - [ "/webusb/usbIsochronousOutTransferPacket.https.any.worker.html", {} ] @@ -258976,10 +258781,6 @@ {} ], [ - "/webusb/usbIsochronousOutTransferResult.https.any.sharedworker.html", - {} - ], - [ "/webusb/usbIsochronousOutTransferResult.https.any.worker.html", {} ] @@ -258990,10 +258791,6 @@ {} ], [ - "/webusb/usbOutTransferResult.https.any.sharedworker.html", - {} - ], - [ "/webusb/usbOutTransferResult.https.any.worker.html", {} ] @@ -274642,7 +274439,7 @@ "testharness" ], "WebCryptoAPI/idlharness.https.any.js": [ - "c96f061be232a56e65b5c82bf1ce5fef664e183b", + "fb401fe4b1aff7b76b77b6297bbca1fd3ffbb9ca", "testharness" ], "WebCryptoAPI/idlharness.https.worker-expected.txt": [ @@ -276210,7 +276007,7 @@ "testharness" ], "bluetooth/idl/idlharness.tentative.https.window-expected.txt": [ - "caa3c67003d13049a2eb1533b4e921ad4329659f", + "42a06a50f2a67ca642d7a517dfccc36bf2b1d58d", "support" ], "bluetooth/idl/idlharness.tentative.https.window.js": [ @@ -295821,8 +295618,12 @@ "0115580619b629e47ae0f2635cc84e1e80442a8f", "testharness" ], + "css/css-animations/idlharness-expected.txt": [ + "bf7fa9c957db757b4012ecc730d8299ea0a74169", + "support" + ], "css/css-animations/idlharness.html": [ - "591adfdded4944d996a6405e0f34ddc85855e44f", + "9e516ec9211b17fd4087782326824463acbb1681", "testharness" ], "css/css-animations/pending-style-changes-001.html": [ @@ -331129,8 +330930,12 @@ "971be3c362daabff565737c0d98be96e2356adb8", "testharness" ], + "css/css-transitions/idlharness-expected.txt": [ + "3c3312155a3c60219a6b3d9198591de369b8c233", + "support" + ], "css/css-transitions/idlharness.html": [ - "ff6ec5d0e21891ea44637ad97187957c86add0a4", + "077687d53400445c6030aa46bfa3d0a6c74759cd", "testharness" ], "css/css-transitions/properties-value-001-expected.txt": [ @@ -350622,7 +350427,7 @@ "testharness" ], "dom/interfaces_exclude=Node-expected.txt": [ - "ec7377e3763dbb8c5d4de1c0f6408a89f5d8225c", + "33aefdb095867dbe0976e8919c380c1d874ecea8", "support" ], "dom/lists/DOMTokenList-Iterable.html": [ @@ -355814,23 +355619,23 @@ "testharness" ], "fetch/api/idl.any-expected.txt": [ - "40a3a59bf749ac6d8ab7a32d1af7269f26ec6e3d", + "ea733a970f14e5c51f6572111e5cdf05c9ca3226", "support" ], "fetch/api/idl.any.js": [ - "807763b90c8b6d237371b1ab574b0a2283e28f15", + "f201bec94eeaf5abc083cd3c669def4d917a623a", "testharness" ], "fetch/api/idl.any.sharedworker-expected.txt": [ - "40a3a59bf749ac6d8ab7a32d1af7269f26ec6e3d", + "15989d68b61c64f75e34f2de46a125ec4e61e624", "support" ], "fetch/api/idl.any.worker-expected.txt": [ - "40a3a59bf749ac6d8ab7a32d1af7269f26ec6e3d", + "15989d68b61c64f75e34f2de46a125ec4e61e624", "support" ], "fetch/api/idl.https.any.serviceworker-expected.txt": [ - "fdfe1c65e5fb12972875cd04c4998e3c71341dc0", + "a8a9d583da410199453299fb25c21ea30776ef4b", "support" ], "fetch/api/policies/csp-blocked-worker-expected.txt": [ @@ -356670,15 +356475,15 @@ "testharness" ], "fetch/cors-rfc1918/idlharness.tentative.any.sharedworker-expected.txt": [ - "bfbfe9e9bc434a448ee19abcdb7a58b416e666b1", + "acd8cfd0014ae5d8a2b2a55504e70020a13a4cc4", "support" ], "fetch/cors-rfc1918/idlharness.tentative.any.worker-expected.txt": [ - "bfbfe9e9bc434a448ee19abcdb7a58b416e666b1", + "acd8cfd0014ae5d8a2b2a55504e70020a13a4cc4", "support" ], "fetch/cors-rfc1918/idlharness.tentative.https.any.serviceworker-expected.txt": [ - "bfbfe9e9bc434a448ee19abcdb7a58b416e666b1", + "acd8cfd0014ae5d8a2b2a55504e70020a13a4cc4", "support" ], "fetch/cross-origin-resource-policy/fetch-expected.txt": [ @@ -357025,10 +356830,22 @@ "75d58b35c1e5572d02dd3ad90ac65301e35c4bc7", "support" ], + "fetch/sec-metadata/embed.tentative.https.sub-expected.txt": [ + "9f7ed74ff3f6061633eb089df2ca20a5b8793ec8", + "support" + ], + "fetch/sec-metadata/embed.tentative.https.sub.html": [ + "153b28ee188ce1f427e55fb6325900912155b5e3", + "testharness" + ], "fetch/sec-metadata/fetch.tentative.https.sub.html": [ "80ed267f8a5a8aa6bf7e146af4836b2b56430721", "testharness" ], + "fetch/sec-metadata/font.tentative.https.sub.html": [ + "b3f6a5229fc565748a45d36f6d84fd52f2735c00", + "testharness" + ], "fetch/sec-metadata/iframe.tentative.https.sub.html": [ "0308cd613a3099bf04469fba6273f46db991d49c", "testharness" @@ -357037,6 +356854,62 @@ "1c1506d282ad593322c2938215ee4625a5b6d185", "testharness" ], + "fetch/sec-metadata/object.tentative.https.sub-expected.txt": [ + "6bbcd49057208cfe75845dd0ab0b1deff1d274d3", + "support" + ], + "fetch/sec-metadata/object.tentative.https.sub.html": [ + "2271f142e747ea9225ef6087fee8768df8bfb813", + "testharness" + ], + "fetch/sec-metadata/redirect/cross-site/cross-site.tentative.https.sub.html": [ + "7f0b89ac737dd80ce9e4a274c9283683c3f06b9e", + "testharness" + ], + "fetch/sec-metadata/redirect/cross-site/same-origin.tentative.https.sub.html": [ + "28d40459e83d4fbbd6425d89a37f5ac87fc17f09", + "testharness" + ], + "fetch/sec-metadata/redirect/cross-site/same-site.tentative.https.sub.html": [ + "3219f032235c5e087c64721f244ecb79905d139d", + "testharness" + ], + "fetch/sec-metadata/redirect/same-origin/cross-site.tentative.https.sub.html": [ + "6dd5c0481ebef40c9975882d99e21646b7ca449e", + "testharness" + ], + "fetch/sec-metadata/redirect/same-origin/same-origin.tentative.https.sub.html": [ + "231f71de9d0edc7b7bf621c33f581f3ff2e9ec45", + "testharness" + ], + "fetch/sec-metadata/redirect/same-origin/same-site.tentative.https.sub.html": [ + "95761a9748db370bc422691f43e8968eb8d630e0", + "testharness" + ], + "fetch/sec-metadata/redirect/same-site/cross-site.tentative.https.sub.html": [ + "e85ff7b1b6bb3d9ee39b7e9663349ab478e22912", + "testharness" + ], + "fetch/sec-metadata/redirect/same-site/same-origin.tentative.https.sub.html": [ + "de9c19c07ee7d3b5eeb4ff2478b9ffa3729348cb", + "testharness" + ], + "fetch/sec-metadata/redirect/same-site/same-site.tentative.https.sub.html": [ + "1324ce33a71b3be001f44eda6d08e3e3686a7290", + "testharness" + ], + "fetch/sec-metadata/report.tentative.https.sub.html": [ + "6676631370a3f87cd94f0cfc1dabe9cb7cc3fce7", + "testharness" + ], + "fetch/sec-metadata/report.tentative.https.sub.html.sub.headers": [ + "cef6216d0fd91a909768b5be8351a359a7d5a275", + "support" + ], + "fetch/sec-metadata/resources/dedicatedWorker.js": [ + "df8c5824184a4cc342901f17ea14957d82ae6ac1", + "support" + ], "fetch/sec-metadata/resources/echo-as-json.py": [ "bbe86e17580229158500722115a1347ca8fa2abb", "support" @@ -357046,21 +356919,61 @@ "support" ], "fetch/sec-metadata/resources/helper.js": [ - "ee91fc4ff739485eed66c7ebc8fb19311f205536", + "b59edfb9b8209b958ba056ee27e53c1d190a855c", "support" ], "fetch/sec-metadata/resources/post-to-owner.py": [ "2f57a1ddf411864ad2b1ba75f95453d9ed54e3f6", "support" ], + "fetch/sec-metadata/resources/record-header.py": [ + "cb2da0d79131d7dfed130c2b2645f2130cd0bd97", + "support" + ], + "fetch/sec-metadata/resources/sharedWorker.js": [ + "1b02d025d06cf5c490b87caadbe4963910998da4", + "support" + ], + "fetch/sec-metadata/resources/xslt-test.sub.xml": [ + "27486519c57733a01688c82d1ba05a7bad207433", + "support" + ], "fetch/sec-metadata/script.tentative.https.sub.html": [ "7db1a28d1466d72be59cae56adf64c3428ff5df6", "testharness" ], + "fetch/sec-metadata/serviceworker.tentative.https.sub.html": [ + "e1e9d8a8d0fbf348016e893e56b7dba1b71a7a78", + "testharness" + ], + "fetch/sec-metadata/sharedworker.tentative.https.sub.html": [ + "15e1a100ee2fafff873d9466478cce011ea08252", + "testharness" + ], + "fetch/sec-metadata/style.tentative.https.sub.html": [ + "ebfd4c3b22bb2e05cc6bdffa5e14e099770f6e04", + "testharness" + ], + "fetch/sec-metadata/track.tentative.https.sub.html": [ + "181c26f2022eb1b6980df5b889430e60c597c0e9", + "testharness" + ], "fetch/sec-metadata/window-open.tentative.https.sub.html": [ "116c597fb1909f7c4a67c8ada3bfeb6c011d7b04", "testharness" ], + "fetch/sec-metadata/worker.tentative.https.sub.html": [ + "0cfed964613247cc2d2be51f6506e9beabaf86ca", + "testharness" + ], + "fetch/sec-metadata/xslt.tentative.https.sub-expected.txt": [ + "da90c70ef82805e90616b41b7525ea0261319200", + "support" + ], + "fetch/sec-metadata/xslt.tentative.https.sub.html": [ + "9d428f64c6caf076b82687f2e8763ccbc2279f29", + "testharness" + ], "fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html": [ "1059b1c0907444bd416889f99d766a566ba9bde3", "testharness" @@ -357730,7 +357643,7 @@ "support" ], "gamepad/idlharness.window-expected.txt": [ - "60497677badfd7edb9f7caa49f5a713b2cacd433", + "b44b7b51030fabfdb60db750801abfd959c5f80d", "support" ], "gamepad/idlharness.window.js": [ @@ -358794,11 +358707,11 @@ "testharness" ], "html/browsers/browsing-the-web/scroll-to-fragid/fragment-and-encoding-expected.txt": [ - "89a0f7aa77b1367fa5d3b3c763af9d74b8f01985", + "e0f6f60d35da5716df1310fbf235ea906d320df6", "support" ], "html/browsers/browsing-the-web/scroll-to-fragid/fragment-and-encoding.html": [ - "9ba63dfc8f2a9310830b6b5073d994a821369c01", + "fa45d12e91641991bf875ae075d5516865ca6c03", "testharness" ], "html/browsers/browsing-the-web/scroll-to-fragid/navigate-helpers.js": [ @@ -366994,11 +366907,11 @@ "support" ], "html/rendering/bindings/the-input-element-as-a-text-entry-widget/unrecognized-type-should-fallback-as-text-type-ref.html": [ - "a5fa95e71b00d1ad88fdff3fc9e93b6588742eee", + "25d9be5769a2863cc15ec33bafb81a2a9f422f8d", "support" ], "html/rendering/bindings/the-input-element-as-a-text-entry-widget/unrecognized-type-should-fallback-as-text-type.html": [ - "6186a83ccdba01d4c5430f4afce7ae397427f0c5", + "148e2f0d8a7ea2b9a3f4dca7e08f5052e362f903", "reftest" ], "html/rendering/bindings/the-input-element-as-domain-specific-widgets/.gitkeep": [ @@ -379017,6 +378930,10 @@ "b5ff8a9db576c8afbe3746cd41370965c06219ee", "support" ], + "interfaces/webgl1.idl": [ + "e874ac0e00d7e9b78b55f9f2e1704ca263857f98", + "support" + ], "interfaces/webrtc-pc.idl": [ "a631e2e0ea0f451c64b5d5f74fe7cbeafc231b8e", "support" @@ -380142,7 +380059,7 @@ "support" ], "mediacapture-fromelement/idlharness.window-expected.txt": [ - "fd1364774d364c55ec99652222c38e81fdcc62a1", + "0760642347c357ab5819975e64cf3cc0d5dfbefc", "support" ], "mediacapture-fromelement/idlharness.window.js": [ @@ -380182,11 +380099,11 @@ "support" ], "mediacapture-record/idlharness.window-expected.txt": [ - "9389fbbc2796b9ce1bb86157818a0cfa1d2dc1a9", + "b1ed396231030933a74f9646714690508875772c", "support" ], "mediacapture-record/idlharness.window.js": [ - "c8b90361e8e09385de6e56c0c1a49105a48b7dbf", + "9555d9c716bd5185e687e516930256f4a37b431f", "testharness" ], "mediacapture-streams/GUM-api.https.html": [ @@ -380362,7 +380279,7 @@ "testharness" ], "mediacapture-streams/idlharness.https.window-expected.txt": [ - "d6e7232d583ad4a953f8b7421f11d8b35f0cb880", + "db8f96fa2d17a2e1394fd7ba8025db175dbacbe7", "support" ], "mediacapture-streams/idlharness.https.window.js": [ @@ -389666,7 +389583,7 @@ "testharness" ], "picture-in-picture/idlharness.window-expected.txt": [ - "a9cf0a080146f82378696b5732b1d56da3b10368", + "62a0f9ba147e2539e2864b55545bcd86ee5ad293", "support" ], "picture-in-picture/idlharness.window.js": [ @@ -389766,7 +389683,7 @@ "support" ], "pointerevents/idlharness.window-expected.txt": [ - "075be5958698b22a3a3ea958e52b6d9262ab2fcf", + "a93ffcf84ec208f61d3554bbf4f631b263cc4c02", "support" ], "pointerevents/idlharness.window.js": [ @@ -390582,7 +390499,7 @@ "support" ], "push-api/idlharness.https.any.js": [ - "5a8cb140eb42702490dea9c71deaf08cd291c7c4", + "5a5c1a88cd9314af18333123e3c6567b6969dbf2", "testharness" ], "quirks/META.yml": [ @@ -391765,26 +391682,14 @@ "8dc6b62fd7f1cb9185979d7be035de80d543a598", "testharness" ], - "referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - "81592b92d3150607c1ccbdd0206057a34bd1f14c", - "support" - ], "referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/script-tag/generic.keep-origin-redirect.http.html": [ "b537d5d2c53b8660975622addcf033f70970111b", "testharness" ], - "referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/script-tag/generic.no-redirect.http-expected.txt": [ - "30d661da99cbb92ccf060dd38d22f0dcba173dc8", - "support" - ], "referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/script-tag/generic.no-redirect.http.html": [ "d26f82d3fd9e8ca00332636c18f00e7cda06096e", "testharness" ], - "referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - "af5074fa305bc177752fbba425aed3a49a14e17e", - "support" - ], "referrer-policy/no-referrer/attr-referrer/cross-origin/http-http/script-tag/generic.swap-origin-redirect.http.html": [ "3d394ebef91c974bd2eed15fe0682229282312c9", "testharness" @@ -391813,26 +391718,14 @@ "718f92ffc44407a5baad224c6ac126cf1588eb82", "testharness" ], - "referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - "4b0bc9662c0aa6f5d08c30ccd84169dd0c590901", - "support" - ], "referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/script-tag/generic.keep-origin-redirect.http.html": [ "fc9c1ae199ac838aae1300e50a6a9a9d86f0fe1e", "testharness" ], - "referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/script-tag/generic.no-redirect.http-expected.txt": [ - "8ef1c9012f34a64943fb49bbac8fb4240819de60", - "support" - ], "referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/script-tag/generic.no-redirect.http.html": [ "a327bd53a56adb7e298f7fb3712d4e17ae90292b", "testharness" ], - "referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - "c04d8d81b2f310f3e76bc28bd50fde86b49eb007", - "support" - ], "referrer-policy/no-referrer/attr-referrer/cross-origin/http-https/script-tag/generic.swap-origin-redirect.http.html": [ "87757d9a6957f3053c10e27e37cac4d34bbb39cd", "testharness" @@ -391861,26 +391754,14 @@ "483ca114ad9770a1393cf5e9a41768d1a9d13151", "testharness" ], - "referrer-policy/no-referrer/attr-referrer/same-origin/http-http/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - "fb4f1644c93b93038139097d161894a34776bf56", - "support" - ], "referrer-policy/no-referrer/attr-referrer/same-origin/http-http/script-tag/generic.keep-origin-redirect.http.html": [ "83c60178a18630ec023347aaa6d73ed315778e71", "testharness" ], - "referrer-policy/no-referrer/attr-referrer/same-origin/http-http/script-tag/generic.no-redirect.http-expected.txt": [ - "e0babe8f303c6b02fb5789095b8f2851a77ddb53", - "support" - ], "referrer-policy/no-referrer/attr-referrer/same-origin/http-http/script-tag/generic.no-redirect.http.html": [ "2e545cc7fe82ffa7543ccec8f15b5d64d6ef38b1", "testharness" ], - "referrer-policy/no-referrer/attr-referrer/same-origin/http-http/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - "35bcba56fb2e017efacb515d5dd6a2e1ba8379d2", - "support" - ], "referrer-policy/no-referrer/attr-referrer/same-origin/http-http/script-tag/generic.swap-origin-redirect.http.html": [ "cbf5971dadd7b0f436fcdb85ac0e87355b40b6c8", "testharness" @@ -391909,26 +391790,14 @@ "7c94113c5d73e3dc3fdd8bc5dee16142e0d78f78", "testharness" ], - "referrer-policy/no-referrer/attr-referrer/same-origin/http-https/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - "a6200fe2ded72747f50c30511aef6d2fc28ebce9", - "support" - ], "referrer-policy/no-referrer/attr-referrer/same-origin/http-https/script-tag/generic.keep-origin-redirect.http.html": [ "fb0c597d3a886879f81aaf64a2c17a5b901b64c6", "testharness" ], - "referrer-policy/no-referrer/attr-referrer/same-origin/http-https/script-tag/generic.no-redirect.http-expected.txt": [ - "41f361b906e15da97d133d563ccfbdf758f9079a", - "support" - ], "referrer-policy/no-referrer/attr-referrer/same-origin/http-https/script-tag/generic.no-redirect.http.html": [ "35916403a0839b3c2f8aa72fcb6300739807f694", "testharness" ], - "referrer-policy/no-referrer/attr-referrer/same-origin/http-https/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - "a486c501cae17b47c373065794795baf66320341", - "support" - ], "referrer-policy/no-referrer/attr-referrer/same-origin/http-https/script-tag/generic.swap-origin-redirect.http.html": [ "db80602e38efd61237a29aa79cad31eba1f0455f", "testharness" @@ -392677,26 +392546,14 @@ "846b3347d9973dbf46eeae1383be3aaa1d19183d", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.keep-origin-redirect.http-expected.txt": [ - "acf544fd75bde077943112bb2476834337e4032c", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.keep-origin-redirect.http.html": [ "952700e12aceab33a2af06f23ed1842dff408e09", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.no-redirect.http-expected.txt": [ - "5961846a353e383f9961b8fde80f73909d6184f5", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.no-redirect.http.html": [ "2b3c2c8a10686acabeec43738dad39fc6c2ac5e2", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.swap-origin-redirect.http-expected.txt": [ - "0f4e83683e8a6c54e4e518536c2a2bde94ce83e9", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.swap-origin-redirect.http.html": [ "c1b4c20e5578ea9a35baca4eae109f5b46215cde", "testharness" @@ -392725,26 +392582,14 @@ "f6e240ecaa2c20359ee1093cba343ff83d75d791", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.keep-origin-redirect.http-expected.txt": [ - "28849a6cba21cb6bd4d635554cd4a297ec117920", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.keep-origin-redirect.http.html": [ "8099689002ac57fdd79ef1c18f537aabcc6848bc", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.no-redirect.http-expected.txt": [ - "fc56d0c0b89b3dcb3a415b9a71edb7dac30ff1f4", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.no-redirect.http.html": [ "08c73d3d1f7b6cfd262c1ce74f81b8f8bc89e5ac", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.swap-origin-redirect.http-expected.txt": [ - "bc643a255e230f84bc555e12de6d957b8c76e30f", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.swap-origin-redirect.http.html": [ "c60f9a781a4b5f0b9a90ae6b36cada3b1fbb5a1e", "testharness" @@ -392781,10 +392626,6 @@ "c356f80a1b5061d35dbeae0de0710bd5ec39d343", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/script-tag/same-origin-insecure.swap-origin-redirect.http-expected.txt": [ - "74c2f1b66f40117a02c3c0618010e666e54c0492", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-http/script-tag/same-origin-insecure.swap-origin-redirect.http.html": [ "de794f6dd4bd6f271143e53631b08665d795d4c8", "testharness" @@ -392845,58 +392686,30 @@ "ae2d7528298d91bbde7e731ab043ef4b07e0cffc", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-downgrade.keep-origin-redirect.http-expected.txt": [ - "6144a25583fd586bff328c1af3abb2304da68c21", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-downgrade.keep-origin-redirect.http.html": [ "13af32e9edfe28bb38a2e80c45a9847316f716ff", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-downgrade.no-redirect.http-expected.txt": [ - "b98e0a6582f9eb99d5bbc89a7b42904392807afe", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-downgrade.no-redirect.http.html": [ "9f0f0b68f9f329cafff9b4b036cf1a184575f4e6", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-downgrade.swap-origin-redirect.http-expected.txt": [ - "27d82d6fe02c3d3cf62d02d13aceb96afff5f2e1", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-downgrade.swap-origin-redirect.http.html": [ "d925484a3e4e7d22cd84a337e1438a44a33eb5c5", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-insecure.swap-origin-redirect.http-expected.txt": [ - "ed5f355fcf544842b176dfbe51d5c98e4ac7dc1a", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-insecure.swap-origin-redirect.http.html": [ "d925484a3e4e7d22cd84a337e1438a44a33eb5c5", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-upgrade.keep-origin-redirect.http-expected.txt": [ - "a9604259efb01720a91d5846c57a7a7287cb2e3f", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-upgrade.keep-origin-redirect.http.html": [ "13af32e9edfe28bb38a2e80c45a9847316f716ff", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-upgrade.no-redirect.http-expected.txt": [ - "bb14ff79dae609440c37a63433f8d6e8b3379cd0", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-upgrade.no-redirect.http.html": [ "9f0f0b68f9f329cafff9b4b036cf1a184575f4e6", "testharness" ], - "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-upgrade.swap-origin-redirect.http-expected.txt": [ - "436b10671c04b5cdbee13e99badf2b667995ac5f", - "support" - ], "referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-upgrade.swap-origin-redirect.http.html": [ "d925484a3e4e7d22cd84a337e1438a44a33eb5c5", "testharness" @@ -393885,26 +393698,14 @@ "7aa70f80081af9e2044c0e91a8d8f071ad1aaefd", "testharness" ], - "referrer-policy/origin/attr-referrer/cross-origin/http-http/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - "f5a8f291bac5175bd831ab58d97c90f995616de2", - "support" - ], "referrer-policy/origin/attr-referrer/cross-origin/http-http/script-tag/generic.keep-origin-redirect.http.html": [ "e998d4c037be765b5199e2ba5fe0370a0c18f93e", "testharness" ], - "referrer-policy/origin/attr-referrer/cross-origin/http-http/script-tag/generic.no-redirect.http-expected.txt": [ - "2f9b6cad59e3053d8e33c6aaa10a60c273e4cd12", - "support" - ], "referrer-policy/origin/attr-referrer/cross-origin/http-http/script-tag/generic.no-redirect.http.html": [ "22f3c4314db0ffbf94ead2afbf9caf0eb9c2eb88", "testharness" ], - "referrer-policy/origin/attr-referrer/cross-origin/http-http/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - "9d0137774f2c41021614e3c538da3f61e84d5f34", - "support" - ], "referrer-policy/origin/attr-referrer/cross-origin/http-http/script-tag/generic.swap-origin-redirect.http.html": [ "a17dddd188668f712ca2673a07bee1e3d818148e", "testharness" @@ -393933,26 +393734,14 @@ "0bd358340cfdb2fa864146e7615663130392ee34", "testharness" ], - "referrer-policy/origin/attr-referrer/cross-origin/http-https/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - "a3aaa5a9e29bd01ce01b55dec6965c3c1bb5c05d", - "support" - ], "referrer-policy/origin/attr-referrer/cross-origin/http-https/script-tag/generic.keep-origin-redirect.http.html": [ "d237c93bfa893788850abdacb266e56fe7b6077f", "testharness" ], - "referrer-policy/origin/attr-referrer/cross-origin/http-https/script-tag/generic.no-redirect.http-expected.txt": [ - "14023f4b37ac413095db1e52333d418286fcc9aa", - "support" - ], "referrer-policy/origin/attr-referrer/cross-origin/http-https/script-tag/generic.no-redirect.http.html": [ "326eb0ebb68a7f91a1edcc4d386b98456c92e0ac", "testharness" ], - "referrer-policy/origin/attr-referrer/cross-origin/http-https/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - "727575055111ee236df72deda4c144a1cad52a6a", - "support" - ], "referrer-policy/origin/attr-referrer/cross-origin/http-https/script-tag/generic.swap-origin-redirect.http.html": [ "92c2cc2ef2a79e7943dd859c53fcc82243f9bc56", "testharness" @@ -393981,26 +393770,14 @@ "cb8d9d6bd08e87ce579237b73ccb2bbf7c439f5d", "testharness" ], - "referrer-policy/origin/attr-referrer/same-origin/http-http/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - "3051e3310ba8a67fc5fb691d201ba1918cefc652", - "support" - ], "referrer-policy/origin/attr-referrer/same-origin/http-http/script-tag/generic.keep-origin-redirect.http.html": [ "cef6d9c56cb6e5c3774f64fbcac9a98f04d67aef", "testharness" ], - "referrer-policy/origin/attr-referrer/same-origin/http-http/script-tag/generic.no-redirect.http-expected.txt": [ - "cf0406ca9128a36542f07e4dd25fae5f57f785ed", - "support" - ], "referrer-policy/origin/attr-referrer/same-origin/http-http/script-tag/generic.no-redirect.http.html": [ "578112023804c8b1e1efa8b99db7edb32ae404aa", "testharness" ], - "referrer-policy/origin/attr-referrer/same-origin/http-http/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - "c73d6d76d87f27cc100b7ec6513bc1616ff16b1b", - "support" - ], "referrer-policy/origin/attr-referrer/same-origin/http-http/script-tag/generic.swap-origin-redirect.http.html": [ "72f855af834e77be887eeaca6de4f0bdefd2112c", "testharness" @@ -394029,26 +393806,14 @@ "30140e4be783b8c6cf1983ba812fcb4d41db8929", "testharness" ], - "referrer-policy/origin/attr-referrer/same-origin/http-https/script-tag/generic.keep-origin-redirect.http-expected.txt": [ - "19f1f667917ac321fd91d16cb43733cbe03c7c0c", - "support" - ], "referrer-policy/origin/attr-referrer/same-origin/http-https/script-tag/generic.keep-origin-redirect.http.html": [ "e596b588cea44e0d45da81108b212ddf56418cd4", "testharness" ], - "referrer-policy/origin/attr-referrer/same-origin/http-https/script-tag/generic.no-redirect.http-expected.txt": [ - "8f99dc7fad5633b345ddd1bbdb2d4e9de1a08ad3", - "support" - ], "referrer-policy/origin/attr-referrer/same-origin/http-https/script-tag/generic.no-redirect.http.html": [ "4f1812804fb75d32ef6f4ccee618e994ae28f9da", "testharness" ], - "referrer-policy/origin/attr-referrer/same-origin/http-https/script-tag/generic.swap-origin-redirect.http-expected.txt": [ - "19a07bdbd62c3ea07a9f74308512e85cb4626f35", - "support" - ], "referrer-policy/origin/attr-referrer/same-origin/http-https/script-tag/generic.swap-origin-redirect.http.html": [ "9f8b474c4f26c176002a8f2b4805d868b176a787", "testharness" @@ -394797,26 +394562,14 @@ "cb53c4771987c07f22f0598c178566d23f9f5048", "testharness" ], - "referrer-policy/same-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.keep-origin-redirect.http-expected.txt": [ - "208717a9ba99e0a99c15b9f1b1937fc49c1ea3c7", - "support" - ], "referrer-policy/same-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.keep-origin-redirect.http.html": [ "a3d250357fba87fe9236bf7a4046ae75954c54ca", "testharness" ], - "referrer-policy/same-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.no-redirect.http-expected.txt": [ - "431fa439800d5258f9959c3b06df1be5fecc571f", - "support" - ], "referrer-policy/same-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.no-redirect.http.html": [ "6bf350caf61d5a41f6bbd3adeb98c07ce1b84c32", "testharness" ], - "referrer-policy/same-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.swap-origin-redirect.http-expected.txt": [ - "4d440781d7e900fc0dfe140b9c56ed23f1bab72e", - "support" - ], "referrer-policy/same-origin/attr-referrer/cross-origin/http-http/script-tag/cross-origin.swap-origin-redirect.http.html": [ "f03ebbbe4dbcc9f4bbfddced63b08141c8a59dd0", "testharness" @@ -394845,26 +394598,14 @@ "bb2c41c615084063bbc911b2f129b054ba894e5d", "testharness" ], - "referrer-policy/same-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.keep-origin-redirect.http-expected.txt": [ - "c310e564fb1ba0cb2ff75562ecb827371c77aaeb", - "support" - ], "referrer-policy/same-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.keep-origin-redirect.http.html": [ "e1a8ea451211c6e3e02304011ed7afc235f4ccd9", "testharness" ], - "referrer-policy/same-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.no-redirect.http-expected.txt": [ - "2640280017199a1c488d6fe38de44519e50307b3", - "support" - ], "referrer-policy/same-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.no-redirect.http.html": [ "6756257ac973900438e2f30e3fe9448ebdd86a19", "testharness" ], - "referrer-policy/same-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.swap-origin-redirect.http-expected.txt": [ - "40c394ec08e94b444ba39dccc05cd831e6f263c9", - "support" - ], "referrer-policy/same-origin/attr-referrer/cross-origin/http-https/script-tag/cross-origin.swap-origin-redirect.http.html": [ "04ab965d5d752668ecc467a2baa8a7af8b59952b", "testharness" @@ -394901,10 +394642,6 @@ "15cef443f9124e4dbe9a3cef601a43f55ae86efb", "testharness" ], - "referrer-policy/same-origin/attr-referrer/same-origin/http-http/script-tag/same-origin-insecure.swap-origin-redirect.http-expected.txt": [ - "0be69fba956b86d334be8e0105232740e7362d6b", - "support" - ], "referrer-policy/same-origin/attr-referrer/same-origin/http-http/script-tag/same-origin-insecure.swap-origin-redirect.http.html": [ "e25ccfea21d727bbd95fa034fb32b76402dcc2c5", "testharness" @@ -394917,10 +394654,6 @@ "40a82c22b14f58676f1d808ae7036932f955728b", "testharness" ], - "referrer-policy/same-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-insecure.swap-origin-redirect.http-expected.txt": [ - "80a3bd7d0eaf7735b8f1a0080abdbeb245daff79", - "support" - ], "referrer-policy/same-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-insecure.swap-origin-redirect.http.html": [ "4e701b6d0b80378e9ed2b4682574a9821fc97576", "testharness" @@ -395557,26 +395290,14 @@ "6a7100c237cdc1c1b5af77e89f4c0e39ce04e79c", "testharness" ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-insecure.keep-origin-redirect.http-expected.txt": [ - "1dc2deb8d4554949462f682db3b3c80ce691005e", - "support" - ], "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-insecure.keep-origin-redirect.http.html": [ "d27ef0c3a182f460c75b06dd5df47cb6c711b502", "testharness" ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-insecure.no-redirect.http-expected.txt": [ - "72c2a7198b35a578a168bb49fc8d011613804f20", - "support" - ], "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-insecure.no-redirect.http.html": [ "8fc539a23b9ad18d9ffd9e4f1f99e691b183a440", "testharness" ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-insecure.swap-origin-redirect.http-expected.txt": [ - "cbcfd25b2197a22ce45830ec0e5719bbba22cad7", - "support" - ], "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-http/script-tag/cross-insecure.swap-origin-redirect.http.html": [ "3594647e20b90b7a2d5c91a5643cf572746eb8e7", "testharness" @@ -395605,26 +395326,14 @@ "2f30bdfdfaee06724331f3457abb6896bfd3ed91", "testharness" ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.keep-origin-redirect.http-expected.txt": [ - "98e58149242a64f45103183b8d17590a3bd678f1", - "support" - ], "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.keep-origin-redirect.http.html": [ "fe48edc91843dbb616262c76b91e31c507cec4aa", "testharness" ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.no-redirect.http-expected.txt": [ - "1904bed5dcf6be8eb6cc72dcc0ce885862bb6666", - "support" - ], "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.no-redirect.http.html": [ "c01400f2f3531f5e8306680b048d6ec4e12faedc", "testharness" ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.swap-origin-redirect.http-expected.txt": [ - "fa601c7934a1481b8b17d8c41608f3cee5c452cf", - "support" - ], "referrer-policy/strict-origin-when-cross-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.swap-origin-redirect.http.html": [ "ddb846a66f65a7eb921f646672dd7d93cfcc72f3", "testharness" @@ -395661,10 +395370,6 @@ "183e1a50e41a85b52323cb2eede9d01555429962", "testharness" ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/script-tag/same-insecure.swap-origin-redirect.http-expected.txt": [ - "c570e3a99fa05d6f3118cd96ed3ba6b68cdbb7aa", - "support" - ], "referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-http/script-tag/same-insecure.swap-origin-redirect.http.html": [ "e49c2e84263c0020283f29b176899ae3201d87c0", "testharness" @@ -395693,26 +395398,14 @@ "2eab682f949294399b34ab3f9c2c0a790688c9af", "testharness" ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.keep-origin-redirect.http-expected.txt": [ - "69e6d9fee5472d35134d5db447f7dbb2640cb109", - "support" - ], "referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.keep-origin-redirect.http.html": [ "3fad13d7ae819338cb6d33b3e3a3ba603f3724f7", "testharness" ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.no-redirect.http-expected.txt": [ - "4fd48989ec43bb6496a548e2f72ea515008e12f7", - "support" - ], "referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.no-redirect.http.html": [ "7465b3b657f755489446212c8abc1e3bc422476a", "testharness" ], - "referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.swap-origin-redirect.http-expected.txt": [ - "796228363562f543f1189217e42f7aec49316f5a", - "support" - ], "referrer-policy/strict-origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.swap-origin-redirect.http.html": [ "54badda0b00a60e69dafb45fe194f0f723c5255b", "testharness" @@ -396461,26 +396154,14 @@ "56f0bd5a42f2245c71645b4f9d906560d8ad5415", "testharness" ], - "referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/script-tag/insecure-protocol.keep-origin-redirect.http-expected.txt": [ - "e7ebd2fe8d4c87b6f10b4c3cfd2548f4371ceabe", - "support" - ], "referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/script-tag/insecure-protocol.keep-origin-redirect.http.html": [ "3ad0195910c10a0a8f3dc043bd8007d384c4b2ed", "testharness" ], - "referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/script-tag/insecure-protocol.no-redirect.http-expected.txt": [ - "12ca171efba77b858d1f3b2f4b3f8f1083302073", - "support" - ], "referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/script-tag/insecure-protocol.no-redirect.http.html": [ "7a9975522ae371b91f044b65e87983f0ad9f9bf2", "testharness" ], - "referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/script-tag/insecure-protocol.swap-origin-redirect.http-expected.txt": [ - "296146fe62b20bcc3f460ca0bc4f3e244b045942", - "support" - ], "referrer-policy/strict-origin/attr-referrer/cross-origin/http-http/script-tag/insecure-protocol.swap-origin-redirect.http.html": [ "d352e744bde02dd1968dce92eb99cc754011874c", "testharness" @@ -396509,26 +396190,14 @@ "266d0889e762ea3ac1a8d2ac3c362a36bb247513", "testharness" ], - "referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.keep-origin-redirect.http-expected.txt": [ - "183e8dd714a46650bc7813800f9184fcfe4089c2", - "support" - ], "referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.keep-origin-redirect.http.html": [ "125c38d42a7eae0a028019449e483cb445569bcf", "testharness" ], - "referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.no-redirect.http-expected.txt": [ - "b55a8b60366f0cd1635f24b098222599e99d230f", - "support" - ], "referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.no-redirect.http.html": [ "a39f3f694aebe3319849c9a903787995d1c1ea05", "testharness" ], - "referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.swap-origin-redirect.http-expected.txt": [ - "0b95cc6b09fe85c58e7ff6796e38ea0330dc137d", - "support" - ], "referrer-policy/strict-origin/attr-referrer/cross-origin/http-https/script-tag/upgrade-protocol.swap-origin-redirect.http.html": [ "3b3234a13acc65e98156980fb33145ee4c65e64a", "testharness" @@ -396557,26 +396226,14 @@ "5a9b51f2e56113d874cdd3fd2491f927e97659b0", "testharness" ], - "referrer-policy/strict-origin/attr-referrer/same-origin/http-http/script-tag/insecure-protocol.keep-origin-redirect.http-expected.txt": [ - "11e50ec04501c1c6076c8e70e337d61f13cff88c", - "support" - ], "referrer-policy/strict-origin/attr-referrer/same-origin/http-http/script-tag/insecure-protocol.keep-origin-redirect.http.html": [ "e3ee456285d29db1b377804d5969bb8c1913c83c", "testharness" ], - "referrer-policy/strict-origin/attr-referrer/same-origin/http-http/script-tag/insecure-protocol.no-redirect.http-expected.txt": [ - "2cdcd76b0fa9eda467b8e68dd30ffde8b36e1e07", - "support" - ], "referrer-policy/strict-origin/attr-referrer/same-origin/http-http/script-tag/insecure-protocol.no-redirect.http.html": [ "c76033ec9b114b490856063f7817bd7b6cdc929a", "testharness" ], - "referrer-policy/strict-origin/attr-referrer/same-origin/http-http/script-tag/insecure-protocol.swap-origin-redirect.http-expected.txt": [ - "a963e71b54f5948f1fb91286912013f51905f600", - "support" - ], "referrer-policy/strict-origin/attr-referrer/same-origin/http-http/script-tag/insecure-protocol.swap-origin-redirect.http.html": [ "056248a7f63b40454db3bca9e6c991d93583496c", "testharness" @@ -396605,26 +396262,14 @@ "c5f215d55e861b4bd6737bdd87b7f025faea214a", "testharness" ], - "referrer-policy/strict-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.keep-origin-redirect.http-expected.txt": [ - "0902231977e8e9cb6fbfbc1066df44458e8fa508", - "support" - ], "referrer-policy/strict-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.keep-origin-redirect.http.html": [ "d7e6b4fd04897ffc7e3691a3495a701060b8dfee", "testharness" ], - "referrer-policy/strict-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.no-redirect.http-expected.txt": [ - "f25b4f000ca988f49e4886a1b55b8c57685b8b0d", - "support" - ], "referrer-policy/strict-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.no-redirect.http.html": [ "d98d198dbaa1e0ea22d9324018515068d95ca0f1", "testharness" ], - "referrer-policy/strict-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.swap-origin-redirect.http-expected.txt": [ - "df842a5ea589f57da16e006e2acecb0e5f551772", - "support" - ], "referrer-policy/strict-origin/attr-referrer/same-origin/http-https/script-tag/upgrade-protocol.swap-origin-redirect.http.html": [ "ed3f16095cb4ee8104b4d166aac5c10740d77a51", "testharness" @@ -399358,7 +399003,7 @@ "support" ], "scroll-animations/idlharness-expected.txt": [ - "849492170e58082789fc91b5c05088013ef023fe", + "1bcc67c6bdaf519b9bb2b8d70ab632d2d856025d", "support" ], "scroll-animations/idlharness.html": [ @@ -399414,7 +399059,7 @@ "testharness" ], "secure-contexts/idlharness.any-expected.txt": [ - "90ab254b25f5a7bd8afaa3355cb3f140f0c38619", + "aa9f95dfee4acab2218abd6dee63cf09df9a4aff", "support" ], "secure-contexts/idlharness.any.js": [ @@ -399622,11 +399267,11 @@ "testharness" ], "selection/idlharness.window-expected.txt": [ - "1bdfe84569e3607508422c62bc7b03ecfc2df38a", + "5d7512f3bfaf29937f49484f3010a1f558c73f83", "support" ], "selection/idlharness.window.js": [ - "2a89076946fd12a1629ef962c2e459accba952df", + "5daa4e9321ca8fc89130a423d2f212172bfd8214", "testharness" ], "selection/interfaces-expected.txt": [ @@ -405273,6 +404918,10 @@ "40773896fa85b0ac6545d3064f7e594e4e9b4339", "support" ], + "subresource-integrity/idlharness.window-expected.txt": [ + "851a3e3f16caaecf01070823edb81c315b99ba05", + "support" + ], "subresource-integrity/idlharness.window.js": [ "b03019b665efa5262ec9b621427cf89417babbe4", "testharness" @@ -406038,7 +405687,7 @@ "testharness" ], "touch-events/idlharness.window-expected.txt": [ - "2935239d46556213a272d757c07b8b3b9866fec5", + "b7af42e64b5c7b606334d571913fb9b6af74f3ff", "support" ], "touch-events/idlharness.window.js": [ @@ -406125,10 +405774,18 @@ "2f8d956c0179adc05fd92250fab500fcf21f6bba", "testharness" ], + "trusted-types/TrustedTypePolicyFactory-createPolicy.tentative.html": [ + "2f278957c02c4af53ede7ea29610edc20d9ee86e", + "testharness" + ], "trusted-types/TrustedURL.tentative.html": [ "2543ae30982c5d979502278f9edcd88d03090eba", "testharness" ], + "trusted-types/Window-trustedTypes.tentative.html": [ + "8da2a72a11ce0e4dbf0722d081d7cea9f3ded637", + "testharness" + ], "trusted-types/block-string-assignment-to-HTMLAnchorElement-href.tentative.html": [ "be3b9f7c6088129389f27046de8e645786c61191", "testharness" @@ -407266,7 +406923,7 @@ "support" ], "wake-lock/idlharness.https.window-expected.txt": [ - "d7091aaf85737aaf337e76d65378b159af3aa947", + "e7fb839b0559086059be818f87a2276bcce19cd1", "support" ], "wake-lock/idlharness.https.window.js": [ @@ -407926,11 +407583,11 @@ "testharness" ], "web-animations/timing-model/animations/setting-the-target-effect-of-an-animation-expected.txt": [ - "73150a6268536b745e6fa3c609e10b26154dfec1", + "f4a068252ddc75792ad7e14ef38100381ed92314", "support" ], "web-animations/timing-model/animations/setting-the-target-effect-of-an-animation.html": [ - "f4e50b805229e0170bff67530b694ee5d6dd1f1a", + "2bad1481d70f0a8925ffdbf2e5e3d228aa641d0a", "testharness" ], "web-animations/timing-model/animations/setting-the-timeline-of-an-animation-expected.txt": [ @@ -407958,7 +407615,7 @@ "testharness" ], "web-animations/timing-model/timelines/document-timelines.html": [ - "d0fcb390c19c9ede7288278dc11ea5b3d33671cb", + "44b64478e81fd9c7933b865cb6ad3d62f06bc993", "testharness" ], "web-animations/timing-model/timelines/timelines.html": [ @@ -408306,7 +407963,7 @@ "support" ], "webaudio/idlharness.https.window-expected.txt": [ - "77fb40fa0aeedc7f4d8e90d1d51f847895128fbf", + "191dda72a27ddc0f11c0575ebd00f1a3d4d41b3a", "support" ], "webaudio/idlharness.https.window.js": [ @@ -411922,19 +411579,15 @@ "support" ], "webusb/idlharness.https.any.js": [ - "0ee7b08945b6064a6e760fd430a0c424ec93f91d", + "68976647ef1dfeed72c6888a85c8b98490953d4d", "testharness" ], - "webusb/idlharness.https.any.sharedworker-expected.txt": [ - "d0370ee58f8199ca632ab40282e4bc4a543c53ce", - "support" - ], "webusb/idlharness.https.any.worker-expected.txt": [ "d0370ee58f8199ca632ab40282e4bc4a543c53ce", "support" ], "webusb/insecure-context.any.js": [ - "a5ba2d24e4f588f5b85ded64e80134355b787b01", + "50000ccd3bd6b9003b426f53e5a2baba3047b89d", "testharness" ], "webusb/resources/fake-devices.js": [ @@ -411986,7 +411639,7 @@ "support" ], "webusb/usb.https.any.js": [ - "7948886fb51b0993d188667bdf4eb4b0c2d92f7c", + "87119b89d65b67a57e8112a2b5e210183671f829", "testharness" ], "webusb/usb.https.window.js": [ @@ -412006,7 +411659,7 @@ "support" ], "webusb/usbConnectionEvent.https.any.js": [ - "8f234619bb6729b2733266a8ba5123ffebc5f52d", + "43a68065c202c1fb1b5833bf601bae6dd20ed084", "testharness" ], "webusb/usbDevice-iframe.https.html": [ @@ -412014,31 +411667,31 @@ "testharness" ], "webusb/usbDevice.https.any.js": [ - "d657b9852f228786cb5573e7f85a4b19bd22533d", + "7bad910e1a07d24434d11a0960b3c5eb90ec4a0f", "testharness" ], "webusb/usbInTransferResult.https.any.js": [ - "44a2a0864c0b0f632322fd8a09e4b601d6fbb1f9", + "f9a2a29031d09ccda8a536fe62e8fb66aa1f6560", "testharness" ], "webusb/usbIsochronousInTransferPacket.https.any.js": [ - "58629374099ec04761cd34f455a3939d8140fa5e", + "abb8ca47912fccc5cf96efb805d6676be2580edc", "testharness" ], "webusb/usbIsochronousInTransferResult.https.any.js": [ - "4ea4491ea4c73a72ea4bcc6a1536e76472040d95", + "c2b91170a2aa0f9a264bb0fb6be4725550807672", "testharness" ], "webusb/usbIsochronousOutTransferPacket.https.any.js": [ - "7f7e34236d6dbbc87262f7b1bdb370301f227949", + "63f23ce388260cd626b81d1dadfef081e93bc747", "testharness" ], "webusb/usbIsochronousOutTransferResult.https.any.js": [ - "87db9a0e44a4ef1815a8303fc9e77c398cc2ff94", + "cba0c9c4f6248d23562012f432f38636faaa4c9f", "testharness" ], "webusb/usbOutTransferResult.https.any.js": [ - "68b6d6779b66eddfbdee1d955b8360b643e213f0", + "83d8784c3808a1ea11cfacfa250d1beae8679528", "testharness" ], "webvr/META.yml": [ @@ -414970,11 +414623,11 @@ "support" ], "webxr/interfaces.https-expected.txt": [ - "d7d20b425b896e27e9dd6991937e4f452341a279", + "9ff552a80920cbddd0cf3ad95f49364342726406", "support" ], "webxr/interfaces.https.html": [ - "b723ad7105c7e5c12ba5fe75ceac3de3d990dfe2", + "aa283090f19dd7300d9a8860fe93737d1e1aab60", "testharness" ], "webxr/resources/webxr_check.html": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.any.js index 20aa40ed..f5095cb 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.any.js
@@ -3,14 +3,14 @@ // https://w3c.github.io/webcrypto/Overview.html -promise_test(async () => { - const idl = await fetch(`/interfaces/WebCryptoAPI.idl`).then(r => r.text()); - - const idl_array = new IdlArray(); - idl_array.add_idls(idl); - idl_array.add_objects({ - Crypto: ['crypto'], - SubtleCrypto: ['crypto.subtle'] - }); - idl_array.test(); -}, 'WebCryptoAPI interfaces'); +idl_test( + ['WebCryptoAPI'], + ['html', 'dom'], + idl_array => { + idl_array.add_objects({ + Crypto: ['crypto'], + SubtleCrypto: ['crypto.subtle'] + }); + }, + 'WebCryptoAPI interfaces' +);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/bluetooth/idl/idlharness.tentative.https.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/idl/idlharness.tentative.https.window-expected.txt index 9555620..d22237b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/bluetooth/idl/idlharness.tentative.https.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/bluetooth/idl/idlharness.tentative.https.window-expected.txt
@@ -256,5 +256,6 @@ PASS Navigator interface: attribute bluetooth PASS Unscopable handled correctly for bluetooth property on Navigator PASS Navigator interface: navigator must inherit property "bluetooth" with the proper type +PASS WorkerNavigator interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/idlharness-expected.txt new file mode 100644 index 0000000..105b2e0c --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/idlharness-expected.txt
@@ -0,0 +1,97 @@ +This is a testharness.js-based test. +Found 93 tests; 84 PASS, 9 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Test css-animations IDL implementation +PASS Partial interface CSSRule: original interface defined +PASS Partial interface mixin GlobalEventHandlers: original interface mixin defined +PASS AnimationEvent interface: existence and properties of interface object +PASS AnimationEvent interface object length +PASS AnimationEvent interface object name +PASS AnimationEvent interface: existence and properties of interface prototype object +PASS AnimationEvent interface: existence and properties of interface prototype object's "constructor" property +PASS AnimationEvent interface: existence and properties of interface prototype object's @@unscopables property +PASS AnimationEvent interface: attribute animationName +PASS Unscopable handled correctly for animationName property on AnimationEvent +PASS AnimationEvent interface: attribute elapsedTime +PASS Unscopable handled correctly for elapsedTime property on AnimationEvent +PASS AnimationEvent interface: attribute pseudoElement +PASS Unscopable handled correctly for pseudoElement property on AnimationEvent +PASS AnimationEvent must be primary interface of new AnimationEvent("animationstart") +PASS Stringification of new AnimationEvent("animationstart") +PASS AnimationEvent interface: new AnimationEvent("animationstart") must inherit property "animationName" with the proper type +PASS AnimationEvent interface: new AnimationEvent("animationstart") must inherit property "elapsedTime" with the proper type +PASS AnimationEvent interface: new AnimationEvent("animationstart") must inherit property "pseudoElement" with the proper type +PASS CSSKeyframeRule interface: existence and properties of interface object +PASS CSSKeyframeRule interface object length +PASS CSSKeyframeRule interface object name +PASS CSSKeyframeRule interface: existence and properties of interface prototype object +PASS CSSKeyframeRule interface: existence and properties of interface prototype object's "constructor" property +PASS CSSKeyframeRule interface: existence and properties of interface prototype object's @@unscopables property +PASS CSSKeyframeRule interface: attribute keyText +PASS Unscopable handled correctly for keyText property on CSSKeyframeRule +PASS CSSKeyframeRule interface: attribute style +PASS Unscopable handled correctly for style property on CSSKeyframeRule +PASS CSSKeyframeRule must be primary interface of keyframes.cssRules[0] +PASS Stringification of keyframes.cssRules[0] +PASS CSSKeyframeRule interface: keyframes.cssRules[0] must inherit property "keyText" with the proper type +PASS CSSKeyframeRule interface: keyframes.cssRules[0] must inherit property "style" with the proper type +PASS CSSRule interface: keyframes.cssRules[0] must inherit property "KEYFRAMES_RULE" with the proper type +PASS CSSRule interface: keyframes.cssRules[0] must inherit property "KEYFRAME_RULE" with the proper type +PASS CSSKeyframesRule interface: existence and properties of interface object +PASS CSSKeyframesRule interface object length +PASS CSSKeyframesRule interface object name +PASS CSSKeyframesRule interface: existence and properties of interface prototype object +PASS CSSKeyframesRule interface: existence and properties of interface prototype object's "constructor" property +PASS CSSKeyframesRule interface: existence and properties of interface prototype object's @@unscopables property +PASS CSSKeyframesRule interface: attribute name +PASS Unscopable handled correctly for name property on CSSKeyframesRule +PASS CSSKeyframesRule interface: attribute cssRules +PASS Unscopable handled correctly for cssRules property on CSSKeyframesRule +PASS CSSKeyframesRule interface: operation appendRule(CSSOMString) +PASS Unscopable handled correctly for appendRule(CSSOMString) on CSSKeyframesRule +PASS CSSKeyframesRule interface: operation deleteRule(CSSOMString) +PASS Unscopable handled correctly for deleteRule(CSSOMString) on CSSKeyframesRule +PASS CSSKeyframesRule interface: operation findRule(CSSOMString) +PASS Unscopable handled correctly for findRule(CSSOMString) on CSSKeyframesRule +PASS CSSKeyframesRule must be primary interface of keyframes +PASS Stringification of keyframes +PASS CSSKeyframesRule interface: keyframes must inherit property "name" with the proper type +PASS CSSKeyframesRule interface: keyframes must inherit property "cssRules" with the proper type +PASS CSSKeyframesRule interface: keyframes must inherit property "appendRule(CSSOMString)" with the proper type +PASS CSSKeyframesRule interface: calling appendRule(CSSOMString) on keyframes with too few arguments must throw TypeError +PASS CSSKeyframesRule interface: keyframes must inherit property "deleteRule(CSSOMString)" with the proper type +PASS CSSKeyframesRule interface: calling deleteRule(CSSOMString) on keyframes with too few arguments must throw TypeError +PASS CSSKeyframesRule interface: keyframes must inherit property "findRule(CSSOMString)" with the proper type +PASS CSSKeyframesRule interface: calling findRule(CSSOMString) on keyframes with too few arguments must throw TypeError +PASS CSSRule interface: keyframes must inherit property "KEYFRAMES_RULE" with the proper type +PASS CSSRule interface: keyframes must inherit property "KEYFRAME_RULE" with the proper type +FAIL HTMLElement interface: attribute onanimationstart assert_true: The prototype object must have a property "onanimationstart" expected true got false +PASS Unscopable handled correctly for onanimationstart property on HTMLElement +FAIL HTMLElement interface: attribute onanimationiteration assert_true: The prototype object must have a property "onanimationiteration" expected true got false +PASS Unscopable handled correctly for onanimationiteration property on HTMLElement +FAIL HTMLElement interface: attribute onanimationend assert_true: The prototype object must have a property "onanimationend" expected true got false +PASS Unscopable handled correctly for onanimationend property on HTMLElement +FAIL HTMLElement interface: attribute onanimationcancel assert_true: The prototype object must have a property "onanimationcancel" expected true got false +PASS Unscopable handled correctly for onanimationcancel property on HTMLElement +PASS Window interface: attribute onanimationstart +PASS Unscopable handled correctly for onanimationstart property on Window +PASS Window interface: attribute onanimationiteration +PASS Unscopable handled correctly for onanimationiteration property on Window +PASS Window interface: attribute onanimationend +PASS Unscopable handled correctly for onanimationend property on Window +FAIL Window interface: attribute onanimationcancel assert_own_property: The global object must have a property "onanimationcancel" expected property "onanimationcancel" missing +PASS Unscopable handled correctly for onanimationcancel property on Window +PASS WorkerGlobalScope interface: existence and properties of interface object +FAIL Document interface: attribute onanimationstart assert_true: The prototype object must have a property "onanimationstart" expected true got false +PASS Unscopable handled correctly for onanimationstart property on Document +FAIL Document interface: attribute onanimationiteration assert_true: The prototype object must have a property "onanimationiteration" expected true got false +PASS Unscopable handled correctly for onanimationiteration property on Document +FAIL Document interface: attribute onanimationend assert_true: The prototype object must have a property "onanimationend" expected true got false +PASS Unscopable handled correctly for onanimationend property on Document +FAIL Document interface: attribute onanimationcancel assert_true: The prototype object must have a property "onanimationcancel" expected true got false +PASS Unscopable handled correctly for onanimationcancel property on Document +PASS CSSRule interface: constant KEYFRAMES_RULE on interface object +PASS CSSRule interface: constant KEYFRAMES_RULE on interface prototype object +PASS CSSRule interface: constant KEYFRAME_RULE on interface object +PASS CSSRule interface: constant KEYFRAME_RULE on interface prototype object +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/idlharness.html index 9c03c7c..b25b9704 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/idlharness.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-animations/idlharness.html
@@ -26,7 +26,7 @@ idl_test( ['css-animations'], - ['dom', 'cssom'], + ['html', 'dom', 'cssom'], idl_array => { try { window.keyframes = document.styleSheets[0].cssRules[0];
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transitions/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-transitions/idlharness-expected.txt new file mode 100644 index 0000000..40e45cd --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transitions/idlharness-expected.txt
@@ -0,0 +1,60 @@ +This is a testharness.js-based test. +Found 56 tests; 34 PASS, 22 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS Test IDL implementation of css-transitions API +PASS Partial interface GlobalEventHandlers: original interface defined +PASS TransitionEvent interface: existence and properties of interface object +PASS TransitionEvent interface object length +PASS TransitionEvent interface object name +PASS TransitionEvent interface: existence and properties of interface prototype object +PASS TransitionEvent interface: existence and properties of interface prototype object's "constructor" property +PASS TransitionEvent interface: existence and properties of interface prototype object's @@unscopables property +PASS TransitionEvent interface: attribute propertyName +PASS Unscopable handled correctly for propertyName property on TransitionEvent +PASS TransitionEvent interface: attribute elapsedTime +PASS Unscopable handled correctly for elapsedTime property on TransitionEvent +PASS TransitionEvent interface: attribute pseudoElement +PASS Unscopable handled correctly for pseudoElement property on TransitionEvent +PASS TransitionEvent must be primary interface of new TransitionEvent("transitionend") +PASS Stringification of new TransitionEvent("transitionend") +PASS TransitionEvent interface: new TransitionEvent("transitionend") must inherit property "propertyName" with the proper type +PASS TransitionEvent interface: new TransitionEvent("transitionend") must inherit property "elapsedTime" with the proper type +PASS TransitionEvent interface: new TransitionEvent("transitionend") must inherit property "pseudoElement" with the proper type +FAIL HTMLElement interface: attribute ontransitionrun assert_true: The prototype object must have a property "ontransitionrun" expected true got false +PASS Unscopable handled correctly for ontransitionrun property on HTMLElement +FAIL HTMLElement interface: attribute ontransitionstart assert_true: The prototype object must have a property "ontransitionstart" expected true got false +PASS Unscopable handled correctly for ontransitionstart property on HTMLElement +FAIL HTMLElement interface: attribute ontransitionend assert_true: The prototype object must have a property "ontransitionend" expected true got false +PASS Unscopable handled correctly for ontransitionend property on HTMLElement +FAIL HTMLElement interface: attribute ontransitioncancel assert_true: The prototype object must have a property "ontransitioncancel" expected true got false +PASS Unscopable handled correctly for ontransitioncancel property on HTMLElement +FAIL HTMLElement interface: document must inherit property "ontransitionrun" with the proper type assert_inherits: property "ontransitionrun" not found in prototype chain +FAIL HTMLElement interface: document must inherit property "ontransitionstart" with the proper type assert_inherits: property "ontransitionstart" not found in prototype chain +FAIL HTMLElement interface: document must inherit property "ontransitionend" with the proper type assert_inherits: property "ontransitionend" not found in prototype chain +FAIL HTMLElement interface: document must inherit property "ontransitioncancel" with the proper type assert_inherits: property "ontransitioncancel" not found in prototype chain +FAIL Window interface: attribute ontransitionrun assert_own_property: The global object must have a property "ontransitionrun" expected property "ontransitionrun" missing +PASS Unscopable handled correctly for ontransitionrun property on Window +FAIL Window interface: attribute ontransitionstart assert_own_property: The global object must have a property "ontransitionstart" expected property "ontransitionstart" missing +PASS Unscopable handled correctly for ontransitionstart property on Window +PASS Window interface: attribute ontransitionend +PASS Unscopable handled correctly for ontransitionend property on Window +FAIL Window interface: attribute ontransitioncancel assert_own_property: The global object must have a property "ontransitioncancel" expected property "ontransitioncancel" missing +PASS Unscopable handled correctly for ontransitioncancel property on Window +FAIL Window interface: window must inherit property "ontransitionrun" with the proper type assert_own_property: expected property "ontransitionrun" missing +FAIL Window interface: window must inherit property "ontransitionstart" with the proper type assert_own_property: expected property "ontransitionstart" missing +PASS Window interface: window must inherit property "ontransitionend" with the proper type +FAIL Window interface: window must inherit property "ontransitioncancel" with the proper type assert_own_property: expected property "ontransitioncancel" missing +PASS WorkerGlobalScope interface: existence and properties of interface object +FAIL Document interface: attribute ontransitionrun assert_true: The prototype object must have a property "ontransitionrun" expected true got false +PASS Unscopable handled correctly for ontransitionrun property on Document +FAIL Document interface: attribute ontransitionstart assert_true: The prototype object must have a property "ontransitionstart" expected true got false +PASS Unscopable handled correctly for ontransitionstart property on Document +FAIL Document interface: attribute ontransitionend assert_true: The prototype object must have a property "ontransitionend" expected true got false +PASS Unscopable handled correctly for ontransitionend property on Document +FAIL Document interface: attribute ontransitioncancel assert_true: The prototype object must have a property "ontransitioncancel" expected true got false +PASS Unscopable handled correctly for ontransitioncancel property on Document +FAIL Document interface: document must inherit property "ontransitionrun" with the proper type assert_inherits: property "ontransitionrun" not found in prototype chain +FAIL Document interface: document must inherit property "ontransitionstart" with the proper type assert_inherits: property "ontransitionstart" not found in prototype chain +FAIL Document interface: document must inherit property "ontransitionend" with the proper type assert_inherits: property "ontransitionend" not found in prototype chain +FAIL Document interface: document must inherit property "ontransitioncancel" with the proper type assert_inherits: property "ontransitioncancel" not found in prototype chain +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-transitions/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-transitions/idlharness.html index 36178b734..6856952c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/css-transitions/idlharness.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-transitions/idlharness.html
@@ -8,16 +8,18 @@ <script> "use strict"; - promise_test(async () => { - const idl_array = new IdlArray(); - const idl = await fetch("/interfaces/css-transitions.idl").then(r => r.text()); - const cssom = await fetch("/interfaces/cssom.idl").then(r => r.text()); - const html = await fetch("/interfaces/html.idl").then(r => r.text()); - const dom = await fetch("/interfaces/dom.idl").then(r => r.text()); - idl_array.add_idls(idl); - idl_array.add_dependency_idls(cssom); - idl_array.add_dependency_idls(html); - idl_array.add_dependency_idls(dom); - idl_array.test(); - }, "Test IDL implementation of css-transitions API"); + idl_test( + ['css-transitions'], + ['cssom', 'html', 'dom'], + idl_array => { + idl_array.add_objects({ + TransitionEvent: ['new TransitionEvent("transitionend")'], + // These include GlobalEventHandlers + Document: ['document'], + HTMLElement: ['document'], + Window: ['window'], + }) + }, + 'Test IDL implementation of css-transitions API' + ); </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces_exclude=Node-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces_exclude=Node-expected.txt index 94a3ae5..99ed03d3 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces_exclude=Node-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces_exclude=Node-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 1339 tests; 1318 PASS, 21 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 1340 tests; 1319 PASS, 21 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Test driver PASS Partial interface Window: original interface defined PASS Event interface: existence and properties of interface object @@ -1339,5 +1339,6 @@ PASS DOMTokenList interface: document.body.classList must inherit property "value" with the proper type FAIL Window interface: attribute event assert_true: property should be enumerable expected true got false PASS Unscopable handled correctly for event property on Window +PASS WorkerGlobalScope interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any-expected.txt index 9806b38c..5ce37c41 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any-expected.txt
@@ -1,6 +1,7 @@ This is a testharness.js-based test. -Found 184 tests; 178 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 190 tests; 184 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Fetch Standard IDL +PASS Partial interface mixin WindowOrWorkerGlobalScope: original interface mixin defined PASS Headers interface: existence and properties of interface object PASS Headers interface object length PASS Headers interface object name @@ -184,5 +185,10 @@ PASS Response interface: new Response() must inherit property "formData()" with the proper type PASS Response interface: new Response() must inherit property "json()" with the proper type PASS Response interface: new Response() must inherit property "text()" with the proper type +PASS Window interface: operation fetch(RequestInfo, RequestInit) +PASS Unscopable handled correctly for fetch(RequestInfo, RequestInit) on Window +PASS Window interface: window must inherit property "fetch(RequestInfo, RequestInit)" with the proper type +PASS Window interface: calling fetch(RequestInfo, RequestInit) on window with too few arguments must throw TypeError +PASS WorkerGlobalScope interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any.js b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any.js index 9fd5eccd..a3dec79 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any.js
@@ -2,18 +2,20 @@ // META: script=/resources/WebIDLParser.js // META: script=/resources/idlharness.js -promise_test(async() => { - const text = await (await fetch("/interfaces/fetch.idl")).text(); - const referrer_policy = await (await fetch("/interfaces/referrer-policy.idl")).text(); - const idl_array = new IdlArray(); - idl_array.add_idls(text); - idl_array.add_untested_idls("[Exposed=(Window,Worker)] interface AbortSignal {};"); - idl_array.add_untested_idls("[Exposed=(Window,Worker)] interface ReadableStream {};"); - idl_array.add_dependency_idls(referrer_policy); - idl_array.add_objects({ - Headers: ["new Headers()"], - Request: ["new Request('about:blank')"], - Response: ["new Response()"], - }); - idl_array.test(); -}, "Fetch Standard IDL"); +idl_test( + ['fetch'], + ['referrer-policy', 'html', 'dom'], + idl_array => { + idl_array.add_objects({ + Headers: ["new Headers()"], + Request: ["new Request('about:blank')"], + Response: ["new Response()"], + }); + if (self.GLOBAL.isWindow()) { + idl_array.add_objects({ Window: ['window'] }); + } else if (self.GLOBAL.isWorker()) { + idl_array.add_objects({ WorkerGlobalScope: ['self'] }); + } + }, + 'Fetch Standard IDL' +);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any.sharedworker-expected.txt index 9806b38c..a5a33e9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any.sharedworker-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any.sharedworker-expected.txt
@@ -1,6 +1,7 @@ This is a testharness.js-based test. -Found 184 tests; 178 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 201 tests; 195 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Fetch Standard IDL +PASS Partial interface mixin WindowOrWorkerGlobalScope: original interface mixin defined PASS Headers interface: existence and properties of interface object PASS Headers interface object length PASS Headers interface object name @@ -184,5 +185,21 @@ PASS Response interface: new Response() must inherit property "formData()" with the proper type PASS Response interface: new Response() must inherit property "json()" with the proper type PASS Response interface: new Response() must inherit property "text()" with the proper type +PASS HTMLElement interface: existence and properties of interface object +PASS HTMLBodyElement interface: existence and properties of interface object +PASS Window interface: existence and properties of interface object +PASS WorkerGlobalScope interface: operation fetch(RequestInfo, RequestInit) +PASS Unscopable handled correctly for fetch(RequestInfo, RequestInit) on WorkerGlobalScope +PASS WorkerGlobalScope interface: self must inherit property "fetch(RequestInfo, RequestInit)" with the proper type +PASS WorkerGlobalScope interface: calling fetch(RequestInfo, RequestInit) on self with too few arguments must throw TypeError +PASS HTMLFrameSetElement interface: existence and properties of interface object +PASS Node interface: existence and properties of interface object +PASS Document interface: existence and properties of interface object +PASS DocumentType interface: existence and properties of interface object +PASS DocumentFragment interface: existence and properties of interface object +PASS ShadowRoot interface: existence and properties of interface object +PASS Element interface: existence and properties of interface object +PASS CharacterData interface: existence and properties of interface object +PASS Text interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any.worker-expected.txt index 9806b38c..a5a33e9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any.worker-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.any.worker-expected.txt
@@ -1,6 +1,7 @@ This is a testharness.js-based test. -Found 184 tests; 178 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 201 tests; 195 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Fetch Standard IDL +PASS Partial interface mixin WindowOrWorkerGlobalScope: original interface mixin defined PASS Headers interface: existence and properties of interface object PASS Headers interface object length PASS Headers interface object name @@ -184,5 +185,21 @@ PASS Response interface: new Response() must inherit property "formData()" with the proper type PASS Response interface: new Response() must inherit property "json()" with the proper type PASS Response interface: new Response() must inherit property "text()" with the proper type +PASS HTMLElement interface: existence and properties of interface object +PASS HTMLBodyElement interface: existence and properties of interface object +PASS Window interface: existence and properties of interface object +PASS WorkerGlobalScope interface: operation fetch(RequestInfo, RequestInit) +PASS Unscopable handled correctly for fetch(RequestInfo, RequestInit) on WorkerGlobalScope +PASS WorkerGlobalScope interface: self must inherit property "fetch(RequestInfo, RequestInit)" with the proper type +PASS WorkerGlobalScope interface: calling fetch(RequestInfo, RequestInit) on self with too few arguments must throw TypeError +PASS HTMLFrameSetElement interface: existence and properties of interface object +PASS Node interface: existence and properties of interface object +PASS Document interface: existence and properties of interface object +PASS DocumentType interface: existence and properties of interface object +PASS DocumentFragment interface: existence and properties of interface object +PASS ShadowRoot interface: existence and properties of interface object +PASS Element interface: existence and properties of interface object +PASS CharacterData interface: existence and properties of interface object +PASS Text interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.https.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.https.any.serviceworker-expected.txt index b578dcdd..6016fb1 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.https.any.serviceworker-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/api/idl.https.any.serviceworker-expected.txt
@@ -1,5 +1,6 @@ This is a testharness.js-based test. PASS Fetch Standard IDL +PASS Partial interface mixin WindowOrWorkerGlobalScope: original interface mixin defined PASS Headers interface: existence and properties of interface object PASS Headers interface object length PASS Headers interface object name @@ -183,5 +184,21 @@ PASS Response interface: new Response() must inherit property "formData()" with the proper type PASS Response interface: new Response() must inherit property "json()" with the proper type PASS Response interface: new Response() must inherit property "text()" with the proper type +PASS HTMLElement interface: existence and properties of interface object +PASS HTMLBodyElement interface: existence and properties of interface object +PASS Window interface: existence and properties of interface object +FAIL WorkerGlobalScope interface: operation fetch(RequestInfo, RequestInit) assert_unreached: Should have rejected: calling operation with this = null didn't throw TypeError Reached unreachable code +PASS Unscopable handled correctly for fetch(RequestInfo, RequestInit) on WorkerGlobalScope +FAIL WorkerGlobalScope interface: self must inherit property "fetch(RequestInfo, RequestInit)" with the proper type assert_inherits: property "fetch" found on object expected in prototype chain +FAIL WorkerGlobalScope interface: calling fetch(RequestInfo, RequestInit) on self with too few arguments must throw TypeError assert_inherits: property "fetch" found on object expected in prototype chain +PASS HTMLFrameSetElement interface: existence and properties of interface object +PASS Node interface: existence and properties of interface object +PASS Document interface: existence and properties of interface object +PASS DocumentType interface: existence and properties of interface object +PASS DocumentFragment interface: existence and properties of interface object +PASS ShadowRoot interface: existence and properties of interface object +PASS Element interface: existence and properties of interface object +PASS CharacterData interface: existence and properties of interface object +PASS Text interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/cors-rfc1918/idlharness.tentative.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/cors-rfc1918/idlharness.tentative.any.sharedworker-expected.txt index 9bb1fc0..ef1b30e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/cors-rfc1918/idlharness.tentative.any.sharedworker-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/cors-rfc1918/idlharness.tentative.any.sharedworker-expected.txt
@@ -2,10 +2,20 @@ PASS Test CORS RFC1918 interfaces PASS Partial interface Document: original interface defined PASS Partial interface WorkerGlobalScope: original interface defined +PASS HTMLElement interface: existence and properties of interface object +PASS HTMLBodyElement interface: existence and properties of interface object +PASS Window interface: existence and properties of interface object FAIL WorkerGlobalScope interface: attribute addressSpace assert_true: The prototype object must have a property "addressSpace" expected true got false PASS Unscopable handled correctly for addressSpace property on WorkerGlobalScope FAIL WorkerGlobalScope interface: self must inherit property "addressSpace" with the proper type assert_inherits: property "addressSpace" not found in prototype chain +PASS HTMLFrameSetElement interface: existence and properties of interface object PASS Node interface: existence and properties of interface object PASS Document interface: existence and properties of interface object +PASS DocumentType interface: existence and properties of interface object +PASS DocumentFragment interface: existence and properties of interface object +PASS ShadowRoot interface: existence and properties of interface object +PASS Element interface: existence and properties of interface object +PASS CharacterData interface: existence and properties of interface object +PASS Text interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/cors-rfc1918/idlharness.tentative.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/cors-rfc1918/idlharness.tentative.any.worker-expected.txt index 9bb1fc0..ef1b30e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/cors-rfc1918/idlharness.tentative.any.worker-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/cors-rfc1918/idlharness.tentative.any.worker-expected.txt
@@ -2,10 +2,20 @@ PASS Test CORS RFC1918 interfaces PASS Partial interface Document: original interface defined PASS Partial interface WorkerGlobalScope: original interface defined +PASS HTMLElement interface: existence and properties of interface object +PASS HTMLBodyElement interface: existence and properties of interface object +PASS Window interface: existence and properties of interface object FAIL WorkerGlobalScope interface: attribute addressSpace assert_true: The prototype object must have a property "addressSpace" expected true got false PASS Unscopable handled correctly for addressSpace property on WorkerGlobalScope FAIL WorkerGlobalScope interface: self must inherit property "addressSpace" with the proper type assert_inherits: property "addressSpace" not found in prototype chain +PASS HTMLFrameSetElement interface: existence and properties of interface object PASS Node interface: existence and properties of interface object PASS Document interface: existence and properties of interface object +PASS DocumentType interface: existence and properties of interface object +PASS DocumentFragment interface: existence and properties of interface object +PASS ShadowRoot interface: existence and properties of interface object +PASS Element interface: existence and properties of interface object +PASS CharacterData interface: existence and properties of interface object +PASS Text interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/cors-rfc1918/idlharness.tentative.https.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/cors-rfc1918/idlharness.tentative.https.any.serviceworker-expected.txt index 9bb1fc0..ef1b30e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/fetch/cors-rfc1918/idlharness.tentative.https.any.serviceworker-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/cors-rfc1918/idlharness.tentative.https.any.serviceworker-expected.txt
@@ -2,10 +2,20 @@ PASS Test CORS RFC1918 interfaces PASS Partial interface Document: original interface defined PASS Partial interface WorkerGlobalScope: original interface defined +PASS HTMLElement interface: existence and properties of interface object +PASS HTMLBodyElement interface: existence and properties of interface object +PASS Window interface: existence and properties of interface object FAIL WorkerGlobalScope interface: attribute addressSpace assert_true: The prototype object must have a property "addressSpace" expected true got false PASS Unscopable handled correctly for addressSpace property on WorkerGlobalScope FAIL WorkerGlobalScope interface: self must inherit property "addressSpace" with the proper type assert_inherits: property "addressSpace" not found in prototype chain +PASS HTMLFrameSetElement interface: existence and properties of interface object PASS Node interface: existence and properties of interface object PASS Document interface: existence and properties of interface object +PASS DocumentType interface: existence and properties of interface object +PASS DocumentFragment interface: existence and properties of interface object +PASS ShadowRoot interface: existence and properties of interface object +PASS Element interface: existence and properties of interface object +PASS CharacterData interface: existence and properties of interface object +PASS Text interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/gamepad/idlharness.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/gamepad/idlharness.window-expected.txt index 1c52378..4be464b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/gamepad/idlharness.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/gamepad/idlharness.window-expected.txt
@@ -1,4 +1,5 @@ This is a testharness.js-based test. +Found 50 tests; 49 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Test IDL implementation of Gamepad API PASS Partial interface Navigator: original interface defined PASS Partial interface Navigator: valid exposure set @@ -48,5 +49,6 @@ PASS Navigator interface: operation getGamepads() PASS Unscopable handled correctly for getGamepads() on Navigator PASS Navigator interface: navigator must inherit property "getGamepads()" with the proper type +PASS WorkerNavigator interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/webgl1.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/webgl1.idl new file mode 100644 index 0000000..fce2cdf --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/webgl1.idl
@@ -0,0 +1,724 @@ +// GENERATED CONTENT - DO NOT EDIT +// Content of this file was automatically extracted from the +// "WebGL Specification" spec. +// See: https://www.khronos.org/registry/webgl/specs/latest/1.0/ + +typedef unsigned long GLenum; +typedef boolean GLboolean; +typedef unsigned long GLbitfield; +typedef byte GLbyte; /* 'byte' should be a signed 8 bit type. */ +typedef short GLshort; +typedef long GLint; +typedef long GLsizei; +typedef long long GLintptr; +typedef long long GLsizeiptr; +// Ideally the typedef below would use 'unsigned byte', but that doesn't currently exist in Web IDL. +typedef octet GLubyte; /* 'octet' should be an unsigned 8 bit type. */ +typedef unsigned short GLushort; +typedef unsigned long GLuint; +typedef unrestricted float GLfloat; +typedef unrestricted float GLclampf; + +// The power preference settings are documented in the WebGLContextAttributes +// section of the specification. +enum WebGLPowerPreference { "default", "low-power", "high-performance" }; + +dictionary WebGLContextAttributes { + GLboolean alpha = true; + GLboolean depth = true; + GLboolean stencil = false; + GLboolean antialias = true; + GLboolean premultipliedAlpha = true; + GLboolean preserveDrawingBuffer = false; + WebGLPowerPreference powerPreference = "default"; + GLboolean failIfMajorPerformanceCaveat = false; +}; + +interface WebGLObject { +}; + +interface WebGLBuffer : WebGLObject { +}; + +interface WebGLFramebuffer : WebGLObject { +}; + +interface WebGLProgram : WebGLObject { +}; + +interface WebGLRenderbuffer : WebGLObject { +}; + +interface WebGLShader : WebGLObject { +}; + +interface WebGLTexture : WebGLObject { +}; + +interface WebGLUniformLocation { +}; + +interface WebGLActiveInfo { + readonly attribute GLint size; + readonly attribute GLenum type; + readonly attribute DOMString name; +}; + +interface WebGLShaderPrecisionFormat { + readonly attribute GLint rangeMin; + readonly attribute GLint rangeMax; + readonly attribute GLint precision; +}; + +typedef (ImageBitmap or + ImageData or + HTMLImageElement or + HTMLCanvasElement or + HTMLVideoElement) TexImageSource; + +typedef ([AllowShared] Float32Array or sequence<GLfloat>) Float32List; +typedef ([AllowShared] Int32Array or sequence<GLint>) Int32List; + +interface mixin WebGLRenderingContextBase +{ + + /* ClearBufferMask */ + const GLenum DEPTH_BUFFER_BIT = 0x00000100; + const GLenum STENCIL_BUFFER_BIT = 0x00000400; + const GLenum COLOR_BUFFER_BIT = 0x00004000; + + /* BeginMode */ + const GLenum POINTS = 0x0000; + const GLenum LINES = 0x0001; + const GLenum LINE_LOOP = 0x0002; + const GLenum LINE_STRIP = 0x0003; + const GLenum TRIANGLES = 0x0004; + const GLenum TRIANGLE_STRIP = 0x0005; + const GLenum TRIANGLE_FAN = 0x0006; + + /* AlphaFunction (not supported in ES20) */ + /* NEVER */ + /* LESS */ + /* EQUAL */ + /* LEQUAL */ + /* GREATER */ + /* NOTEQUAL */ + /* GEQUAL */ + /* ALWAYS */ + + /* BlendingFactorDest */ + const GLenum ZERO = 0; + const GLenum ONE = 1; + const GLenum SRC_COLOR = 0x0300; + const GLenum ONE_MINUS_SRC_COLOR = 0x0301; + const GLenum SRC_ALPHA = 0x0302; + const GLenum ONE_MINUS_SRC_ALPHA = 0x0303; + const GLenum DST_ALPHA = 0x0304; + const GLenum ONE_MINUS_DST_ALPHA = 0x0305; + + /* BlendingFactorSrc */ + /* ZERO */ + /* ONE */ + const GLenum DST_COLOR = 0x0306; + const GLenum ONE_MINUS_DST_COLOR = 0x0307; + const GLenum SRC_ALPHA_SATURATE = 0x0308; + /* SRC_ALPHA */ + /* ONE_MINUS_SRC_ALPHA */ + /* DST_ALPHA */ + /* ONE_MINUS_DST_ALPHA */ + + /* BlendEquationSeparate */ + const GLenum FUNC_ADD = 0x8006; + const GLenum BLEND_EQUATION = 0x8009; + const GLenum BLEND_EQUATION_RGB = 0x8009; /* same as BLEND_EQUATION */ + const GLenum BLEND_EQUATION_ALPHA = 0x883D; + + /* BlendSubtract */ + const GLenum FUNC_SUBTRACT = 0x800A; + const GLenum FUNC_REVERSE_SUBTRACT = 0x800B; + + /* Separate Blend Functions */ + const GLenum BLEND_DST_RGB = 0x80C8; + const GLenum BLEND_SRC_RGB = 0x80C9; + const GLenum BLEND_DST_ALPHA = 0x80CA; + const GLenum BLEND_SRC_ALPHA = 0x80CB; + const GLenum CONSTANT_COLOR = 0x8001; + const GLenum ONE_MINUS_CONSTANT_COLOR = 0x8002; + const GLenum CONSTANT_ALPHA = 0x8003; + const GLenum ONE_MINUS_CONSTANT_ALPHA = 0x8004; + const GLenum BLEND_COLOR = 0x8005; + + /* Buffer Objects */ + const GLenum ARRAY_BUFFER = 0x8892; + const GLenum ELEMENT_ARRAY_BUFFER = 0x8893; + const GLenum ARRAY_BUFFER_BINDING = 0x8894; + const GLenum ELEMENT_ARRAY_BUFFER_BINDING = 0x8895; + + const GLenum STREAM_DRAW = 0x88E0; + const GLenum STATIC_DRAW = 0x88E4; + const GLenum DYNAMIC_DRAW = 0x88E8; + + const GLenum BUFFER_SIZE = 0x8764; + const GLenum BUFFER_USAGE = 0x8765; + + const GLenum CURRENT_VERTEX_ATTRIB = 0x8626; + + /* CullFaceMode */ + const GLenum FRONT = 0x0404; + const GLenum BACK = 0x0405; + const GLenum FRONT_AND_BACK = 0x0408; + + /* DepthFunction */ + /* NEVER */ + /* LESS */ + /* EQUAL */ + /* LEQUAL */ + /* GREATER */ + /* NOTEQUAL */ + /* GEQUAL */ + /* ALWAYS */ + + /* EnableCap */ + /* TEXTURE_2D */ + const GLenum CULL_FACE = 0x0B44; + const GLenum BLEND = 0x0BE2; + const GLenum DITHER = 0x0BD0; + const GLenum STENCIL_TEST = 0x0B90; + const GLenum DEPTH_TEST = 0x0B71; + const GLenum SCISSOR_TEST = 0x0C11; + const GLenum POLYGON_OFFSET_FILL = 0x8037; + const GLenum SAMPLE_ALPHA_TO_COVERAGE = 0x809E; + const GLenum SAMPLE_COVERAGE = 0x80A0; + + /* ErrorCode */ + const GLenum NO_ERROR = 0; + const GLenum INVALID_ENUM = 0x0500; + const GLenum INVALID_VALUE = 0x0501; + const GLenum INVALID_OPERATION = 0x0502; + const GLenum OUT_OF_MEMORY = 0x0505; + + /* FrontFaceDirection */ + const GLenum CW = 0x0900; + const GLenum CCW = 0x0901; + + /* GetPName */ + const GLenum LINE_WIDTH = 0x0B21; + const GLenum ALIASED_POINT_SIZE_RANGE = 0x846D; + const GLenum ALIASED_LINE_WIDTH_RANGE = 0x846E; + const GLenum CULL_FACE_MODE = 0x0B45; + const GLenum FRONT_FACE = 0x0B46; + const GLenum DEPTH_RANGE = 0x0B70; + const GLenum DEPTH_WRITEMASK = 0x0B72; + const GLenum DEPTH_CLEAR_VALUE = 0x0B73; + const GLenum DEPTH_FUNC = 0x0B74; + const GLenum STENCIL_CLEAR_VALUE = 0x0B91; + const GLenum STENCIL_FUNC = 0x0B92; + const GLenum STENCIL_FAIL = 0x0B94; + const GLenum STENCIL_PASS_DEPTH_FAIL = 0x0B95; + const GLenum STENCIL_PASS_DEPTH_PASS = 0x0B96; + const GLenum STENCIL_REF = 0x0B97; + const GLenum STENCIL_VALUE_MASK = 0x0B93; + const GLenum STENCIL_WRITEMASK = 0x0B98; + const GLenum STENCIL_BACK_FUNC = 0x8800; + const GLenum STENCIL_BACK_FAIL = 0x8801; + const GLenum STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802; + const GLenum STENCIL_BACK_PASS_DEPTH_PASS = 0x8803; + const GLenum STENCIL_BACK_REF = 0x8CA3; + const GLenum STENCIL_BACK_VALUE_MASK = 0x8CA4; + const GLenum STENCIL_BACK_WRITEMASK = 0x8CA5; + const GLenum VIEWPORT = 0x0BA2; + const GLenum SCISSOR_BOX = 0x0C10; + /* SCISSOR_TEST */ + const GLenum COLOR_CLEAR_VALUE = 0x0C22; + const GLenum COLOR_WRITEMASK = 0x0C23; + const GLenum UNPACK_ALIGNMENT = 0x0CF5; + const GLenum PACK_ALIGNMENT = 0x0D05; + const GLenum MAX_TEXTURE_SIZE = 0x0D33; + const GLenum MAX_VIEWPORT_DIMS = 0x0D3A; + const GLenum SUBPIXEL_BITS = 0x0D50; + const GLenum RED_BITS = 0x0D52; + const GLenum GREEN_BITS = 0x0D53; + const GLenum BLUE_BITS = 0x0D54; + const GLenum ALPHA_BITS = 0x0D55; + const GLenum DEPTH_BITS = 0x0D56; + const GLenum STENCIL_BITS = 0x0D57; + const GLenum POLYGON_OFFSET_UNITS = 0x2A00; + /* POLYGON_OFFSET_FILL */ + const GLenum POLYGON_OFFSET_FACTOR = 0x8038; + const GLenum TEXTURE_BINDING_2D = 0x8069; + const GLenum SAMPLE_BUFFERS = 0x80A8; + const GLenum SAMPLES = 0x80A9; + const GLenum SAMPLE_COVERAGE_VALUE = 0x80AA; + const GLenum SAMPLE_COVERAGE_INVERT = 0x80AB; + + /* GetTextureParameter */ + /* TEXTURE_MAG_FILTER */ + /* TEXTURE_MIN_FILTER */ + /* TEXTURE_WRAP_S */ + /* TEXTURE_WRAP_T */ + + const GLenum COMPRESSED_TEXTURE_FORMATS = 0x86A3; + + /* HintMode */ + const GLenum DONT_CARE = 0x1100; + const GLenum FASTEST = 0x1101; + const GLenum NICEST = 0x1102; + + /* HintTarget */ + const GLenum GENERATE_MIPMAP_HINT = 0x8192; + + /* DataType */ + const GLenum BYTE = 0x1400; + const GLenum UNSIGNED_BYTE = 0x1401; + const GLenum SHORT = 0x1402; + const GLenum UNSIGNED_SHORT = 0x1403; + const GLenum INT = 0x1404; + const GLenum UNSIGNED_INT = 0x1405; + const GLenum FLOAT = 0x1406; + + /* PixelFormat */ + const GLenum DEPTH_COMPONENT = 0x1902; + const GLenum ALPHA = 0x1906; + const GLenum RGB = 0x1907; + const GLenum RGBA = 0x1908; + const GLenum LUMINANCE = 0x1909; + const GLenum LUMINANCE_ALPHA = 0x190A; + + /* PixelType */ + /* UNSIGNED_BYTE */ + const GLenum UNSIGNED_SHORT_4_4_4_4 = 0x8033; + const GLenum UNSIGNED_SHORT_5_5_5_1 = 0x8034; + const GLenum UNSIGNED_SHORT_5_6_5 = 0x8363; + + /* Shaders */ + const GLenum FRAGMENT_SHADER = 0x8B30; + const GLenum VERTEX_SHADER = 0x8B31; + const GLenum MAX_VERTEX_ATTRIBS = 0x8869; + const GLenum MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB; + const GLenum MAX_VARYING_VECTORS = 0x8DFC; + const GLenum MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D; + const GLenum MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C; + const GLenum MAX_TEXTURE_IMAGE_UNITS = 0x8872; + const GLenum MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD; + const GLenum SHADER_TYPE = 0x8B4F; + const GLenum DELETE_STATUS = 0x8B80; + const GLenum LINK_STATUS = 0x8B82; + const GLenum VALIDATE_STATUS = 0x8B83; + const GLenum ATTACHED_SHADERS = 0x8B85; + const GLenum ACTIVE_UNIFORMS = 0x8B86; + const GLenum ACTIVE_ATTRIBUTES = 0x8B89; + const GLenum SHADING_LANGUAGE_VERSION = 0x8B8C; + const GLenum CURRENT_PROGRAM = 0x8B8D; + + /* StencilFunction */ + const GLenum NEVER = 0x0200; + const GLenum LESS = 0x0201; + const GLenum EQUAL = 0x0202; + const GLenum LEQUAL = 0x0203; + const GLenum GREATER = 0x0204; + const GLenum NOTEQUAL = 0x0205; + const GLenum GEQUAL = 0x0206; + const GLenum ALWAYS = 0x0207; + + /* StencilOp */ + /* ZERO */ + const GLenum KEEP = 0x1E00; + const GLenum REPLACE = 0x1E01; + const GLenum INCR = 0x1E02; + const GLenum DECR = 0x1E03; + const GLenum INVERT = 0x150A; + const GLenum INCR_WRAP = 0x8507; + const GLenum DECR_WRAP = 0x8508; + + /* StringName */ + const GLenum VENDOR = 0x1F00; + const GLenum RENDERER = 0x1F01; + const GLenum VERSION = 0x1F02; + + /* TextureMagFilter */ + const GLenum NEAREST = 0x2600; + const GLenum LINEAR = 0x2601; + + /* TextureMinFilter */ + /* NEAREST */ + /* LINEAR */ + const GLenum NEAREST_MIPMAP_NEAREST = 0x2700; + const GLenum LINEAR_MIPMAP_NEAREST = 0x2701; + const GLenum NEAREST_MIPMAP_LINEAR = 0x2702; + const GLenum LINEAR_MIPMAP_LINEAR = 0x2703; + + /* TextureParameterName */ + const GLenum TEXTURE_MAG_FILTER = 0x2800; + const GLenum TEXTURE_MIN_FILTER = 0x2801; + const GLenum TEXTURE_WRAP_S = 0x2802; + const GLenum TEXTURE_WRAP_T = 0x2803; + + /* TextureTarget */ + const GLenum TEXTURE_2D = 0x0DE1; + const GLenum TEXTURE = 0x1702; + + const GLenum TEXTURE_CUBE_MAP = 0x8513; + const GLenum TEXTURE_BINDING_CUBE_MAP = 0x8514; + const GLenum TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515; + const GLenum TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516; + const GLenum TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517; + const GLenum TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518; + const GLenum TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519; + const GLenum TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A; + const GLenum MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C; + + /* TextureUnit */ + const GLenum TEXTURE0 = 0x84C0; + const GLenum TEXTURE1 = 0x84C1; + const GLenum TEXTURE2 = 0x84C2; + const GLenum TEXTURE3 = 0x84C3; + const GLenum TEXTURE4 = 0x84C4; + const GLenum TEXTURE5 = 0x84C5; + const GLenum TEXTURE6 = 0x84C6; + const GLenum TEXTURE7 = 0x84C7; + const GLenum TEXTURE8 = 0x84C8; + const GLenum TEXTURE9 = 0x84C9; + const GLenum TEXTURE10 = 0x84CA; + const GLenum TEXTURE11 = 0x84CB; + const GLenum TEXTURE12 = 0x84CC; + const GLenum TEXTURE13 = 0x84CD; + const GLenum TEXTURE14 = 0x84CE; + const GLenum TEXTURE15 = 0x84CF; + const GLenum TEXTURE16 = 0x84D0; + const GLenum TEXTURE17 = 0x84D1; + const GLenum TEXTURE18 = 0x84D2; + const GLenum TEXTURE19 = 0x84D3; + const GLenum TEXTURE20 = 0x84D4; + const GLenum TEXTURE21 = 0x84D5; + const GLenum TEXTURE22 = 0x84D6; + const GLenum TEXTURE23 = 0x84D7; + const GLenum TEXTURE24 = 0x84D8; + const GLenum TEXTURE25 = 0x84D9; + const GLenum TEXTURE26 = 0x84DA; + const GLenum TEXTURE27 = 0x84DB; + const GLenum TEXTURE28 = 0x84DC; + const GLenum TEXTURE29 = 0x84DD; + const GLenum TEXTURE30 = 0x84DE; + const GLenum TEXTURE31 = 0x84DF; + const GLenum ACTIVE_TEXTURE = 0x84E0; + + /* TextureWrapMode */ + const GLenum REPEAT = 0x2901; + const GLenum CLAMP_TO_EDGE = 0x812F; + const GLenum MIRRORED_REPEAT = 0x8370; + + /* Uniform Types */ + const GLenum FLOAT_VEC2 = 0x8B50; + const GLenum FLOAT_VEC3 = 0x8B51; + const GLenum FLOAT_VEC4 = 0x8B52; + const GLenum INT_VEC2 = 0x8B53; + const GLenum INT_VEC3 = 0x8B54; + const GLenum INT_VEC4 = 0x8B55; + const GLenum BOOL = 0x8B56; + const GLenum BOOL_VEC2 = 0x8B57; + const GLenum BOOL_VEC3 = 0x8B58; + const GLenum BOOL_VEC4 = 0x8B59; + const GLenum FLOAT_MAT2 = 0x8B5A; + const GLenum FLOAT_MAT3 = 0x8B5B; + const GLenum FLOAT_MAT4 = 0x8B5C; + const GLenum SAMPLER_2D = 0x8B5E; + const GLenum SAMPLER_CUBE = 0x8B60; + + /* Vertex Arrays */ + const GLenum VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622; + const GLenum VERTEX_ATTRIB_ARRAY_SIZE = 0x8623; + const GLenum VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624; + const GLenum VERTEX_ATTRIB_ARRAY_TYPE = 0x8625; + const GLenum VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A; + const GLenum VERTEX_ATTRIB_ARRAY_POINTER = 0x8645; + const GLenum VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F; + + /* Read Format */ + const GLenum IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A; + const GLenum IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B; + + /* Shader Source */ + const GLenum COMPILE_STATUS = 0x8B81; + + /* Shader Precision-Specified Types */ + const GLenum LOW_FLOAT = 0x8DF0; + const GLenum MEDIUM_FLOAT = 0x8DF1; + const GLenum HIGH_FLOAT = 0x8DF2; + const GLenum LOW_INT = 0x8DF3; + const GLenum MEDIUM_INT = 0x8DF4; + const GLenum HIGH_INT = 0x8DF5; + + /* Framebuffer Object. */ + const GLenum FRAMEBUFFER = 0x8D40; + const GLenum RENDERBUFFER = 0x8D41; + + const GLenum RGBA4 = 0x8056; + const GLenum RGB5_A1 = 0x8057; + const GLenum RGB565 = 0x8D62; + const GLenum DEPTH_COMPONENT16 = 0x81A5; + const GLenum STENCIL_INDEX8 = 0x8D48; + const GLenum DEPTH_STENCIL = 0x84F9; + + const GLenum RENDERBUFFER_WIDTH = 0x8D42; + const GLenum RENDERBUFFER_HEIGHT = 0x8D43; + const GLenum RENDERBUFFER_INTERNAL_FORMAT = 0x8D44; + const GLenum RENDERBUFFER_RED_SIZE = 0x8D50; + const GLenum RENDERBUFFER_GREEN_SIZE = 0x8D51; + const GLenum RENDERBUFFER_BLUE_SIZE = 0x8D52; + const GLenum RENDERBUFFER_ALPHA_SIZE = 0x8D53; + const GLenum RENDERBUFFER_DEPTH_SIZE = 0x8D54; + const GLenum RENDERBUFFER_STENCIL_SIZE = 0x8D55; + + const GLenum FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0; + const GLenum FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1; + const GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2; + const GLenum FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3; + + const GLenum COLOR_ATTACHMENT0 = 0x8CE0; + const GLenum DEPTH_ATTACHMENT = 0x8D00; + const GLenum STENCIL_ATTACHMENT = 0x8D20; + const GLenum DEPTH_STENCIL_ATTACHMENT = 0x821A; + + const GLenum NONE = 0; + + const GLenum FRAMEBUFFER_COMPLETE = 0x8CD5; + const GLenum FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6; + const GLenum FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7; + const GLenum FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9; + const GLenum FRAMEBUFFER_UNSUPPORTED = 0x8CDD; + + const GLenum FRAMEBUFFER_BINDING = 0x8CA6; + const GLenum RENDERBUFFER_BINDING = 0x8CA7; + const GLenum MAX_RENDERBUFFER_SIZE = 0x84E8; + + const GLenum INVALID_FRAMEBUFFER_OPERATION = 0x0506; + + /* WebGL-specific enums */ + const GLenum UNPACK_FLIP_Y_WEBGL = 0x9240; + const GLenum UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241; + const GLenum CONTEXT_LOST_WEBGL = 0x9242; + const GLenum UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243; + const GLenum BROWSER_DEFAULT_WEBGL = 0x9244; + + readonly attribute HTMLCanvasElement canvas; + readonly attribute GLsizei drawingBufferWidth; + readonly attribute GLsizei drawingBufferHeight; + + [WebGLHandlesContextLoss] WebGLContextAttributes? getContextAttributes(); + [WebGLHandlesContextLoss] boolean isContextLost(); + + sequence<DOMString>? getSupportedExtensions(); + object? getExtension(DOMString name); + + void activeTexture(GLenum texture); + void attachShader(WebGLProgram program, WebGLShader shader); + void bindAttribLocation(WebGLProgram program, GLuint index, DOMString name); + void bindBuffer(GLenum target, WebGLBuffer? buffer); + void bindFramebuffer(GLenum target, WebGLFramebuffer? framebuffer); + void bindRenderbuffer(GLenum target, WebGLRenderbuffer? renderbuffer); + void bindTexture(GLenum target, WebGLTexture? texture); + void blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + void blendEquation(GLenum mode); + void blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha); + void blendFunc(GLenum sfactor, GLenum dfactor); + void blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, + GLenum srcAlpha, GLenum dstAlpha); + + void bufferData(GLenum target, GLsizeiptr size, GLenum usage); + void bufferData(GLenum target, [AllowShared] BufferSource? data, GLenum usage); + void bufferSubData(GLenum target, GLintptr offset, [AllowShared] BufferSource data); + + [WebGLHandlesContextLoss] GLenum checkFramebufferStatus(GLenum target); + void clear(GLbitfield mask); + void clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + void clearDepth(GLclampf depth); + void clearStencil(GLint s); + void colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); + void compileShader(WebGLShader shader); + + void compressedTexImage2D(GLenum target, GLint level, GLenum internalformat, + GLsizei width, GLsizei height, GLint border, + [AllowShared] ArrayBufferView data); + void compressedTexSubImage2D(GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, GLenum format, + [AllowShared] ArrayBufferView data); + + void copyTexImage2D(GLenum target, GLint level, GLenum internalformat, + GLint x, GLint y, GLsizei width, GLsizei height, + GLint border); + void copyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, + GLint x, GLint y, GLsizei width, GLsizei height); + + WebGLBuffer? createBuffer(); + WebGLFramebuffer? createFramebuffer(); + WebGLProgram? createProgram(); + WebGLRenderbuffer? createRenderbuffer(); + WebGLShader? createShader(GLenum type); + WebGLTexture? createTexture(); + + void cullFace(GLenum mode); + + void deleteBuffer(WebGLBuffer? buffer); + void deleteFramebuffer(WebGLFramebuffer? framebuffer); + void deleteProgram(WebGLProgram? program); + void deleteRenderbuffer(WebGLRenderbuffer? renderbuffer); + void deleteShader(WebGLShader? shader); + void deleteTexture(WebGLTexture? texture); + + void depthFunc(GLenum func); + void depthMask(GLboolean flag); + void depthRange(GLclampf zNear, GLclampf zFar); + void detachShader(WebGLProgram program, WebGLShader shader); + void disable(GLenum cap); + void disableVertexAttribArray(GLuint index); + void drawArrays(GLenum mode, GLint first, GLsizei count); + void drawElements(GLenum mode, GLsizei count, GLenum type, GLintptr offset); + + void enable(GLenum cap); + void enableVertexAttribArray(GLuint index); + void finish(); + void flush(); + void framebufferRenderbuffer(GLenum target, GLenum attachment, + GLenum renderbuffertarget, + WebGLRenderbuffer? renderbuffer); + void framebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, + WebGLTexture? texture, GLint level); + void frontFace(GLenum mode); + + void generateMipmap(GLenum target); + + WebGLActiveInfo? getActiveAttrib(WebGLProgram program, GLuint index); + WebGLActiveInfo? getActiveUniform(WebGLProgram program, GLuint index); + sequence<WebGLShader>? getAttachedShaders(WebGLProgram program); + + [WebGLHandlesContextLoss] GLint getAttribLocation(WebGLProgram program, DOMString name); + + any getBufferParameter(GLenum target, GLenum pname); + any getParameter(GLenum pname); + + [WebGLHandlesContextLoss] GLenum getError(); + + any getFramebufferAttachmentParameter(GLenum target, GLenum attachment, + GLenum pname); + any getProgramParameter(WebGLProgram program, GLenum pname); + DOMString? getProgramInfoLog(WebGLProgram program); + any getRenderbufferParameter(GLenum target, GLenum pname); + any getShaderParameter(WebGLShader shader, GLenum pname); + WebGLShaderPrecisionFormat? getShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype); + DOMString? getShaderInfoLog(WebGLShader shader); + + DOMString? getShaderSource(WebGLShader shader); + + any getTexParameter(GLenum target, GLenum pname); + + any getUniform(WebGLProgram program, WebGLUniformLocation location); + + WebGLUniformLocation? getUniformLocation(WebGLProgram program, DOMString name); + + any getVertexAttrib(GLuint index, GLenum pname); + + [WebGLHandlesContextLoss] GLintptr getVertexAttribOffset(GLuint index, GLenum pname); + + void hint(GLenum target, GLenum mode); + [WebGLHandlesContextLoss] GLboolean isBuffer(WebGLBuffer? buffer); + [WebGLHandlesContextLoss] GLboolean isEnabled(GLenum cap); + [WebGLHandlesContextLoss] GLboolean isFramebuffer(WebGLFramebuffer? framebuffer); + [WebGLHandlesContextLoss] GLboolean isProgram(WebGLProgram? program); + [WebGLHandlesContextLoss] GLboolean isRenderbuffer(WebGLRenderbuffer? renderbuffer); + [WebGLHandlesContextLoss] GLboolean isShader(WebGLShader? shader); + [WebGLHandlesContextLoss] GLboolean isTexture(WebGLTexture? texture); + void lineWidth(GLfloat width); + void linkProgram(WebGLProgram program); + void pixelStorei(GLenum pname, GLint param); + void polygonOffset(GLfloat factor, GLfloat units); + + void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, + GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels); + + void renderbufferStorage(GLenum target, GLenum internalformat, + GLsizei width, GLsizei height); + void sampleCoverage(GLclampf value, GLboolean invert); + void scissor(GLint x, GLint y, GLsizei width, GLsizei height); + + void shaderSource(WebGLShader shader, DOMString source); + + void stencilFunc(GLenum func, GLint ref, GLuint mask); + void stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask); + void stencilMask(GLuint mask); + void stencilMaskSeparate(GLenum face, GLuint mask); + void stencilOp(GLenum fail, GLenum zfail, GLenum zpass); + void stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass); + + void texImage2D(GLenum target, GLint level, GLint internalformat, + GLsizei width, GLsizei height, GLint border, GLenum format, + GLenum type, [AllowShared] ArrayBufferView? pixels); + void texImage2D(GLenum target, GLint level, GLint internalformat, + GLenum format, GLenum type, TexImageSource source); // May throw DOMException + + void texParameterf(GLenum target, GLenum pname, GLfloat param); + void texParameteri(GLenum target, GLenum pname, GLint param); + + void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, + GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels); + void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, + GLenum format, GLenum type, TexImageSource source); // May throw DOMException + + void uniform1f(WebGLUniformLocation? location, GLfloat x); + void uniform2f(WebGLUniformLocation? location, GLfloat x, GLfloat y); + void uniform3f(WebGLUniformLocation? location, GLfloat x, GLfloat y, GLfloat z); + void uniform4f(WebGLUniformLocation? location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + + void uniform1i(WebGLUniformLocation? location, GLint x); + void uniform2i(WebGLUniformLocation? location, GLint x, GLint y); + void uniform3i(WebGLUniformLocation? location, GLint x, GLint y, GLint z); + void uniform4i(WebGLUniformLocation? location, GLint x, GLint y, GLint z, GLint w); + + void uniform1fv(WebGLUniformLocation? location, Float32List v); + void uniform2fv(WebGLUniformLocation? location, Float32List v); + void uniform3fv(WebGLUniformLocation? location, Float32List v); + void uniform4fv(WebGLUniformLocation? location, Float32List v); + + void uniform1iv(WebGLUniformLocation? location, Int32List v); + void uniform2iv(WebGLUniformLocation? location, Int32List v); + void uniform3iv(WebGLUniformLocation? location, Int32List v); + void uniform4iv(WebGLUniformLocation? location, Int32List v); + + void uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value); + void uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value); + void uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value); + + void useProgram(WebGLProgram? program); + void validateProgram(WebGLProgram program); + + void vertexAttrib1f(GLuint index, GLfloat x); + void vertexAttrib2f(GLuint index, GLfloat x, GLfloat y); + void vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z); + void vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); + + void vertexAttrib1fv(GLuint index, Float32List values); + void vertexAttrib2fv(GLuint index, Float32List values); + void vertexAttrib3fv(GLuint index, Float32List values); + void vertexAttrib4fv(GLuint index, Float32List values); + + void vertexAttribPointer(GLuint index, GLint size, GLenum type, + GLboolean normalized, GLsizei stride, GLintptr offset); + + void viewport(GLint x, GLint y, GLsizei width, GLsizei height); +}; + +interface WebGLRenderingContext +{ +}; +WebGLRenderingContext includes WebGLRenderingContextBase; + +[Constructor(DOMString type, optional WebGLContextEventInit eventInit)] +interface WebGLContextEvent : Event { + readonly attribute DOMString statusMessage; +}; + +// EventInit is defined in the DOM4 specification. +dictionary WebGLContextEventInit : EventInit { + DOMString statusMessage = ""; +};
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-fromelement/idlharness.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-fromelement/idlharness.window-expected.txt index 6df94e8..70a65e2 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-fromelement/idlharness.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-fromelement/idlharness.window-expected.txt
@@ -23,5 +23,6 @@ PASS Unscopable handled correctly for captureStream(double) on HTMLCanvasElement PASS HTMLCanvasElement interface: canvas must inherit property "captureStream(double)" with the proper type PASS HTMLCanvasElement interface: calling captureStream(double) on canvas with too few arguments must throw TypeError +PASS WorkerGlobalScope interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness.window-expected.txt index ff232a9..4d382d1 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness.window-expected.txt
@@ -1,4 +1,91 @@ This is a testharness.js-based test. -FAIL mediastream-recording interfaces promise_test: Unhandled rejection with value: object "MediaRecorder inherits EventTarget, but EventTarget is undefined." +Found 87 tests; 77 PASS, 10 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS mediastream-recording interfaces +PASS MediaRecorder interface: existence and properties of interface object +PASS MediaRecorder interface object length +PASS MediaRecorder interface object name +PASS MediaRecorder interface: existence and properties of interface prototype object +PASS MediaRecorder interface: existence and properties of interface prototype object's "constructor" property +PASS MediaRecorder interface: existence and properties of interface prototype object's @@unscopables property +PASS MediaRecorder interface: attribute stream +PASS Unscopable handled correctly for stream property on MediaRecorder +PASS MediaRecorder interface: attribute mimeType +PASS Unscopable handled correctly for mimeType property on MediaRecorder +PASS MediaRecorder interface: attribute state +PASS Unscopable handled correctly for state property on MediaRecorder +PASS MediaRecorder interface: attribute onstart +PASS Unscopable handled correctly for onstart property on MediaRecorder +PASS MediaRecorder interface: attribute onstop +PASS Unscopable handled correctly for onstop property on MediaRecorder +PASS MediaRecorder interface: attribute ondataavailable +PASS Unscopable handled correctly for ondataavailable property on MediaRecorder +PASS MediaRecorder interface: attribute onpause +PASS Unscopable handled correctly for onpause property on MediaRecorder +PASS MediaRecorder interface: attribute onresume +PASS Unscopable handled correctly for onresume property on MediaRecorder +PASS MediaRecorder interface: attribute onerror +PASS Unscopable handled correctly for onerror property on MediaRecorder +PASS MediaRecorder interface: attribute videoBitsPerSecond +PASS Unscopable handled correctly for videoBitsPerSecond property on MediaRecorder +PASS MediaRecorder interface: attribute audioBitsPerSecond +PASS Unscopable handled correctly for audioBitsPerSecond property on MediaRecorder +PASS MediaRecorder interface: operation start(long) +PASS Unscopable handled correctly for start(long) on MediaRecorder +PASS MediaRecorder interface: operation stop() +PASS Unscopable handled correctly for stop() on MediaRecorder +PASS MediaRecorder interface: operation pause() +PASS Unscopable handled correctly for pause() on MediaRecorder +PASS MediaRecorder interface: operation resume() +PASS Unscopable handled correctly for resume() on MediaRecorder +PASS MediaRecorder interface: operation requestData() +PASS Unscopable handled correctly for requestData() on MediaRecorder +PASS MediaRecorder interface: operation isTypeSupported(DOMString) +PASS Unscopable handled correctly for isTypeSupported(DOMString) on MediaRecorder +PASS MediaRecorder must be primary interface of [object MediaRecorder] +PASS Stringification of [object MediaRecorder] +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "stream" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "mimeType" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "state" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onstart" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onstop" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "ondataavailable" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onpause" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onresume" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "onerror" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "videoBitsPerSecond" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "audioBitsPerSecond" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "start(long)" with the proper type +PASS MediaRecorder interface: calling start(long) on [object MediaRecorder] with too few arguments must throw TypeError +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "stop()" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "pause()" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "resume()" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "requestData()" with the proper type +PASS MediaRecorder interface: [object MediaRecorder] must inherit property "isTypeSupported(DOMString)" with the proper type +PASS MediaRecorder interface: calling isTypeSupported(DOMString) on [object MediaRecorder] with too few arguments must throw TypeError +PASS BlobEvent interface: existence and properties of interface object +PASS BlobEvent interface object length +PASS BlobEvent interface object name +PASS BlobEvent interface: existence and properties of interface prototype object +PASS BlobEvent interface: existence and properties of interface prototype object's "constructor" property +PASS BlobEvent interface: existence and properties of interface prototype object's @@unscopables property +PASS BlobEvent interface: attribute data +PASS Unscopable handled correctly for data property on BlobEvent +PASS BlobEvent interface: attribute timecode +PASS Unscopable handled correctly for timecode property on BlobEvent +PASS BlobEvent must be primary interface of [object BlobEvent] +PASS Stringification of [object BlobEvent] +PASS BlobEvent interface: [object BlobEvent] must inherit property "data" with the proper type +PASS BlobEvent interface: [object BlobEvent] must inherit property "timecode" with the proper type +FAIL MediaRecorderErrorEvent interface: existence and properties of interface object assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing +FAIL MediaRecorderErrorEvent interface object length assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing +FAIL MediaRecorderErrorEvent interface object name assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing +FAIL MediaRecorderErrorEvent interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing +FAIL MediaRecorderErrorEvent interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing +FAIL MediaRecorderErrorEvent interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing +FAIL MediaRecorderErrorEvent interface: attribute error assert_own_property: self does not have own property "MediaRecorderErrorEvent" expected property "MediaRecorderErrorEvent" missing +PASS Unscopable handled correctly for error property on MediaRecorderErrorEvent +FAIL MediaRecorderErrorEvent must be primary interface of undefined assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL Stringification of undefined assert_equals: wrong typeof object expected "object" but got "undefined" +FAIL MediaRecorderErrorEvent interface: undefined must inherit property "error" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined" Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness.window.js b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness.window.js index d367064b..3b794743 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness.window.js +++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-record/idlharness.window.js
@@ -7,7 +7,7 @@ idl_test( ['mediastream-recording'], - ['mediacapture-main', 'html', 'dom', 'FileAPI'], + ['mediacapture-streams', 'FileAPI', 'html', 'dom'], idl_array => { // Ignored errors will be surfaced in idlharness.js's test_object below. let recorder, blob, error;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/idlharness.https.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/idlharness.https.window-expected.txt index 3720cc1..e38ac83c 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/idlharness.https.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/mediacapture-streams/idlharness.https.window-expected.txt
@@ -187,5 +187,6 @@ PASS Navigator interface: navigator must inherit property "mediaDevices" with the proper type PASS Navigator interface: navigator must inherit property "getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback)" with the proper type PASS Navigator interface: calling getUserMedia(MediaStreamConstraints, NavigatorUserMediaSuccessCallback, NavigatorUserMediaErrorCallback) on navigator with too few arguments must throw TypeError +PASS WorkerNavigator interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/picture-in-picture/idlharness.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/picture-in-picture/idlharness.window-expected.txt index ed8f389..201b742 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/picture-in-picture/idlharness.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/picture-in-picture/idlharness.window-expected.txt
@@ -32,6 +32,7 @@ PASS HTMLVideoElement interface: video must inherit property "onenterpictureinpicture" with the proper type PASS HTMLVideoElement interface: video must inherit property "onleavepictureinpicture" with the proper type PASS HTMLVideoElement interface: video must inherit property "disablePictureInPicture" with the proper type +PASS WorkerGlobalScope interface: existence and properties of interface object PASS DocumentOrShadowRoot interface: document must inherit property "pictureInPictureElement" with the proper type PASS Document interface: attribute pictureInPictureEnabled PASS Unscopable handled correctly for pictureInPictureEnabled property on Document @@ -42,5 +43,7 @@ PASS Document interface: document must inherit property "pictureInPictureEnabled" with the proper type PASS Document interface: document must inherit property "exitPictureInPicture()" with the proper type PASS Document interface: document must inherit property "pictureInPictureElement" with the proper type +PASS ShadowRoot interface: attribute pictureInPictureElement +PASS Unscopable handled correctly for pictureInPictureElement property on ShadowRoot Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/pointerevents/idlharness.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/pointerevents/idlharness.window-expected.txt index 768dea4..33cf5ee 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/pointerevents/idlharness.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/pointerevents/idlharness.window-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 57 tests; 51 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 129 tests; 123 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS pointerevents interfaces PASS Partial interface Element: original interface defined PASS Partial interface GlobalEventHandlers: original interface defined @@ -42,6 +42,26 @@ PASS PointerEvent interface: new PointerEvent("type") must inherit property "twist" with the proper type PASS PointerEvent interface: new PointerEvent("type") must inherit property "pointerType" with the proper type PASS PointerEvent interface: new PointerEvent("type") must inherit property "isPrimary" with the proper type +PASS Document interface: attribute ongotpointercapture +PASS Unscopable handled correctly for ongotpointercapture property on Document +PASS Document interface: attribute onlostpointercapture +PASS Unscopable handled correctly for onlostpointercapture property on Document +PASS Document interface: attribute onpointerdown +PASS Unscopable handled correctly for onpointerdown property on Document +PASS Document interface: attribute onpointermove +PASS Unscopable handled correctly for onpointermove property on Document +PASS Document interface: attribute onpointerup +PASS Unscopable handled correctly for onpointerup property on Document +PASS Document interface: attribute onpointercancel +PASS Unscopable handled correctly for onpointercancel property on Document +PASS Document interface: attribute onpointerover +PASS Unscopable handled correctly for onpointerover property on Document +PASS Document interface: attribute onpointerout +PASS Unscopable handled correctly for onpointerout property on Document +PASS Document interface: attribute onpointerenter +PASS Unscopable handled correctly for onpointerenter property on Document +PASS Document interface: attribute onpointerleave +PASS Unscopable handled correctly for onpointerleave property on Document PASS Element interface: operation setPointerCapture(long) PASS Unscopable handled correctly for setPointerCapture(long) on Element PASS Element interface: operation releasePointerCapture(long) @@ -54,8 +74,60 @@ FAIL Element interface: calling releasePointerCapture(long) on document with too few arguments must throw TypeError assert_inherits: property "releasePointerCapture" not found in prototype chain FAIL Element interface: document must inherit property "hasPointerCapture(long)" with the proper type assert_inherits: property "hasPointerCapture" not found in prototype chain FAIL Element interface: calling hasPointerCapture(long) on document with too few arguments must throw TypeError assert_inherits: property "hasPointerCapture" not found in prototype chain +PASS HTMLElement interface: attribute ongotpointercapture +PASS Unscopable handled correctly for ongotpointercapture property on HTMLElement +PASS HTMLElement interface: attribute onlostpointercapture +PASS Unscopable handled correctly for onlostpointercapture property on HTMLElement +PASS HTMLElement interface: attribute onpointerdown +PASS Unscopable handled correctly for onpointerdown property on HTMLElement +PASS HTMLElement interface: attribute onpointermove +PASS Unscopable handled correctly for onpointermove property on HTMLElement +PASS HTMLElement interface: attribute onpointerup +PASS Unscopable handled correctly for onpointerup property on HTMLElement +PASS HTMLElement interface: attribute onpointercancel +PASS Unscopable handled correctly for onpointercancel property on HTMLElement +PASS HTMLElement interface: attribute onpointerover +PASS Unscopable handled correctly for onpointerover property on HTMLElement +PASS HTMLElement interface: attribute onpointerout +PASS Unscopable handled correctly for onpointerout property on HTMLElement +PASS HTMLElement interface: attribute onpointerenter +PASS Unscopable handled correctly for onpointerenter property on HTMLElement +PASS HTMLElement interface: attribute onpointerleave +PASS Unscopable handled correctly for onpointerleave property on HTMLElement +PASS Window interface: attribute ongotpointercapture +PASS Unscopable handled correctly for ongotpointercapture property on Window +PASS Window interface: attribute onlostpointercapture +PASS Unscopable handled correctly for onlostpointercapture property on Window +PASS Window interface: attribute onpointerdown +PASS Unscopable handled correctly for onpointerdown property on Window +PASS Window interface: attribute onpointermove +PASS Unscopable handled correctly for onpointermove property on Window +PASS Window interface: attribute onpointerup +PASS Unscopable handled correctly for onpointerup property on Window +PASS Window interface: attribute onpointercancel +PASS Unscopable handled correctly for onpointercancel property on Window +PASS Window interface: attribute onpointerover +PASS Unscopable handled correctly for onpointerover property on Window +PASS Window interface: attribute onpointerout +PASS Unscopable handled correctly for onpointerout property on Window +PASS Window interface: attribute onpointerenter +PASS Unscopable handled correctly for onpointerenter property on Window +PASS Window interface: attribute onpointerleave +PASS Unscopable handled correctly for onpointerleave property on Window +PASS Window interface: window must inherit property "ongotpointercapture" with the proper type +PASS Window interface: window must inherit property "onlostpointercapture" with the proper type +PASS Window interface: window must inherit property "onpointerdown" with the proper type +PASS Window interface: window must inherit property "onpointermove" with the proper type +PASS Window interface: window must inherit property "onpointerup" with the proper type +PASS Window interface: window must inherit property "onpointercancel" with the proper type +PASS Window interface: window must inherit property "onpointerover" with the proper type +PASS Window interface: window must inherit property "onpointerout" with the proper type +PASS Window interface: window must inherit property "onpointerenter" with the proper type +PASS Window interface: window must inherit property "onpointerleave" with the proper type PASS Navigator interface: attribute maxTouchPoints PASS Unscopable handled correctly for maxTouchPoints property on Navigator PASS Navigator interface: navigator must inherit property "maxTouchPoints" with the proper type +PASS WorkerGlobalScope interface: existence and properties of interface object +PASS WorkerNavigator interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/push-api/idlharness.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/push-api/idlharness.https.any.js index 65f933d7..7ed5e11 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/push-api/idlharness.https.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/push-api/idlharness.https.any.js
@@ -4,20 +4,19 @@ // https://w3c.github.io/push-api/ -promise_test(async () => { - const srcs = [ - 'push-api', - 'service-workers', - 'dom', - 'html' - ]; - const [idl, worker, dom, html] = await Promise.all( - srcs.map(i => fetch(`/interfaces/${i}.idl`).then(r => r.text()))); - - const idl_array = new IdlArray(); - idl_array.add_idls(idl); - idl_array.add_dependency_idls(worker); - idl_array.add_dependency_idls(dom); - idl_array.add_dependency_idls(html); - idl_array.test(); -}, 'push-api interfaces'); +idl_test( + ['push-api'], + ['service-workers', 'html', 'dom'], + idl_array => { + // TODO: ServiceWorkerRegistration objects + if ('ServiceWorkerGlobalScope' in self + && self instanceof ServiceWorkerGlobalScope) { + idl_array.add_objects({ + PushSubscriptionChangeEvent: [ + 'new PushSubscriptionChangeEvent("pushsubscriptionchange")' + ], + }) + } + }, + 'push-api interfaces' +);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js b/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js index 6f89a71..f021d47 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js +++ b/third_party/WebKit/LayoutTests/external/wpt/resources/idlharness.js
@@ -299,36 +299,57 @@ // Maps name -> [parsed_idl, ...] const skipped = new Map(); const process = function(parsed) { - let name = parsed.name - || parsed.type == "implements" && parsed.target - || parsed.type == "includes" && parsed.target; - if (!name || should_skip(name) || !all_deps.has(name)) { - name && - skipped.has(name) - ? skipped.get(name).push(parsed) - : skipped.set(name, [parsed]); - return; + var deps = []; + if (parsed.name) { + deps.push(parsed.name); + } else if (parsed.type === "implements") { + deps.push(parsed.target); + deps.push(parsed.implements); + } else if (parsed.type === "includes") { + deps.push(parsed.target); + deps.push(parsed.includes); } - new_options.only.push(name); - const follow_up = []; - for (const dep_type of ["inheritance", "implements", "includes"]) { - if (parsed[dep_type]) { - const dep = parsed[dep_type]; - new_options.only.push(dep); - all_deps.add(dep); - follow_up.push(dep); + deps = deps.filter(function(name) { + if (!name || should_skip(name) || !all_deps.has(name)) { + // Flag as skipped, if it's not already processed, so we can + // come back to it later if we retrospectively call it a dep. + if (name && !(name in this.members)) { + skipped.has(name) + ? skipped.get(name).push(parsed) + : skipped.set(name, [parsed]); + } + return false; } - } + return true; + }.bind(this)); - for (const deferred of follow_up) { - if (skipped.has(deferred)) { - const next = skipped.get(deferred); - skipped.delete(deferred); - next.forEach(process); + deps.forEach(function(name) { + new_options.only.push(name); + + const follow_up = new Set(); + for (const dep_type of ["inheritance", "implements", "includes"]) { + if (parsed[dep_type]) { + const inheriting = parsed[dep_type]; + const inheritor = parsed.name || parsed.target; + for (const dep of [inheriting, inheritor]) { + new_options.only.push(dep); + all_deps.add(dep); + follow_up.add(dep); + } + } } - } - } + + for (const deferred of follow_up) { + if (skipped.has(deferred)) { + const next = skipped.get(deferred); + skipped.delete(deferred); + next.forEach(process); + } + } + }); + }.bind(this); + for (let parsed of parsed_idls) { process(parsed); } @@ -370,8 +391,13 @@ parsed_idls.forEach(function(parsed_idl) { - if (parsed_idl.partial - && ["interface", "dictionary", "namespace"].includes(parsed_idl.type)) + var partial_types = [ + "interface", + "interface mixin", + "dictionary", + "namespace", + ]; + if (parsed_idl.partial && partial_types.includes(parsed_idl.type)) { if (should_skip(parsed_idl.name)) { @@ -3184,9 +3210,7 @@ deps = (deps instanceof Array) ? deps : [deps] || []; return Promise.all( srcs.concat(deps).map(function(spec) { - return fetch('/interfaces/' + spec + '.idl').then(function(r) { - return r.text(); - }); + return fetch_spec(spec); })) .then(function(idls) { for (var i = 0; i < srcs.length; i++) { @@ -3203,9 +3227,24 @@ }) .then(function() { idl_array.test(); }) .catch(function (reason) { - idl_array.test(); // Test what we can. + try { + idl_array.test(); // Test what we can. + } catch (e) { + // If testing fails hard here, the original setup error + // is more likely to be the real cause. + reason = reason || e; + } return Promise.reject(reason || 'IDL setup failed.'); }); }, test_name); } + +/** + * fetch_spec is a shorthand for a Promise that fetches the spec's content. + */ +function fetch_spec(spec) { + return fetch('/interfaces/' + spec + '.idl').then(function (r) { + return r.text(); + }); +} // vim: set expandtab shiftwidth=4 tabstop=4 foldmarker=@{,@} foldmethod=marker:
diff --git a/third_party/WebKit/LayoutTests/external/wpt/scroll-animations/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/scroll-animations/idlharness-expected.txt index 6362d973..d652f6b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/scroll-animations/idlharness-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/scroll-animations/idlharness-expected.txt
@@ -1,30 +1,4 @@ This is a testharness.js-based test. -PASS Test scroll-animations IDL implementation -PASS ScrollTimeline interface: existence and properties of interface object -PASS ScrollTimeline interface object length -PASS ScrollTimeline interface object name -PASS ScrollTimeline interface: existence and properties of interface prototype object -PASS ScrollTimeline interface: existence and properties of interface prototype object's "constructor" property -PASS ScrollTimeline interface: existence and properties of interface prototype object's @@unscopables property -PASS ScrollTimeline interface: attribute scrollSource -PASS Unscopable handled correctly for scrollSource property on ScrollTimeline -PASS ScrollTimeline interface: attribute orientation -PASS Unscopable handled correctly for orientation property on ScrollTimeline -FAIL ScrollTimeline interface: attribute startScrollOffset assert_true: The prototype object must have a property "startScrollOffset" expected true got false -PASS Unscopable handled correctly for startScrollOffset property on ScrollTimeline -FAIL ScrollTimeline interface: attribute endScrollOffset assert_true: The prototype object must have a property "endScrollOffset" expected true got false -PASS Unscopable handled correctly for endScrollOffset property on ScrollTimeline -PASS ScrollTimeline interface: attribute timeRange -PASS Unscopable handled correctly for timeRange property on ScrollTimeline -FAIL ScrollTimeline interface: attribute fill assert_true: The prototype object must have a property "fill" expected true got false -PASS Unscopable handled correctly for fill property on ScrollTimeline -FAIL ScrollTimeline must be primary interface of new ScrollTimeline() assert_equals: Unexpected exception when evaluating object expected null but got object "NotSupportedError: Failed to construct 'ScrollTimeline': 'auto' value for timeRange not yet supported" -FAIL Stringification of new ScrollTimeline() assert_equals: Unexpected exception when evaluating object expected null but got object "NotSupportedError: Failed to construct 'ScrollTimeline': 'auto' value for timeRange not yet supported" -FAIL ScrollTimeline interface: new ScrollTimeline() must inherit property "scrollSource" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "NotSupportedError: Failed to construct 'ScrollTimeline': 'auto' value for timeRange not yet supported" -FAIL ScrollTimeline interface: new ScrollTimeline() must inherit property "orientation" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "NotSupportedError: Failed to construct 'ScrollTimeline': 'auto' value for timeRange not yet supported" -FAIL ScrollTimeline interface: new ScrollTimeline() must inherit property "startScrollOffset" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "NotSupportedError: Failed to construct 'ScrollTimeline': 'auto' value for timeRange not yet supported" -FAIL ScrollTimeline interface: new ScrollTimeline() must inherit property "endScrollOffset" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "NotSupportedError: Failed to construct 'ScrollTimeline': 'auto' value for timeRange not yet supported" -FAIL ScrollTimeline interface: new ScrollTimeline() must inherit property "timeRange" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "NotSupportedError: Failed to construct 'ScrollTimeline': 'auto' value for timeRange not yet supported" -FAIL ScrollTimeline interface: new ScrollTimeline() must inherit property "fill" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "NotSupportedError: Failed to construct 'ScrollTimeline': 'auto' value for timeRange not yet supported" +FAIL Test scroll-animations IDL implementation promise_test: Unhandled rejection with value: "CSSPseudoElement includes Animatable, but CSSPseudoElement is undefined." Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/secure-contexts/idlharness.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/secure-contexts/idlharness.any-expected.txt index 13ebde2d9..d2c66ad 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/secure-contexts/idlharness.any-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/secure-contexts/idlharness.any-expected.txt
@@ -1,6 +1,7 @@ This is a testharness.js-based test. PASS Test IDL implementation of Secure Contexts PASS Partial interface WindowOrWorkerGlobalScope: original interface defined +PASS WorkerGlobalScope interface: existence and properties of interface object FAIL WindowOrWorkerGlobalScope interface: self must inherit property "isSecureContext" with the proper type assert_inherits: property "isSecureContext" found on object expected in prototype chain Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/idlharness.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/idlharness.window-expected.txt index 949a6b7..e90a1d8 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/selection/idlharness.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/selection/idlharness.window-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 99 tests; 93 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 108 tests; 102 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS selection-api interfaces PASS Partial interface Document: original interface defined PASS Partial interface Window: original interface defined @@ -87,7 +87,17 @@ PASS Selection interface: calling containsNode(Node, boolean) on getSelection() with too few arguments must throw TypeError PASS Document interface: operation getSelection() PASS Unscopable handled correctly for getSelection() on Document +PASS Document interface: attribute onselectstart +PASS Unscopable handled correctly for onselectstart property on Document +PASS Document interface: attribute onselectionchange +PASS Unscopable handled correctly for onselectionchange property on Document PASS Document interface: document must inherit property "getSelection()" with the proper type +PASS Document interface: document must inherit property "onselectstart" with the proper type +PASS Document interface: document must inherit property "onselectionchange" with the proper type +FAIL HTMLElement interface: attribute onselectstart assert_own_property: expected property "onselectstart" missing +PASS Unscopable handled correctly for onselectstart property on HTMLElement +FAIL HTMLElement interface: attribute onselectionchange assert_true: The prototype object must have a property "onselectionchange" expected true got false +PASS Unscopable handled correctly for onselectionchange property on HTMLElement PASS Window interface: operation getSelection() PASS Unscopable handled correctly for getSelection() on Window FAIL Window interface: attribute onselectstart assert_own_property: The global object must have a property "onselectstart" expected property "onselectstart" missing @@ -97,7 +107,6 @@ PASS Window interface: window must inherit property "getSelection()" with the proper type FAIL Window interface: window must inherit property "onselectstart" with the proper type assert_own_property: expected property "onselectstart" missing FAIL Window interface: window must inherit property "onselectionchange" with the proper type assert_own_property: expected property "onselectionchange" missing -FAIL GlobalEventHandlers interface: self must inherit property "onselectstart" with the proper type assert_inherits: property "onselectstart" not found in prototype chain -FAIL GlobalEventHandlers interface: self must inherit property "onselectionchange" with the proper type assert_inherits: property "onselectionchange" not found in prototype chain +PASS WorkerGlobalScope interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/idlharness.window.js b/third_party/WebKit/LayoutTests/external/wpt/selection/idlharness.window.js index d7b851d..7322a771 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/selection/idlharness.window.js +++ b/third_party/WebKit/LayoutTests/external/wpt/selection/idlharness.window.js
@@ -13,7 +13,6 @@ Window: ['window'], Document: ['document'], Selection: ['getSelection()'], - GlobalEventHandlers: ['self'], }); }, 'selection-api interfaces'
diff --git a/third_party/WebKit/LayoutTests/external/wpt/subresource-integrity/idlharness.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/subresource-integrity/idlharness.window-expected.txt new file mode 100644 index 0000000..e56b204 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/subresource-integrity/idlharness.window-expected.txt
@@ -0,0 +1,6 @@ +This is a testharness.js-based test. +FAIL webappsec-subresource-integrity interfaces promise_test: Unhandled rejection with value: "ProcessingInstruction implements LinkStyle, but ProcessingInstruction is undefined." +PASS Partial interface HTMLLinkElement: original interface defined +PASS Partial interface HTMLScriptElement: original interface defined +Harness: the test ran to completion. +
diff --git a/third_party/WebKit/LayoutTests/external/wpt/touch-events/idlharness.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/touch-events/idlharness.window-expected.txt index 3ec6ae3..c00cb94 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/touch-events/idlharness.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/touch-events/idlharness.window-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 115 tests; 99 PASS, 16 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 144 tests; 128 PASS, 16 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS Test IDL implementation of touch-events API PASS Partial interface GlobalEventHandlers: original interface defined PASS Partial interface Document: original interface defined @@ -99,10 +99,38 @@ PASS Unscopable handled correctly for createTouch(WindowProxy, EventTarget, long, double, double, double, double) on Document FAIL Document interface: operation createTouchList(Touch) assert_own_property: interface prototype object missing non-static operation expected property "createTouchList" missing PASS Unscopable handled correctly for createTouchList(Touch) on Document +PASS Document interface: attribute ontouchstart +PASS Unscopable handled correctly for ontouchstart property on Document +PASS Document interface: attribute ontouchend +PASS Unscopable handled correctly for ontouchend property on Document +PASS Document interface: attribute ontouchmove +PASS Unscopable handled correctly for ontouchmove property on Document +PASS Document interface: attribute ontouchcancel +PASS Unscopable handled correctly for ontouchcancel property on Document FAIL Document interface: document must inherit property "createTouch(WindowProxy, EventTarget, long, double, double, double, double)" with the proper type assert_inherits: property "createTouch" not found in prototype chain FAIL Document interface: calling createTouch(WindowProxy, EventTarget, long, double, double, double, double) on document with too few arguments must throw TypeError assert_inherits: property "createTouch" not found in prototype chain FAIL Document interface: document must inherit property "createTouchList(Touch)" with the proper type assert_inherits: property "createTouchList" not found in prototype chain FAIL Document interface: calling createTouchList(Touch) on document with too few arguments must throw TypeError assert_inherits: property "createTouchList" not found in prototype chain +PASS Document interface: document must inherit property "ontouchstart" with the proper type +PASS Document interface: document must inherit property "ontouchend" with the proper type +PASS Document interface: document must inherit property "ontouchmove" with the proper type +PASS Document interface: document must inherit property "ontouchcancel" with the proper type +PASS HTMLElement interface: attribute ontouchstart +PASS Unscopable handled correctly for ontouchstart property on HTMLElement +PASS HTMLElement interface: attribute ontouchend +PASS Unscopable handled correctly for ontouchend property on HTMLElement +PASS HTMLElement interface: attribute ontouchmove +PASS Unscopable handled correctly for ontouchmove property on HTMLElement +PASS HTMLElement interface: attribute ontouchcancel +PASS Unscopable handled correctly for ontouchcancel property on HTMLElement +PASS Window interface: attribute ontouchstart +PASS Unscopable handled correctly for ontouchstart property on Window +PASS Window interface: attribute ontouchend +PASS Unscopable handled correctly for ontouchend property on Window +PASS Window interface: attribute ontouchmove +PASS Unscopable handled correctly for ontouchmove property on Window +PASS Window interface: attribute ontouchcancel +PASS Unscopable handled correctly for ontouchcancel property on Window FAIL GlobalEventHandlers interface: window must inherit property "ontouchstart" with the proper type assert_inherits: property "ontouchstart" found on object expected in prototype chain FAIL GlobalEventHandlers interface: window must inherit property "ontouchend" with the proper type assert_inherits: property "ontouchend" found on object expected in prototype chain FAIL GlobalEventHandlers interface: window must inherit property "ontouchmove" with the proper type assert_inherits: property "ontouchmove" found on object expected in prototype chain @@ -115,5 +143,6 @@ PASS GlobalEventHandlers interface: document.body must inherit property "ontouchend" with the proper type PASS GlobalEventHandlers interface: document.body must inherit property "ontouchmove" with the proper type PASS GlobalEventHandlers interface: document.body must inherit property "ontouchcancel" with the proper type +PASS WorkerGlobalScope interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/idlharness.https.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/idlharness.https.window-expected.txt index c09eb3c..e27604e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/idlharness.https.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/idlharness.https.window-expected.txt
@@ -36,5 +36,6 @@ PASS Unscopable handled correctly for getWakeLock(WakeLockType) on Navigator FAIL Navigator interface: navigator must inherit property "getWakeLock(WakeLockType)" with the proper type assert_inherits: property "getWakeLock" not found in prototype chain FAIL Navigator interface: calling getWakeLock(WakeLockType) on navigator with too few arguments must throw TypeError assert_inherits: property "getWakeLock" not found in prototype chain +PASS WorkerNavigator interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/setting-the-target-effect-of-an-animation-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/setting-the-target-effect-of-an-animation-expected.txt index a87d0b0..14b1b43f 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/setting-the-target-effect-of-an-animation-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/setting-the-target-effect-of-an-animation-expected.txt
@@ -1,9 +1,11 @@ This is a testharness.js-based test. -FAIL If new effect is null and old effect is not null, we reset the pending tasks and ready promise is rejected assert_true: expected true got undefined +Harness Error. harness_status.status = 1 , harness_status.message = anim.updatePlaybackRate is not a function +FAIL If new effect is null and old effect is not null the animation becomes finish-pending assert_true: expected true got undefined FAIL If animation has a pending pause task, reschedule that task to run as soon as animation is ready. assert_true: expected true got undefined FAIL If animation has a pending play task, reschedule that task to run as soon as animation is ready to play new effect. assert_true: expected true got undefined +FAIL The pending play task should be rescheduled even after temporarily setting the effect to null assert_equals: expected "running" but got "pending" FAIL When setting the effect of an animation to the effect of an existing animation, the existing animation's target effect should be set to null. assert_equals: expected "finished" but got "idle" PASS After setting the target effect of animation to the target effect of an existing animation, the target effect's timing is updated to reflect the current time of the new animation. -FAIL Setting the target effect to null causes a pending playback rate to be applied anim.updatePlaybackRate is not a function +PASS Setting the target effect to null causes a pending playback rate to be applied Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/setting-the-target-effect-of-an-animation.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/setting-the-target-effect-of-an-animation.html index daa73f5..0bcff3bc9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/setting-the-target-effect-of-an-animation.html +++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/setting-the-target-effect-of-an-animation.html
@@ -15,21 +15,17 @@ 100 * MS_PER_SEC); assert_true(anim.pending); - const retPromise = anim.ready.then(() => { - assert_unreached('ready promise is fulfilled'); - }).catch(err => { - assert_equals(err.name, 'AbortError', - 'ready promise is rejected with AbortError'); + const originalReadyPromise = anim.ready.catch(err => { + assert_unreached('Original ready promise should not be rejected'); }); anim.effect = null; - // This is a bit odd, see: https://github.com/w3c/web-animations/issues/207 - assert_equals(anim.playState, 'paused'); - assert_false(anim.pending); + assert_equals(anim.playState, 'finished'); + assert_true(anim.pending); - return retPromise; -}, 'If new effect is null and old effect is not null, we reset the pending ' + - 'tasks and ready promise is rejected'); + return originalReadyPromise; +}, 'If new effect is null and old effect is not null the animation becomes' + + ' finish-pending'); promise_test(async t => { const anim = new Animation(); @@ -64,6 +60,30 @@ 'as soon as animation is ready to play new effect.'); promise_test(async t => { + const anim = createDiv(t).animate({ marginLeft: [ '0px', '100px' ] }, + 100 * MS_PER_SEC); + assert_equals(anim.playState, 'running'); + assert_true(anim.pending); + + const originalEffect = anim.effect; + const originalReadyPromise = anim.ready; + + anim.effect = null; + assert_equals(anim.playState, 'finished'); + assert_true(anim.pending); + + anim.effect = originalEffect; + assert_equals(anim.playState, 'running'); + assert_true(anim.pending); + + await originalReadyPromise; + + assert_equals(anim.playState, 'running'); + assert_false(anim.pending); +}, 'The pending play task should be rescheduled even after temporarily setting' + + ' the effect to null'); + +promise_test(async t => { const animA = createDiv(t).animate({ marginLeft: [ '0px', '100px' ] }, 100 * MS_PER_SEC); const animB = new Animation(); @@ -93,12 +113,14 @@ 'existing animation, the target effect\'s timing is updated to reflect ' + 'the current time of the new animation.'); -test(t => { +test(async t => { const anim = createDiv(t).animate(null, 100 * MS_PER_SEC); anim.updatePlaybackRate(2); assert_equals(anim.playbackRate, 1); anim.effect = null; + await anim.ready; + assert_equals(anim.playbackRate, 2); }, 'Setting the target effect to null causes a pending playback rate to be' + ' applied');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/timelines/document-timelines.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/timelines/document-timelines.html index bc3edff1..be8e3cc 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/timelines/document-timelines.html +++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/timelines/document-timelines.html
@@ -10,8 +10,8 @@ 'use strict'; async_test(t => { - assert_true(document.timeline.currentTime > 0, - 'The current time is initially is positive'); + assert_greater_than_equal(document.timeline.currentTime, 0, + 'The current time is initially is positive or zero'); // document.timeline.currentTime should be set even before document // load fires. We expect this code to be run before document load and hence // the above assertion is sufficient.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https.window-expected.txt index 5bdb954..98dc78dd 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https.window-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webaudio/idlharness.https.window-expected.txt
@@ -1281,5 +1281,6 @@ PASS AudioNode interface: worklet_node must inherit property "channelCountMode" with the proper type PASS AudioNode interface: worklet_node must inherit property "channelInterpretation" with the proper type PASS AudioWorkletProcessor interface: existence and properties of interface object +PASS WorkerGlobalScope interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-addTransceiver.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-addTransceiver.https-expected.txt index 43351af..b7b110aa 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-addTransceiver.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-addTransceiver.https-expected.txt
@@ -5,8 +5,8 @@ FAIL addTransceiver() with direction sendonly should have result transceiver.direction be the same Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument. FAIL addTransceiver() with direction inactive should have result transceiver.direction be the same Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument. PASS addTransceiver() with invalid direction should throw TypeError -FAIL addTransceiver(track) should have result with sender.track be given track Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument. -FAIL addTransceiver(track) multiple times should create multiple transceivers Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument. +FAIL addTransceiver(track) should have result with sender.track be given track promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument." +FAIL addTransceiver(track) multiple times should create multiple transceivers promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument." FAIL addTransceiver() with rid containing invalid non-alphanumeric characters should throw TypeError assert_throws: function "() => pc.addTransceiver('audio', { sendEncodings: [{
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-addTransceiver.https.html b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-addTransceiver.https.html index 347603ce..c0c5d782 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-addTransceiver.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-addTransceiver.https.html
@@ -3,16 +3,12 @@ <title>RTCPeerConnection.prototype.addTransceiver</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script src="RTCPeerConnection-helper.js"></script> <script> 'use strict'; // Test is based on the following editor draft: // https://rawgit.com/w3c/webrtc-pc/cc8d80f455b86c8041d63bceb8b457f45c72aa89/webrtc.html - // The following helper functions are called from RTCPeerConnection-helper.js: - // generateMediaStreamTrack() - /* 5.1. RTCPeerConnection Interface Extensions @@ -244,11 +240,13 @@ 5. If the first argument is a MediaStreamTrack , let it be track and let kind be track.kind. */ - test(t => { + promise_test(async t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); - const track = generateMediaStreamTrack('audio'); + const stream = await navigator.mediaDevices.getUserMedia({audio: true}); + t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); + const [track] = stream.getTracks(); const transceiver = pc.addTransceiver(track); const { sender, receiver } = transceiver; @@ -282,11 +280,13 @@ }, 'addTransceiver(track) should have result with sender.track be given track'); - test(t => { + promise_test(async t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); - const track = generateMediaStreamTrack('audio'); + const stream = await navigator.mediaDevices.getUserMedia({audio: true}); + t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); + const [track] = stream.getTracks(); const transceiver1 = pc.addTransceiver(track); const transceiver2 = pc.addTransceiver(track);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-helper.js b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-helper.js index 597170f..27ff187 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-helper.js +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-helper.js
@@ -330,30 +330,6 @@ } } -// Generate a MediaStreamTrack for testing use. -// We generate it by creating an anonymous RTCPeerConnection, -// call addTransceiver(), and use the remote track -// from RTCRtpReceiver. This track is supposed to -// receive media from a remote peer and be played locally. -// We use this approach instead of getUserMedia() -// to bypass the permission dialog and fake media devices, -// as well as being able to generate many unique tracks. -function generateMediaStreamTrack(kind) { - const pc = new RTCPeerConnection(); - - assert_idl_attribute(pc, 'addTransceiver', - 'Expect pc to have addTransceiver() method'); - - const transceiver = pc.addTransceiver(kind); - const { receiver } = transceiver; - const { track } = receiver; - - assert_true(track instanceof MediaStreamTrack, - 'Expect receiver track to be instance of MediaStreamTrack'); - - return track; -} - // These media tracks will be continually updated with deterministic "noise" in // order to ensure UAs do not cease transmission in response to apparent // silence.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-tracks.https.html b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-tracks.https.html index 91828f96..7179f1e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-tracks.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-tracks.https.html
@@ -85,6 +85,8 @@ getNoiseStream({audio: true}), getNoiseStream({audio: true}), ]); + t.add_cleanup(() => localStreams.forEach((stream) => + stream.getTracks().forEach((track) => track.stop()))); caller.addTrack(localStreams[0].getTracks()[0], localStreams[0]); caller.addTrack(localStreams[1].getTracks()[0], localStreams[0]); let ontrackEventsFired = 0; @@ -129,6 +131,8 @@ getNoiseStream({audio: true}), getNoiseStream({audio: true}), ]); + t.add_cleanup(() => localStreams.forEach((stream) => + stream.getTracks().forEach((track) => track.stop()))); caller.addTrack(localStreams[0].getTracks()[0], localStreams[0]); const remoteStreams = []; callee.ontrack = e => { @@ -161,6 +165,8 @@ getNoiseStream({audio: true}), getNoiseStream({audio: true}), ]); + t.add_cleanup(() => localStreams.forEach((stream) => + stream.getTracks().forEach((track) => track.stop()))); caller.addTrack(localStreams[0].getTracks()[0], localStreams[0]); const remoteStreams = []; callee.ontrack = e => { @@ -190,6 +196,8 @@ getNoiseStream({audio: true}), getNoiseStream({audio: true}), ]); + t.add_cleanup(() => localStreams.forEach((stream) => + stream.getTracks().forEach((track) => track.stop()))); caller.addTrack(localStreams[0].getTracks()[0], localStreams[0], localStreams[1]); const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https-expected.txt index c3d3875..090c43b 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https-expected.txt
@@ -17,7 +17,5 @@ PASS MediaStreamTrack interface: existence and properties of interface prototype object's @@unscopables property PASS MediaStreamTrack must be primary interface of idlTestObjects.mediaStreamTrack PASS Stringification of idlTestObjects.mediaStreamTrack -FAIL MediaStreamTrack must be primary interface of generateMediaStreamTrack('audio') assert_equals: Unexpected exception when evaluating object expected null but got object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument." -FAIL Stringification of generateMediaStreamTrack('audio') assert_equals: Unexpected exception when evaluating object expected null but got object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument." Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https.html b/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https.html index 0eefc90..a834f89 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/interfaces.https.html
@@ -11,7 +11,7 @@ // The following helper functions are called from RTCPeerConnection-helper.js: // generateAnswer() - // generateMediaStreamTrack() + // getNoiseStream() // Put the global IDL test objects under a parent object. // This allows easier search for the test cases when @@ -155,10 +155,7 @@ 'RTCIceTransport': ['idlTestObjects.iceTransport'], - // Test on both MediaStreamTrack from getUserMedia and transceiver - 'MediaStreamTrack': [ - `idlTestObjects.mediaStreamTrack`, - `generateMediaStreamTrack('audio')`] + 'MediaStreamTrack': ['idlTestObjects.mediaStreamTrack'] }); idlArray.test();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/idlharness.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/webusb/idlharness.https.any.js index d2e4ae8..e520200 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webusb/idlharness.https.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/idlharness.https.any.js
@@ -2,7 +2,6 @@ // META: script=/resources/idlharness.js // META: script=/webusb/resources/fake-devices.js // META: script=/webusb/resources/usb-helpers.js -// META: global=sharedworker 'use strict'; // Object instances used by the IDL test.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/idlharness.https.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webusb/idlharness.https.any.sharedworker-expected.txt deleted file mode 100644 index 3ecfb58..0000000 --- a/third_party/WebKit/LayoutTests/external/wpt/webusb/idlharness.https.any.sharedworker-expected.txt +++ /dev/null
@@ -1,322 +0,0 @@ -This is a testharness.js-based test. -PASS idlharness -PASS WebUSB IDL test -PASS Partial interface Navigator: original interface defined -PASS Partial interface Navigator: valid exposure set -PASS Partial interface WorkerNavigator: original interface defined -PASS Partial interface WorkerNavigator: valid exposure set -PASS USB interface: existence and properties of interface object -PASS USB interface object length -PASS USB interface object name -PASS USB interface: existence and properties of interface prototype object -PASS USB interface: existence and properties of interface prototype object's "constructor" property -PASS USB interface: existence and properties of interface prototype object's @@unscopables property -PASS USB interface: attribute onconnect -PASS Unscopable handled correctly for onconnect property on USB -PASS USB interface: attribute ondisconnect -PASS Unscopable handled correctly for ondisconnect property on USB -PASS USB interface: operation getDevices() -PASS Unscopable handled correctly for getDevices() on USB -PASS USB interface: member requestDevice -PASS USB must be primary interface of navigator.usb -PASS Stringification of navigator.usb -PASS USB interface: navigator.usb must inherit property "onconnect" with the proper type -PASS USB interface: navigator.usb must inherit property "ondisconnect" with the proper type -PASS USB interface: navigator.usb must inherit property "getDevices()" with the proper type -PASS USB interface: navigator.usb must not have property "requestDevice" -PASS USBConnectionEvent interface: existence and properties of interface object -PASS USBConnectionEvent interface object length -PASS USBConnectionEvent interface object name -PASS USBConnectionEvent interface: existence and properties of interface prototype object -PASS USBConnectionEvent interface: existence and properties of interface prototype object's "constructor" property -PASS USBConnectionEvent interface: existence and properties of interface prototype object's @@unscopables property -PASS USBConnectionEvent interface: attribute device -PASS Unscopable handled correctly for device property on USBConnectionEvent -PASS USBConnectionEvent must be primary interface of usbConnectionEvent -PASS Stringification of usbConnectionEvent -PASS USBConnectionEvent interface: usbConnectionEvent must inherit property "device" with the proper type -PASS USBDevice interface: existence and properties of interface object -PASS USBDevice interface object length -PASS USBDevice interface object name -PASS USBDevice interface: existence and properties of interface prototype object -PASS USBDevice interface: existence and properties of interface prototype object's "constructor" property -PASS USBDevice interface: existence and properties of interface prototype object's @@unscopables property -PASS USBDevice interface: attribute usbVersionMajor -PASS Unscopable handled correctly for usbVersionMajor property on USBDevice -PASS USBDevice interface: attribute usbVersionMinor -PASS Unscopable handled correctly for usbVersionMinor property on USBDevice -PASS USBDevice interface: attribute usbVersionSubminor -PASS Unscopable handled correctly for usbVersionSubminor property on USBDevice -PASS USBDevice interface: attribute deviceClass -PASS Unscopable handled correctly for deviceClass property on USBDevice -PASS USBDevice interface: attribute deviceSubclass -PASS Unscopable handled correctly for deviceSubclass property on USBDevice -PASS USBDevice interface: attribute deviceProtocol -PASS Unscopable handled correctly for deviceProtocol property on USBDevice -PASS USBDevice interface: attribute vendorId -PASS Unscopable handled correctly for vendorId property on USBDevice -PASS USBDevice interface: attribute productId -PASS Unscopable handled correctly for productId property on USBDevice -PASS USBDevice interface: attribute deviceVersionMajor -PASS Unscopable handled correctly for deviceVersionMajor property on USBDevice -PASS USBDevice interface: attribute deviceVersionMinor -PASS Unscopable handled correctly for deviceVersionMinor property on USBDevice -PASS USBDevice interface: attribute deviceVersionSubminor -PASS Unscopable handled correctly for deviceVersionSubminor property on USBDevice -PASS USBDevice interface: attribute manufacturerName -PASS Unscopable handled correctly for manufacturerName property on USBDevice -PASS USBDevice interface: attribute productName -PASS Unscopable handled correctly for productName property on USBDevice -PASS USBDevice interface: attribute serialNumber -PASS Unscopable handled correctly for serialNumber property on USBDevice -PASS USBDevice interface: attribute configuration -PASS Unscopable handled correctly for configuration property on USBDevice -PASS USBDevice interface: attribute configurations -PASS Unscopable handled correctly for configurations property on USBDevice -PASS USBDevice interface: attribute opened -PASS Unscopable handled correctly for opened property on USBDevice -PASS USBDevice interface: operation open() -PASS Unscopable handled correctly for open() on USBDevice -PASS USBDevice interface: operation close() -PASS Unscopable handled correctly for close() on USBDevice -PASS USBDevice interface: operation selectConfiguration(octet) -PASS Unscopable handled correctly for selectConfiguration(octet) on USBDevice -PASS USBDevice interface: operation claimInterface(octet) -PASS Unscopable handled correctly for claimInterface(octet) on USBDevice -PASS USBDevice interface: operation releaseInterface(octet) -PASS Unscopable handled correctly for releaseInterface(octet) on USBDevice -PASS USBDevice interface: operation selectAlternateInterface(octet, octet) -PASS Unscopable handled correctly for selectAlternateInterface(octet, octet) on USBDevice -PASS USBDevice interface: operation controlTransferIn(USBControlTransferParameters, unsigned short) -PASS Unscopable handled correctly for controlTransferIn(USBControlTransferParameters, unsigned short) on USBDevice -PASS USBDevice interface: operation controlTransferOut(USBControlTransferParameters, BufferSource) -PASS Unscopable handled correctly for controlTransferOut(USBControlTransferParameters, BufferSource) on USBDevice -PASS USBDevice interface: operation clearHalt(USBDirection, octet) -PASS Unscopable handled correctly for clearHalt(USBDirection, octet) on USBDevice -PASS USBDevice interface: operation transferIn(octet, unsigned long) -PASS Unscopable handled correctly for transferIn(octet, unsigned long) on USBDevice -PASS USBDevice interface: operation transferOut(octet, BufferSource) -PASS Unscopable handled correctly for transferOut(octet, BufferSource) on USBDevice -PASS USBDevice interface: operation isochronousTransferIn(octet, [object Object]) -PASS Unscopable handled correctly for isochronousTransferIn(octet, [object Object]) on USBDevice -PASS USBDevice interface: operation isochronousTransferOut(octet, BufferSource, [object Object]) -PASS Unscopable handled correctly for isochronousTransferOut(octet, BufferSource, [object Object]) on USBDevice -PASS USBDevice interface: operation reset() -PASS Unscopable handled correctly for reset() on USBDevice -PASS USBDevice must be primary interface of usbDevice -PASS Stringification of usbDevice -PASS USBDevice interface: usbDevice must inherit property "usbVersionMajor" with the proper type -PASS USBDevice interface: usbDevice must inherit property "usbVersionMinor" with the proper type -PASS USBDevice interface: usbDevice must inherit property "usbVersionSubminor" with the proper type -PASS USBDevice interface: usbDevice must inherit property "deviceClass" with the proper type -PASS USBDevice interface: usbDevice must inherit property "deviceSubclass" with the proper type -PASS USBDevice interface: usbDevice must inherit property "deviceProtocol" with the proper type -PASS USBDevice interface: usbDevice must inherit property "vendorId" with the proper type -PASS USBDevice interface: usbDevice must inherit property "productId" with the proper type -PASS USBDevice interface: usbDevice must inherit property "deviceVersionMajor" with the proper type -PASS USBDevice interface: usbDevice must inherit property "deviceVersionMinor" with the proper type -PASS USBDevice interface: usbDevice must inherit property "deviceVersionSubminor" with the proper type -PASS USBDevice interface: usbDevice must inherit property "manufacturerName" with the proper type -PASS USBDevice interface: usbDevice must inherit property "productName" with the proper type -PASS USBDevice interface: usbDevice must inherit property "serialNumber" with the proper type -PASS USBDevice interface: usbDevice must inherit property "configuration" with the proper type -PASS USBDevice interface: usbDevice must inherit property "configurations" with the proper type -PASS USBDevice interface: usbDevice must inherit property "opened" with the proper type -PASS USBDevice interface: usbDevice must inherit property "open()" with the proper type -PASS USBDevice interface: usbDevice must inherit property "close()" with the proper type -PASS USBDevice interface: usbDevice must inherit property "selectConfiguration(octet)" with the proper type -PASS USBDevice interface: calling selectConfiguration(octet) on usbDevice with too few arguments must throw TypeError -PASS USBDevice interface: usbDevice must inherit property "claimInterface(octet)" with the proper type -PASS USBDevice interface: calling claimInterface(octet) on usbDevice with too few arguments must throw TypeError -PASS USBDevice interface: usbDevice must inherit property "releaseInterface(octet)" with the proper type -PASS USBDevice interface: calling releaseInterface(octet) on usbDevice with too few arguments must throw TypeError -PASS USBDevice interface: usbDevice must inherit property "selectAlternateInterface(octet, octet)" with the proper type -PASS USBDevice interface: calling selectAlternateInterface(octet, octet) on usbDevice with too few arguments must throw TypeError -PASS USBDevice interface: usbDevice must inherit property "controlTransferIn(USBControlTransferParameters, unsigned short)" with the proper type -PASS USBDevice interface: calling controlTransferIn(USBControlTransferParameters, unsigned short) on usbDevice with too few arguments must throw TypeError -PASS USBDevice interface: usbDevice must inherit property "controlTransferOut(USBControlTransferParameters, BufferSource)" with the proper type -PASS USBDevice interface: calling controlTransferOut(USBControlTransferParameters, BufferSource) on usbDevice with too few arguments must throw TypeError -PASS USBDevice interface: usbDevice must inherit property "clearHalt(USBDirection, octet)" with the proper type -PASS USBDevice interface: calling clearHalt(USBDirection, octet) on usbDevice with too few arguments must throw TypeError -PASS USBDevice interface: usbDevice must inherit property "transferIn(octet, unsigned long)" with the proper type -PASS USBDevice interface: calling transferIn(octet, unsigned long) on usbDevice with too few arguments must throw TypeError -PASS USBDevice interface: usbDevice must inherit property "transferOut(octet, BufferSource)" with the proper type -PASS USBDevice interface: calling transferOut(octet, BufferSource) on usbDevice with too few arguments must throw TypeError -PASS USBDevice interface: usbDevice must inherit property "isochronousTransferIn(octet, [object Object])" with the proper type -PASS USBDevice interface: calling isochronousTransferIn(octet, [object Object]) on usbDevice with too few arguments must throw TypeError -PASS USBDevice interface: usbDevice must inherit property "isochronousTransferOut(octet, BufferSource, [object Object])" with the proper type -PASS USBDevice interface: calling isochronousTransferOut(octet, BufferSource, [object Object]) on usbDevice with too few arguments must throw TypeError -PASS USBDevice interface: usbDevice must inherit property "reset()" with the proper type -PASS USBInTransferResult interface: existence and properties of interface object -PASS USBInTransferResult interface object length -PASS USBInTransferResult interface object name -PASS USBInTransferResult interface: existence and properties of interface prototype object -PASS USBInTransferResult interface: existence and properties of interface prototype object's "constructor" property -PASS USBInTransferResult interface: existence and properties of interface prototype object's @@unscopables property -PASS USBInTransferResult interface: attribute data -PASS Unscopable handled correctly for data property on USBInTransferResult -PASS USBInTransferResult interface: attribute status -PASS Unscopable handled correctly for status property on USBInTransferResult -PASS USBInTransferResult must be primary interface of new USBInTransferResult("ok") -PASS Stringification of new USBInTransferResult("ok") -PASS USBInTransferResult interface: new USBInTransferResult("ok") must inherit property "data" with the proper type -PASS USBInTransferResult interface: new USBInTransferResult("ok") must inherit property "status" with the proper type -PASS USBOutTransferResult interface: existence and properties of interface object -PASS USBOutTransferResult interface object length -PASS USBOutTransferResult interface object name -PASS USBOutTransferResult interface: existence and properties of interface prototype object -PASS USBOutTransferResult interface: existence and properties of interface prototype object's "constructor" property -PASS USBOutTransferResult interface: existence and properties of interface prototype object's @@unscopables property -PASS USBOutTransferResult interface: attribute bytesWritten -PASS Unscopable handled correctly for bytesWritten property on USBOutTransferResult -PASS USBOutTransferResult interface: attribute status -PASS Unscopable handled correctly for status property on USBOutTransferResult -PASS USBOutTransferResult must be primary interface of new USBOutTransferResult("ok") -PASS Stringification of new USBOutTransferResult("ok") -PASS USBOutTransferResult interface: new USBOutTransferResult("ok") must inherit property "bytesWritten" with the proper type -PASS USBOutTransferResult interface: new USBOutTransferResult("ok") must inherit property "status" with the proper type -PASS USBIsochronousInTransferPacket interface: existence and properties of interface object -PASS USBIsochronousInTransferPacket interface object length -PASS USBIsochronousInTransferPacket interface object name -PASS USBIsochronousInTransferPacket interface: existence and properties of interface prototype object -PASS USBIsochronousInTransferPacket interface: existence and properties of interface prototype object's "constructor" property -PASS USBIsochronousInTransferPacket interface: existence and properties of interface prototype object's @@unscopables property -PASS USBIsochronousInTransferPacket interface: attribute data -PASS Unscopable handled correctly for data property on USBIsochronousInTransferPacket -PASS USBIsochronousInTransferPacket interface: attribute status -PASS Unscopable handled correctly for status property on USBIsochronousInTransferPacket -PASS USBIsochronousInTransferPacket must be primary interface of new USBIsochronousInTransferPacket("ok") -PASS Stringification of new USBIsochronousInTransferPacket("ok") -PASS USBIsochronousInTransferPacket interface: new USBIsochronousInTransferPacket("ok") must inherit property "data" with the proper type -PASS USBIsochronousInTransferPacket interface: new USBIsochronousInTransferPacket("ok") must inherit property "status" with the proper type -PASS USBIsochronousInTransferResult interface: existence and properties of interface object -PASS USBIsochronousInTransferResult interface object length -PASS USBIsochronousInTransferResult interface object name -PASS USBIsochronousInTransferResult interface: existence and properties of interface prototype object -PASS USBIsochronousInTransferResult interface: existence and properties of interface prototype object's "constructor" property -PASS USBIsochronousInTransferResult interface: existence and properties of interface prototype object's @@unscopables property -PASS USBIsochronousInTransferResult interface: attribute data -PASS Unscopable handled correctly for data property on USBIsochronousInTransferResult -PASS USBIsochronousInTransferResult interface: attribute packets -PASS Unscopable handled correctly for packets property on USBIsochronousInTransferResult -PASS USBIsochronousInTransferResult must be primary interface of new USBIsochronousInTransferResult([]) -PASS Stringification of new USBIsochronousInTransferResult([]) -PASS USBIsochronousInTransferResult interface: new USBIsochronousInTransferResult([]) must inherit property "data" with the proper type -PASS USBIsochronousInTransferResult interface: new USBIsochronousInTransferResult([]) must inherit property "packets" with the proper type -PASS USBIsochronousOutTransferPacket interface: existence and properties of interface object -PASS USBIsochronousOutTransferPacket interface object length -PASS USBIsochronousOutTransferPacket interface object name -PASS USBIsochronousOutTransferPacket interface: existence and properties of interface prototype object -PASS USBIsochronousOutTransferPacket interface: existence and properties of interface prototype object's "constructor" property -PASS USBIsochronousOutTransferPacket interface: existence and properties of interface prototype object's @@unscopables property -PASS USBIsochronousOutTransferPacket interface: attribute bytesWritten -PASS Unscopable handled correctly for bytesWritten property on USBIsochronousOutTransferPacket -PASS USBIsochronousOutTransferPacket interface: attribute status -PASS Unscopable handled correctly for status property on USBIsochronousOutTransferPacket -PASS USBIsochronousOutTransferPacket must be primary interface of new USBIsochronousOutTransferPacket("ok") -PASS Stringification of new USBIsochronousOutTransferPacket("ok") -PASS USBIsochronousOutTransferPacket interface: new USBIsochronousOutTransferPacket("ok") must inherit property "bytesWritten" with the proper type -PASS USBIsochronousOutTransferPacket interface: new USBIsochronousOutTransferPacket("ok") must inherit property "status" with the proper type -PASS USBIsochronousOutTransferResult interface: existence and properties of interface object -PASS USBIsochronousOutTransferResult interface object length -PASS USBIsochronousOutTransferResult interface object name -PASS USBIsochronousOutTransferResult interface: existence and properties of interface prototype object -PASS USBIsochronousOutTransferResult interface: existence and properties of interface prototype object's "constructor" property -PASS USBIsochronousOutTransferResult interface: existence and properties of interface prototype object's @@unscopables property -PASS USBIsochronousOutTransferResult interface: attribute packets -PASS Unscopable handled correctly for packets property on USBIsochronousOutTransferResult -PASS USBIsochronousOutTransferResult must be primary interface of new USBIsochronousOutTransferResult([]) -PASS Stringification of new USBIsochronousOutTransferResult([]) -PASS USBIsochronousOutTransferResult interface: new USBIsochronousOutTransferResult([]) must inherit property "packets" with the proper type -PASS USBConfiguration interface: existence and properties of interface object -PASS USBConfiguration interface object length -PASS USBConfiguration interface object name -PASS USBConfiguration interface: existence and properties of interface prototype object -PASS USBConfiguration interface: existence and properties of interface prototype object's "constructor" property -PASS USBConfiguration interface: existence and properties of interface prototype object's @@unscopables property -PASS USBConfiguration interface: attribute configurationValue -PASS Unscopable handled correctly for configurationValue property on USBConfiguration -PASS USBConfiguration interface: attribute configurationName -PASS Unscopable handled correctly for configurationName property on USBConfiguration -PASS USBConfiguration interface: attribute interfaces -PASS Unscopable handled correctly for interfaces property on USBConfiguration -PASS USBConfiguration must be primary interface of usbConfiguration -PASS Stringification of usbConfiguration -PASS USBConfiguration interface: usbConfiguration must inherit property "configurationValue" with the proper type -PASS USBConfiguration interface: usbConfiguration must inherit property "configurationName" with the proper type -PASS USBConfiguration interface: usbConfiguration must inherit property "interfaces" with the proper type -PASS USBInterface interface: existence and properties of interface object -PASS USBInterface interface object length -PASS USBInterface interface object name -PASS USBInterface interface: existence and properties of interface prototype object -PASS USBInterface interface: existence and properties of interface prototype object's "constructor" property -PASS USBInterface interface: existence and properties of interface prototype object's @@unscopables property -PASS USBInterface interface: attribute interfaceNumber -PASS Unscopable handled correctly for interfaceNumber property on USBInterface -PASS USBInterface interface: attribute alternate -PASS Unscopable handled correctly for alternate property on USBInterface -PASS USBInterface interface: attribute alternates -PASS Unscopable handled correctly for alternates property on USBInterface -PASS USBInterface interface: attribute claimed -PASS Unscopable handled correctly for claimed property on USBInterface -PASS USBInterface must be primary interface of usbInterface -PASS Stringification of usbInterface -PASS USBInterface interface: usbInterface must inherit property "interfaceNumber" with the proper type -PASS USBInterface interface: usbInterface must inherit property "alternate" with the proper type -PASS USBInterface interface: usbInterface must inherit property "alternates" with the proper type -PASS USBInterface interface: usbInterface must inherit property "claimed" with the proper type -PASS USBAlternateInterface interface: existence and properties of interface object -PASS USBAlternateInterface interface object length -PASS USBAlternateInterface interface object name -PASS USBAlternateInterface interface: existence and properties of interface prototype object -PASS USBAlternateInterface interface: existence and properties of interface prototype object's "constructor" property -PASS USBAlternateInterface interface: existence and properties of interface prototype object's @@unscopables property -PASS USBAlternateInterface interface: attribute alternateSetting -PASS Unscopable handled correctly for alternateSetting property on USBAlternateInterface -PASS USBAlternateInterface interface: attribute interfaceClass -PASS Unscopable handled correctly for interfaceClass property on USBAlternateInterface -PASS USBAlternateInterface interface: attribute interfaceSubclass -PASS Unscopable handled correctly for interfaceSubclass property on USBAlternateInterface -PASS USBAlternateInterface interface: attribute interfaceProtocol -PASS Unscopable handled correctly for interfaceProtocol property on USBAlternateInterface -PASS USBAlternateInterface interface: attribute interfaceName -PASS Unscopable handled correctly for interfaceName property on USBAlternateInterface -PASS USBAlternateInterface interface: attribute endpoints -PASS Unscopable handled correctly for endpoints property on USBAlternateInterface -PASS USBAlternateInterface must be primary interface of usbAlternateInterface -PASS Stringification of usbAlternateInterface -PASS USBAlternateInterface interface: usbAlternateInterface must inherit property "alternateSetting" with the proper type -PASS USBAlternateInterface interface: usbAlternateInterface must inherit property "interfaceClass" with the proper type -PASS USBAlternateInterface interface: usbAlternateInterface must inherit property "interfaceSubclass" with the proper type -PASS USBAlternateInterface interface: usbAlternateInterface must inherit property "interfaceProtocol" with the proper type -PASS USBAlternateInterface interface: usbAlternateInterface must inherit property "interfaceName" with the proper type -PASS USBAlternateInterface interface: usbAlternateInterface must inherit property "endpoints" with the proper type -PASS USBEndpoint interface: existence and properties of interface object -PASS USBEndpoint interface object length -PASS USBEndpoint interface object name -PASS USBEndpoint interface: existence and properties of interface prototype object -PASS USBEndpoint interface: existence and properties of interface prototype object's "constructor" property -PASS USBEndpoint interface: existence and properties of interface prototype object's @@unscopables property -PASS USBEndpoint interface: attribute endpointNumber -PASS Unscopable handled correctly for endpointNumber property on USBEndpoint -PASS USBEndpoint interface: attribute direction -PASS Unscopable handled correctly for direction property on USBEndpoint -PASS USBEndpoint interface: attribute type -PASS Unscopable handled correctly for type property on USBEndpoint -PASS USBEndpoint interface: attribute packetSize -PASS Unscopable handled correctly for packetSize property on USBEndpoint -PASS USBEndpoint must be primary interface of usbEndpoint -PASS Stringification of usbEndpoint -PASS USBEndpoint interface: usbEndpoint must inherit property "endpointNumber" with the proper type -PASS USBEndpoint interface: usbEndpoint must inherit property "direction" with the proper type -PASS USBEndpoint interface: usbEndpoint must inherit property "type" with the proper type -PASS USBEndpoint interface: usbEndpoint must inherit property "packetSize" with the proper type -PASS USBPermissionResult interface: existence and properties of interface object -PASS Navigator interface: existence and properties of interface object -FAIL Navigator interface: navigator must not have property "usb" assert_false: expected false got true -PASS WorkerNavigator interface: attribute usb -PASS Unscopable handled correctly for usb property on WorkerNavigator -PASS WorkerNavigator interface: navigator must inherit property "usb" with the proper type -FAIL PermissionStatus interface: existence and properties of interface object assert_false: expected false got true -Harness: the test ran to completion. -
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/insecure-context.any.js b/third_party/WebKit/LayoutTests/external/wpt/webusb/insecure-context.any.js index 42452b53..9627389 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webusb/insecure-context.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/insecure-context.any.js
@@ -1,4 +1,3 @@ -// META: global=sharedworker 'use strict'; test(() => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/usb.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/webusb/usb.https.any.js index 844cb32b..109c82a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webusb/usb.https.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/usb.https.any.js
@@ -1,6 +1,5 @@ // META: script=/webusb/resources/fake-devices.js // META: script=/webusb/resources/usb-helpers.js -// META: global=sharedworker 'use strict'; let usbDevice, devicesFirstTime, fakeDevice, removedDevice; @@ -47,4 +46,4 @@ error => assert_equals(error.code, DOMException.NOT_FOUND_ERR)), 'ondisconnect event is triggered by removing a device'); -done(); \ No newline at end of file +done();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbConnectionEvent.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbConnectionEvent.https.any.js index 62c5672..9d4f60a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbConnectionEvent.https.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbConnectionEvent.https.any.js
@@ -1,6 +1,5 @@ // META: script=/webusb/resources/fake-devices.js // META: script=/webusb/resources/usb-helpers.js -// META: global=sharedworker 'use strict';
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbDevice.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbDevice.https.any.js index d64fd65..da7df08 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbDevice.https.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbDevice.https.any.js
@@ -1,6 +1,5 @@ // META: script=/webusb/resources/fake-devices.js // META: script=/webusb/resources/usb-helpers.js -// META: global=sharedworker 'use strict'; function assertRejectsWithNotFoundError(promise) {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbInTransferResult.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbInTransferResult.https.any.js index 50f1eaa1..4cdb58e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbInTransferResult.https.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbInTransferResult.https.any.js
@@ -1,6 +1,5 @@ // META: script=/webusb/resources/fake-devices.js // META: script=/webusb/resources/usb-helpers.js -// META: global=sharedworker 'use strict'; test(t => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferPacket.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferPacket.https.any.js index 4a17547f..ee992f9 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferPacket.https.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferPacket.https.any.js
@@ -1,4 +1,3 @@ -// META: global=sharedworker 'use strict'; test(t => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferResult.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferResult.https.any.js index 8b68f13d..25c128a 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferResult.https.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousInTransferResult.https.any.js
@@ -1,4 +1,3 @@ -// META: global=sharedworker 'use strict'; test(t => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousOutTransferPacket.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousOutTransferPacket.https.any.js index edef6a6..d99c8565 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousOutTransferPacket.https.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousOutTransferPacket.https.any.js
@@ -1,4 +1,3 @@ -// META: global=sharedworker 'use strict'; test(t => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousOutTransferResult.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousOutTransferResult.https.any.js index d196a2a0..13b9432 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousOutTransferResult.https.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbIsochronousOutTransferResult.https.any.js
@@ -1,4 +1,3 @@ -// META: global=sharedworker 'use strict'; test(t => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbOutTransferResult.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbOutTransferResult.https.any.js index 4405a004..f880a43e 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webusb/usbOutTransferResult.https.any.js +++ b/third_party/WebKit/LayoutTests/external/wpt/webusb/usbOutTransferResult.https.any.js
@@ -1,4 +1,3 @@ -// META: global=sharedworker 'use strict'; test(t => {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webxr/interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webxr/interfaces.https-expected.txt index 44bae2a..34bbbfd3 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webxr/interfaces.https-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/webxr/interfaces.https-expected.txt
@@ -2,9 +2,7 @@ PASS Test IDL implementation of WebXR API PASS Partial interface Navigator: original interface defined PASS Partial dictionary WebGLContextAttributes: original dictionary defined -PASS Navigator interface: attribute xr -PASS Unscopable handled correctly for xr property on Navigator -PASS Navigator interface: navigator must inherit property "xr" with the proper type +PASS Partial interface mixin WebGLRenderingContextBase: original interface mixin defined PASS XR interface: existence and properties of interface object PASS XR interface object length PASS XR interface object name @@ -199,5 +197,12 @@ FAIL XRCoordinateSystemEvent interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "XRCoordinateSystemEvent" expected property "XRCoordinateSystemEvent" missing FAIL XRCoordinateSystemEvent interface: attribute coordinateSystem assert_own_property: self does not have own property "XRCoordinateSystemEvent" expected property "XRCoordinateSystemEvent" missing PASS Unscopable handled correctly for coordinateSystem property on XRCoordinateSystemEvent +PASS WebGLRenderingContext interface: operation setCompatibleXRDevice(XRDevice) +PASS Unscopable handled correctly for setCompatibleXRDevice(XRDevice) on WebGLRenderingContext +PASS Navigator interface: attribute xr +PASS Unscopable handled correctly for xr property on Navigator +PASS Navigator interface: navigator must inherit property "xr" with the proper type +PASS WorkerGlobalScope interface: existence and properties of interface object +PASS WorkerNavigator interface: existence and properties of interface object Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webxr/interfaces.https.html b/third_party/WebKit/LayoutTests/external/wpt/webxr/interfaces.https.html index 385f835..65b2a853 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/webxr/interfaces.https.html +++ b/third_party/WebKit/LayoutTests/external/wpt/webxr/interfaces.https.html
@@ -9,18 +9,13 @@ <script> "use strict"; -promise_test(async () => { - const idl_array = new IdlArray(); - const dom_idl = await fetch("/interfaces/dom.idl").then(r => r.text()); - const webxr_idl = await fetch("/interfaces/webxr.idl").then(r => r.text()); - - idl_array.add_untested_idls(dom_idl); - idl_array.add_untested_idls("interface Navigator {};"); - idl_array.add_idls(webxr_idl); - idl_array.add_idls("dictionary WebGLContextAttributes {};"); - idl_array.add_objects({ - Navigator:['navigator'], - }); - idl_array.test(); -}, "Test IDL implementation of WebXR API"); +idl_test( + ['webxr'], + ['webgl1', 'html', 'dom'], + idl_array => { + idl_array.add_objects({ + Navigator:['navigator'], + }); + }, + 'Test IDL implementation of WebXR API'); </script>
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLAreaElement/area-download-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLAreaElement/area-download-expected.txt index b31556a3..3ab11a58 100644 --- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLAreaElement/area-download-expected.txt +++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/dom/HTMLAreaElement/area-download-expected.txt
@@ -1,2 +1,2 @@ -Downloading URL with suggested filename "foo" +Download started
diff --git a/third_party/WebKit/LayoutTests/fragmentation/outline-crossing-columns-expected.txt b/third_party/WebKit/LayoutTests/fragmentation/outline-crossing-columns-expected.txt new file mode 100644 index 0000000..3c02375 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fragmentation/outline-crossing-columns-expected.txt
@@ -0,0 +1,31 @@ +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 3116 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 785x3116 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x3116 + LayoutBlockFlow {BODY} at (8,8) size 769x3100 + LayoutBlockFlow {DIV} at (0,100) size 10x3000 +layer at (8,8) size 250x100 + LayoutBlockFlow {DIV} at (0,0) size 250x100 + LayoutMultiColumnSet (anonymous) at (0,0) size 250x71 +layer at (8,8) size 117x142 backgroundClip at (0,0) size 133x79 clip at (0,0) size 133x79 + LayoutMultiColumnFlowThread (anonymous) at (0,0) size 117x142 + LayoutBlockFlow {DIV} at (0,0) size 30x30 + LayoutBlockFlow (anonymous) at (0,71) size 117x71 + LayoutText {#text} at (0,0) size 0x0 +layer at (8,79) size 43x70 backgroundClip at (3,74) size 53x5 clip at (0,0) size 0x0 scrollHeight 85 + LayoutListBox {SELECT} at (0,0) size 43x70 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {OPTION} at (1,1) size 26x17 + LayoutText {#text} at (2,0) size 22x16 + text run at (2,0) width 22: "test" + LayoutBlockFlow {OPTION} at (1,18) size 26x17 + LayoutText {#text} at (2,0) size 22x16 + text run at (2,0) width 22: "test" + LayoutBlockFlow {OPTION} at (1,35) size 26x17 + LayoutText {#text} at (2,0) size 22x16 + text run at (2,0) width 22: "test" + LayoutBlockFlow {OPTION} at (1,52) size 26x17 + LayoutText {#text} at (2,0) size 22x16 + text run at (2,0) width 22: "test" + LayoutBlockFlow {OPTION} at (1,69) size 26x17 + LayoutText {#text} at (2,0) size 22x16 + text run at (2,0) width 22: "test"
diff --git a/third_party/WebKit/LayoutTests/fragmentation/outline-crossing-columns.html b/third_party/WebKit/LayoutTests/fragmentation/outline-crossing-columns.html new file mode 100644 index 0000000..2f48c05 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fragmentation/outline-crossing-columns.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<div style="columns: 2; width: 250px; height: 100px"> + <div style="width: 30px; height: 30px"></div> + <select multiple style="outline: 5px solid green"> + <option>test</option> + <option>test</option> + <option>test</option> + <option>test</option> + <option>test</option> + </select> +</div> +<div style="width: 10px; height: 3000px"></div> +
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/5232159-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/5232159-expected.png index 8e630d45..72535aa 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/5232159-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/5232159-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/5232159-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/5232159-expected.txt index bce4d68..74af508 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/5232159-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/5232159-expected.txt
@@ -9,19 +9,22 @@ text run at (0,20) width 564: "clicking somewhere in the first sentence of the paragraph below and dragging downward." layer at (0,60) size 800x540 LayoutBlockFlow (positioned) {DIV} at (0,60) size 800x540 -layer at (0,60) size 800x100 - LayoutBlockFlow (positioned) {DIV} at (0,0) size 800x100 - LayoutBlockFlow {DIV} at (11,0) size 778x100 - LayoutText {#text} at (0,0) size 46x19 - text run at (0,0) width 46: "Lorem " - LayoutInline {SPAN} at (0,0) size 38x19 - LayoutText {#text} at (46,0) size 38x19 - text run at (46,0) width 38: "ipsum" - LayoutText {#text} at (84,0) size 754x99 - text run at (84,0) width 670: " dolor sit amet, consectetuer adipiscing elit. Integer vehicula accumsan massa. Quisque elementum. Cras id" - text run at (0,20) width 724: "neque a mi rutrum scelerisque. Nulla sed dui a massa sodales posuere. Nulla libero. Nulla posuere, felis id tincidunt" - text run at (0,40) width 740: "tincidunt, ipsum metus tristique risus, et convallis turpis elit eget massa. Nunc consectetuer dolor vel nunc. Cum sociis" - text run at (0,60) width 753: "natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque dapibus ante et nulla. Cras nec velit." - text run at (0,80) width 642: "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer ut tortor." -selection start: position 3 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of child 1 {DIV} of child 3 {DIV} of body -selection end: position 236 of child 2 {#text} of child 1 {DIV} of child 1 {DIV} of child 3 {DIV} of body +layer at (0,60) size 800x80 + LayoutBlockFlow (positioned) {DIV} at (0,0) size 800x80 + LayoutBlockFlow {DIV} at (11,0) size 778x80 + LayoutText {#text} at (0,0) size 60x10 + text run at (0,0) width 60: "Lorem " + LayoutInline {SPAN} at (0,0) size 50x10 + LayoutText {#text} at (60,0) size 50x10 + text run at (60,0) width 50: "ipsum" + LayoutText {#text} at (110,0) size 770x80 + text run at (110,0) width 630: " dolor sit amet, consectetuer adipiscing elit. Integer vehicula" + text run at (0,10) width 730: "accumsan massa. Quisque elementum. Cras id neque a mi rutrum scelerisque." + text run at (0,20) width 760: "Nulla sed dui a massa sodales posuere. Nulla libero. Nulla posuere, felis id" + text run at (0,30) width 740: "tincidunt tincidunt, ipsum metus tristique risus, et convallis turpis elit" + text run at (0,40) width 770: "eget massa. Nunc consectetuer dolor vel nunc. Cum sociis natoque penatibus et" + text run at (0,50) width 770: "magnis dis parturient montes, nascetur ridiculus mus. Quisque dapibus ante et" + text run at (0,60) width 750: "nulla. Cras nec velit. Vestibulum ante ipsum primis in faucibus orci luctus" + text run at (0,70) width 530: "et ultrices posuere cubilia Curae; Integer ut tortor." +selection start: position 2 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of child 1 {DIV} of child 3 {DIV} of body +selection end: position 223 of child 2 {#text} of child 1 {DIV} of child 1 {DIV} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fragmentation/outline-crossing-columns-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fragmentation/outline-crossing-columns-expected.png new file mode 100644 index 0000000..da42e7f --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/fragmentation/outline-crossing-columns-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.png b/third_party/WebKit/LayoutTests/platform/linux/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.png new file mode 100644 index 0000000..da42e7f --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/linux/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fragmentation/outline-crossing-columns-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fragmentation/outline-crossing-columns-expected.png new file mode 100644 index 0000000..3aadb29 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fragmentation/outline-crossing-columns-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fragmentation/outline-crossing-columns-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fragmentation/outline-crossing-columns-expected.txt new file mode 100644 index 0000000..ac358d3 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/fragmentation/outline-crossing-columns-expected.txt
@@ -0,0 +1,31 @@ +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 3116 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 785x3116 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x3116 + LayoutBlockFlow {BODY} at (8,8) size 769x3100 + LayoutBlockFlow {DIV} at (0,100) size 10x3000 +layer at (8,8) size 250x100 + LayoutBlockFlow {DIV} at (0,0) size 250x100 + LayoutMultiColumnSet (anonymous) at (0,0) size 250x58.75 +layer at (8,8) size 117x118 backgroundClip at (0,0) size 133x67 clip at (0,0) size 133x67 + LayoutMultiColumnFlowThread (anonymous) at (0,0) size 117x117.50 + LayoutBlockFlow {DIV} at (0,0) size 30x30 + LayoutBlockFlow (anonymous) at (0,58.75) size 117x58.75 + LayoutText {#text} at (0,0) size 0x0 +layer at (8,67) size 36x59 backgroundClip at (3,62) size 46x5 clip at (0,0) size 0x0 scrollHeight 71 + LayoutListBox {SELECT} at (0,0) size 35.64x58.75 [bgcolor=#FFFFFF] [border: (1px solid #999999)] + LayoutBlockFlow {OPTION} at (1,1) size 22.64x14.19 + LayoutText {#text} at (2,0) size 19x13 + text run at (2,0) width 19: "test" + LayoutBlockFlow {OPTION} at (1,15.19) size 22.64x14.19 + LayoutText {#text} at (2,0) size 19x13 + text run at (2,0) width 19: "test" + LayoutBlockFlow {OPTION} at (1,29.38) size 22.64x14.19 + LayoutText {#text} at (2,0) size 19x13 + text run at (2,0) width 19: "test" + LayoutBlockFlow {OPTION} at (1,43.56) size 22.64x14.19 + LayoutText {#text} at (2,0) size 19x13 + text run at (2,0) width 19: "test" + LayoutBlockFlow {OPTION} at (1,57.75) size 22.64x14.19 + LayoutText {#text} at (2,0) size 19x13 + text run at (2,0) width 19: "test"
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.png new file mode 100644 index 0000000..3aadb29 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.txt new file mode 100644 index 0000000..1db9f45e --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.txt
@@ -0,0 +1,31 @@ +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 3116 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 785x3116 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutNGBlockFlow {HTML} at (0,0) size 785x3116 + LayoutNGBlockFlow {BODY} at (8,8) size 769x3100 + LayoutNGBlockFlow {DIV} at (0,100) size 10x3000 +layer at (8,8) size 250x100 + LayoutNGBlockFlow {DIV} at (0,0) size 250x100 + LayoutMultiColumnSet (anonymous) at (0,0) size 250x58.75 +layer at (8,8) size 117x118 backgroundClip at (0,0) size 133x67 clip at (0,0) size 133x67 + LayoutMultiColumnFlowThread (anonymous) at (0,0) size 117x117.50 + LayoutNGBlockFlow {DIV} at (0,0) size 30x30 + LayoutNGBlockFlow (anonymous) at (0,58.75) size 117x58.75 + LayoutText {#text} at (0,0) size 0x0 +layer at (8,67) size 36x59 backgroundClip at (3,62) size 46x5 clip at (0,0) size 0x0 scrollHeight 71 + LayoutListBox {SELECT} at (0,0) size 35.64x58.75 [bgcolor=#FFFFFF] [border: (1px solid #999999)] + LayoutBlockFlow {OPTION} at (1,1) size 22.64x14.19 + LayoutText {#text} at (2,0) size 19x13 + text run at (2,0) width 19: "test" + LayoutBlockFlow {OPTION} at (1,15.19) size 22.64x14.19 + LayoutText {#text} at (2,0) size 19x13 + text run at (2,0) width 19: "test" + LayoutBlockFlow {OPTION} at (1,29.38) size 22.64x14.19 + LayoutText {#text} at (2,0) size 19x13 + text run at (2,0) width 19: "test" + LayoutBlockFlow {OPTION} at (1,43.56) size 22.64x14.19 + LayoutText {#text} at (2,0) size 19x13 + text run at (2,0) width 19: "test" + LayoutBlockFlow {OPTION} at (1,57.75) size 22.64x14.19 + LayoutText {#text} at (2,0) size 19x13 + text run at (2,0) width 19: "test"
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fragmentation/outline-crossing-columns-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fragmentation/outline-crossing-columns-expected.png new file mode 100644 index 0000000..92c1415 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fragmentation/outline-crossing-columns-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fragmentation/outline-crossing-columns-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fragmentation/outline-crossing-columns-expected.txt new file mode 100644 index 0000000..97e21b1 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/fragmentation/outline-crossing-columns-expected.txt
@@ -0,0 +1,31 @@ +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 3116 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 785x3116 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x3116 + LayoutBlockFlow {BODY} at (8,8) size 769x3100 + LayoutBlockFlow {DIV} at (0,100) size 10x3000 +layer at (8,8) size 250x100 + LayoutBlockFlow {DIV} at (0,0) size 250x100 + LayoutMultiColumnSet (anonymous) at (0,0) size 250x58.75 +layer at (8,8) size 117x118 backgroundClip at (0,0) size 133x67 clip at (0,0) size 133x67 + LayoutMultiColumnFlowThread (anonymous) at (0,0) size 117x117.50 + LayoutBlockFlow {DIV} at (0,0) size 30x30 + LayoutBlockFlow (anonymous) at (0,58.75) size 117x58.75 + LayoutText {#text} at (0,0) size 0x0 +layer at (8,67) size 37x59 backgroundClip at (3,62) size 47x5 clip at (0,0) size 0x0 scrollHeight 71 + LayoutListBox {SELECT} at (0,0) size 36.91x58.75 [bgcolor=#FFFFFF] [border: (1px solid #999999)] + LayoutBlockFlow {OPTION} at (1,1) size 23.91x14.19 + LayoutText {#text} at (2,0) size 20x13 + text run at (2,0) width 20: "test" + LayoutBlockFlow {OPTION} at (1,15.19) size 23.91x14.19 + LayoutText {#text} at (2,0) size 20x13 + text run at (2,0) width 20: "test" + LayoutBlockFlow {OPTION} at (1,29.38) size 23.91x14.19 + LayoutText {#text} at (2,0) size 20x13 + text run at (2,0) width 20: "test" + LayoutBlockFlow {OPTION} at (1,43.56) size 23.91x14.19 + LayoutText {#text} at (2,0) size 20x13 + text run at (2,0) width 20: "test" + LayoutBlockFlow {OPTION} at (1,57.75) size 23.91x14.19 + LayoutText {#text} at (2,0) size 20x13 + text run at (2,0) width 20: "test"
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.png new file mode 100644 index 0000000..92c1415 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.txt new file mode 100644 index 0000000..532648f --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.11/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.txt
@@ -0,0 +1,31 @@ +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 3116 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 785x3116 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutNGBlockFlow {HTML} at (0,0) size 785x3116 + LayoutNGBlockFlow {BODY} at (8,8) size 769x3100 + LayoutNGBlockFlow {DIV} at (0,100) size 10x3000 +layer at (8,8) size 250x100 + LayoutNGBlockFlow {DIV} at (0,0) size 250x100 + LayoutMultiColumnSet (anonymous) at (0,0) size 250x58.75 +layer at (8,8) size 117x118 backgroundClip at (0,0) size 133x67 clip at (0,0) size 133x67 + LayoutMultiColumnFlowThread (anonymous) at (0,0) size 117x117.50 + LayoutNGBlockFlow {DIV} at (0,0) size 30x30 + LayoutNGBlockFlow (anonymous) at (0,58.75) size 117x58.75 + LayoutText {#text} at (0,0) size 0x0 +layer at (8,67) size 37x59 backgroundClip at (3,62) size 47x5 clip at (0,0) size 0x0 scrollHeight 71 + LayoutListBox {SELECT} at (0,0) size 36.91x58.75 [bgcolor=#FFFFFF] [border: (1px solid #999999)] + LayoutBlockFlow {OPTION} at (1,1) size 23.91x14.19 + LayoutText {#text} at (2,0) size 20x13 + text run at (2,0) width 20: "test" + LayoutBlockFlow {OPTION} at (1,15.19) size 23.91x14.19 + LayoutText {#text} at (2,0) size 20x13 + text run at (2,0) width 20: "test" + LayoutBlockFlow {OPTION} at (1,29.38) size 23.91x14.19 + LayoutText {#text} at (2,0) size 20x13 + text run at (2,0) width 20: "test" + LayoutBlockFlow {OPTION} at (1,43.56) size 23.91x14.19 + LayoutText {#text} at (2,0) size 20x13 + text run at (2,0) width 20: "test" + LayoutBlockFlow {OPTION} at (1,57.75) size 23.91x14.19 + LayoutText {#text} at (2,0) size 20x13 + text run at (2,0) width 20: "test"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/5232159-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/5232159-expected.png index 8fb6b65..1b28bf8 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/5232159-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/5232159-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/5232159-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/5232159-expected.txt index 9348ef7..0c4d7073 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/5232159-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/5232159-expected.txt
@@ -9,19 +9,22 @@ text run at (0,18) width 572: "clicking somewhere in the first sentence of the paragraph below and dragging downward." layer at (0,60) size 800x540 LayoutBlockFlow (positioned) {DIV} at (0,60) size 800x540 -layer at (0,60) size 800x90 - LayoutBlockFlow (positioned) {DIV} at (0,0) size 800x90 - LayoutBlockFlow {DIV} at (11,0) size 778x90 - LayoutText {#text} at (0,0) size 47x18 - text run at (0,0) width 47: "Lorem " - LayoutInline {SPAN} at (0,0) size 40x18 - LayoutText {#text} at (46,0) size 40x18 - text run at (46,0) width 40: "ipsum" - LayoutText {#text} at (85,0) size 772x90 - text run at (85,0) width 687: " dolor sit amet, consectetuer adipiscing elit. Integer vehicula accumsan massa. Quisque elementum. Cras id" - text run at (0,18) width 741: "neque a mi rutrum scelerisque. Nulla sed dui a massa sodales posuere. Nulla libero. Nulla posuere, felis id tincidunt" - text run at (0,36) width 760: "tincidunt, ipsum metus tristique risus, et convallis turpis elit eget massa. Nunc consectetuer dolor vel nunc. Cum sociis" - text run at (0,54) width 771: "natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Quisque dapibus ante et nulla. Cras nec velit." - text run at (0,72) width 661: "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer ut tortor." -selection start: position 3 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of child 1 {DIV} of child 3 {DIV} of body -selection end: position 236 of child 2 {#text} of child 1 {DIV} of child 1 {DIV} of child 3 {DIV} of body +layer at (0,60) size 800x80 + LayoutBlockFlow (positioned) {DIV} at (0,0) size 800x80 + LayoutBlockFlow {DIV} at (11,0) size 778x80 + LayoutText {#text} at (0,0) size 60x10 + text run at (0,0) width 60: "Lorem " + LayoutInline {SPAN} at (0,0) size 50x10 + LayoutText {#text} at (60,0) size 50x10 + text run at (60,0) width 50: "ipsum" + LayoutText {#text} at (110,0) size 770x80 + text run at (110,0) width 630: " dolor sit amet, consectetuer adipiscing elit. Integer vehicula" + text run at (0,10) width 730: "accumsan massa. Quisque elementum. Cras id neque a mi rutrum scelerisque." + text run at (0,20) width 760: "Nulla sed dui a massa sodales posuere. Nulla libero. Nulla posuere, felis id" + text run at (0,30) width 740: "tincidunt tincidunt, ipsum metus tristique risus, et convallis turpis elit" + text run at (0,40) width 770: "eget massa. Nunc consectetuer dolor vel nunc. Cum sociis natoque penatibus et" + text run at (0,50) width 770: "magnis dis parturient montes, nascetur ridiculus mus. Quisque dapibus ante et" + text run at (0,60) width 750: "nulla. Cras nec velit. Vestibulum ante ipsum primis in faucibus orci luctus" + text run at (0,70) width 530: "et ultrices posuere cubilia Curae; Integer ut tortor." +selection start: position 2 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of child 1 {DIV} of child 3 {DIV} of body +selection end: position 223 of child 2 {#text} of child 1 {DIV} of child 1 {DIV} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fragmentation/outline-crossing-columns-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fragmentation/outline-crossing-columns-expected.png new file mode 100644 index 0000000..e78883d --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/fragmentation/outline-crossing-columns-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fragmentation/outline-crossing-columns-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fragmentation/outline-crossing-columns-expected.txt new file mode 100644 index 0000000..766f66b --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/fragmentation/outline-crossing-columns-expected.txt
@@ -0,0 +1,31 @@ +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 3116 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 785x3116 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x3116 + LayoutBlockFlow {BODY} at (8,8) size 769x3100 + LayoutBlockFlow {DIV} at (0,100) size 10x3000 +layer at (8,8) size 250x100 + LayoutBlockFlow {DIV} at (0,0) size 250x100 + LayoutMultiColumnSet (anonymous) at (0,0) size 250x58.75 +layer at (8,8) size 117x118 backgroundClip at (0,0) size 133x67 clip at (0,0) size 133x67 + LayoutMultiColumnFlowThread (anonymous) at (0,0) size 117x117.50 + LayoutBlockFlow {DIV} at (0,0) size 30x30 + LayoutBlockFlow (anonymous) at (0,58.75) size 117x58.75 + LayoutText {#text} at (0,0) size 0x0 +layer at (8,67) size 37x59 backgroundClip at (3,62) size 47x5 clip at (0,0) size 0x0 scrollHeight 71 + LayoutListBox {SELECT} at (0,0) size 37.17x58.75 [bgcolor=#FFFFFF] [border: (1px solid #999999)] + LayoutBlockFlow {OPTION} at (1,1) size 24.17x14.19 + LayoutText {#text} at (2,0) size 21x13 + text run at (2,0) width 21: "test" + LayoutBlockFlow {OPTION} at (1,15.19) size 24.17x14.19 + LayoutText {#text} at (2,0) size 21x13 + text run at (2,0) width 21: "test" + LayoutBlockFlow {OPTION} at (1,29.38) size 24.17x14.19 + LayoutText {#text} at (2,0) size 21x13 + text run at (2,0) width 21: "test" + LayoutBlockFlow {OPTION} at (1,43.56) size 24.17x14.19 + LayoutText {#text} at (2,0) size 21x13 + text run at (2,0) width 21: "test" + LayoutBlockFlow {OPTION} at (1,57.75) size 24.17x14.19 + LayoutText {#text} at (2,0) size 21x13 + text run at (2,0) width 21: "test"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.txt new file mode 100644 index 0000000..4e0de1a --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/layout_ng_experimental/fragmentation/outline-crossing-columns-expected.txt
@@ -0,0 +1,31 @@ +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 3116 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 785x3116 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutNGBlockFlow {HTML} at (0,0) size 785x3116 + LayoutNGBlockFlow {BODY} at (8,8) size 769x3100 + LayoutNGBlockFlow {DIV} at (0,100) size 10x3000 +layer at (8,8) size 250x100 + LayoutNGBlockFlow {DIV} at (0,0) size 250x100 + LayoutMultiColumnSet (anonymous) at (0,0) size 250x58.75 +layer at (8,8) size 117x118 backgroundClip at (0,0) size 133x67 clip at (0,0) size 133x67 + LayoutMultiColumnFlowThread (anonymous) at (0,0) size 117x117.50 + LayoutNGBlockFlow {DIV} at (0,0) size 30x30 + LayoutNGBlockFlow (anonymous) at (0,58.75) size 117x58.75 + LayoutText {#text} at (0,0) size 0x0 +layer at (8,67) size 37x59 backgroundClip at (3,62) size 47x5 clip at (0,0) size 0x0 scrollHeight 71 + LayoutListBox {SELECT} at (0,0) size 37.17x58.75 [bgcolor=#FFFFFF] [border: (1px solid #999999)] + LayoutBlockFlow {OPTION} at (1,1) size 24.17x14.19 + LayoutText {#text} at (2,0) size 21x13 + text run at (2,0) width 21: "test" + LayoutBlockFlow {OPTION} at (1,15.19) size 24.17x14.19 + LayoutText {#text} at (2,0) size 21x13 + text run at (2,0) width 21: "test" + LayoutBlockFlow {OPTION} at (1,29.38) size 24.17x14.19 + LayoutText {#text} at (2,0) size 21x13 + text run at (2,0) width 21: "test" + LayoutBlockFlow {OPTION} at (1,43.56) size 24.17x14.19 + LayoutText {#text} at (2,0) size 21x13 + text run at (2,0) width 21: "test" + LayoutBlockFlow {OPTION} at (1,57.75) size 24.17x14.19 + LayoutText {#text} at (2,0) size 21x13 + text run at (2,0) width 21: "test"
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/5232159-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/selection/5232159-expected.png index 080c16f..70d07542 100644 --- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/5232159-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/editing/selection/5232159-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/5232159-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/selection/5232159-expected.txt index 8ca0e21a..4744f50 100644 --- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/5232159-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/editing/selection/5232159-expected.txt
@@ -9,19 +9,22 @@ text run at (0,20) width 485: "somewhere in the first sentence of the paragraph below and dragging downward." layer at (0,60) size 800x540 LayoutBlockFlow (positioned) {DIV} at (0,60) size 800x540 -layer at (0,60) size 800x100 - LayoutBlockFlow (positioned) {DIV} at (0,0) size 800x100 - LayoutBlockFlow {DIV} at (11,0) size 778x100 - LayoutText {#text} at (0,0) size 44x19 - text run at (0,0) width 44: "Lorem " - LayoutInline {SPAN} at (0,0) size 35x19 - LayoutText {#text} at (44,0) size 35x19 - text run at (44,0) width 35: "ipsum" - LayoutText {#text} at (79,0) size 773x99 - text run at (79,0) width 689: " dolor sit amet, consectetuer adipiscing elit. Integer vehicula accumsan massa. Quisque elementum. Cras id neque a" - text run at (0,20) width 773: "mi rutrum scelerisque. Nulla sed dui a massa sodales posuere. Nulla libero. Nulla posuere, felis id tincidunt tincidunt, ipsum metus" - text run at (0,40) width 758: "tristique risus, et convallis turpis elit eget massa. Nunc consectetuer dolor vel nunc. Cum sociis natoque penatibus et magnis dis" - text run at (0,60) width 765: "parturient montes, nascetur ridiculus mus. Quisque dapibus ante et nulla. Cras nec velit. Vestibulum ante ipsum primis in faucibus" - text run at (0,80) width 363: "orci luctus et ultrices posuere cubilia Curae; Integer ut tortor." -selection start: position 3 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of child 1 {DIV} of child 3 {DIV} of body -selection end: position 260 of child 2 {#text} of child 1 {DIV} of child 1 {DIV} of child 3 {DIV} of body +layer at (0,60) size 800x80 + LayoutBlockFlow (positioned) {DIV} at (0,0) size 800x80 + LayoutBlockFlow {DIV} at (11,0) size 778x80 + LayoutText {#text} at (0,0) size 60x10 + text run at (0,0) width 60: "Lorem " + LayoutInline {SPAN} at (0,0) size 50x10 + LayoutText {#text} at (60,0) size 50x10 + text run at (60,0) width 50: "ipsum" + LayoutText {#text} at (110,0) size 770x80 + text run at (110,0) width 630: " dolor sit amet, consectetuer adipiscing elit. Integer vehicula" + text run at (0,10) width 730: "accumsan massa. Quisque elementum. Cras id neque a mi rutrum scelerisque." + text run at (0,20) width 760: "Nulla sed dui a massa sodales posuere. Nulla libero. Nulla posuere, felis id" + text run at (0,30) width 740: "tincidunt tincidunt, ipsum metus tristique risus, et convallis turpis elit" + text run at (0,40) width 770: "eget massa. Nunc consectetuer dolor vel nunc. Cum sociis natoque penatibus et" + text run at (0,50) width 770: "magnis dis parturient montes, nascetur ridiculus mus. Quisque dapibus ante et" + text run at (0,60) width 750: "nulla. Cras nec velit. Vestibulum ante ipsum primis in faucibus orci luctus" + text run at (0,70) width 530: "et ultrices posuere cubilia Curae; Integer ut tortor." +selection start: position 2 of child 0 {#text} of child 1 {SPAN} of child 1 {DIV} of child 1 {DIV} of child 3 {DIV} of body +selection end: position 223 of child 2 {#text} of child 1 {DIV} of child 1 {DIV} of child 3 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/fragmentation/outline-crossing-columns-expected.png b/third_party/WebKit/LayoutTests/platform/win/fragmentation/outline-crossing-columns-expected.png new file mode 100644 index 0000000..e2c0c1d --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win/fragmentation/outline-crossing-columns-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/virtual/video-surface-layer/external/wpt/picture-in-picture/idlharness.window-expected.txt b/third_party/WebKit/LayoutTests/virtual/video-surface-layer/external/wpt/picture-in-picture/idlharness.window-expected.txt index 0c0c0659..791bdd9 100644 --- a/third_party/WebKit/LayoutTests/virtual/video-surface-layer/external/wpt/picture-in-picture/idlharness.window-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/video-surface-layer/external/wpt/picture-in-picture/idlharness.window-expected.txt
@@ -32,6 +32,7 @@ PASS HTMLVideoElement interface: video must inherit property "onenterpictureinpicture" with the proper type PASS HTMLVideoElement interface: video must inherit property "onleavepictureinpicture" with the proper type PASS HTMLVideoElement interface: video must inherit property "disablePictureInPicture" with the proper type +PASS WorkerGlobalScope interface: existence and properties of interface object PASS DocumentOrShadowRoot interface: document must inherit property "pictureInPictureElement" with the proper type PASS Document interface: attribute pictureInPictureEnabled PASS Unscopable handled correctly for pictureInPictureEnabled property on Document @@ -42,5 +43,7 @@ PASS Document interface: document must inherit property "pictureInPictureEnabled" with the proper type PASS Document interface: document must inherit property "exitPictureInPicture()" with the proper type PASS Document interface: document must inherit property "pictureInPictureElement" with the proper type +PASS ShadowRoot interface: attribute pictureInPictureElement +PASS Unscopable handled correctly for pictureInPictureElement property on ShadowRoot Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/interfaces.https-expected.txt b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/interfaces.https-expected.txt index 76de6779..090c43b 100644 --- a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/interfaces.https-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/interfaces.https-expected.txt
@@ -17,7 +17,5 @@ PASS MediaStreamTrack interface: existence and properties of interface prototype object's @@unscopables property PASS MediaStreamTrack must be primary interface of idlTestObjects.mediaStreamTrack PASS Stringification of idlTestObjects.mediaStreamTrack -PASS MediaStreamTrack must be primary interface of generateMediaStreamTrack('audio') -PASS Stringification of generateMediaStreamTrack('audio') Harness: the test ran to completion.
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 2237efa..3bebcfc 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -40,5 +40,8 @@ const base::Feature kRecordAnchorMetricsVisible{ "RecordAnchorMetricsVisible", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enable Portals. https://crbug.com/865123. +const base::Feature kPortals{"Portals", base::FEATURE_DISABLED_BY_DEFAULT}; + } // namespace features } // namespace blink
diff --git a/third_party/blink/common/message_port/string_message_codec_unittest.cc b/third_party/blink/common/message_port/string_message_codec_unittest.cc index 42435ca..374d865 100644 --- a/third_party/blink/common/message_port/string_message_codec_unittest.cc +++ b/third_party/blink/common/message_port/string_message_codec_unittest.cc
@@ -36,7 +36,8 @@ v8::Local<v8::String> str = value->ToString(context).ToLocalChecked(); result.resize(str->Length()); - str->Write(reinterpret_cast<uint16_t*>(&result[0]), 0, result.size()); + str->Write(isolate, reinterpret_cast<uint16_t*>(&result[0]), 0, + result.size()); } isolate->Dispose(); delete params.array_buffer_allocator;
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 6cc6b3b2..92f719d79 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -19,6 +19,7 @@ BLINK_COMMON_EXPORT extern const base::Feature kNestedWorkers; BLINK_COMMON_EXPORT extern const base::Feature kRecordAnchorMetricsClicked; BLINK_COMMON_EXPORT extern const base::Feature kRecordAnchorMetricsVisible; +BLINK_COMMON_EXPORT extern const base::Feature kPortals; } // namespace features } // namespace blink
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index aee1e31..312a34a 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -101,6 +101,7 @@ mojom("mojom_core") { sources = [ "message_port/message_port.mojom", + "portal/portal.mojom", "service_worker/service_worker.mojom", "service_worker/service_worker_object.mojom", "service_worker/service_worker_registration.mojom",
diff --git a/third_party/blink/public/mojom/portal/OWNERS b/third_party/blink/public/mojom/portal/OWNERS new file mode 100644 index 0000000..08850f4 --- /dev/null +++ b/third_party/blink/public/mojom/portal/OWNERS
@@ -0,0 +1,2 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/public/mojom/portal/portal.mojom b/third_party/blink/public/mojom/portal/portal.mojom new file mode 100644 index 0000000..2125618 --- /dev/null +++ b/third_party/blink/public/mojom/portal/portal.mojom
@@ -0,0 +1,9 @@ +// Copyright 2018 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. + +module blink.mojom; + +// The Portal interface is used by the renderer to interact with the Portal. +interface Portal { +};
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h index 75f1b4d9..9e0d0b8 100644 --- a/third_party/blink/public/platform/platform.h +++ b/third_party/blink/public/platform/platform.h
@@ -346,6 +346,11 @@ const char* data, size_t data_size) {} + // A request to fetch contents associated with this URL from metadata cache. + virtual void FetchCachedCode( + const WebURL&, + base::OnceCallback<void(const std::vector<uint8_t>&)>) {} + // A suggestion to cache this metadata in association with this URL which // resource is in CacheStorage. virtual void CacheMetadataInCacheStorage(
diff --git a/third_party/blink/public/platform/web_feature.mojom b/third_party/blink/public/platform/web_feature.mojom index 590ae4e..dd56e63 100644 --- a/third_party/blink/public/platform/web_feature.mojom +++ b/third_party/blink/public/platform/web_feature.mojom
@@ -1973,6 +1973,7 @@ kV8RTCRtpTransceiver_Direction_AttributeGetter = 2514, kV8RTCRtpTransceiver_Direction_AttributeSetter = 2515, kHTMLLinkElementDisabledByParser = 2516, + kRequestIsHistoryNavigation = 2517, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/web/devtools_agent.mojom b/third_party/blink/public/web/devtools_agent.mojom index ab6f459..16f016b 100644 --- a/third_party/blink/public/web/devtools_agent.mojom +++ b/third_party/blink/public/web/devtools_agent.mojom
@@ -65,7 +65,8 @@ AttachDevToolsSession(associated DevToolsSessionHost host, associated DevToolsSession& session, DevToolsSession& io_session, - string? reattach_state); + string? reattach_state, + DevToolsSessionState? reattach_session_state); // Requests an element at specific position to be inspected in every // attached session (or the next attached one if none yet). @@ -100,9 +101,21 @@ // may be missing if the state did not change since last time. DispatchProtocolResponse(mojo_base.mojom.BigString message, int32 call_id, - string? state); + string? state, + DevToolsSessionState? updates); // Dispatches protocol notification to a remote debugging client. DispatchProtocolNotification(mojo_base.mojom.BigString message, - string? state); + string? state, + DevToolsSessionState? updates); +}; + +// The session state is a mapping from keys to either values or missing +// values. Missing values are only used when updates are sent; that's +// in DispatchProtocolResponse and DispatchProtocolNotification. The +// DevToolsSession will then interpret these missing values by deleting +// the respective key when its applying the updates in +// DevToolsSession::ApplySessionStateUpdates. +struct DevToolsSessionState { + map<string, string?> entries; };
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h index 1ce3fc4..a5c8b8e 100644 --- a/third_party/blink/public/web/web_local_frame_client.h +++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -827,6 +827,15 @@ CreateWebSocketHandshakeThrottle() { return nullptr; } + + // Returns true when the contents of plugin are handled externally. This means + // the plugin element will own a content frame but the frame is than used + // externally to load the required handelrs. + virtual bool IsPluginHandledExternally(const WebElement& plugin_element, + const WebURL& url, + const WebString& suggested_mime_type) { + return false; + } }; } // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc b/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc index cbd9f81..e148eda29 100644 --- a/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc +++ b/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc
@@ -385,17 +385,17 @@ ->IsDisplayingInitialEmptyDocument() || origin->DomainWasSetInDOM()); if (origin && !use_default_security_token) - token = origin->ToString(); + token = origin->ToTokenForFastCheck(); - // 3. The ToString() method on SecurityOrigin returns the string "null" for + // 3. The ToTokenForFastCheck method on SecurityOrigin returns null string for // empty security origins and for security origins that should only allow // access to themselves (i.e. opaque origins). Using the default security // token serves for two purposes: it allows fast-path security checks for // accesses inside the same context, and forces a full CanAccess() check - // for contexts that don't inherit the same origin, which will always fail. + // for contexts that don't inherit the same origin. v8::HandleScope handle_scope(GetIsolate()); v8::Local<v8::Context> context = script_state_->GetContext(); - if (token.IsEmpty() || token == "null") { + if (token.IsNull()) { context->UseDefaultSecurityToken(); return; } @@ -403,14 +403,14 @@ if (world_->IsIsolatedWorld()) { const SecurityOrigin* frame_security_origin = GetFrame()->GetDocument()->GetSecurityOrigin(); - String frame_security_token = frame_security_origin->ToString(); + String frame_security_token = frame_security_origin->ToTokenForFastCheck(); // We need to check the return value of domainWasSetInDOM() on the // frame's SecurityOrigin because, if that's the case, only // SecurityOrigin::domain_ would have been modified. // domain_ is not used by SecurityOrigin::toString(), so we would end // up generating the same token that was already set. if (frame_security_origin->DomainWasSetInDOM() || - frame_security_token.IsEmpty() || frame_security_token == "null") { + frame_security_token.IsNull()) { context->UseDefaultSecurityToken(); return; }
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_threaded_test.cc b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_threaded_test.cc index 3f69e65..1fd3bfde 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_threaded_test.cc +++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value_threaded_test.cc
@@ -24,7 +24,7 @@ // Start a worker. WorkerReportingProxy proxy; - WorkerThreadForTest worker_thread(nullptr, proxy); + WorkerThreadForTest worker_thread(proxy); ParentExecutionContextTaskRunners* parent_execution_context_task_runners = ParentExecutionContextTaskRunners::Create(&scope.GetDocument()); worker_thread.StartWithSourceCode(scope.GetDocument().GetSecurityOrigin(),
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index 29d5b38..64852d8b 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1903,6 +1903,7 @@ "input/scroll_snap_test.cc", "input/touch_action_test.cc", "input/touch_event_manager_test.cc", + "inspector/inspector_session_state_test.cc", "inspector/main_thread_debugger_test.cc", "inspector/protocol_parser_test.cc", "intersection_observer/intersection_observer_test.cc",
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 63a5bdc8..59187fe 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -1923,6 +1923,7 @@ if (!ChildNeedsStyleInvalidation() && !NeedsStyleInvalidation()) return; TRACE_EVENT0("blink", "Document::updateStyleInvalidationIfNeeded"); + SCOPED_BLINK_UMA_HISTOGRAM_TIMER_HIGHRES("Style.InvalidationTime"); GetStyleEngine().InvalidateStyle(); }
diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc index 6bf62e2..f79cb23 100644 --- a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc +++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc
@@ -1114,6 +1114,14 @@ web_frame_->Client()->FrameRectsChanged(frame_rect); } +bool LocalFrameClientImpl::IsPluginHandledExternally( + HTMLPlugInElement& plugin_element, + const KURL& resource_url, + const String& suggesed_mime_type) { + return web_frame_->Client()->IsPluginHandledExternally( + &plugin_element, resource_url, suggesed_mime_type); +} + std::unique_ptr<WebWorkerFetchContext> LocalFrameClientImpl::CreateWorkerFetchContext() { DCHECK(web_frame_->Client());
diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.h b/third_party/blink/renderer/core/exported/local_frame_client_impl.h index 14a451e9..e417ef7 100644 --- a/third_party/blink/renderer/core/exported/local_frame_client_impl.h +++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.h
@@ -277,6 +277,10 @@ void FrameRectsChanged(const IntRect&) override; + bool IsPluginHandledExternally(HTMLPlugInElement&, + const KURL&, + const String&) override; + std::unique_ptr<WebWorkerFetchContext> CreateWorkerFetchContext() override; std::unique_ptr<WebContentSettingsClient> CreateWorkerContentSettingsClient() override;
diff --git a/third_party/blink/renderer/core/exported/web_associated_url_loader_impl.cc b/third_party/blink/renderer/core/exported/web_associated_url_loader_impl.cc index df2dc2a..4ba08d2 100644 --- a/third_party/blink/renderer/core/exported/web_associated_url_loader_impl.cc +++ b/third_party/blink/renderer/core/exported/web_associated_url_loader_impl.cc
@@ -441,7 +441,7 @@ Document* document = ToDocument(observer_->LifecycleContext()); DCHECK(document); loader_ = new ThreadableLoader(*document, client_adapter_.get(), - resource_loader_options, base::nullopt); + resource_loader_options); loader_->Start(webcore_request); }
diff --git a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc index ac7bf8c..d250bb0 100644 --- a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc +++ b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc
@@ -207,7 +207,8 @@ mojom::blink::DevToolsSessionHostAssociatedPtrInfo host_ptr_info, mojom::blink::DevToolsSessionAssociatedRequest main_request, mojom::blink::DevToolsSessionRequest io_request, - const String& reattach_state); + const String& reattach_state, + mojom::blink::DevToolsSessionStatePtr reattach_session_state); ~Session() override; virtual void Trace(blink::Visitor*); @@ -228,18 +229,24 @@ const String& message) override; // InspectorSession::Client implementation. - void SendProtocolResponse(int session_id, - int call_id, - const String& response, - const String& state) override; - void SendProtocolNotification(int session_id, - const String& message, - const String& state) override; + void SendProtocolResponse( + int session_id, + int call_id, + const String& response, + const String& state, + mojom::blink::DevToolsSessionStatePtr updates) override; + void SendProtocolNotification( + int session_id, + const String& message, + const String& state, + mojom::blink::DevToolsSessionStatePtr updates) override; void DispatchProtocolCommandInternal(int call_id, const String& method, const String& message); - void InitializeInspectorSession(const String& reattach_state); + void InitializeInspectorSession( + const String& reattach_state, + mojom::blink::DevToolsSessionStatePtr reattach_session_state); Member<WebDevToolsAgentImpl> agent_; Member<WebLocalFrameImpl> frame_; @@ -310,7 +317,8 @@ mojom::blink::DevToolsSessionHostAssociatedPtrInfo host_ptr_info, mojom::blink::DevToolsSessionAssociatedRequest request, mojom::blink::DevToolsSessionRequest io_request, - const String& reattach_state) + const String& reattach_state, + mojom::blink::DevToolsSessionStatePtr reattach_session_state) : agent_(agent), frame_(agent->web_local_frame_impl_), binding_(this, std::move(request)) { @@ -323,7 +331,7 @@ host_ptr_.set_connection_error_handler(WTF::Bind( &WebDevToolsAgentImpl::Session::Detach, WrapWeakPersistent(this))); - InitializeInspectorSession(reattach_state); + InitializeInspectorSession(reattach_state, std::move(reattach_session_state)); } WebDevToolsAgentImpl::Session::~Session() { @@ -351,10 +359,12 @@ inspector_session_->Dispose(); } -void WebDevToolsAgentImpl::Session::SendProtocolResponse(int session_id, - int call_id, - const String& response, - const String& state) { +void WebDevToolsAgentImpl::Session::SendProtocolResponse( + int session_id, + int call_id, + const String& response, + const String& state, + mojom::blink::DevToolsSessionStatePtr updates) { if (detached_) return; @@ -362,14 +372,16 @@ // protocol response in any of them. if (LayoutTestSupport::IsRunningLayoutTest()) agent_->FlushProtocolNotifications(); - host_ptr_->DispatchProtocolResponse(response, call_id, state); + host_ptr_->DispatchProtocolResponse(response, call_id, state, + std::move(updates)); } void WebDevToolsAgentImpl::Session::SendProtocolNotification( int session_id, const String& message, - const String& state) { - host_ptr_->DispatchProtocolNotification(message, state); + const String& state, + mojom::blink::DevToolsSessionStatePtr updates) { + host_ptr_->DispatchProtocolNotification(message, state, std::move(updates)); } void WebDevToolsAgentImpl::Session::DispatchProtocolCommand( @@ -392,7 +404,8 @@ } void WebDevToolsAgentImpl::Session::InitializeInspectorSession( - const String& reattach_state) { + const String& reattach_state, + mojom::blink::DevToolsSessionStatePtr reattach_session_state) { ClientMessageLoopAdapter::EnsureMainThreadDebuggerCreated(); MainThreadDebugger* main_thread_debugger = MainThreadDebugger::Instance(); v8::Isolate* isolate = V8PerIsolateData::MainThreadIsolate(); @@ -402,7 +415,7 @@ this, agent_->probe_sink_.Get(), 0, main_thread_debugger->GetV8Inspector(), main_thread_debugger->ContextGroupId(inspected_frames->Root()), - reattach_state); + reattach_state, std::move(reattach_session_state)); InspectorDOMAgent* dom_agent = new InspectorDOMAgent( isolate, inspected_frames, inspector_session_->V8Session()); @@ -551,12 +564,14 @@ mojom::blink::DevToolsSessionHostAssociatedPtrInfo host, mojom::blink::DevToolsSessionAssociatedRequest session_request, mojom::blink::DevToolsSessionRequest io_session_request, - const String& reattach_state) { + const String& reattach_state, + mojom::blink::DevToolsSessionStatePtr reattach_session_state) { if (!sessions_.size()) Platform::Current()->CurrentThread()->AddTaskObserver(this); Session* session = new Session(this, std::move(host), std::move(session_request), - std::move(io_session_request), reattach_state); + std::move(io_session_request), reattach_state, + std::move(reattach_session_state)); sessions_.insert(session); if (node_to_inspect_) { session->overlay_agent()->Inspect(node_to_inspect_);
diff --git a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h index 9b49622f..2c3ae4f 100644 --- a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h +++ b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h
@@ -100,7 +100,8 @@ mojom::blink::DevToolsSessionHostAssociatedPtrInfo, mojom::blink::DevToolsSessionAssociatedRequest main_session, mojom::blink::DevToolsSessionRequest io_session, - const String& reattach_state) override; + const String& reattach_state, + mojom::blink::DevToolsSessionStatePtr reattach_session_state) override; void InspectElement(const WebPoint& point_in_local_root) override; // InspectorPageAgent::Client implementation.
diff --git a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc index f984b84..663fc35a 100644 --- a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc +++ b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
@@ -49,7 +49,6 @@ #include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/loader/frame_load_request.h" #include "third_party/blink/renderer/core/loader/frame_loader.h" -#include "third_party/blink/renderer/core/loader/threadable_loading_context.h" #include "third_party/blink/renderer/core/loader/worker_fetch_context.h" #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/core/script/script.h" @@ -347,8 +346,8 @@ reporting_proxy_ = new SharedWorkerReportingProxy( this, parent_execution_context_task_runners_); - worker_thread_ = std::make_unique<SharedWorkerThread>( - name_, ThreadableLoadingContext::Create(*document), *reporting_proxy_); + worker_thread_ = + std::make_unique<SharedWorkerThread>(name_, *reporting_proxy_); probe::scriptImported(document, main_script_loader_->Identifier(), main_script_loader_->SourceText()); main_script_loader_ = nullptr;
diff --git a/third_party/blink/renderer/core/fetch/fetch_manager.cc b/third_party/blink/renderer/core/fetch/fetch_manager.cc index f8949303..2962b4c 100644 --- a/third_party/blink/renderer/core/fetch/fetch_manager.cc +++ b/third_party/blink/renderer/core/fetch/fetch_manager.cc
@@ -856,8 +856,7 @@ probe::willStartFetch(execution_context_, this); threadable_loader_ = new ThreadableLoader(*execution_context_, this, - resource_loader_options, - base::nullopt); + resource_loader_options); threadable_loader_->Start(request); } @@ -884,8 +883,7 @@ probe::willStartFetch(execution_context_, this); threadable_loader_ = new ThreadableLoader(*execution_context_, this, - resource_loader_options, - base::nullopt); + resource_loader_options); threadable_loader_->Start(request); }
diff --git a/third_party/blink/renderer/core/fetch/request.idl b/third_party/blink/renderer/core/fetch/request.idl index 1921875..0e5f9c14 100644 --- a/third_party/blink/renderer/core/fetch/request.idl +++ b/third_party/blink/renderer/core/fetch/request.idl
@@ -50,7 +50,7 @@ readonly attribute boolean keepalive; readonly attribute AbortSignal signal; - [RuntimeEnabled=RequestIsHistoryNavigation] readonly attribute boolean isHistoryNavigation; + [MeasureAs=RequestIsHistoryNavigation] readonly attribute boolean isHistoryNavigation; [RaisesException, CallWith=ScriptState, DoNotTestNewObject, NewObject] Request clone(); };
diff --git a/third_party/blink/renderer/core/frame/ad_tracker.cc b/third_party/blink/renderer/core/frame/ad_tracker.cc index 7b142845..8a3b46e 100644 --- a/third_party/blink/renderer/core/frame/ad_tracker.cc +++ b/third_party/blink/renderer/core/frame/ad_tracker.cc
@@ -76,7 +76,7 @@ probe.function->GetScriptOrigin().ResourceName(); String script_url; if (!resource_name.IsEmpty()) - script_url = ToCoreString(resource_name->ToString()); + script_url = ToCoreString(resource_name->ToString(ToIsolate(local_root_))); WillExecuteScript(probe.context, script_url); }
diff --git a/third_party/blink/renderer/core/frame/local_frame_client.h b/third_party/blink/renderer/core/frame/local_frame_client.h index 7360a10..8f56be5 100644 --- a/third_party/blink/renderer/core/frame/local_frame_client.h +++ b/third_party/blink/renderer/core/frame/local_frame_client.h
@@ -418,6 +418,15 @@ virtual void FrameRectsChanged(const IntRect&) {} + // Returns true when the contents of plugin are handled externally. This means + // the plugin element will own a content frame but the frame is than used + // externally to load the required handelrs. + virtual bool IsPluginHandledExternally(HTMLPlugInElement&, + const KURL&, + const String&) { + return false; + }; + // Returns a new WebWorkerFetchContext for a dedicated worker or worklet. virtual std::unique_ptr<WebWorkerFetchContext> CreateWorkerFetchContext() { return nullptr;
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc index 9c3c1abc..6780239 100644 --- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc +++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -412,6 +412,8 @@ if (LowLatencyEnabled() && !dirty_rect_.IsEmpty()) { if (GetOrCreateCanvasResourceProvider(kPreferAcceleration)) { ResourceProvider()->TryEnableSingleBuffering(); + if (canvas2d_bridge_) + canvas2d_bridge_->FlushRecording(); // Push a frame base::TimeTicks start_time = WTF::CurrentTimeTicks(); if (Is3d())
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h index bd98ac8..97277c0 100644 --- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h +++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h
@@ -215,6 +215,7 @@ bool ShouldAccelerate2dContext() const override; unsigned GetMSAASampleCountFor2dContext() const override; SkFilterQuality FilterQuality() const override; + bool LowLatencyEnabled() const override { return !!frame_dispatcher_; } void DisableAcceleration(std::unique_ptr<Canvas2DLayerBridge> unaccelerated_bridge_used_for_testing = nullptr); @@ -294,8 +295,6 @@ needs_unbuffered_input_ = value; } - bool LowLatencyEnabled() const { return !!frame_dispatcher_; } - scoped_refptr<StaticBitmapImage> Snapshot(SourceDrawingBuffer, AccelerationHint) const;
diff --git a/third_party/blink/renderer/core/html/html_plugin_element.cc b/third_party/blink/renderer/core/html/html_plugin_element.cc index d849d69..47270324 100644 --- a/third_party/blink/renderer/core/html/html_plugin_element.cc +++ b/third_party/blink/renderer/core/html/html_plugin_element.cc
@@ -69,6 +69,16 @@ kPluginRequestObjectResultMax }; +String GetMIMETypeFromURL(const KURL& url) { + String filename = url.LastPathComponent(); + int extension_pos = filename.ReverseFind('.'); + if (extension_pos >= 0) { + String extension = filename.Substring(extension_pos + 1); + return MIMETypeRegistry::GetWellKnownMIMETypeForExtension(extension); + } + return String(); +} + } // anonymous namespace const Vector<String>& PluginParameters::Names() const { @@ -148,6 +158,12 @@ bool HTMLPlugInElement::RequestObjectInternal( const PluginParameters& plugin_params) { + if (handled_externally_) { + // TODO(ekaramad): Fix this once we know what to do with frames inside + // plugins (https://crbug.com/776510). + return true; + } + if (url_.IsEmpty() && service_type_.IsEmpty()) return false; @@ -159,9 +175,20 @@ if (!AllowedToLoadObject(completed_url, service_type_)) return false; + handled_externally_ = + GetDocument().GetFrame()->Client()->IsPluginHandledExternally( + *this, completed_url, + service_type_.IsEmpty() ? GetMIMETypeFromURL(completed_url) + : service_type_); + if (handled_externally_) { + // This is a temporary placeholder and the logic around + // |handled_externally_| might change as MimeHandlerView is moving towards + // depending on OOPIFs instead of WebPlugin (https://crbug.com/659750). + completed_url = BlankURL(); + } ObjectContentType object_type = GetObjectContentType(); if (object_type == ObjectContentType::kFrame || - object_type == ObjectContentType::kImage) { + object_type == ObjectContentType::kImage || handled_externally_) { // If the plugin element already contains a subframe, // loadOrRedirectSubframe will re-use it. Otherwise, it will create a // new frame and set it as the LayoutEmbeddedContent's EmbeddedContentView, @@ -489,13 +516,7 @@ KURL url = GetDocument().CompleteURL(url_); if (mime_type.IsEmpty()) { // Try to guess the MIME type based off the extension. - String filename = url.LastPathComponent(); - int extension_pos = filename.ReverseFind('.'); - if (extension_pos >= 0) { - String extension = filename.Substring(extension_pos + 1); - mime_type = MIMETypeRegistry::GetWellKnownMIMETypeForExtension(extension); - } - + mime_type = GetMIMETypeFromURL(url); if (mime_type.IsEmpty()) return ObjectContentType::kFrame; }
diff --git a/third_party/blink/renderer/core/html/html_plugin_element.h b/third_party/blink/renderer/core/html/html_plugin_element.h index 62e6624..7581470c 100644 --- a/third_party/blink/renderer/core/html/html_plugin_element.h +++ b/third_party/blink/renderer/core/html/html_plugin_element.h
@@ -224,6 +224,8 @@ // off embedded_content_view_ here while the plugin is persisting but not // being displayed. Member<WebPluginContainerImpl> persisted_plugin_; + + bool handled_externally_ = false; }; inline bool IsHTMLPlugInElement(const HTMLElement& element) {
diff --git a/third_party/blink/renderer/core/inspector/BUILD.gn b/third_party/blink/renderer/core/inspector/BUILD.gn index f7e3da6..414d1ed 100644 --- a/third_party/blink/renderer/core/inspector/BUILD.gn +++ b/third_party/blink/renderer/core/inspector/BUILD.gn
@@ -77,6 +77,8 @@ "inspector_resource_content_loader.h", "inspector_session.cc", "inspector_session.h", + "inspector_session_state.cc", + "inspector_session_state.h", "inspector_style_sheet.cc", "inspector_style_sheet.h", "inspector_task_runner.cc",
diff --git a/third_party/blink/renderer/core/inspector/inspector_base_agent.h b/third_party/blink/renderer/core/inspector/inspector_base_agent.h index 5b36ce1..e089208 100644 --- a/third_party/blink/renderer/core/inspector/inspector_base_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_base_agent.h
@@ -33,6 +33,7 @@ #include "third_party/blink/renderer/core/CoreProbeSink.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/inspector/inspector_session_state.h" #include "third_party/blink/renderer/core/inspector/protocol/Protocol.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/forward.h" @@ -55,7 +56,8 @@ virtual void Init(CoreProbeSink*, protocol::UberDispatcher*, - protocol::DictionaryValue*) = 0; + protocol::DictionaryValue*, + InspectorSessionState*) = 0; virtual void Dispose() = 0; }; @@ -67,7 +69,8 @@ void Init(CoreProbeSink* instrumenting_agents, protocol::UberDispatcher* dispatcher, - protocol::DictionaryValue* state) override { + protocol::DictionaryValue* state, + InspectorSessionState* session_state) override { instrumenting_agents_ = instrumenting_agents; frontend_.reset( new typename DomainMetainfo::FrontendClass(dispatcher->channel())); @@ -80,6 +83,7 @@ state_ = new_state.get(); state->setObject(DomainMetainfo::domainName, std::move(new_state)); } + agent_state_.InitFrom(session_state); } protocol::Response disable() override { return protocol::Response::OK(); } @@ -97,13 +101,14 @@ } protected: - InspectorBaseAgent() = default; + InspectorBaseAgent() : agent_state_(DomainMetainfo::domainName) {} typename DomainMetainfo::FrontendClass* GetFrontend() const { return frontend_.get(); } Member<CoreProbeSink> instrumenting_agents_; protocol::DictionaryValue* state_; + InspectorAgentState agent_state_; private: std::unique_ptr<typename DomainMetainfo::FrontendClass> frontend_;
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc index 465c02a2..dd4ea19 100644 --- a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
@@ -85,8 +85,6 @@ namespace PageAgentState { static const char kPageAgentEnabled[] = "pageAgentEnabled"; -static const char kPageAgentScriptsToEvaluateOnLoad[] = - "pageAgentScriptsToEvaluateOnLoad"; static const char kScreencastEnabled[] = "screencastEnabled"; static const char kLifecycleEventsEnabled[] = "lifecycleEventsEnabled"; static const char kBypassCSPEnabled[] = "bypassCSPEnabled"; @@ -468,7 +466,9 @@ reloading_(false), inspector_resource_content_loader_(resource_content_loader), resource_content_loader_client_id_( - resource_content_loader->CreateClientId()) {} + resource_content_loader->CreateClientId()), + scripts_to_evaluate_on_load_(&agent_state_, + /*default_value=*/WTF::String()) {} void InspectorPageAgent::Restore() { if (state_->booleanProperty(PageAgentState::kPageAgentEnabled, false)) @@ -538,7 +538,7 @@ Response InspectorPageAgent::disable() { enabled_ = false; state_->setBoolean(PageAgentState::kPageAgentEnabled, false); - state_->remove(PageAgentState::kPageAgentScriptsToEvaluateOnLoad); + scripts_to_evaluate_on_load_.ClearAll(); script_to_evaluate_on_load_once_ = String(); pending_script_to_evaluate_on_load_once_ = String(); instrumenting_agents_->removeInspectorPageAgent(this); @@ -553,32 +553,21 @@ Response InspectorPageAgent::addScriptToEvaluateOnLoad(const String& source, String* identifier) { - protocol::DictionaryValue* scripts = - state_->getObject(PageAgentState::kPageAgentScriptsToEvaluateOnLoad); - if (!scripts) { - std::unique_ptr<protocol::DictionaryValue> new_scripts = - protocol::DictionaryValue::create(); - scripts = new_scripts.get(); - state_->setObject(PageAgentState::kPageAgentScriptsToEvaluateOnLoad, - std::move(new_scripts)); - } // Assure we don't override existing ids -- m_lastScriptIdentifier could get // out of sync WRT actual scripts once we restored the scripts from the cookie // during navigation. do { *identifier = String::Number(++last_script_identifier_); - } while (scripts->get(*identifier)); - scripts->setString(*identifier, source); + } while (!scripts_to_evaluate_on_load_.Get(*identifier).IsNull()); + scripts_to_evaluate_on_load_.Set(*identifier, source); return Response::OK(); } Response InspectorPageAgent::removeScriptToEvaluateOnLoad( const String& identifier) { - protocol::DictionaryValue* scripts = - state_->getObject(PageAgentState::kPageAgentScriptsToEvaluateOnLoad); - if (!scripts || !scripts->get(identifier)) + if (scripts_to_evaluate_on_load_.Get(identifier).IsNull()) return Response::Error("Script not found"); - scripts->remove(identifier); + scripts_to_evaluate_on_load_.Clear(identifier); return Response::OK(); } @@ -847,16 +836,9 @@ void InspectorPageAgent::DidClearDocumentOfWindowObject(LocalFrame* frame) { if (!GetFrontend()) return; - - protocol::DictionaryValue* scripts = - state_->getObject(PageAgentState::kPageAgentScriptsToEvaluateOnLoad); - if (scripts) { - for (size_t i = 0; i < scripts->size(); ++i) { - auto script = scripts->at(i); - String script_text; - if (script.second->asString(&script_text)) - frame->GetScriptController().ExecuteScriptInMainWorld(script_text); - } + for (const WTF::String& key : scripts_to_evaluate_on_load_.Keys()) { + const WTF::String& script = scripts_to_evaluate_on_load_.Get(key); + frame->GetScriptController().ExecuteScriptInMainWorld(script); } if (!script_to_evaluate_on_load_once_.IsEmpty()) { frame->GetScriptController().ExecuteScriptInMainWorld(
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent.h b/third_party/blink/renderer/core/inspector/inspector_page_agent.h index c5a48a9f..50d598c 100644 --- a/third_party/blink/renderer/core/inspector/inspector_page_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_page_agent.h
@@ -243,6 +243,7 @@ bool reloading_; Member<InspectorResourceContentLoader> inspector_resource_content_loader_; int resource_content_loader_client_id_; + InspectorAgentState::StringMap scripts_to_evaluate_on_load_; DISALLOW_COPY_AND_ASSIGN(InspectorPageAgent); };
diff --git a/third_party/blink/renderer/core/inspector/inspector_session.cc b/third_party/blink/renderer/core/inspector/inspector_session.cc index ac95754..7a0fa050 100644 --- a/third_party/blink/renderer/core/inspector/inspector_session.cc +++ b/third_party/blink/renderer/core/inspector/inspector_session.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/use_counter.h" #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h" +#include "third_party/blink/renderer/core/inspector/inspector_session_state.h" #include "third_party/blink/renderer/core/inspector/protocol/Protocol.h" #include "third_party/blink/renderer/core/inspector/v8_inspector_string.h" #include "third_party/blink/renderer/core/probe/core_probes.h" @@ -18,18 +19,21 @@ const char kV8StateKey[] = "v8"; } -InspectorSession::InspectorSession(Client* client, - CoreProbeSink* instrumenting_agents, - int session_id, - v8_inspector::V8Inspector* inspector, - int context_group_id, - const String& reattach_state) +InspectorSession::InspectorSession( + Client* client, + CoreProbeSink* instrumenting_agents, + int session_id, + v8_inspector::V8Inspector* inspector, + int context_group_id, + const String& reattach_state, + mojom::blink::DevToolsSessionStatePtr reattach_session_state) : client_(client), v8_session_(nullptr), session_id_(session_id), disposed_(false), instrumenting_agents_(instrumenting_agents), - inspector_backend_dispatcher_(new protocol::UberDispatcher(this)) { + inspector_backend_dispatcher_(new protocol::UberDispatcher(this)), + session_state_(std::move(reattach_session_state)) { String v8_state; if (!reattach_state.IsNull()) { std::unique_ptr<protocol::Value> state = @@ -53,7 +57,7 @@ void InspectorSession::Append(InspectorAgent* agent) { agents_.push_back(agent); agent->Init(instrumenting_agents_.Get(), inspector_backend_dispatcher_.get(), - state_.get()); + state_.get(), &session_state_); } void InspectorSession::Restore() { @@ -136,8 +140,8 @@ if (disposed_) return; flushProtocolNotifications(); - client_->SendProtocolResponse(session_id_, call_id, message, - GetStateToSend()); + client_->SendProtocolResponse(session_id_, call_id, message, GetStateToSend(), + session_state_.TakeUpdates()); } String InspectorSession::GetStateToSend() { @@ -215,7 +219,8 @@ String state_to_send = GetStateToSend(); for (size_t i = 0; i < notification_queue_.size(); ++i) { client_->SendProtocolNotification( - session_id_, notification_queue_[i]->Serialize(), state_to_send); + session_id_, notification_queue_[i]->Serialize(), state_to_send, + session_state_.TakeUpdates()); // Only send state once in this series of serialized updates. state_to_send = String(); }
diff --git a/third_party/blink/renderer/core/inspector/inspector_session.h b/third_party/blink/renderer/core/inspector/inspector_session.h index 87e712a..8d56cbb 100644 --- a/third_party/blink/renderer/core/inspector/inspector_session.h +++ b/third_party/blink/renderer/core/inspector/inspector_session.h
@@ -6,7 +6,9 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_SESSION_H_ #include "base/macros.h" +#include "third_party/blink/public/web/devtools_agent.mojom-blink.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/inspector/inspector_session_state.h" #include "third_party/blink/renderer/core/inspector/protocol/Forward.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/forward.h" @@ -27,22 +29,28 @@ public: class Client { public: - virtual void SendProtocolResponse(int session_id, - int call_id, - const String& response, - const String& state) = 0; - virtual void SendProtocolNotification(int session_id, - const String& message, - const String& state) = 0; + virtual void SendProtocolResponse( + int session_id, + int call_id, + const String& response, + const String& state, + mojom::blink::DevToolsSessionStatePtr updates) = 0; + virtual void SendProtocolNotification( + int session_id, + const String& message, + const String& state, + mojom::blink::DevToolsSessionStatePtr updates) = 0; virtual ~Client() = default; }; - InspectorSession(Client*, - CoreProbeSink*, - int session_id, - v8_inspector::V8Inspector*, - int context_group_id, - const String& reattach_state); + InspectorSession( + Client*, + CoreProbeSink*, + int session_id, + v8_inspector::V8Inspector*, + int context_group_id, + const String& reattach_state, + mojom::blink::DevToolsSessionStatePtr reattach_session_state); ~InspectorSession() override; // TODO(dgozman): remove session id once WokrerInspectorController // does not use it anymore. @@ -90,6 +98,7 @@ Member<CoreProbeSink> instrumenting_agents_; std::unique_ptr<protocol::UberDispatcher> inspector_backend_dispatcher_; std::unique_ptr<protocol::DictionaryValue> state_; + InspectorSessionState session_state_; HeapVector<Member<InspectorAgent>> agents_; class Notification; Vector<std::unique_ptr<Notification>> notification_queue_;
diff --git a/third_party/blink/renderer/core/inspector/inspector_session_state.cc b/third_party/blink/renderer/core/inspector/inspector_session_state.cc new file mode 100644 index 0000000..b068c53 --- /dev/null +++ b/third_party/blink/renderer/core/inspector/inspector_session_state.cc
@@ -0,0 +1,108 @@ +// Copyright 2018 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 "third_party/blink/renderer/core/inspector/inspector_session_state.h" + +#include "third_party/blink/renderer/core/inspector/protocol/Protocol.h" + +namespace blink { + +// +// InspectorSessionState +// +InspectorSessionState::InspectorSessionState( + mojom::blink::DevToolsSessionStatePtr reattach) + : reattach_state_(std::move(reattach)), + updates_(mojom::blink::DevToolsSessionState::New()) {} + +const mojom::blink::DevToolsSessionState* InspectorSessionState::ReattachState() + const { + return reattach_state_.get(); +} + +void InspectorSessionState::EnqueueUpdate(const WTF::String& key, + const WTF::String& value) { + updates_->entries.Set(key, value); +} + +mojom::blink::DevToolsSessionStatePtr InspectorSessionState::TakeUpdates() { + auto updates = std::move(updates_); + updates_ = mojom::blink::DevToolsSessionState::New(); + return updates; +} + +// +// Encoding / Decoding routines. +// +/*static*/ +void InspectorAgentState::EncodeToJSON(bool v, WTF::String* out) { + std::unique_ptr<protocol::FundamentalValue> value = + blink::protocol::FundamentalValue::create(v); + *out = value->serialize(); +} + +/*static*/ +bool InspectorAgentState::DecodeFromJSON(const WTF::String& in, bool* v) { + std::unique_ptr<protocol::Value> parsed = protocol::StringUtil::parseJSON(in); + return parsed->asBoolean(v); +} + +/*static*/ +void InspectorAgentState::EncodeToJSON(int32_t v, WTF::String* out) { + std::unique_ptr<protocol::FundamentalValue> value = + blink::protocol::FundamentalValue::create(v); + *out = value->serialize(); +} + +/*static*/ +bool InspectorAgentState::DecodeFromJSON(const WTF::String& in, int32_t* v) { + std::unique_ptr<protocol::Value> parsed = protocol::StringUtil::parseJSON(in); + return parsed->asInteger(v); +} + +/*static*/ +void InspectorAgentState::EncodeToJSON(double v, WTF::String* out) { + std::unique_ptr<protocol::FundamentalValue> value = + blink::protocol::FundamentalValue::create(v); + *out = value->serialize(); +} + +/*static*/ +bool InspectorAgentState::DecodeFromJSON(const WTF::String& in, double* v) { + std::unique_ptr<protocol::Value> parsed = protocol::StringUtil::parseJSON(in); + return parsed->asDouble(v); +} + +/*static*/ +void InspectorAgentState::EncodeToJSON(const WTF::String& v, WTF::String* out) { + std::unique_ptr<protocol::StringValue> value = + protocol::StringValue::create(v); + *out = value->serialize(); +} + +/*static*/ +bool InspectorAgentState::DecodeFromJSON(const WTF::String& in, + WTF::String* v) { + std::unique_ptr<protocol::Value> parsed = protocol::StringUtil::parseJSON(in); + return parsed->asString(v); +} + +// +// InspectorAgentState +// +InspectorAgentState::InspectorAgentState(const WTF::String& domain_name) + : domain_name_(domain_name) {} + +WTF::String InspectorAgentState::RegisterField(Field* field) { + WTF::String prefix_key = + domain_name_ + "." + WTF::String::Number(fields_.size()) + "/"; + fields_.push_back(field); + return prefix_key; +} + +void InspectorAgentState::InitFrom(InspectorSessionState* session_state) { + for (Field* f : fields_) + f->InitFrom(session_state); +} +} // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_session_state.h b/third_party/blink/renderer/core/inspector/inspector_session_state.h new file mode 100644 index 0000000..c28dc89 --- /dev/null +++ b/third_party/blink/renderer/core/inspector/inspector_session_state.h
@@ -0,0 +1,268 @@ +// Copyright 2018 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 THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_SESSION_STATE_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_SESSION_STATE_H_ + +#include <memory> +#include <type_traits> +#include <vector> +#include "third_party/blink/public/web/devtools_agent.mojom-blink.h" +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { +class InspectorAgentState; +// An abstraction for the inspector session state in the renderer. +// Makes the |reattach_state| sent from the browser available to the +// InspectorAgentState::Field instances, and queues the updates +// that are made to these fields. +class CORE_EXPORT InspectorSessionState { + public: + InspectorSessionState(mojom::blink::DevToolsSessionStatePtr reattach_state); + + // Make |reattach_state| available to InspectorAgentState::Field instances. + const mojom::blink::DevToolsSessionState* ReattachState() const; + + // Registers a field update in the stored session state and in the updates + // that are sent back to the browser. + // A null string for |value| indicates a deletion. + // TODO(johannes): Lower cost of repeated updates. + void EnqueueUpdate(const WTF::String& key, const WTF::String& value); + + // Yields and consumes the field updates that have thus far accumulated. + // These updates are sent back to DevToolsSession on the browser side. + mojom::blink::DevToolsSessionStatePtr TakeUpdates(); + + private: + const mojom::blink::DevToolsSessionStatePtr reattach_state_; + mojom::blink::DevToolsSessionStatePtr updates_; +}; + +// InspectorAgentState connects the fields of inspector agents +// with the renderer-side InspectorSessionState. +class CORE_EXPORT InspectorAgentState { + private: + // Trivial Helpers for converting between the value types used for the agent + // state fields and JSON strings used for the wire protocol. The point of + // these is to be able to call overloaded methods from the template + // implementations below; they just delegate to protocol::Value parsing + // and serialization. + static void EncodeToJSON(bool v, WTF::String* out); + static bool DecodeFromJSON(const WTF::String& in, bool* v); + static void EncodeToJSON(int32_t v, WTF::String* out); + static bool DecodeFromJSON(const WTF::String& in, int32_t* v); + static void EncodeToJSON(double v, WTF::String* out); + static bool DecodeFromJSON(const WTF::String& in, double* v); + static void EncodeToJSON(const WTF::String& v, WTF::String* out); + static bool DecodeFromJSON(const WTF::String& in, WTF::String* v); + + public: + // A field is connected to the |agent_state|, which initializes the field + // via ::InitFrom / ::Decode when the agent is (re)attached. + class Field { + public: + Field(InspectorAgentState* agent_state) + : prefix_key_(agent_state->RegisterField(this)) {} + virtual ~Field() = default; + + void InitFrom(InspectorSessionState* session_state) { + session_state_ = session_state; + Decode(); + } + + protected: + virtual void Decode() = 0; + + // The field instance is allowed to use/allocate any entry in + // the session state starting with this prefix. SimpleField instances + // just use prefix_key_ directly, MapField instances append a suffix. + const WTF::String prefix_key_; + InspectorSessionState* session_state_; + }; + + // A simple field with a default value, providing Get, Set, and Clear + // operations. E.g. an instantiation with WTF::String yields: + // - const WTF::String& Get(); + // - Set(const WTF::String&); + // - void Clear(); + template <class ValueType> + class SimpleField : public Field { + // Means in practice: const WTF::String& for WTF::String, otherwise same + // as ValueType. + using ConstRefType = + typename std::conditional<std::is_fundamental<ValueType>::value, + ValueType, + const ValueType&>::type; + + public: + // Constructs a new field registered with |agent_state| which + // will use |default_value| when not set. + SimpleField(InspectorAgentState* agent_state, ConstRefType default_value) + : Field(agent_state), + default_value_(default_value), + value_(default_value) {} + + // Returns the value of the field, or the default if not set. + ConstRefType Get() const { return value_; } + + // Sets the field to the value, or clears if |value| is the default. + void Set(ConstRefType value) { + if (value == value_) + return; + if (value == default_value_) { + Clear(); + return; + } + value_ = value; + WTF::String encoded_value; + EncodeToJSON(value, &encoded_value); + session_state_->EnqueueUpdate(prefix_key_, encoded_value); + } + + // Clears the field to its default. + void Clear() { + if (default_value_ == value_) + return; + value_ = default_value_; + session_state_->EnqueueUpdate(prefix_key_, WTF::String()); + } + + private: + // Decodes the key from the encoded session state. This is used + // during initialization when an agent is reattached. + void Decode() override { + const mojom::blink::DevToolsSessionState* reattach_state = + session_state_->ReattachState(); + if (!reattach_state) + return; + auto it = reattach_state->entries.find(prefix_key_); + if (it != reattach_state->entries.end()) + DecodeFromJSON(it->value, &value_); + } + + const ValueType default_value_; + ValueType value_; + }; + + // A map field provides a map from WTF::String to its value type, + // and Keys, Get, Set, Clear operations. + template <class ValueType> + class MapField : public Field { + // Means in practice: const WTF::String& for WTF::String, otherwise same + // as ValueType. + using ConstRefType = + typename std::conditional<std::is_fundamental<ValueType>::value, + ValueType, + const ValueType&>::type; + + public: + // Constructs a new field registered with |agent_state| which + // will use |default_value| for keys that are not set. + MapField(InspectorAgentState* agent_state, ConstRefType default_value) + : Field(agent_state), default_value_(default_value) {} + + // Enumerates the keys for which values are stored in this field. + // The order of the keys is undefined. + std::vector<WTF::String> Keys() const { + // TODO(johannes): It'd be nice to avoid copying; unfortunately + // it didn't seem easy to return map_.Keys(). + std::vector<WTF::String> keys; + for (const WTF::String& s : map_.Keys()) + keys.push_back(s); + return keys; + } + + // Returns the value for a given |key|, or the default value if + // the key wasn't set. + ConstRefType Get(const WTF::String& key) const { + auto it = map_.find(key); + return it == map_.end() ? default_value_ : it->value; + } + + // Sets the |value| for |key| as provided, except if |value| is the + // default value in which case |key| is cleared. + void Set(const WTF::String& key, ConstRefType value) { + if (value == default_value_) { + Clear(key); + return; + } + auto it = map_.find(key); + if (it != map_.end() && it->value == value) + return; + map_.Set(key, value); + WTF::String encoded_value; + EncodeToJSON(value, &encoded_value); + session_state_->EnqueueUpdate(prefix_key_ + key, encoded_value); + } + + // Clears the entry for |key|. + void Clear(const WTF::String& key) { + auto it = map_.find(key); + if (it == map_.end()) + return; + map_.erase(it); + session_state_->EnqueueUpdate(prefix_key_ + key, WTF::String()); + } + + // Clears the entire field. + void ClearAll() { + // TODO(johannes): Handle this in a single update. + for (const WTF::String& key : map_.Keys()) + session_state_->EnqueueUpdate(prefix_key_ + key, WTF::String()); + map_.clear(); + } + + private: + // Decodes the key from the encoded session state. This is used + // during initialization when an agent is reattached. + void Decode() override { + const mojom::blink::DevToolsSessionState* reattach_state = + session_state_->ReattachState(); + if (!reattach_state) + return; + // TODO(johannes): Avoid scanning all keys, let session_state_ provide + // the keys that match a prefix. + for (const auto& entry : reattach_state->entries) { + if (!entry.key.StartsWith(prefix_key_)) + continue; + WTF::String suffix_key = entry.key.Substring(prefix_key_.length()); + ValueType v; + if (DecodeFromJSON(entry.value, &v)) + map_.Set(suffix_key, v); + } + } + + const ValueType default_value_; + WTF::HashMap<WTF::String, ValueType> map_; + }; + + using Boolean = SimpleField<bool>; + using Integer = SimpleField<int32_t>; + using Double = SimpleField<double>; + using String = SimpleField<WTF::String>; + using BooleanMap = MapField<bool>; + using IntegerMap = MapField<int32_t>; + using DoubleMap = MapField<double>; + using StringMap = MapField<WTF::String>; + + InspectorAgentState(const WTF::String& domain_name); + + // Registers |field| and returns the prefix key for it. + // The prefix key is domain_name + "." + index in fields_ + "/", + // e.g. "network.0/". + WTF::String RegisterField(Field* field); + + // Init must be called *after* all fields are registered with the + // InspectorAgentState. Usually, the fact that fields are registered in + // the constructors / initializers of agents takes care of it. + void InitFrom(InspectorSessionState* session_state); + + private: + const WTF::String domain_name_; + std::vector<Field*> fields_; +}; +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_SESSION_STATE_H_
diff --git a/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc b/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc new file mode 100644 index 0000000..50b19ea8 --- /dev/null +++ b/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc
@@ -0,0 +1,227 @@ +// Copyright (c) 2018 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 "third_party/blink/renderer/core/inspector/inspector_session_state.h" + +#include "build/build_config.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { +using mojom::blink::DevToolsSessionState; +using mojom::blink::DevToolsSessionStatePtr; +using std::unique_ptr; +using testing::UnorderedElementsAre; + +// This session object is normally on the browser side; see +// content/browser/devtools/devtools_session.{h,cc}, but here's a minimal +// reimplementation to allow testing without sending data through a Mojo pipe. +class DevToolsSession { + public: + void ApplyUpdates(DevToolsSessionStatePtr updates) { + if (!updates) + return; + if (!session_state_cookie_) + session_state_cookie_ = DevToolsSessionState::New(); + for (auto& entry : updates->entries) { + if (!entry.value.IsNull()) + session_state_cookie_->entries.Set(entry.key, std::move(entry.value)); + else + session_state_cookie_->entries.erase(entry.key); + } + } + + DevToolsSessionStatePtr CloneCookie() const { + return session_state_cookie_.Clone(); + } + + DevToolsSessionStatePtr session_state_cookie_; +}; + +// The InspectorAgentState abstraction is used to group the +// fields of an agent together, and to connect it to the +// InspectorSessionState instance, from which fields +// may receive their initial state (if we reattach) +// and to which fields send their updates. +// In this test, we use a simple struct rather than +// an agent class (like InspectorPageAgent) with a few fields. +struct AgentWithSimpleFields { + AgentWithSimpleFields() + : agent_state_("simple_agent"), + enabled_(&agent_state_, /*default_value=*/false), + field1_(&agent_state_, /*default_value=*/0.0), + multiplier_(&agent_state_, /*default_value=*/1.0), + counter_(&agent_state_, /*default_value=*/1), + message_(&agent_state_, /*default_value=*/WTF::String()) {} + + InspectorAgentState agent_state_; + InspectorAgentState::Boolean enabled_; + InspectorAgentState::Double field1_; + InspectorAgentState::Double multiplier_; + InspectorAgentState::Integer counter_; + InspectorAgentState::String message_; +}; + +TEST(InspectorSessionStateTest, SimpleFields) { + // The browser session (DevToolsSession) remains live while renderer + // sessions (InspectorSession - here we just exercise + // InspectorSessionState) may come and go. + DevToolsSession dev_tools_session; + + { // Renderer session. + InspectorSessionState session_state(dev_tools_session.CloneCookie()); + AgentWithSimpleFields simple_agent; + simple_agent.agent_state_.InitFrom(&session_state); + + simple_agent.enabled_.Set(true); + simple_agent.field1_.Set(11.0); + simple_agent.multiplier_.Set(42.0); + simple_agent.counter_.Set(311); + + EXPECT_EQ(true, simple_agent.enabled_.Get()); + EXPECT_EQ(11.0, simple_agent.field1_.Get()); + EXPECT_EQ(42.0, simple_agent.multiplier_.Get()); + EXPECT_EQ(311, simple_agent.counter_.Get()); + + // Now send the updates back to the browser session. + dev_tools_session.ApplyUpdates(session_state.TakeUpdates()); + } + + { // Restore renderer session, verify, then make additional updates. + InspectorSessionState session_state(dev_tools_session.CloneCookie()); + AgentWithSimpleFields simple_agent; + simple_agent.agent_state_.InitFrom(&session_state); + + EXPECT_EQ(true, simple_agent.enabled_.Get()); + EXPECT_EQ(11.0, simple_agent.field1_.Get()); + EXPECT_EQ(42.0, simple_agent.multiplier_.Get()); + EXPECT_EQ(311, simple_agent.counter_.Get()); + + simple_agent.enabled_.Set(false); + simple_agent.multiplier_.Clear(); + simple_agent.field1_.Set(-1.0); + simple_agent.counter_.Set(312); + + // Now send the updates back to the browser session. + dev_tools_session.ApplyUpdates(session_state.TakeUpdates()); + } + + { // Restore renderer session, verify, then clear everything. + InspectorSessionState session_state(dev_tools_session.CloneCookie()); + AgentWithSimpleFields simple_agent; + simple_agent.agent_state_.InitFrom(&session_state); + + EXPECT_EQ(false, simple_agent.enabled_.Get()); + EXPECT_EQ(-1.0, simple_agent.field1_.Get()); + EXPECT_EQ(1.0, simple_agent.multiplier_.Get()); + EXPECT_EQ(312, simple_agent.counter_.Get()); + + simple_agent.enabled_.Clear(); + simple_agent.multiplier_.Set(1.0); // default value => clears. + simple_agent.field1_.Clear(); + simple_agent.counter_.Clear(); + } +} + +// This agent test struct exercises maps from strings to strings +// and strings to doubles. +struct AgentWithMapFields { + AgentWithMapFields() + : agent_state_("map_agents"), + strings_(&agent_state_, /*default_value=*/WTF::String()), + doubles_(&agent_state_, /*default_value=*/0.0) {} + + InspectorAgentState agent_state_; + InspectorAgentState::StringMap strings_; + InspectorAgentState::DoubleMap doubles_; +}; + +TEST(InspectorSessionStateTest, MapFields) { + DevToolsSession dev_tools_session; // Browser session. + + { // Renderer session. + InspectorSessionState session_state(dev_tools_session.CloneCookie()); + AgentWithMapFields maps_agent; + maps_agent.agent_state_.InitFrom(&session_state); + + maps_agent.strings_.Set("key1", "Hello, world."); + maps_agent.strings_.Set("key2", WTF::String::FromUTF8("I ❤ Unicode.")); + + EXPECT_THAT(maps_agent.strings_.Keys(), + UnorderedElementsAre("key1", "key2")); + EXPECT_EQ("Hello, world.", maps_agent.strings_.Get("key1")); + EXPECT_EQ(WTF::String::FromUTF8("I ❤ Unicode."), + maps_agent.strings_.Get("key2")); + EXPECT_TRUE(maps_agent.strings_.Get("key3").IsNull()); + + // Now send the updates back to the browser session. + dev_tools_session.ApplyUpdates(session_state.TakeUpdates()); + } + + { // Restore renderer session, verify, then make additional updates. + InspectorSessionState session_state(dev_tools_session.CloneCookie()); + AgentWithMapFields maps_agent; + maps_agent.agent_state_.InitFrom(&session_state); + + EXPECT_THAT(maps_agent.strings_.Keys(), + UnorderedElementsAre("key1", "key2")); + EXPECT_EQ("Hello, world.", maps_agent.strings_.Get("key1")); + EXPECT_EQ(WTF::String::FromUTF8("I ❤ Unicode."), + maps_agent.strings_.Get("key2")); + EXPECT_TRUE(maps_agent.strings_.Get("key3").IsNull()); + + maps_agent.strings_.Clear("key1"); + maps_agent.strings_.Set("key2", "updated message for key 2"); + maps_agent.strings_.Set("key3", "new message for key 3"); + + // Now send the updates back to the browser session. + dev_tools_session.ApplyUpdates(session_state.TakeUpdates()); + } + + { // Restore renderer session and verify. + InspectorSessionState session_state(dev_tools_session.CloneCookie()); + AgentWithMapFields maps_agent; + maps_agent.agent_state_.InitFrom(&session_state); + + EXPECT_THAT(maps_agent.strings_.Keys(), + UnorderedElementsAre("key2", "key3")); + EXPECT_TRUE(maps_agent.strings_.Get("key1").IsNull()); + EXPECT_EQ("updated message for key 2", maps_agent.strings_.Get("key2")); + EXPECT_EQ("new message for key 3", maps_agent.strings_.Get("key3")); + + maps_agent.strings_.ClearAll(); + + dev_tools_session.ApplyUpdates(session_state.TakeUpdates()); + } + + // The cookie should be empty since everything is cleared. + DevToolsSessionStatePtr cookie = dev_tools_session.CloneCookie(); + EXPECT_TRUE(cookie->entries.IsEmpty()); +} + +TEST(InspectorSessionStateTest, MultipleAgents) { + DevToolsSession dev_tools_session; // Browser session. + + { // Renderer session. + InspectorSessionState session_state(dev_tools_session.CloneCookie()); + AgentWithSimpleFields simple_agent; + simple_agent.agent_state_.InitFrom(&session_state); + AgentWithMapFields maps_agent; + maps_agent.agent_state_.InitFrom(&session_state); + + simple_agent.message_.Set("Hello, world."); + maps_agent.doubles_.Set("Pi", 3.1415); + dev_tools_session.ApplyUpdates(session_state.TakeUpdates()); + } + + // Show that the keys for the field values are prefixed with the domain name + // passed to AgentState so that the stored values won't collide. + DevToolsSessionStatePtr cookie = dev_tools_session.CloneCookie(); + std::vector<WTF::String> keys; + for (const WTF::String& k : cookie->entries.Keys()) + keys.push_back(k); + + EXPECT_THAT(keys, UnorderedElementsAre("map_agents.1/Pi", "simple_agent.4/")); +} +} // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/worker_inspector_controller.cc b/third_party/blink/renderer/core/inspector/worker_inspector_controller.cc index 1918108e..f1f5273 100644 --- a/third_party/blink/renderer/core/inspector/worker_inspector_controller.cc +++ b/third_party/blink/renderer/core/inspector/worker_inspector_controller.cc
@@ -74,7 +74,7 @@ InspectorSession* session = new InspectorSession( this, probe_sink_.Get(), session_id, debugger_->GetV8Inspector(), - debugger_->ContextGroupId(thread_), String()); + debugger_->ContextGroupId(thread_), String(), nullptr); session->Append(new InspectorLogAgent(thread_->GetConsoleMessageStorage(), nullptr, session->V8Session())); if (thread_->GlobalScope()->IsWorkerGlobalScope()) { @@ -125,10 +125,12 @@ it.value->flushProtocolNotifications(); } -void WorkerInspectorController::SendProtocolResponse(int session_id, - int call_id, - const String& response, - const String& state) { +void WorkerInspectorController::SendProtocolResponse( + int session_id, + int call_id, + const String& response, + const String& state, + mojom::blink::DevToolsSessionStatePtr updates) { // Make tests more predictable by flushing all sessions before sending // protocol response in any of them. if (LayoutTestSupport::IsRunningLayoutTest()) @@ -138,9 +140,11 @@ response); } -void WorkerInspectorController::SendProtocolNotification(int session_id, - const String& message, - const String& state) { +void WorkerInspectorController::SendProtocolNotification( + int session_id, + const String& message, + const String& state, + mojom::blink::DevToolsSessionStatePtr updates) { thread_->GetWorkerReportingProxy().PostMessageToPageInspector(session_id, message); }
diff --git a/third_party/blink/renderer/core/inspector/worker_inspector_controller.h b/third_party/blink/renderer/core/inspector/worker_inspector_controller.h index 4b6509d7..57f984a 100644 --- a/third_party/blink/renderer/core/inspector/worker_inspector_controller.h +++ b/third_party/blink/renderer/core/inspector/worker_inspector_controller.h
@@ -67,13 +67,17 @@ WorkerInspectorController(WorkerThread*, WorkerThreadDebugger*); // InspectorSession::Client implementation. - void SendProtocolResponse(int session_id, - int call_id, - const String& response, - const String& state) override; - void SendProtocolNotification(int session_id, - const String& message, - const String& state) override; + void SendProtocolResponse( + int session_id, + int call_id, + const String& response, + const String& state, + mojom::blink::DevToolsSessionStatePtr updates) override; + void SendProtocolNotification( + int session_id, + const String& message, + const String& state, + mojom::blink::DevToolsSessionStatePtr updates) override; // WebThread::TaskObserver implementation. void WillProcessTask() override;
diff --git a/third_party/blink/renderer/core/layout/flexible_box_algorithm.h b/third_party/blink/renderer/core/layout/flexible_box_algorithm.h index 05635caa..f7aae55 100644 --- a/third_party/blink/renderer/core/layout/flexible_box_algorithm.h +++ b/third_party/blink/renderer/core/layout/flexible_box_algorithm.h
@@ -62,9 +62,8 @@ class FlexItem { public: + // flex_base_content_size includes scrollbar width but not border or padding. FlexItem(LayoutBox*, - // flex_base_content_size includes scrollbar width but not border or - // padding. LayoutUnit flex_base_content_size, MinMaxSize min_max_sizes, LayoutUnit main_axis_border_and_padding, @@ -248,6 +247,7 @@ // Computes the next flex line, stores it in FlexLines(), and returns a // pointer to it. Returns nullptr if there are no more lines. + // container_logical_width is the border box width. FlexLine* ComputeNextFlexLine(LayoutUnit container_logical_width); bool IsHorizontalFlow() const;
diff --git a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc index f589fe0..02b79e4 100644 --- a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc +++ b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
@@ -703,9 +703,12 @@ LayoutRect layer_bounds; ClipRect damage_rect, clip_rect_to_apply; layer->Clipper(PaintLayer::kUseGeometryMapper) - .CalculateRects(ClipRectsContext(root_layer, kUncachedClipRects), - &layer->GetLayoutObject().FirstFragment(), &paint_rect, - layer_bounds, damage_rect, clip_rect_to_apply); + .CalculateRects( + ClipRectsContext(root_layer, + &root_layer->GetLayoutObject().FirstFragment(), + kUncachedClipRects), + &layer->GetLayoutObject().FirstFragment(), &paint_rect, layer_bounds, + damage_rect, clip_rect_to_apply); LayoutPoint offset_from_root; layer->ConvertToLayerCoords(root_layer, offset_from_root);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.cc index 2246db2..f0dfcd6 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_text_fragment.cc
@@ -42,7 +42,8 @@ offset -= start_offset_; if (shape_result_) { - return round(shape_result_->PositionForOffset(offset, adjust_mid_cluster)); + return round(shape_result_->CaretPositionForOffset(offset, Text(), + adjust_mid_cluster)); } // This fragment is a flow control because otherwise ShapeResult exists. @@ -192,8 +193,8 @@ const LayoutUnit& point_in_line_direction = style.IsHorizontalWritingMode() ? point.left : point.top; if (const ShapeResult* shape_result = TextShapeResult()) { - return shape_result->OffsetForPosition(point_in_line_direction.ToFloat(), - IncludePartialGlyphs, BreakGlyphs) + + return shape_result->CaretOffsetForHitTest( + point_in_line_direction.ToFloat(), Text(), BreakGlyphs) + StartOffset(); }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc index c6e35df..064ad8b 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
@@ -26,11 +26,15 @@ DCHECK(!NeedMinMaxSize(ConstraintSpace(), Style())) << "Don't support that yet"; + NGLogicalSize flex_container_border_box_size = + CalculateBorderBoxSize(ConstraintSpace(), Node()); + NGLogicalSize flex_container_content_box_size = CalculateContentBoxSize( + flex_container_border_box_size, + CalculateBorderScrollbarPadding(ConstraintSpace(), Node())); LayoutUnit flex_container_border_box_inline_size = - ComputeInlineSizeForFragment(ConstraintSpace(), Node()); + flex_container_border_box_size.inline_size; LayoutUnit flex_container_content_inline_size = - flex_container_border_box_inline_size - - CalculateBorderScrollbarPadding(ConstraintSpace(), Node()).InlineSum(); + flex_container_content_box_size.inline_size; Vector<FlexItem> flex_items; for (NGLayoutInputNode generic_child = Node().FirstChild(); generic_child; @@ -40,11 +44,8 @@ continue; NGConstraintSpaceBuilder space_builder(ConstraintSpace()); - // TODO(dgrogan): Set the percentage size also, which is possibly - // flex_container_content_inline_size. Also change NGSizeIndefinite to - // container size if it's definite. - space_builder.SetAvailableSize( - NGLogicalSize{flex_container_content_inline_size, NGSizeIndefinite}); + space_builder.SetAvailableSize(flex_container_content_box_size); + space_builder.SetPercentageResolutionSize(flex_container_content_box_size); scoped_refptr<NGConstraintSpace> child_space = space_builder.ToConstraintSpace(child.Style().GetWritingMode()); @@ -57,10 +58,6 @@ MinMaxSize min_max_sizes_border_box = child.ComputeMinMaxSize( ConstraintSpace().GetWritingMode(), zero_input, child_space.get()); - // Spec calls this "flex base size" - // https://www.w3.org/TR/css-flexbox-1/#algo-main-item - // Blink's FlexibleBoxAlgorithm expects it to be content + scrollbar widths, - // but no padding or border. LayoutUnit flex_base_border_box; if (child.Style().FlexBasis().IsAuto() && child.Style().Width().IsAuto()) { flex_base_border_box = min_max_sizes_border_box.max_size; @@ -78,6 +75,10 @@ LengthResolvePhase::kLayout); } + // Spec calls this "flex base size" + // https://www.w3.org/TR/css-flexbox-1/#algo-main-item + // Blink's FlexibleBoxAlgorithm expects it to be content + scrollbar widths, + // but no padding or border. LayoutUnit flex_base_content_size = flex_base_border_box - main_axis_border_and_padding; @@ -104,11 +105,11 @@ NGBoxStrut borders_scrollbar_padding = CalculateBorderScrollbarPadding(ConstraintSpace(), Node()); - LayoutUnit main_axis_offset = borders_scrollbar_padding.InlineSum(); - LayoutUnit cross_axis_offset = borders_scrollbar_padding.BlockSum(); + LayoutUnit main_axis_offset = borders_scrollbar_padding.inline_start; + LayoutUnit cross_axis_offset = borders_scrollbar_padding.block_start; FlexLine* line; while ((line = algorithm.ComputeNextFlexLine( - flex_container_content_inline_size))) { + flex_container_border_box_inline_size))) { // TODO(dgrogan): This parameter is more complicated for columns. line->SetContainerMainInnerSize(flex_container_content_inline_size); line->FreezeInflexibleItems(); @@ -118,11 +119,12 @@ for (size_t i = 0; i < line->line_items.size(); ++i) { FlexItem& flex_item = line->line_items[i]; NGConstraintSpaceBuilder space_builder(ConstraintSpace()); - // TODO(dgrogan): Set the percentage size also. - space_builder.SetAvailableSize( - {flex_item.flexed_content_size + - flex_item.main_axis_border_and_padding, - NGSizeIndefinite}); + NGLogicalSize available_size(flex_item.flexed_content_size + + flex_item.main_axis_border_and_padding, + flex_container_content_box_size.block_size); + space_builder.SetAvailableSize(available_size); + space_builder.SetPercentageResolutionSize( + flex_container_content_box_size); space_builder.SetIsFixedSizeInline(true); scoped_refptr<NGConstraintSpace> child_space = space_builder.ToConstraintSpace(
diff --git a/third_party/blink/renderer/core/loader/BUILD.gn b/third_party/blink/renderer/core/loader/BUILD.gn index 0f384d92..7d118b1 100644 --- a/third_party/blink/renderer/core/loader/BUILD.gn +++ b/third_party/blink/renderer/core/loader/BUILD.gn
@@ -125,8 +125,6 @@ "threadable_loader.cc", "threadable_loader.h", "threadable_loader_client.h", - "threadable_loading_context.cc", - "threadable_loading_context.h", "worker_fetch_context.cc", "worker_fetch_context.h", ]
diff --git a/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc b/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc index 54878e0..96fc360 100644 --- a/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc +++ b/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.h" +#include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/workers/worker_global_scope.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/network/http_names.h" @@ -61,6 +62,19 @@ // and run them after module loading. This may require the spec change. // (https://crbug.com/845285) + // Ensure redirects don't affect SecurityOrigin. + const KURL request_url = resource->Url(); + const KURL response_url = resource->GetResponse().Url(); + if (request_url != response_url && + !global_scope_->GetSecurityOrigin()->IsSameSchemeHostPort( + SecurityOrigin::Create(response_url).get())) { + error_messages.push_back(ConsoleMessage::Create( + kSecurityMessageSource, kErrorMessageLevel, + "Refused to cross-origin redirects of the top-level worker script.")); + client_->NotifyFetchFinished(base::nullopt, error_messages); + return; + } + // Step 13.3. "Set worker global scope's url to response's url." [spec text] // Step 13.4. "Set worker global scope's HTTPS state to response's HTTPS // state." [spec text]
diff --git a/third_party/blink/renderer/core/loader/threadable_loader.cc b/third_party/blink/renderer/core/loader/threadable_loader.cc index 8422e12b..20f364f 100644 --- a/third_party/blink/renderer/core/loader/threadable_loader.cc +++ b/third_party/blink/renderer/core/loader/threadable_loader.cc
@@ -54,8 +54,8 @@ #include "third_party/blink/renderer/core/loader/base_fetch_context.h" #include "third_party/blink/renderer/core/loader/frame_loader.h" #include "third_party/blink/renderer/core/loader/threadable_loader_client.h" -#include "third_party/blink/renderer/core/loader/threadable_loading_context.h" #include "third_party/blink/renderer/core/probe/core_probes.h" +#include "third_party/blink/renderer/core/workers/worker_global_scope.h" #include "third_party/blink/renderer/platform/exported/wrapped_resource_request.h" #include "third_party/blink/renderer/platform/heap/self_keep_alive.h" #include "third_party/blink/renderer/platform/loader/cors/cors.h" @@ -245,32 +245,30 @@ } ThreadableLoader::ThreadableLoader( - ExecutionContext& context, + ExecutionContext& execution_context, ThreadableLoaderClient* client, - const ResourceLoaderOptions& resource_loader_options, - const base::Optional<TimeDelta>& timeout) + const ResourceLoaderOptions& resource_loader_options) : client_(client), - loading_context_(ThreadableLoadingContext::Create(context)), - timeout_(timeout), + execution_context_(execution_context), resource_loader_options_(resource_loader_options), out_of_blink_cors_(RuntimeEnabledFeatures::OutOfBlinkCORSEnabled()), cors_flag_(false), security_origin_(resource_loader_options_.security_origin), is_using_data_consumer_handle_(false), - async_(resource_loader_options.synchronous_policy == kRequestAsynchronously), + async_(resource_loader_options.synchronous_policy == + kRequestAsynchronously), request_context_(WebURLRequest::kRequestContextUnspecified), fetch_request_mode_(network::mojom::FetchRequestMode::kSameOrigin), fetch_credentials_mode_(network::mojom::FetchCredentialsMode::kOmit), - timeout_timer_( - GetExecutionContext()->GetTaskRunner(TaskType::kNetworking), - this, - &ThreadableLoader::DidTimeout), + timeout_timer_(execution_context_->GetTaskRunner(TaskType::kNetworking), + this, + &ThreadableLoader::DidTimeout), cors_redirect_limit_(0), redirect_mode_(network::mojom::FetchRedirectMode::kFollow), override_referrer_(false) { DCHECK(client); - // timeout_ should either be base::nullopt to indicate no timeout, or non-zero. - DCHECK(!timeout_ || !timeout_->is_zero()); + if (execution_context_->IsWorkerGlobalScope()) + ToWorkerGlobalScope(execution_context_)->EnsureFetcher(); } void ThreadableLoader::Start(const ResourceRequest& request) { @@ -326,7 +324,7 @@ // Set the service worker mode to none if "bypass for network" in DevTools is // enabled. bool should_bypass_service_worker = false; - probe::shouldBypassServiceWorker(GetExecutionContext(), + probe::shouldBypassServiceWorker(execution_context_, &should_bypass_service_worker); if (should_bypass_service_worker) new_request.SetSkipServiceWorker(true); @@ -342,8 +340,7 @@ // is_controlled_by_service_worker is the same as // ControllerServiceWorkerMode::kControlled, so this code can be simplified. bool is_controlled_by_service_worker = false; - switch ( - loading_context_->GetResourceFetcher()->IsControlledByServiceWorker()) { + switch (execution_context_->Fetcher()->IsControlledByServiceWorker()) { case blink::mojom::ControllerServiceWorkerMode::kControlled: is_controlled_by_service_worker = true; break; @@ -464,7 +461,7 @@ // https://wicg.github.io/cors-rfc1918/#integration-fetch String error_message; // TODO(yhirano): Consider moving this branch elsewhere. - if (!GetExecutionContext()->IsSecureContext(error_message) && + if (!execution_context_->IsSecureContext(error_message) && request.IsExternalRequest()) { // TODO(yhirano): Fix the link. DispatchDidFail(ResourceError::CancelledDueToAccessCheckError( @@ -520,7 +517,7 @@ bool should_ignore_preflight_cache = false; // Prevent use of the CORS preflight cache when instructed by the DevTools // not to use caches. - probe::shouldForceCORSPreflight(GetExecutionContext(), + probe::shouldForceCORSPreflight(execution_context_, &should_ignore_preflight_cache); if (should_ignore_preflight_cache || !CORS::CheckIfRequestCanSkipPreflight( @@ -551,27 +548,29 @@ DCHECK(!GetResource()); } -void ThreadableLoader::OverrideTimeout(unsigned long timeout_milliseconds) { - DCHECK(async_); +void ThreadableLoader::SetTimeout(const TimeDelta& timeout) { + timeout_ = timeout; - // |m_requestStartedSeconds| == 0.0 indicates loading is already finished and - // |m_timeoutTimer| is already stopped, and thus we do nothing for such cases. - // See https://crbug.com/551663 for details. - if (request_started_ <= TimeTicks()) + // |request_started_| <= TimeTicks() indicates loading is either not yet + // started or is already finished, and thus we don't need to do anything with + // timeout_timer_. + if (request_started_ <= TimeTicks()) { + DCHECK(!timeout_timer_.IsActive()); return; + } + DCHECK(async_); timeout_timer_.Stop(); - // At the time of this method's implementation, it is only ever called by - // XMLHttpRequest, when the timeout attribute is set after sending the - // request. + + // At the time of this method's implementation, it is only ever called for an + // inflight request by XMLHttpRequest. // // The XHR request says to resolve the time relative to when the request // was initially sent, however other uses of this method may need to // behave differently, in which case this should be re-arranged somehow. - if (timeout_milliseconds) { + if (!timeout_.is_zero()) { TimeDelta elapsed_time = CurrentTimeTicks() - request_started_; - TimeDelta next_fire = TimeDelta::FromMilliseconds(timeout_milliseconds); - TimeDelta resolved_time = std::max(next_fire - elapsed_time, TimeDelta()); + TimeDelta resolved_time = std::max(timeout_ - elapsed_time, TimeDelta()); timeout_timer_.StartOneShot(resolved_time, FROM_HERE); } } @@ -695,7 +694,7 @@ --cors_redirect_limit_; probe::didReceiveCORSRedirectResponse( - GetExecutionContext(), resource->Identifier(), + execution_context_, resource->Identifier(), GetDocument() && GetDocument()->GetFrame() ? GetDocument()->GetFrame()->Loader().GetDocumentLoader() : nullptr, @@ -871,7 +870,7 @@ if (!frame) return; DocumentLoader* loader = frame->Loader().GetDocumentLoader(); - probe::didReceiveResourceResponse(GetExecutionContext(), identifier, loader, + probe::didReceiveResourceResponse(execution_context_, identifier, loader, response, GetResource()); frame->Console().ReportResourceResponseReceived(loader, identifier, response); } @@ -1084,7 +1083,7 @@ *error.CORSErrorStatus(), initial_request_url_, last_request_url_, *GetSecurityOrigin(), Resource::kRaw, resource_loader_options_.initiator_info.name); - GetExecutionContext()->AddConsoleMessage(ConsoleMessage::Create( + execution_context_->AddConsoleMessage(ConsoleMessage::Create( kJSMessageSource, kErrorMessageLevel, std::move(message))); } ThreadableLoaderClient* client = client_; @@ -1123,13 +1122,13 @@ if (!actual_request_.IsNull()) resource_loader_options.data_buffering_policy = kBufferData; - if (timeout_) { + if (!timeout_.is_zero()) { if (!async_) { - request.SetTimeoutInterval(*timeout_); + request.SetTimeoutInterval(timeout_); } else if (!timeout_timer_.IsActive()) { // The timer can be active if this is the actual request of a // CORS-with-preflight request. - timeout_timer_.StartOneShot(*timeout_, FROM_HERE); + timeout_timer_.StartOneShot(timeout_, FROM_HERE); } } @@ -1137,7 +1136,7 @@ DCHECK(!GetResource()); checker_.WillAddClient(); - ResourceFetcher* fetcher = loading_context_->GetResourceFetcher(); + ResourceFetcher* fetcher = execution_context_->Fetcher(); if (request.GetRequestContext() == WebURLRequest::kRequestContextVideo || request.GetRequestContext() == WebURLRequest::kRequestContextAudio) { DCHECK(async_); @@ -1163,25 +1162,19 @@ } const SecurityOrigin* ThreadableLoader::GetSecurityOrigin() const { - return security_origin_ - ? security_origin_.get() - : loading_context_->GetFetchContext()->GetSecurityOrigin(); + return security_origin_ ? security_origin_.get() + : execution_context_->GetSecurityOrigin(); } Document* ThreadableLoader::GetDocument() const { - ExecutionContext* context = GetExecutionContext(); + ExecutionContext* context = execution_context_; if (context->IsDocument()) return ToDocument(context); return nullptr; } -ExecutionContext* ThreadableLoader::GetExecutionContext() const { - DCHECK(loading_context_); - return loading_context_->GetExecutionContext(); -} - void ThreadableLoader::Trace(blink::Visitor* visitor) { - visitor->Trace(loading_context_); + visitor->Trace(execution_context_); RawResourceClient::Trace(visitor); }
diff --git a/third_party/blink/renderer/core/loader/threadable_loader.h b/third_party/blink/renderer/core/loader/threadable_loader.h index d639375d..dd1c57f 100644 --- a/third_party/blink/renderer/core/loader/threadable_loader.h +++ b/third_party/blink/renderer/core/loader/threadable_loader.h
@@ -57,7 +57,6 @@ class KURL; class ResourceRequest; class SecurityOrigin; -class ThreadableLoadingContext; class ThreadableLoaderClient; // Useful for doing loader operations from any thread (not threadsafe, just able @@ -104,8 +103,7 @@ // ThreadableLoaderClient methods may call cancel(). ThreadableLoader(ExecutionContext&, ThreadableLoaderClient*, - const ResourceLoaderOptions&, - const base::Optional<TimeDelta>& timeout); + const ResourceLoaderOptions&); ~ThreadableLoader() override; // Exposed for testing. Code outside this class should not call this function. @@ -119,9 +117,11 @@ // cases, for the timeout to be overridden after the request is sent (for // example, XMLHttpRequests may override their timeout setting after sending). // - // Set a new timeout relative to the time the request started, in - // milliseconds. - void OverrideTimeout(unsigned long timeout_milliseconds); + // If the request has already started, the new timeout will be relative to the + // time the request started. + // + // Passing a timeout of zero means there should be no timeout. + void SetTimeout(const TimeDelta& timeout); void Cancel(); @@ -211,12 +211,11 @@ // Returns null if the loader is not associated with Document. // TODO(kinuko): Remove dependency to document. Document* GetDocument() const; - ExecutionContext* GetExecutionContext() const; ThreadableLoaderClient* client_; - Member<ThreadableLoadingContext> loading_context_; + Member<ExecutionContext> execution_context_; - const base::Optional<TimeDelta> timeout_; + TimeDelta timeout_; // Some items may be overridden by m_forceDoNotAllowStoredCredentials and // m_securityOrigin. In such a case, build a ResourceLoaderOptions with // up-to-date values from them and this variable, and use it.
diff --git a/third_party/blink/renderer/core/loader/threadable_loader_test.cc b/third_party/blink/renderer/core/loader/threadable_loader_test.cc index 8a7cdf37..f346c48d 100644 --- a/third_party/blink/renderer/core/loader/threadable_loader_test.cc +++ b/third_party/blink/renderer/core/loader/threadable_loader_test.cc
@@ -19,7 +19,6 @@ #include "third_party/blink/public/platform/web_worker_fetch_context.h" #include "third_party/blink/renderer/core/loader/threadable_loader.h" #include "third_party/blink/renderer/core/loader/threadable_loader_client.h" -#include "third_party/blink/renderer/core/loader/threadable_loading_context.h" #include "third_party/blink/renderer/core/loader/worker_fetch_context.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" #include "third_party/blink/renderer/core/workers/worker_reporting_proxy.h" @@ -197,7 +196,7 @@ void CreateLoader(ThreadableLoaderClient* client) override { ResourceLoaderOptions resource_loader_options; loader_ = new ThreadableLoader(GetDocument(), client, - resource_loader_options, base::nullopt); + resource_loader_options); } void StartLoader(const ResourceRequest& request) override { @@ -335,8 +334,7 @@ security_origin_ = GetDocument().GetSecurityOrigin(); parent_execution_context_task_runners_ = ParentExecutionContextTaskRunners::Create(&GetDocument()); - worker_thread_ = std::make_unique<WorkerThreadForTest>( - ThreadableLoadingContext::Create(GetDocument()), *reporting_proxy_); + worker_thread_ = std::make_unique<WorkerThreadForTest>(*reporting_proxy_); WorkerClients* worker_clients = WorkerClients::Create(); ProvideWorkerFetchContextToWorker( @@ -394,7 +392,7 @@ DCHECK(worker_thread_->GlobalScope()->IsWorkerGlobalScope()); loader_ = new ThreadableLoader(*worker_thread_->GlobalScope(), client, - resource_loader_options, base::nullopt); + resource_loader_options); DCHECK(loader_); event->Signal(); }
diff --git a/third_party/blink/renderer/core/loader/threadable_loading_context.cc b/third_party/blink/renderer/core/loader/threadable_loading_context.cc deleted file mode 100644 index f709dd0d..0000000 --- a/third_party/blink/renderer/core/loader/threadable_loading_context.cc +++ /dev/null
@@ -1,88 +0,0 @@ -// 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 "third_party/blink/renderer/core/loader/threadable_loading_context.h" - -#include "third_party/blink/renderer/core/dom/document.h" -#include "third_party/blink/renderer/core/loader/worker_fetch_context.h" -#include "third_party/blink/renderer/core/workers/worker_global_scope.h" -#include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" - -namespace blink { - -class DocumentThreadableLoadingContext final : public ThreadableLoadingContext { - public: - explicit DocumentThreadableLoadingContext(Document& document) - : document_(&document) {} - - ~DocumentThreadableLoadingContext() override = default; - - ResourceFetcher* GetResourceFetcher() override { - DCHECK(IsContextThread()); - return document_->Fetcher(); - } - - ExecutionContext* GetExecutionContext() override { - DCHECK(IsContextThread()); - return document_.Get(); - } - - void Trace(blink::Visitor* visitor) override { - visitor->Trace(document_); - ThreadableLoadingContext::Trace(visitor); - } - - private: - bool IsContextThread() const { return document_->IsContextThread(); } - - Member<Document> document_; -}; - -class WorkerThreadableLoadingContext : public ThreadableLoadingContext { - public: - explicit WorkerThreadableLoadingContext( - WorkerGlobalScope& worker_global_scope) - : worker_global_scope_(&worker_global_scope) {} - - ~WorkerThreadableLoadingContext() override = default; - - ResourceFetcher* GetResourceFetcher() override { - DCHECK(IsContextThread()); - return worker_global_scope_->EnsureFetcher(); - } - - ExecutionContext* GetExecutionContext() override { - DCHECK(IsContextThread()); - return worker_global_scope_.Get(); - } - - void Trace(blink::Visitor* visitor) override { - visitor->Trace(worker_global_scope_); - ThreadableLoadingContext::Trace(visitor); - } - - private: - bool IsContextThread() const { - DCHECK(worker_global_scope_); - return worker_global_scope_->IsContextThread(); - } - - Member<WorkerGlobalScope> worker_global_scope_; -}; - -ThreadableLoadingContext* ThreadableLoadingContext::Create( - ExecutionContext& context) { - if (context.IsDocument()) - return new DocumentThreadableLoadingContext(ToDocument(context)); - if (context.IsWorkerGlobalScope()) - return new WorkerThreadableLoadingContext(ToWorkerGlobalScope(context)); - NOTREACHED(); - return nullptr; -} - -BaseFetchContext* ThreadableLoadingContext::GetFetchContext() { - return static_cast<BaseFetchContext*>(&GetResourceFetcher()->Context()); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/loader/threadable_loading_context.h b/third_party/blink/renderer/core/loader/threadable_loading_context.h deleted file mode 100644 index 3d9b633..0000000 --- a/third_party/blink/renderer/core/loader/threadable_loading_context.h +++ /dev/null
@@ -1,41 +0,0 @@ -// 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 THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_THREADABLE_LOADING_CONTEXT_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_THREADABLE_LOADING_CONTEXT_H_ - -#include "base/macros.h" -#include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/platform/heap/heap.h" -#include "third_party/blink/renderer/platform/wtf/forward.h" - -namespace blink { - -class BaseFetchContext; -class ExecutionContext; -class ResourceFetcher; - -// A convenient holder for various contexts associated with the loading -// activity. This should be accessed only from the thread where the loading -// context is bound to (e.g. on the main thread). -class CORE_EXPORT ThreadableLoadingContext - : public GarbageCollected<ThreadableLoadingContext> { - public: - static ThreadableLoadingContext* Create(ExecutionContext&); - - ThreadableLoadingContext() = default; - virtual ~ThreadableLoadingContext() = default; - - virtual ResourceFetcher* GetResourceFetcher() = 0; - virtual ExecutionContext* GetExecutionContext() = 0; - BaseFetchContext* GetFetchContext(); - - virtual void Trace(blink::Visitor* visitor) {} - - DISALLOW_COPY_AND_ASSIGN(ThreadableLoadingContext); -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_THREADABLE_LOADING_CONTEXT_H_
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc index 008beae4..1e9edab9 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -644,8 +644,10 @@ // FIXME: this should use cached clip rects, but this sometimes give // inaccurate results (and trips the ASSERTS in PaintLayerClipper). ClipRectsContext clip_rects_context( - clip_inheritance_ancestor_, kUncachedClipRects, - kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClip); + clip_inheritance_ancestor_, + &clip_inheritance_ancestor_->GetLayoutObject().FirstFragment(), + kUncachedClipRects, kIgnorePlatformOverlayScrollbarSize, + kIgnoreOverflowClip); ClipRect clip_rect; owning_layer_.Clipper(PaintLayer::kDoNotUseGeometryMapper) @@ -1356,7 +1358,9 @@ return; ClipRectsContext clip_rects_context( - clip_inheritance_ancestor_, kPaintingClipRectsIgnoringOverflowClip, + clip_inheritance_ancestor_, + &clip_inheritance_ancestor_->GetLayoutObject().FirstFragment(), + kPaintingClipRectsIgnoringOverflowClip, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClipAndScroll); ClipRect clip_rect; @@ -3081,8 +3085,10 @@ // FIXME: this is a potential performance issue. We should consider caching // these clip rects or otherwise optimizing. - ClipRectsContext clip_rects_context(ancestor_paint_info->paint_layer, - kUncachedClipRects); + ClipRectsContext clip_rects_context( + ancestor_paint_info->paint_layer, + &ancestor_paint_info->paint_layer->GetLayoutObject().FirstFragment(), + kUncachedClipRects); ClipRect parent_clip_rect; paint_info.paint_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect(clip_rects_context, parent_clip_rect);
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc b/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc index f7e9bdc..813f1ba3 100644 --- a/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc +++ b/third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.cc
@@ -291,6 +291,7 @@ layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect( ClipRectsContext(root_layer_, + &root_layer_->GetLayoutObject().FirstFragment(), kAbsoluteClipRectsIgnoringViewportClip, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClipAndScroll),
diff --git a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc index 17dfa59..e2e6d2de 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc
@@ -559,18 +559,6 @@ LayoutUnit closest_line_after_block_offset = LayoutUnit::Max(); for (const auto& child : Children()) { - // Try to resolve if |point| falls in a non-line-box child completely. - if (!child->PhysicalFragment().IsLineBox()) { - if (point.left >= child->Offset().left && - point.left <= child->Offset().left + child->Size().width && - point.top >= child->Offset().top && - point.top <= child->Offset().top + child->Size().height) { - if (auto child_position = PositionForPointInChild(*child, point)) - return child_position.value(); - } - continue; - } - if (!child->PhysicalFragment().IsLineBox() || child->Children().IsEmpty()) continue; @@ -617,7 +605,7 @@ // TODO(xiaochengh): Looking at only the closest lines may not be enough, // when we have multiple lines full of pseudo elements. Fix it. - // TODO(xiaochengh): Consider floats. + // TODO(xiaochengh): Consider floats. See crbug.com/758526. return PositionWithAffinity(); }
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index c3c2671..0886d7c 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -1704,7 +1704,8 @@ const LayoutSize& sub_pixel_accumulation) const { PaintLayerFragment fragment; ClipRectsContext clip_rects_context( - root_layer, kUncachedClipRects, overlay_scrollbar_clip_behavior, + root_layer, &root_layer->GetLayoutObject().FirstFragment(), + kUncachedClipRects, overlay_scrollbar_clip_behavior, respect_overflow_clip, sub_pixel_accumulation); Clipper(kUseGeometryMapper) .CalculateRects(clip_rects_context, &GetLayoutObject().FirstFragment(), @@ -1742,9 +1743,15 @@ const LayoutPoint* offset_from_root, const LayoutSize& sub_pixel_accumulation) const { PaintLayerFragment fragment; - ClipRectsContext clip_rects_context( - root_layer, kUncachedClipRects, overlay_scrollbar_clip_behavior, - respect_overflow_clip, sub_pixel_accumulation); + + // If |root_layer| is inside the same pagination container as |this|, and + // there is no compositing boundary inside pagination (this is what + // ShouldFragmentCompositedBounds() checks), then try to match + // fragments from |root_layer| to |this|, so that any + // fragment clip for |root_layer|'s fragment matches |this|'s. + bool should_match_fragments = root_layer->EnclosingPaginationLayer() && + root_layer->EnclosingPaginationLayer() == EnclosingPaginationLayer() && + ShouldFragmentCompositedBounds(); // The inherited offset_from_root does not include any pagination offsets. // In the presence of fragmentation, we cannot use it. Note that we may also @@ -1755,6 +1762,29 @@ !GetLayoutObject().FirstFragment().NextFragment(); for (auto* fragment_data = &GetLayoutObject().FirstFragment(); fragment_data; fragment_data = fragment_data->NextFragment()) { + const FragmentData* root_fragment = + &root_layer->GetLayoutObject().FirstFragment(); + if (should_match_fragments) { + for (root_fragment = &root_layer->GetLayoutObject().FirstFragment(); + root_fragment; root_fragment = root_fragment->NextFragment()) { + if (root_fragment->LogicalTopInFlowThread() == + fragment_data->LogicalTopInFlowThread()) + break; + } + } + + bool cant_find_fragment = !root_fragment; + if (cant_find_fragment) { + // Fall back to the first fragment, in order to have + // PaintLayerClipper at least compute |fragment.layer_bounds|. + root_fragment = &root_layer->GetLayoutObject().FirstFragment(); + } + + ClipRectsContext clip_rects_context( + root_layer, root_fragment, kUncachedClipRects, + overlay_scrollbar_clip_behavior, respect_overflow_clip, + sub_pixel_accumulation); + Clipper(kUseGeometryMapper) .CalculateRects( clip_rects_context, fragment_data, dirty_rect, @@ -1762,6 +1792,13 @@ fragment.foreground_rect, offset_from_root_can_be_used ? offset_from_root : nullptr); + if (cant_find_fragment) { + // If we couldn't find a matching fragment when |should_match_fragments| + // was true, then fall back to no clip. + fragment.background_rect.Reset(); + fragment.foreground_rect.Reset(); + } + fragment.fragment_data = fragment_data; fragment.pagination_offset = fragment_data->PaginationOffset(); @@ -1988,9 +2025,10 @@ ClipRect clip_rect; Clipper(PaintLayer::kUseGeometryMapper) .CalculateBackgroundClipRect( - ClipRectsContext(root_layer, kUncachedClipRects, - kExcludeOverlayScrollbarSizeForHitTesting, - clip_behavior), + ClipRectsContext( + root_layer, &root_layer->GetLayoutObject().FirstFragment(), + kUncachedClipRects, kExcludeOverlayScrollbarSizeForHitTesting, + clip_behavior), clip_rect); // Go ahead and test the enclosing clip now. if (!clip_rect.Intersects(recursion_data.location))
diff --git a/third_party/blink/renderer/core/paint/paint_layer_clipper.cc b/third_party/blink/renderer/core/paint/paint_layer_clipper.cc index 7d3d638..bc74390 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_clipper.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_clipper.cc
@@ -214,7 +214,10 @@ LayoutRect PaintLayerClipper::LocalClipRect( const PaintLayer& clipping_root_layer) const { - ClipRectsContext context(&clipping_root_layer, kPaintingClipRects); + ClipRectsContext context( + &clipping_root_layer, + &clipping_root_layer.GetLayoutObject().FirstFragment(), + kPaintingClipRects); if (use_geometry_mapper_) { ClipRect clip_rect; CalculateBackgroundClipRectWithGeometryMapper( @@ -228,14 +231,10 @@ // The rect now needs to be transformed to the local space of this // PaintLayer. // TODO(chrishtr): not correct for fragmentation. - premapped_rect.MoveBy( - context.root_layer->GetLayoutObject().FirstFragment().PaintOffset()); + premapped_rect.MoveBy(context.root_fragment->PaintOffset()); const auto* clip_root_layer_transform = - clipping_root_layer.GetLayoutObject() - .FirstFragment() - .LocalBorderBoxProperties() - .Transform(); + context.root_fragment->LocalBorderBoxProperties().Transform(); const auto* layer_transform = layer_.GetLayoutObject() .FirstFragment() .LocalBorderBoxProperties() @@ -295,14 +294,12 @@ } else { const auto* current_transform = fragment_data.PreEffectProperties().Transform(); - const auto& root_fragment = - context.root_layer->GetLayoutObject().FirstFragment(); const auto* root_transform = - root_fragment.LocalBorderBoxProperties().Transform(); + context.root_fragment->LocalBorderBoxProperties().Transform(); if (&layer_ == context.root_layer || current_transform == root_transform) { layer_bounds.MoveBy(fragment_data.PaintOffset()); - layer_bounds.MoveBy(-root_fragment.PaintOffset()); + layer_bounds.MoveBy(-context.root_fragment->PaintOffset()); } else { const TransformationMatrix& transform = GeometryMapper::SourceToDestinationProjection(current_transform, @@ -314,7 +311,7 @@ // point error. layer_bounds.Move( LayoutSize((float)transform.E(), (float)transform.F())); - layer_bounds.MoveBy(-root_fragment.PaintOffset()); + layer_bounds.MoveBy(-context.root_fragment->PaintOffset()); } else { // This branch can happen due to perspective transforms. // TODO(chrishtr): investigate whether the paint code is broken @@ -535,8 +532,7 @@ if (!output.IsInfinite()) { // TODO(chrishtr): generalize to multiple fragments. - output.MoveBy( - -context.root_layer->GetLayoutObject().FirstFragment().PaintOffset()); + output.MoveBy(-context.root_fragment->PaintOffset()); output.Move(context.sub_pixel_accumulation); } } @@ -550,20 +546,15 @@ DCHECK(fragment_data.HasLocalBorderBoxProperties()); source_property_tree_state = fragment_data.LocalBorderBoxProperties(); - DCHECK(context.root_layer->GetLayoutObject() - .FirstFragment() - .HasLocalBorderBoxProperties()); - destination_property_tree_state = context.root_layer->GetLayoutObject() - .FirstFragment() - .LocalBorderBoxProperties(); + DCHECK(context.root_fragment->HasLocalBorderBoxProperties()); + destination_property_tree_state = + context.root_fragment->LocalBorderBoxProperties(); - const auto& ancestor_fragment_data = - context.root_layer->GetLayoutObject().FirstFragment(); if (context.ShouldRespectRootLayerClip()) { - destination_property_tree_state.SetClip(ancestor_fragment_data.PreClip()); + destination_property_tree_state.SetClip(context.root_fragment->PreClip()); } else { destination_property_tree_state.SetClip( - ancestor_fragment_data.PostOverflowClip()); + context.root_fragment->PostOverflowClip()); } }
diff --git a/third_party/blink/renderer/core/paint/paint_layer_clipper.h b/third_party/blink/renderer/core/paint/paint_layer_clipper.h index 9df1f85..50bde01 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_clipper.h +++ b/third_party/blink/renderer/core/paint/paint_layer_clipper.h
@@ -70,6 +70,7 @@ public: ClipRectsContext( const PaintLayer* root, + const FragmentData* fragment, ClipRectsCacheSlot slot, OverlayScrollbarClipBehavior overlay_scrollbar_clip_behavior = kIgnorePlatformOverlayScrollbarSize, @@ -77,6 +78,7 @@ kRespectOverflowClip, const LayoutSize& accumulation = LayoutSize()) : root_layer(root), + root_fragment(fragment), overlay_scrollbar_clip_behavior(overlay_scrollbar_clip_behavior), cache_slot_(slot), sub_pixel_accumulation(accumulation), @@ -89,6 +91,7 @@ bool ShouldRespectRootLayerClip() const; const PaintLayer* root_layer; + const FragmentData* root_fragment; const OverlayScrollbarClipBehavior overlay_scrollbar_clip_behavior; private:
diff --git a/third_party/blink/renderer/core/paint/paint_layer_clipper_test.cc b/third_party/blink/renderer/core/paint/paint_layer_clipper_test.cc index aadfe40..12bb85f 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_clipper_test.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_clipper_test.cc
@@ -42,7 +42,8 @@ PaintLayer* target_paint_layer = ToLayoutBoxModelObject(target->GetLayoutObject())->Layer(); ClipRectsContext context( - GetDocument().GetLayoutView()->Layer(), kUncachedClipRects, + GetDocument().GetLayoutView()->Layer(), + &GetDocument().GetLayoutView()->FirstFragment(), kUncachedClipRects, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClip, LayoutSize(FloatSize(0.25, 0.35))); @@ -71,7 +72,8 @@ PaintLayer* target_paint_layer = ToLayoutBoxModelObject(target->GetLayoutObject())->Layer(); ClipRectsContext context( - GetDocument().GetLayoutView()->Layer(), kUncachedClipRects, + GetDocument().GetLayoutView()->Layer(), + &GetDocument().GetLayoutView()->FirstFragment(), kUncachedClipRects, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClip, LayoutSize(FloatSize(0.25, 0.35))); @@ -102,7 +104,8 @@ PaintLayer* target_paint_layer = ToLayoutBoxModelObject(target->GetLayoutObject())->Layer(); ClipRectsContext context( - GetDocument().GetLayoutView()->Layer(), kUncachedClipRects, + GetDocument().GetLayoutView()->Layer(), + &GetDocument().GetLayoutView()->FirstFragment(), kUncachedClipRects, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClip, LayoutSize(FloatSize(0.25, 0.35))); @@ -135,7 +138,8 @@ // When RLS is enabled, the LayoutView will have a composited scrolling layer, // so don't apply an overflow clip. ClipRectsContext context( - GetDocument().GetLayoutView()->Layer(), kUncachedClipRects, + GetDocument().GetLayoutView()->Layer(), + &GetDocument().GetLayoutView()->FirstFragment(), kUncachedClipRects, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClip, LayoutSize(FloatSize(0.25, 0.35))); LayoutRect layer_bounds; @@ -165,7 +169,8 @@ // When RLS is enabled, the LayoutView will have a composited scrolling layer, // so don't apply an overflow clip. ClipRectsContext context( - GetDocument().GetLayoutView()->Layer(), kUncachedClipRects, + GetDocument().GetLayoutView()->Layer(), + &GetDocument().GetLayoutView()->FirstFragment(), kUncachedClipRects, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClip); LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; @@ -203,7 +208,8 @@ PaintLayer* target_paint_layer = ToLayoutBoxModelObject(target->GetLayoutObject())->Layer(); ClipRectsContext context( - GetDocument().GetLayoutView()->Layer(), kUncachedClipRects, + GetDocument().GetLayoutView()->Layer(), + &GetDocument().GetLayoutView()->FirstFragment(), kUncachedClipRects, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClip); LayoutRect layer_bounds; @@ -242,7 +248,10 @@ PaintLayer* child_paint_layer = ToLayoutBoxModelObject(child->GetLayoutObject())->Layer(); - ClipRectsContext context(parent_paint_layer, kUncachedClipRects); + ClipRectsContext context( + parent_paint_layer, + &parent_paint_layer->GetLayoutObject().FirstFragment(), + kUncachedClipRects); LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; @@ -277,7 +286,8 @@ PaintLayer* target_paint_layer = ToLayoutBoxModelObject(target->GetLayoutObject())->Layer(); ClipRectsContext context( - GetDocument().GetLayoutView()->Layer(), kUncachedClipRects, + GetDocument().GetLayoutView()->Layer(), + &GetDocument().GetLayoutView()->FirstFragment(), kUncachedClipRects, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClip); LayoutRect layer_bounds; @@ -311,6 +321,7 @@ PaintLayer* target_paint_layer = ToLayoutBoxModelObject(target->GetLayoutObject())->Layer(); ClipRectsContext context(GetDocument().GetLayoutView()->Layer(), + &GetDocument().GetLayoutView()->FirstFragment(), kUncachedClipRects); LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; @@ -334,7 +345,8 @@ PaintLayer* layer = ToLayoutBoxModelObject(GetLayoutObjectByElementId("target"))->Layer(); - ClipRectsContext context(layer, kPaintingClipRectsIgnoringOverflowClip, + ClipRectsContext context(layer, &layer->GetLayoutObject().FirstFragment(), + kPaintingClipRectsIgnoringOverflowClip, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClip); LayoutRect layer_bounds; @@ -348,7 +360,8 @@ EXPECT_EQ(background_rect.Rect(), foreground_rect.Rect()); EXPECT_EQ(LayoutRect(0, 0, 200, 200), layer_bounds); - ClipRectsContext context_clip(layer, kUncachedClipRects); + ClipRectsContext context_clip( + layer, &layer->GetLayoutObject().FirstFragment(), kUncachedClipRects); layer->Clipper(PaintLayer::kUseGeometryMapper) .CalculateRects(context_clip, &layer->GetLayoutObject().FirstFragment(), @@ -370,7 +383,8 @@ PaintLayer* layer = ToLayoutBoxModelObject(GetLayoutObjectByElementId("target"))->Layer(); ClipRectsContext context( - layer->Parent(), kPaintingClipRectsIgnoringOverflowClip, + layer->Parent(), &layer->Parent()->GetLayoutObject().FirstFragment(), + kPaintingClipRectsIgnoringOverflowClip, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClip); LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; @@ -382,7 +396,9 @@ EXPECT_EQ(LayoutRect(0, 0, 200, 400), foreground_rect.Rect()); EXPECT_EQ(LayoutRect(0, 0, 200, 400), layer_bounds); - ClipRectsContext context_clip(layer->Parent(), kUncachedClipRects); + ClipRectsContext context_clip( + layer->Parent(), &layer->Parent()->GetLayoutObject().FirstFragment(), + kUncachedClipRects); layer->Clipper(PaintLayer::kUseGeometryMapper) .CalculateRects(context_clip, &layer->GetLayoutObject().FirstFragment(), @@ -502,7 +518,8 @@ PaintLayer* target = ToLayoutBoxModelObject(GetLayoutObjectByElementId("target"))->Layer(); - ClipRectsContext context(target, kUncachedClipRects); + ClipRectsContext context(target, &target->GetLayoutObject().FirstFragment(), + kUncachedClipRects); LayoutRect infinite_rect(LayoutRect::InfiniteIntRect()); LayoutRect layer_bounds(infinite_rect); ClipRect background_rect(infinite_rect); @@ -531,7 +548,8 @@ ToLayoutBoxModelObject(GetLayoutObjectByElementId("target"))->Layer(); // First test clip rects in the target layer itself. - ClipRectsContext context(target, kUncachedClipRects); + ClipRectsContext context(target, &target->GetLayoutObject().FirstFragment(), + kUncachedClipRects); LayoutRect infinite_rect(LayoutRect::InfiniteIntRect()); LayoutRect layer_bounds(infinite_rect); ClipRect background_rect(infinite_rect); @@ -560,7 +578,9 @@ EXPECT_EQ(LayoutRect(40, 40, 100, 200), foreground_rect.Rect()); // Test mapping to the root layer. - ClipRectsContext root_context(GetLayoutView().Layer(), kUncachedClipRects); + ClipRectsContext root_context(GetLayoutView().Layer(), + &GetLayoutView().FirstFragment(), + kUncachedClipRects); background_rect = infinite_rect; foreground_rect = infinite_rect; target->Clipper(PaintLayer::kUseGeometryMapper) @@ -608,7 +628,8 @@ ToLayoutBoxModelObject(GetLayoutObjectByElementId("root"))->Layer(); PaintLayer* target = ToLayoutBoxModelObject(GetLayoutObjectByElementId("target"))->Layer(); - ClipRectsContext context(root, kPaintingClipRectsIgnoringOverflowClip, + ClipRectsContext context(root, &root->GetLayoutObject().FirstFragment(), + kPaintingClipRectsIgnoringOverflowClip, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClip); LayoutRect infinite_rect(LayoutRect::InfiniteIntRect()); @@ -643,7 +664,8 @@ ToLayoutBoxModelObject(GetLayoutObjectByElementId("root"))->Layer(); PaintLayer* target = ToLayoutBoxModelObject(GetLayoutObjectByElementId("target"))->Layer(); - ClipRectsContext context(root, kPaintingClipRectsIgnoringOverflowClip, + ClipRectsContext context(root, &root->GetLayoutObject().FirstFragment(), + kPaintingClipRectsIgnoringOverflowClip, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClip); LayoutRect infinite_rect(LayoutRect::InfiniteIntRect()); @@ -679,7 +701,8 @@ ToLayoutBoxModelObject(GetLayoutObjectByElementId("root"))->Layer(); PaintLayer* target = ToLayoutBoxModelObject(GetLayoutObjectByElementId("target"))->Layer(); - ClipRectsContext context(root, kPaintingClipRectsIgnoringOverflowClip, + ClipRectsContext context(root, &root->GetLayoutObject().FirstFragment(), + kPaintingClipRectsIgnoringOverflowClip, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClip); LayoutRect infinite_rect(LayoutRect::InfiniteIntRect()); @@ -708,8 +731,9 @@ Element* root = GetDocument().getElementById("root"); PaintLayer* root_paint_layer = ToLayoutBoxModelObject(root->GetLayoutObject())->Layer(); - ClipRectsContext context(root_paint_layer, kUncachedClipRects, - kIgnorePlatformOverlayScrollbarSize); + ClipRectsContext context( + root_paint_layer, &root_paint_layer->GetLayoutObject().FirstFragment(), + kUncachedClipRects, kIgnorePlatformOverlayScrollbarSize); LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; @@ -767,8 +791,10 @@ PaintLayer* child_paint_layer = ToLayoutBoxModelObject(child->GetLayoutObject())->Layer(); - ClipRectsContext context(parent_paint_layer, kUncachedClipRects, - kExcludeOverlayScrollbarSizeForHitTesting); + ClipRectsContext context( + parent_paint_layer, + &parent_paint_layer->GetLayoutObject().FirstFragment(), + kUncachedClipRects, kExcludeOverlayScrollbarSizeForHitTesting); LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; @@ -810,8 +836,9 @@ PaintLayer* child_paint_layer = ToLayoutBoxModelObject(child->GetLayoutObject())->Layer(); - ClipRectsContext context(root_paint_layer, kUncachedClipRects, - kExcludeOverlayScrollbarSizeForHitTesting); + ClipRectsContext context( + root_paint_layer, &root_paint_layer->GetLayoutObject().FirstFragment(), + kUncachedClipRects, kExcludeOverlayScrollbarSizeForHitTesting); LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; @@ -854,8 +881,10 @@ PaintLayer* child_paint_layer = ToLayoutBoxModelObject(child->GetLayoutObject())->Layer(); - ClipRectsContext context(parent_paint_layer, kUncachedClipRects, - kExcludeOverlayScrollbarSizeForHitTesting); + ClipRectsContext context( + parent_paint_layer, + &parent_paint_layer->GetLayoutObject().FirstFragment(), + kUncachedClipRects, kExcludeOverlayScrollbarSizeForHitTesting); LayoutRect layer_bounds; ClipRect background_rect, foreground_rect; @@ -905,6 +934,7 @@ target_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect( ClipRectsContext(GetDocument().GetLayoutView()->Layer(), + &GetDocument().GetLayoutView()->FirstFragment(), kAbsoluteClipRectsIgnoringViewportClip, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClipAndScroll), @@ -919,6 +949,7 @@ target_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect( ClipRectsContext(GetDocument().GetLayoutView()->Layer(), + &GetDocument().GetLayoutView()->FirstFragment(), kAbsoluteClipRectsIgnoringViewportClip, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClipAndScroll), @@ -955,6 +986,7 @@ target_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect( ClipRectsContext(GetDocument().GetLayoutView()->Layer(), + &GetDocument().GetLayoutView()->FirstFragment(), kAbsoluteClipRectsIgnoringViewportClip, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClipAndScroll), @@ -969,6 +1001,7 @@ target_layer->Clipper(PaintLayer::kDoNotUseGeometryMapper) .CalculateBackgroundClipRect( ClipRectsContext(GetDocument().GetLayoutView()->Layer(), + &GetDocument().GetLayoutView()->FirstFragment(), kAbsoluteClipRectsIgnoringViewportClip, kIgnorePlatformOverlayScrollbarSize, kIgnoreOverflowClipAndScroll),
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.cc b/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.cc index 4e5a904..769fca7 100644 --- a/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.cc +++ b/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.cc
@@ -203,7 +203,7 @@ std::unique_ptr<WorkerThread> DedicatedWorkerMessagingProxy::CreateWorkerThread() { - return DedicatedWorkerThread::Create(CreateThreadableLoadingContext(), + return DedicatedWorkerThread::Create(GetExecutionContext(), WorkerObjectProxy()); }
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_test.cc b/third_party/blink/renderer/core/workers/dedicated_worker_test.cc index a258a45d..33ca87c 100644 --- a/third_party/blink/renderer/core/workers/dedicated_worker_test.cc +++ b/third_party/blink/renderer/core/workers/dedicated_worker_test.cc
@@ -30,7 +30,7 @@ class DedicatedWorkerThreadForTest final : public DedicatedWorkerThread { public: DedicatedWorkerThreadForTest(DedicatedWorkerObjectProxy& worker_object_proxy) - : DedicatedWorkerThread(nullptr /* ThreadableLoadingContext */, + : DedicatedWorkerThread(nullptr /* parent_execution_context*/, worker_object_proxy) { worker_backing_thread_ = WorkerBackingThread::Create( WebThreadCreationParams(WebThreadType::kTestThread));
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_thread.cc b/third_party/blink/renderer/core/workers/dedicated_worker_thread.cc index 595cb4f..4ccb2438 100644 --- a/third_party/blink/renderer/core/workers/dedicated_worker_thread.cc +++ b/third_party/blink/renderer/core/workers/dedicated_worker_thread.cc
@@ -45,34 +45,25 @@ namespace blink { -namespace { - -FrameOrWorkerScheduler* GetFrameOrWorkerScheduler( - ThreadableLoadingContext* loading_context) { - // |loading_context| can be null in unittests. - if (!loading_context) - return nullptr; - return loading_context->GetExecutionContext()->GetScheduler(); -} - -} // namespace - std::unique_ptr<DedicatedWorkerThread> DedicatedWorkerThread::Create( - ThreadableLoadingContext* loading_context, + ExecutionContext* parent_execution_context, DedicatedWorkerObjectProxy& worker_object_proxy) { return base::WrapUnique( - new DedicatedWorkerThread(loading_context, worker_object_proxy)); + new DedicatedWorkerThread(parent_execution_context, worker_object_proxy)); } DedicatedWorkerThread::DedicatedWorkerThread( - ThreadableLoadingContext* loading_context, + ExecutionContext* parent_execution_context, DedicatedWorkerObjectProxy& worker_object_proxy) - : WorkerThread(loading_context, worker_object_proxy), - worker_backing_thread_(WorkerBackingThread::Create( - WebThreadCreationParams(GetThreadType()) - .SetFrameOrWorkerScheduler( - GetFrameOrWorkerScheduler(loading_context)))), - worker_object_proxy_(worker_object_proxy) {} + : WorkerThread(worker_object_proxy), + worker_object_proxy_(worker_object_proxy) { + FrameOrWorkerScheduler* scheduler = + parent_execution_context ? parent_execution_context->GetScheduler() + : nullptr; + worker_backing_thread_ = + WorkerBackingThread::Create(WebThreadCreationParams(GetThreadType()) + .SetFrameOrWorkerScheduler(scheduler)); +} DedicatedWorkerThread::~DedicatedWorkerThread() = default;
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_thread.h b/third_party/blink/renderer/core/workers/dedicated_worker_thread.h index 784aebc1..9bff5cf 100644 --- a/third_party/blink/renderer/core/workers/dedicated_worker_thread.h +++ b/third_party/blink/renderer/core/workers/dedicated_worker_thread.h
@@ -41,7 +41,7 @@ class CORE_EXPORT DedicatedWorkerThread : public WorkerThread { public: static std::unique_ptr<DedicatedWorkerThread> Create( - ThreadableLoadingContext*, + ExecutionContext* parent_execution_context, DedicatedWorkerObjectProxy&); ~DedicatedWorkerThread() override; @@ -56,7 +56,8 @@ private: friend class DedicatedWorkerThreadForTest; - DedicatedWorkerThread(ThreadableLoadingContext*, DedicatedWorkerObjectProxy&); + DedicatedWorkerThread(ExecutionContext* parent_execution_context, + DedicatedWorkerObjectProxy&); WorkerOrWorkletGlobalScope* CreateWorkerGlobalScope( std::unique_ptr<GlobalScopeCreationParams>) override;
diff --git a/third_party/blink/renderer/core/workers/shared_worker_thread.cc b/third_party/blink/renderer/core/workers/shared_worker_thread.cc index c881ea5b..f11d6d2b 100644 --- a/third_party/blink/renderer/core/workers/shared_worker_thread.cc +++ b/third_party/blink/renderer/core/workers/shared_worker_thread.cc
@@ -39,9 +39,8 @@ SharedWorkerThread::SharedWorkerThread( const String& name, - ThreadableLoadingContext* loading_context, WorkerReportingProxy& worker_reporting_proxy) - : WorkerThread(loading_context, worker_reporting_proxy), + : WorkerThread(worker_reporting_proxy), worker_backing_thread_(WorkerBackingThread::Create( WebThreadCreationParams(GetThreadType()))), name_(name.IsolatedCopy()) {}
diff --git a/third_party/blink/renderer/core/workers/shared_worker_thread.h b/third_party/blink/renderer/core/workers/shared_worker_thread.h index b080b17..654c37d 100644 --- a/third_party/blink/renderer/core/workers/shared_worker_thread.h +++ b/third_party/blink/renderer/core/workers/shared_worker_thread.h
@@ -42,7 +42,6 @@ class CORE_EXPORT SharedWorkerThread : public WorkerThread { public: SharedWorkerThread(const String& name, - ThreadableLoadingContext*, WorkerReportingProxy&); ~SharedWorkerThread() override;
diff --git a/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.cc b/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.cc index f77c4aff..4dc16a5 100644 --- a/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.cc +++ b/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.cc
@@ -13,7 +13,6 @@ #include "third_party/blink/renderer/core/frame/deprecation.h" #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" #include "third_party/blink/renderer/core/loader/document_loader.h" -#include "third_party/blink/renderer/core/loader/threadable_loading_context.h" #include "third_party/blink/renderer/core/loader/worker_fetch_context.h" #include "third_party/blink/renderer/core/workers/global_scope_creation_params.h" #include "third_party/blink/renderer/core/workers/worker_global_scope.h" @@ -186,12 +185,6 @@ worker_inspector_proxy_->DispatchMessageFromWorker(session_id, message); } -ThreadableLoadingContext* -ThreadedMessagingProxyBase::CreateThreadableLoadingContext() const { - DCHECK(IsParentContextThread()); - return ThreadableLoadingContext::Create(*execution_context_); -} - ExecutionContext* ThreadedMessagingProxyBase::GetExecutionContext() const { DCHECK(IsParentContextThread()); return execution_context_;
diff --git a/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.h b/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.h index d53cf9d..fa6c682 100644 --- a/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.h +++ b/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.h
@@ -25,7 +25,6 @@ class ExecutionContext; class SourceLocation; -class ThreadableLoadingContext; class WorkerInspectorProxy; struct GlobalScopeCreationParams; @@ -77,8 +76,6 @@ std::unique_ptr<GlobalScopeCreationParams>, const base::Optional<WorkerBackingThreadStartupData>&); - ThreadableLoadingContext* CreateThreadableLoadingContext() const; - ExecutionContext* GetExecutionContext() const; ParentExecutionContextTaskRunners* GetParentExecutionContextTaskRunners() const;
diff --git a/third_party/blink/renderer/core/workers/threaded_worklet_test.cc b/third_party/blink/renderer/core/workers/threaded_worklet_test.cc index 28a13f0..765c50f3 100644 --- a/third_party/blink/renderer/core/workers/threaded_worklet_test.cc +++ b/third_party/blink/renderer/core/workers/threaded_worklet_test.cc
@@ -58,7 +58,7 @@ public: explicit ThreadedWorkletThreadForTest( WorkerReportingProxy& worker_reporting_proxy) - : WorkerThread(nullptr, worker_reporting_proxy) {} + : WorkerThread(worker_reporting_proxy) {} ~ThreadedWorkletThreadForTest() override = default; WorkerBackingThread& GetWorkerBackingThread() override {
diff --git a/third_party/blink/renderer/core/workers/worker_classic_script_loader.cc b/third_party/blink/renderer/core/workers/worker_classic_script_loader.cc index 1528906..72ec55b 100644 --- a/third_party/blink/renderer/core/workers/worker_classic_script_loader.cc +++ b/third_party/blink/renderer/core/workers/worker_classic_script_loader.cc
@@ -81,7 +81,7 @@ resource_loader_options.synchronous_policy = kRequestSynchronously; threadable_loader_ = new ThreadableLoader( - execution_context, this, resource_loader_options, base::nullopt); + execution_context, this, resource_loader_options); threadable_loader_->Start(request); } @@ -118,7 +118,7 @@ scoped_refptr<WorkerClassicScriptLoader> protect(this); need_to_cancel_ = true; threadable_loader_ = new ThreadableLoader( - execution_context, this, resource_loader_options, base::nullopt); + execution_context, this, resource_loader_options); threadable_loader_->Start(request); if (failed_) NotifyFinished();
diff --git a/third_party/blink/renderer/core/workers/worker_thread.cc b/third_party/blink/renderer/core/workers/worker_thread.cc index 4ac594d..49ce7587 100644 --- a/third_party/blink/renderer/core/workers/worker_thread.cc +++ b/third_party/blink/renderer/core/workers/worker_thread.cc
@@ -157,13 +157,6 @@ credentials_mode)); } -void WorkerThread::TerminateChildThreadsOnWorkerThread() { - DCHECK(IsCurrentThread()); - PrepareForShutdownOnWorkerThread(); - for (WorkerThread* child : child_threads_) - child->Terminate(); -} - void WorkerThread::Terminate() { DCHECK_CALLED_ON_VALID_THREAD(parent_thread_checker_); { @@ -180,18 +173,6 @@ inspector_task_runner_->Dispose(); - if (!child_threads_.IsEmpty()) { - // When child workers are present, wait for them to shutdown before shutting - // down this thread. ChildThreadTerminatedOnWorkerThread() is responsible - // for completing shutdown on the worker thread after the last child shuts - // down. - GetWorkerBackingThread().BackingThread().PostTask( - FROM_HERE, - CrossThreadBind(&WorkerThread::TerminateChildThreadsOnWorkerThread, - CrossThreadUnretained(this))); - return; - } - GetWorkerBackingThread().BackingThread().PostTask( FROM_HERE, CrossThreadBind(&WorkerThread::PrepareForShutdownOnWorkerThread, @@ -259,13 +240,6 @@ return GetWorkerBackingThread().BackingThread().IsCurrentThread(); } -ThreadableLoadingContext* WorkerThread::GetLoadingContext() { - DCHECK(IsCurrentThread()); - // This should be never called after the termination sequence starts. - DCHECK(loading_context_); - return loading_context_; -} - void WorkerThread::AppendDebuggerTask(CrossThreadClosure task) { DCHECK_CALLED_ON_VALID_THREAD(parent_thread_checker_); inspector_task_runner_->AppendTask(std::move(task)); @@ -341,6 +315,12 @@ void WorkerThread::ChildThreadStartedOnWorkerThread(WorkerThread* child) { DCHECK(IsCurrentThread()); +#if DCHECK_IS_ON() + { + MutexLocker lock(mutex_); + DCHECK_EQ(ThreadState::kRunning, thread_state_); + } +#endif child_threads_.insert(child); } @@ -351,13 +331,11 @@ PerformShutdownOnWorkerThread(); } -WorkerThread::WorkerThread(ThreadableLoadingContext* loading_context, - WorkerReportingProxy& worker_reporting_proxy) +WorkerThread::WorkerThread(WorkerReportingProxy& worker_reporting_proxy) : time_origin_(CurrentTimeTicks()), worker_thread_id_(GetNextWorkerThreadId()), forcible_termination_delay_(kForcibleTerminationDelay), devtools_worker_token_(base::UnguessableToken::Create()), - loading_context_(loading_context), worker_reporting_proxy_(worker_reporting_proxy), shutdown_event_(std::make_unique<WaitableEvent>( WaitableEvent::ResetPolicy::kManual, @@ -533,6 +511,9 @@ // No V8 microtasks should get executed after shutdown is requested. GetWorkerBackingThread().BackingThread().RemoveTaskObserver(this); + + for (WorkerThread* child : child_threads_) + child->Terminate(); } void WorkerThread::PerformShutdownOnWorkerThread() { @@ -545,6 +526,13 @@ } #endif + // When child workers are present, wait for them to shutdown before shutting + // down this thread. ChildThreadTerminatedOnWorkerThread() is responsible + // for completing shutdown on the worker thread after the last child shuts + // down. + if (!child_threads_.IsEmpty()) + return; + inspector_task_runner_->Dispose(); if (worker_inspector_controller_) { worker_inspector_controller_->Dispose(); @@ -558,7 +546,6 @@ debugger->WorkerThreadDestroyed(this); console_message_storage_.Clear(); - loading_context_.Clear(); if (IsOwningBackingThread()) GetWorkerBackingThread().ShutdownOnBackingThread();
diff --git a/third_party/blink/renderer/core/workers/worker_thread.h b/third_party/blink/renderer/core/workers/worker_thread.h index 62bb302..19d31e73 100644 --- a/third_party/blink/renderer/core/workers/worker_thread.h +++ b/third_party/blink/renderer/core/workers/worker_thread.h
@@ -39,7 +39,6 @@ #include "third_party/blink/public/platform/web_thread_type.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" -#include "third_party/blink/renderer/core/loader/threadable_loading_context.h" #include "third_party/blink/renderer/core/workers/parent_execution_context_task_runners.h" #include "third_party/blink/renderer/core/workers/worker_backing_thread_startup_data.h" #include "third_party/blink/renderer/core/workers/worker_inspector_proxy.h" @@ -149,9 +148,6 @@ bool IsCurrentThread(); - // Called on the worker thread. - ThreadableLoadingContext* GetLoadingContext(); - WorkerReportingProxy& GetWorkerReportingProxy() const { return worker_reporting_proxy_; } @@ -214,7 +210,7 @@ void ChildThreadTerminatedOnWorkerThread(WorkerThread*); protected: - WorkerThread(ThreadableLoadingContext*, WorkerReportingProxy&); + explicit WorkerThread(WorkerReportingProxy&); virtual WebThreadType GetThreadType() const = 0; @@ -283,8 +279,6 @@ outside_settings_object, network::mojom::FetchCredentialsMode); - void TerminateChildThreadsOnWorkerThread(); - // These are called in this order during worker thread termination. void PrepareForShutdownOnWorkerThread() LOCKS_EXCLUDED(mutex_); void PerformShutdownOnWorkerThread() LOCKS_EXCLUDED(mutex_); @@ -311,10 +305,6 @@ scoped_refptr<InspectorTaskRunner> inspector_task_runner_; const base::UnguessableToken devtools_worker_token_; - // Created on the main thread, passed to the worker thread but should kept - // being accessed only on the main thread. - CrossThreadPersistent<ThreadableLoadingContext> loading_context_; - WorkerReportingProxy& worker_reporting_proxy_; CrossThreadPersistent<ParentExecutionContextTaskRunners>
diff --git a/third_party/blink/renderer/core/workers/worker_thread_test.cc b/third_party/blink/renderer/core/workers/worker_thread_test.cc index ac64b20a..e4b76be3 100644 --- a/third_party/blink/renderer/core/workers/worker_thread_test.cc +++ b/third_party/blink/renderer/core/workers/worker_thread_test.cc
@@ -16,6 +16,7 @@ #include "third_party/blink/renderer/core/workers/global_scope_creation_params.h" #include "third_party/blink/renderer/core/workers/worker_reporting_proxy.h" #include "third_party/blink/renderer/core/workers/worker_thread_test_helper.h" +#include "third_party/blink/renderer/platform/scheduler/test/fake_task_runner.h" #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" #include "third_party/blink/renderer/platform/waitable_event.h" @@ -67,6 +68,98 @@ waitable_event->Wait(); } +void TerminateParentOfNestedWorker(WorkerThread* parent_thread, + WaitableEvent* waitable_event) { + EXPECT_TRUE(IsMainThread()); + parent_thread->Terminate(); + waitable_event->Signal(); +} + +// This helper managers a child worker thread and a reporting proxy +// and ensures they stay alive for the duration of the test. The struct +// is created on the main thread, but its members are created and +// destroyed on the parent worker thread. +struct NestedWorkerHelper { + public: + NestedWorkerHelper() = default; + ~NestedWorkerHelper() = default; + + std::unique_ptr<MockWorkerReportingProxy> reporting_proxy; + std::unique_ptr<WorkerThreadForTest> worker_thread; +}; + +void CreateNestedWorkerThenTerminateParent( + WorkerThread* parent_thread, + NestedWorkerHelper* nested_worker_helper) { + EXPECT_TRUE(parent_thread->IsCurrentThread()); + + nested_worker_helper->reporting_proxy = + std::make_unique<MockWorkerReportingProxy>(); + EXPECT_CALL(*nested_worker_helper->reporting_proxy, + DidCreateWorkerGlobalScope(_)) + .Times(1); + EXPECT_CALL(*nested_worker_helper->reporting_proxy, + DidInitializeWorkerContext()) + .Times(1); + EXPECT_CALL(*nested_worker_helper->reporting_proxy, + WillEvaluateClassicScriptMock(_, _)) + .Times(1); + EXPECT_CALL(*nested_worker_helper->reporting_proxy, + DidEvaluateClassicScript(true)) + .Times(1); + EXPECT_CALL(*nested_worker_helper->reporting_proxy, + WillDestroyWorkerGlobalScope()) + .Times(1); + EXPECT_CALL(*nested_worker_helper->reporting_proxy, + DidTerminateWorkerThread()) + .Times(1); + + nested_worker_helper->worker_thread = std::make_unique<WorkerThreadForTest>( + *nested_worker_helper->reporting_proxy); + nested_worker_helper->worker_thread->StartWithSourceCode( + SecurityOrigin::Create(KURL("http://fake.url/")).get(), + "//fake source code", ParentExecutionContextTaskRunners::Create()); + nested_worker_helper->worker_thread->WaitForInit(); + + // Ask the main threat to terminate this parent thread. + WaitableEvent child_waitable; + PostCrossThreadTask( + *parent_thread->GetParentExecutionContextTaskRunners()->Get( + TaskType::kInternalTest), + FROM_HERE, + CrossThreadBind(&TerminateParentOfNestedWorker, + CrossThreadUnretained(parent_thread), + CrossThreadUnretained(&child_waitable))); + child_waitable.Wait(); + EXPECT_EQ(ExitCode::kNotTerminated, parent_thread->GetExitCodeForTesting()); + + parent_thread->ChildThreadStartedOnWorkerThread( + nested_worker_helper->worker_thread.get()); + PostCrossThreadTask( + *parent_thread->GetParentExecutionContextTaskRunners()->Get( + TaskType::kInternalTest), + FROM_HERE, CrossThreadBind(&test::ExitRunLoop)); +} + +void VerifyParentAndChildAreTerminated(WorkerThread* parent_thread, + NestedWorkerHelper* nested_worker_helper, + WaitableEvent* waitable_event) { + EXPECT_TRUE(parent_thread->IsCurrentThread()); + EXPECT_EQ(ExitCode::kGracefullyTerminated, + parent_thread->GetExitCodeForTesting()); + EXPECT_EQ(ExitCode::kGracefullyTerminated, + nested_worker_helper->worker_thread->GetExitCodeForTesting()); + EXPECT_NE(nullptr, parent_thread->GlobalScope()); + + parent_thread->ChildThreadTerminatedOnWorkerThread( + nested_worker_helper->worker_thread.get()); + EXPECT_EQ(nullptr, parent_thread->GlobalScope()); + + nested_worker_helper->worker_thread = nullptr; + nested_worker_helper->reporting_proxy = nullptr; + waitable_event->Signal(); +} + } // namespace class WorkerThreadTest : public testing::Test { @@ -76,8 +169,7 @@ void SetUp() override { reporting_proxy_ = std::make_unique<MockWorkerReportingProxy>(); security_origin_ = SecurityOrigin::Create(KURL("http://fake.url/")); - worker_thread_ = - std::make_unique<WorkerThreadForTest>(nullptr, *reporting_proxy_); + worker_thread_ = std::make_unique<WorkerThreadForTest>(*reporting_proxy_); } void TearDown() override {} @@ -387,4 +479,29 @@ EXPECT_EQ(ExitCode::kGracefullyTerminated, GetExitCode()); } +// TODO(https://crbug.com/868253): Disabled due to flaking on multiple bots. +// Fix and re-enable. +TEST_F(WorkerThreadTest, DISABLED_TerminateWorkerWhileChildIsLoading) { + ExpectReportingCalls(); + Start(); + worker_thread_->WaitForInit(); + + NestedWorkerHelper nested_worker_helper; + // Create a nested worker from the worker thread. + PostCrossThreadTask( + *worker_thread_->GetTaskRunner(TaskType::kInternalTest), FROM_HERE, + CrossThreadBind(&CreateNestedWorkerThenTerminateParent, + CrossThreadUnretained(worker_thread_.get()), + CrossThreadUnretained(&nested_worker_helper))); + test::EnterRunLoop(); + + WaitableEvent waitable_event; + worker_thread_->GetWorkerBackingThread().BackingThread().PostTask( + FROM_HERE, CrossThreadBind(&VerifyParentAndChildAreTerminated, + CrossThreadUnretained(worker_thread_.get()), + CrossThreadUnretained(&nested_worker_helper), + CrossThreadUnretained(&waitable_event))); + waitable_event.Wait(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/workers/worker_thread_test_helper.h b/third_party/blink/renderer/core/workers/worker_thread_test_helper.h index f5d0fc21..05bb885 100644 --- a/third_party/blink/renderer/core/workers/worker_thread_test_helper.h +++ b/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
@@ -68,9 +68,9 @@ class WorkerThreadForTest : public WorkerThread { public: - WorkerThreadForTest(ThreadableLoadingContext* loading_context, - WorkerReportingProxy& mock_worker_reporting_proxy) - : WorkerThread(loading_context, mock_worker_reporting_proxy), + explicit WorkerThreadForTest( + WorkerReportingProxy& mock_worker_reporting_proxy) + : WorkerThread(mock_worker_reporting_proxy), worker_backing_thread_(WorkerBackingThread::Create( WebThreadCreationParams(WebThreadType::kTestThread))) {}
diff --git a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc index 16e76d30..67b5f31 100644 --- a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc +++ b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
@@ -477,10 +477,7 @@ return; } - if (timeout) - timeout_ = TimeDelta::FromMilliseconds(timeout); - else - timeout_ = base::nullopt; + timeout_ = TimeDelta::FromMilliseconds(timeout); // From http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute: // Note: This implies that the timeout attribute can be set while fetching is @@ -489,7 +486,7 @@ // // The timeout may be overridden after send. if (loader_) - loader_->OverrideTimeout(timeout); + loader_->SetTimeout(timeout_); } void XMLHttpRequest::setResponseType(const String& response_type, @@ -689,7 +686,7 @@ } // Similarly, timeouts are disabled for synchronous requests as well. - if (timeout_) { + if (!timeout_.is_zero()) { exception_state.ThrowDOMException( DOMExceptionCode::kInvalidAccessError, "Synchronous requests must not set a timeout."); @@ -1124,32 +1121,29 @@ // TODO(yhirano): Turn this CHECK into DCHECK: see https://crbug.com/570946. CHECK(!loader_); DCHECK(send_flag_); - loader_ = new ThreadableLoader(execution_context, this, - resource_loader_options, timeout_); - loader_->Start(request); - - return; - } - - // Use count for XHR synchronous requests. - UseCounter::Count(&execution_context, WebFeature::kXMLHttpRequestSynchronous); - if (GetExecutionContext()->IsDocument()) { - // Update histogram for usage of sync xhr within pagedismissal. - auto pagedismissal = GetDocument()->PageDismissalEventBeingDispatched(); - if (pagedismissal != Document::kNoDismissal) { - UseCounter::Count(GetDocument(), WebFeature::kSyncXhrInPageDismissal); - DEFINE_STATIC_LOCAL(EnumerationHistogram, syncxhr_pagedismissal_histogram, - ("XHR.Sync.PageDismissal", 5)); - syncxhr_pagedismissal_histogram.Count(pagedismissal); + } else { + // Use count for XHR synchronous requests. + UseCounter::Count(&execution_context, WebFeature::kXMLHttpRequestSynchronous); + if (GetExecutionContext()->IsDocument()) { + // Update histogram for usage of sync xhr within pagedismissal. + auto pagedismissal = GetDocument()->PageDismissalEventBeingDispatched(); + if (pagedismissal != Document::kNoDismissal) { + UseCounter::Count(GetDocument(), WebFeature::kSyncXhrInPageDismissal); + DEFINE_STATIC_LOCAL(EnumerationHistogram, syncxhr_pagedismissal_histogram, + ("XHR.Sync.PageDismissal", 5)); + syncxhr_pagedismissal_histogram.Count(pagedismissal); + } } + resource_loader_options.synchronous_policy = kRequestSynchronously; } - resource_loader_options.synchronous_policy = kRequestSynchronously; loader_ = new ThreadableLoader(execution_context, this, - resource_loader_options, timeout_); + resource_loader_options); + loader_->SetTimeout(timeout_); loader_->Start(request); - ThrowForLoadFailureIfNeeded(exception_state, String()); + if (!async_) + ThrowForLoadFailureIfNeeded(exception_state, String()); } void XMLHttpRequest::abort() {
diff --git a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.h b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.h index c1dc5a7..81175c120 100644 --- a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.h +++ b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.h
@@ -151,7 +151,7 @@ Document* responseXML(ExceptionState&); Blob* ResponseBlob(); DOMArrayBuffer* ResponseArrayBuffer(); - unsigned timeout() const { return timeout_ ? timeout_->InMilliseconds() : 0; } + unsigned timeout() const { return timeout_.InMilliseconds(); } void setTimeout(unsigned timeout, ExceptionState&); ResponseTypeCode GetResponseTypeCode() const { return response_type_code_; } String responseType(); @@ -311,7 +311,7 @@ // Not converted to ASCII lowercase. Must be lowered later or compared // using case insensitive comparison functions if needed. AtomicString mime_type_override_; - base::Optional<TimeDelta> timeout_; + TimeDelta timeout_; TraceWrapperMember<Blob> response_blob_; Member<ThreadableLoader> loader_;
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope_test.cc b/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope_test.cc index 461b599..6231de5 100644 --- a/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope_test.cc +++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet_global_scope_test.cc
@@ -75,7 +75,7 @@ std::unique_ptr<AnimationWorkletThread> CreateAnimationWorkletThread( AnimationWorkletProxyClient* proxy_client) { std::unique_ptr<AnimationWorkletThread> thread = - AnimationWorkletThread::Create(nullptr, *reporting_proxy_); + AnimationWorkletThread::Create(*reporting_proxy_); WorkerClients* clients = WorkerClients::Create(); if (proxy_client)
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet_messaging_proxy.cc b/third_party/blink/renderer/modules/animationworklet/animation_worklet_messaging_proxy.cc index f3d76abe..ab0cd37 100644 --- a/third_party/blink/renderer/modules/animationworklet/animation_worklet_messaging_proxy.cc +++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet_messaging_proxy.cc
@@ -21,8 +21,7 @@ std::unique_ptr<WorkerThread> AnimationWorkletMessagingProxy::CreateWorkerThread() { - return AnimationWorkletThread::Create(CreateThreadableLoadingContext(), - WorkletObjectProxy()); + return AnimationWorkletThread::Create(WorkletObjectProxy()); } } // namespace blink
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread.cc b/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread.cc index 59557d8..cd9d5f2ce 100644 --- a/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread.cc +++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread.cc
@@ -5,7 +5,6 @@ #include "third_party/blink/renderer/modules/animationworklet/animation_worklet_thread.h" #include "base/memory/ptr_util.h" -#include "third_party/blink/renderer/core/loader/threadable_loading_context.h" #include "third_party/blink/renderer/core/workers/global_scope_creation_params.h" #include "third_party/blink/renderer/core/workers/worker_backing_thread.h" #include "third_party/blink/renderer/core/workers/worklet_thread_holder.h" @@ -17,21 +16,18 @@ namespace blink { std::unique_ptr<AnimationWorkletThread> AnimationWorkletThread::Create( - ThreadableLoadingContext* loading_context, WorkerReportingProxy& worker_reporting_proxy) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("animation-worklet"), "AnimationWorkletThread::create"); DCHECK(IsMainThread()); - return base::WrapUnique( - new AnimationWorkletThread(loading_context, worker_reporting_proxy)); + return base::WrapUnique(new AnimationWorkletThread(worker_reporting_proxy)); } template class WorkletThreadHolder<AnimationWorkletThread>; AnimationWorkletThread::AnimationWorkletThread( - ThreadableLoadingContext* loading_context, WorkerReportingProxy& worker_reporting_proxy) - : WorkerThread(loading_context, worker_reporting_proxy) {} + : WorkerThread(worker_reporting_proxy) {} AnimationWorkletThread::~AnimationWorkletThread() = default;
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread.h b/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread.h index 17371e8..78fe953 100644 --- a/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread.h +++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread.h
@@ -11,7 +11,6 @@ namespace blink { -class ThreadableLoadingContext; class WorkerReportingProxy; // Represents the shared backing thread that is used by all animation worklets @@ -19,7 +18,6 @@ class MODULES_EXPORT AnimationWorkletThread final : public WorkerThread { public: static std::unique_ptr<AnimationWorkletThread> Create( - ThreadableLoadingContext*, WorkerReportingProxy&); ~AnimationWorkletThread() override; @@ -42,7 +40,7 @@ static WebThread* GetSharedBackingThread(); private: - AnimationWorkletThread(ThreadableLoadingContext*, WorkerReportingProxy&); + explicit AnimationWorkletThread(WorkerReportingProxy&); WorkerOrWorkletGlobalScope* CreateWorkerGlobalScope( std::unique_ptr<GlobalScopeCreationParams>) final;
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread_test.cc b/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread_test.cc index 2d9fd362e..3624e86f 100644 --- a/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread_test.cc +++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet_thread_test.cc
@@ -82,7 +82,7 @@ new TestAnimationWorkletProxyClient()); std::unique_ptr<AnimationWorkletThread> thread = - AnimationWorkletThread::Create(nullptr, *reporting_proxy_); + AnimationWorkletThread::Create(*reporting_proxy_); Document* document = &GetDocument(); thread->Start( std::make_unique<GlobalScopeCreationParams>(
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc index 5b3612f..1fb516e 100644 --- a/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc +++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc
@@ -73,8 +73,6 @@ icon_callback_ = std::move(icon_callback); - TimeDelta timeout = TimeDelta::FromMilliseconds(kIconFetchTimeoutInMs); - ResourceLoaderOptions resource_loader_options; if (execution_context->IsWorkerGlobalScope()) resource_loader_options.request_initiator_context = kWorkerContext; @@ -84,9 +82,10 @@ resource_request.SetPriority(ResourceLoadPriority::kMedium); resource_request.SetRequestorOrigin(execution_context->GetSecurityOrigin()); - threadable_loader_ = new ThreadableLoader(*execution_context, this, - resource_loader_options, timeout); - + threadable_loader_ = + new ThreadableLoader(*execution_context, this, resource_loader_options); + threadable_loader_->SetTimeout( + TimeDelta::FromMilliseconds(kIconFetchTimeoutInMs)); threadable_loader_->Start(resource_request); }
diff --git a/third_party/blink/renderer/modules/device_orientation/BUILD.gn b/third_party/blink/renderer/modules/device_orientation/BUILD.gn index 399ac3e..f6751b6 100644 --- a/third_party/blink/renderer/modules/device_orientation/BUILD.gn +++ b/third_party/blink/renderer/modules/device_orientation/BUILD.gn
@@ -38,8 +38,4 @@ "dom_window_device_motion.h", "dom_window_device_orientation.h", ] - - deps = [ - "//services/device/public/cpp/generic_sensor:shared_with_blink", - ] }
diff --git a/third_party/blink/renderer/modules/eventsource/event_source.cc b/third_party/blink/renderer/modules/eventsource/event_source.cc index bfa75488..0061ecc 100644 --- a/third_party/blink/renderer/modules/eventsource/event_source.cc +++ b/third_party/blink/renderer/modules/eventsource/event_source.cc
@@ -156,8 +156,8 @@ resource_loader_options.security_origin = origin; probe::willSendEventSourceRequest(&execution_context, this); - loader_ = new ThreadableLoader(execution_context, this, - resource_loader_options, base::nullopt); + loader_ = + new ThreadableLoader(execution_context, this, resource_loader_options); loader_->Start(request); }
diff --git a/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc b/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc index 5419eaa..db7d835 100644 --- a/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc +++ b/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc
@@ -45,7 +45,6 @@ #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" #include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/loader/frame_load_request.h" -#include "third_party/blink/renderer/core/loader/threadable_loading_context.h" #include "third_party/blink/renderer/core/loader/worker_fetch_context.h" #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/core/script/script.h" @@ -409,7 +408,6 @@ } worker_thread_ = std::make_unique<ServiceWorkerThread>( - ThreadableLoadingContext::Create(*document), ServiceWorkerGlobalScopeProxy::Create(*this, *worker_context_client_), std::move(installed_scripts_manager_), std::move(cache_storage_info_));
diff --git a/third_party/blink/renderer/modules/notifications/notification_image_loader.cc b/third_party/blink/renderer/modules/notifications/notification_image_loader.cc index 85a4765e..fffba5f 100644 --- a/third_party/blink/renderer/modules/notifications/notification_image_loader.cc +++ b/third_party/blink/renderer/modules/notifications/notification_image_loader.cc
@@ -106,8 +106,6 @@ start_time_ = CurrentTimeTicks(); image_callback_ = std::move(image_callback); - TimeDelta timeout = TimeDelta::FromMilliseconds(kImageFetchTimeoutInMs); - // TODO(mvanouwerkerk): Add an entry for notifications to // FetchInitiatorTypeNames and use it. ResourceLoaderOptions resource_loader_options; @@ -120,7 +118,9 @@ resource_request.SetRequestorOrigin(context->GetSecurityOrigin()); threadable_loader_ = new ThreadableLoader( - *context, this, resource_loader_options, timeout); + *context, this, resource_loader_options); + threadable_loader_->SetTimeout( + TimeDelta::FromMilliseconds(kImageFetchTimeoutInMs)); threadable_loader_->Start(resource_request); }
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_thread.cc b/third_party/blink/renderer/modules/service_worker/service_worker_thread.cc index 6c00996..1cec9017 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_thread.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_thread.cc
@@ -41,12 +41,11 @@ namespace blink { ServiceWorkerThread::ServiceWorkerThread( - ThreadableLoadingContext* loading_context, ServiceWorkerGlobalScopeProxy* global_scope_proxy, std::unique_ptr<ServiceWorkerInstalledScriptsManager> installed_scripts_manager, mojom::blink::CacheStoragePtrInfo cache_storage_info) - : WorkerThread(loading_context, *global_scope_proxy), + : WorkerThread(*global_scope_proxy), global_scope_proxy_(global_scope_proxy), worker_backing_thread_(WorkerBackingThread::Create( WebThreadCreationParams(GetThreadType()))),
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_thread.h b/third_party/blink/renderer/modules/service_worker/service_worker_thread.h index ddff004..d073841 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_thread.h +++ b/third_party/blink/renderer/modules/service_worker/service_worker_thread.h
@@ -48,8 +48,7 @@ public: // ServiceWorkerThread owns a given ServiceWorkerGlobalScopeProxy via // Persistent. - ServiceWorkerThread(ThreadableLoadingContext*, - ServiceWorkerGlobalScopeProxy*, + ServiceWorkerThread(ServiceWorkerGlobalScopeProxy*, std::unique_ptr<ServiceWorkerInstalledScriptsManager>, mojom::blink::CacheStoragePtrInfo cache_storage_info); ~ServiceWorkerThread() override;
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope_test.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope_test.cc index 59e564d..8ed52a2 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope_test.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope_test.cc
@@ -65,7 +65,7 @@ std::unique_ptr<AudioWorkletThread> CreateAudioWorkletThread() { std::unique_ptr<AudioWorkletThread> thread = - AudioWorkletThread::Create(nullptr, *reporting_proxy_); + AudioWorkletThread::Create(*reporting_proxy_); Document* document = &GetDocument(); thread->Start( std::make_unique<GlobalScopeCreationParams>(
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_messaging_proxy.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_messaging_proxy.cc index 479330b..b9d26b3f 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_worklet_messaging_proxy.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_messaging_proxy.cc
@@ -93,8 +93,7 @@ } std::unique_ptr<WorkerThread> AudioWorkletMessagingProxy::CreateWorkerThread() { - return AudioWorkletThread::Create(CreateThreadableLoadingContext(), - WorkletObjectProxy()); + return AudioWorkletThread::Create(WorkletObjectProxy()); } void AudioWorkletMessagingProxy::Trace(Visitor* visitor) {
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread.cc index 312cb3a..be94778 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread.cc
@@ -28,18 +28,15 @@ unsigned AudioWorkletThread::s_ref_count_ = 0; std::unique_ptr<AudioWorkletThread> AudioWorkletThread::Create( - ThreadableLoadingContext* loading_context, WorkerReportingProxy& worker_reporting_proxy) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("audio-worklet"), "AudioWorkletThread::create"); - return base::WrapUnique( - new AudioWorkletThread(loading_context, worker_reporting_proxy)); + return base::WrapUnique(new AudioWorkletThread(worker_reporting_proxy)); } AudioWorkletThread::AudioWorkletThread( - ThreadableLoadingContext* loading_context, WorkerReportingProxy& worker_reporting_proxy) - : WorkerThread(loading_context, worker_reporting_proxy) { + : WorkerThread(worker_reporting_proxy) { DCHECK(IsMainThread()); if (++s_ref_count_ == 1) EnsureSharedBackingThread();
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread.h b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread.h index 0277ad5..b8b0960 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread.h +++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread.h
@@ -22,8 +22,7 @@ class MODULES_EXPORT AudioWorkletThread final : public WorkerThread { public: - static std::unique_ptr<AudioWorkletThread> Create(ThreadableLoadingContext*, - WorkerReportingProxy&); + static std::unique_ptr<AudioWorkletThread> Create(WorkerReportingProxy&); ~AudioWorkletThread() override; WorkerBackingThread& GetWorkerBackingThread() override; @@ -45,7 +44,7 @@ static WebThread* GetSharedBackingThread(); private: - AudioWorkletThread(ThreadableLoadingContext*, WorkerReportingProxy&); + explicit AudioWorkletThread(WorkerReportingProxy&); WorkerOrWorkletGlobalScope* CreateWorkerGlobalScope( std::unique_ptr<GlobalScopeCreationParams>) final;
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc index 060c0164..308f899 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_thread_test.cc
@@ -49,7 +49,7 @@ std::unique_ptr<AudioWorkletThread> CreateAudioWorkletThread() { std::unique_ptr<AudioWorkletThread> thread = - AudioWorkletThread::Create(nullptr, *reporting_proxy_); + AudioWorkletThread::Create(*reporting_proxy_); Document* document = &GetDocument(); thread->Start( std::make_unique<GlobalScopeCreationParams>(
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context_base.cc index ffb32f1..0fef66c 100644 --- a/third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context_base.cc
@@ -32,8 +32,7 @@ void WebGL2ComputeRenderingContextBase::dispatchCompute(GLuint numGroupsX, GLuint numGroupsY, GLuint numGroupsZ) { - SynthesizeGLError(GL_INVALID_OPERATION, "dispatchCompute", "UNIMPLEMENTED"); - return; + ContextGL()->DispatchCompute(numGroupsX, numGroupsY, numGroupsZ); } void WebGL2ComputeRenderingContextBase::bindImageTexture(GLuint unit,
diff --git a/third_party/blink/renderer/modules/webgl/webgl_program.cc b/third_party/blink/renderer/modules/webgl/webgl_program.cc index d3d659d..4c6e517 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_program.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_program.cc
@@ -62,6 +62,10 @@ fragment_shader_->OnDetached(gl); fragment_shader_ = nullptr; } + if (compute_shader_) { + compute_shader_->OnDetached(gl); + compute_shader_ = nullptr; + } } } @@ -89,6 +93,8 @@ return vertex_shader_; case GL_FRAGMENT_SHADER: return fragment_shader_; + case GL_COMPUTE_SHADER: + return compute_shader_; default: return nullptr; } @@ -108,6 +114,11 @@ return false; fragment_shader_ = shader; return true; + case GL_COMPUTE_SHADER: + if (compute_shader_) + return false; + compute_shader_ = shader; + return true; default: return false; } @@ -127,6 +138,11 @@ return false; fragment_shader_ = nullptr; return true; + case GL_COMPUTE_SHADER: + if (compute_shader_ != shader) + return false; + compute_shader_ = nullptr; + return true; default: return false; } @@ -150,6 +166,7 @@ void WebGLProgram::Trace(blink::Visitor* visitor) { visitor->Trace(vertex_shader_); visitor->Trace(fragment_shader_); + visitor->Trace(compute_shader_); WebGLSharedPlatform3DObject::Trace(visitor); }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_program.h b/third_party/blink/renderer/modules/webgl/webgl_program.h index 063d217..40f00420 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_program.h +++ b/third_party/blink/renderer/modules/webgl/webgl_program.h
@@ -94,6 +94,7 @@ TraceWrapperMember<WebGLShader> vertex_shader_; TraceWrapperMember<WebGLShader> fragment_shader_; + TraceWrapperMember<WebGLShader> compute_shader_; bool info_valid_;
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc index af5b92b..8c978183 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -2300,11 +2300,29 @@ bound_vertex_array_object_ = default_vertex_array_object_; } +bool WebGLRenderingContextBase::ValidateShaderType(const char* function_name, + GLenum shader_type) { + switch (shader_type) { + case GL_VERTEX_SHADER: + case GL_FRAGMENT_SHADER: + return true; + case GL_COMPUTE_SHADER: + if (context_type_ != Platform::kWebGL2ComputeContextType) { + SynthesizeGLError(GL_INVALID_ENUM, function_name, + "invalid shader type"); + return false; + } + return true; + default: + SynthesizeGLError(GL_INVALID_ENUM, function_name, "invalid shader type"); + return false; + } +} + WebGLShader* WebGLRenderingContextBase::createShader(GLenum type) { if (isContextLost()) return nullptr; - if (type != GL_VERTEX_SHADER && type != GL_FRAGMENT_SHADER) { - SynthesizeGLError(GL_INVALID_ENUM, "createShader", "invalid shader type"); + if (!ValidateShaderType("createShader", type)) { return nullptr; } @@ -2784,7 +2802,8 @@ return base::nullopt; HeapVector<Member<WebGLShader>> shader_objects; - const GLenum kShaderType[] = {GL_VERTEX_SHADER, GL_FRAGMENT_SHADER}; + const GLenum kShaderType[] = {GL_VERTEX_SHADER, GL_FRAGMENT_SHADER, + GL_COMPUTE_SHADER}; for (unsigned i = 0; i < sizeof(kShaderType) / sizeof(GLenum); ++i) { WebGLShader* shader = program->GetAttachedShader(kShaderType[i]); if (shader) @@ -3464,14 +3483,8 @@ GLenum precision_type) { if (isContextLost()) return nullptr; - switch (shader_type) { - case GL_VERTEX_SHADER: - case GL_FRAGMENT_SHADER: - break; - default: - SynthesizeGLError(GL_INVALID_ENUM, "getShaderPrecisionFormat", - "invalid shader type"); - return nullptr; + if (!ValidateShaderType("getShaderPrecisionFormat", shader_type)) { + return nullptr; } switch (precision_type) { case GL_LOW_FLOAT:
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h index 084b4bd..462e62b2 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
@@ -55,6 +55,7 @@ #include "third_party/blink/renderer/platform/timer.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/khronos/GLES2/gl2.h" +#include "third_party/khronos/GLES3/gl31.h" namespace cc { class Layer; @@ -1065,7 +1066,12 @@ bool* selecting_sub_rectangle) { DCHECK(function_name); DCHECK(selecting_sub_rectangle); - DCHECK(image); + if (!image) { + // Probably indicates a failure to allocate the image. + SynthesizeGLError(GL_OUT_OF_MEMORY, function_name, "out of memory"); + return false; + } + int image_width = static_cast<int>(image->width()); int image_height = static_cast<int>(image->height()); *selecting_sub_rectangle = @@ -1701,6 +1707,8 @@ GLint, const IntRect&); + bool ValidateShaderType(const char* function_name, GLenum shader_type); + const Platform::ContextType context_type_; bool IsPaintable() const final { return GetDrawingBuffer(); }
diff --git a/third_party/blink/renderer/modules/websockets/dom_websocket.cc b/third_party/blink/renderer/modules/websockets/dom_websocket.cc index 75126c8e..c29cb6d 100644 --- a/third_party/blink/renderer/modules/websockets/dom_websocket.cc +++ b/third_party/blink/renderer/modules/websockets/dom_websocket.cc
@@ -64,6 +64,7 @@ static const size_t kMaxByteSizeForHistogram = 100 * 1000 * 1000; static const int32_t kBucketCountForMessageSizeHistogram = 50; +static const char kWebSocketSubprotocolSeparator[] = ", "; namespace blink { @@ -215,10 +216,6 @@ "Still in CONNECTING state."); } -const char* DOMWebSocket::SubprotocolSeperator() { - return ", "; -} - DOMWebSocket::DOMWebSocket(ExecutionContext* context) : PausableObject(context), state_(kConnecting), @@ -375,7 +372,7 @@ String protocol_string; if (!protocols.IsEmpty()) - protocol_string = JoinStrings(protocols, SubprotocolSeperator()); + protocol_string = JoinStrings(protocols, kWebSocketSubprotocolSeparator); origin_string_ = SecurityOrigin::Create(url_)->ToString(); channel_ = CreateChannel(GetExecutionContext(), this);
diff --git a/third_party/blink/renderer/modules/websockets/dom_websocket.h b/third_party/blink/renderer/modules/websockets/dom_websocket.h index 48810310..53f80871 100644 --- a/third_party/blink/renderer/modules/websockets/dom_websocket.h +++ b/third_party/blink/renderer/modules/websockets/dom_websocket.h
@@ -69,7 +69,6 @@ USING_GARBAGE_COLLECTED_MIXIN(DOMWebSocket); public: - static const char* SubprotocolSeperator(); // DOMWebSocket instances must be used with a wrapper since this class's // lifetime management is designed assuming the V8 holds a ref on it while // hasPendingActivity() returns true.
diff --git a/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc b/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc index 25e05c0..c7755b7 100644 --- a/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc +++ b/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc
@@ -48,14 +48,15 @@ #include "third_party/blink/renderer/core/loader/base_fetch_context.h" #include "third_party/blink/renderer/core/loader/mixed_content_checker.h" #include "third_party/blink/renderer/core/loader/subresource_filter.h" -#include "third_party/blink/renderer/core/loader/threadable_loading_context.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" +#include "third_party/blink/renderer/core/workers/worker_global_scope.h" #include "third_party/blink/renderer/modules/websockets/inspector_websocket_events.h" #include "third_party/blink/renderer/modules/websockets/websocket_channel_client.h" #include "third_party/blink/renderer/modules/websockets/websocket_handle_impl.h" +#include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/loader/fetch/unique_identifier.h" #include "third_party/blink/renderer/platform/network/network_log.h" #include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h" @@ -158,38 +159,42 @@ std::unique_ptr<SourceLocation> location, WebSocketHandle* handle, std::unique_ptr<WebSocketHandshakeThrottle> handshake_throttle) { - return new WebSocketChannelImpl( - ThreadableLoadingContext::Create(*document), client, std::move(location), - base::WrapUnique(handle), std::move(handshake_throttle)); + auto* channel = new WebSocketChannelImpl( + document, client, std::move(location), base::WrapUnique(handle)); + channel->handshake_throttle_ = std::move(handshake_throttle); + return channel; } // static WebSocketChannelImpl* WebSocketChannelImpl::Create( - ThreadableLoadingContext* loading_context, + ExecutionContext* execution_context, WebSocketChannelClient* client, std::unique_ptr<SourceLocation> location) { - return new WebSocketChannelImpl( - loading_context, client, std::move(location), - std::make_unique<WebSocketHandleImpl>(), - loading_context->GetFetchContext()->CreateWebSocketHandshakeThrottle()); + auto* channel = + new WebSocketChannelImpl(execution_context, client, std::move(location), + std::make_unique<WebSocketHandleImpl>()); + channel->handshake_throttle_ = + channel->GetBaseFetchContext()->CreateWebSocketHandshakeThrottle(); + return channel; } WebSocketChannelImpl::WebSocketChannelImpl( - ThreadableLoadingContext* loading_context, + ExecutionContext* execution_context, WebSocketChannelClient* client, std::unique_ptr<SourceLocation> location, - std::unique_ptr<WebSocketHandle> handle, - std::unique_ptr<WebSocketHandshakeThrottle> handshake_throttle) + std::unique_ptr<WebSocketHandle> handle) : handle_(std::move(handle)), client_(client), identifier_(CreateUniqueIdentifier()), - loading_context_(loading_context), + execution_context_(execution_context), sending_quota_(0), received_data_size_for_flow_control_(0), sent_size_of_top_message_(0), location_at_construction_(std::move(location)), - handshake_throttle_(std::move(handshake_throttle)), - throttle_passed_(false) {} + throttle_passed_(false) { + if (execution_context_->IsWorkerGlobalScope()) + ToWorkerGlobalScope(execution_context_)->EnsureFetcher(); +} WebSocketChannelImpl::~WebSocketChannelImpl() { DCHECK(!blob_loader_); @@ -203,20 +208,18 @@ if (!handle_) return false; - if (loading_context_->GetFetchContext() - ->ShouldBlockWebSocketByMixedContentCheck(url)) { + if (GetBaseFetchContext()->ShouldBlockWebSocketByMixedContentCheck(url)) return false; - } - if (auto* scheduler = GetExecutionContext()->GetScheduler()) + if (auto* scheduler = execution_context_->GetScheduler()) connection_handle_for_scheduler_ = scheduler->OnActiveConnectionCreated(); if (MixedContentChecker::IsMixedContent( - GetExecutionContext()->GetSecurityOrigin(), url)) { + execution_context_->GetSecurityOrigin(), url)) { String message = "Connecting to a non-secure WebSocket server from a secure origin is " "deprecated."; - GetExecutionContext()->AddConsoleMessage(ConsoleMessage::Create( + execution_context_->AddConsoleMessage(ConsoleMessage::Create( kJSMessageSource, kWarningMessageLevel, message)); } @@ -234,20 +237,18 @@ // failure blocks the worker thread which should be avoided. Note that // returning "true" just indicates that this was not a mixed content error. if (ShouldDisallowConnection(url)) { - GetExecutionContext() - ->GetTaskRunner(TaskType::kNetworking) + execution_context_->GetTaskRunner(TaskType::kNetworking) ->PostTask(FROM_HERE, WTF::Bind(&WebSocketChannelImpl::TearDownFailedConnection, WrapPersistent(this))); return true; } - handle_->Connect(std::move(socket_ptr), url, protocols, - loading_context_->GetFetchContext()->GetSiteForCookies(), - loading_context_->GetExecutionContext()->UserAgent(), this, - loading_context_->GetExecutionContext() - ->GetTaskRunner(TaskType::kNetworking) - .get()); + handle_->Connect( + std::move(socket_ptr), url, protocols, + GetBaseFetchContext()->GetSiteForCookies(), + execution_context_->UserAgent(), this, + execution_context_->GetTaskRunner(TaskType::kNetworking).get()); if (handshake_throttle_) { handshake_throttle_->ThrottleHandshake(url, this); @@ -259,8 +260,8 @@ TRACE_EVENT_INSTANT1("devtools.timeline", "WebSocketCreate", TRACE_EVENT_SCOPE_THREAD, "data", InspectorWebSocketCreateEvent::Data( - GetExecutionContext(), identifier_, url, protocol)); - probe::didCreateWebSocket(GetExecutionContext(), identifier_, url, protocol); + execution_context_, identifier_, url, protocol)); + probe::didCreateWebSocket(execution_context_, identifier_, url, protocol); return true; } @@ -268,7 +269,7 @@ network::mojom::blink::WebSocketPtr socket_ptr; auto socket_request = mojo::MakeRequest(&socket_ptr); service_manager::InterfaceProvider* interface_provider = - GetExecutionContext()->GetInterfaceProvider(); + execution_context_->GetInterfaceProvider(); if (interface_provider) interface_provider->GetInterface(std::move(socket_request)); return Connect(url, protocol, std::move(socket_ptr)); @@ -278,7 +279,7 @@ NETWORK_DVLOG(1) << this << " Send(" << message << ") (CString argument)"; // FIXME: Change the inspector API to show the entire message instead // of individual frames. - probe::didSendWebSocketFrame(GetExecutionContext(), identifier_, + probe::didSendWebSocketFrame(execution_context_, identifier_, WebSocketOpCode::kOpCodeText, true, message.data(), message.length()); messages_.push_back(new Message(message)); @@ -296,7 +297,7 @@ // FIXME: We can't access the data here. // Since Binary data are not displayed in Inspector, this does not // affect actual behavior. - probe::didSendWebSocketFrame(GetExecutionContext(), identifier_, + probe::didSendWebSocketFrame(execution_context_, identifier_, WebSocketOpCode::kOpCodeBinary, true, "", 0); messages_.push_back(new Message(std::move(blob_data_handle))); ProcessSendQueue(); @@ -311,7 +312,7 @@ // FIXME: Change the inspector API to show the entire message instead // of individual frames. probe::didSendWebSocketFrame( - GetExecutionContext(), identifier_, WebSocketOpCode::kOpCodeBinary, true, + execution_context_, identifier_, WebSocketOpCode::kOpCodeBinary, true, static_cast<const char*>(buffer.Data()) + byte_offset, byte_length); // buffer.slice copies its contents. // FIXME: Reduce copy by sending the data immediately when we don't need to @@ -328,7 +329,7 @@ << ")"; // FIXME: Change the inspector API to show the entire message instead // of individual frames. - probe::didSendWebSocketFrame(GetExecutionContext(), identifier_, + probe::didSendWebSocketFrame(execution_context_, identifier_, WebSocketOpCode::kOpCodeText, true, data->data(), data->size()); messages_.push_back( @@ -343,7 +344,7 @@ << ")"; // FIXME: Change the inspector API to show the entire message instead // of individual frames. - probe::didSendWebSocketFrame(GetExecutionContext(), identifier_, + probe::didSendWebSocketFrame(execution_context_, identifier_, WebSocketOpCode::kOpCodeBinary, true, data->data(), data->size()); messages_.push_back( @@ -364,8 +365,7 @@ MessageLevel level, std::unique_ptr<SourceLocation> location) { NETWORK_DVLOG(1) << this << " Fail(" << reason << ")"; - probe::didReceiveWebSocketFrameError(GetExecutionContext(), identifier_, - reason); + probe::didReceiveWebSocketFrameError(execution_context_, identifier_, reason); const String message = "WebSocket connection to '" + url_.ElidedString() + "' failed: " + reason; @@ -380,7 +380,7 @@ location = location_at_construction_->Clone(); } - GetExecutionContext()->AddConsoleMessage(ConsoleMessage::Create( + execution_context_->AddConsoleMessage(ConsoleMessage::Create( kJSMessageSource, level, message, std::move(location))); // |reason| is only for logging and should not be provided for scripts, // hence close reason must be empty in tearDownFailedConnection. @@ -392,9 +392,8 @@ if (identifier_) { TRACE_EVENT_INSTANT1( "devtools.timeline", "WebSocketDestroy", TRACE_EVENT_SCOPE_THREAD, - "data", - InspectorWebSocketEvent::Data(GetExecutionContext(), identifier_)); - probe::didCloseWebSocket(GetExecutionContext(), identifier_); + "data", InspectorWebSocketEvent::Data(execution_context_, identifier_)); + probe::didCloseWebSocket(execution_context_, identifier_); } connection_handle_for_scheduler_.reset(); AbortAsyncOperations(); @@ -547,10 +546,6 @@ client->DidClose(status, code, reason); } -ExecutionContext* WebSocketChannelImpl::GetExecutionContext() const { - return loading_context_->GetExecutionContext(); -} - void WebSocketChannelImpl::DidConnect(WebSocketHandle* handle, const String& selected_protocol, const String& extensions) { @@ -586,8 +581,8 @@ TRACE_EVENT_INSTANT1( "devtools.timeline", "WebSocketSendHandshakeRequest", TRACE_EVENT_SCOPE_THREAD, "data", - InspectorWebSocketEvent::Data(GetExecutionContext(), identifier_)); - probe::willSendWebSocketHandshakeRequest(GetExecutionContext(), identifier_, + InspectorWebSocketEvent::Data(execution_context_, identifier_)); + probe::willSendWebSocketHandshakeRequest(execution_context_, identifier_, request.get()); handshake_request_ = std::move(request); } @@ -603,10 +598,10 @@ TRACE_EVENT_INSTANT1( "devtools.timeline", "WebSocketReceiveHandshakeResponse", TRACE_EVENT_SCOPE_THREAD, "data", - InspectorWebSocketEvent::Data(GetExecutionContext(), identifier_)); - probe::didReceiveWebSocketHandshakeResponse( - GetExecutionContext(), identifier_, handshake_request_.get(), - response.get()); + InspectorWebSocketEvent::Data(execution_context_, identifier_)); + probe::didReceiveWebSocketHandshakeResponse(execution_context_, identifier_, + handshake_request_.get(), + response.get()); handshake_request_ = nullptr; } @@ -666,7 +661,7 @@ auto opcode = receiving_message_type_is_text_ ? WebSocketOpCode::kOpCodeText : WebSocketOpCode::kOpCodeBinary; - probe::didReceiveWebSocketFrame(GetExecutionContext(), identifier_, opcode, + probe::didReceiveWebSocketFrame(execution_context_, identifier_, opcode, false, receiving_message_data_.data(), receiving_message_data_.size()); if (receiving_message_type_is_text_) { @@ -705,9 +700,8 @@ if (identifier_) { TRACE_EVENT_INSTANT1( "devtools.timeline", "WebSocketDestroy", TRACE_EVENT_SCOPE_THREAD, - "data", - InspectorWebSocketEvent::Data(GetExecutionContext(), identifier_)); - probe::didCloseWebSocket(GetExecutionContext(), identifier_); + "data", InspectorWebSocketEvent::Data(execution_context_, identifier_)); + probe::didCloseWebSocket(execution_context_, identifier_); identifier_ = 0; } @@ -795,18 +789,23 @@ bool WebSocketChannelImpl::ShouldDisallowConnection(const KURL& url) { DCHECK(handle_); - BaseFetchContext* fetch_context = loading_context_->GetFetchContext(); - SubresourceFilter* subresource_filter = fetch_context->GetSubresourceFilter(); + SubresourceFilter* subresource_filter = + GetBaseFetchContext()->GetSubresourceFilter(); if (!subresource_filter) return false; return !subresource_filter->AllowWebSocketConnection(url); } +BaseFetchContext* WebSocketChannelImpl::GetBaseFetchContext() const { + ResourceFetcher* resource_fetcher = execution_context_->Fetcher(); + return static_cast<BaseFetchContext*>(&resource_fetcher->Context()); +} + void WebSocketChannelImpl::Trace(blink::Visitor* visitor) { visitor->Trace(blob_loader_); visitor->Trace(messages_); visitor->Trace(client_); - visitor->Trace(loading_context_); + visitor->Trace(execution_context_); WebSocketChannel::Trace(visitor); }
diff --git a/third_party/blink/renderer/modules/websockets/websocket_channel_impl.h b/third_party/blink/renderer/modules/websockets/websocket_channel_impl.h index d2d23606..dfb664c 100644 --- a/third_party/blink/renderer/modules/websockets/websocket_channel_impl.h +++ b/third_party/blink/renderer/modules/websockets/websocket_channel_impl.h
@@ -40,7 +40,6 @@ #include "third_party/blink/renderer/bindings/core/v8/source_location.h" #include "third_party/blink/renderer/core/fileapi/blob.h" #include "third_party/blink/renderer/core/fileapi/file_error.h" -#include "third_party/blink/renderer/core/loader/threadable_loading_context.h" #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/modules/websockets/websocket_channel.h" #include "third_party/blink/renderer/modules/websockets/websocket_handle.h" @@ -55,6 +54,7 @@ namespace blink { +class BaseFetchContext; class WebSocketChannelClient; class WebSocketHandshakeThrottle; @@ -70,17 +70,9 @@ // explicitly by passing the last parameter. // In the usual case, they are set automatically and you don't have to // pass it. - static WebSocketChannelImpl* Create( - ExecutionContext* context, - WebSocketChannelClient* client, - std::unique_ptr<SourceLocation> location) { - DCHECK(context); - return Create(ThreadableLoadingContext::Create(*context), client, - std::move(location)); - } - static WebSocketChannelImpl* Create(ThreadableLoadingContext*, - WebSocketChannelClient*, - std::unique_ptr<SourceLocation>); + static WebSocketChannelImpl* Create(ExecutionContext* context, + WebSocketChannelClient* client, + std::unique_ptr<SourceLocation> location); static WebSocketChannelImpl* CreateForTesting( Document*, WebSocketChannelClient*, @@ -134,11 +126,10 @@ Vector<char> data; }; - WebSocketChannelImpl(ThreadableLoadingContext*, + WebSocketChannelImpl(ExecutionContext*, WebSocketChannelClient*, std::unique_ptr<SourceLocation>, - std::unique_ptr<WebSocketHandle>, - std::unique_ptr<WebSocketHandshakeThrottle>); + std::unique_ptr<WebSocketHandle>); void SendInternal(WebSocketHandle::MessageType, const char* data, @@ -155,8 +146,6 @@ unsigned short code, const String& reason); - ExecutionContext* GetExecutionContext() const; - // WebSocketHandleClient functions. void DidConnect(WebSocketHandle*, const String& selected_protocol, @@ -192,6 +181,8 @@ void TearDownFailedConnection(); bool ShouldDisallowConnection(const KURL&); + BaseFetchContext* GetBaseFetchContext() const; + // |handle_| is a handle of the connection. // |handle_| == nullptr means this channel is closed. std::unique_ptr<WebSocketHandle> handle_; @@ -204,7 +195,7 @@ Member<BlobLoader> blob_loader_; HeapDeque<Member<Message>> messages_; Vector<char> receiving_message_data_; - Member<ThreadableLoadingContext> loading_context_; + Member<ExecutionContext> execution_context_; bool receiving_message_type_is_text_; uint64_t sending_quota_;
diff --git a/third_party/blink/renderer/platform/bindings/string_resource.cc b/third_party/blink/renderer/platform/bindings/string_resource.cc index 3be41ac..d7b89ce8 100644 --- a/third_party/blink/renderer/platform/bindings/string_resource.cc +++ b/third_party/blink/renderer/platform/bindings/string_resource.cc
@@ -12,7 +12,7 @@ struct StringTraits { static const StringClass& FromStringResource(StringResourceBase*); template <typename V8StringTrait> - static StringClass FromV8String(v8::Local<v8::String>, int); + static StringClass FromV8String(v8::Isolate*, v8::Local<v8::String>, int); }; template <> @@ -21,7 +21,7 @@ return resource->GetWTFString(); } template <typename V8StringTrait> - static String FromV8String(v8::Local<v8::String>, int); + static String FromV8String(v8::Isolate*, v8::Local<v8::String>, int); }; template <> @@ -30,39 +30,43 @@ return resource->GetAtomicString(); } template <typename V8StringTrait> - static AtomicString FromV8String(v8::Local<v8::String>, int); + static AtomicString FromV8String(v8::Isolate*, v8::Local<v8::String>, int); }; struct V8StringTwoBytesTrait { typedef UChar CharType; - ALWAYS_INLINE static void Write(v8::Local<v8::String> v8_string, + ALWAYS_INLINE static void Write(v8::Isolate* isolate, + v8::Local<v8::String> v8_string, CharType* buffer, int length) { - v8_string->Write(reinterpret_cast<uint16_t*>(buffer), 0, length); + v8_string->Write(isolate, reinterpret_cast<uint16_t*>(buffer), 0, length); } }; struct V8StringOneByteTrait { typedef LChar CharType; - ALWAYS_INLINE static void Write(v8::Local<v8::String> v8_string, + ALWAYS_INLINE static void Write(v8::Isolate* isolate, + v8::Local<v8::String> v8_string, CharType* buffer, int length) { - v8_string->WriteOneByte(buffer, 0, length); + v8_string->WriteOneByte(isolate, buffer, 0, length); } }; template <typename V8StringTrait> -String StringTraits<String>::FromV8String(v8::Local<v8::String> v8_string, +String StringTraits<String>::FromV8String(v8::Isolate* isolate, + v8::Local<v8::String> v8_string, int length) { DCHECK(v8_string->Length() == length); typename V8StringTrait::CharType* buffer; String result = String::CreateUninitialized(length, buffer); - V8StringTrait::Write(v8_string, buffer, length); + V8StringTrait::Write(isolate, v8_string, buffer, length); return result; } template <typename V8StringTrait> AtomicString StringTraits<AtomicString>::FromV8String( + v8::Isolate* isolate, v8::Local<v8::String> v8_string, int length) { DCHECK(v8_string->Length() == length); @@ -70,12 +74,12 @@ 32 / sizeof(typename V8StringTrait::CharType); if (length <= kInlineBufferSize) { typename V8StringTrait::CharType inline_buffer[kInlineBufferSize]; - V8StringTrait::Write(v8_string, inline_buffer, length); + V8StringTrait::Write(isolate, v8_string, inline_buffer, length); return AtomicString(inline_buffer, static_cast<unsigned>(length)); } typename V8StringTrait::CharType* buffer; String string = String::CreateUninitialized(length, buffer); - V8StringTrait::Write(v8_string, buffer, length); + V8StringTrait::Write(isolate, v8_string, buffer, length); return AtomicString(string); } @@ -101,11 +105,13 @@ if (UNLIKELY(!length)) return StringType(""); + v8::Isolate* isolate = v8::Isolate::GetCurrent(); bool one_byte = v8_string->ContainsOnlyOneByte(); - StringType result(one_byte ? StringTraits<StringType>::template FromV8String< - V8StringOneByteTrait>(v8_string, length) - : StringTraits<StringType>::template FromV8String< - V8StringTwoBytesTrait>(v8_string, length)); + StringType result( + one_byte ? StringTraits<StringType>::template FromV8String< + V8StringOneByteTrait>(isolate, v8_string, length) + : StringTraits<StringType>::template FromV8String< + V8StringTwoBytesTrait>(isolate, v8_string, length)); if (external != kExternalize || !v8_string->CanMakeExternal()) return result;
diff --git a/third_party/blink/renderer/platform/fonts/shaping/caching_word_shaper.cc b/third_party/blink/renderer/platform/fonts/shaping/caching_word_shaper.cc index aab219b..d574c54a 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/caching_word_shaper.cc +++ b/third_party/blink/renderer/platform/fonts/shaping/caching_word_shaper.cc
@@ -103,7 +103,8 @@ ShapeResultBuffer buffer; float total_width = ShapeResultsForRun(GetShapeCache(), &font_, run, &buffer); - return buffer.GetCharacterRange(total_width, run.Direction(), from, to); + return buffer.GetCharacterRange(run.ToStringView(), run.Direction(), + total_width, from, to); } Vector<CharacterRange> CachingWordShaper::IndividualCharacterRanges(
diff --git a/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper_test.cc b/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper_test.cc index 8c96a9b..730916c 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper_test.cc +++ b/third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper_test.cc
@@ -679,11 +679,9 @@ scoped_refptr<ShapeResult> result = SplitRun(shaper.Shape(&ahem, TextDirection::kLtr), 2); EXPECT_EQ(data.offset_ltr, - result->OffsetForPosition(data.position, OnlyFullGlyphs, - DontBreakGlyphs)); - EXPECT_EQ(data.hit_test_ltr, - result->OffsetForPosition(data.position, IncludePartialGlyphs, - DontBreakGlyphs)); + result->OffsetForPosition(data.position, DontBreakGlyphs)); + EXPECT_EQ(data.hit_test_ltr, result->CaretOffsetForHitTest( + data.position, string, DontBreakGlyphs)); EXPECT_EQ(data.fit_ltr_ltr, result->OffsetToFit(data.position, TextDirection::kLtr)); EXPECT_EQ(data.fit_ltr_rtl, @@ -691,11 +689,9 @@ result = SplitRun(shaper.Shape(&ahem, TextDirection::kRtl), 3); EXPECT_EQ(data.offset_rtl, - result->OffsetForPosition(data.position, OnlyFullGlyphs, - DontBreakGlyphs)); - EXPECT_EQ(data.hit_test_rtl, - result->OffsetForPosition(data.position, IncludePartialGlyphs, - DontBreakGlyphs)); + result->OffsetForPosition(data.position, DontBreakGlyphs)); + EXPECT_EQ(data.hit_test_rtl, result->CaretOffsetForHitTest( + data.position, string, DontBreakGlyphs)); EXPECT_EQ(data.fit_rtl_ltr, result->OffsetToFit(data.position, TextDirection::kLtr)); EXPECT_EQ(data.fit_rtl_rtl, @@ -743,12 +739,15 @@ // A Value-Parameterized Test class to test OffsetForPosition() with // |include_partial_glyphs| parameter. -class IncludePartialGlyphsTest : public HarfBuzzShaperTest, - public ::testing::WithParamInterface<bool> {}; +class IncludePartialGlyphsTest + : public HarfBuzzShaperTest, + public ::testing::WithParamInterface<IncludePartialGlyphsOption> {}; -INSTANTIATE_TEST_CASE_P(OffsetForPositionTest, - IncludePartialGlyphsTest, - ::testing::Bool()); +INSTANTIATE_TEST_CASE_P( + OffsetForPositionTest, + IncludePartialGlyphsTest, + ::testing::Values(IncludePartialGlyphsOption::OnlyFullGlyphs, + IncludePartialGlyphsOption::IncludePartialGlyphs)); TEST_P(IncludePartialGlyphsTest, OffsetForPositionMatchesPositionForOffsetLatin) { @@ -758,84 +757,77 @@ HarfBuzzShaper shaper(string); scoped_refptr<ShapeResult> result = shaper.Shape(&font, direction); - bool include_partial_glyphs = GetParam(); - IncludePartialGlyphsOption partial = - include_partial_glyphs ? IncludePartialGlyphs : OnlyFullGlyphs; - - EXPECT_EQ(0u, result->OffsetForPosition(result->PositionForOffset(0), partial, - DontBreakGlyphs)); - EXPECT_EQ(1u, result->OffsetForPosition(result->PositionForOffset(1), partial, - DontBreakGlyphs)); - EXPECT_EQ(2u, result->OffsetForPosition(result->PositionForOffset(2), partial, - DontBreakGlyphs)); - EXPECT_EQ(3u, result->OffsetForPosition(result->PositionForOffset(3), partial, - DontBreakGlyphs)); - EXPECT_EQ(4u, result->OffsetForPosition(result->PositionForOffset(4), partial, - DontBreakGlyphs)); - EXPECT_EQ(5u, result->OffsetForPosition(result->PositionForOffset(5), partial, - DontBreakGlyphs)); - EXPECT_EQ(6u, result->OffsetForPosition(result->PositionForOffset(6), partial, - DontBreakGlyphs)); - EXPECT_EQ(7u, result->OffsetForPosition(result->PositionForOffset(7), partial, - DontBreakGlyphs)); - EXPECT_EQ(8u, result->OffsetForPosition(result->PositionForOffset(8), partial, - DontBreakGlyphs)); - EXPECT_EQ(9u, result->OffsetForPosition(result->PositionForOffset(9), partial, - DontBreakGlyphs)); + IncludePartialGlyphsOption partial = GetParam(); + EXPECT_EQ(0u, result->OffsetForPosition(result->PositionForOffset(0), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(1u, result->OffsetForPosition(result->PositionForOffset(1), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(2u, result->OffsetForPosition(result->PositionForOffset(2), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(3u, result->OffsetForPosition(result->PositionForOffset(3), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(4u, result->OffsetForPosition(result->PositionForOffset(4), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(5u, result->OffsetForPosition(result->PositionForOffset(5), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(6u, result->OffsetForPosition(result->PositionForOffset(6), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(7u, result->OffsetForPosition(result->PositionForOffset(7), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(8u, result->OffsetForPosition(result->PositionForOffset(8), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(9u, result->OffsetForPosition(result->PositionForOffset(9), string, + partial, DontBreakGlyphs)); EXPECT_EQ(10u, result->OffsetForPosition(result->PositionForOffset(10), - partial, DontBreakGlyphs)); + string, partial, DontBreakGlyphs)); EXPECT_EQ(11u, result->OffsetForPosition(result->PositionForOffset(11), - partial, DontBreakGlyphs)); + string, partial, DontBreakGlyphs)); EXPECT_EQ(12u, result->OffsetForPosition(result->PositionForOffset(12), - partial, DontBreakGlyphs)); + string, partial, DontBreakGlyphs)); } TEST_P(IncludePartialGlyphsTest, OffsetForPositionMatchesPositionForOffsetArabic) { UChar arabic_string[] = {0x628, 0x64A, 0x629}; + String string(arabic_string, 3); TextDirection direction = TextDirection::kRtl; - HarfBuzzShaper shaper(String(arabic_string, 3)); + HarfBuzzShaper shaper(string); scoped_refptr<ShapeResult> result = shaper.Shape(&font, direction); - bool include_partial_glyphs = GetParam(); - IncludePartialGlyphsOption partial = - include_partial_glyphs ? IncludePartialGlyphs : OnlyFullGlyphs; - - EXPECT_EQ(0u, result->OffsetForPosition(result->PositionForOffset(0), partial, - DontBreakGlyphs)); - EXPECT_EQ(1u, result->OffsetForPosition(result->PositionForOffset(1), partial, - DontBreakGlyphs)); - EXPECT_EQ(2u, result->OffsetForPosition(result->PositionForOffset(2), partial, - DontBreakGlyphs)); - EXPECT_EQ(3u, result->OffsetForPosition(result->PositionForOffset(3), partial, - DontBreakGlyphs)); + IncludePartialGlyphsOption partial = GetParam(); + EXPECT_EQ(0u, result->OffsetForPosition(result->PositionForOffset(0), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(1u, result->OffsetForPosition(result->PositionForOffset(1), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(2u, result->OffsetForPosition(result->PositionForOffset(2), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(3u, result->OffsetForPosition(result->PositionForOffset(3), string, + partial, DontBreakGlyphs)); } TEST_P(IncludePartialGlyphsTest, OffsetForPositionMatchesPositionForOffsetMixed) { UChar mixed_string[] = {0x628, 0x64A, 0x629, 0xE20, 0x65E5, 0x62}; - HarfBuzzShaper shaper(String(mixed_string, 6)); + String string(mixed_string, 6); + HarfBuzzShaper shaper(string); scoped_refptr<ShapeResult> result = shaper.Shape(&font, TextDirection::kLtr); - bool include_partial_glyphs = GetParam(); - IncludePartialGlyphsOption partial = - include_partial_glyphs ? IncludePartialGlyphs : OnlyFullGlyphs; - - EXPECT_EQ(0u, result->OffsetForPosition(result->PositionForOffset(0), partial, - DontBreakGlyphs)); - EXPECT_EQ(1u, result->OffsetForPosition(result->PositionForOffset(1), partial, - DontBreakGlyphs)); - EXPECT_EQ(2u, result->OffsetForPosition(result->PositionForOffset(2), partial, - DontBreakGlyphs)); - EXPECT_EQ(3u, result->OffsetForPosition(result->PositionForOffset(3), partial, - DontBreakGlyphs)); - EXPECT_EQ(4u, result->OffsetForPosition(result->PositionForOffset(4), partial, - DontBreakGlyphs)); - EXPECT_EQ(5u, result->OffsetForPosition(result->PositionForOffset(5), partial, - DontBreakGlyphs)); - EXPECT_EQ(6u, result->OffsetForPosition(result->PositionForOffset(6), partial, - DontBreakGlyphs)); + IncludePartialGlyphsOption partial = GetParam(); + EXPECT_EQ(0u, result->OffsetForPosition(result->PositionForOffset(0), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(1u, result->OffsetForPosition(result->PositionForOffset(1), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(2u, result->OffsetForPosition(result->PositionForOffset(2), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(3u, result->OffsetForPosition(result->PositionForOffset(3), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(4u, result->OffsetForPosition(result->PositionForOffset(4), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(5u, result->OffsetForPosition(result->PositionForOffset(5), string, + partial, DontBreakGlyphs)); + EXPECT_EQ(6u, result->OffsetForPosition(result->PositionForOffset(6), string, + partial, DontBreakGlyphs)); } TEST_F(HarfBuzzShaperTest, CachedOffsetPositionMappingForOffsetLatin) {
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc b/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc index 74ba40b..54dc197 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc +++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc
@@ -369,10 +369,12 @@ return self_byte_size; } -CharacterRange ShapeResult::GetCharacterRange(unsigned from, +CharacterRange ShapeResult::GetCharacterRange(const StringView& text, + unsigned from, unsigned to) const { - return ShapeResultBuffer::GetCharacterRange(this, Direction(), Width(), from, - to); + DCHECK_EQ(NumCharacters(), text.length()); + return ShapeResultBuffer::GetCharacterRange(this, text, Direction(), Width(), + from, to); } unsigned ShapeResult::StartIndexForResult() const { @@ -537,9 +539,12 @@ return result.right_character_index; } -unsigned ShapeResult::OffsetForHitTest( +unsigned ShapeResult::CaretOffsetForHitTest( float x, + const StringView& text, BreakGlyphsOption break_glyphs_option) const { + DCHECK_EQ(NumCharacters(), text.length()); + GlyphIndexResult result; OffsetForPosition(x, break_glyphs_option, &result); @@ -603,6 +608,14 @@ return offset_x; } +float ShapeResult::CaretPositionForOffset( + unsigned offset, + const StringView& text, + AdjustMidCluster adjust_mid_cluster) const { + DCHECK_EQ(NumCharacters(), text.length()); + return PositionForOffset(offset, adjust_mid_cluster); +} + void ShapeResult::FallbackFonts( HashSet<const SimpleFontData*>* fallback) const { DCHECK(fallback);
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result.h b/third_party/blink/renderer/platform/fonts/shaping/shape_result.h index 5ebad974d..b6feaf69 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/shape_result.h +++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result.h
@@ -111,7 +111,9 @@ // even when the result is in vertical flow. const FloatRect& Bounds() const { return glyph_bounding_box_; } unsigned NumCharacters() const { return num_characters_; } - CharacterRange GetCharacterRange(unsigned from, unsigned to) const; + CharacterRange GetCharacterRange(const StringView& text, + unsigned from, + unsigned to) const; // The character start/end index of a range shape result. unsigned StartIndexForResult() const; unsigned EndIndexForResult() const; @@ -145,21 +147,29 @@ // whether |x| is on the left-half or the right-half of the glyph, it // determines the left-boundary or the right-boundary, then computes the // offset from the bidi direction. - unsigned OffsetForHitTest(float x, BreakGlyphsOption) const; + unsigned CaretOffsetForHitTest(float x, + const StringView& text, + BreakGlyphsOption) const; // Returns the offset that can fit to between |x| and the left or the right // edge. The side of the edge is determined by |line_direction|. unsigned OffsetToFit(float x, TextDirection line_direction) const; unsigned OffsetForPosition(float x, + const StringView& text, IncludePartialGlyphsOption include_partial_glyphs, BreakGlyphsOption break_glyphs_option) const { return include_partial_glyphs == OnlyFullGlyphs ? OffsetForPosition(x, break_glyphs_option) - : OffsetForHitTest(x, break_glyphs_option); + : CaretOffsetForHitTest(x, text, break_glyphs_option); } // Returns the position for a given offset, relative to StartIndexForResult. float PositionForOffset(unsigned offset, AdjustMidCluster = AdjustMidCluster::kToEnd) const; + // Similar to |PositionForOffset| with mid-glyph (mid-ligature) support. + float CaretPositionForOffset( + unsigned offset, + const StringView& text, + AdjustMidCluster = AdjustMidCluster::kToEnd) const; LayoutUnit SnappedStartPositionForOffset(unsigned offset) const { return LayoutUnit::FromFloatFloor(PositionForOffset(offset)); }
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result_buffer.cc b/third_party/blink/renderer/platform/fonts/shaping/shape_result_buffer.cc index 04bb7403..5270644 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/shape_result_buffer.cc +++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result_buffer.cc
@@ -13,34 +13,53 @@ namespace blink { +namespace { + +unsigned CharactersInShapeResult( + const Vector<scoped_refptr<const ShapeResult>, 64>& results) { + unsigned num_characters = 0; + for (const scoped_refptr<const ShapeResult>& result : results) + num_characters += result->NumCharacters(); + return num_characters; +} + +} // namespace + // TODO(eae): This is a bit of a hack to allow reuse of the implementation // for both ShapeResultBuffer and single ShapeResult use cases. Ideally the // logic should move into ShapeResult itself and then the ShapeResultBuffer // implementation may wrap that. CharacterRange ShapeResultBuffer::GetCharacterRange( scoped_refptr<const ShapeResult> result, + const StringView& text, TextDirection direction, float total_width, unsigned from, unsigned to) { Vector<scoped_refptr<const ShapeResult>, 64> results; results.push_back(result); - return GetCharacterRangeInternal(results, direction, total_width, from, to); + return GetCharacterRangeInternal(results, text, direction, total_width, from, + to); } -CharacterRange ShapeResultBuffer::GetCharacterRange(float total_width, +CharacterRange ShapeResultBuffer::GetCharacterRange(const StringView& text, TextDirection direction, + float total_width, unsigned from, unsigned to) const { - return GetCharacterRangeInternal(results_, direction, total_width, from, to); + return GetCharacterRangeInternal(results_, text, direction, total_width, from, + to); } CharacterRange ShapeResultBuffer::GetCharacterRangeInternal( const Vector<scoped_refptr<const ShapeResult>, 64>& results, + const StringView& text, TextDirection direction, float total_width, unsigned absolute_from, unsigned absolute_to) { + DCHECK_EQ(CharactersInShapeResult(results), text.length()); + float current_x = 0; float from_x = 0; float to_x = 0; @@ -183,6 +202,7 @@ float target_x, IncludePartialGlyphsOption partial_glyphs, BreakGlyphsOption break_glyphs) const { + StringView text = run.ToStringView(); unsigned total_offset; if (run.Rtl()) { total_offset = run.length(); @@ -193,22 +213,26 @@ total_offset -= word_result->NumCharacters(); if (target_x >= 0 && target_x <= word_result->Width()) { int offset_for_word = word_result->OffsetForPosition( - target_x, partial_glyphs, break_glyphs); + target_x, + StringView(text, total_offset, word_result->NumCharacters()), + partial_glyphs, break_glyphs); return total_offset + offset_for_word; } target_x -= word_result->Width(); } } else { total_offset = 0; - for (const auto& word_result : results_) { + for (const scoped_refptr<const ShapeResult>& word_result : results_) { if (!word_result) continue; int offset_for_word = word_result->OffsetForPosition( - target_x, partial_glyphs, break_glyphs); + target_x, StringView(text, 0, word_result->NumCharacters()), + partial_glyphs, break_glyphs); DCHECK_GE(offset_for_word, 0); total_offset += offset_for_word; if (target_x >= 0 && target_x <= word_result->Width()) return total_offset; + text = StringView(text, word_result->NumCharacters()); target_x -= word_result->Width(); } }
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result_buffer.h b/third_party/blink/renderer/platform/fonts/shaping/shape_result_buffer.h index ace7dcd..d4b73fd5 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/shape_result_buffer.h +++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result_buffer.h
@@ -37,14 +37,16 @@ float target_x, IncludePartialGlyphsOption, BreakGlyphsOption) const; - CharacterRange GetCharacterRange(float total_width, + CharacterRange GetCharacterRange(const StringView& text, TextDirection, + float total_width, unsigned from, unsigned to) const; Vector<CharacterRange> IndividualCharacterRanges(TextDirection, float total_width) const; static CharacterRange GetCharacterRange(scoped_refptr<const ShapeResult>, + const StringView& text, TextDirection, float total_width, unsigned from, @@ -60,6 +62,7 @@ friend class ShapeResultBloberizer; static CharacterRange GetCharacterRangeInternal( const Vector<scoped_refptr<const ShapeResult>, 64>&, + const StringView& text, TextDirection, float total_width, unsigned from,
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shaping_line_breaker.cc b/third_party/blink/renderer/platform/fonts/shaping/shaping_line_breaker.cc index a7cd5af..04da776c 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/shaping_line_breaker.cc +++ b/third_party/blink/renderer/platform/fonts/shaping/shaping_line_breaker.cc
@@ -158,7 +158,8 @@ ShapingLineBreaker::BreakOpportunity ShapingLineBreaker::NextBreakOpportunity( unsigned offset, - unsigned start) const { + unsigned start, + unsigned len) const { if (UNLIKELY(!IsSoftHyphenEnabled())) { const String& text = GetText(); for (;; offset++) { @@ -171,7 +172,7 @@ if (UNLIKELY(hyphenation_)) return Hyphenate(offset, start, false); - return {break_iterator_->NextBreakOpportunity(offset), false}; + return {break_iterator_->NextBreakOpportunity(offset, len), false}; } inline scoped_refptr<ShapeResult> ShapingLineBreaker::Shape(TextDirection direction, @@ -267,8 +268,9 @@ if (is_overflow) { if (options & kNoResultIfOverflow) return nullptr; - break_opportunity = - NextBreakOpportunity(std::max(candidate_break, start + 1), start); + // No need to scan past range_end for a break oppertunity. + break_opportunity = NextBreakOpportunity( + std::max(candidate_break, start + 1), start, range_end); // |range_end| may not be a break opportunity, but this function cannot // measure beyond it. if (break_opportunity.offset >= range_end) {
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shaping_line_breaker.h b/third_party/blink/renderer/platform/fonts/shaping/shaping_line_breaker.h index d06cc93..239a015 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/shaping_line_breaker.h +++ b/third_party/blink/renderer/platform/fonts/shaping/shaping_line_breaker.h
@@ -102,7 +102,9 @@ }; BreakOpportunity PreviousBreakOpportunity(unsigned offset, unsigned start) const; - BreakOpportunity NextBreakOpportunity(unsigned offset, unsigned start) const; + BreakOpportunity NextBreakOpportunity(unsigned offset, + unsigned start, + unsigned len) const; BreakOpportunity Hyphenate(unsigned offset, unsigned start, bool backwards) const;
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shaping_line_breaker_test.cc b/third_party/blink/renderer/platform/fonts/shaping/shaping_line_breaker_test.cc index 16b10a5..bb83a5cf 100644 --- a/third_party/blink/renderer/platform/fonts/shaping/shaping_line_breaker_test.cc +++ b/third_party/blink/renderer/platform/fonts/shaping/shaping_line_breaker_test.cc
@@ -48,7 +48,8 @@ const String& string) { Vector<unsigned> break_positions; for (unsigned i = 0; i <= string.length(); i++) { - unsigned next = breaker.NextBreakOpportunity(i, 0).offset; + unsigned next = + breaker.NextBreakOpportunity(i, 0, string.length()).offset; if (break_positions.IsEmpty() || break_positions.back() != next) break_positions.push_back(next); }
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc index 678a5ed..009b486 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
@@ -280,10 +280,14 @@ } if (resource_provider && resource_provider->IsValid()) { +#if DCHECK_IS_ON() // If resource provider is accelerated, a layer should already exist. - // If not, it could mean that the resource provider was create without - // going through this method, which is bad. - DCHECK(!IsAccelerated() || !!layer_); + // unless this is a canvas in low latency mode. + if (IsAccelerated()) { + DCHECK(!!layer_ || + (resource_host_ && resource_host_->LowLatencyEnabled())); + } +#endif return resource_provider; }
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h index a22973e..60263c7a 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h
@@ -164,6 +164,7 @@ CanvasResourceProvider* GetOrCreateResourceProvider( AccelerationHint = kPreferAcceleration); CanvasResourceProvider* ResourceProvider() const; + void FlushRecording(); private: bool IsHidden() { return is_hidden_; } @@ -172,7 +173,6 @@ void StartRecording(); void SkipQueuedDrawCommands(); - void FlushRecording(); void ReportResourceProviderCreationFailure(); bool ShouldAccelerate(AccelerationHint) const;
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_host.h b/third_party/blink/renderer/platform/graphics/canvas_resource_host.h index 99f178d..6960440 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_host.h +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_host.h
@@ -29,6 +29,7 @@ AccelerationHint hint) = 0; virtual SkFilterQuality FilterQuality() const = 0; + virtual bool LowLatencyEnabled() const { return false; } CanvasResourceProvider* ResourceProvider() const;
diff --git a/third_party/blink/renderer/platform/heap/thread_state.h b/third_party/blink/renderer/platform/heap/thread_state.h index e8dd2d98d..209b26b0 100644 --- a/third_party/blink/renderer/platform/heap/thread_state.h +++ b/third_party/blink/renderer/platform/heap/thread_state.h
@@ -572,6 +572,9 @@ // Implementation for WebRAILModeObserver void OnRAILModeChanged(v8::RAILMode new_mode) override { should_optimize_for_load_time_ = new_mode == v8::RAILMode::PERFORMANCE_LOAD; + if (should_optimize_for_load_time_ && IsIncrementalMarking() && + GetGCState() == GCState::kIncrementalMarkingStepScheduled) + ScheduleIncrementalMarkingFinalize(); } private:
diff --git a/third_party/blink/renderer/platform/histogram.h b/third_party/blink/renderer/platform/histogram.h index b380122..e7c7624 100644 --- a/third_party/blink/renderer/platform/histogram.h +++ b/third_party/blink/renderer/platform/histogram.h
@@ -78,11 +78,32 @@ CustomCountHistogram& counter_; }; +class PLATFORM_EXPORT ScopedHighResUsHistogramTimer { + public: + explicit ScopedHighResUsHistogramTimer(CustomCountHistogram& counter) + : start_time_(CurrentTimeTicks()), counter_(counter) {} + + ~ScopedHighResUsHistogramTimer() { + if (TimeTicks::IsHighResolution()) + counter_.CountMicroseconds(CurrentTimeTicks() - start_time_); + } + + private: + TimeTicks start_time_; + CustomCountHistogram& counter_; +}; + #define SCOPED_BLINK_UMA_HISTOGRAM_TIMER_IMPL(name, allow_cross_thread) \ DEFINE_STATIC_LOCAL_IMPL(CustomCountHistogram, scoped_us_counter, \ (name, 0, 10000000, 50), allow_cross_thread); \ ScopedUsHistogramTimer timer(scoped_us_counter); +#define SCOPED_BLINK_UMA_HISTOGRAM_TIMER_HIGHRES_IMPL(name, \ + allow_cross_thread) \ + DEFINE_STATIC_LOCAL_IMPL(CustomCountHistogram, scoped_us_counter, \ + (name, 0, 10000000, 50), allow_cross_thread); \ + ScopedHighResUsHistogramTimer timer(scoped_us_counter); + // Use code like this to record time, in microseconds, to execute a block of // code: // @@ -95,6 +116,10 @@ #define SCOPED_BLINK_UMA_HISTOGRAM_TIMER(name) \ SCOPED_BLINK_UMA_HISTOGRAM_TIMER_IMPL(name, false) +// Only record samples when we have a high resolution timer +#define SCOPED_BLINK_UMA_HISTOGRAM_TIMER_HIGHRES(name) \ + SCOPED_BLINK_UMA_HISTOGRAM_TIMER_HIGHRES_IMPL(name, false) + // Thread-safe variant of SCOPED_BLINK_UMA_HISTOGRAM_TIMER. // Use if the histogram can be accessed by multiple threads. #define SCOPED_BLINK_UMA_HISTOGRAM_TIMER_THREAD_SAFE(name) \
diff --git a/third_party/blink/renderer/platform/histogram_test.cc b/third_party/blink/renderer/platform/histogram_test.cc index ac514eed..7892e35 100644 --- a/third_party/blink/renderer/platform/histogram_test.cc +++ b/third_party/blink/renderer/platform/histogram_test.cc
@@ -23,7 +23,8 @@ }; TEST(ScopedUsHistogramTimerTest, Basic) { - TestCustomCountHistogram scoped_us_counter("test", 0, 10000000, 50); + TestCustomCountHistogram scoped_us_counter("ScopedUsHistogramTimerTest.Basic", + 0, 10000000, 50); { WTF::ScopedMockClock clock; ScopedUsHistogramTimer timer(scoped_us_counter); @@ -33,4 +34,16 @@ EXPECT_EQ(500000, scoped_us_counter.Histogram()->SnapshotSamples()->sum()); } +TEST(ScopedHighResUsHistogramTimerTest, Basic) { + TestCustomCountHistogram scoped_us_counter( + "ScopedHighResUsHistogramTimerTest.Basic", 0, 10000000, 50); + { + WTF::ScopedMockClock clock; + ScopedHighResUsHistogramTimer timer(scoped_us_counter); + clock.Advance(TimeDelta::FromMilliseconds(500)); + } + int64_t expected = TimeTicks::IsHighResolution() ? 500000 : 0; + EXPECT_EQ(expected, scoped_us_counter.Histogram()->SnapshotSamples()->sum()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 234112b..300e26b3 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1078,10 +1078,6 @@ status: "stable", }, { - name: "RequestIsHistoryNavigation", - status: "stable", - }, - { name: "RequireCSSExtensionForFile", status: "stable", },
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc index a6687c4..f9fa968 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
@@ -26,6 +26,7 @@ namespace scheduler { using base::sequence_manager::TaskQueue; +using QueueTraits = MainThreadTaskQueue::QueueTraits; namespace { @@ -181,7 +182,10 @@ this, &tracing_controller_, KeepActiveStateToString), - weak_factory_(this) {} + weak_factory_(this) { + frame_task_queue_controller_.reset( + new FrameTaskQueueController(main_thread_scheduler_, this, this)); +} FrameSchedulerImpl::FrameSchedulerImpl() : FrameSchedulerImpl(nullptr, @@ -193,8 +197,8 @@ namespace { void CleanUpQueue(MainThreadTaskQueue* queue) { - if (!queue) - return; + DCHECK(queue); + queue->DetachFromMainThreadScheduler(); queue->DetachFromFrameScheduler(); queue->SetBlameContext(nullptr); @@ -206,17 +210,13 @@ FrameSchedulerImpl::~FrameSchedulerImpl() { weak_factory_.InvalidateWeakPtrs(); - RemoveThrottleableQueueFromBackgroundCPUTimeBudgetPool(); - - CleanUpQueue(loading_task_queue_.get()); - CleanUpQueue(loading_control_task_queue_.get()); - CleanUpQueue(throttleable_task_queue_.get()); - CleanUpQueue(deferrable_task_queue_.get()); - CleanUpQueue(pausable_task_queue_.get()); - CleanUpQueue(unpausable_task_queue_.get()); - - for (const auto& pair : resource_loading_task_queues_) { - CleanUpQueue(pair.key.get()); + for (const auto& task_queue_and_voter : + frame_task_queue_controller_->GetAllTaskQueuesAndVoters()) { + if (task_queue_and_voter.first->CanBeThrottled()) { + RemoveThrottleableQueueFromBackgroundCPUTimeBudgetPool( + task_queue_and_voter.first); + } + CleanUpQueue(task_queue_and_voter.first); } if (parent_page_scheduler_) { @@ -228,15 +228,21 @@ } void FrameSchedulerImpl::DetachFromPageScheduler() { - RemoveThrottleableQueueFromBackgroundCPUTimeBudgetPool(); + for (const auto& task_queue_and_voter : + frame_task_queue_controller_->GetAllTaskQueuesAndVoters()) { + if (task_queue_and_voter.first->CanBeThrottled()) { + RemoveThrottleableQueueFromBackgroundCPUTimeBudgetPool( + task_queue_and_voter.first); + } + } parent_page_scheduler_ = nullptr; } -void FrameSchedulerImpl:: - RemoveThrottleableQueueFromBackgroundCPUTimeBudgetPool() { - if (!throttleable_task_queue_) - return; +void FrameSchedulerImpl::RemoveThrottleableQueueFromBackgroundCPUTimeBudgetPool( + MainThreadTaskQueue* task_queue) { + DCHECK(task_queue); + DCHECK(task_queue->CanBeThrottled()); if (!parent_page_scheduler_) return; @@ -248,8 +254,7 @@ return; time_budget_pool->RemoveQueue( - main_thread_scheduler_->tick_clock()->NowTicks(), - throttleable_task_queue_.get()); + main_thread_scheduler_->tick_clock()->NowTicks(), task_queue); } void FrameSchedulerImpl::SetFrameVisible(bool frame_visible) { @@ -300,18 +305,33 @@ return frame_type_; } -scoped_refptr<base::SingleThreadTaskRunner> FrameSchedulerImpl::GetTaskRunner( +// static +void FrameSchedulerImpl::InitializeTaskTypeQueueTraitsMap( + FrameTaskTypeToQueueTraitsArray& frame_task_types_to_queue_traits) { + DCHECK_EQ(frame_task_types_to_queue_traits.size(), + static_cast<size_t>(TaskType::kCount)); + for (size_t i = 0; i < static_cast<size_t>(TaskType::kCount); i++) { + base::Optional<QueueTraits> queue_traits = + CreateQueueTraitsForTaskType(static_cast<TaskType>(i)); + // TODO(shaseley): Override throttleable and freezable queue traits from + // finch. + frame_task_types_to_queue_traits[i] = queue_traits; + } +} + +// static +base::Optional<QueueTraits> FrameSchedulerImpl::CreateQueueTraitsForTaskType( TaskType type) { // TODO(haraken): Optimize the mapping from TaskTypes to task runners. switch (type) { case TaskType::kJavascriptTimer: - return ThrottleableTaskQueue()->CreateTaskRunner(type); + return ThrottleableTaskQueueTraits(); case TaskType::kInternalLoading: case TaskType::kNetworking: case TaskType::kNetworkingWithURLLoaderAnnotation: - return LoadingTaskQueue()->CreateTaskRunner(type); case TaskType::kNetworkingControl: - return LoadingControlTaskQueue()->CreateTaskRunner(type); + // Loading task queues are handled separately. + return base::nullopt; // Throttling following tasks may break existing web pages, so tentatively // these are unthrottled. // TODO(nhiroki): Throttle them again after we're convinced that it's safe @@ -335,7 +355,7 @@ case TaskType::kInternalDefault: case TaskType::kMiscPlatformAPI: // TODO(altimin): Move appropriate tasks to throttleable task queue. - return DeferrableTaskQueue()->CreateTaskRunner(type); + return DeferrableTaskQueueTraits(); // PostedMessage can be used for navigation, so we shouldn't defer it // when expecting a user gesture. case TaskType::kPostedMessage: @@ -352,7 +372,7 @@ case TaskType::kInternalMediaRealTime: case TaskType::kInternalUserInteraction: case TaskType::kInternalIntersectionObserver: - return PausableTaskQueue()->CreateTaskRunner(type); + return PausableTaskQueueTraits(); case TaskType::kInternalIPC: // The TaskType of Inspector tasks needs to be unpausable because they need // to run even on a paused page. @@ -361,7 +381,7 @@ // unthrottled and undeferred) not to prevent service workers that may // control browser navigation on multiple tabs. case TaskType::kInternalWorker: - return UnpausableTaskQueue()->CreateTaskRunner(type); + return UnpausableTaskQueueTraits(); case TaskType::kDeprecatedNone: case TaskType::kMainThreadTaskQueueV8: case TaskType::kMainThreadTaskQueueCompositor: @@ -376,35 +396,46 @@ case TaskType::kWorkerThreadTaskQueueV8: case TaskType::kWorkerThreadTaskQueueCompositor: case TaskType::kCount: - NOTREACHED(); - break; + // Not a valid frame-level TaskType. + return base::nullopt; } - NOTREACHED(); - return nullptr; + // This method is called for all values between 0 and kCount. TaskType, + // however, has numbering gaps, so even though all enumerated TaskTypes are + // handled in the switch and return a value, we fall through for some values + // of |type|. + return base::nullopt; } -std::pair<scoped_refptr<MainThreadTaskQueue>, - std::unique_ptr<TaskQueue::QueueEnabledVoter>> -FrameSchedulerImpl::CreateNewLoadingTaskQueue() { - // TODO(panicker): Avoid adding this queue in RS task_runners_. - scoped_refptr<MainThreadTaskQueue> loading_task_queue = - main_thread_scheduler_->NewLoadingTaskQueue( - MainThreadTaskQueue::QueueType::kFrameLoading, this); - loading_task_queue->SetBlameContext(blame_context_); - std::unique_ptr<TaskQueue::QueueEnabledVoter> voter = - loading_task_queue->CreateQueueEnabledVoter(); - voter->SetQueueEnabled(!frame_paused_); - return std::make_pair(loading_task_queue, std::move(voter)); +scoped_refptr<base::SingleThreadTaskRunner> FrameSchedulerImpl::GetTaskRunner( + TaskType type) { + scoped_refptr<MainThreadTaskQueue> task_queue = GetTaskQueue(type); + DCHECK(task_queue); + return task_queue->CreateTaskRunner(type); } -scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::LoadingTaskQueue() { - DCHECK(parent_page_scheduler_); - if (!loading_task_queue_) { - auto queue_voter_pair = CreateNewLoadingTaskQueue(); - loading_task_queue_ = queue_voter_pair.first; - loading_queue_enabled_voter_ = std::move(queue_voter_pair.second); +scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::GetTaskQueue( + TaskType type) { + switch (type) { + case TaskType::kInternalLoading: + case TaskType::kNetworking: + case TaskType::kNetworkingWithURLLoaderAnnotation: + return frame_task_queue_controller_->LoadingTaskQueue(); + case TaskType::kNetworkingControl: + return frame_task_queue_controller_->LoadingControlTaskQueue(); + default: + // Non-loading task queue. + DCHECK_LT(static_cast<size_t>(type), + main_thread_scheduler_->scheduling_settings() + .frame_task_types_to_queue_traits.size()); + base::Optional<QueueTraits> queue_traits = + main_thread_scheduler_->scheduling_settings() + .frame_task_types_to_queue_traits[static_cast<size_t>(type)]; + // We don't have a QueueTraits mapping for |task_type| if it is not a + // frame-level task type. + DCHECK(queue_traits); + return frame_task_queue_controller_->NonLoadingTaskQueue( + queue_traits.value()); } - return loading_task_queue_; } std::unique_ptr<WebResourceLoadingTaskRunnerHandle> @@ -416,144 +447,50 @@ FrameSchedulerImpl::CreateResourceLoadingTaskRunnerHandleImpl() { if (main_thread_scheduler_->scheduling_settings() .use_resource_fetch_priority) { - auto queue_voter_pair = CreateNewLoadingTaskQueue(); - - resource_loading_task_queues_.insert( - queue_voter_pair.first, ResourceLoadingTaskQueueMetadata( - queue_voter_pair.first->GetQueuePriority(), - std::move(queue_voter_pair.second))); - - return ResourceLoadingTaskRunnerHandleImpl::WrapTaskRunner( - queue_voter_pair.first); + scoped_refptr<MainThreadTaskQueue> task_queue = + frame_task_queue_controller_->NewResourceLoadingTaskQueue(); + resource_loading_task_queue_priorities_.insert( + task_queue, task_queue->GetQueuePriority()); + return ResourceLoadingTaskRunnerHandleImpl::WrapTaskRunner(task_queue); } - // Make sure the loading task queue exists. - LoadingTaskQueue(); return ResourceLoadingTaskRunnerHandleImpl::WrapTaskRunner( - loading_task_queue_); + frame_task_queue_controller_->LoadingTaskQueue()); } void FrameSchedulerImpl::DidChangeResourceLoadingPriority( scoped_refptr<MainThreadTaskQueue> task_queue, net::RequestPriority priority) { // This check is done since in some cases (when kUseResourceFetchPriority - // feature isn't enabled) we use |loading_task_queue_| for resource loading + // feature isn't enabled) we use the loading task queue for resource loading // and the priority of this queue shouldn't be affected by resource // priorities. - auto queue_metadata_pair = resource_loading_task_queues_.find(task_queue); - if (queue_metadata_pair != resource_loading_task_queues_.end()) { - queue_metadata_pair->value.priority = - main_thread_scheduler_->scheduling_settings() - .net_to_blink_priority[priority]; - UpdateQueuePolicy(task_queue.get(), queue_metadata_pair->value.voter.get()); + auto queue_priority_pair = + resource_loading_task_queue_priorities_.find(task_queue); + if (queue_priority_pair != resource_loading_task_queue_priorities_.end()) { + queue_priority_pair->value = main_thread_scheduler_->scheduling_settings() + .net_to_blink_priority[priority]; + auto* voter = + frame_task_queue_controller_->GetQueueEnabledVoter(task_queue); + UpdateQueuePolicy(task_queue.get(), voter); } } void FrameSchedulerImpl::OnShutdownResourceLoadingTaskQueue( scoped_refptr<MainThreadTaskQueue> task_queue) { // This check is done since in some cases (when kUseResourceFetchPriority - // feature isn't enabled) we use |loading_task_queue_| for resource loading, + // feature isn't enabled) we use the loading task queue for resource loading, // and the lifetime of this queue isn't bound to one resource. - auto iter = resource_loading_task_queues_.find(task_queue); - if (iter != resource_loading_task_queues_.end()) { - resource_loading_task_queues_.erase(iter); + auto iter = resource_loading_task_queue_priorities_.find(task_queue); + if (iter != resource_loading_task_queue_priorities_.end()) { + resource_loading_task_queue_priorities_.erase(iter); + bool removed = frame_task_queue_controller_->RemoveResourceLoadingTaskQueue( + task_queue); + DCHECK(removed); CleanUpQueue(task_queue.get()); } } -scoped_refptr<MainThreadTaskQueue> -FrameSchedulerImpl::LoadingControlTaskQueue() { - DCHECK(parent_page_scheduler_); - if (!loading_control_task_queue_) { - loading_control_task_queue_ = main_thread_scheduler_->NewLoadingTaskQueue( - MainThreadTaskQueue::QueueType::kFrameLoadingControl, this); - loading_control_task_queue_->SetBlameContext(blame_context_); - loading_control_queue_enabled_voter_ = - loading_control_task_queue_->CreateQueueEnabledVoter(); - loading_control_queue_enabled_voter_->SetQueueEnabled(!frame_paused_); - } - return loading_control_task_queue_; -} - -scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::ThrottleableTaskQueue() { - DCHECK(parent_page_scheduler_); - if (!throttleable_task_queue_) { - // TODO(panicker): Avoid adding this queue in RS task_runners_. - throttleable_task_queue_ = main_thread_scheduler_->NewTaskQueue( - MainThreadTaskQueue::QueueCreationParams( - MainThreadTaskQueue::QueueType::kFrameThrottleable) - .SetCanBeThrottled(true) - .SetCanBeFrozen(true) - .SetFreezeWhenKeepActive(true) - .SetCanBeDeferred(true) - .SetCanBePaused(true) - .SetFrameScheduler(this)); - throttleable_task_queue_->SetBlameContext(blame_context_); - throttleable_queue_enabled_voter_ = - throttleable_task_queue_->CreateQueueEnabledVoter(); - throttleable_queue_enabled_voter_->SetQueueEnabled(!frame_paused_); - - CPUTimeBudgetPool* time_budget_pool = - parent_page_scheduler_->BackgroundCPUTimeBudgetPool(); - if (time_budget_pool) { - time_budget_pool->AddQueue( - main_thread_scheduler_->tick_clock()->NowTicks(), - throttleable_task_queue_.get()); - } - UpdateThrottling(); - } - return throttleable_task_queue_; -} - -scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::DeferrableTaskQueue() { - DCHECK(parent_page_scheduler_); - if (!deferrable_task_queue_) { - deferrable_task_queue_ = main_thread_scheduler_->NewTaskQueue( - MainThreadTaskQueue::QueueCreationParams( - MainThreadTaskQueue::QueueType::kFrameDeferrable) - .SetCanBeDeferred(true) - .SetCanBeFrozen( - RuntimeEnabledFeatures::StopNonTimersInBackgroundEnabled()) - .SetCanBePaused(true) - .SetFrameScheduler(this)); - deferrable_task_queue_->SetBlameContext(blame_context_); - deferrable_queue_enabled_voter_ = - deferrable_task_queue_->CreateQueueEnabledVoter(); - deferrable_queue_enabled_voter_->SetQueueEnabled(!frame_paused_); - } - return deferrable_task_queue_; -} - -scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::PausableTaskQueue() { - DCHECK(parent_page_scheduler_); - if (!pausable_task_queue_) { - pausable_task_queue_ = main_thread_scheduler_->NewTaskQueue( - MainThreadTaskQueue::QueueCreationParams( - MainThreadTaskQueue::QueueType::kFramePausable) - .SetCanBeFrozen( - RuntimeEnabledFeatures::StopNonTimersInBackgroundEnabled()) - .SetCanBePaused(true) - .SetFrameScheduler(this)); - pausable_task_queue_->SetBlameContext(blame_context_); - pausable_queue_enabled_voter_ = - pausable_task_queue_->CreateQueueEnabledVoter(); - pausable_queue_enabled_voter_->SetQueueEnabled(!frame_paused_); - } - return pausable_task_queue_; -} - -scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::UnpausableTaskQueue() { - DCHECK(parent_page_scheduler_); - if (!unpausable_task_queue_) { - unpausable_task_queue_ = main_thread_scheduler_->NewTaskQueue( - MainThreadTaskQueue::QueueCreationParams( - MainThreadTaskQueue::QueueType::kFrameUnpausable) - .SetFrameScheduler(this)); - unpausable_task_queue_->SetBlameContext(blame_context_); - } - return unpausable_task_queue_; -} - scoped_refptr<base::SingleThreadTaskRunner> FrameSchedulerImpl::ControlTaskRunner() { DCHECK(parent_page_scheduler_); @@ -609,36 +546,10 @@ state->SetBoolean( "disable_background_timer_throttling", !RuntimeEnabledFeatures::TimerThrottlingForBackgroundTabsEnabled()); - if (loading_task_queue_) { - state->SetString("loading_task_queue", - PointerToString(loading_task_queue_.get())); - } - if (loading_control_task_queue_) { - state->SetString("loading_control_task_queue", - PointerToString(loading_control_task_queue_.get())); - } - if (throttleable_task_queue_) { - state->SetString("throttleable_task_queue", - PointerToString(throttleable_task_queue_.get())); - } - if (deferrable_task_queue_) { - state->SetString("deferrable_task_queue", - PointerToString(deferrable_task_queue_.get())); - } - if (pausable_task_queue_) { - state->SetString("pausable_task_queue", - PointerToString(pausable_task_queue_.get())); - } - if (unpausable_task_queue_) { - state->SetString("unpausable_task_queue", - PointerToString(unpausable_task_queue_.get())); - } - state->BeginArray("resource_loading_task_queues"); - for (const auto& queue : resource_loading_task_queues_) { - state->AppendString(PointerToString(queue.key.get())); - } - state->EndArray(); + state->BeginDictionary("frame_task_queue_controller"); + frame_task_queue_controller_->AsValueInto(state); + state->EndDictionary(); if (blame_context_) { state->BeginDictionary("blame_context"); @@ -685,18 +596,9 @@ void FrameSchedulerImpl::UpdatePolicy() { // Per-frame (stoppable) task queues will be frozen after 5mins in // background. They will be resumed when the page is visible. - UpdateQueuePolicy(throttleable_task_queue_, - throttleable_queue_enabled_voter_.get()); - UpdateQueuePolicy(loading_task_queue_, loading_queue_enabled_voter_.get()); - UpdateQueuePolicy(loading_control_task_queue_, - loading_control_queue_enabled_voter_.get()); - UpdateQueuePolicy(deferrable_task_queue_, - deferrable_queue_enabled_voter_.get()); - UpdateQueuePolicy(pausable_task_queue_, pausable_queue_enabled_voter_.get()); - UpdateQueuePolicy(unpausable_task_queue_, nullptr); - - for (const auto& pair : resource_loading_task_queues_) { - UpdateQueuePolicy(pair.key, pair.value.voter.get()); + for (const auto& task_queue_and_voter : + frame_task_queue_controller_->GetAllTaskQueuesAndVoters()) { + UpdateQueuePolicy(task_queue_and_voter.first, task_queue_and_voter.second); } UpdateThrottling(); @@ -707,8 +609,7 @@ void FrameSchedulerImpl::UpdateQueuePolicy( const scoped_refptr<MainThreadTaskQueue>& queue, TaskQueue::QueueEnabledVoter* voter) { - if (!queue) - return; + DCHECK(queue); UpdatePriority(queue.get()); if (!voter) return; @@ -767,23 +668,29 @@ } void FrameSchedulerImpl::UpdateThrottling() { - // Before we initialize a trottleable task queue, |task_queue_throttled_| - // stays false and this function ensures it indicates whether are we holding - // a queue reference for throttler or not. - // Don't modify that value neither amend the reference counter anywhere else. - if (!throttleable_task_queue_) - return; + // |task_queue_throttled_| is updated regardless of whether any throttleable + // task queues exist so that the ref count for new queues can be initialized + // independently. |task_queue_throttled_| should not be change elsewhere, and + // neither should the ref counts, except for where new task queues are + // initialized. bool should_throttle = ShouldThrottleTimers(); if (task_queue_throttled_ == should_throttle) return; task_queue_throttled_ = should_throttle; - if (should_throttle) { - main_thread_scheduler_->task_queue_throttler()->IncreaseThrottleRefCount( - throttleable_task_queue_.get()); - } else { - main_thread_scheduler_->task_queue_throttler()->DecreaseThrottleRefCount( - throttleable_task_queue_.get()); + // TODO(altimin): UpdateQueuePolicy already iterates over all task queues + // before calling this. Try to fold this into UpdateQueuePolicy. + for (const auto& task_queue_and_voter : + frame_task_queue_controller_->GetAllTaskQueuesAndVoters()) { + if (!task_queue_and_voter.first->CanBeThrottled()) + continue; + if (should_throttle) { + main_thread_scheduler_->task_queue_throttler()->IncreaseThrottleRefCount( + task_queue_and_voter.first); + } else { + main_thread_scheduler_->task_queue_throttler()->DecreaseThrottleRefCount( + task_queue_and_voter.first); + } } } @@ -800,10 +707,10 @@ // Checks the task queue is associated with this frame scheduler. DCHECK_EQ(frame_scheduler, this); - auto queue_metadata_pair = - resource_loading_task_queues_.find(base::WrapRefCounted(task_queue)); - if (queue_metadata_pair != resource_loading_task_queues_.end()) { - return queue_metadata_pair->value.priority; + auto queue_priority_pair = resource_loading_task_queue_priorities_.find( + base::WrapRefCounted(task_queue)); + if (queue_priority_pair != resource_loading_task_queue_priorities_.end()) { + return queue_priority_pair->value; } base::Optional<TaskQueue::QueuePriority> fixed_priority = @@ -919,5 +826,61 @@ return delegate_->GetUkmSourceId(); } +void FrameSchedulerImpl::OnTaskQueueCreated( + MainThreadTaskQueue* task_queue, + base::sequence_manager::TaskQueue::QueueEnabledVoter* voter) { + DCHECK(parent_page_scheduler_); + + task_queue->SetBlameContext(blame_context_); + if (voter) + voter->SetQueueEnabled(!frame_paused_); + if (task_queue->CanBeThrottled()) { + CPUTimeBudgetPool* time_budget_pool = + parent_page_scheduler_->BackgroundCPUTimeBudgetPool(); + if (time_budget_pool) { + time_budget_pool->AddQueue( + main_thread_scheduler_->tick_clock()->NowTicks(), task_queue); + } + if (task_queue_throttled_) { + main_thread_scheduler_->task_queue_throttler()->IncreaseThrottleRefCount( + task_queue); + } + } +} + +// static +MainThreadTaskQueue::QueueTraits +FrameSchedulerImpl::ThrottleableTaskQueueTraits() { + return QueueTraits() + .SetCanBeThrottled(true) + .SetCanBeFrozen(true) + .SetCanBeDeferred(true) + .SetCanBePaused(true); +} + +// static +MainThreadTaskQueue::QueueTraits +FrameSchedulerImpl::DeferrableTaskQueueTraits() { + return QueueTraits() + .SetCanBeDeferred(true) + .SetCanBeFrozen( + RuntimeEnabledFeatures::StopNonTimersInBackgroundEnabled()) + .SetCanBePaused(true); +} + +// static +MainThreadTaskQueue::QueueTraits FrameSchedulerImpl::PausableTaskQueueTraits() { + return QueueTraits() + .SetCanBeFrozen( + RuntimeEnabledFeatures::StopNonTimersInBackgroundEnabled()) + .SetCanBePaused(true); +} + +// static +MainThreadTaskQueue::QueueTraits +FrameSchedulerImpl::UnpausableTaskQueueTraits() { + return QueueTraits(); +} + } // namespace scheduler } // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h index bed1670..35f53fb 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h
@@ -5,19 +5,24 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_MAIN_THREAD_FRAME_SCHEDULER_IMPL_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_MAIN_THREAD_FRAME_SCHEDULER_IMPL_H_ +#include <array> #include <memory> #include <utility> #include "base/macros.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" +#include "base/optional.h" #include "base/single_thread_task_runner.h" #include "base/task/sequence_manager/task_queue.h" #include "base/trace_event/trace_event.h" #include "net/base/request_priority.h" #include "services/metrics/public/cpp/ukm_source_id.h" +#include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/frame_origin_type.h" +#include "third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h" +#include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/page_visibility_state.h" #include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h" #include "third_party/blink/renderer/platform/scheduler/util/tracing_helper.h" @@ -58,7 +63,8 @@ class PageSchedulerImplTest; } -class PLATFORM_EXPORT FrameSchedulerImpl : public FrameScheduler { +class PLATFORM_EXPORT FrameSchedulerImpl : public FrameScheduler, + FrameTaskQueueController::Delegate { public: static std::unique_ptr<FrameSchedulerImpl> Create( PageSchedulerImpl* page_scheduler, @@ -129,6 +135,21 @@ ukm::UkmRecorder* GetUkmRecorder(); ukm::SourceId GetUkmSourceId(); + // FrameTaskQueueController::Delegate implementation. + void OnTaskQueueCreated( + MainThreadTaskQueue*, + base::sequence_manager::TaskQueue::QueueEnabledVoter*) override; + + using FrameTaskTypeToQueueTraitsArray = + std::array<base::Optional<MainThreadTaskQueue::QueueTraits>, + static_cast<size_t>(TaskType::kCount)>; + + // Initializes the mapping from TaskType to QueueTraits for frame-level tasks. + // We control the policy and initialize this, but the map is stored with main + // thread scheduling settings to avoid redundancy. + static void InitializeTaskTypeQueueTraitsMap( + FrameTaskTypeToQueueTraitsArray&); + protected: FrameSchedulerImpl(MainThreadSchedulerImpl* main_thread_scheduler, PageSchedulerImpl* parent_page_scheduler, @@ -147,6 +168,8 @@ scoped_refptr<MainThreadTaskQueue> task_queue, net::RequestPriority priority); + scoped_refptr<MainThreadTaskQueue> GetTaskQueue(TaskType); + private: friend class PageSchedulerImpl; friend class main_thread_scheduler_impl_unittest::MainThreadSchedulerImplTest; @@ -182,21 +205,9 @@ DISALLOW_COPY_AND_ASSIGN(PauseSubresourceLoadingHandleImpl); }; - struct ResourceLoadingTaskQueueMetadata { - ResourceLoadingTaskQueueMetadata(){}; - - ResourceLoadingTaskQueueMetadata( - base::sequence_manager::TaskQueue::QueuePriority queue_priority, - std::unique_ptr<base::sequence_manager::TaskQueue::QueueEnabledVoter> - queue_voter) - : priority(queue_priority), voter(std::move(queue_voter)) {} - - base::sequence_manager::TaskQueue::QueuePriority priority; - std::unique_ptr<base::sequence_manager::TaskQueue::QueueEnabledVoter> voter; - }; - void DetachFromPageScheduler(); - void RemoveThrottleableQueueFromBackgroundCPUTimeBudgetPool(); + void RemoveThrottleableQueueFromBackgroundCPUTimeBudgetPool( + MainThreadTaskQueue*); void ApplyPolicyToThrottleableQueue(); bool ShouldThrottleTimers() const; SchedulingLifecycleState CalculateLifecycleState( @@ -215,46 +226,35 @@ std::unique_ptr<ResourceLoadingTaskRunnerHandleImpl> CreateResourceLoadingTaskRunnerHandleImpl(); - std::pair< - scoped_refptr<MainThreadTaskQueue>, - std::unique_ptr<base::sequence_manager::TaskQueue::QueueEnabledVoter>> - CreateNewLoadingTaskQueue(); + FrameTaskQueueController* FrameTaskQueueControllerForTest() { + return frame_task_queue_controller_.get(); + } - scoped_refptr<MainThreadTaskQueue> LoadingTaskQueue(); - scoped_refptr<MainThreadTaskQueue> LoadingControlTaskQueue(); - scoped_refptr<MainThreadTaskQueue> ThrottleableTaskQueue(); - scoped_refptr<MainThreadTaskQueue> DeferrableTaskQueue(); - scoped_refptr<MainThreadTaskQueue> PausableTaskQueue(); - scoped_refptr<MainThreadTaskQueue> UnpausableTaskQueue(); + // Create the QueueTraits for a specific TaskType. This returns base::nullopt + // for loading tasks and non-frame-level tasks. + static base::Optional<MainThreadTaskQueue::QueueTraits> + CreateQueueTraitsForTaskType(TaskType); + + // Create QueueTraits for the default (non-finch) task queues. + static MainThreadTaskQueue::QueueTraits ThrottleableTaskQueueTraits(); + static MainThreadTaskQueue::QueueTraits DeferrableTaskQueueTraits(); + static MainThreadTaskQueue::QueueTraits PausableTaskQueueTraits(); + static MainThreadTaskQueue::QueueTraits UnpausableTaskQueueTraits(); const FrameScheduler::FrameType frame_type_; bool is_ad_frame_; TraceableVariableController tracing_controller_; - scoped_refptr<MainThreadTaskQueue> loading_task_queue_; - scoped_refptr<MainThreadTaskQueue> loading_control_task_queue_; - scoped_refptr<MainThreadTaskQueue> throttleable_task_queue_; - scoped_refptr<MainThreadTaskQueue> deferrable_task_queue_; - scoped_refptr<MainThreadTaskQueue> pausable_task_queue_; - scoped_refptr<MainThreadTaskQueue> unpausable_task_queue_; - std::unique_ptr<base::sequence_manager::TaskQueue::QueueEnabledVoter> - loading_queue_enabled_voter_; - std::unique_ptr<base::sequence_manager::TaskQueue::QueueEnabledVoter> - loading_control_queue_enabled_voter_; - std::unique_ptr<base::sequence_manager::TaskQueue::QueueEnabledVoter> - throttleable_queue_enabled_voter_; - std::unique_ptr<base::sequence_manager::TaskQueue::QueueEnabledVoter> - deferrable_queue_enabled_voter_; - std::unique_ptr<base::sequence_manager::TaskQueue::QueueEnabledVoter> - pausable_queue_enabled_voter_; + std::unique_ptr<FrameTaskQueueController> frame_task_queue_controller_; - using ResourceLoadingTaskQueueMetadataMap = + using ResourceLoadingTaskQueuePriorityMap = WTF::HashMap<scoped_refptr<MainThreadTaskQueue>, - ResourceLoadingTaskQueueMetadata>; + base::sequence_manager::TaskQueue::QueuePriority>; - // Holds queues created by CreateResourceLoadingTaskRunnerHandle. - ResourceLoadingTaskQueueMetadataMap resource_loading_task_queues_; + // Queue to priority map of resource loading task queues created by + // |frame_task_queue_controller_| via CreateResourceLoadingTaskRunnerHandle. + ResourceLoadingTaskQueuePriorityMap resource_loading_task_queue_priorities_; MainThreadSchedulerImpl* main_thread_scheduler_; // NOT OWNED PageSchedulerImpl* parent_page_scheduler_; // NOT OWNED
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc index 06991f23..968a594 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl_unittest.cc
@@ -17,7 +17,9 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/scheduler/child/features.h" +#include "third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h" +#include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/resource_loading_task_runner_handle_impl.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" @@ -70,37 +72,50 @@ protected: scoped_refptr<TaskQueue> throttleable_task_queue() { - return frame_scheduler_->throttleable_task_queue_; + return throttleable_task_queue_; } void LazyInitThrottleableTaskQueue() { EXPECT_FALSE(throttleable_task_queue()); - frame_scheduler_->ThrottleableTaskQueue(); + throttleable_task_queue_ = ThrottleableTaskQueue(); EXPECT_TRUE(throttleable_task_queue()); } + scoped_refptr<MainThreadTaskQueue> NonLoadingTaskQueue( + MainThreadTaskQueue::QueueTraits queue_traits) { + return frame_scheduler_->FrameTaskQueueControllerForTest() + ->NonLoadingTaskQueue(queue_traits); + } + scoped_refptr<TaskQueue> ThrottleableTaskQueue() { - return frame_scheduler_->ThrottleableTaskQueue(); + return NonLoadingTaskQueue( + FrameSchedulerImpl::ThrottleableTaskQueueTraits()); } scoped_refptr<TaskQueue> LoadingTaskQueue() { - return frame_scheduler_->LoadingTaskQueue(); + return frame_scheduler_->FrameTaskQueueControllerForTest() + ->LoadingTaskQueue(); } scoped_refptr<TaskQueue> LoadingControlTaskQueue() { - return frame_scheduler_->LoadingControlTaskQueue(); + return frame_scheduler_->FrameTaskQueueControllerForTest() + ->LoadingControlTaskQueue(); } scoped_refptr<TaskQueue> DeferrableTaskQueue() { - return frame_scheduler_->DeferrableTaskQueue(); + return NonLoadingTaskQueue(FrameSchedulerImpl::DeferrableTaskQueueTraits()); } scoped_refptr<TaskQueue> PausableTaskQueue() { - return frame_scheduler_->PausableTaskQueue(); + return NonLoadingTaskQueue(FrameSchedulerImpl::PausableTaskQueueTraits()); } scoped_refptr<TaskQueue> UnpausableTaskQueue() { - return frame_scheduler_->UnpausableTaskQueue(); + return NonLoadingTaskQueue(FrameSchedulerImpl::UnpausableTaskQueueTraits()); + } + + scoped_refptr<TaskQueue> GetTaskQueue(TaskType type) { + return frame_scheduler_->GetTaskQueue(type); } std::unique_ptr<ResourceLoadingTaskRunnerHandleImpl> @@ -131,6 +146,7 @@ std::unique_ptr<MainThreadSchedulerImpl> scheduler_; std::unique_ptr<PageSchedulerImpl> page_scheduler_; std::unique_ptr<FrameSchedulerImpl> frame_scheduler_; + scoped_refptr<TaskQueue> throttleable_task_queue_; }; namespace { @@ -1490,6 +1506,19 @@ TaskQueue::QueuePriority::kNormalPriority); } +TEST_F(FrameSchedulerImplTest, TaskTypeToTaskQueueMapping) { + // Make sure the queue lookup and task type to queue traits map works as + // expected. This test will fail if these task types are moved to different + // default queues. + EXPECT_EQ(GetTaskQueue(TaskType::kJavascriptTimer), ThrottleableTaskQueue()); + EXPECT_EQ(GetTaskQueue(TaskType::kDatabaseAccess), DeferrableTaskQueue()); + EXPECT_EQ(GetTaskQueue(TaskType::kPostedMessage), PausableTaskQueue()); + EXPECT_EQ(GetTaskQueue(TaskType::kInternalIPC), UnpausableTaskQueue()); + EXPECT_EQ(GetTaskQueue(TaskType::kNetworking), LoadingTaskQueue()); + EXPECT_EQ(GetTaskQueue(TaskType::kNetworkingControl), + LoadingControlTaskQueue()); +} + } // namespace frame_scheduler_impl_unittest } // namespace scheduler } // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc index 5c1a7612..316290c1 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.cc
@@ -10,9 +10,11 @@ #include "base/callback.h" #include "base/logging.h" +#include "base/trace_event/trace_event_argument.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h" +#include "third_party/blink/renderer/platform/scheduler/util/tracing_helper.h" namespace blink { namespace scheduler { @@ -28,7 +30,6 @@ : main_thread_scheduler_impl_(main_thread_scheduler_impl), frame_scheduler_impl_(frame_scheduler_impl), delegate_(delegate) { - DCHECK(main_thread_scheduler_impl_); DCHECK(frame_scheduler_impl_); DCHECK(delegate_); } @@ -36,12 +37,29 @@ FrameTaskQueueController::~FrameTaskQueueController() = default; scoped_refptr<MainThreadTaskQueue> -FrameTaskQueueController::GetNonLoadingTaskQueue( - QueueTraits queue_traits) const { +FrameTaskQueueController::LoadingTaskQueue() { + if (!loading_task_queue_) + CreateLoadingTaskQueue(); + DCHECK(loading_task_queue_); + return loading_task_queue_; +} + +scoped_refptr<MainThreadTaskQueue> +FrameTaskQueueController::LoadingControlTaskQueue() { + if (!loading_control_task_queue_) + CreateLoadingControlTaskQueue(); + DCHECK(loading_control_task_queue_); + return loading_control_task_queue_; +} + +scoped_refptr<MainThreadTaskQueue> +FrameTaskQueueController::NonLoadingTaskQueue( + MainThreadTaskQueue::QueueTraits queue_traits) { + if (!non_loading_task_queues_.Contains(queue_traits.Key())) + CreateNonLoadingTaskQueue(queue_traits); auto it = non_loading_task_queues_.find(queue_traits.Key()); - if (it != non_loading_task_queues_.end()) - return it->value; - return nullptr; + DCHECK(it != non_loading_task_queues_.end()); + return it->value; } const std::vector<FrameTaskQueueController::TaskQueueAndEnabledVoterPair>& @@ -49,26 +67,26 @@ return all_task_queues_and_voters_; } -scoped_refptr<MainThreadTaskQueue> -FrameTaskQueueController::NewLoadingTaskQueue() { +void FrameTaskQueueController::CreateLoadingTaskQueue() { DCHECK(!loading_task_queue_); + // |main_thread_scheduler_impl_| can be null in unit tests. + DCHECK(main_thread_scheduler_impl_); loading_task_queue_ = main_thread_scheduler_impl_->NewLoadingTaskQueue( MainThreadTaskQueue::QueueType::kFrameLoading, frame_scheduler_impl_); TaskQueueCreated(loading_task_queue_); - return loading_task_queue_; } -scoped_refptr<MainThreadTaskQueue> -FrameTaskQueueController::NewLoadingControlTaskQueue() { +void FrameTaskQueueController::CreateLoadingControlTaskQueue() { DCHECK(!loading_control_task_queue_); + // |main_thread_scheduler_impl_| can be null in unit tests. + DCHECK(main_thread_scheduler_impl_); loading_control_task_queue_ = main_thread_scheduler_impl_->NewLoadingTaskQueue( MainThreadTaskQueue::QueueType::kFrameLoadingControl, frame_scheduler_impl_); TaskQueueCreated(loading_control_task_queue_); - return loading_control_task_queue_; } scoped_refptr<MainThreadTaskQueue> @@ -81,9 +99,11 @@ return task_queue; } -scoped_refptr<MainThreadTaskQueue> -FrameTaskQueueController::NewNonLoadingTaskQueue(QueueTraits queue_traits) { - DCHECK(!GetNonLoadingTaskQueue(queue_traits)); +void FrameTaskQueueController::CreateNonLoadingTaskQueue( + QueueTraits queue_traits) { + DCHECK(!non_loading_task_queues_.Contains(queue_traits.Key())); + // |main_thread_scheduler_impl_| can be null in unit tests. + DCHECK(main_thread_scheduler_impl_); scoped_refptr<MainThreadTaskQueue> task_queue = main_thread_scheduler_impl_->NewTaskQueue( @@ -97,7 +117,6 @@ .SetFrameScheduler(frame_scheduler_impl_)); TaskQueueCreated(task_queue); non_loading_task_queues_.insert(queue_traits.Key(), task_queue); - return task_queue; } void FrameTaskQueueController::TaskQueueCreated( @@ -153,6 +172,29 @@ return true; } +void FrameTaskQueueController::AsValueInto( + base::trace_event::TracedValue* state) const { + if (loading_task_queue_) { + state->SetString("loading_task_queue", + PointerToString(loading_task_queue_.get())); + } + if (loading_control_task_queue_) { + state->SetString("loading_control_task_queue", + PointerToString(loading_control_task_queue_.get())); + } + state->BeginArray("non_loading_task_queues"); + for (const auto it : non_loading_task_queues_) { + state->AppendString(PointerToString(it.value.get())); + } + state->EndArray(); + + state->BeginArray("resource_loading_task_queues"); + for (const auto& queue : resource_loading_task_queues_) { + state->AppendString(PointerToString(queue.get())); + } + state->EndArray(); +} + // static MainThreadTaskQueue::QueueType FrameTaskQueueController::QueueTypeFromQueueTraits(QueueTraits queue_traits) {
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h index 356d27a..f9ca60b 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h
@@ -21,6 +21,9 @@ namespace sequence_manager { class TaskQueue; } // namespace sequence_manager +namespace trace_event { +class TracedValue; +} // namespace trace_event } // namespace base namespace blink { @@ -31,9 +34,9 @@ class MainThreadSchedulerImpl; // FrameTaskQueueController creates and manages and FrameSchedulerImpl's task -// queues. It is in charge of maintaining mappings between TaskType and -// QueueTraits and from QueueTraits to MainThreadTaskQueue, for accessing task -// queues and their related voters, and for creating new task queues. +// queues. It is in charge of maintaining mappings between QueueTraits and +// MainThreadTaskQueues for non-loading queues, for accessing task queues and +// their related voters, and for creating new task queues. class PLATFORM_EXPORT FrameTaskQueueController { public: using TaskQueueAndEnabledVoterPair = @@ -60,6 +63,19 @@ Delegate*); ~FrameTaskQueueController(); + // Return the loading task queue and create it if it doesn't exist. + scoped_refptr<MainThreadTaskQueue> LoadingTaskQueue(); + + // Return the loading control task queue and create it if it doesn't exist. + scoped_refptr<MainThreadTaskQueue> LoadingControlTaskQueue(); + + // Return the non-loading task queue associated with the given queue traits, + // and created it if it doesn't exist. + scoped_refptr<MainThreadTaskQueue> NonLoadingTaskQueue( + MainThreadTaskQueue::QueueTraits); + + scoped_refptr<MainThreadTaskQueue> NewResourceLoadingTaskQueue(); + // Get the list of all task queue and voter pairs. const std::vector<TaskQueueAndEnabledVoterPair>& GetAllTaskQueuesAndVoters() const; @@ -69,8 +85,6 @@ base::sequence_manager::TaskQueue::QueueEnabledVoter* GetQueueEnabledVoter( const scoped_refptr<MainThreadTaskQueue>&); - scoped_refptr<MainThreadTaskQueue> NewResourceLoadingTaskQueue(); - // Remove a resource loading task queue that FrameTaskQueueController created, // along with its QueueEnabledVoter, if one exists. Returns true if the task // queue was found and erased and false otherwise. @@ -80,21 +94,17 @@ bool RemoveResourceLoadingTaskQueue( const scoped_refptr<MainThreadTaskQueue>&); + void AsValueInto(base::trace_event::TracedValue* state) const; + private: friend class FrameTaskQueueControllerTest; - scoped_refptr<MainThreadTaskQueue> NewLoadingTaskQueue(); - scoped_refptr<MainThreadTaskQueue> NewLoadingControlTaskQueue(); - scoped_refptr<MainThreadTaskQueue> NewNonLoadingTaskQueue( - MainThreadTaskQueue::QueueTraits); + void CreateLoadingTaskQueue(); + void CreateLoadingControlTaskQueue(); + void CreateNonLoadingTaskQueue(MainThreadTaskQueue::QueueTraits); void TaskQueueCreated(const scoped_refptr<MainThreadTaskQueue>&); - // Returns the unique non-loading task queue for the given QueueTraits, or - // nullptr if one has not yet been created. - scoped_refptr<MainThreadTaskQueue> GetNonLoadingTaskQueue( - MainThreadTaskQueue::QueueTraits) const; - // Map a set of QueueTraits to a QueueType. // TODO(shaseley): Consider creating a new queue type kFrameNonLoading and use // it instead of this for new queue types.
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller_unittest.cc index 8bf141e..3044678 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller_unittest.cc
@@ -22,6 +22,7 @@ #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h" #include "third_party/blink/renderer/platform/wtf/hash_map.h" +#include "third_party/blink/renderer/platform/wtf/hash_set.h" using base::sequence_manager::TaskQueue; using QueueType = blink::scheduler::MainThreadTaskQueue::QueueType; @@ -70,17 +71,17 @@ } protected: - scoped_refptr<MainThreadTaskQueue> NewLoadingTaskQueue() const { - return frame_task_queue_controller_->NewLoadingTaskQueue(); + scoped_refptr<MainThreadTaskQueue> LoadingTaskQueue() const { + return frame_task_queue_controller_->LoadingTaskQueue(); } - scoped_refptr<MainThreadTaskQueue> NewLoadingControlTaskQueue() const { - return frame_task_queue_controller_->NewLoadingControlTaskQueue(); + scoped_refptr<MainThreadTaskQueue> LoadingControlTaskQueue() const { + return frame_task_queue_controller_->LoadingControlTaskQueue(); } - scoped_refptr<MainThreadTaskQueue> NewNonLoadingTaskQueue( + scoped_refptr<MainThreadTaskQueue> NonLoadingTaskQueue( QueueTraits queue_traits) const { - return frame_task_queue_controller_->NewNonLoadingTaskQueue(queue_traits); + return frame_task_queue_controller_->NonLoadingTaskQueue(queue_traits); } scoped_refptr<MainThreadTaskQueue> NewResourceLoadingTaskQueue() const { @@ -108,38 +109,38 @@ WTF::HashMap<scoped_refptr<MainThreadTaskQueue>, QueueCheckResult> all_task_queues; - scoped_refptr<MainThreadTaskQueue> task_queue = NewLoadingTaskQueue(); + scoped_refptr<MainThreadTaskQueue> task_queue = LoadingTaskQueue(); EXPECT_FALSE(all_task_queues.Contains(task_queue)); all_task_queues.insert(task_queue.get(), QueueCheckResult::kDidNotSeeQueue); EXPECT_EQ(all_task_queues.size(), task_queue_created_count()); - task_queue = NewLoadingControlTaskQueue(); + task_queue = LoadingControlTaskQueue(); EXPECT_FALSE(all_task_queues.Contains(task_queue)); all_task_queues.insert(task_queue.get(), QueueCheckResult::kDidNotSeeQueue); EXPECT_EQ(all_task_queues.size(), task_queue_created_count()); // Create the 4 default non-loading task queues used by FrameSchedulerImpl. - task_queue = NewNonLoadingTaskQueue(QueueTraits() - .SetCanBeThrottled(true) - .SetCanBeDeferred(true) - .SetCanBeFrozen(true) - .SetCanBePaused(true)); + task_queue = NonLoadingTaskQueue(QueueTraits() + .SetCanBeThrottled(true) + .SetCanBeDeferred(true) + .SetCanBeFrozen(true) + .SetCanBePaused(true)); EXPECT_FALSE(all_task_queues.Contains(task_queue)); all_task_queues.insert(task_queue.get(), QueueCheckResult::kDidNotSeeQueue); EXPECT_EQ(all_task_queues.size(), task_queue_created_count()); - task_queue = NewNonLoadingTaskQueue( + task_queue = NonLoadingTaskQueue( QueueTraits().SetCanBeDeferred(true).SetCanBePaused(true)); EXPECT_FALSE(all_task_queues.Contains(task_queue)); all_task_queues.insert(task_queue.get(), QueueCheckResult::kDidNotSeeQueue); EXPECT_EQ(all_task_queues.size(), task_queue_created_count()); - task_queue = NewNonLoadingTaskQueue(QueueTraits().SetCanBePaused(true)); + task_queue = NonLoadingTaskQueue(QueueTraits().SetCanBePaused(true)); EXPECT_FALSE(all_task_queues.Contains(task_queue)); all_task_queues.insert(task_queue.get(), QueueCheckResult::kDidNotSeeQueue); EXPECT_EQ(all_task_queues.size(), task_queue_created_count()); - task_queue = NewNonLoadingTaskQueue(QueueTraits()); + task_queue = NonLoadingTaskQueue(QueueTraits()); EXPECT_FALSE(all_task_queues.Contains(task_queue)); all_task_queues.insert(task_queue.get(), QueueCheckResult::kDidNotSeeQueue); EXPECT_EQ(all_task_queues.size(), task_queue_created_count()); @@ -222,7 +223,7 @@ } TEST_F(FrameTaskQueueControllerTest, CannotRemoveNonResourceLoadingTaskQueues) { - scoped_refptr<MainThreadTaskQueue> task_queue = NewLoadingTaskQueue(); + scoped_refptr<MainThreadTaskQueue> task_queue = LoadingTaskQueue(); EXPECT_EQ(1u, frame_task_queue_controller_->GetAllTaskQueuesAndVoters().size()); bool was_removed = @@ -232,5 +233,35 @@ frame_task_queue_controller_->GetAllTaskQueuesAndVoters().size()); } +TEST_F(FrameTaskQueueControllerTest, AddAndRetrieveAllNonLoadingTaskQueues) { + // Create queues for all combination of queue traits for all combinations of + // the 4 QueueTraits bits. + WTF::HashSet<scoped_refptr<MainThreadTaskQueue>> all_task_queues; + constexpr size_t kTotalUniqueQueueTraits = 1 << 4; + for (size_t i = 0; i < kTotalUniqueQueueTraits; i++) { + MainThreadTaskQueue::QueueTraits queue_traits = + QueueTraits() + .SetCanBeThrottled(!!(i & 1 << 0)) + .SetCanBeDeferred(!!(i & 1 << 1)) + .SetCanBeFrozen(!!(i & 1 << 2)) + .SetCanBePaused(!!(i & 1 << 3)); + scoped_refptr<MainThreadTaskQueue> task_queue = + frame_task_queue_controller_->NonLoadingTaskQueue(queue_traits); + EXPECT_FALSE(all_task_queues.Contains(task_queue)); + all_task_queues.insert(task_queue); + EXPECT_EQ(task_queue->GetQueueTraits(), queue_traits); + } + // Make sure we get the same queues back, with matching QueueTraits. + EXPECT_EQ(all_task_queues.size(), kTotalUniqueQueueTraits); + for (const auto& task_queue : all_task_queues) { + scoped_refptr<MainThreadTaskQueue> returned_task_queue = + frame_task_queue_controller_->NonLoadingTaskQueue( + task_queue->GetQueueTraits()); + EXPECT_EQ(task_queue->GetQueueTraits(), + returned_task_queue->GetQueueTraits()); + EXPECT_TRUE(task_queue == returned_task_queue); + } +} + } // namespace scheduler } // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc index aa8829b..d33ead9 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -711,6 +711,9 @@ experiment_only_when_loading = base::FeatureList::IsEnabled(kExperimentOnlyWhenLoading); + + FrameSchedulerImpl::InitializeTaskTypeQueueTraitsMap( + frame_task_types_to_queue_traits); } MainThreadSchedulerImpl::AnyThread::~AnyThread() = default;
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h index 47d9434..11f2edb 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -17,6 +17,7 @@ #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" #include "base/metrics/single_sample_metrics.h" +#include "base/optional.h" #include "base/single_thread_task_runner.h" #include "base/synchronization/lock.h" #include "base/task/sequence_manager/task_queue.h" @@ -118,6 +119,14 @@ // Turn on relevant experiments during the loading phase. bool experiment_only_when_loading; + + using FrameTaskTypeToQueueTraitsArray = + std::array<base::Optional<MainThreadTaskQueue::QueueTraits>, + static_cast<size_t>(TaskType::kCount)>; + // Array of QueueTraits indexed by TaskType, containing TaskType::kCount + // entries. This is initialized early with all valid entries. Entries that + // aren't valid task types, i.e. non-frame level, are base::nullopt. + FrameTaskTypeToQueueTraitsArray frame_task_types_to_queue_traits; }; static const char* UseCaseToString(UseCase use_case);
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc index ccbe3bc..a9c2679 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h" #include <memory> +#include <string> #include <utility> #include "base/callback.h" @@ -30,6 +31,7 @@ #include "third_party/blink/renderer/platform/scheduler/common/throttling/budget_pool.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/auto_advancing_virtual_time_domain.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h" +#include "third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" using base::sequence_manager::TaskQueue; @@ -354,10 +356,14 @@ FrameSchedulerImpl::Create(page_scheduler_.get(), nullptr, nullptr, FrameScheduler::FrameType::kMainFrame); - loading_task_runner_ = main_frame_scheduler_->LoadingTaskQueue(); + auto* frame_task_queue_controller = + main_frame_scheduler_->FrameTaskQueueControllerForTest(); + loading_task_runner_ = frame_task_queue_controller->LoadingTaskQueue(); loading_control_task_runner_ = - main_frame_scheduler_->LoadingControlTaskQueue(); - timer_task_runner_ = main_frame_scheduler_->ThrottleableTaskQueue(); + frame_task_queue_controller->LoadingControlTaskQueue(); + auto queue_traits = main_frame_scheduler_->ThrottleableTaskQueueTraits(); + timer_task_runner_ = + frame_task_queue_controller->NonLoadingTaskQueue(queue_traits); } void TearDown() override { @@ -768,7 +774,10 @@ static scoped_refptr<TaskQueue> ThrottleableTaskQueue( FrameSchedulerImpl* scheduler) { - return scheduler->ThrottleableTaskQueue(); + auto* frame_task_queue_controller = + scheduler->FrameTaskQueueControllerForTest(); + auto queue_traits = FrameSchedulerImpl::ThrottleableTaskQueueTraits(); + return frame_task_queue_controller->NonLoadingTaskQueue(queue_traits); } QueueingTimeEstimator* queueing_time_estimator() { @@ -3668,6 +3677,7 @@ std::unique_ptr<base::trace_event::ConvertableToTraceFormat> value = scheduler_->AsValue(base::TimeTicks()); EXPECT_TRUE(value); + EXPECT_FALSE(value->ToString().empty()); } void RecordingTimeTestTask(
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc index 23032f4ec..017f9be 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc
@@ -21,6 +21,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h" +#include "third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h" #include "third_party/blink/renderer/platform/scheduler/main_thread/page_visibility_state.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" @@ -82,7 +83,10 @@ static scoped_refptr<TaskQueue> ThrottleableTaskQueueForScheduler( FrameSchedulerImpl* scheduler) { - return scheduler->ThrottleableTaskQueue(); + auto* frame_task_queue_controller = + scheduler->FrameTaskQueueControllerForTest(); + auto queue_traits = FrameSchedulerImpl::ThrottleableTaskQueueTraits(); + return frame_task_queue_controller->NonLoadingTaskQueue(queue_traits); } base::TimeDelta delay_for_background_tab_freezing() const { @@ -101,24 +105,32 @@ return LoadingTaskQueue()->CreateTaskRunner(TaskType::kInternalTest); } + scoped_refptr<MainThreadTaskQueue> NonLoadingTaskQueue( + MainThreadTaskQueue::QueueTraits queue_traits) { + return frame_scheduler_->FrameTaskQueueControllerForTest() + ->NonLoadingTaskQueue(queue_traits); + } + scoped_refptr<MainThreadTaskQueue> ThrottleableTaskQueue() { - return frame_scheduler_->ThrottleableTaskQueue(); + return NonLoadingTaskQueue( + FrameSchedulerImpl::ThrottleableTaskQueueTraits()); } scoped_refptr<MainThreadTaskQueue> LoadingTaskQueue() { - return frame_scheduler_->LoadingTaskQueue(); + return frame_scheduler_->FrameTaskQueueControllerForTest() + ->LoadingTaskQueue(); } scoped_refptr<MainThreadTaskQueue> DeferrableTaskQueue() { - return frame_scheduler_->DeferrableTaskQueue(); + return NonLoadingTaskQueue(FrameSchedulerImpl::DeferrableTaskQueueTraits()); } scoped_refptr<MainThreadTaskQueue> PausableTaskQueue() { - return frame_scheduler_->PausableTaskQueue(); + return NonLoadingTaskQueue(FrameSchedulerImpl::PausableTaskQueueTraits()); } scoped_refptr<MainThreadTaskQueue> UnpausableTaskQueue() { - return frame_scheduler_->UnpausableTaskQueue(); + return NonLoadingTaskQueue(FrameSchedulerImpl::UnpausableTaskQueueTraits()); } bool ShouldFreezePage() { return page_scheduler_->ShouldFreezePage(); }
diff --git a/third_party/blink/renderer/platform/text/text_break_iterator.cc b/third_party/blink/renderer/platform/text/text_break_iterator.cc index bc6d101..4111f00 100644 --- a/third_party/blink/renderer/platform/text/text_break_iterator.cc +++ b/third_party/blink/renderer/platform/text/text_break_iterator.cc
@@ -446,6 +446,14 @@ return next_break; } +unsigned LazyLineBreakIterator::NextBreakOpportunity(unsigned offset, + unsigned len) const { + DCHECK_LE(len, string_.length()); + int next_break = NextBreakablePosition(offset, break_type_, len); + DCHECK_GE(next_break, 0); + return next_break; +} + unsigned LazyLineBreakIterator::PreviousBreakOpportunity(unsigned offset, unsigned min) const { unsigned pos = std::min(offset, string_.length());
diff --git a/third_party/blink/renderer/platform/text/text_break_iterator.h b/third_party/blink/renderer/platform/text/text_break_iterator.h index 958e3f8..4893a6b 100644 --- a/third_party/blink/renderer/platform/text/text_break_iterator.h +++ b/third_party/blink/renderer/platform/text/text_break_iterator.h
@@ -254,12 +254,19 @@ } inline bool IsBreakable(int pos) const { - int next_breakable = -1; - return IsBreakable(pos, next_breakable, break_type_); + // No need to scan the entire string for the next breakable position when + // all we need to determine is whether the current position is breakable. + // Limit length to pos + 1. + // TODO(layout-dev): We should probably try to break out an actual + // IsBreakable method from NextBreakablePosition and get rid of this hack. + int len = std::min(pos + 1, static_cast<int>(string_.length())); + int next_breakable = NextBreakablePosition(pos, break_type_, len); + return pos == next_breakable; } // Returns the break opportunity at or after |offset|. unsigned NextBreakOpportunity(unsigned offset) const; + unsigned NextBreakOpportunity(unsigned offset, unsigned len) const; // Returns the break opportunity at or before |offset|. unsigned PreviousBreakOpportunity(unsigned offset, unsigned min = 0) const;
diff --git a/third_party/blink/renderer/platform/text/text_run.h b/third_party/blink/renderer/platform/text/text_run.h index e2522c3..df07c6f 100644 --- a/third_party/blink/renderer/platform/text/text_run.h +++ b/third_party/blink/renderer/platform/text/text_run.h
@@ -174,6 +174,11 @@ return data_.characters16; } + StringView ToStringView() const { + return Is8Bit() ? StringView(data_.characters8, len_) + : StringView(data_.characters16, len_); + } + UChar32 CodepointAt(unsigned i) const { SECURITY_DCHECK(i < len_); if (Is8Bit())
diff --git a/third_party/blink/renderer/platform/weborigin/security_origin.cc b/third_party/blink/renderer/platform/weborigin/security_origin.cc index 2a11de1..da69f76a 100644 --- a/third_party/blink/renderer/platform/weborigin/security_origin.cc +++ b/third_party/blink/renderer/platform/weborigin/security_origin.cc
@@ -438,6 +438,15 @@ } } +String SecurityOrigin::ToTokenForFastCheck() const { + if (SerializesAsNull()) + return String(); + + StringBuilder result; + BuildRawString(result); + return result.ToString(); +} + scoped_refptr<SecurityOrigin> SecurityOrigin::CreateFromString( const String& origin_string) { return SecurityOrigin::Create(KURL(NullURL(), origin_string));
diff --git a/third_party/blink/renderer/platform/weborigin/security_origin.h b/third_party/blink/renderer/platform/weborigin/security_origin.h index 4101ef4..d4b37b3 100644 --- a/third_party/blink/renderer/platform/weborigin/security_origin.h +++ b/third_party/blink/renderer/platform/weborigin/security_origin.h
@@ -213,6 +213,21 @@ // could make the string return "null". String ToRawString() const; + // Returns a token that helps distinguish origins, or null string. When not + // null string, the tokens are guaranteed to be different if not the same + // origin, i.e. if two tokens are the same and not null, the two + // SecurityOrigins are the same origin. Thus, tokens can be used for fast + // check of origins. + // + // This is pretty similar to ToString(), but this returns null string instead + // of "null", and includes a host part in case of file: scheme. + // + // Note that the same tokens only guarantee that the SecurityOrigins are + // the same origin and not the same origin-domain. See also: + // https://html.spec.whatwg.org/C/origin.html#same-origin + // https://html.spec.whatwg.org/C/origin.html#same-origin-domain + String ToTokenForFastCheck() const; + // This method checks for equality, ignoring the value of document.domain // (and whether it was set) but considering the host. It is used for // postMessage.
diff --git a/third_party/blink/renderer/platform/weborigin/security_origin_test.cc b/third_party/blink/renderer/platform/weborigin/security_origin_test.cc index 5c8d61a3..78a255b 100644 --- a/third_party/blink/renderer/platform/weborigin/security_origin_test.cc +++ b/third_party/blink/renderer/platform/weborigin/security_origin_test.cc
@@ -233,6 +233,8 @@ TestCase tests[] = { {true, "https://foobar.com", "https://foobar.com"}, {false, "https://foobar.com", "https://bazbar.com"}, + {true, "file://localhost/", "file://localhost/"}, + {false, "file:///", "file://localhost/"}, }; for (size_t i = 0; i < arraysize(tests); ++i) { @@ -241,6 +243,7 @@ scoped_refptr<const SecurityOrigin> origin2 = SecurityOrigin::CreateFromString(tests[i].origin2); EXPECT_EQ(tests[i].can_access, origin1->CanAccess(origin2.get())); + EXPECT_EQ(tests[i].can_access, origin2->CanAccess(origin1.get())); } } @@ -504,4 +507,34 @@ } } +TEST_F(SecurityOriginTest, ToTokenForFastCheck) { + constexpr struct { + const char* url; + const char* token; + } kTestCases[] = { + {"", nullptr}, + {"null", nullptr}, + {"data:text/plain,hello, world", nullptr}, + {"http://example.org/foo/bar", "http://example.org"}, + {"http://example.org:8080/foo/bar", "http://example.org:8080"}, + {"https://example.org:443/foo/bar", "https://example.org"}, + {"https://example.org:444/foo/bar", "https://example.org:444"}, + {"file:///foo/bar", "file://"}, + {"file://localhost/foo/bar", "file://localhost"}, + {"filesystem:http://example.org:88/foo/bar", "http://example.org:88"}, + // Somehow the host part in the inner URL is dropped. + // See https://crbug.com/867914 for details. + {"filesystem:file://localhost/foo/bar", "file://"}, + {"blob:http://example.org:88/foo/bar", "http://example.org:88"}, + {"blob:file://localhost/foo/bar", "file://localhost"}, + }; + + for (const auto& test : kTestCases) { + SCOPED_TRACE(test.url); + scoped_refptr<const SecurityOrigin> origin = + SecurityOrigin::CreateFromString(test.url); + EXPECT_EQ(test.token, origin->ToTokenForFastCheck()) << test.token; + } +} + } // namespace blink
diff --git a/third_party/fuchsia-sdk/BUILD.gn b/third_party/fuchsia-sdk/BUILD.gn index d79862f..11ad028 100644 --- a/third_party/fuchsia-sdk/BUILD.gn +++ b/third_party/fuchsia-sdk/BUILD.gn
@@ -221,7 +221,7 @@ "audio_capturer.fidl", "audio_renderer.fidl", "media_transport.fidl", - "media_types.fidl", + "stream_type.fidl", ] }
diff --git a/third_party/libvpx/README.chromium b/third_party/libvpx/README.chromium index 2d3b7a6..edad5a9 100644 --- a/third_party/libvpx/README.chromium +++ b/third_party/libvpx/README.chromium
@@ -5,9 +5,9 @@ License File: source/libvpx/LICENSE Security Critical: yes -Date: Tuesday July 17 2018 +Date: Thursday July 26 2018 Branch: master -Commit: 2c45cd174a9582909ee2a7ba9cdb3feb917840cf +Commit: 3b921d49b07abd619a6fab135795c94f4ce1c7bd Description: Contains the sources used to compile libvpx binaries used by Google Chrome and
diff --git a/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h index 683e385..d820a2b 100644 --- a/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h
@@ -1105,7 +1105,15 @@ void vpx_hadamard_32x32_c(const int16_t* src_diff, ptrdiff_t src_stride, tran_low_t* coeff); -#define vpx_hadamard_32x32 vpx_hadamard_32x32_c +void vpx_hadamard_32x32_sse2(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); +void vpx_hadamard_32x32_avx2(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); +RTCD_EXTERN void (*vpx_hadamard_32x32)(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); void vpx_hadamard_8x8_c(const int16_t* src_diff, ptrdiff_t src_stride, @@ -9046,6 +9054,11 @@ vpx_hadamard_16x16 = vpx_hadamard_16x16_sse2; if (flags & HAS_AVX2) vpx_hadamard_16x16 = vpx_hadamard_16x16_avx2; + vpx_hadamard_32x32 = vpx_hadamard_32x32_c; + if (flags & HAS_SSE2) + vpx_hadamard_32x32 = vpx_hadamard_32x32_sse2; + if (flags & HAS_AVX2) + vpx_hadamard_32x32 = vpx_hadamard_32x32_avx2; vpx_hadamard_8x8 = vpx_hadamard_8x8_c; if (flags & HAS_SSE2) vpx_hadamard_8x8 = vpx_hadamard_8x8_sse2;
diff --git a/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h index 85be355..9970fae1 100644 --- a/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h
@@ -988,7 +988,15 @@ void vpx_hadamard_32x32_c(const int16_t* src_diff, ptrdiff_t src_stride, tran_low_t* coeff); -#define vpx_hadamard_32x32 vpx_hadamard_32x32_c +void vpx_hadamard_32x32_sse2(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); +void vpx_hadamard_32x32_avx2(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); +RTCD_EXTERN void (*vpx_hadamard_32x32)(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); void vpx_hadamard_8x8_c(const int16_t* src_diff, ptrdiff_t src_stride, @@ -7657,6 +7665,9 @@ vpx_hadamard_16x16 = vpx_hadamard_16x16_sse2; if (flags & HAS_AVX2) vpx_hadamard_16x16 = vpx_hadamard_16x16_avx2; + vpx_hadamard_32x32 = vpx_hadamard_32x32_sse2; + if (flags & HAS_AVX2) + vpx_hadamard_32x32 = vpx_hadamard_32x32_avx2; vpx_hadamard_8x8 = vpx_hadamard_8x8_sse2; if (flags & HAS_SSSE3) vpx_hadamard_8x8 = vpx_hadamard_8x8_ssse3;
diff --git a/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h index 683e385..d820a2b 100644 --- a/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h
@@ -1105,7 +1105,15 @@ void vpx_hadamard_32x32_c(const int16_t* src_diff, ptrdiff_t src_stride, tran_low_t* coeff); -#define vpx_hadamard_32x32 vpx_hadamard_32x32_c +void vpx_hadamard_32x32_sse2(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); +void vpx_hadamard_32x32_avx2(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); +RTCD_EXTERN void (*vpx_hadamard_32x32)(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); void vpx_hadamard_8x8_c(const int16_t* src_diff, ptrdiff_t src_stride, @@ -9046,6 +9054,11 @@ vpx_hadamard_16x16 = vpx_hadamard_16x16_sse2; if (flags & HAS_AVX2) vpx_hadamard_16x16 = vpx_hadamard_16x16_avx2; + vpx_hadamard_32x32 = vpx_hadamard_32x32_c; + if (flags & HAS_SSE2) + vpx_hadamard_32x32 = vpx_hadamard_32x32_sse2; + if (flags & HAS_AVX2) + vpx_hadamard_32x32 = vpx_hadamard_32x32_avx2; vpx_hadamard_8x8 = vpx_hadamard_8x8_c; if (flags & HAS_SSE2) vpx_hadamard_8x8 = vpx_hadamard_8x8_sse2;
diff --git a/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h index 85be355..9970fae1 100644 --- a/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h
@@ -988,7 +988,15 @@ void vpx_hadamard_32x32_c(const int16_t* src_diff, ptrdiff_t src_stride, tran_low_t* coeff); -#define vpx_hadamard_32x32 vpx_hadamard_32x32_c +void vpx_hadamard_32x32_sse2(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); +void vpx_hadamard_32x32_avx2(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); +RTCD_EXTERN void (*vpx_hadamard_32x32)(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); void vpx_hadamard_8x8_c(const int16_t* src_diff, ptrdiff_t src_stride, @@ -7657,6 +7665,9 @@ vpx_hadamard_16x16 = vpx_hadamard_16x16_sse2; if (flags & HAS_AVX2) vpx_hadamard_16x16 = vpx_hadamard_16x16_avx2; + vpx_hadamard_32x32 = vpx_hadamard_32x32_sse2; + if (flags & HAS_AVX2) + vpx_hadamard_32x32 = vpx_hadamard_32x32_avx2; vpx_hadamard_8x8 = vpx_hadamard_8x8_sse2; if (flags & HAS_SSSE3) vpx_hadamard_8x8 = vpx_hadamard_8x8_ssse3;
diff --git a/third_party/libvpx/source/config/vpx_version.h b/third_party/libvpx/source/config/vpx_version.h index b981364..5558130 100644 --- a/third_party/libvpx/source/config/vpx_version.h +++ b/third_party/libvpx/source/config/vpx_version.h
@@ -2,7 +2,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 7 #define VERSION_PATCH 0 -#define VERSION_EXTRA "643-g2c45cd174" +#define VERSION_EXTRA "718-g3b921d49b" #define VERSION_PACKED ((VERSION_MAJOR<<16)|(VERSION_MINOR<<8)|(VERSION_PATCH)) -#define VERSION_STRING_NOSP "v1.7.0-643-g2c45cd174" -#define VERSION_STRING " v1.7.0-643-g2c45cd174" +#define VERSION_STRING_NOSP "v1.7.0-718-g3b921d49b" +#define VERSION_STRING " v1.7.0-718-g3b921d49b"
diff --git a/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h index 683e385..d820a2b 100644 --- a/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h
@@ -1105,7 +1105,15 @@ void vpx_hadamard_32x32_c(const int16_t* src_diff, ptrdiff_t src_stride, tran_low_t* coeff); -#define vpx_hadamard_32x32 vpx_hadamard_32x32_c +void vpx_hadamard_32x32_sse2(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); +void vpx_hadamard_32x32_avx2(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); +RTCD_EXTERN void (*vpx_hadamard_32x32)(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); void vpx_hadamard_8x8_c(const int16_t* src_diff, ptrdiff_t src_stride, @@ -9046,6 +9054,11 @@ vpx_hadamard_16x16 = vpx_hadamard_16x16_sse2; if (flags & HAS_AVX2) vpx_hadamard_16x16 = vpx_hadamard_16x16_avx2; + vpx_hadamard_32x32 = vpx_hadamard_32x32_c; + if (flags & HAS_SSE2) + vpx_hadamard_32x32 = vpx_hadamard_32x32_sse2; + if (flags & HAS_AVX2) + vpx_hadamard_32x32 = vpx_hadamard_32x32_avx2; vpx_hadamard_8x8 = vpx_hadamard_8x8_c; if (flags & HAS_SSE2) vpx_hadamard_8x8 = vpx_hadamard_8x8_sse2;
diff --git a/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h index 85be355..9970fae1 100644 --- a/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h
@@ -988,7 +988,15 @@ void vpx_hadamard_32x32_c(const int16_t* src_diff, ptrdiff_t src_stride, tran_low_t* coeff); -#define vpx_hadamard_32x32 vpx_hadamard_32x32_c +void vpx_hadamard_32x32_sse2(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); +void vpx_hadamard_32x32_avx2(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); +RTCD_EXTERN void (*vpx_hadamard_32x32)(const int16_t* src_diff, + ptrdiff_t src_stride, + tran_low_t* coeff); void vpx_hadamard_8x8_c(const int16_t* src_diff, ptrdiff_t src_stride, @@ -7657,6 +7665,9 @@ vpx_hadamard_16x16 = vpx_hadamard_16x16_sse2; if (flags & HAS_AVX2) vpx_hadamard_16x16 = vpx_hadamard_16x16_avx2; + vpx_hadamard_32x32 = vpx_hadamard_32x32_sse2; + if (flags & HAS_AVX2) + vpx_hadamard_32x32 = vpx_hadamard_32x32_avx2; vpx_hadamard_8x8 = vpx_hadamard_8x8_sse2; if (flags & HAS_SSSE3) vpx_hadamard_8x8 = vpx_hadamard_8x8_ssse3;
diff --git a/third_party/webrtc_overrides/rtc_base/task_queue.cc b/third_party/webrtc_overrides/rtc_base/task_queue.cc index 116a3c0..990eb57 100644 --- a/third_party/webrtc_overrides/rtc_base/task_queue.cc +++ b/third_party/webrtc_overrides/rtc_base/task_queue.cc
@@ -139,20 +139,24 @@ WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL, WaitableEvent::InitialState::NOT_SIGNALED); task_runner_->PostTask( - FROM_HERE, base::BindOnce(&TaskQueue::Impl::Deactivate, this, &event)); + FROM_HERE, base::BindOnce(&TaskQueue::Impl::Deactivate, + rtc::scoped_refptr<Impl>(this), &event)); event.Wait(); } void TaskQueue::Impl::PostTask(std::unique_ptr<QueuedTask> task) { - task_runner_->PostTask(FROM_HERE, base::BindOnce(&TaskQueue::Impl::RunTask, - this, base::Passed(&task))); + task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&TaskQueue::Impl::RunTask, rtc::scoped_refptr<Impl>(this), + std::move(task))); } void TaskQueue::Impl::PostDelayedTask(std::unique_ptr<QueuedTask> task, uint32_t milliseconds) { task_runner_->PostDelayedTask( FROM_HERE, - base::BindOnce(&TaskQueue::Impl::RunTask, this, base::Passed(&task)), + base::BindOnce(&TaskQueue::Impl::RunTask, rtc::scoped_refptr<Impl>(this), + std::move(task)), base::TimeDelta::FromMilliseconds(milliseconds)); }
diff --git a/tools/binary_size/libsupersize/static/index.html b/tools/binary_size/libsupersize/static/index.html index afb230b..b389905 100644 --- a/tools/binary_size/libsupersize/static/index.html +++ b/tools/binary_size/libsupersize/static/index.html
@@ -210,19 +210,19 @@ <fieldset id="highlight-container"> <legend class="subhead">Highlight symbols</legend> <div class="radio-wrapper"> - <input type="radio" id="clearhighlight" name="highlight" value="clear" checked data-dynamic> + <input type="radio" id="clearhighlight" name="highlight" value="clear" checked> <label class="radio-label" for="clearhighlight">None</label> </div> <div class="radio-wrapper"> - <input type="radio" id="hothighlight" name="highlight" value="hot" data-dynamic> + <input type="radio" id="hothighlight" name="highlight" value="hot"> <label class="radio-label" for="hothighlight">Hot code</label> </div> <div class="radio-wrapper"> - <input type="radio" id="generatedhighlight" name="highlight" value="generated" data-dynamic> + <input type="radio" id="generatedhighlight" name="highlight" value="generated"> <label class="radio-label" for="generatedhighlight">Generated files</label> </div> <div class="radio-wrapper"> - <input type="radio" id="coveragehightlight" name="highlight" value="coverage" data-dynamic> + <input type="radio" id="coveragehightlight" name="highlight" value="coverage"> <label class="radio-label" for="coveragehightlight">Code coverage</label> </div> </fieldset> @@ -346,7 +346,10 @@ <header class="header-info"> <h4 class="subhead size-info"></h4> <p class="body-2 path-info"></p> - <p class="caption type-info type-info-container"></p> + <p class="caption type-info-container"> + <span class="type-info"></span> + <span class="flags-info"></span> + </p> </header> <table class="type-breakdown-info"> <thead>
diff --git a/tools/binary_size/libsupersize/static/infocard-ui.js b/tools/binary_size/libsupersize/static/infocard-ui.js index b244a04..67fbfd70 100644 --- a/tools/binary_size/libsupersize/static/infocard-ui.js +++ b/tools/binary_size/libsupersize/static/infocard-ui.js
@@ -40,6 +40,8 @@ this._iconInfo = this._infocard.querySelector('.icon-info'); /** @type {HTMLSpanElement} */ this._typeInfo = this._infocard.querySelector('.type-info'); + /** @type {HTMLSpanElement} */ + this._flagsInfo = this._infocard.querySelector('.flags-info'); /** * Last symbol type displayed. @@ -106,6 +108,22 @@ } /** + * Returns a string representing the flags in the node. + * @param {TreeNode} node + */ + _flagsString(node) { + if (!node.flags) { + return ''; + } + + const flagsString = Array.from(_FLAG_LABELS) + .filter(([flag]) => hasFlag(flag, node)) + .map(([, part]) => part) + .join(','); + return `{${flagsString}}`; + } + + /** * Toggle wheter or not the card is visible. * @param {boolean} isHidden */ @@ -133,6 +151,7 @@ this._setTypeContent(icon); this._lastType = type; } + this._flagsInfo.textContent = this._flagsString(node); } /** @@ -148,12 +167,6 @@ } class SymbolInfocard extends Infocard { - constructor(id) { - super(id); - /** @type {HTMLSpanElement} */ - this._flagsInfo = this._infocard.querySelector('.flags-info'); - } - /** * @param {SVGSVGElement} icon Icon to display */ @@ -162,31 +175,6 @@ super._setTypeContent(icon); this._iconInfo.style.backgroundColor = color; } - - /** - * Updates the DOM for the info card. - * @param {TreeNode} node - */ - _updateInfocard(node) { - super._updateInfocard(node); - this._flagsInfo.textContent = this._flagsString(node); - } - - /** - * Returns a string representing the flags in the node. - * @param {TreeNode} symbolNode - */ - _flagsString(symbolNode) { - if (!symbolNode.flags) { - return ''; - } - - const flagsString = Array.from(_FLAG_LABELS) - .filter(([flag]) => hasFlag(flag, symbolNode)) - .map(([, part]) => part) - .join(','); - return `{${flagsString}}`; - } } class ContainerInfocard extends Infocard { @@ -233,19 +221,33 @@ icon.classList.add('canvas-overlay'); } + _flagsString(containerNode) { + const flags = super._flagsString(containerNode); + return flags ? `- contains ${flags}` : ''; + } + + /** + * Draw a border around part of a pie chart. + * @param {number} angleStart Starting angle, in radians. + * @param {number} angleEnd Ending angle, in radians. + * @param {string} strokeColor Color of the pie slice border. + * @param {number} lineWidth Width of the border. + */ + _drawBorder(angleStart, angleEnd, strokeColor, lineWidth) { + this._ctx.strokeStyle = strokeColor; + this._ctx.lineWidth = lineWidth; + this._ctx.beginPath(); + this._ctx.arc(40, 40, _CANVAS_RADIUS, angleStart, angleEnd); + this._ctx.stroke(); + } + /** * Draw a slice of a pie chart. * @param {number} angleStart Starting angle, in radians. - * @param {number} percentage Percentage of circle to draw. + * @param {number} angleEnd Ending angle, in radians. * @param {string} fillColor Color of the pie slice. - * @param {string} strokeColor Color of the pie slice border. - * @returns {number} Ending angle, in radians. */ - _drawSlice(angleStart, percentage, fillColor, strokeColor) { - const arcLength = Math.abs(percentage) * 2 * Math.PI; - const angleEnd = angleStart + arcLength; - if (arcLength === 0) return angleEnd; - + _drawSlice(angleStart, angleEnd, fillColor) { // Update DOM this._ctx.fillStyle = fillColor; // Move cursor to center, where line will start @@ -256,16 +258,6 @@ // Move cursor back to center this._ctx.closePath(); this._ctx.fill(); - - if (strokeColor) { - this._ctx.strokeStyle = strokeColor; - this._ctx.lineWidth = 16; - this._ctx.beginPath(); - this._ctx.arc(40, 40, _CANVAS_RADIUS, angleStart, angleEnd); - this._ctx.stroke(); - } - - return angleEnd; } /** @@ -319,6 +311,7 @@ (a, b) => b[1].size - a[1].size ); const diffMode = state.has('diff_mode'); + const highlightMode = state.has('highlight'); let totalSize = 0; for (const [, stats] of statsEntries) { totalSize += Math.abs(stats.size); @@ -331,13 +324,26 @@ delete extraRows[type]; const {color} = getIconStyle(type); const percentage = stats.size / totalSize; - let stroke = ''; - if (diffMode) { - stroke = stats.size > 0 ? '#ea4335' : '#34a853'; - } - - angleStart = this._drawSlice(angleStart, percentage, color, stroke); this._updateBreakdownRow(this._infoRows[type], stats, percentage); + + const arcLength = Math.abs(percentage) * 2 * Math.PI; + if (arcLength > 0) { + const angleEnd = angleStart + arcLength; + + this._drawSlice(angleStart, angleEnd, color); + if (highlightMode) { + const highlightPercent = stats.highlight / totalSize; + const highlightArcLength = Math.abs(highlightPercent) * 2 * Math.PI; + const highlightEnd = (angleStart + highlightArcLength); + + this._drawBorder(angleStart, highlightEnd, '#feefc3', 32); + } + if (diffMode) { + const strokeColor = stats.size > 0 ? '#ea4335' : '#34a853'; + this._drawBorder(angleStart, angleEnd, strokeColor, 16); + } + angleStart = angleEnd; + } } // Hide unused types
diff --git a/tools/binary_size/libsupersize/static/shared.js b/tools/binary_size/libsupersize/static/shared.js index 4e0ac18..6e1ce151 100644 --- a/tools/binary_size/libsupersize/static/shared.js +++ b/tools/binary_size/libsupersize/static/shared.js
@@ -24,8 +24,16 @@ * @prop {string} type Type of this node. If this node has children, the string * may have a second character to denote the most common child. * @prop {number} flags - * @prop {{[type: string]: {size:number,count:number}}} childStats Stats about - * this node's descendants, organized by symbol type. + * @prop {{[type: string]: TreeNodeChildStats}} childStats Stats about this + * node's descendants, organized by symbol type. + */ +/** + * @typedef {object} TreeNodeChildStats Stats about a node's descendants of + * a certain type. + * @prop {number} size Byte size + * @prop {number} count Number of symbols + * @prop {number} highlight Byte size of children that should be + * highlighted. */ /**
diff --git a/tools/binary_size/libsupersize/static/tree-ui.js b/tools/binary_size/libsupersize/static/tree-ui.js index 9ec4758..7acdd415 100644 --- a/tools/binary_size/libsupersize/static/tree-ui.js +++ b/tools/binary_size/libsupersize/static/tree-ui.js
@@ -16,12 +16,6 @@ const _SPECIAL_CHAR_REGEX = /(::|(?:\.*\/)+|#)/g; /** Insert zero-width space after capture group */ const _ZERO_WIDTH_SPACE = '$&\u200b'; - /** @type {{[highlight: string]: number}} */ - const _HIGHLIGHT_STATE_FLAGS = { - hot: _FLAGS.HOT, - generated: _FLAGS.GENERATED_SOURCE, - coverage: _FLAGS.COVERAGE, - }; // Templates for tree nodes in the UI. /** @type {HTMLTemplateElement} Template for leaves in the tree */ @@ -53,19 +47,17 @@ * @param {TreeNode} node Data about this symbol name element's tree node. */ function _highlightSymbolName(symbolNameElement, node) { - if (state.has('method_count')) { - const {count = 0} = node.childStats[_DEX_METHOD_SYMBOL_TYPE] || {}; - if (count < 0) { - // This symbol was removed between the before and after versions. - symbolNameElement.classList.add('removed'); - } + const dexMethodStats = node.childStats[_DEX_METHOD_SYMBOL_TYPE]; + if (dexMethodStats && dexMethodStats.count < 0) { + // This symbol was removed between the before and after versions. + symbolNameElement.classList.add('removed'); } - const flagToCheck = _HIGHLIGHT_STATE_FLAGS[state.get('highlight')]; - if (flagToCheck != null && hasFlag(flagToCheck, node)) { - symbolNameElement.classList.add('highlight') - } else { - symbolNameElement.classList.remove('highlight') + if (state.has('highlight')) { + const stats = Object.values(node.childStats); + if (stats.some(stat => stat.highlight > 0)) { + symbolNameElement.classList.add('highlight'); + } } } @@ -376,13 +368,6 @@ form.elements .namedItem('byteunit') .addEventListener('change', _handleDynamicInputChange('.size', _setSize)); - // When the `highlight` state changes, update all .symbol-name elements. - document - .getElementById('highlight-container') - .addEventListener( - 'change', - _handleDynamicInputChange('.symbol-name', _highlightSymbolName) - ); _symbolTree.addEventListener('keydown', _handleKeyNavigation); _symbolTree.addEventListener('focusin', event => {
diff --git a/tools/binary_size/libsupersize/static/tree-worker.js b/tools/binary_size/libsupersize/static/tree-worker.js index d0ae124..adb25d29 100644 --- a/tools/binary_size/libsupersize/static/tree-worker.js +++ b/tools/binary_size/libsupersize/static/tree-worker.js
@@ -38,6 +38,11 @@ const _PATH_SEP = '/'; const _DEMO_DATA_URL = 'demo.ndjson'; +const _NAMES_TO_FLAGS = Object.freeze({ + hot: _FLAGS.HOT, + generated: _FLAGS.GENERATED_SOURCE, + coverage: _FLAGS.COVERAGE, +}); /** @param {FileEntry} fileEntry */ function getSourcePath(fileEntry) { @@ -118,11 +123,14 @@ * @param {(symbolNode: TreeNode) => boolean} options.filterTest Called to see * if a symbol should be included. If a symbol fails the test, it will not be * attached to the tree. + * @param {(symbolNode: TreeNode) => boolean} options.highlightTest Called to + * see if a symbol should be highlighted. * @param {string} options.sep Path seperator used to find parent names. */ constructor(options) { this._getPath = options.getPath; this._filterTest = options.filterTest; + this._highlightTest = options.highlightTest; this._sep = options.sep || _PATH_SEP; this.rootNode = createNode({ @@ -146,7 +154,7 @@ * @param {TreeNode} node Child node. * @param {TreeNode} directParent New parent node. */ - static _attachToParent(node, directParent) { + _attachToParent(node, directParent) { // Link the nodes together directParent.children.push(node); node.parent = directParent; @@ -158,23 +166,34 @@ // Update the size and childStats of all ancestors while (node.parent != null) { const {parent} = node; - const [containerType, lastBiggestType] = parent.type; - let {size: lastBiggestSize = 0} = - parent.childStats[lastBiggestType] || {}; + + // Track the size of `lastBiggestType` for comparisons. + let [containerType, lastBiggestType] = parent.type; + let lastBiggestSize = 0; + const lastBiggestStats = parent.childStats[lastBiggestType]; + if (lastBiggestStats) { + lastBiggestSize = lastBiggestStats.size; + } + for (const [type, stat] of additionalStats) { - const parentStat = parent.childStats[type] || {size: 0, count: 0}; + let parentStat = parent.childStats[type]; + if (parentStat == null) { + parentStat = {size: 0, count: 0, highlight: 0}; + parent.childStats[type] = parentStat; + } parentStat.size += stat.size; parentStat.count += stat.count; - parent.childStats[type] = parentStat; + parentStat.highlight += stat.highlight; const absSize = Math.abs(parentStat.size); if (absSize > lastBiggestSize) { - parent.type = `${containerType}${type}`; + lastBiggestType = type; lastBiggestSize = absSize; } } + parent.type = `${containerType}${lastBiggestType}`; parent.size += additionalSize; parent.flags |= additionalFlags; node = parent; @@ -186,7 +205,7 @@ * into containers, based on the class of the dex methods. * @param {TreeNode} node */ - static _joinDexMethodClasses(node) { + _joinDexMethodClasses(node) { const hasDexMethods = node.childStats[_DEX_METHOD_SYMBOL_TYPE] != null; if (!hasDexMethods || node.children == null) return node; @@ -202,8 +221,8 @@ const splitIndex = childNode.idPath.lastIndexOf('#'); const isDexMethodWithClass = - childNode.type === _DEX_METHOD_SYMBOL_TYPE && - splitIndex > childNode.shortNameIndex; + childNode.type === _DEX_METHOD_SYMBOL_TYPE && + splitIndex > childNode.shortNameIndex; if (isDexMethodWithClass) { // Get the idPath of the class @@ -221,7 +240,7 @@ // Adjust the dex method's short name so it starts after the "#" childNode.shortNameIndex = splitIndex + 1; - TreeBuilder._attachToParent(childNode, classNode); + this._attachToParent(childNode, classNode); } else { otherSymbols.push(childNode); } @@ -235,7 +254,9 @@ node.children.push(containerNode); } } else { - node.children.forEach(TreeBuilder._joinDexMethodClasses); + for (const child of node.children) { + this._joinDexMethodClasses(child); + } } return node; } @@ -258,7 +279,7 @@ * @param {number} depth How many levels of children to keep. * @returns {TreeNode} */ - static formatNode(node, depth = 1) { + formatNode(node, depth = 1) { const childDepth = depth - 1; // `null` represents that the children have not been loaded yet let children = null; @@ -269,11 +290,11 @@ // If there is 1 child, include it so the UI doesn't need to make a // roundtrip in order to expand the chain. children = node.children - .map(n => TreeBuilder.formatNode(n, childDepth)) + .map(n => this.formatNode(n, childDepth)) .sort(_compareFunc); } - return TreeBuilder._joinDexMethodClasses( + return this._joinDexMethodClasses( Object.assign({}, node, { children, parent: null, @@ -328,7 +349,7 @@ } // attach node to the newly found parent - TreeBuilder._attachToParent(childNode, parentNode); + this._attachToParent(childNode, parentNode); return parentNode; } @@ -352,18 +373,29 @@ const size = symbol[_KEYS.SIZE]; const type = symbol[_KEYS.TYPE]; const count = symbol[_KEYS.COUNT] || 1; + const flags = symbol[_KEYS.FLAGS] || 0; + const symbolNode = createNode({ // Join file path to symbol name with a ":" idPath: `${idPath}:${symbol[_KEYS.SYMBOL_NAME]}`, shortNameIndex: idPath.length + 1, size, type, - flags: symbol[_KEYS.FLAGS] || 0, - childStats: {[type]: {size, count}}, + flags, + childStats: { + [type]: { + size, + count, + highlight: 0, + }, + }, }); + if (this._highlightTest(symbolNode)) { + symbolNode.childStats[type].highlight = size; + } if (this._filterTest(symbolNode)) { - TreeBuilder._attachToParent(symbolNode, fileNode); + this._attachToParent(symbolNode, fileNode); } } // unless we filtered out every symbol belonging to this file, @@ -564,6 +596,7 @@ const groupBy = params.get('group_by') || 'source_path'; const methodCountMode = params.has('method_count'); const filterGeneratedFiles = params.has('generated_filter'); + const flagToHighlight = _NAMES_TO_FLAGS[params.get('highlight')]; let minSymbolSize = Number(params.get('min_size')); if (Number.isNaN(minSymbolSize)) { @@ -632,7 +665,15 @@ return filters.every(fn => fn(symbolNode)); } - return {groupBy, filterTest, url}; + /** @type {(symbolNode: TreeNode) => boolean} */ + let highlightTest; + if (flagToHighlight) { + highlightTest = symbolNode => hasFlag(flagToHighlight, symbolNode); + } else { + highlightTest = () => false; + } + + return {groupBy, filterTest, highlightTest, url}; } /** @type {TreeBuilder | null} */ @@ -644,10 +685,12 @@ * @param {string} groupBy Sets how the tree is grouped. * @param {(symbolNode: TreeNode) => boolean} filterTest Filter function that * each symbol is tested against + * @param {(symbolNode: TreeNode) => boolean} highlightTest Filter function that + * each symbol's flags are tested against * @param {(msg: TreeProgress) => void} onProgress * @returns {Promise<TreeProgress>} */ -async function buildTree(groupBy, filterTest, onProgress) { +async function buildTree(groupBy, filterTest, highlightTest, onProgress) { /** @type {Meta | null} Object from the first line of the data file */ let meta = null; @@ -665,6 +708,7 @@ sep: groupBy === 'component' ? '>' : _PATH_SEP, getPath: getPathMap[groupBy], filterTest, + highlightTest, }); /** @@ -684,7 +728,7 @@ } const message = { - root: TreeBuilder.formatNode(data.root || builder.rootNode), + root: builder.formatNode(data.root || builder.rootNode), percent, diffMode: meta && meta.diff_mode, }; @@ -738,10 +782,10 @@ } const actions = { - /** @param {{input:string|null,options:string}} data */ - load(data) { - const {groupBy, filterTest, url} = parseOptions(data.options); - if (data.input === 'from-url://') { + /** @param {{input:string|null,options:string}} param0 */ + load({input, options}) { + const {groupBy, filterTest, highlightTest, url} = parseOptions(options); + if (input === 'from-url://') { if (url) { // Display the data from the `data_url` query parameter console.info('Displaying data from', url); @@ -754,12 +798,12 @@ // something. fetcher.setInput(_DEMO_DATA_URL); } - } else if (data.input != null) { + } else if (input != null) { console.info('Displaying uploaded data'); - fetcher.setInput(data.input); + fetcher.setInput(input); } - return buildTree(groupBy, filterTest, progress => { + return buildTree(groupBy, filterTest, highlightTest, progress => { // @ts-ignore self.postMessage(progress); }); @@ -768,7 +812,7 @@ async open(path) { if (!builder) throw new Error('Called open before load'); const node = builder.find(path); - return TreeBuilder.formatNode(node); + return builder.formatNode(node); }, };
diff --git a/tools/json_schema_compiler/json_schema_api.gni b/tools/json_schema_compiler/json_schema_api.gni index 1d14f6b..e459a4c 100644 --- a/tools/json_schema_compiler/json_schema_api.gni +++ b/tools/json_schema_compiler/json_schema_api.gni
@@ -102,9 +102,15 @@ root_namespace = invoker.root_namespace + # Save the target_name, since other targets (like the action() and + # action_foreach() below) need to reference them, but would have their own + # target_name variable. + root_target_name = target_name + if (schemas) { schema_generator_name = target_name + "_schema_generator" action_foreach(schema_generator_name) { + visibility = [":$root_target_name"] script = compiler_script sources = invoker.sources inputs = compiler_sources @@ -140,6 +146,7 @@ bundle_generator_schema_name = target_name + "_bundle_generator_schema" action(bundle_generator_schema_name) { + visibility = [":$root_target_name"] script = compiler_script inputs = compiler_sources + invoker.sources + uncompiled_sources + uncompiled_bundle_schema_sources @@ -178,6 +185,7 @@ bundle_generator_registration_name = target_name + "_bundle_generator_registration" action(bundle_generator_registration_name) { + visibility = [":$root_target_name"] script = compiler_script inputs = compiler_sources + invoker.sources + uncompiled_sources outputs = [
diff --git a/tools/mb/mb.py b/tools/mb/mb.py index 22c0707..43beb358 100755 --- a/tools/mb/mb.py +++ b/tools/mb/mb.py
@@ -385,9 +385,9 @@ ('infra/tools/luci/logdog/butler/${platform}', 'git_revision:e1abc57be62d198b5c2f487bfb2fa2d2eb0e867c'), ('infra/tools/luci/vpython-native/${platform}', - 'git_revision:b9c4670197dcefd8762d6e509302acd3efc6e303'), + 'git_revision:03693197fef4b7d6f2d717f99e9e616bb4f4d8a8'), ('infra/tools/luci/vpython/${platform}', - 'git_revision:b9c4670197dcefd8762d6e509302acd3efc6e303'), + 'git_revision:03693197fef4b7d6f2d717f99e9e616bb4f4d8a8'), ] for pkg, vers in cipd_packages: cmd.append('--cipd-package=.swarming_module:%s:%s' % (pkg, vers))
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index a140c9f..863f6b5 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -1689,6 +1689,7 @@ <int value="9" label="App started from settings"/> <int value="10" label="Interaction with notification"/> <int value="11" label="Interaction with app window"/> + <int value="12" label="App started from extension API"/> </enum> <enum name="ArcVideoDecodeAcceleratorResult"> @@ -16148,6 +16149,8 @@ <int value="1262" label="USERSPRIVATE_GETLOGINSTATUS"/> <int value="1263" label="FILEMANAGERPRIVATEINTERNAL_INSTALLLINUXPACKAGE"/> <int value="1264" label="VIRTUALKEYBOARDPRIVATE_SETHITTESTBOUNDS"/> + <int value="1265" label="ARCAPPSPRIVATE_GETLAUNCHABLEAPPS"/> + <int value="1266" label="ARCAPPSPRIVATE_LAUNCHAPP"/> </enum> <enum name="ExtensionIconState"> @@ -16592,6 +16595,8 @@ <int value="211" label="kCecPrivate"/> <int value="212" label="kSafeBrowsingPrivate"/> <int value="213" label="kFileSystemRequestDownloads"/> + <int value="214" label="kSystemPowerSource"/> + <int value="215" label="kArcAppsPrivate"/> </enum> <enum name="ExtensionServiceVerifyAllSuccess"> @@ -19463,6 +19468,7 @@ <int value="2514" label="V8RTCRtpTransceiver_Direction_AttributeGetter"/> <int value="2515" label="V8RTCRtpTransceiver_Direction_AttributeSetter"/> <int value="2516" label="HTMLLinkElementDisabledByParser"/> + <int value="2517" label="RequestIsHistoryNavigation"/> </enum> <enum name="FeedbackSource"> @@ -43146,6 +43152,15 @@ <int value="3" label="Context menu"/> </enum> +<enum name="ShowTabSwitcherSnapshotResult"> + <int value="0" label="Snapshot not attempted, page is still loading"> + Snapshot was not attempted because the page is still loading and would + result in a stale snapshot. + </int> + <int value="1" label="Snapshot was attempted, but the snapshot failed."/> + <int value="2" label="Snapshot was successfully taken."/> +</enum> + <enum name="ShutdownReason"> <summary> The reason that the Chrome OS power manager shut down or rebooted the
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index b99054f9..d1049cd1 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -15179,7 +15179,8 @@ </summary> </histogram> -<histogram name="CustomTabs.DetachedResourceRequest.Duration" units="ms"> +<histogram base="true" name="CustomTabs.DetachedResourceRequest.Duration" + units="ms"> <owner>lizeb@chromium.org</owner> <summary> Time between the start of a detached resource request and its completion @@ -15196,7 +15197,7 @@ </summary> </histogram> -<histogram name="CustomTabs.DetachedResourceRequest.RedirectsCount" +<histogram base="true" name="CustomTabs.DetachedResourceRequest.RedirectsCount" units="redirects"> <owner>lizeb@chromium.org</owner> <summary> @@ -15357,6 +15358,25 @@ </summary> </histogram> +<histogram base="true" name="CustomTabs.ResourcePrefetch.Duration" units="ms" + expires_after="M72"> + <owner>alexilin@chromium.org</owner> + <summary> + Time between the start of a detached resource request for resource prefetch + and its completion (failure or success). Android only. + </summary> +</histogram> + +<histogram name="CustomTabs.ResourcePrefetch.FinalStatus" enum="NetErrorCodes" + expires_after="M72"> + <owner>alexilin@chromium.org</owner> + <summary> + Reports the final status of the detached request for resource prefetch, + including success. Recorded once per resource prefetch request. Android + only. + </summary> +</histogram> + <histogram name="CustomTabs.SpareWebContents.Status" enum="SpareWebContentsStatus"> <owner>lizeb@chromium.org</owner> @@ -37076,6 +37096,15 @@ </summary> </histogram> +<histogram name="IOS.ShowTabSwitcherSnapshotResult" + enum="ShowTabSwitcherSnapshotResult" expires_after="2019-08-01"> + <owner>edchin@chromium.org</owner> + <summary> + Tracks the result of snapshotting when the user enters the tab switcher. + Recorded whenever the user enters the tab switcher. + </summary> +</histogram> + <histogram name="IOS.Spotlight.Action" enum="IOSSpotlightAction"> <owner>olivierrobin@chromium.org</owner> <summary>The Spotlight Action pressed by the user.</summary> @@ -98288,6 +98317,14 @@ </summary> </histogram> +<histogram name="Style.InvalidationTime" units="microseconds"> + <owner>futhark@chromium.org</owner> + <summary> + Microseconds spent in StyleEngine::InvalidateStyle. Only samples from high + resolution timers are recorded. + </summary> +</histogram> + <histogram name="Style.LazyUsage.Percent" enum="LazyCSSParseUsage"> <obsolete> Deprecated 07/2018, no longer used. @@ -117021,6 +117058,7 @@ <suffix name="Success" label="Successful detached request"/> <affected-histogram name="CustomTabs.DetachedResourceRequest.Duration"/> <affected-histogram name="CustomTabs.DetachedResourceRequest.RedirectsCount"/> + <affected-histogram name="CustomTabs.ResourcePrefetch.Duration"/> </histogram_suffixes> <histogram_suffixes name="DataReductionProxy" separator="_">
diff --git a/tools/perf/page_sets/data/key_desktop_move_cases_003.wprgo.sha1 b/tools/perf/page_sets/data/key_desktop_move_cases_003.wprgo.sha1 new file mode 100644 index 0000000..65dcded --- /dev/null +++ b/tools/perf/page_sets/data/key_desktop_move_cases_003.wprgo.sha1
@@ -0,0 +1 @@ +177923146e4280ca98b6a3f852dcdfbfd9dfabc0 \ No newline at end of file
diff --git a/tools/perf/page_sets/data/rendering_desktop.json b/tools/perf/page_sets/data/rendering_desktop.json index 3d010045..ae6bfc4 100644 --- a/tools/perf/page_sets/data/rendering_desktop.json +++ b/tools/perf/page_sets/data/rendering_desktop.json
@@ -75,13 +75,19 @@ "youtube_2018": { "DEFAULT": "top_25_012.wprgo" }, - "maps_move": { - "DEFAULT": "key_desktop_move_cases_000.wprgo" - }, "gmail_move": { "DEFAULT": "key_desktop_move_cases_002.wprgo" }, - "filter_terrain_svg": { + "gmail_move_2018": { + "DEFAULT": "key_desktop_move_cases_003.wprgo" + }, + "maps_move": { + "DEFAULT": "key_desktop_move_cases_000.wprgo" + }, + "maps_move_2018": { + "DEFAULT": "key_desktop_move_cases_003.wprgo" + }, + "filter_terrain_svg": { "DEFAULT": "tough_filters_cases_002.wprgo" }, "motion_mark_focus": { @@ -92,7 +98,7 @@ }, "ie_pirate_mark": { "DEFAULT": "tough_filters_cases_002.wprgo" - }, + }, "guimark_vector_chart": { "DEFAULT": "tough_path_rendering_cases_002.wprgo" },
diff --git a/tools/perf/page_sets/rendering/key_desktop_move_cases.py b/tools/perf/page_sets/rendering/key_desktop_move_cases.py index 2c0e994e..275b01ba 100644 --- a/tools/perf/page_sets/rendering/key_desktop_move_cases.py +++ b/tools/perf/page_sets/rendering/key_desktop_move_cases.py
@@ -101,6 +101,81 @@ return scrollbar_mid_x, scrollbar_start_mid_y, scrollbar_end_mid_y +class GmailMouseScroll2018Page(KeyDesktopMoveCasesPage): + """ Why: productivity, top google properties """ + BASE_NAME = 'gmail_move' + YEAR = '2018' + URL = 'https://mail.google.com/mail/' + + def __init__(self, + page_set, + shared_page_state_class=shared_page_state.SharedDesktopPageState, + name_suffix='', + extra_browser_args=None): + super(GmailMouseScroll2018Page, self).__init__( + page_set=page_set, + shared_page_state_class=shared_page_state_class, + name_suffix=name_suffix, + extra_browser_args=extra_browser_args + ) + + self.scrollable_element_function = ''' + function(callback) { + gmonkey.load('2.0', function(api) { + callback(api.getScrollableElement()); + }); + }''' + + def RunNavigateSteps(self, action_runner): + google_login.NewLoginGoogleAccount(action_runner, 'googletest') + super(GmailMouseScroll2018Page, self).RunNavigateSteps(action_runner) + action_runner.WaitForJavaScriptCondition( + 'window.gmonkey !== undefined &&' + 'document.getElementById("gb") !== null') + # This check is needed for gmonkey to load completely. + action_runner.WaitForJavaScriptCondition( + 'document.readyState == "complete"') + + def RunPageInteractions(self, action_runner): + action_runner.ExecuteJavaScript(''' + gmonkey.load('2.0', function(api) { + window.__scrollableElementForTelemetry = api.getScrollableElement(); + });''') + action_runner.WaitForJavaScriptCondition( + 'window.__scrollableElementForTelemetry != null') + scrollbar_x, start_y, end_y = self._CalculateScrollBarRatios(action_runner) + + with action_runner.CreateGestureInteraction('DragAction'): + action_runner.DragPage(left_start_ratio=scrollbar_x, + top_start_ratio=start_y, left_end_ratio=scrollbar_x, + top_end_ratio=end_y, speed_in_pixels_per_second=100, + element_function='window.__scrollableElementForTelemetry') + + def _CalculateScrollBarRatios(self, action_runner): + viewport_height = float(action_runner.EvaluateJavaScript( + 'window.__scrollableElementForTelemetry.clientHeight')) + content_height = float(action_runner.EvaluateJavaScript( + 'window.__scrollableElementForTelemetry.scrollHeight')) + viewport_width = float(action_runner.EvaluateJavaScript( + 'window.__scrollableElementForTelemetry.offsetWidth')) + scrollbar_width = float(action_runner.EvaluateJavaScript(''' + window.__scrollableElementForTelemetry.offsetWidth - + window.__scrollableElementForTelemetry.scrollWidth''')) + + # This calculation is correct only when the element doesn't have border or + # padding or scroll buttons (eg: gmail mail element). + # Calculating the mid point of start of scrollbar. + scrollbar_height_ratio = viewport_height / content_height + scrollbar_start_mid_y = scrollbar_height_ratio / 2 + scrollbar_width_ratio = scrollbar_width / viewport_width + scrollbar_mid_x_right_offset = scrollbar_width_ratio / 2 + scrollbar_mid_x = 1 - scrollbar_mid_x_right_offset + + # The End point of scrollbar (x remains same). + scrollbar_end_mid_y = 1 - scrollbar_start_mid_y + return scrollbar_mid_x, scrollbar_start_mid_y, scrollbar_end_mid_y + + class GoogleMapsPage(KeyDesktopMoveCasesPage): """ Why: productivity, top google properties; Supports drag gestures """ BASE_NAME = 'maps_move' @@ -131,3 +206,36 @@ action_runner.DragPage(left_start_ratio=0.5, top_start_ratio=0.75, left_end_ratio=0.75, top_end_ratio=0.5) # TODO(ssid): Add zoom gestures after fixing bug crbug.com/462214. + + +class GoogleMaps2018Page(KeyDesktopMoveCasesPage): + """ Why: productivity, top google properties; Supports drag gestures """ + BASE_NAME = 'maps_move' + YEAR = '2018' + URL = 'https://www.google.co.uk/maps/@51.5043968,-0.1526806' + + def __init__(self, + page_set, + shared_page_state_class=shared_page_state.SharedDesktopPageState, + name_suffix='', + extra_browser_args=None): + super(GoogleMaps2018Page, self).__init__( + page_set=page_set, + shared_page_state_class=shared_page_state_class, + name_suffix=name_suffix, + extra_browser_args=extra_browser_args) + + def RunNavigateSteps(self, action_runner): + super(GoogleMaps2018Page, self).RunNavigateSteps(action_runner) + action_runner.WaitForElement(selector='.widget-scene-canvas') + action_runner.WaitForElement(selector='.widget-zoom-in') + action_runner.WaitForElement(selector='.widget-zoom-out') + + def RunPageInteractions(self, action_runner): + for _ in range(3): + action_runner.Wait(2) + with action_runner.CreateGestureInteraction( + 'DragAction', repeatable=True): + action_runner.DragPage(left_start_ratio=0.5, top_start_ratio=0.75, + left_end_ratio=0.75, top_end_ratio=0.5) + # TODO(ssid): Add zoom gestures after fixing bug crbug.com/462214.
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h index b3c7e5f..a84fdb5a 100644 --- a/ui/compositor/compositor.h +++ b/ui/compositor/compositor.h
@@ -95,7 +95,13 @@ // resources from the ContextFactory (e.g. through // SharedMainThreadContextProvider()) will return newly recreated, valid // resources. - virtual void OnLostResources() = 0; + virtual void OnLostSharedContext() = 0; + + // Notifies that the Viz process was lost, eg. crashed, failed to start or + // restarted. There are no ordering guarantees for when OnLostSharedContext() + // and OnLostVizProcess() will be called. This is only called when OOP-D is + // enabled. + virtual void OnLostVizProcess() = 0; }; // This is privileged interface to the compositor. It is a global object.
diff --git a/ui/compositor/test/context_factories_for_test.cc b/ui/compositor/test/context_factories_for_test.cc index aa1eb18..a06b8c9 100644 --- a/ui/compositor/test/context_factories_for_test.cc +++ b/ui/compositor/test/context_factories_for_test.cc
@@ -59,7 +59,7 @@ void TerminateContextFactoryForTests() { if (g_implicit_factory) { - g_implicit_factory->SendOnLostResources(); + g_implicit_factory->SendOnLostSharedContext(); delete g_implicit_factory; g_implicit_factory = nullptr; }
diff --git a/ui/compositor/test/in_process_context_factory.cc b/ui/compositor/test/in_process_context_factory.cc index a1086e6..cd4b56a 100644 --- a/ui/compositor/test/in_process_context_factory.cc +++ b/ui/compositor/test/in_process_context_factory.cc
@@ -181,9 +181,9 @@ DCHECK(per_compositor_data_.empty()); } -void InProcessContextFactory::SendOnLostResources() { +void InProcessContextFactory::SendOnLostSharedContext() { for (auto& observer : observer_list_) - observer.OnLostResources(); + observer.OnLostSharedContext(); } void InProcessContextFactory::SetUseFastRefreshRateForTests() {
diff --git a/ui/compositor/test/in_process_context_factory.h b/ui/compositor/test/in_process_context_factory.h index 3191c11..cb435b7 100644 --- a/ui/compositor/test/in_process_context_factory.h +++ b/ui/compositor/test/in_process_context_factory.h
@@ -47,9 +47,9 @@ use_test_surface_ = use_test_surface; } - // This is used to call OnLostResources on all clients, to ensure they stop - // using the SharedMainThreadContextProvider. - void SendOnLostResources(); + // This is used to call SendOnLostSharedContext() on all clients, to ensure + // they stop using the SharedMainThreadContextProvider. + void SendOnLostSharedContext(); // Set refresh rate will be set to 200 to spend less time waiting for // BeginFrame when used for tests.
diff --git a/ui/file_manager/integration_tests/file_manager/zip_files.js b/ui/file_manager/integration_tests/file_manager/zip_files.js index f282904..9c014f2 100644 --- a/ui/file_manager/integration_tests/file_manager/zip_files.js +++ b/ui/file_manager/integration_tests/file_manager/zip_files.js
@@ -5,9 +5,10 @@ 'use strict'; /** - * Returns the ENTRIES.zipArchive content (2 files) as row entries. + * Returns the expected file list row entries after opening (unzipping) the + * ENTRIES.zipArchive file list entry. */ -function getUnzippedFileRowEntries() { +function getUnzippedFileListRowEntries() { return [ ['image.png', '272 bytes', 'PNG image', 'Sep 2, 2013, 10:01 PM'], ['text.txt', '51 bytes', 'Plain text', 'Sep 2, 2013, 10:01 PM'] @@ -41,7 +42,7 @@ // Check: the zip file content should be shown (unzip). function(result) { chrome.test.assertTrue(!!result, 'fakeKeyDown failed'); - const files = getUnzippedFileRowEntries(); + const files = getUnzippedFileListRowEntries(); remoteCall.waitForFiles(appId, files).then(this.next); }, ]); @@ -74,7 +75,7 @@ // Check: the zip file content should be shown (unzip). function(result) { chrome.test.assertTrue(!!result, 'fakeKeyDown failed'); - const files = getUnzippedFileRowEntries(); + const files = getUnzippedFileListRowEntries(); remoteCall.waitForFiles(appId, files).then(this.next); }, ]); @@ -132,7 +133,7 @@ // Check: the zip file content should be shown (unzip). function(result) { chrome.test.assertTrue(!!result, 'fakeKeyDown failed'); - const files = getUnzippedFileRowEntries(); + const files = getUnzippedFileListRowEntries(); remoteCall.waitForFiles(appId, files).then(this.next); }, ]); @@ -175,7 +176,7 @@ }, // Check: the context menu should appear. function(result) { - chrome.test.assertTrue(result, 'fakeMouseRightClick failed'); + chrome.test.assertTrue(!!result, 'fakeMouseRightClick failed'); remoteCall.waitForElement(appId, '#file-context-menu:not([hidden])') .then(this.next); }, @@ -222,7 +223,7 @@ }, // Check: the context menu should appear. function(result) { - chrome.test.assertTrue(result, 'fakeMouseRightClick failed'); + chrome.test.assertTrue(!!result, 'fakeMouseRightClick failed'); remoteCall.waitForElement(appId, '#file-context-menu:not([hidden])') .then(this.next); }, @@ -294,7 +295,7 @@ }, // Check: the context menu should appear. function(result) { - chrome.test.assertTrue(result, 'fakeMouseRightClick failed'); + chrome.test.assertTrue(!!result, 'fakeMouseRightClick failed'); remoteCall.waitForElement(appId, '#file-context-menu:not([hidden])') .then(this.next); },
diff --git a/ui/gfx/color_utils.cc b/ui/gfx/color_utils.cc index f7cf46d..0a7116a 100644 --- a/ui/gfx/color_utils.cc +++ b/ui/gfx/color_utils.cc
@@ -33,104 +33,104 @@ // The luma midpoint for determining if a color is light or dark. int g_color_utils_luma_midpoint = 128; -int calcHue(double temp1, double temp2, double hue) { - if (hue < 0.0) +int calcHue(float temp1, float temp2, float hue) { + if (hue < 0.0f) ++hue; - else if (hue > 1.0) + else if (hue > 1.0f) --hue; - double result = temp1; - if (hue * 6.0 < 1.0) - result = temp1 + (temp2 - temp1) * hue * 6.0; - else if (hue * 2.0 < 1.0) + float result = temp1; + if (hue * 6.0f < 1.0f) + result = temp1 + (temp2 - temp1) * hue * 6.0f; + else if (hue * 2.0f < 1.0f) result = temp2; - else if (hue * 3.0 < 2.0) - result = temp1 + (temp2 - temp1) * (2.0 / 3.0 - hue) * 6.0; + else if (hue * 3.0f < 2.0f) + result = temp1 + (temp2 - temp1) * (2.0f / 3.0f - hue) * 6.0f; return static_cast<int>(std::round(result * 255)); } // Assumes sRGB. -double Linearize(double eight_bit_component) { - const double component = eight_bit_component / 255.0; +float Linearize(float eight_bit_component) { + const float component = eight_bit_component / 255.0f; // The W3C link in the header uses 0.03928 here. See // https://en.wikipedia.org/wiki/SRGB#Theory_of_the_transformation for // discussion of why we use this value rather than that one. - return (component <= 0.04045) ? - (component / 12.92) : pow((component + 0.055) / 1.055, 2.4); + return (component <= 0.04045f) ? (component / 12.92f) + : pow((component + 0.055f) / 1.055f, 2.4f); } SkColor LightnessInvertColor(SkColor color) { HSL hsl; SkColorToHSL(color, &hsl); - hsl.l = 1.0 - hsl.l; + hsl.l = 1.0f - hsl.l; return HSLToSkColor(hsl, SkColorGetA(color)); } } // namespace -double GetContrastRatio(SkColor color_a, SkColor color_b) { +float GetContrastRatio(SkColor color_a, SkColor color_b) { return GetContrastRatio(GetRelativeLuminance(color_a), GetRelativeLuminance(color_b)); } -double GetContrastRatio(double luminance_a, double luminance_b) { - DCHECK_GE(luminance_a, 0.0); - DCHECK_GE(luminance_b, 0.0); - luminance_a += 0.05; - luminance_b += 0.05; +float GetContrastRatio(float luminance_a, float luminance_b) { + DCHECK_GE(luminance_a, 0.0f); + DCHECK_GE(luminance_b, 0.0f); + luminance_a += 0.05f; + luminance_b += 0.05f; return (luminance_a > luminance_b) ? (luminance_a / luminance_b) : (luminance_b / luminance_a); } -double GetRelativeLuminance(SkColor color) { - return (0.2126 * Linearize(SkColorGetR(color))) + - (0.7152 * Linearize(SkColorGetG(color))) + - (0.0722 * Linearize(SkColorGetB(color))); +float GetRelativeLuminance(SkColor color) { + return (0.2126f * Linearize(SkColorGetR(color))) + + (0.7152f * Linearize(SkColorGetG(color))) + + (0.0722f * Linearize(SkColorGetB(color))); } uint8_t GetLuma(SkColor color) { - return static_cast<uint8_t>(std::round((0.299 * SkColorGetR(color)) + - (0.587 * SkColorGetG(color)) + - (0.114 * SkColorGetB(color)))); + return static_cast<uint8_t>(std::round((0.299f * SkColorGetR(color)) + + (0.587f * SkColorGetG(color)) + + (0.114f * SkColorGetB(color)))); } void SkColorToHSL(SkColor c, HSL* hsl) { - double r = static_cast<double>(SkColorGetR(c)) / 255.0; - double g = static_cast<double>(SkColorGetG(c)) / 255.0; - double b = static_cast<double>(SkColorGetB(c)) / 255.0; - double vmax = std::max(std::max(r, g), b); - double vmin = std::min(std::min(r, g), b); - double delta = vmax - vmin; + float r = SkColorGetR(c) / 255.0f; + float g = SkColorGetG(c) / 255.0f; + float b = SkColorGetB(c) / 255.0f; + float vmax = std::max(std::max(r, g), b); + float vmin = std::min(std::min(r, g), b); + float delta = vmax - vmin; hsl->l = (vmax + vmin) / 2; if (SkColorGetR(c) == SkColorGetG(c) && SkColorGetR(c) == SkColorGetB(c)) { hsl->h = hsl->s = 0; } else { - double dr = (((vmax - r) / 6.0) + (delta / 2.0)) / delta; - double dg = (((vmax - g) / 6.0) + (delta / 2.0)) / delta; - double db = (((vmax - b) / 6.0) + (delta / 2.0)) / delta; + float dr = (((vmax - r) / 6.0f) + (delta / 2.0f)) / delta; + float dg = (((vmax - g) / 6.0f) + (delta / 2.0f)) / delta; + float db = (((vmax - b) / 6.0f) + (delta / 2.0f)) / delta; // We need to compare for the max value because comparing vmax to r, g, or b // can sometimes result in values overflowing registers. if (r >= g && r >= b) hsl->h = db - dg; else if (g >= r && g >= b) - hsl->h = (1.0 / 3.0) + dr - db; + hsl->h = (1.0f / 3.0f) + dr - db; else // (b >= r && b >= g) - hsl->h = (2.0 / 3.0) + dg - dr; + hsl->h = (2.0f / 3.0f) + dg - dr; - if (hsl->h < 0.0) + if (hsl->h < 0.0f) ++hsl->h; - else if (hsl->h > 1.0) + else if (hsl->h > 1.0f) --hsl->h; - hsl->s = delta / ((hsl->l < 0.5) ? (vmax + vmin) : (2 - vmax - vmin)); + hsl->s = delta / ((hsl->l < 0.5f) ? (vmax + vmin) : (2 - vmax - vmin)); } } SkColor HSLToSkColor(const HSL& hsl, SkAlpha alpha) { - double hue = hsl.h; - double saturation = hsl.s; - double lightness = hsl.l; + float hue = hsl.h; + float saturation = hsl.s; + float lightness = hsl.l; // If there's no color, we don't care about hue and can do everything based on // brightness. @@ -140,13 +140,13 @@ return SkColorSetARGB(alpha, light, light, light); } - double temp2 = (lightness < 0.5) ? - (lightness * (1.0 + saturation)) : - (lightness + saturation - (lightness * saturation)); - double temp1 = 2.0 * lightness - temp2; - return SkColorSetARGB(alpha, calcHue(temp1, temp2, hue + 1.0 / 3.0), + float temp2 = (lightness < 0.5f) + ? (lightness * (1.0f + saturation)) + : (lightness + saturation - (lightness * saturation)); + float temp1 = 2.0f * lightness - temp2; + return SkColorSetARGB(alpha, calcHue(temp1, temp2, hue + 1.0f / 3.0f), calcHue(temp1, temp2, hue), - calcHue(temp1, temp2, hue - 1.0 / 3.0)); + calcHue(temp1, temp2, hue - 1.0f / 3.0f)); } bool IsWithinHSLRange(const HSL& hsl, @@ -201,10 +201,10 @@ // Change the saturation. if (shift.s >= 0) { - if (shift.s <= 0.5) - hsl.s *= shift.s * 2.0; + if (shift.s <= 0.5f) + hsl.s *= shift.s * 2.0f; else - hsl.s += (1.0 - hsl.s) * ((shift.s - 0.5) * 2.0); + hsl.s += (1.0f - hsl.s) * ((shift.s - 0.5f) * 2.0f); } color = HSLToSkColor(hsl, alpha); @@ -215,17 +215,17 @@ // Lightness shifts in the style of popular image editors aren't actually // represented in HSL - the L value does have some effect on saturation. - double r = static_cast<double>(SkColorGetR(color)); - double g = static_cast<double>(SkColorGetG(color)); - double b = static_cast<double>(SkColorGetB(color)); - if (shift.l <= 0.5) { - r *= (shift.l * 2.0); - g *= (shift.l * 2.0); - b *= (shift.l * 2.0); + float r = static_cast<float>(SkColorGetR(color)); + float g = static_cast<float>(SkColorGetG(color)); + float b = static_cast<float>(SkColorGetB(color)); + if (shift.l <= 0.5f) { + r *= (shift.l * 2.0f); + g *= (shift.l * 2.0f); + b *= (shift.l * 2.0f); } else { - r += (255.0 - r) * ((shift.l - 0.5) * 2.0); - g += (255.0 - g) * ((shift.l - 0.5) * 2.0); - b += (255.0 - b) * ((shift.l - 0.5) * 2.0); + r += (255.0f - r) * ((shift.l - 0.5f) * 2.0f); + g += (255.0f - g) * ((shift.l - 0.5f) * 2.0f); + b += (255.0f - b) * ((shift.l - 0.5f) * 2.0f); } return SkColorSetARGB(alpha, static_cast<int>(std::round(r)), @@ -264,19 +264,22 @@ int f_alpha = SkColorGetA(foreground); int b_alpha = SkColorGetA(background); - double normalizer = (f_alpha * alpha + b_alpha * (255 - alpha)) / 255.0; - if (normalizer == 0.0) + float normalizer = (f_alpha * alpha + b_alpha * (255 - alpha)) / 255.0f; + if (normalizer == 0.0f) return SK_ColorTRANSPARENT; - double f_weight = f_alpha * alpha / normalizer; - double b_weight = b_alpha * (255 - alpha) / normalizer; + float f_weight = f_alpha * alpha / normalizer; + float b_weight = b_alpha * (255 - alpha) / normalizer; - double r = (SkColorGetR(foreground) * f_weight + - SkColorGetR(background) * b_weight) / 255.0; - double g = (SkColorGetG(foreground) * f_weight + - SkColorGetG(background) * b_weight) / 255.0; - double b = (SkColorGetB(foreground) * f_weight + - SkColorGetB(background) * b_weight) / 255.0; + float r = (SkColorGetR(foreground) * f_weight + + SkColorGetR(background) * b_weight) / + 255.0f; + float g = (SkColorGetG(foreground) * f_weight + + SkColorGetG(background) * b_weight) / + 255.0f; + float b = (SkColorGetB(foreground) * f_weight + + SkColorGetB(background) * b_weight) / + 255.0f; return SkColorSetARGB(static_cast<int>(std::round(normalizer)), static_cast<int>(std::round(r)), @@ -306,7 +309,7 @@ SkColor PickContrastingColor(SkColor foreground1, SkColor foreground2, SkColor background) { - const double background_luminance = GetRelativeLuminance(background); + const float background_luminance = GetRelativeLuminance(background); return (GetContrastRatio(GetRelativeLuminance(foreground1), background_luminance) >= GetContrastRatio(GetRelativeLuminance(foreground2), @@ -318,7 +321,7 @@ SkColor background) { DCHECK_EQ(SkColorGetA(default_foreground), SK_AlphaOPAQUE); - const double background_luminance = GetRelativeLuminance(background); + const float background_luminance = GetRelativeLuminance(background); if (GetContrastRatio(GetRelativeLuminance(default_foreground), background_luminance) >= kMinimumReadableContrastRatio) { return default_foreground;
diff --git a/ui/gfx/color_utils.h b/ui/gfx/color_utils.h index 991c498..b7e524b 100644 --- a/ui/gfx/color_utils.h +++ b/ui/gfx/color_utils.h
@@ -23,18 +23,18 @@ // The minimum contrast between text and background that is still readable. // This value is taken from w3c accessibility guidelines. -constexpr double kMinimumReadableContrastRatio = 4.5; +constexpr float kMinimumReadableContrastRatio = 4.5f; // Determines the contrast ratio of two colors or two relative luminance values // (as computed by RelativeLuminance()), calculated according to // http://www.w3.org/TR/WCAG20/#contrast-ratiodef . -GFX_EXPORT double GetContrastRatio(SkColor color_a, SkColor color_b); -GFX_EXPORT double GetContrastRatio(double luminance_a, double luminance_b); +GFX_EXPORT float GetContrastRatio(SkColor color_a, SkColor color_b); +GFX_EXPORT float GetContrastRatio(float luminance_a, float luminance_b); // The relative luminance of |color|, that is, the weighted sum of the // linearized RGB components, normalized to 0..1, per BT.709. See // http://www.w3.org/TR/WCAG20/#relativeluminancedef . -GFX_EXPORT double GetRelativeLuminance(SkColor color); +GFX_EXPORT float GetRelativeLuminance(SkColor color); // The luma of |color|, that is, the weighted sum of the gamma-compressed R'G'B' // components, per BT.601, a.k.a. the Y' in Y'UV. See
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn index 72c8b2b..4459893 100644 --- a/ui/gl/BUILD.gn +++ b/ui/gl/BUILD.gn
@@ -69,8 +69,6 @@ "gl_bindings_autogen_osmesa.h", "gl_context.cc", "gl_context.h", - "gl_context_osmesa.cc", - "gl_context_osmesa.h", "gl_context_stub.cc", "gl_context_stub.h", "gl_enums.cc", @@ -114,8 +112,6 @@ "gl_surface.h", "gl_surface_format.cc", "gl_surface_format.h", - "gl_surface_osmesa.cc", - "gl_surface_osmesa.h", "gl_surface_overlay.cc", "gl_surface_overlay.h", "gl_surface_presentation_helper.cc", @@ -160,6 +156,7 @@ "//third_party/angle:includes", ] public_deps = [ + ":osmesa_sources", "//base", "//third_party/mesa:mesa_headers", "//ui/events/platform", @@ -167,6 +164,8 @@ "//ui/gfx/geometry", ] + allow_circular_includes_from = [ ":osmesa_sources" ] + data_deps = [] if (enable_swiftshader) { data_deps += [ "//third_party/swiftshader" ] @@ -394,6 +393,33 @@ } } +# OSMesaContext, OSMesaCreateContext and other functions are declared +# and defined in for instance gl/gl_bindings.h and +# gl/gl_bindings_autogen_osmesa.cc. They are also declared slightly +# differently in the real mesa headers in <GL/osmesa.h>. This target +# is for code that uses the real OSMesa API and can't be combined with +# code that uses the wrapper API. +source_set("osmesa_sources") { + # Only a helper build target. Not to be used outside this file. + visibility = [ ":gl" ] + + sources = [ + "gl_context_osmesa.cc", + "gl_context_osmesa.h", + "gl_surface_osmesa.cc", + "gl_surface_osmesa.h", + ] + + deps = [ + "//third_party/mesa:mesa_headers", + "//ui/gfx", + ] + + defines = [ "GL_IMPLEMENTATION" ] + + configs += [ "//third_party/khronos:khronos_headers" ] +} + static_library("gl_unittest_utils") { testonly = true sources = [
diff --git a/ui/gl/DEPS b/ui/gl/DEPS index 581cf2e3..d80234fc 100644 --- a/ui/gl/DEPS +++ b/ui/gl/DEPS
@@ -8,12 +8,17 @@ ] specific_include_rules = { -# This is the only target that should use the osmesa.h header. Everything else -# should use the GLES2 headers from third_party/khronos/ or use gl_bindings.h to -# get access to desktop OpenGL. +# gl_surface_osmesa.cc and gl_context_osmesa.cc are the only files +# that should use the osmesa.h header. Everything else should use the +# GLES2 headers from third_party/khronos/ or use gl_bindings.h to get +# access to desktop OpenGL. "gl_surface_osmesa.cc": [ "+third_party/mesa/src/include/GL/osmesa.h", ], + "gl_context_osmesa.cc": [ + "+third_party/mesa/src/include/GL/osmesa.h", + ], + # Allow us to include ANGLE's base platform implementation. "angle_platform_impl.cc": [ "+third_party/angle/include/platform/Platform.h",
diff --git a/ui/gl/gl_context_osmesa.cc b/ui/gl/gl_context_osmesa.cc index f2565fe4c..81611e9 100644 --- a/ui/gl/gl_context_osmesa.cc +++ b/ui/gl/gl_context_osmesa.cc
@@ -4,9 +4,8 @@ #include "ui/gl/gl_context_osmesa.h" -#include <GL/osmesa.h> - #include "base/logging.h" +#include "third_party/mesa/src/include/GL/osmesa.h" #include "ui/gfx/geometry/size.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_surface.h"
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc index cb23705..d0d0e69 100644 --- a/ui/keyboard/keyboard_controller.cc +++ b/ui/keyboard/keyboard_controller.cc
@@ -483,6 +483,11 @@ void KeyboardController::SetContainerBehaviorInternal( const ContainerType type) { + // Reset the hit test event targeter because the hit test bounds will + // be wrong when container type changes and may cause the UI to be unusable. + if (GetKeyboardWindow()) + GetKeyboardWindow()->SetEventTargeter(nullptr); + switch (type) { case ContainerType::FULL_WIDTH: container_behavior_ = std::make_unique<ContainerFullWidthBehavior>(this);
diff --git a/ui/views/cocoa/bridged_native_widget.h b/ui/views/cocoa/bridged_native_widget.h index 674a9b7..b8c88ee1 100644 --- a/ui/views/cocoa/bridged_native_widget.h +++ b/ui/views/cocoa/bridged_native_widget.h
@@ -31,7 +31,6 @@ namespace ui { class InputMethod; -class RecyclableCompositorMac; } namespace views { @@ -322,8 +321,12 @@ std::vector<BridgedNativeWidget*> child_windows_; base::scoped_nsobject<NSView> compositor_superview_; + std::unique_ptr<ui::AcceleratedWidgetMac> compositor_widget_; std::unique_ptr<ui::DisplayCALayerTree> display_ca_layer_tree_; - std::unique_ptr<ui::RecyclableCompositorMac> compositor_; + std::unique_ptr<ui::Compositor> compositor_; + std::unique_ptr<ui::CompositorLock> compositor_lock_; + + viz::ParentLocalSurfaceIdAllocator parent_local_surface_id_allocator_; // Tracks the bounds when the window last started entering fullscreen. Used to // provide an answer for GetRestoredBounds(), but not ever sent to Cocoa (it
diff --git a/ui/views/cocoa/bridged_native_widget.mm b/ui/views/cocoa/bridged_native_widget.mm index c85c4d3..c1a6158 100644 --- a/ui/views/cocoa/bridged_native_widget.mm +++ b/ui/views/cocoa/bridged_native_widget.mm
@@ -14,6 +14,7 @@ #include "base/mac/mac_util.h" #import "base/mac/sdk_forward_declarations.h" #include "base/single_thread_task_runner.h" +#include "base/threading/thread_task_runner_handle.h" #include "components/viz/common/features.h" #include "components/viz/common/surfaces/local_surface_id.h" #include "ui/accelerated_widget_mac/window_resize_helper_mac.h" @@ -23,6 +24,7 @@ #include "ui/base/ime/input_method_factory.h" #include "ui/base/layout.h" #include "ui/base/ui_base_switches.h" +#include "ui/compositor/compositor_switches.h" #include "ui/compositor/recyclable_compositor_mac.h" #include "ui/gfx/geometry/dip_util.h" #import "ui/gfx/mac/coordinate_conversion.h" @@ -172,6 +174,17 @@ return gfx::Size([window contentRectForFrameRect:frame_rect].size); } +// Returns a task runner for creating a ui::Compositor. This allows compositor +// tasks to be funneled through ui::WindowResizeHelper's task runner to allow +// resize operations to coordinate with frames provided by the GPU process. +scoped_refptr<base::SingleThreadTaskRunner> GetCompositorTaskRunner() { + // If the WindowResizeHelper's pumpable task runner is set, it means the GPU + // process is directing messages there, and the compositor can synchronize + // with it. Otherwise, just use the UI thread. + scoped_refptr<base::SingleThreadTaskRunner> task_runner = + ui::WindowResizeHelperMac::Get()->task_runner(); + return task_runner ? task_runner : base::ThreadTaskRunnerHandle::Get(); +} void RankNSViews(views::View* view, const views::BridgedNativeWidget::AssociatedViews& hosts, RankMap* rank) { @@ -441,7 +454,7 @@ // If this is ever false, the compositor will need to be properly torn down // and replaced, pointing at the new view. - DCHECK(!view || !compositor_); + DCHECK(!view || !compositor_widget_); drag_drop_client_.reset(); [bridged_view_ clearView]; @@ -1027,9 +1040,9 @@ return false; if (ca_transaction_sync_suppressed_) return false; - if (!compositor_) + if (!compositor_widget_) return false; - return !compositor_->widget()->HasFrameOfSize(GetClientAreaSize()); + return !compositor_widget_->HasFrameOfSize(GetClientAreaSize()); } base::TimeDelta BridgedNativeWidget::PreCommitTimeout() { @@ -1104,13 +1117,13 @@ void BridgedNativeWidget::AcceleratedWidgetCALayerParamsUpdated() { // Ignore frames arriving "late" for an old size. A frame at the new size // should arrive soon. - if (!compositor_->widget()->HasFrameOfSize(GetClientAreaSize())) + if (!compositor_widget_->HasFrameOfSize(GetClientAreaSize())) return; // Update the DisplayCALayerTree with the most recent CALayerParams, to make // the content display on-screen. const gfx::CALayerParams* ca_layer_params = - compositor_->widget()->GetCALayerParams(); + compositor_widget_->GetCALayerParams(); if (ca_layer_params) display_ca_layer_tree_->UpdateCALayerTree(*ca_layer_params); @@ -1234,6 +1247,7 @@ void BridgedNativeWidget::CreateCompositor() { DCHECK(!compositor_); + DCHECK(!compositor_widget_); DCHECK(ViewsDelegate::GetInstance()); ui::ContextFactory* context_factory = @@ -1244,9 +1258,14 @@ AddCompositorSuperview(); - compositor_ = ui::RecyclableCompositorMacFactory::Get()->CreateCompositor( - context_factory, context_factory_private); - compositor_->widget()->SetNSView(this); + compositor_widget_.reset(new ui::AcceleratedWidgetMac()); + compositor_.reset(new ui::Compositor( + context_factory_private->AllocateFrameSinkId(), context_factory, + context_factory_private, GetCompositorTaskRunner(), + features::IsSurfaceSynchronizationEnabled(), + ui::IsPixelCanvasRecordingEnabled())); + compositor_->SetAcceleratedWidget(compositor_widget_->accelerated_widget()); + compositor_widget_->SetNSView(this); } void BridgedNativeWidget::InitCompositor() { @@ -1254,10 +1273,10 @@ DCHECK(layer()); float scale_factor = GetDeviceScaleFactorFromView(compositor_superview_); gfx::Size size_in_dip = GetClientAreaSize(); - compositor_->UpdateSurface(ConvertSizeToPixel(scale_factor, size_in_dip), - scale_factor); - compositor_->compositor()->SetRootLayer(layer()); - compositor_->Unsuspend(); + compositor_->SetScaleAndSize(scale_factor, + ConvertSizeToPixel(scale_factor, size_in_dip), + parent_local_surface_id_allocator_.GenerateId()); + compositor_->SetRootLayer(layer()); } void BridgedNativeWidget::DestroyCompositor() { @@ -1272,12 +1291,13 @@ } DestroyLayer(); - if (!compositor_) + if (!compositor_widget_) { + DCHECK(!compositor_); return; - compositor_->widget()->ResetNSView(); - compositor_->compositor()->SetRootLayer(nullptr); - ui::RecyclableCompositorMacFactory::Get()->RecycleCompositor( - std::move(compositor_)); + } + compositor_widget_->ResetNSView(); + compositor_.reset(); + compositor_widget_.reset(); } void BridgedNativeWidget::AddCompositorSuperview() { @@ -1320,7 +1340,13 @@ ui::CATransactionCoordinator::Get().Synchronize(); layer()->SetBounds(gfx::Rect(size_in_dip)); - compositor_->UpdateSurface(size_in_pixel, scale_factor); + + if (compositor_->size() != size_in_pixel || + compositor_->device_scale_factor() != scale_factor) { + compositor_->SetScaleAndSize( + scale_factor, size_in_pixel, + parent_local_surface_id_allocator_.GenerateId()); + } // For a translucent window, the shadow calculation needs to be carried out // after the frame from the compositor arrives. @@ -1330,7 +1356,8 @@ void BridgedNativeWidget::MaybeWaitForFrame(const gfx::Size& size_in_dip) { return; // TODO(https://crbug.com/682825): Delete this during cleanup. - if (!layer()->IsDrawn() || compositor_->widget()->HasFrameOfSize(size_in_dip)) + + if (!layer()->IsDrawn() || compositor_widget_->HasFrameOfSize(size_in_dip)) return; const int kPaintMsgTimeoutMS = 50; @@ -1346,7 +1373,7 @@ // Since the UI thread is blocked, the size shouldn't change. DCHECK(size_in_dip == GetClientAreaSize()); - if (compositor_->widget()->HasFrameOfSize(size_in_dip)) + if (compositor_widget_->HasFrameOfSize(size_in_dip)) return; // Frame arrived. } } @@ -1387,10 +1414,14 @@ void BridgedNativeWidget::UpdateLayerVisibility() { layer()->SetVisible(window_visible_); - if (window_visible_) - compositor_->Unsuspend(); - else - compositor_->Suspend(); + if (window_visible_) { + compositor_lock_.reset(); + } else if (!compositor_lock_) { + // Assume that GetCompositorLock always succeeds (if it does not, then a + // flicker may be seen). + compositor_lock_ = + compositor_->GetCompositorLock(nullptr, base::TimeDelta()); + } } } // namespace views
diff --git a/ui/views/controls/label.h b/ui/views/controls/label.h index 1d35afe..9c78b30 100644 --- a/ui/views/controls/label.h +++ b/ui/views/controls/label.h
@@ -258,7 +258,7 @@ FRIEND_TEST_ALL_PREFIXES(LabelTest, MultilineSupportedRenderText); FRIEND_TEST_ALL_PREFIXES(LabelTest, TextChangeWithoutLayout); FRIEND_TEST_ALL_PREFIXES(LabelTest, EmptyLabel); - FRIEND_TEST_ALL_PREFIXES(MDLabelTest, FocusBounds); + FRIEND_TEST_ALL_PREFIXES(LabelTest, FocusBounds); FRIEND_TEST_ALL_PREFIXES(LabelTest, MultiLineSizingWithElide); friend class LabelSelectionTest;
diff --git a/ui/views/controls/label_unittest.cc b/ui/views/controls/label_unittest.cc index e5eafe1b..d87acf7 100644 --- a/ui/views/controls/label_unittest.cc +++ b/ui/views/controls/label_unittest.cc
@@ -9,13 +9,11 @@ #include "base/command_line.h" #include "base/i18n/rtl.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/accessibility/ax_node_data.h" #include "ui/base/clipboard/clipboard.h" #include "ui/base/l10n/l10n_util.h" -#include "ui/base/ui_base_features.h" #include "ui/base/ui_base_switches.h" #include "ui/compositor/canvas_painter.h" #include "ui/events/base_event_utils.h" @@ -97,13 +95,6 @@ return clipboard_text; } -enum class SecondaryUiMode { NON_MD, MD }; - -std::string SecondaryUiModeToString( - const ::testing::TestParamInfo<SecondaryUiMode>& info) { - return info.param == SecondaryUiMode::MD ? "MD" : "NonMD"; -} - // Makes an RTL string by mapping 0..6 to [א,ב,ג,ד,ה,ו,ז]. base::string16 ToRTL(const char* ascii) { base::string16 rtl; @@ -269,31 +260,6 @@ DISALLOW_COPY_AND_ASSIGN(LabelSelectionTest); }; -// LabelTest harness that runs both with and without secondary UI set to MD. -class MDLabelTest : public LabelTest, - public ::testing::WithParamInterface<SecondaryUiMode> { - public: - MDLabelTest() {} - - // LabelTest: - void SetUp() override { - if (GetParam() == SecondaryUiMode::MD) { - scoped_feature_list_.InitAndEnableFeature(features::kSecondaryUiMd); - } else { - // Force Refresh UI to be off, since that mode implies MD secondary UI. - base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( - switches::kTopChromeMD, switches::kTopChromeMDMaterial); - scoped_feature_list_.InitAndDisableFeature(features::kSecondaryUiMd); - } - LabelTest::SetUp(); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; - - DISALLOW_COPY_AND_ASSIGN(MDLabelTest); -}; - // Crashes on Linux only. http://crbug.com/612406 #if defined(OS_LINUX) #define MAYBE_FontPropertySymbol DISABLED_FontPropertySymbol @@ -933,7 +899,7 @@ EXPECT_EQ(count, label.schedule_paint_count()); // Unchanged. } -TEST_P(MDLabelTest, FocusBounds) { +TEST_F(LabelTest, FocusBounds) { label()->SetText(ASCIIToUTF16("Example")); Link concrete_link(ASCIIToUTF16("Example")); Label* link = &concrete_link; // Allow LabelTest to call methods as friend. @@ -959,16 +925,10 @@ gfx::Size normal_link_size = link->GetPreferredSize(); link->SetFocusBehavior(View::FocusBehavior::ALWAYS); gfx::Size focusable_link_size = link->GetPreferredSize(); - if (GetParam() == SecondaryUiMode::MD) { - // Everything should match under MD since underlines indicates focus. - EXPECT_EQ(normal_label_size, normal_link_size); - EXPECT_EQ(normal_link_size, focusable_link_size); - } else { - // Otherwise, links get bigger in order to paint the focus rectangle. - EXPECT_NE(normal_link_size, focusable_link_size); - EXPECT_GT(focusable_link_size.width(), normal_link_size.width()); - EXPECT_GT(focusable_link_size.height(), normal_link_size.height()); - } + + // Everything should match since underlines indicates focus. + EXPECT_EQ(normal_label_size, normal_link_size); + EXPECT_EQ(normal_link_size, focusable_link_size); // Requesting focus doesn't change the preferred size since that would mess up // layout. @@ -1405,10 +1365,4 @@ EXPECT_FALSE(IsMenuCommandEnabled(IDS_APP_SELECT_ALL)); } -INSTANTIATE_TEST_CASE_P(, - MDLabelTest, - ::testing::Values(SecondaryUiMode::MD, - SecondaryUiMode::NON_MD), - &SecondaryUiModeToString); - } // namespace views
diff --git a/ui/views/controls/link.cc b/ui/views/controls/link.cc index f4e605a..e47a0c8 100644 --- a/ui/views/controls/link.cc +++ b/ui/views/controls/link.cc
@@ -10,7 +10,6 @@ #include "base/strings/utf_string_conversions.h" #include "ui/accessibility/ax_node_data.h" #include "ui/base/cursor/cursor.h" -#include "ui/base/material_design/material_design_controller.h" #include "ui/events/event.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/gfx/canvas.h" @@ -39,9 +38,7 @@ // static Link::FocusStyle Link::GetDefaultFocusStyle() { - return ui::MaterialDesignController::IsSecondaryUiMaterial() - ? FocusStyle::UNDERLINE - : FocusStyle::RING; + return FocusStyle::UNDERLINE; } Link::FocusStyle Link::GetFocusStyle() const {
diff --git a/ui/views/controls/styled_label_unittest.cc b/ui/views/controls/styled_label_unittest.cc index a71c62d..e79faddd 100644 --- a/ui/views/controls/styled_label_unittest.cc +++ b/ui/views/controls/styled_label_unittest.cc
@@ -9,15 +9,14 @@ #include <memory> #include <string> +#include "base/command_line.h" #include "base/i18n/base_i18n_switches.h" #include "base/macros.h" #include "base/strings/utf_string_conversions.h" #include "base/test/icu_test_util.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkColor.h" -#include "ui/base/ui_base_features.h" #include "ui/base/ui_base_switches.h" #include "ui/gfx/font_list.h" #include "ui/views/border.h" @@ -32,15 +31,6 @@ using base::ASCIIToUTF16; namespace views { -namespace { - -enum class SecondaryUiMode { NON_MD, MD }; - -std::string SecondaryUiModeToString( - const ::testing::TestParamInfo<SecondaryUiMode>& info) { - return info.param == SecondaryUiMode::MD ? "MD" : "NonMD"; -} -} // namespace class StyledLabelTest : public ViewsTestBase, public StyledLabelListener { public: @@ -70,39 +60,6 @@ DISALLOW_COPY_AND_ASSIGN(StyledLabelTest); }; -// StyledLabelTest harness that runs both with and without secondary UI set to -// MD. -class MDStyledLabelTest - : public StyledLabelTest, - public ::testing::WithParamInterface<SecondaryUiMode> { - public: - MDStyledLabelTest() {} - - // StyledLabelTest: - void SetUp() override { - if (GetParam() == SecondaryUiMode::NON_MD) { - // Force Refresh UI to be off, since that mode implies MD secondary UI. - // Must be done before ViewsTestBase::SetUp(). - base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( - switches::kTopChromeMD, switches::kTopChromeMDMaterial); - } - // This works while StyledLabelTest has no SetUp() of its own. Otherwise the - // mode should be set after ViewsTestBase::SetUp(), but before the rest of - // StyledLabelTest::SetUp(), so that StyledLabelTest::SetUp() obeys the MD - // setting. - StyledLabelTest::SetUp(); - if (GetParam() == SecondaryUiMode::MD) - scoped_feature_list_.InitAndEnableFeature(features::kSecondaryUiMd); - else - scoped_feature_list_.InitAndDisableFeature(features::kSecondaryUiMd); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; - - DISALLOW_COPY_AND_ASSIGN(MDStyledLabelTest); -}; - TEST_F(StyledLabelTest, NoWrapping) { const std::string text("This is a test block of text"); InitStyledLabel(text); @@ -255,7 +212,7 @@ static_cast<Label*>(styled()->child_at(1))->text()); } -TEST_P(MDStyledLabelTest, CreateLinks) { +TEST_F(StyledLabelTest, CreateLinks) { const std::string text("This is a test block of text."); InitStyledLabel(text); @@ -272,14 +229,9 @@ styled()->AddStyleRange(gfx::Range(12, 13), StyledLabel::RangeStyleInfo::CreateForLink()); - if (GetParam() == SecondaryUiMode::MD) { - // Insets shouldn't change under MD when links are added, since the links - // indicate focus by adding an underline instead. - EXPECT_TRUE(styled()->GetInsets().IsEmpty()); - } else { - // Now there should be a focus border because there are non-empty Links. - EXPECT_FALSE(styled()->GetInsets().IsEmpty()); - } + // Insets shouldn't change when links are added, since the links indicate + // focus by adding an underline instead. + EXPECT_TRUE(styled()->GetInsets().IsEmpty()); // Verify layout creates the right number of children. styled()->SetBounds(0, 0, 1000, 1000); @@ -287,7 +239,7 @@ EXPECT_EQ(7, styled()->child_count()); } -TEST_P(MDStyledLabelTest, DontBreakLinks) { +TEST_F(StyledLabelTest, DontBreakLinks) { const std::string text("This is a test block of text, "); const std::string link_text("and this should be a link"); InitStyledLabel(text + link_text); @@ -305,16 +257,9 @@ styled()->Layout(); ASSERT_EQ(2, styled()->child_count()); - if (GetParam() == SecondaryUiMode::MD) { - // No additional insets should be added under MD. - EXPECT_EQ(0, styled()->child_at(0)->x()); - } else { - // The label has no focus border while, when non-MD, the link (and thus - // overall styled label) does, so the label should be inset by the width of - // the focus border. - EXPECT_EQ(Link::kFocusBorderPadding, styled()->child_at(0)->x()); - } - // The Link shouldn't be offset (it grows in size under non-MD instead). + // No additional insets should be added. + EXPECT_EQ(0, styled()->child_at(0)->x()); + // The Link shouldn't be offset. EXPECT_EQ(0, styled()->child_at(1)->x()); } @@ -488,7 +433,7 @@ widget->CloseNow(); } -TEST_P(MDStyledLabelTest, StyledRangeWithTooltip) { +TEST_F(StyledLabelTest, StyledRangeWithTooltip) { const std::string text("This is a test block of text, "); const std::string tooltip_text("this should have a tooltip,"); const std::string normal_text(" this should not have a tooltip, "); @@ -522,17 +467,9 @@ ASSERT_EQ(5, styled()->child_count()); - if (GetParam() == SecondaryUiMode::MD) { - // In MD, the labels shouldn't be offset to cater for focus rings. - EXPECT_EQ(0, styled()->child_at(0)->x()); - EXPECT_EQ(0, styled()->child_at(2)->x()); - } else { - // The labels have no focus border while the link (and thus overall styled - // label) does, so the labels should be inset by the width of the focus - // border. - EXPECT_EQ(Link::kFocusBorderPadding, styled()->child_at(0)->x()); - EXPECT_EQ(Link::kFocusBorderPadding, styled()->child_at(2)->x()); - } + // The labels shouldn't be offset to cater for focus rings. + EXPECT_EQ(0, styled()->child_at(0)->x()); + EXPECT_EQ(0, styled()->child_at(2)->x()); EXPECT_EQ(styled()->child_at(0)->bounds().right(), styled()->child_at(1)->x()); @@ -776,7 +713,7 @@ styled()->child_at(0)->bounds().x()); } -TEST_P(MDStyledLabelTest, ViewsCenteredWithLinkAndCustomView) { +TEST_F(StyledLabelTest, ViewsCenteredWithLinkAndCustomView) { const std::string text("This is a test block of text, "); const std::string link_text("and this should be a link"); const std::string custom_view_text("And this is a custom view"); @@ -810,10 +747,4 @@ styled()->child_at(2)->bounds().y()); } -INSTANTIATE_TEST_CASE_P(, - MDStyledLabelTest, - ::testing::Values(SecondaryUiMode::MD, - SecondaryUiMode::NON_MD), - &SecondaryUiModeToString); - } // namespace views
diff --git a/ui/views/widget/native_widget_mac_unittest.mm b/ui/views/widget/native_widget_mac_unittest.mm index 4ad18cc..9ed62404 100644 --- a/ui/views/widget/native_widget_mac_unittest.mm +++ b/ui/views/widget/native_widget_mac_unittest.mm
@@ -103,7 +103,7 @@ const float kScaleFactor = 1.0f; ui::CALayerFrameSink* ca_layer_frame_sink = ui::CALayerFrameSink::FromAcceleratedWidget( - bridge_->compositor_->widget()->accelerated_widget()); + bridge_->compositor_widget_->accelerated_widget()); gfx::CALayerParams ca_layer_params; ca_layer_params.is_empty = false; ca_layer_params.pixel_size = size;