// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_UNIQUE_NAME_UNIQUE_NAME_HELPER_H_ #define THIRD_PARTY_BLINK_PUBLIC_COMMON_UNIQUE_NAME_UNIQUE_NAME_HELPER_H_ #include <string> #include <string_view> #include <vector> #include "base/memory/raw_ptr.h" #include "third_party/blink/public/common/common_export.h" namespace blink { // Frame helper that manages the details of generating a quasi-stable unique // name for the frame. The name is unique within a page, and is used for: // - matching up session history items with recreated frames // - web test results // // Description of the current unique name format // --------------------------------------------- // Changing the format of unique name has a high cost, because it breaks // backwards compatibility of session history (which stores unique names // generated in the past on user's disk). The evolution of unique name in a // mostly backwards-compatible way has resulted in the rather baroque format... // // uniqueName ::= <nullForMainFrame> | <assignedName> | <generatedName> // Note: generatedName is used if assignedName is non-unique / conflicts with // other frame's unique name. // // assignedName ::= value of iframe's name attribute // or value assigned to window.name // Note: The name must be assigned *before* the first real commit: afterwards, // the unique name is immutable. // // generatedName ::= oldGeneratedName newUniqueSuffix? // Note: newUniqueSuffix is only present if oldGeneratedName is not unique. // // oldGeneratedName ::= "<!--framePath //" ancestorChain // "/<!--frame" childCount "-->-->" // Note: oldGeneratedName is generated by the internal GenerateCandidate() // method. // // childCount ::= current number of siblings // // ancestorChain ::= concatenated unique names of ancestor chain, // terminated on the first ancestor (if any) starting with // "<!--framePath"; each ancestor's unique name is // separated by "/" character // Note: Two examples are provided below, with each portion of the name from a // distinct ancestor annotated. // // Example ancestor chain #1: // "grandparent/parent" // | #1 | #2 | // Example ancestor chain #2: // "<!--framePath //foo/bar/<!--frame42-->-->/blah/foobar" // | #1 | #2 | #3 | // // newUniqueSuffix ::= "<!--framePosition" framePosition "/" retryNumber "-->" // // framePosition ::= "-" numberOfSiblingsBeforeChild // [ framePosition-forParent? ] // // retryNumber ::= smallest non-negative integer resulting in unique name class BLINK_COMMON_EXPORT UniqueNameHelper { … }; } // namespace blink #endif // THIRD_PARTY_BLINK_PUBLIC_COMMON_UNIQUE_NAME_UNIQUE_NAME_HELPER_H_