sw/qa/uitest/ui/misc/misc.py      |    9 +++++----
 sw/source/uibase/wrtsh/wrtsh1.cxx |   27 +++++++++++++++------------
 2 files changed, 20 insertions(+), 16 deletions(-)

New commits:
commit 352e564dd1de09a04a2fb1f9b40780b305da7c80
Author:     Attila Szűcs <attila.sz...@collabora.com>
AuthorDate: Fri Jul 12 14:51:41 2024 +0200
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Fri Jul 19 21:26:28 2024 +0200

    SW: random ID for new content controls
    
    Make the generated unique ID random for new content controls.
    This way if we copy paste them from different documents,
    they may still be unique.
    
    Change-Id: I2adb6577e08b5798ae88a63b6178352aa76280d6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170773
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sw/qa/uitest/ui/misc/misc.py b/sw/qa/uitest/ui/misc/misc.py
index 8af00054a5e6..94fd60bff16f 100644
--- a/sw/qa/uitest/ui/misc/misc.py
+++ b/sw/qa/uitest/ui/misc/misc.py
@@ -44,9 +44,10 @@ class TestTmpdlg(UITestCase):
                 type_text(xTag, "new tag ")
                 xAdd = xDialog.getChild("add")
 
-                xId = xDialog.getChild("idspinbutton")
-                self.assertEqual(get_state_as_dict(xId)['Text'], "0")
-                type_text(xId, "429496729") # added in front, making it 
4294967290
+                # Id is a random number now, not 0.
+                # xId = xDialog.getChild("idspinbutton")
+                # self.assertEqual(get_state_as_dict(xId)['Text'], "0")
+                # type_text(xId, "429496729") # added in front, making it 
4294967290
 
                 xTabIndex = xDialog.getChild("tabindexspinbutton")
                 self.assertEqual(get_state_as_dict(xTabIndex)['Text'], "1")
@@ -67,7 +68,7 @@ class TestTmpdlg(UITestCase):
             self.assertEqual(listItems[1][1].Value, "foo-bar")
             self.assertEqual(contentControl.Alias, "new alias my alias")
             self.assertEqual(contentControl.Tag, "new tag my tag")
-            self.assertEqual(contentControl.Id, -6) # stored as signed, 
displays as unsigned
+            # self.assertEqual(contentControl.Id, -6) # stored as signed, 
displays as unsigned
             self.assertEqual(contentControl.TabIndex, 4294967295) # stored as 
unsigned, displays as signed
 
 
diff --git a/sw/source/uibase/wrtsh/wrtsh1.cxx 
b/sw/source/uibase/wrtsh/wrtsh1.cxx
index 65d725c6872a..585203eed017 100644
--- a/sw/source/uibase/wrtsh/wrtsh1.cxx
+++ b/sw/source/uibase/wrtsh/wrtsh1.cxx
@@ -42,6 +42,7 @@
 #include <vcl/graph.hxx>
 #include <unotools/charclass.hxx>
 #include <comphelper/storagehelper.hxx>
+#include <comphelper/random.hxx>
 #include <svx/svxdlg.hxx>
 #include <svx/extrusionbar.hxx>
 #include <svx/fontworkbar.hxx>
@@ -1076,25 +1077,27 @@ void 
SwWrtShell::InsertContentControl(SwContentControlType eType)
 
     auto pContentControl = std::make_shared<SwContentControl>(nullptr);
 
-    // Search for a non used ID for the new ContentControl, to make it unique
+    // Make Random ID.. cehcek if it is unique
+    // warning: possible infinite loop if there would be billions of content 
controls.
     SwContentControlManager& pManager = GetDoc()->GetContentControlManager();
     size_t nCCCount = pManager.GetCount();
-    std::vector<bool> aIdMap(nCCCount);
-    aIdMap.resize(nCCCount, false);
-    size_t nIdToCheck;
-    for (nIdToCheck = 0; nIdToCheck < nCCCount; nIdToCheck++)
+    sal_Int32 nIdToCheck;
+    nIdToCheck
+        = comphelper::rng::uniform_uint_distribution(1, 
std::numeric_limits<sal_Int32>::max());
+    size_t nIdx = 0;
+    while (nIdx < nCCCount)
     {
         sal_Int32 nID
-            = 
pManager.UnsortedGet(nIdToCheck)->GetContentControl().GetContentControl()->GetId();
-        if (nID >= 0 && nID < static_cast<sal_Int32>(nCCCount))
+            = 
pManager.UnsortedGet(nIdx)->GetContentControl().GetContentControl()->GetId();
+        if (nID == nIdToCheck)
         {
-            aIdMap[nID] = true;
+            nIdToCheck = comphelper::rng::uniform_uint_distribution(
+                1, std::numeric_limits<sal_Int32>::max());
+            nIdx = 0;
         }
+        else
+            nIdx++;
     }
-    // Find the first ID that was not used
-    nIdToCheck = 0;
-    while (nIdToCheck < nCCCount && aIdMap[nIdToCheck])
-        nIdToCheck++;
     pContentControl->SetId(nIdToCheck);
 
     OUString aPlaceholder;

Reply via email to