Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(95)

Side by Side Diff: chrome/browser/tab_contents/tab_contents.h

Issue 2370001: Store blocked cookies in the tab contents. (Closed)
Patch Set: updates Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_H_ 5 #ifndef CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_H_
6 #define CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_H_ 6 #define CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_H_
7 7
8 #include "build/build_config.h" 8 #include "build/build_config.h"
9 9
10 #include <deque> 10 #include <deque>
11 #include <map> 11 #include <map>
12 #include <set> 12 #include <set>
13 #include <string> 13 #include <string>
14 #include <vector> 14 #include <vector>
15 15
16 #include "base/basictypes.h" 16 #include "base/basictypes.h"
17 #include "base/gtest_prod_util.h" 17 #include "base/gtest_prod_util.h"
18 #include "base/scoped_ptr.h" 18 #include "base/scoped_ptr.h"
19 #include "chrome/browser/autocomplete/autocomplete_edit.h" 19 #include "chrome/browser/autocomplete/autocomplete_edit.h"
20 #include "chrome/browser/cancelable_request.h" 20 #include "chrome/browser/cancelable_request.h"
21 #include "chrome/browser/dom_ui/dom_ui_factory.h" 21 #include "chrome/browser/dom_ui/dom_ui_factory.h"
22 #include "chrome/browser/download/save_package.h" 22 #include "chrome/browser/download/save_package.h"
23 #include "chrome/browser/extensions/image_loading_tracker.h" 23 #include "chrome/browser/extensions/image_loading_tracker.h"
24 #include "chrome/browser/fav_icon_helper.h" 24 #include "chrome/browser/fav_icon_helper.h"
25 #include "chrome/browser/find_bar_controller.h" 25 #include "chrome/browser/find_bar_controller.h"
26 #include "chrome/browser/find_notification_details.h" 26 #include "chrome/browser/find_notification_details.h"
27 #include "chrome/browser/geolocation/geolocation_settings_state.h"
28 #include "chrome/browser/jsmessage_box_client.h" 27 #include "chrome/browser/jsmessage_box_client.h"
29 #include "chrome/browser/password_manager/password_manager.h" 28 #include "chrome/browser/password_manager/password_manager.h"
30 #include "chrome/browser/printing/print_view_manager.h" 29 #include "chrome/browser/printing/print_view_manager.h"
31 #include "chrome/browser/shell_dialogs.h" 30 #include "chrome/browser/shell_dialogs.h"
32 #include "chrome/browser/renderer_host/render_view_host_delegate.h" 31 #include "chrome/browser/renderer_host/render_view_host_delegate.h"
33 #include "chrome/browser/tab_contents/constrained_window.h" 32 #include "chrome/browser/tab_contents/constrained_window.h"
34 #include "chrome/browser/tab_contents/infobar_delegate.h" 33 #include "chrome/browser/tab_contents/infobar_delegate.h"
35 #include "chrome/browser/tab_contents/language_state.h" 34 #include "chrome/browser/tab_contents/language_state.h"
36 #include "chrome/browser/tab_contents/navigation_controller.h" 35 #include "chrome/browser/tab_contents/navigation_controller.h"
37 #include "chrome/browser/tab_contents/navigation_entry.h" 36 #include "chrome/browser/tab_contents/navigation_entry.h"
38 #include "chrome/browser/tab_contents/page_navigator.h" 37 #include "chrome/browser/tab_contents/page_navigator.h"
39 #include "chrome/browser/tab_contents/render_view_host_manager.h" 38 #include "chrome/browser/tab_contents/render_view_host_manager.h"
40 #include "chrome/common/content_settings.h" 39 #include "chrome/browser/tab_contents/tab_specific_content_settings.h"
41 #include "chrome/common/content_settings_types.h"
42 #include "chrome/common/extensions/url_pattern.h" 40 #include "chrome/common/extensions/url_pattern.h"
43 #include "chrome/common/navigation_types.h" 41 #include "chrome/common/navigation_types.h"
44 #include "chrome/common/net/url_request_context_getter.h" 42 #include "chrome/common/net/url_request_context_getter.h"
45 #include "chrome/common/notification_registrar.h" 43 #include "chrome/common/notification_registrar.h"
46 #include "chrome/common/property_bag.h" 44 #include "chrome/common/property_bag.h"
47 #include "chrome/common/renderer_preferences.h" 45 #include "chrome/common/renderer_preferences.h"
48 #include "chrome/common/translate_errors.h" 46 #include "chrome/common/translate_errors.h"
49 #include "gfx/native_widget_types.h" 47 #include "gfx/native_widget_types.h"
50 #include "gfx/rect.h" 48 #include "gfx/rect.h"
51 #include "net/base/load_states.h" 49 #include "net/base/load_states.h"
(...skipping 12 matching lines...) Expand all
64 62
65 namespace base { 63 namespace base {
66 class WaitableEvent; 64 class WaitableEvent;
67 } 65 }
68 66
69 67
70 namespace IPC { 68 namespace IPC {
71 class Message; 69 class Message;
72 } 70 }
73 71
72 class AutocompleteHistoryManager;
74 class AutoFillManager; 73 class AutoFillManager;
75 class BlockedPopupContainer; 74 class BlockedPopupContainer;
76 class DOMUI; 75 class DOMUI;
77 class DownloadItem; 76 class DownloadItem;
78 class Extension; 77 class Extension;
79 class AutocompleteHistoryManager; 78 class GeolocationSettingsState;
80 class LoadNotificationDetails; 79 class LoadNotificationDetails;
81 class OmniboxSearchHint; 80 class OmniboxSearchHint;
82 class PluginInstaller; 81 class PluginInstaller;
83 class Profile; 82 class Profile;
84 struct RendererPreferences; 83 struct RendererPreferences;
85 class RenderViewHost; 84 class RenderViewHost;
85 class SiteInstance;
86 class SkBitmap;
87 class TabContents;
86 class TabContentsDelegate; 88 class TabContentsDelegate;
87 class TabContentsFactory; 89 class TabContentsFactory;
88 class SkBitmap;
89 class SiteInstance;
90 class TabContents;
91 class TabContentsView; 90 class TabContentsView;
92 struct ThumbnailScore; 91 struct ThumbnailScore;
93 struct ViewHostMsg_DidPrintPage_Params; 92 struct ViewHostMsg_DidPrintPage_Params;
94 struct ViewHostMsg_FrameNavigate_Params; 93 struct ViewHostMsg_FrameNavigate_Params;
95 struct ViewHostMsg_RunFileChooser_Params; 94 struct ViewHostMsg_RunFileChooser_Params;
96 95
97 // Describes what goes in the main content area of a tab. TabContents is 96 // Describes what goes in the main content area of a tab. TabContents is
98 // the only type of TabContents, and these should be merged together. 97 // the only type of TabContents, and these should be merged together.
99 class TabContents : public PageNavigator, 98 class TabContents : public PageNavigator,
100 public NotificationObserver, 99 public NotificationObserver,
101 public RenderViewHostDelegate, 100 public RenderViewHostDelegate,
102 public RenderViewHostDelegate::BrowserIntegration, 101 public RenderViewHostDelegate::BrowserIntegration,
103 public RenderViewHostDelegate::Resource, 102 public RenderViewHostDelegate::Resource,
104 public RenderViewHostDelegate::ContentSettings,
105 public RenderViewHostManager::Delegate, 103 public RenderViewHostManager::Delegate,
106 public SelectFileDialog::Listener, 104 public SelectFileDialog::Listener,
107 public JavaScriptMessageBoxClient, 105 public JavaScriptMessageBoxClient,
108 public ImageLoadingTracker::Observer, 106 public ImageLoadingTracker::Observer,
109 public PasswordManager::Delegate { 107 public PasswordManager::Delegate,
108 public TabSpecificContentSettings::Delegate {
110 public: 109 public:
111 // Flags passed to the TabContentsDelegate.NavigationStateChanged to tell it 110 // Flags passed to the TabContentsDelegate.NavigationStateChanged to tell it
112 // what has changed. Combine them to update more than one thing. 111 // what has changed. Combine them to update more than one thing.
113 enum InvalidateTypes { 112 enum InvalidateTypes {
114 INVALIDATE_URL = 1 << 0, // The URL has changed. 113 INVALIDATE_URL = 1 << 0, // The URL has changed.
115 INVALIDATE_TAB = 1 << 1, // The favicon, app icon, or crashed 114 INVALIDATE_TAB = 1 << 1, // The favicon, app icon, or crashed
116 // state changed. 115 // state changed.
117 INVALIDATE_LOAD = 1 << 2, // The loading state has changed. 116 INVALIDATE_LOAD = 1 << 2, // The loading state has changed.
118 INVALIDATE_PAGE_ACTIONS = 1 << 3, // Page action icons have changed. 117 INVALIDATE_PAGE_ACTIONS = 1 << 3, // Page action icons have changed.
119 INVALIDATE_BOOKMARK_BAR = 1 << 4, // State of ShouldShowBookmarkBar 118 INVALIDATE_BOOKMARK_BAR = 1 << 4, // State of ShouldShowBookmarkBar
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 // entry. 251 // entry.
253 SkBitmap GetFavIcon() const; 252 SkBitmap GetFavIcon() const;
254 253
255 // Returns true if we are not using the default favicon. 254 // Returns true if we are not using the default favicon.
256 bool FavIconIsValid() const; 255 bool FavIconIsValid() const;
257 256
258 // Returns whether the favicon should be displayed. If this returns false, no 257 // Returns whether the favicon should be displayed. If this returns false, no
259 // space is provided for the favicon, and the favicon is never displayed. 258 // space is provided for the favicon, and the favicon is never displayed.
260 virtual bool ShouldDisplayFavIcon(); 259 virtual bool ShouldDisplayFavIcon();
261 260
262 // Returns whether a particular kind of content has been blocked for this
263 // page.
264 bool IsContentBlocked(ContentSettingsType content_type) const;
265
266 // Returns the GeolocationSettingsState that controls the
267 // geolocation API usage on this page.
268 const GeolocationSettingsState& geolocation_settings_state() const {
269 return geolocation_settings_state_;
270 }
271
272 // Returns a human-readable description the tab's loading state. 261 // Returns a human-readable description the tab's loading state.
273 virtual std::wstring GetStatusText() const; 262 virtual std::wstring GetStatusText() const;
274 263
275 // Return whether this tab contents is loading a resource. 264 // Return whether this tab contents is loading a resource.
276 bool is_loading() const { return is_loading_; } 265 bool is_loading() const { return is_loading_; }
277 266
278 // Returns whether this tab contents is waiting for a first-response for the 267 // Returns whether this tab contents is waiting for a first-response for the
279 // main resource of the page. This controls whether the throbber state is 268 // main resource of the page. This controls whether the throbber state is
280 // "waiting" or "loading." 269 // "waiting" or "loading."
281 bool waiting_for_response() const { return waiting_for_response_; } 270 bool waiting_for_response() const { return waiting_for_response_; }
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 // The BookmarkDragDelegate is used to forward bookmark drag and drop events 688 // The BookmarkDragDelegate is used to forward bookmark drag and drop events
700 // to extensions. 689 // to extensions.
701 virtual RenderViewHostDelegate::BookmarkDrag* GetBookmarkDragDelegate(); 690 virtual RenderViewHostDelegate::BookmarkDrag* GetBookmarkDragDelegate();
702 691
703 // It is up to callers to call SetBookmarkDragDelegate(NULL) when 692 // It is up to callers to call SetBookmarkDragDelegate(NULL) when
704 // |bookmark_drag| is deleted since this class does not take ownership of 693 // |bookmark_drag| is deleted since this class does not take ownership of
705 // |bookmark_drag|. 694 // |bookmark_drag|.
706 virtual void SetBookmarkDragDelegate( 695 virtual void SetBookmarkDragDelegate(
707 RenderViewHostDelegate::BookmarkDrag* bookmark_drag); 696 RenderViewHostDelegate::BookmarkDrag* bookmark_drag);
708 697
698 // The TabSpecificContentSettings object is used to query to blocked content
darin (slow to review) 2010/07/02 16:09:50 nit: "use to query to" -> "use to query the"
699 // state by various UI elements.
700 TabSpecificContentSettings* GetTabSpecificContentSettings() const;
701
709 // PasswordManager::Delegate implementation. 702 // PasswordManager::Delegate implementation.
710 virtual void FillPasswordForm( 703 virtual void FillPasswordForm(
711 const webkit_glue::PasswordFormDomManager::FillData& form_data); 704 const webkit_glue::PasswordFormDomManager::FillData& form_data);
712 virtual void AddSavePasswordInfoBar(PasswordFormManager* form_to_save); 705 virtual void AddSavePasswordInfoBar(PasswordFormManager* form_to_save);
713 virtual Profile* GetProfileForPasswordManager(); 706 virtual Profile* GetProfileForPasswordManager();
714 virtual bool DidLastPageLoadEncounterSSLErrors(); 707 virtual bool DidLastPageLoadEncounterSSLErrors();
715 708
716 private: 709 private:
717 friend class NavigationController; 710 friend class NavigationController;
718 // Used to access the child_windows_ (ConstrainedWindowList) for testing 711 // Used to access the child_windows_ (ConstrainedWindowList) for testing
(...skipping 13 matching lines...) Expand all
732 #elif defined(TOOLKIT_USES_GTK) 725 #elif defined(TOOLKIT_USES_GTK)
733 friend class TabContentsViewGtk; 726 friend class TabContentsViewGtk;
734 #endif 727 #endif
735 728
736 // So InterstitialPage can access SetIsLoading. 729 // So InterstitialPage can access SetIsLoading.
737 friend class InterstitialPage; 730 friend class InterstitialPage;
738 731
739 // TODO(brettw) TestTabContents shouldn't exist! 732 // TODO(brettw) TestTabContents shouldn't exist!
740 friend class TestTabContents; 733 friend class TestTabContents;
741 734
742 // Resets the |content_blocked_| array.
743 void ClearBlockedContentSettings();
744
745 // Changes the IsLoading state and notifies delegate as needed 735 // Changes the IsLoading state and notifies delegate as needed
746 // |details| is used to provide details on the load that just finished 736 // |details| is used to provide details on the load that just finished
747 // (but can be null if not applicable). Can be overridden. 737 // (but can be null if not applicable). Can be overridden.
748 void SetIsLoading(bool is_loading, 738 void SetIsLoading(bool is_loading,
749 LoadNotificationDetails* details); 739 LoadNotificationDetails* details);
750 740
751 // Adds the incoming |new_contents| to the |blocked_popups_| container. 741 // Adds the incoming |new_contents| to the |blocked_popups_| container.
752 void AddPopup(TabContents* new_contents, 742 void AddPopup(TabContents* new_contents,
753 const gfx::Rect& initial_pos); 743 const gfx::Rect& initial_pos);
754 744
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 815
826 // Helper functions for sending notifications. 816 // Helper functions for sending notifications.
827 void NotifySwapped(); 817 void NotifySwapped();
828 void NotifyConnected(); 818 void NotifyConnected();
829 void NotifyDisconnected(); 819 void NotifyDisconnected();
830 820
831 // If params has a searchable form, this tries to create a new keyword. 821 // If params has a searchable form, this tries to create a new keyword.
832 void GenerateKeywordIfNecessary( 822 void GenerateKeywordIfNecessary(
833 const ViewHostMsg_FrameNavigate_Params& params); 823 const ViewHostMsg_FrameNavigate_Params& params);
834 824
825 // ContentBlockedDelegate::Delegate implementation.
826 virtual void OnContentSettingsChange();
827
835 // RenderViewHostDelegate ---------------------------------------------------- 828 // RenderViewHostDelegate ----------------------------------------------------
836 829
837 // RenderViewHostDelegate::BrowserIntegration implementation. 830 // RenderViewHostDelegate::BrowserIntegration implementation.
838 virtual void OnUserGesture(); 831 virtual void OnUserGesture();
839 virtual void OnFindReply(int request_id, 832 virtual void OnFindReply(int request_id,
840 int number_of_matches, 833 int number_of_matches,
841 const gfx::Rect& selection_rect, 834 const gfx::Rect& selection_rect,
842 int active_match_ordinal, 835 int active_match_ordinal,
843 bool final_update); 836 bool final_update);
844 virtual void GoToEntryAtOffset(int offset); 837 virtual void GoToEntryAtOffset(int offset);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
877 virtual void DidDisplayInsecureContent(); 870 virtual void DidDisplayInsecureContent();
878 virtual void DidRunInsecureContent(const std::string& security_origin); 871 virtual void DidRunInsecureContent(const std::string& security_origin);
879 virtual void DidFailProvisionalLoadWithError( 872 virtual void DidFailProvisionalLoadWithError(
880 RenderViewHost* render_view_host, 873 RenderViewHost* render_view_host,
881 bool is_main_frame, 874 bool is_main_frame,
882 int error_code, 875 int error_code,
883 const GURL& url, 876 const GURL& url,
884 bool showing_repost_interstitial); 877 bool showing_repost_interstitial);
885 virtual void DocumentLoadedInFrame(); 878 virtual void DocumentLoadedInFrame();
886 879
887 // RenderViewHostDelegate::ContentSettings implementation.
888 virtual void OnContentBlocked(ContentSettingsType type);
889 virtual void OnGeolocationPermissionSet(const GURL& requesting_origin,
890 bool allowed);
891
892 // RenderViewHostDelegate implementation. 880 // RenderViewHostDelegate implementation.
893 virtual RenderViewHostDelegate::View* GetViewDelegate(); 881 virtual RenderViewHostDelegate::View* GetViewDelegate();
894 virtual RenderViewHostDelegate::RendererManagement* 882 virtual RenderViewHostDelegate::RendererManagement*
895 GetRendererManagementDelegate(); 883 GetRendererManagementDelegate();
896 virtual RenderViewHostDelegate::BrowserIntegration* 884 virtual RenderViewHostDelegate::BrowserIntegration*
897 GetBrowserIntegrationDelegate(); 885 GetBrowserIntegrationDelegate();
898 virtual RenderViewHostDelegate::Resource* GetResourceDelegate(); 886 virtual RenderViewHostDelegate::Resource* GetResourceDelegate();
899 virtual RenderViewHostDelegate::ContentSettings* GetContentSettingsDelegate(); 887 virtual RenderViewHostDelegate::ContentSettings* GetContentSettingsDelegate();
900 virtual RenderViewHostDelegate::Save* GetSaveDelegate(); 888 virtual RenderViewHostDelegate::Save* GetSaveDelegate();
901 virtual RenderViewHostDelegate::Printing* GetPrintingDelegate(); 889 virtual RenderViewHostDelegate::Printing* GetPrintingDelegate();
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1091 1079
1092 // Dialog box used for choosing files to upload from file form fields. 1080 // Dialog box used for choosing files to upload from file form fields.
1093 scoped_refptr<SelectFileDialog> select_file_dialog_; 1081 scoped_refptr<SelectFileDialog> select_file_dialog_;
1094 1082
1095 // Cached web app info data. 1083 // Cached web app info data.
1096 webkit_glue::WebApplicationInfo web_app_info_; 1084 webkit_glue::WebApplicationInfo web_app_info_;
1097 1085
1098 // Cached web app icon. 1086 // Cached web app icon.
1099 SkBitmap app_icon_; 1087 SkBitmap app_icon_;
1100 1088
1089 // RenderViewHost::ContentSettingsDelegate.
1090 scoped_ptr<TabSpecificContentSettings> content_settings_delegate_;
1091
1101 // Data for loading state ---------------------------------------------------- 1092 // Data for loading state ----------------------------------------------------
1102 1093
1103 // Indicates whether we're currently loading a resource. 1094 // Indicates whether we're currently loading a resource.
1104 bool is_loading_; 1095 bool is_loading_;
1105 1096
1106 // Indicates if the tab is considered crashed. 1097 // Indicates if the tab is considered crashed.
1107 bool is_crashed_; 1098 bool is_crashed_;
1108 1099
1109 // See waiting_for_response() above. 1100 // See waiting_for_response() above.
1110 bool waiting_for_response_; 1101 bool waiting_for_response_;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1143 1134
1144 // Character encoding. TODO(jungshik) : convert to std::string 1135 // Character encoding. TODO(jungshik) : convert to std::string
1145 std::string encoding_; 1136 std::string encoding_;
1146 1137
1147 // Object that holds any blocked popups frmo the current page. 1138 // Object that holds any blocked popups frmo the current page.
1148 BlockedPopupContainer* blocked_popups_; 1139 BlockedPopupContainer* blocked_popups_;
1149 1140
1150 // TODO(pkasting): Hack to try and fix Linux browser tests. 1141 // TODO(pkasting): Hack to try and fix Linux browser tests.
1151 bool dont_notify_render_view_; 1142 bool dont_notify_render_view_;
1152 1143
1153 // Stores which content setting types actually have blocked content.
1154 bool content_blocked_[CONTENT_SETTINGS_NUM_TYPES];
1155
1156 // True if this is a secure page which displayed insecure content. 1144 // True if this is a secure page which displayed insecure content.
1157 bool displayed_insecure_content_; 1145 bool displayed_insecure_content_;
1158 1146
1159 // Data for shelves and stuff ------------------------------------------------ 1147 // Data for shelves and stuff ------------------------------------------------
1160 1148
1161 // Delegates for InfoBars associated with this TabContents. 1149 // Delegates for InfoBars associated with this TabContents.
1162 std::vector<InfoBarDelegate*> infobar_delegates_; 1150 std::vector<InfoBarDelegate*> infobar_delegates_;
1163 1151
1164 // Data for find in page ----------------------------------------------------- 1152 // Data for find in page -----------------------------------------------------
1165 1153
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1267 base::TimeTicks tab_close_start_time_; 1255 base::TimeTicks tab_close_start_time_;
1268 1256
1269 // Contextual information to be used for requests created here. 1257 // Contextual information to be used for requests created here.
1270 // Can be NULL in which case we defer to the request context from the 1258 // Can be NULL in which case we defer to the request context from the
1271 // profile 1259 // profile
1272 scoped_refptr<URLRequestContextGetter> request_context_; 1260 scoped_refptr<URLRequestContextGetter> request_context_;
1273 1261
1274 // Information about the language the page is in and has been translated to. 1262 // Information about the language the page is in and has been translated to.
1275 LanguageState language_state_; 1263 LanguageState language_state_;
1276 1264
1277 // Manages information about Geolocation API usage in this page.
1278 GeolocationSettingsState geolocation_settings_state_;
1279
1280 // See description above setter. 1265 // See description above setter.
1281 bool closed_by_user_gesture_; 1266 bool closed_by_user_gesture_;
1282 1267
1283 // --------------------------------------------------------------------------- 1268 // ---------------------------------------------------------------------------
1284 1269
1285 DISALLOW_COPY_AND_ASSIGN(TabContents); 1270 DISALLOW_COPY_AND_ASSIGN(TabContents);
1286 }; 1271 };
1287 1272
1288 #endif // CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_H_ 1273 #endif // CHROME_BROWSER_TAB_CONTENTS_TAB_CONTENTS_H_
OLDNEW
« no previous file with comments | « chrome/browser/renderer_host/resource_message_filter.cc ('k') | chrome/browser/tab_contents/tab_contents.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698