@@ -112,9 +112,128 @@ void GetCurrentAllowlist()
112112 }
113113}
114114```
115+ ## Register for sensitivity label change
116+
117+ ``` cpp
118+ AppWindow* m_appWindow;
119+ wil::com_ptr<ICoreWebView2> m_webView;
120+ EventRegistrationToken m_sensitivityLabelChangedToken = {};
121+
122+ void RegisterForSensitivityLabelChange ()
123+ {
124+ auto m_webView32 = m_webView.try_query<ICoreWebView2_32>();
125+ if (m_webView32)
126+ {
127+ CHECK_FAILURE(m_webView32->add_SensitivityLabelChanged(
128+ Callback<ICoreWebView2SensitivityLabelChangedEventHandler >(
129+ [ this] (ICoreWebView2* sender, ICoreWebView2SensitivityLabelEventArgs* args)
130+ -> HRESULT
131+ {
132+ std::wstring labelsString;
133+ COREWEBVIEW2_SENSITIVITY_LABEL_STATE sensitivityState;
134+ CHECK_FAILURE(args->get_SensitivityState(&sensitivityState));
135+
136+ if (sensitivityState == COREWEBVIEW2_SENSITIVITY_LABEL_STATE_NONE ||
137+ sensitivityState == COREWEBVIEW2_SENSITIVITY_LABEL_STATE_UNDETERMINED)
138+ {
139+ labelsString = L"<no labels>";
140+ }
141+ switch (sensitivityState)
142+ {
143+ case COREWEBVIEW2_SENSITIVITY_LABEL_STATE_UNDETERMINED:
144+ labelsString = L"<Labels undetermined>";
145+ break;
146+
147+ case COREWEBVIEW2_SENSITIVITY_LABEL_STATE_DETERMINED:
148+ labelsString = L"<Labels determined>";
149+ break;
150+
151+ default:
152+ labelsString = L"<No sensitivity state>";
153+ break;
154+ }
155+
156+ if(sensitivityState == COREWEBVIEW2_SENSITIVITY_LABEL_STATE_DETERMINED)
157+ {
158+ Microsoft::WRL::ComPtr<ICoreWebView2SensitivityLabelCollectionView> sensitivityLabelsCollection;
159+ CHECK_FAILURE (args->get_SensitivityLabel(&sensitivityLabelsCollection));
160+
161+ // Get the count of labels
162+ UINT32 labelCount = 0;
163+ CHECK_FAILURE (sensitivityLabelsCollection->get_Count(&labelCount));
164+
165+
166+ if (labelCount == 0)
167+ {
168+ labelsString = L"No label present";
169+ }
170+ else
171+ {
172+ for (UINT32 i = 0; i < labelCount; ++i)
173+ {
174+ Microsoft::WRL::ComPtr<ICoreWebView2SensitivityLabel> sensitivityLabel;
175+ CHECK_FAILURE (sensitivityLabelsCollection->GetValueAtIndex(i, &sensitivityLabel));
176+
177+ // Get the label type
178+ COREWEBVIEW2_SENSITIVITY_LABEL_TYPE labelType;
179+ CHECK_FAILURE (sensitivityLabel->GetLabelType(&labelType));
180+
181+ if (i > 0)
182+ {
183+ labelsString += L", ";
184+ }
185+
186+ // Handle different label types
187+ switch (labelType)
188+ {
189+ case COREWEBVIEW2_SENSITIVITY_LABEL_TYPE_MIP:
190+ {
191+ Microsoft::WRL::ComPtr<ICoreWebView2SensitivityLabelMip> microsoftLabel;
192+ if (SUCCEEDED(sensitivityLabel.As(µsoftLabel)))
193+ {
194+ wil::unique_cotaskmem_string labelId;
195+ wil::unique_cotaskmem_string organizationId;
196+ CHECK_FAILURE (microsoftLabel->get_LabelId(&labelId));
197+ CHECK_FAILURE(microsoftLabel->get_OrganizationId(&organizationId));
198+
199+ labelsString += L"Microsoft Label (ID: " +
200+ std::wstring (labelId.get() ? labelId.get() : L"<empty >") +
201+ L", Org: " +
202+ std::wstring(organizationId.get() ? organizationId.get() : L"<empty >") +
203+ L")";
204+ }
205+ break;
206+ }
207+ default:
208+ labelsString += L"Unknown Label";
209+ break;
210+ }
211+ }
212+ }
213+ }
214+
215+ // Show the sensitivity labels in a popup dialog
216+ RunAsync ([ this, labelsString] ( ) {
217+ MessageBox(
218+ m_appWindow,
219+ labelsString,
220+ L"Sensitivity Label State", MB_OK);
221+ });
222+
223+ return S_OK;
224+ })
225+ .Get(),
226+ &m_sensitivityLabelChangedToken));
227+ }
228+
229+ }
230+
231+ ```
115232
116233# API Details
117234
235+ ## Allow listing
236+
118237```
119238[uuid(764ffcc6-b341-5307-8ca4-58face289427), object, pointer_default(unique)]
120239interface ICoreWebView2StagingEnvironment15 : IUnknown {
@@ -153,3 +272,94 @@ namespace Microsoft.Web.WebView2.Core
153272 }
154273}
155274```
275+ ## Sensitivity label change event
276+ ```
277+ /// Enum for sensitivity label State.
278+ [v1_enum]
279+ typedef enum COREWEBVIEW2_SENSITIVITY_LABEL_STATE {
280+ /// There are no allow listed pages loaded that report sensitivity label
281+ COREWEBVIEW2_SENSITIVITY_LABEL_STATE_NONE,
282+ /// There are allow listed pages in the WebView2 and the sensitivity label is not determined yet.
283+ COREWEBVIEW2_SENSITIVITY_LABEL_STATE_UNDETERMINED,
284+ /// There are allow listed pages in the WebView2 and the sensitivity label is determined.
285+ COREWEBVIEW2_SENSITIVITY_LABEL_STATE_DETERMINED,
286+ } COREWEBVIEW2_SENSITIVITY_LABEL_STATE;
287+
288+ /// Enum for sensitivity label types.
289+ [v1_enum]
290+ typedef enum COREWEBVIEW2_SENSITIVITY_LABEL_TYPE {
291+ /// Unknown or unsupported label type.
292+ COREWEBVIEW2_SENSITIVITY_LABEL_TYPE_UNKNOWN,
293+ /// Microsoft Information Protection label.
294+ COREWEBVIEW2_SENSITIVITY_LABEL_TYPE_MIP,
295+ } COREWEBVIEW2_SENSITIVITY_LABEL_TYPE;
296+
297+ /// Base interface for all sensitivity label types.
298+ [uuid(9112ece5-d54d-5d16-a595-275ae574c287), object, pointer_default(unique)]
299+ interface ICoreWebView2StagingSensitivityLabel : IUnknown {
300+ /// Gets the type of this sensitivity label.
301+ HRESULT GetLabelType(
302+ [out, retval] COREWEBVIEW2_SENSITIVITY_LABEL_TYPE* value);
303+
304+
305+ }
306+
307+
308+ /// Interface for MIP Sensitivity Label with label ID and organization ID.
309+ [uuid(1a562888-3031-5375-b8c5-8afd573e79c8), object, pointer_default(unique)]
310+ interface ICoreWebView2StagingMipSensitivityLabel : IUnknown {
311+ /// The string representing the label ID.
312+ ///
313+ /// The caller must free the returned string with `CoTaskMemFree`. See
314+ /// [API Conventions](/microsoft-edge/webview2/concepts/win32-api-conventions#strings).
315+ [propget] HRESULT LabelId([out, retval] LPWSTR* value);
316+
317+
318+ /// The string representing the organization ID.
319+ ///
320+ /// The caller must free the returned string with `CoTaskMemFree`. See
321+ /// [API Conventions](/microsoft-edge/webview2/concepts/win32-api-conventions#strings).
322+ [propget] HRESULT OrganizationId([out, retval] LPWSTR* value);
323+
324+ }
325+
326+ /// A collection of ICoreWebView2StagingSensitivityLabel.
327+ [uuid(2cb85219-0878-5f38-b7e9-769fab6ff887), object, pointer_default(unique)]
328+ interface ICoreWebView2StagingSensitivityLabelCollectionView : IUnknown {
329+ /// The number of elements contained in the collection.
330+ [propget] HRESULT Count([out, retval] UINT32* value);
331+
332+ /// Gets the element at the given index.
333+ HRESULT GetValueAtIndex([in] UINT32 index, [out, retval] ICoreWebView2StagingSensitivityLabel** value);
334+ }
335+
336+
337+ /// Event args for the `SensitivityLabelChanged` event.
338+ [uuid(36de2060-e013-5b03-939b-117d08d0abd5), object, pointer_default(unique)]
339+ interface ICoreWebView2StagingSensitivityLabelEventArgs : IUnknown {
340+ /// The vector of Sensitivity Labels associated with the current document.
341+ [propget] HRESULT SensitivityLabels([out, retval] ICoreWebView2StagingSensitivityLabelCollectionView** value);
342+
343+
344+ /// The state of the sensitivity label.
345+ [propget] HRESULT SensitivityState([out, retval] COREWEBVIEW2_SENSITIVITY_LABEL_STATE* value);
346+
347+ }
348+
349+ /// A continuation of the ICoreWebView2 interface to notify changes in
350+ /// web content sensitivity label.
351+ [uuid(ac4543d5-f466-5622-8b3b-24d3b195525c), object, pointer_default(unique)]
352+ interface ICoreWebView2Staging32 : IUnknown {
353+ /// Adds an event handler for the `SensitivityLabelChanged` event.
354+ /// This event is raised when the web content's sensitivity label changes.
355+ HRESULT add_SensitivityLabelChanged(
356+ [in] ICoreWebView2StagingSensitivityLabelChangedEventHandler* eventHandler,
357+ [out] EventRegistrationToken* token);
358+
359+ /// Removes an event handler previously added with `add_SensitivityLabelChanged`.
360+ HRESULT remove_SensitivityLabelChanged(
361+ [in] EventRegistrationToken token);
362+
363+
364+ }
365+ ```
0 commit comments