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 6dada45..3d3e63ee 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -64,6 +64,7 @@
     public static final String NO_CREDIT_CARD_ABORT = "NoCreditCardAbort";
     public static final String NTP_FAKE_OMNIBOX_TEXT = "NTPFakeOmniboxText";
     public static final String NTP_FOREIGN_SESSIONS_SUGGESTIONS = "NTPForeignSessionsSuggestions";
+    public static final String NTP_OFFLINE_PAGES_FEATURE_NAME = "NTPOfflinePages";
     public static final String NTP_SNIPPETS = "NTPSnippets";
     public static final String NTP_SNIPPETS_INCREASED_VISIBILITY = "NTPSnippetsIncreasedVisibility";
     public static final String NTP_SNIPPETS_SAVE_TO_OFFLINE = "NTPSaveToOffline";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index 2bf9e668..83b9b37 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -1250,7 +1250,7 @@
         } else if (id == R.id.enter_vr_id) {
             mVrShellDelegate.enterVRIfNecessary();
         } else if (id == R.id.content_suggestions_standalone_ui) {
-            ContentSuggestionsActivity.launch(getApplicationContext());
+            ContentSuggestionsActivity.launch(this);
         } else {
             return super.onMenuOrKeyboardAction(id, fromMenu);
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gsa/GSAAccountChangeListener.java b/chrome/android/java/src/org/chromium/chrome/browser/gsa/GSAAccountChangeListener.java
index 67bf96e5..b16bada 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/gsa/GSAAccountChangeListener.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/gsa/GSAAccountChangeListener.java
@@ -61,6 +61,9 @@
             public void onReceive(Context context, Intent intent) {
                 if (!ACCOUNT_UPDATE_BROADCAST_INTENT.equals(intent.getAction())) return;
                 String accountName = intent.getStringExtra(BROADCAST_INTENT_ACCOUNT_NAME_EXTRA);
+                RecordHistogram.recordEnumeratedHistogram(GSAServiceClient.ACCOUNT_CHANGE_HISTOGRAM,
+                        GSAServiceClient.ACCOUNT_CHANGE_SOURCE_BROADCAST,
+                        GSAServiceClient.ACCOUNT_CHANGE_SOURCE_COUNT);
                 GSAState.getInstance(context.getApplicationContext()).setGsaAccount(accountName);
             }
         };
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gsa/GSAServiceClient.java b/chrome/android/java/src/org/chromium/chrome/browser/gsa/GSAServiceClient.java
index 3f34f3a..6983bca 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/gsa/GSAServiceClient.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/gsa/GSAServiceClient.java
@@ -53,6 +53,12 @@
     @VisibleForTesting
     static final int INVALID_PSS = -1;
 
+    static final String ACCOUNT_CHANGE_HISTOGRAM = "Search.GsaAccountChangeNotificationSource";
+    // For the histogram above. Append-only.
+    static final int ACCOUNT_CHANGE_SOURCE_SERVICE = 0;
+    static final int ACCOUNT_CHANGE_SOURCE_BROADCAST = 1;
+    static final int ACCOUNT_CHANGE_SOURCE_COUNT = 2;
+
     private static boolean sHasRecordedPss;
     /** Messenger to handle incoming messages from the service */
     private final Messenger mMessenger;
@@ -82,6 +88,8 @@
             if (mService == null) return;
             final Bundle bundle = (Bundle) msg.obj;
             String account = mGsaHelper.getGSAAccountFromState(bundle.getByteArray(KEY_GSA_STATE));
+            RecordHistogram.recordEnumeratedHistogram(ACCOUNT_CHANGE_HISTOGRAM,
+                    ACCOUNT_CHANGE_SOURCE_SERVICE, ACCOUNT_CHANGE_SOURCE_COUNT);
             GSAState.getInstance(mContext.getApplicationContext()).setGsaAccount(account);
             if (sHasRecordedPss) {
                 if (mOnMessageReceived != null) mOnMessageReceived.onResult(bundle);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gsa/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/gsa/OWNERS
new file mode 100644
index 0000000..8b7b787
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/gsa/OWNERS
@@ -0,0 +1 @@
+lizeb@chromium.org
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContextMenuManager.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContextMenuManager.java
index fa83ec0..101a74c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContextMenuManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContextMenuManager.java
@@ -14,9 +14,9 @@
 import android.view.View;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.snippets.SnippetsConfig;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegate;
 import org.chromium.ui.base.WindowAndroid.OnCloseContextMenuListener;
 import org.chromium.ui.mojom.WindowOpenDisposition;
 
@@ -43,7 +43,7 @@
     public static final int ID_REMOVE = 4;
 
     private final Activity mActivity;
-    private final NewTabPageManager mManager;
+    private final SuggestionsNavigationDelegate mNavigationDelegate;
     private final TouchDisableableView mOuterView;
     private boolean mContextMenuOpen;
 
@@ -71,10 +71,10 @@
     /** Interface for a view that can be set to stop responding to touches. */
     public interface TouchDisableableView { void setTouchEnabled(boolean enabled); }
 
-    public ContextMenuManager(Activity activity, NewTabPageManager newTabPageManager,
+    public ContextMenuManager(Activity activity, SuggestionsNavigationDelegate navigationDelegate,
             TouchDisableableView outerView) {
         mActivity = activity;
-        mManager = newTabPageManager;
+        mNavigationDelegate = navigationDelegate;
         mOuterView = outerView;
     }
 
@@ -140,11 +140,11 @@
 
         switch (itemId) {
             case ID_OPEN_IN_NEW_WINDOW:
-                return mManager.isOpenInNewWindowEnabled();
+                return mNavigationDelegate.isOpenInNewWindowEnabled();
             case ID_OPEN_IN_NEW_TAB:
                 return true;
             case ID_OPEN_IN_INCOGNITO_TAB:
-                return mManager.isOpenInIncognitoEnabled();
+                return mNavigationDelegate.isOpenInIncognitoEnabled();
             case ID_SAVE_FOR_OFFLINE: {
                 if (!SnippetsConfig.isSaveToOfflineEnabled()) return false;
                 String itemUrl = delegate.getUrl();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
index c6cc0ea..75c3f19 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
@@ -9,9 +9,7 @@
 import android.graphics.Canvas;
 import android.graphics.Point;
 import android.graphics.Rect;
-import android.net.Uri;
 import android.os.Build;
-import android.os.SystemClock;
 import android.support.v4.view.ViewCompat;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
@@ -19,12 +17,9 @@
 import android.view.View;
 
 import org.chromium.base.ApiCompatibilityUtils;
-import org.chromium.base.Callback;
 import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
-import org.chromium.base.ObserverList;
-import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
@@ -34,28 +29,15 @@
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.NativePage;
 import org.chromium.chrome.browser.UrlConstants;
-import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
 import org.chromium.chrome.browser.compositor.layouts.content.InvalidationAwareThumbnailProvider;
 import org.chromium.chrome.browser.download.DownloadManagerService;
-import org.chromium.chrome.browser.download.DownloadUtils;
-import org.chromium.chrome.browser.favicon.FaviconHelper;
-import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback;
-import org.chromium.chrome.browser.favicon.FaviconHelper.IconAvailabilityCallback;
-import org.chromium.chrome.browser.favicon.LargeIconBridge;
-import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback;
 import org.chromium.chrome.browser.metrics.StartupMetrics;
-import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
 import org.chromium.chrome.browser.ntp.LogoBridge.Logo;
 import org.chromium.chrome.browser.ntp.LogoBridge.LogoObserver;
 import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
-import org.chromium.chrome.browser.ntp.snippets.KnownCategories;
-import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
 import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge;
 import org.chromium.chrome.browser.ntp.snippets.SnippetsConfig;
 import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource;
-import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
-import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
-import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.profiles.MostVisitedSites;
 import org.chromium.chrome.browser.profiles.MostVisitedSites.MostVisitedURLsObserver;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -64,27 +46,25 @@
 import org.chromium.chrome.browser.snackbar.Snackbar;
 import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController;
 import org.chromium.chrome.browser.suggestions.SuggestionsMetricsReporter;
+import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegate;
+import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegateImpl;
+import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegateImpl;
 import org.chromium.chrome.browser.sync.SyncSessionsMetrics;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabObserver;
 import org.chromium.chrome.browser.tabmodel.TabModel;
-import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.TabModelUtils;
-import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
 import org.chromium.chrome.browser.util.UrlUtilities;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.NavigationController;
 import org.chromium.content_public.browser.NavigationEntry;
-import org.chromium.content_public.common.Referrer;
 import org.chromium.net.NetworkChangeNotifier;
 import org.chromium.ui.base.DeviceFormFactor;
 import org.chromium.ui.base.PageTransition;
 import org.chromium.ui.mojom.WindowOpenDisposition;
 
-import java.util.HashSet;
-import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 import jp.tomorrowkey.android.gifplayer.BaseGifImage;
@@ -109,27 +89,21 @@
     // Key for the scroll position data that may be stored in a navigation entry.
     private static final String NAVIGATION_ENTRY_SCROLL_POSITION_KEY = "NewTabPageScrollPosition";
 
-    private static final String CHROME_CONTENT_SUGGESTIONS_REFERRER =
-            "https://www.googleapis.com/auth/chrome-content-suggestions";
-
     private static MostVisitedSites sMostVisitedSitesForTests;
     private static SuggestionsSource sSuggestionsSourceForTests;
 
     private final Tab mTab;
     private final TabModelSelector mTabModelSelector;
-    private final ChromeActivity mActivity;
 
-    private final Profile mProfile;
     private final String mTitle;
     private final int mBackgroundColor;
     private final int mThemeColor;
     private final NewTabPageView mNewTabPageView;
+    private final NewTabPageManagerImpl mNewTabPageManager;
 
     private TabObserver mTabObserver;
     private MostVisitedSites mMostVisitedSites;
     private SnackbarController mMostVisitedItemRemovedController;
-    private FaviconHelper mFaviconHelper;
-    private LargeIconBridge mLargeIconBridge;
     private LogoBridge mLogoBridge;
     private boolean mSearchProviderHasLogo;
     private String mOnLogoClickUrl;
@@ -148,8 +122,6 @@
     // Whether destroy() has been called.
     private boolean mIsDestroyed;
 
-    private final ObserverList<DestructionObserver> mDestructionObservers = new ObserverList<>();
-
     /**
      * Allows clients to listen for updates to the scroll changes of the search box on the
      * NTP.
@@ -228,11 +200,16 @@
         sSuggestionsSourceForTests = suggestionsSource;
     }
 
-    private final NewTabPageManager mNewTabPageManager = new NewTabPageManager() {
-        private static final String NTP_OFFLINE_PAGES_FEATURE_NAME = "NTPOfflinePages";
+    private class NewTabPageManagerImpl
+            extends SuggestionsUiDelegateImpl implements NewTabPageManager {
+        public NewTabPageManagerImpl(SuggestionsSource suggestionsSource,
+                SuggestionsMetricsReporter metricsReporter,
+                SuggestionsNavigationDelegate navigationDelegate, Profile profile, Tab currentTab) {
+            super(suggestionsSource, metricsReporter, navigationDelegate, profile, currentTab);
+        }
 
         private boolean isNtpOfflinePagesEnabled() {
-            return ChromeFeatureList.isEnabled(NTP_OFFLINE_PAGES_FEATURE_NAME);
+            return ChromeFeatureList.isEnabled(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME);
         }
 
         @Override
@@ -281,7 +258,8 @@
                 return;
             }
 
-            openUrl(windowDisposition, new LoadUrlParams(url, PageTransition.AUTO_BOOKMARK));
+            getNavigationDelegate().openUrl(
+                    windowDisposition, new LoadUrlParams(url, PageTransition.AUTO_BOOKMARK));
         }
 
         @Override
@@ -290,16 +268,6 @@
             showMostVisitedItemRemovedSnackbar(item.getUrl());
         }
 
-        @Override
-        public void onLearnMoreClicked() {
-            if (mIsDestroyed) return;
-            NewTabPageUma.recordAction(NewTabPageUma.ACTION_CLICKED_LEARN_MORE);
-            String url = "https://support.google.com/chrome/?p=new_tab";
-            // TODO(mastiz): Change this to LINK?
-            openUrl(WindowOpenDisposition.CURRENT_TAB,
-                    new LoadUrlParams(url, PageTransition.AUTO_BOOKMARK));
-        }
-
         @TargetApi(Build.VERSION_CODES.LOLLIPOP)
         private boolean switchToExistingTab(String url) {
             String matchPattern = CommandLine.getInstance().getSwitchValue(
@@ -328,148 +296,6 @@
             return matchByHost ? UrlUtilities.sameHost(url1, url2) : url1.equals(url2);
         }
 
-        public SuggestionsMetricsReporter getSuggestionsMetricsReporter() {
-            return mSnippetsBridge;
-        }
-
-        public void trackSnippetOpened(int windowOpenDisposition, SnippetArticle article) {
-            mSnippetsBridge.onSuggestionOpened(article, windowOpenDisposition);
-        }
-
-        @Override
-        public void openSnippet(int windowOpenDisposition, SnippetArticle article) {
-            trackSnippetOpened(windowOpenDisposition, article);
-            NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_SNIPPET);
-
-            if (article.mIsAssetDownload) {
-                assert windowOpenDisposition == WindowOpenDisposition.CURRENT_TAB
-                        || windowOpenDisposition == WindowOpenDisposition.NEW_WINDOW
-                        || windowOpenDisposition == WindowOpenDisposition.NEW_FOREGROUND_TAB;
-                DownloadUtils.openFile(
-                        article.getAssetDownloadFile(), article.getAssetDownloadMimeType(), false);
-                return;
-            }
-
-            if (article.isRecentTab()) {
-                assert windowOpenDisposition == WindowOpenDisposition.CURRENT_TAB;
-                // TODO(vitaliii): Add a debug check that the result is true after crbug.com/662924
-                // is resolved.
-                openRecentTabSnippet(article);
-                return;
-            }
-
-            // TODO(treib): Also track other dispositions. crbug.com/665915
-            if (windowOpenDisposition == WindowOpenDisposition.CURRENT_TAB) {
-                NewTabPageUma.monitorContentSuggestionVisit(mTab, article.mCategory);
-            }
-
-            LoadUrlParams loadUrlParams;
-            // We explicitly open an offline page only for offline page downloads. For all other
-            // sections the URL is opened and it is up to Offline Pages whether to open its offline
-            // page (e.g. when offline).
-            if (article.isDownload() && !article.mIsAssetDownload) {
-                assert article.getOfflinePageOfflineId() != null;
-                assert windowOpenDisposition == WindowOpenDisposition.CURRENT_TAB
-                        || windowOpenDisposition == WindowOpenDisposition.NEW_WINDOW
-                        || windowOpenDisposition == WindowOpenDisposition.NEW_FOREGROUND_TAB;
-                loadUrlParams = OfflinePageUtils.getLoadUrlParamsForOpeningOfflineVersion(
-                        article.mUrl, article.getOfflinePageOfflineId());
-                // Extra headers are not read in loadUrl, but verbatim headers are.
-                loadUrlParams.setVerbatimHeaders(loadUrlParams.getExtraHeadersString());
-            } else {
-                loadUrlParams = new LoadUrlParams(article.mUrl, PageTransition.AUTO_BOOKMARK);
-            }
-
-            // For article suggestions, we set the referrer. This is exploited
-            // to filter out these history entries for NTP tiles.
-            // TODO(mastiz): Extend this with support for other categories.
-            if (article.mCategory == KnownCategories.ARTICLES) {
-                loadUrlParams.setReferrer(new Referrer(
-                        CHROME_CONTENT_SUGGESTIONS_REFERRER, Referrer.REFERRER_POLICY_ALWAYS));
-            }
-
-            openUrl(windowOpenDisposition, loadUrlParams);
-        }
-
-        private boolean openRecentTabSnippet(SnippetArticle recentTabArticle) {
-            TabModel tabModel = mTabModelSelector.getModel(false);
-            int tabId = Integer.parseInt(recentTabArticle.getRecentTabId());
-            int tabIndex = TabModelUtils.getTabIndexById(tabModel, tabId);
-            if (tabIndex == TabModel.INVALID_TAB_INDEX) return false;
-            TabModelUtils.setIndex(tabModel, tabIndex);
-            return true;
-        }
-
-        private void openUrl(int windowOpenDisposition, LoadUrlParams loadUrlParams) {
-            assert !mIsDestroyed;
-            switch (windowOpenDisposition) {
-                case WindowOpenDisposition.CURRENT_TAB:
-                    mTab.loadUrl(loadUrlParams);
-                    break;
-                case WindowOpenDisposition.NEW_FOREGROUND_TAB:
-                    openUrlInNewTab(loadUrlParams, false);
-                    break;
-                case WindowOpenDisposition.OFF_THE_RECORD:
-                    openUrlInNewTab(loadUrlParams, true);
-                    break;
-                case WindowOpenDisposition.NEW_WINDOW:
-                    openUrlInNewWindow(loadUrlParams);
-                    break;
-                case WindowOpenDisposition.SAVE_TO_DISK:
-                    saveUrlForOffline(loadUrlParams.getUrl());
-                    break;
-                default:
-                    assert false;
-            }
-        }
-
-        @Override
-        public boolean isOpenInNewWindowEnabled() {
-            return MultiWindowUtils.getInstance().isOpenInOtherWindowSupported(mActivity);
-        }
-
-        @Override
-        public boolean isOpenInIncognitoEnabled() {
-            return PrefServiceBridge.getInstance().isIncognitoModeEnabled();
-        }
-
-        private void openUrlInNewWindow(LoadUrlParams loadUrlParams) {
-            TabDelegate tabDelegate = new TabDelegate(false);
-            tabDelegate.createTabInOtherWindow(loadUrlParams, mActivity, mTab.getParentId());
-        }
-
-        private void openUrlInNewTab(LoadUrlParams loadUrlParams, boolean incognito) {
-            mTabModelSelector.openNewTab(
-                    loadUrlParams, TabLaunchType.FROM_LONGPRESS_BACKGROUND, mTab, incognito);
-        }
-
-        private void saveUrlForOffline(String url) {
-            OfflinePageBridge.getForProfile(mProfile)
-                    .savePageLater(url, "ntp_suggestions", true /* userRequested */);
-        }
-
-        @Override
-        public void navigateToBookmarks() {
-            if (mIsDestroyed) return;
-            RecordUserAction.record("MobileNTPSwitchToBookmarks");
-            BookmarkUtils.showBookmarkManager(mActivity);
-        }
-
-        @Override
-        public void navigateToRecentTabs() {
-            if (mIsDestroyed) return;
-            RecordUserAction.record("MobileNTPSwitchToOpenTabs");
-            mTab.loadUrl(new LoadUrlParams(UrlConstants.RECENT_TABS_URL));
-        }
-
-        @Override
-        public void navigateToDownloadManager() {
-            if (mIsDestroyed) return;
-            assert DownloadUtils.isDownloadHomeEnabled();
-            RecordUserAction.record("MobileNTPSwitchToDownloadManager");
-            DownloadUtils.showDownloadManager(mActivity, mTab);
-        }
-
         @Override
         public void focusSearchBox(boolean beginVoiceSearch, String pastedText) {
             if (mIsDestroyed) return;
@@ -489,83 +315,6 @@
         }
 
         @Override
-        public void getLocalFaviconImageForURL(
-                String url, int size, FaviconImageCallback faviconCallback) {
-            if (mIsDestroyed) return;
-            if (mFaviconHelper == null) mFaviconHelper = new FaviconHelper();
-            mFaviconHelper.getLocalFaviconImageForURL(mProfile, url, size, faviconCallback);
-        }
-
-        @Override
-        public void getLargeIconForUrl(String url, int size, LargeIconCallback callback) {
-            if (mIsDestroyed) return;
-            if (mLargeIconBridge == null) mLargeIconBridge = new LargeIconBridge(mProfile);
-            mLargeIconBridge.getLargeIconForUrl(url, size, callback);
-        }
-
-        @Override
-        public void ensureIconIsAvailable(String pageUrl, String iconUrl, boolean isLargeIcon,
-                boolean isTemporary, IconAvailabilityCallback callback) {
-            if (mIsDestroyed) return;
-            if (mFaviconHelper == null) mFaviconHelper = new FaviconHelper();
-            mFaviconHelper.ensureIconIsAvailable(mProfile, mTab.getWebContents(), pageUrl, iconUrl,
-                    isLargeIcon, isTemporary, callback);
-        }
-
-        private boolean isLocalUrl(String url) {
-            return "file".equals(Uri.parse(url).getScheme());
-        }
-
-        @Override
-        public void getUrlsAvailableOffline(
-                Set<String> pageUrls, final Callback<Set<String>> callback) {
-            final Set<String> urlsAvailableOffline = new HashSet<>();
-            if (mIsDestroyed || !isNtpOfflinePagesEnabled()) {
-                callback.onResult(urlsAvailableOffline);
-                return;
-            }
-
-            HashSet<String> urlsToCheckForOfflinePage = new HashSet<>();
-
-            for (String pageUrl : pageUrls) {
-                if (isLocalUrl(pageUrl)) {
-                    urlsAvailableOffline.add(pageUrl);
-                } else {
-                    urlsToCheckForOfflinePage.add(pageUrl);
-                }
-            }
-
-            final long offlineQueryStartTime = SystemClock.elapsedRealtime();
-
-            OfflinePageBridge offlinePageBridge = OfflinePageBridge.getForProfile(mProfile);
-
-            // TODO(dewittj): Remove this code by making the NTP badging available after the NTP is
-            // fully loaded.
-            if (offlinePageBridge == null || !offlinePageBridge.isOfflinePageModelLoaded()) {
-                // Posting a task to avoid potential re-entrancy issues.
-                ThreadUtils.postOnUiThread(new Runnable() {
-                    @Override
-                    public void run() {
-                        callback.onResult(urlsAvailableOffline);
-                    }
-                });
-                return;
-            }
-
-            offlinePageBridge.checkPagesExistOffline(
-                    urlsToCheckForOfflinePage, new Callback<Set<String>>() {
-                        @Override
-                        public void onResult(Set<String> urlsWithOfflinePages) {
-                            urlsAvailableOffline.addAll(urlsWithOfflinePages);
-                            callback.onResult(urlsAvailableOffline);
-                            RecordHistogram.recordTimesHistogram("NewTabPage.OfflineUrlsLoadTime",
-                                    SystemClock.elapsedRealtime() - offlineQueryStartTime,
-                                    TimeUnit.MILLISECONDS);
-                        }
-                    });
-        }
-
-        @Override
         public void onLogoClicked(boolean isAnimatedLogoShowing) {
             if (mIsDestroyed) return;
 
@@ -649,12 +398,6 @@
         }
 
         @Override
-        public void addDestructionObserver(DestructionObserver destructionObserver) {
-            if (mIsDestroyed) return;
-            mDestructionObservers.addObserver(destructionObserver);
-        }
-
-        @Override
         public boolean isCurrentPage() {
             if (mIsDestroyed) return false;
             if (mFakeboxDelegate == null) return false;
@@ -678,9 +421,17 @@
         mConstructedTimeNs = System.nanoTime();
 
         mTab = tab;
-        mActivity = activity;
         mTabModelSelector = tabModelSelector;
-        mProfile = tab.getProfile();
+        Profile profile = tab.getProfile();
+
+        if (SnippetsConfig.isEnabled()) {
+            mSnippetsBridge = new SnippetsBridge(profile);
+        }
+
+        SuggestionsNavigationDelegateImpl navigationDelegate =
+                new SuggestionsNavigationDelegateImpl(activity, profile, tab, tabModelSelector);
+        mNewTabPageManager = new NewTabPageManagerImpl(
+                mSnippetsBridge, mSnippetsBridge, navigationDelegate, profile, tab);
 
         mTitle = activity.getResources().getString(R.string.button_new_tab);
         mBackgroundColor = ApiCompatibilityUtils.getColor(activity.getResources(), R.color.ntp_bg);
@@ -724,14 +475,10 @@
             }
         };
         mTab.addObserver(mTabObserver);
-        mMostVisitedSites = buildMostVisitedSites(mProfile);
-        mLogoBridge = new LogoBridge(mProfile);
+        mMostVisitedSites = buildMostVisitedSites(profile);
+        mLogoBridge = new LogoBridge(profile);
         updateSearchProviderHasLogo();
 
-        if (SnippetsConfig.isEnabled()) {
-            mSnippetsBridge = new SnippetsBridge(mProfile);
-        }
-
         LayoutInflater inflater = LayoutInflater.from(activity);
         mNewTabPageView = (NewTabPageView) inflater.inflate(R.layout.new_tab_page_view, null);
         mNewTabPageView.initialize(mNewTabPageManager, mTab, mSearchProviderHasLogo,
@@ -746,7 +493,7 @@
 
         RecordHistogram.recordBooleanHistogram(
                 "NewTabPage.MobileIsUserOnline", NetworkChangeNotifier.isOnline());
-        NewTabPageUma.recordLoadType(mActivity);
+        NewTabPageUma.recordLoadType(activity);
     }
 
     private static MostVisitedSites buildMostVisitedSites(Profile profile) {
@@ -948,14 +695,6 @@
                 .isAttachedToWindow(getView()) : "Destroy called before removed from window";
         if (mIsLoaded && !mTab.isHidden()) recordNTPInteractionTime();
 
-        if (mFaviconHelper != null) {
-            mFaviconHelper.destroy();
-            mFaviconHelper = null;
-        }
-        if (mLargeIconBridge != null) {
-            mLargeIconBridge.destroy();
-            mLargeIconBridge = null;
-        }
         if (mMostVisitedSites != null) {
             mMostVisitedSites.destroy();
             mMostVisitedSites = null;
@@ -971,10 +710,7 @@
         if (mMostVisitedItemRemovedController != null) {
             mTab.getSnackbarManager().dismissSnackbars(mMostVisitedItemRemovedController);
         }
-        for (DestructionObserver observer : mDestructionObservers) {
-            observer.onDestroy();
-        }
-        mDestructionObservers.clear();
+        mNewTabPageManager.onDestroy();
         TemplateUrlService.getInstance().removeObserver(this);
         mTab.removeObserver(mTabObserver);
         mTabObserver = null;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
index 141dbabca..94afdaf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
@@ -42,8 +42,6 @@
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback;
-import org.chromium.chrome.browser.favicon.FaviconHelper.IconAvailabilityCallback;
 import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback;
 import org.chromium.chrome.browser.ntp.LogoBridge.Logo;
 import org.chromium.chrome.browser.ntp.LogoBridge.LogoObserver;
@@ -53,13 +51,11 @@
 import org.chromium.chrome.browser.ntp.cards.CardsVariationParameters;
 import org.chromium.chrome.browser.ntp.cards.NewTabPageAdapter;
 import org.chromium.chrome.browser.ntp.cards.NewTabPageRecyclerView;
-import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
 import org.chromium.chrome.browser.ntp.snippets.SnippetsConfig;
-import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
 import org.chromium.chrome.browser.profiles.MostVisitedSites.MostVisitedURLsObserver;
 import org.chromium.chrome.browser.profiles.Profile;
-import org.chromium.chrome.browser.suggestions.SuggestionsMetricsReporter;
+import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.util.MathUtils;
 import org.chromium.chrome.browser.util.ViewUtils;
@@ -102,9 +98,6 @@
     private View mMostVisitedPlaceholder;
     private View mNoSearchLogoSpacer;
 
-    /** Adapter for {@link #mRecyclerView}. Will be {@code null} when using the old UI */
-    private NewTabPageAdapter mNewTabPageAdapter;
-
     private OnSearchBoxScrollListener mSearchBoxScrollListener;
 
     private ChromeActivity mActivity;
@@ -139,7 +132,7 @@
     /**
      * Manages the view interaction with the rest of the system.
      */
-    public interface NewTabPageManager extends MostVisitedItemManager {
+    public interface NewTabPageManager extends MostVisitedItemManager, SuggestionsUiDelegate {
         /** @return Whether the location bar is shown in the NTP. */
         boolean isLocationBarShownInNTP();
 
@@ -149,28 +142,6 @@
         /** @return Whether the omnibox 'Search or type URL' text should be shown. */
         boolean isFakeOmniboxTextEnabledTablet();
 
-        /** @return Whether context menus should allow the option to open a link in a new window. */
-        boolean isOpenInNewWindowEnabled();
-
-        /** @return Whether context menus should allow the option to open a link in incognito. */
-        boolean isOpenInIncognitoEnabled();
-
-        /** Opens the bookmarks page in the current tab. */
-        void navigateToBookmarks();
-
-        /** Opens the recent tabs page in the current tab. */
-        void navigateToRecentTabs();
-
-        /** Opens the Download Manager UI in the current tab. */
-        void navigateToDownloadManager();
-
-        /**
-         * Opens a content suggestion and records related metrics.
-         * @param windowOpenDisposition How to open (current tab, new tab, new window etc).
-         * @param article The content suggestion to open.
-         */
-        void openSnippet(int windowOpenDisposition, SnippetArticle article);
-
         /**
          * Animates the search box up into the omnibox and bring up the keyboard.
          * @param beginVoiceSearch Whether to begin a voice search.
@@ -186,41 +157,6 @@
         void setMostVisitedURLsObserver(MostVisitedURLsObserver observer, int numResults);
 
         /**
-         * Gets the favicon image for a given URL.
-         * @param url The URL of the site whose favicon is being requested.
-         * @param size The desired size of the favicon in pixels.
-         * @param faviconCallback The callback to be notified when the favicon is available.
-         */
-        void getLocalFaviconImageForURL(
-                String url, int size, FaviconImageCallback faviconCallback);
-
-        /**
-         * Gets the large icon (e.g. favicon or touch icon) for a given URL.
-         * @param url The URL of the site whose icon is being requested.
-         * @param size The desired size of the icon in pixels.
-         * @param callback The callback to be notified when the icon is available.
-         */
-        void getLargeIconForUrl(String url, int size, LargeIconCallback callback);
-
-        /**
-         * Checks if an icon with the given URL is available. If not,
-         * downloads it and stores it as a favicon/large icon for the given {@code pageUrl}.
-         * @param pageUrl The URL of the site whose icon is being requested.
-         * @param iconUrl The URL of the favicon/large icon.
-         * @param isLargeIcon Whether the {@code iconUrl} represents a large icon or favicon.
-         * @param callback The callback to be notified when the favicon has been checked.
-         */
-        void ensureIconIsAvailable(String pageUrl, String iconUrl, boolean isLargeIcon,
-                boolean isTemporary, IconAvailabilityCallback callback);
-
-        /**
-         * Checks if the pages with the given URLs are available offline.
-         * @param pageUrls The URLs of the sites whose offline availability is requested.
-         * @param callback Fired when the results are available.
-         */
-        void getUrlsAvailableOffline(Set<String> pageUrls, Callback<Set<String>> callback);
-
-        /**
          * Called when the user clicks on the logo.
          * @param isAnimatedLogoShowing Whether the animated GIF logo is playing.
          */
@@ -240,23 +176,6 @@
         void onLoadingComplete(MostVisitedItem[] mostVisitedItems);
 
         /**
-         * Handles clicks on the "learn more" link in the footer.
-         */
-        void onLearnMoreClicked();
-
-        /**
-         * Returns the SuggestionsSource or null if it doesn't exist. The SuggestionsSource is
-         * invalidated (has destroy() called) when the NewTabPage is destroyed so use this method
-         * instead of keeping your own reference.
-         */
-        @Nullable SuggestionsSource getSuggestionsSource();
-
-        /**
-         * Registers a {@link DestructionObserver}, notified when the New Tab Page goes away.
-         */
-        void addDestructionObserver(DestructionObserver destructionObserver);
-
-        /**
          * @return whether the {@link NewTabPage} associated with this manager is the current page
          * displayed to the user.
          */
@@ -268,13 +187,6 @@
          */
         @Nullable
         ContextMenuManager getContextMenuManager();
-
-        /**
-         * @return The suggestion metrics reporter. Will be {@code null} if the
-         * {@link NewTabPageView} is not done initialising.
-         */
-        @Nullable
-        SuggestionsMetricsReporter getSuggestionsMetricsReporter();
     }
 
     /**
@@ -336,7 +248,7 @@
             mScrollView.enableBottomShadow(SHADOW_COLOR);
             mNewTabPageLayout = (NewTabPageLayout) findViewById(R.id.ntp_content);
         }
-        mContextMenuManager = new ContextMenuManager(mActivity, mManager,
+        mContextMenuManager = new ContextMenuManager(mActivity, mManager.getNavigationDelegate(),
                 mUseCardsUi ? mRecyclerView : mScrollView);
         mActivity.getWindowAndroid().addContextMenuCloseListener(mContextMenuManager);
         manager.addDestructionObserver(new DestructionObserver() {
@@ -369,13 +281,14 @@
 
         // Set up snippets
         if (mUseCardsUi) {
-            mNewTabPageAdapter = new NewTabPageAdapter(mManager, mNewTabPageLayout, mUiConfig,
-                    OfflinePageBridge.getForProfile(Profile.getLastUsedProfile()));
-            mRecyclerView.setAdapter(mNewTabPageAdapter);
+            NewTabPageAdapter newTabPageAdapter = new NewTabPageAdapter(mManager, mNewTabPageLayout,
+                    mUiConfig, OfflinePageBridge.getForProfile(Profile.getLastUsedProfile()),
+                    mContextMenuManager);
+            mRecyclerView.setAdapter(newTabPageAdapter);
 
             int scrollOffset;
             if (CardsVariationParameters.isScrollBelowTheFoldEnabled()) {
-                scrollPosition = mNewTabPageAdapter.getFirstHeaderPosition();
+                scrollPosition = newTabPageAdapter.getFirstHeaderPosition();
                 scrollOffset = getResources().getDimensionPixelSize(R.dimen.ntp_search_box_height);
             } else {
                 scrollOffset = 0;
@@ -389,7 +302,7 @@
 
             // When the NewTabPageAdapter's data changes we need to invalidate any previous
             // screen captures of the NewTabPageView.
-            mNewTabPageAdapter.registerAdapterDataObserver(new AdapterDataObserver() {
+            newTabPageAdapter.registerAdapterDataObserver(new AdapterDataObserver() {
                 @Override
                 public void onChanged() {
                     mNewTabPageRecyclerViewChanged = true;
@@ -482,14 +395,14 @@
                 @Override
                 public void onClick(View v) {
                     NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_RECENT_TABS_MANAGER);
-                    mManager.navigateToRecentTabs();
+                    mManager.getNavigationDelegate().navigateToRecentTabs();
                 }
             });
             toolbar.getBookmarksButton().setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                     NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_BOOKMARKS_MANAGER);
-                    mManager.navigateToBookmarks();
+                    mManager.getNavigationDelegate().navigateToBookmarks();
                 }
             });
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ActionItem.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ActionItem.java
index 34e6edc1..786f126 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ActionItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/ActionItem.java
@@ -12,11 +12,11 @@
 import org.chromium.chrome.browser.ntp.ContextMenuManager;
 import org.chromium.chrome.browser.ntp.ContextMenuManager.ContextMenuItemId;
 import org.chromium.chrome.browser.ntp.ContextMenuManager.Delegate;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.UiConfig;
 import org.chromium.chrome.browser.ntp.snippets.CategoryInt;
 import org.chromium.chrome.browser.ntp.snippets.SnippetsConfig;
 import org.chromium.chrome.browser.suggestions.SuggestionsRanker;
+import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -82,16 +82,16 @@
     }
 
     @VisibleForTesting
-    void performAction(NewTabPageManager manager) {
-        manager.getSuggestionsMetricsReporter().onMoreButtonClicked(this);
+    void performAction(SuggestionsUiDelegate uiDelegate) {
+        uiDelegate.getMetricsReporter().onMoreButtonClicked(this);
 
         switch (mCurrentAction) {
             case ACTION_VIEW_ALL:
-                mCategoryInfo.performViewAllAction(manager);
+                mCategoryInfo.performViewAllAction(uiDelegate.getNavigationDelegate());
                 return;
             case ACTION_FETCH_MORE:
             case ACTION_RELOAD:
-                manager.getSuggestionsSource().fetchSuggestions(
+                uiDelegate.getSuggestionsSource().fetchSuggestions(
                         mCategoryInfo.getCategory(), mParentSection.getDisplayedSuggestionIds());
                 mParentSection.onFetchStarted();
                 return;
@@ -116,14 +116,15 @@
         private ActionItem mActionListItem;
 
         public ViewHolder(final NewTabPageRecyclerView recyclerView,
-                final NewTabPageManager manager, UiConfig uiConfig) {
-            super(R.layout.new_tab_page_action_card, recyclerView, uiConfig, manager);
+                ContextMenuManager contextMenuManager, final SuggestionsUiDelegate uiDelegate,
+                UiConfig uiConfig) {
+            super(R.layout.new_tab_page_action_card, recyclerView, uiConfig, contextMenuManager);
 
             itemView.findViewById(R.id.action_button)
                     .setOnClickListener(new View.OnClickListener() {
                         @Override
                         public void onClick(View v) {
-                            mActionListItem.performAction(manager);
+                            mActionListItem.performAction(uiDelegate);
                         }
                     });
 
@@ -132,7 +133,7 @@
                 public void onImpression() {
                     if (mActionListItem != null && !mActionListItem.mImpressionTracked) {
                         mActionListItem.mImpressionTracked = true;
-                        manager.getSuggestionsMetricsReporter().onMoreButtonShown(mActionListItem);
+                        uiDelegate.getMetricsReporter().onMoreButtonShown(mActionListItem);
                     }
                 }
             });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/CardViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/CardViewHolder.java
index 41b37ca..05a102f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/CardViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/CardViewHolder.java
@@ -20,7 +20,6 @@
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ntp.ContextMenuManager;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.UiConfig;
 import org.chromium.chrome.browser.util.MathUtils;
 import org.chromium.chrome.browser.util.ViewUtils;
@@ -59,7 +58,6 @@
 
     private final UiConfig mUiConfig;
     private final MarginResizer mMarginResizer;
-    private final NewTabPageManager mNtpManager;
 
     /**
      * To what extent the card is "peeking". 0 means the card is not peeking at all and spans the
@@ -74,9 +72,10 @@
      * @param layoutId resource id of the layout to inflate and to use as card.
      * @param recyclerView ViewGroup that will contain the newly created view.
      * @param uiConfig The NTP UI configuration object used to adjust the card UI.
+     * @param contextMenuManager The manager responsible for the context menu.
      */
     public CardViewHolder(int layoutId, final NewTabPageRecyclerView recyclerView,
-            UiConfig uiConfig, NewTabPageManager ntpManager) {
+            UiConfig uiConfig, final ContextMenuManager contextMenuManager) {
         super(inflateView(layoutId, recyclerView));
 
         mCards9PatchAdjustment = recyclerView.getResources().getDimensionPixelSize(
@@ -106,7 +105,7 @@
                 ContextMenuManager.Delegate delegate = getContextMenuDelegate();
                 if (delegate == null) return;
 
-                mNtpManager.getContextMenuManager().createContextMenu(menu, itemView, delegate);
+                contextMenuManager.createContextMenu(menu, itemView, delegate);
             }
         });
 
@@ -117,8 +116,6 @@
         // Configure the resizer to use negative margins on regular display to balance out the
         // lateral shadow of the card 9-patch and avoid a rounded corner effect.
         mMarginResizer.setMargins(-mCards9PatchAdjustment);
-
-        mNtpManager = ntpManager;
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/Footer.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/Footer.java
index 9fca3e1..e2b2fb83 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/Footer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/Footer.java
@@ -11,7 +11,7 @@
 import android.widget.TextView;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
+import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegate;
 import org.chromium.ui.text.NoUnderlineClickableSpan;
 import org.chromium.ui.text.SpanApplier;
 
@@ -35,7 +35,7 @@
      * The {@code ViewHolder} for the {@link Footer}.
      */
     public static class ViewHolder extends NewTabPageViewHolder {
-        public ViewHolder(ViewGroup root, final NewTabPageManager manager) {
+        public ViewHolder(ViewGroup root, final SuggestionsNavigationDelegate navigationDelegate) {
             super(LayoutInflater.from(root.getContext())
                             .inflate(R.layout.new_tab_page_footer, root, false));
 
@@ -43,7 +43,7 @@
                 @Override
                 public void onClick(View view) {
                     // TODO(mvanouwerkerk): Ensure this can be activated when using TalkBack.
-                    manager.onLearnMoreClicked();
+                    navigationDelegate.navigateToHelpPage();
                 }
             };
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java
index eadf900..9ee7337 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java
@@ -13,12 +13,13 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.VisibleForTesting;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
+import org.chromium.chrome.browser.ntp.ContextMenuManager;
 import org.chromium.chrome.browser.ntp.UiConfig;
 import org.chromium.chrome.browser.ntp.snippets.SectionHeaderViewHolder;
 import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
 import org.chromium.chrome.browser.ntp.snippets.SnippetArticleViewHolder;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
 
 import java.util.Collections;
 import java.util.List;
@@ -30,7 +31,9 @@
  * elements will be the cards shown to the user
  */
 public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements NodeParent {
-    private final NewTabPageManager mNewTabPageManager;
+    private final SuggestionsUiDelegate mUiDelegate;
+    private final ContextMenuManager mContextMenuManager;
+
     @Nullable
     private final View mAboveTheFoldView;
     private final UiConfig mUiConfig;
@@ -48,24 +51,26 @@
 
     /**
      * Creates the adapter that will manage all the cards to display on the NTP.
-     *
-     * @param manager the NewTabPageManager to use to interact with the rest of the system.
+     * @param uiDelegate used to interact with the rest of the system.
      * @param aboveTheFoldView the layout encapsulating all the above-the-fold elements
      *         (logo, search box, most visited tiles), or null if only suggestions should
      *         be displayed.
      * @param uiConfig the NTP UI configuration, to be passed to created views.
-     * @param offlinePageBridge the OfflinePageBridge used to determine if articles are available
-     *         offline.
+     * @param offlinePageBridge used to determine if articles are available.
+     * @param contextMenuManager used to build context menus.
      */
-    public NewTabPageAdapter(NewTabPageManager manager, @Nullable View aboveTheFoldView,
-            UiConfig uiConfig, OfflinePageBridge offlinePageBridge) {
-        mNewTabPageManager = manager;
+    public NewTabPageAdapter(SuggestionsUiDelegate uiDelegate, @Nullable View aboveTheFoldView,
+            UiConfig uiConfig, OfflinePageBridge offlinePageBridge,
+            ContextMenuManager contextMenuManager) {
+        mUiDelegate = uiDelegate;
+        mContextMenuManager = contextMenuManager;
+
         mAboveTheFoldView = aboveTheFoldView;
         mUiConfig = uiConfig;
         mRoot = new InnerNode();
 
-        mSections = new SectionList(mNewTabPageManager, offlinePageBridge);
-        mSigninPromo = new SignInPromo(mNewTabPageManager);
+        mSections = new SectionList(mUiDelegate, offlinePageBridge);
+        mSigninPromo = new SignInPromo(mUiDelegate);
         mAllDismissed = new AllDismissedItem();
         mFooter = new Footer();
 
@@ -105,25 +110,27 @@
                 return new SectionHeaderViewHolder(mRecyclerView, mUiConfig);
 
             case ItemViewType.SNIPPET:
-                return new SnippetArticleViewHolder(mRecyclerView, mNewTabPageManager, mUiConfig);
+                return new SnippetArticleViewHolder(
+                        mRecyclerView, mContextMenuManager, mUiDelegate, mUiConfig);
 
             case ItemViewType.SPACING:
                 return new NewTabPageViewHolder(SpacingItem.createView(parent));
 
             case ItemViewType.STATUS:
-                return new StatusCardViewHolder(mRecyclerView, mNewTabPageManager, mUiConfig);
+                return new StatusCardViewHolder(mRecyclerView, mContextMenuManager, mUiConfig);
 
             case ItemViewType.PROGRESS:
                 return new ProgressViewHolder(mRecyclerView);
 
             case ItemViewType.ACTION:
-                return new ActionItem.ViewHolder(mRecyclerView, mNewTabPageManager, mUiConfig);
+                return new ActionItem.ViewHolder(
+                        mRecyclerView, mContextMenuManager, mUiDelegate, mUiConfig);
 
             case ItemViewType.PROMO:
-                return new SignInPromo.ViewHolder(mRecyclerView, mNewTabPageManager, mUiConfig);
+                return new SignInPromo.ViewHolder(mRecyclerView, mContextMenuManager, mUiConfig);
 
             case ItemViewType.FOOTER:
-                return new Footer.ViewHolder(mRecyclerView, mNewTabPageManager);
+                return new Footer.ViewHolder(mRecyclerView, mUiDelegate.getNavigationDelegate());
 
             case ItemViewType.ALL_DISMISSED:
                 return new AllDismissedItem.ViewHolder(mRecyclerView, mSections);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SectionList.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SectionList.java
index b7edb85..da91464 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SectionList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SectionList.java
@@ -6,7 +6,6 @@
 
 import org.chromium.base.Log;
 import org.chromium.base.VisibleForTesting;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.snippets.CategoryInt;
 import org.chromium.chrome.browser.ntp.snippets.CategoryStatus;
 import org.chromium.chrome.browser.ntp.snippets.CategoryStatus.CategoryStatusEnum;
@@ -16,6 +15,7 @@
 import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
 import org.chromium.chrome.browser.suggestions.SuggestionsRanker;
+import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
 
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -31,15 +31,15 @@
 
     /** Maps suggestion categories to sections, with stable iteration ordering. */
     private final Map<Integer, SuggestionsSection> mSections = new LinkedHashMap<>();
-    private final NewTabPageManager mNewTabPageManager;
+    private final SuggestionsUiDelegate mUiDelegate;
     private final OfflinePageBridge mOfflinePageBridge;
     private final SuggestionsRanker mSuggestionsRanker;
 
-    public SectionList(NewTabPageManager newTabPageManager, OfflinePageBridge offlinePageBridge) {
+    public SectionList(SuggestionsUiDelegate uiDelegate, OfflinePageBridge offlinePageBridge) {
         mSuggestionsRanker = new SuggestionsRanker();
-        mNewTabPageManager = newTabPageManager;
-        mNewTabPageManager.getSuggestionsSource().setObserver(this);
-        mNewTabPageManager.getSuggestionsMetricsReporter().setRanker(mSuggestionsRanker);
+        mUiDelegate = uiDelegate;
+        mUiDelegate.getSuggestionsSource().setObserver(this);
+        mUiDelegate.getMetricsReporter().setRanker(mSuggestionsRanker);
         mOfflinePageBridge = offlinePageBridge;
         resetSections(/* alwaysAllowEmptySections = */ false);
     }
@@ -52,7 +52,7 @@
     public void resetSections(boolean alwaysAllowEmptySections) {
         removeAllSections();
 
-        SuggestionsSource suggestionsSource = mNewTabPageManager.getSuggestionsSource();
+        SuggestionsSource suggestionsSource = mUiDelegate.getSuggestionsSource();
         int[] categories = suggestionsSource.getCategories();
         int[] suggestionsPerCategory = new int[categories.length];
         int categoryIndex = 0;
@@ -68,8 +68,7 @@
             ++categoryIndex;
         }
 
-        mNewTabPageManager.getSuggestionsMetricsReporter().onPageShown(
-                categories, suggestionsPerCategory);
+        mUiDelegate.getMetricsReporter().onPageShown(categories, suggestionsPerCategory);
     }
 
     /**
@@ -84,7 +83,7 @@
      */
     private int resetSection(@CategoryInt int category, @CategoryStatusEnum int categoryStatus,
             boolean alwaysAllowEmptySections) {
-        SuggestionsSource suggestionsSource = mNewTabPageManager.getSuggestionsSource();
+        SuggestionsSource suggestionsSource = mUiDelegate.getSuggestionsSource();
         List<SnippetArticle> suggestions = suggestionsSource.getSuggestionsForCategory(category);
         SuggestionsCategoryInfo info = suggestionsSource.getCategoryInfo(category);
 
@@ -99,7 +98,7 @@
         // Create the section if needed.
         if (section == null) {
             section = new SuggestionsSection(
-                    this, mNewTabPageManager, mSuggestionsRanker, mOfflinePageBridge, info);
+                    this, mUiDelegate, mSuggestionsRanker, mOfflinePageBridge, info);
             mSections.put(category, section);
             mSuggestionsRanker.registerCategory(category);
             addChild(section);
@@ -114,12 +113,12 @@
     @Override
     public void onNewSuggestions(@CategoryInt int category) {
         @CategoryStatusEnum
-        int status = mNewTabPageManager.getSuggestionsSource().getCategoryStatus(category);
+        int status = mUiDelegate.getSuggestionsSource().getCategoryStatus(category);
 
         if (!canLoadSuggestions(category, status)) return;
 
         List<SnippetArticle> suggestions =
-                mNewTabPageManager.getSuggestionsSource().getSuggestionsForCategory(category);
+                mUiDelegate.getSuggestionsSource().getSuggestionsForCategory(category);
 
         Log.d(TAG, "Received %d new suggestions for category %d.", suggestions.size(), category);
 
@@ -132,7 +131,7 @@
     @Override
     public void onMoreSuggestions(@CategoryInt int category, List<SnippetArticle> suggestions) {
         @CategoryStatusEnum
-        int status = mNewTabPageManager.getSuggestionsSource().getCategoryStatus(category);
+        int status = mUiDelegate.getSuggestionsSource().getCategoryStatus(category);
         if (!canLoadSuggestions(category, status)) return;
 
         setSuggestions(category, suggestions, status, /* replaceExisting = */ false);
@@ -217,7 +216,7 @@
     public void dismissSection(SuggestionsSection section) {
         assert SnippetsConfig.isSectionDismissalEnabled();
 
-        mNewTabPageManager.getSuggestionsSource().dismissCategory(section.getCategory());
+        mUiDelegate.getSuggestionsSource().dismissCategory(section.getCategory());
         removeSection(section);
     }
 
@@ -236,9 +235,9 @@
      * Restores any sections that have been dismissed and triggers a new fetch.
      */
     public void restoreDismissedSections() {
-        mNewTabPageManager.getSuggestionsSource().restoreDismissedCategories();
+        mUiDelegate.getSuggestionsSource().restoreDismissedCategories();
         resetSections(/* allowEmptySections = */ true);
-        mNewTabPageManager.getSuggestionsSource().fetchRemoteSuggestions();
+        mUiDelegate.getSuggestionsSource().fetchRemoteSuggestions();
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
index 0a31854..e83e92a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
@@ -14,8 +14,8 @@
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.ntp.ContextMenuManager;
 import org.chromium.chrome.browser.ntp.NewTabPage.DestructionObserver;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.UiConfig;
 import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
 import org.chromium.chrome.browser.signin.AccountSigninActivity;
@@ -23,6 +23,7 @@
 import org.chromium.chrome.browser.signin.SigninManager;
 import org.chromium.chrome.browser.signin.SigninManager.SignInAllowedObserver;
 import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver;
+import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
 
 /**
  * Shows a card prompting the user to sign in. This item is also an {@link OptionalLeaf}, and sign
@@ -42,7 +43,7 @@
     @Nullable
     private final SigninObserver mObserver;
 
-    public SignInPromo(NewTabPageManager newTabPageManager) {
+    public SignInPromo(SuggestionsUiDelegate uiDelegate) {
         mDismissed = ChromePreferenceManager.getInstance(ContextUtils.getApplicationContext())
                              .getNewTabPageSigninPromoDismissed();
 
@@ -51,7 +52,7 @@
             mObserver = null;
         } else {
             mObserver = new SigninObserver(signinManager);
-            newTabPageManager.addDestructionObserver(mObserver);
+            uiDelegate.addDestructionObserver(mObserver);
         }
 
         setVisible(signinManager.isSignInAllowed() && !signinManager.isSignedInOnNative());
@@ -175,10 +176,9 @@
      * View Holder for {@link SignInPromo}.
      */
     public static class ViewHolder extends StatusCardViewHolder {
-
-        public ViewHolder(NewTabPageRecyclerView parent, NewTabPageManager newTabPageManager,
+        public ViewHolder(NewTabPageRecyclerView parent, ContextMenuManager contextMenuManager,
                 UiConfig config) {
-            super(parent, newTabPageManager, config);
+            super(parent, contextMenuManager, config);
             getParams().topMargin = parent.getResources().getDimensionPixelSize(
                     R.dimen.ntp_sign_in_promo_margin_top);
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/StatusCardViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/StatusCardViewHolder.java
index 0c9dfdd..ace1a32 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/StatusCardViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/StatusCardViewHolder.java
@@ -15,7 +15,6 @@
 import org.chromium.chrome.browser.ntp.ContextMenuManager;
 import org.chromium.chrome.browser.ntp.ContextMenuManager.ContextMenuItemId;
 import org.chromium.chrome.browser.ntp.ContextMenuManager.Delegate;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.UiConfig;
 import org.chromium.chrome.browser.ntp.snippets.SnippetsConfig;
 
@@ -28,8 +27,8 @@
     private final Button mActionView;
 
     public StatusCardViewHolder(
-            NewTabPageRecyclerView parent, NewTabPageManager newTabPageManager, UiConfig config) {
-        super(R.layout.new_tab_page_status_card, parent, config, newTabPageManager);
+            NewTabPageRecyclerView parent, ContextMenuManager contextMenuManager, UiConfig config) {
+        super(R.layout.new_tab_page_status_card, parent, config, contextMenuManager);
         mTitleView = (TextView) itemView.findViewById(R.id.status_title);
         mBodyView = (TextView) itemView.findViewById(R.id.status_body);
         mActionView = (Button) itemView.findViewById(R.id.status_action_button);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsCategoryInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsCategoryInfo.java
index af300c9..e6c76f0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsCategoryInfo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsCategoryInfo.java
@@ -5,11 +5,10 @@
 package org.chromium.chrome.browser.ntp.cards;
 
 import org.chromium.base.Log;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.snippets.CategoryInt;
 import org.chromium.chrome.browser.ntp.snippets.ContentSuggestionsCardLayout.ContentSuggestionsCardLayoutEnum;
-
 import org.chromium.chrome.browser.ntp.snippets.KnownCategories;
+import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegate;
 
 /**
  * Contains meta information about a Category. Equivalent of the CategoryInfo class in
@@ -53,7 +52,7 @@
      * Whether the category supports a "ViewAll" action, that triggers displaying all the content
      * related to the current categories.
      * @see ActionItem
-     * @see #performViewAllAction(NewTabPageManager)
+     * @see #performViewAllAction(SuggestionsNavigationDelegate)
      */
     private final boolean mHasViewAllAction;
 
@@ -121,16 +120,16 @@
      * Performs the View All action for the provided category, navigating navigating to the view
      * showing all the content.
      */
-    public void performViewAllAction(NewTabPageManager manager) {
+    public void performViewAllAction(SuggestionsNavigationDelegate navigationDelegate) {
         switch (mCategory) {
             case KnownCategories.BOOKMARKS:
-                manager.navigateToBookmarks();
+                navigationDelegate.navigateToBookmarks();
                 break;
             case KnownCategories.DOWNLOADS:
-                manager.navigateToDownloadManager();
+                navigationDelegate.navigateToDownloadManager();
                 break;
             case KnownCategories.FOREIGN_TABS:
-                manager.navigateToRecentTabs();
+                navigationDelegate.navigateToRecentTabs();
                 break;
             case KnownCategories.PHYSICAL_WEB_PAGES:
             case KnownCategories.RECENT_TABS:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSection.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSection.java
index 62404a7..d0406d6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSection.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSection.java
@@ -8,7 +8,6 @@
 import org.chromium.base.Log;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.browser.ntp.NewTabPage.DestructionObserver;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.snippets.CategoryInt;
 import org.chromium.chrome.browser.ntp.snippets.CategoryStatus.CategoryStatusEnum;
 import org.chromium.chrome.browser.ntp.snippets.SectionHeader;
@@ -20,6 +19,7 @@
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
 import org.chromium.chrome.browser.offlinepages.OfflinePageItem;
 import org.chromium.chrome.browser.suggestions.SuggestionsRanker;
+import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -60,7 +60,7 @@
         void dismissSection(SuggestionsSection section);
     }
 
-    public SuggestionsSection(Delegate delegate, NewTabPageManager manager,
+    public SuggestionsSection(Delegate delegate, SuggestionsUiDelegate uiDelegate,
             SuggestionsRanker ranker, OfflinePageBridge offlinePageBridge,
             SuggestionsCategoryInfo info) {
         mDelegate = delegate;
@@ -68,25 +68,27 @@
         mOfflinePageBridge = offlinePageBridge;
 
         mHeader = new SectionHeader(info.getTitle());
-        mSuggestionsList = new SuggestionsList(manager, ranker, info);
+        mSuggestionsList = new SuggestionsList(uiDelegate, ranker, info);
         mStatus = StatusItem.createNoSuggestionsItem(info);
         mMoreButton = new ActionItem(this, ranker);
         mProgressIndicator = new ProgressItem();
         addChildren(mHeader, mSuggestionsList, mStatus, mMoreButton, mProgressIndicator);
 
-        setupOfflinePageBridgeObserver(manager);
+        setupOfflinePageBridgeObserver(uiDelegate);
         refreshChildrenVisibility();
     }
 
     private static class SuggestionsList extends ChildNode implements Iterable<SnippetArticle> {
         private final List<SnippetArticle> mSuggestions = new ArrayList<>();
-        private final NewTabPageManager mNewTabPageManager;
+
+        // TODO(crbug.com/677672): Replace by SuggestionSource when it handles destruction.
+        private final SuggestionsUiDelegate mUiDelegate;
         private final SuggestionsRanker mSuggestionsRanker;
         private final SuggestionsCategoryInfo mCategoryInfo;
 
-        public SuggestionsList(NewTabPageManager newTabPageManager,
-                SuggestionsRanker ranker, SuggestionsCategoryInfo categoryInfo) {
-            mNewTabPageManager = newTabPageManager;
+        public SuggestionsList(SuggestionsUiDelegate uiDelegate, SuggestionsRanker ranker,
+                SuggestionsCategoryInfo categoryInfo) {
+            mUiDelegate = uiDelegate;
             mSuggestionsRanker = ranker;
             mCategoryInfo = categoryInfo;
         }
@@ -166,7 +168,7 @@
         @Override
         public void dismissItem(int position, Callback<String> itemRemovedCallback) {
             checkIndex(position);
-            SuggestionsSource suggestionsSource = mNewTabPageManager.getSuggestionsSource();
+            SuggestionsSource suggestionsSource = mUiDelegate.getSuggestionsSource();
             if (suggestionsSource == null) {
                 // It is possible for this method to be called after the NewTabPage has had
                 // destroy() called. This can happen when
@@ -194,7 +196,7 @@
         }
     }
 
-    private void setupOfflinePageBridgeObserver(NewTabPageManager manager) {
+    private void setupOfflinePageBridgeObserver(SuggestionsUiDelegate uiDelegate) {
         final OfflinePageBridge.OfflinePageModelObserver observer =
                 new OfflinePageBridge.OfflinePageModelObserver() {
                     @Override
@@ -224,7 +226,7 @@
 
         mOfflinePageBridge.addObserver(observer);
 
-        manager.addDestructionObserver(new DestructionObserver() {
+        uiDelegate.addDestructionObserver(new DestructionObserver() {
             @Override
             public void onDestroy() {
                 mIsNtpDestroyed = true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java
index 92cdf2b..a96cbd38 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java
@@ -31,7 +31,6 @@
 import org.chromium.chrome.browser.ntp.ContextMenuManager.ContextMenuItemId;
 import org.chromium.chrome.browser.ntp.ContextMenuManager.Delegate;
 import org.chromium.chrome.browser.ntp.DisplayStyleObserver;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.UiConfig;
 import org.chromium.chrome.browser.ntp.cards.CardViewHolder;
 import org.chromium.chrome.browser.ntp.cards.CardsVariationParameters;
@@ -39,6 +38,7 @@
 import org.chromium.chrome.browser.ntp.cards.ImpressionTracker;
 import org.chromium.chrome.browser.ntp.cards.NewTabPageRecyclerView;
 import org.chromium.chrome.browser.ntp.cards.SuggestionsCategoryInfo;
+import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
 import org.chromium.ui.mojom.WindowOpenDisposition;
 
 import java.net.URI;
@@ -59,7 +59,7 @@
 
     public static final int PARTIAL_UPDATE_OFFLINE_ID = 1;
 
-    private final NewTabPageManager mNewTabPageManager;
+    private final SuggestionsUiDelegate mUiDelegate;
     private final TextView mHeadlineTextView;
     private final TextView mPublisherTextView;
     private final TextView mArticleSnippetTextView;
@@ -77,16 +77,17 @@
 
     /**
      * Constructs a {@link SnippetArticleViewHolder} item used to display snippets.
-     *
-     * @param parent The NewTabPageRecyclerView that is going to contain the newly created view.
-     * @param manager The NewTabPageManager object used to open an article.
+     *  @param parent The NewTabPageRecyclerView that is going to contain the newly created view.
+     * @param contextMenuManager The manager responsible for the context menu.
+     * @param uiDelegate The delegate object used to open an article, fetch thumbnails, etc.
      * @param uiConfig The NTP UI configuration object used to adjust the article UI.
      */
-    public SnippetArticleViewHolder(NewTabPageRecyclerView parent, NewTabPageManager manager,
+    public SnippetArticleViewHolder(NewTabPageRecyclerView parent,
+            ContextMenuManager contextMenuManager, SuggestionsUiDelegate uiDelegate,
             UiConfig uiConfig) {
-        super(R.layout.new_tab_page_snippets_card, parent, uiConfig, manager);
+        super(R.layout.new_tab_page_snippets_card, parent, uiConfig, contextMenuManager);
 
-        mNewTabPageManager = manager;
+        mUiDelegate = uiDelegate;
         mThumbnailView = (ImageView) itemView.findViewById(R.id.article_thumbnail);
         mHeadlineTextView = (TextView) itemView.findViewById(R.id.article_headline);
         mPublisherTextView = (TextView) itemView.findViewById(R.id.article_publisher);
@@ -110,19 +111,22 @@
     @Override
     public void onImpression() {
         if (mArticle != null && mArticle.trackImpression()) {
-            mNewTabPageManager.getSuggestionsMetricsReporter().onSuggestionShown(mArticle);
+            mUiDelegate.getMetricsReporter().onSuggestionShown(mArticle);
             mRecyclerView.onSnippetImpression();
         }
     }
 
     @Override
     public void onCardTapped() {
-        mNewTabPageManager.openSnippet(WindowOpenDisposition.CURRENT_TAB, mArticle);
+        int windowDisposition = WindowOpenDisposition.CURRENT_TAB;
+        mUiDelegate.getMetricsReporter().onSuggestionOpened(mArticle, windowDisposition);
+        mUiDelegate.getNavigationDelegate().openSnippet(windowDisposition, mArticle);
     }
 
     @Override
     public void openItem(int windowDisposition) {
-        mNewTabPageManager.openSnippet(windowDisposition, mArticle);
+        mUiDelegate.getMetricsReporter().onSuggestionOpened(mArticle, windowDisposition);
+        mUiDelegate.getNavigationDelegate().openSnippet(windowDisposition, mArticle);
     }
 
     @Override
@@ -151,7 +155,7 @@
 
     @Override
     public void onContextMenuCreated() {
-        mNewTabPageManager.getSuggestionsMetricsReporter().onSuggestionMenuOpened(mArticle);
+        mUiDelegate.getMetricsReporter().onSuggestionMenuOpened(mArticle);
     }
 
     @Override
@@ -258,8 +262,7 @@
             } else {
                 mThumbnailView.setImageResource(R.drawable.ic_snippet_thumbnail_placeholder);
                 mImageCallback = new FetchImageCallback(this, mArticle);
-                mNewTabPageManager.getSuggestionsSource()
-                        .fetchSuggestionImage(mArticle, mImageCallback);
+                mUiDelegate.getSuggestionsSource().fetchSuggestionImage(mArticle, mImageCallback);
             }
         }
 
@@ -344,7 +347,7 @@
     }
 
     private void fetchFaviconFromLocalCache(final URI snippetUri, final boolean fallbackToService) {
-        mNewTabPageManager.getLocalFaviconImageForURL(
+        mUiDelegate.getLocalFaviconImageForURL(
                 getSnippetDomain(snippetUri), mPublisherFaviconSizePx, new FaviconImageCallback() {
                     @Override
                     public void onFaviconAvailable(Bitmap image, String iconUrl) {
@@ -368,7 +371,7 @@
         if (sizePx == 0) return;
 
         // Replace the default icon by another one from the service when it is fetched.
-        mNewTabPageManager.ensureIconIsAvailable(
+        mUiDelegate.ensureIconIsAvailable(
                 getSnippetDomain(snippetUri), // Store to the cache for the whole domain.
                 String.format(FAVICON_SERVICE_FORMAT, snippetUri.getHost(), sizePx),
                 /*useLargeIcon=*/false, /*isTemporary=*/true, new IconAvailabilityCallback() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsActivity.java
index 0d66ebc7..a4c4f0de 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsActivity.java
@@ -4,154 +4,44 @@
 
 package org.chromium.chrome.browser.suggestions;
 
-import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.Menu;
 
-import org.chromium.base.Callback;
-import org.chromium.base.ObserverList;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.SynchronousInitializationActivity;
-import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback;
-import org.chromium.chrome.browser.favicon.FaviconHelper.IconAvailabilityCallback;
-import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback;
 import org.chromium.chrome.browser.ntp.ContextMenuManager;
-import org.chromium.chrome.browser.ntp.LogoBridge.LogoObserver;
-import org.chromium.chrome.browser.ntp.MostVisitedItem;
-import org.chromium.chrome.browser.ntp.NewTabPage.DestructionObserver;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.UiConfig;
 import org.chromium.chrome.browser.ntp.cards.NewTabPageAdapter;
 import org.chromium.chrome.browser.ntp.cards.NewTabPageRecyclerView;
-import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
 import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge;
-import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
-import org.chromium.chrome.browser.profiles.MostVisitedSites.MostVisitedURLsObserver;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 
-import java.util.Set;
+import java.lang.ref.WeakReference;
 
 /**
  * Experimental activity to show content suggestions outside of the New Tab Page.
  */
 public class ContentSuggestionsActivity extends SynchronousInitializationActivity {
-    private final ObserverList<DestructionObserver> mDestructionObservers = new ObserverList<>();
+    private static WeakReference<ChromeActivity> sCallerActivity;
 
     private ContextMenuManager mContextMenuManager;
+    private SuggestionsUiDelegateImpl mSuggestionsManager;
     private SnippetsBridge mSnippetsBridge;
-    private NewTabPageRecyclerView mRecyclerView;
 
-    public static void launch(Context context) {
+    public static void launch(ChromeActivity activity) {
+        sCallerActivity = new WeakReference<>(activity);
+
         Intent intent = new Intent();
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        intent.setClass(context, ContentSuggestionsActivity.class);
-        context.startActivity(intent);
-    }
-
-    private class SuggestionsNewTabPageManager implements NewTabPageManager {
-        @Override
-        public void removeMostVisitedItem(MostVisitedItem item) {}
-
-        @Override
-        public void openMostVisitedItem(int windowDisposition, MostVisitedItem item) {}
-
-        @Override
-        public boolean isLocationBarShownInNTP() {
-            return false;
-        }
-
-        @Override
-        public boolean isVoiceSearchEnabled() {
-            return false;
-        }
-
-        @Override
-        public boolean isFakeOmniboxTextEnabledTablet() {
-            return false;
-        }
-
-        @Override
-        public boolean isOpenInNewWindowEnabled() {
-            return true;
-        }
-
-        @Override
-        public boolean isOpenInIncognitoEnabled() {
-            return true;
-        }
-
-        @Override
-        public void navigateToBookmarks() {}
-
-        @Override
-        public void navigateToRecentTabs() {}
-
-        @Override
-        public void navigateToDownloadManager() {}
-
-        @Override
-        public void openSnippet(int windowOpenDisposition, SnippetArticle article) {}
-
-        @Override
-        public void focusSearchBox(boolean beginVoiceSearch, String pastedText) {}
-
-        @Override
-        public void setMostVisitedURLsObserver(MostVisitedURLsObserver observer, int numResults) {}
-
-        @Override
-        public void getLocalFaviconImageForURL(
-                String url, int size, FaviconImageCallback faviconCallback) {}
-
-        @Override
-        public void getLargeIconForUrl(String url, int size, LargeIconCallback callback) {}
-
-        @Override
-        public void ensureIconIsAvailable(String pageUrl, String iconUrl, boolean isLargeIcon,
-                boolean isTemporary, IconAvailabilityCallback callback) {}
-
-        @Override
-        public void getUrlsAvailableOffline(Set<String> pageUrls, Callback<Set<String>> callback) {}
-
-        @Override
-        public void onLogoClicked(boolean isAnimatedLogoShowing) {}
-
-        @Override
-        public void getSearchProviderLogo(LogoObserver logoObserver) {}
-
-        @Override
-        public void onLoadingComplete(MostVisitedItem[] mostVisitedItems) {}
-
-        @Override
-        public void onLearnMoreClicked() {}
-
-        @Override
-        public SuggestionsSource getSuggestionsSource() {
-            return mSnippetsBridge;
-        }
-
-        @Override
-        public void addDestructionObserver(DestructionObserver destructionObserver) {
-            mDestructionObservers.addObserver(destructionObserver);
-        }
-
-        @Override
-        public boolean isCurrentPage() {
-            return true;
-        }
-
-        @Override
-        public ContextMenuManager getContextMenuManager() {
-            return mContextMenuManager;
-        }
-
-        @Override
-        public SuggestionsMetricsReporter getSuggestionsMetricsReporter() {
-            return mSnippetsBridge;
-        }
+        intent.setClass(activity, ContentSuggestionsActivity.class);
+        activity.startActivity(intent);
     }
 
     @Override
@@ -160,21 +50,35 @@
 
         assert ChromeFeatureList.isEnabled(ChromeFeatureList.NTP_SUGGESTIONS_STANDALONE_UI);
 
-        mRecyclerView = (NewTabPageRecyclerView) LayoutInflater.from(this).inflate(
-                R.layout.new_tab_page_recycler_view, null, false);
+        // TODO(dgn): properly handle retrieving the tab information, or the base activity being
+        // destroyed. (https://crbug.com/677672)
+        ChromeActivity activity = sCallerActivity.get();
+        if (activity == null) throw new IllegalStateException();
+
+        NewTabPageRecyclerView recyclerView =
+                (NewTabPageRecyclerView) LayoutInflater.from(this).inflate(
+                        R.layout.new_tab_page_recycler_view, null, false);
 
         Profile profile = Profile.getLastUsedProfile();
+        UiConfig uiConfig = new UiConfig(recyclerView);
+
+        Tab currentTab = activity.getActivityTab();
+        TabModelSelector tabModelSelector = activity.getTabModelSelector();
+
         mSnippetsBridge = new SnippetsBridge(profile);
+        SuggestionsNavigationDelegate navigationDelegate =
+                new SuggestionsNavigationDelegateImpl(this, profile, currentTab, tabModelSelector);
 
-        NewTabPageManager manager = new SuggestionsNewTabPageManager();
-        mContextMenuManager = new ContextMenuManager(this, manager, mRecyclerView);
-        UiConfig uiConfig = new UiConfig(mRecyclerView);
-        NewTabPageAdapter adapter = new NewTabPageAdapter(
-                manager, null, uiConfig, OfflinePageBridge.getForProfile(profile));
-        mRecyclerView.setAdapter(adapter);
-        mRecyclerView.setUpSwipeToDismiss();
+        mSuggestionsManager = new SuggestionsUiDelegateImpl(
+                mSnippetsBridge, mSnippetsBridge, navigationDelegate, profile, currentTab);
+        mContextMenuManager = new ContextMenuManager(this, navigationDelegate, recyclerView);
 
-        setContentView(mRecyclerView);
+        NewTabPageAdapter adapter = new NewTabPageAdapter(mSuggestionsManager, null, uiConfig,
+                OfflinePageBridge.getForProfile(profile), mContextMenuManager);
+        recyclerView.setAdapter(adapter);
+        recyclerView.setUpSwipeToDismiss();
+
+        setContentView(recyclerView);
     }
 
     @Override
@@ -184,13 +88,8 @@
 
     @Override
     protected void onDestroy() {
-        for (DestructionObserver observer : mDestructionObservers) {
-            observer.onDestroy();
-        }
-
         mSnippetsBridge.destroy();
-        mSnippetsBridge = null;
-
+        mSuggestionsManager.onDestroy();
         super.onDestroy();
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java
new file mode 100644
index 0000000..22924a31
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java
@@ -0,0 +1,41 @@
+// 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.
+
+package org.chromium.chrome.browser.suggestions;
+
+import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
+import org.chromium.content_public.browser.LoadUrlParams;
+
+/**
+ * Interface exposing to the suggestion surface methods to navigate to other parts of the browser.
+ */
+public interface SuggestionsNavigationDelegate {
+    /** @return Whether context menus should allow the option to open a link in incognito. */
+    boolean isOpenInIncognitoEnabled();
+
+    /** @return Whether context menus should allow the option to open a link in a new window. */
+    boolean isOpenInNewWindowEnabled();
+
+    /** Opens the bookmarks page in the current tab. */
+    void navigateToBookmarks();
+
+    /** Opens the Download Manager UI in the current tab. */
+    void navigateToDownloadManager();
+
+    /** Opens the recent tabs page in the current tab. */
+    void navigateToRecentTabs();
+
+    /** Opens the help page for the content suggestions in the current tab. */
+    void navigateToHelpPage();
+
+    /**
+     * Opens a content suggestion and records related metrics.
+     * @param windowOpenDisposition How to open (current tab, new tab, new window etc).
+     * @param article The content suggestion to open.
+     */
+    void openSnippet(int windowOpenDisposition, SnippetArticle article);
+
+    /** Opens an url with the desired disposition. */
+    void openUrl(int windowOpenDisposition, LoadUrlParams loadUrlParams);
+}
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegateImpl.java
new file mode 100644
index 0000000..40fc5277
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegateImpl.java
@@ -0,0 +1,192 @@
+// 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.
+
+package org.chromium.chrome.browser.suggestions;
+
+import android.app.Activity;
+
+import org.chromium.base.metrics.RecordUserAction;
+import org.chromium.chrome.browser.UrlConstants;
+import org.chromium.chrome.browser.bookmarks.BookmarkUtils;
+import org.chromium.chrome.browser.download.DownloadUtils;
+import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
+import org.chromium.chrome.browser.ntp.NewTabPageUma;
+import org.chromium.chrome.browser.ntp.snippets.KnownCategories;
+import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
+import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
+import org.chromium.chrome.browser.preferences.PrefServiceBridge;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tabmodel.TabModel;
+import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType;
+import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.browser.tabmodel.TabModelUtils;
+import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
+import org.chromium.content_public.browser.LoadUrlParams;
+import org.chromium.content_public.common.Referrer;
+import org.chromium.ui.base.PageTransition;
+import org.chromium.ui.mojom.WindowOpenDisposition;
+
+/**
+ * {@link SuggestionsUiDelegate} implementation.
+ */
+public class SuggestionsNavigationDelegateImpl implements SuggestionsNavigationDelegate {
+    private static final String CHROME_CONTENT_SUGGESTIONS_REFERRER =
+            "https://www.googleapis.com/auth/chrome-content-suggestions";
+
+    private final Activity mActivity;
+    private final Profile mProfile;
+
+    private final Tab mTab;
+    private final TabModelSelector mTabModelSelector;
+
+    public SuggestionsNavigationDelegateImpl(
+            Activity activity, Profile profile, Tab currentTab, TabModelSelector tabModelSelector) {
+        mActivity = activity;
+        mProfile = profile;
+        mTab = currentTab;
+        mTabModelSelector = tabModelSelector;
+    }
+
+    @Override
+    public boolean isOpenInNewWindowEnabled() {
+        return MultiWindowUtils.getInstance().isOpenInOtherWindowSupported(mActivity);
+    }
+
+    @Override
+    public boolean isOpenInIncognitoEnabled() {
+        return PrefServiceBridge.getInstance().isIncognitoModeEnabled();
+    }
+
+    @Override
+    public void navigateToBookmarks() {
+        RecordUserAction.record("MobileNTPSwitchToBookmarks");
+        BookmarkUtils.showBookmarkManager(mActivity);
+    }
+
+    @Override
+    public void navigateToRecentTabs() {
+        RecordUserAction.record("MobileNTPSwitchToOpenTabs");
+        mTab.loadUrl(new LoadUrlParams(UrlConstants.RECENT_TABS_URL));
+    }
+
+    @Override
+    public void navigateToDownloadManager() {
+        assert DownloadUtils.isDownloadHomeEnabled();
+
+        RecordUserAction.record("MobileNTPSwitchToDownloadManager");
+        DownloadUtils.showDownloadManager(mActivity, mTab);
+    }
+
+    @Override
+    public void navigateToHelpPage() {
+        NewTabPageUma.recordAction(NewTabPageUma.ACTION_CLICKED_LEARN_MORE);
+        String url = "https://support.google.com/chrome/?p=new_tab";
+        // TODO(mastiz): Change this to LINK?
+        openUrl(WindowOpenDisposition.CURRENT_TAB,
+                new LoadUrlParams(url, PageTransition.AUTO_BOOKMARK));
+    }
+
+    @Override
+    public void openSnippet(int windowOpenDisposition, SnippetArticle article) {
+        NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_SNIPPET);
+
+        if (article.mIsAssetDownload) {
+            assert windowOpenDisposition == WindowOpenDisposition.CURRENT_TAB
+                    || windowOpenDisposition == WindowOpenDisposition.NEW_WINDOW
+                    || windowOpenDisposition == WindowOpenDisposition.NEW_FOREGROUND_TAB;
+            DownloadUtils.openFile(
+                    article.getAssetDownloadFile(), article.getAssetDownloadMimeType(), false);
+            return;
+        }
+
+        if (article.isRecentTab()) {
+            assert windowOpenDisposition == WindowOpenDisposition.CURRENT_TAB;
+            // TODO(vitaliii): Add a debug check that the result is true after crbug.com/662924
+            // is resolved.
+            openRecentTabSnippet(article);
+            return;
+        }
+
+        // TODO(treib): Also track other dispositions. crbug.com/665915
+        if (windowOpenDisposition == WindowOpenDisposition.CURRENT_TAB) {
+            NewTabPageUma.monitorContentSuggestionVisit(mTab, article.mCategory);
+        }
+
+        LoadUrlParams loadUrlParams;
+        // We explicitly open an offline page only for offline page downloads. For all other
+        // sections the URL is opened and it is up to Offline Pages whether to open its offline
+        // page (e.g. when offline).
+        if (article.isDownload() && !article.mIsAssetDownload) {
+            assert article.getOfflinePageOfflineId() != null;
+            assert windowOpenDisposition == WindowOpenDisposition.CURRENT_TAB
+                    || windowOpenDisposition == WindowOpenDisposition.NEW_WINDOW
+                    || windowOpenDisposition == WindowOpenDisposition.NEW_FOREGROUND_TAB;
+            loadUrlParams = OfflinePageUtils.getLoadUrlParamsForOpeningOfflineVersion(
+                    article.mUrl, article.getOfflinePageOfflineId());
+            // Extra headers are not read in loadUrl, but verbatim headers are.
+            loadUrlParams.setVerbatimHeaders(loadUrlParams.getExtraHeadersString());
+        } else {
+            loadUrlParams = new LoadUrlParams(article.mUrl, PageTransition.AUTO_BOOKMARK);
+        }
+
+        // For article suggestions, we set the referrer. This is exploited
+        // to filter out these history entries for NTP tiles.
+        // TODO(mastiz): Extend this with support for other categories.
+        if (article.mCategory == KnownCategories.ARTICLES) {
+            loadUrlParams.setReferrer(new Referrer(
+                    CHROME_CONTENT_SUGGESTIONS_REFERRER, Referrer.REFERRER_POLICY_ALWAYS));
+        }
+
+        openUrl(windowOpenDisposition, loadUrlParams);
+    }
+
+    @Override
+    public void openUrl(int windowOpenDisposition, LoadUrlParams loadUrlParams) {
+        switch (windowOpenDisposition) {
+            case WindowOpenDisposition.CURRENT_TAB:
+                mTab.loadUrl(loadUrlParams);
+                break;
+            case WindowOpenDisposition.NEW_FOREGROUND_TAB:
+                openUrlInNewTab(loadUrlParams, false);
+                break;
+            case WindowOpenDisposition.OFF_THE_RECORD:
+                openUrlInNewTab(loadUrlParams, true);
+                break;
+            case WindowOpenDisposition.NEW_WINDOW:
+                openUrlInNewWindow(loadUrlParams);
+                break;
+            case WindowOpenDisposition.SAVE_TO_DISK:
+                saveUrlForOffline(loadUrlParams.getUrl());
+                break;
+            default:
+                assert false;
+        }
+    }
+
+    private boolean openRecentTabSnippet(SnippetArticle article) {
+        TabModel tabModel = mTabModelSelector.getModel(false);
+        int tabId = Integer.parseInt(article.getRecentTabId());
+        int tabIndex = TabModelUtils.getTabIndexById(tabModel, tabId);
+        if (tabIndex == TabModel.INVALID_TAB_INDEX) return false;
+        TabModelUtils.setIndex(tabModel, tabIndex);
+        return true;
+    }
+
+    private void openUrlInNewWindow(LoadUrlParams loadUrlParams) {
+        TabDelegate tabDelegate = new TabDelegate(false);
+        tabDelegate.createTabInOtherWindow(loadUrlParams, mActivity, mTab.getParentId());
+    }
+
+    private void openUrlInNewTab(LoadUrlParams loadUrlParams, boolean incognito) {
+        mTabModelSelector.openNewTab(
+                loadUrlParams, TabLaunchType.FROM_LONGPRESS_BACKGROUND, mTab, incognito);
+    }
+
+    private void saveUrlForOffline(String url) {
+        OfflinePageBridge.getForProfile(mProfile).savePageLater(
+                url, "ntp_suggestions", true /* userRequested */);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsUiDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsUiDelegate.java
new file mode 100644
index 0000000..64a68505a
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsUiDelegate.java
@@ -0,0 +1,77 @@
+// 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.
+
+package org.chromium.chrome.browser.suggestions;
+
+import org.chromium.base.Callback;
+import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback;
+import org.chromium.chrome.browser.favicon.FaviconHelper.IconAvailabilityCallback;
+import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback;
+import org.chromium.chrome.browser.ntp.NewTabPage.DestructionObserver;
+import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource;
+
+import java.util.Set;
+
+/**
+ * Interface between the suggestion surface and the rest of the browser.
+ */
+public interface SuggestionsUiDelegate {
+    // Dependency injection
+    // TODO(dgn): remove these methods once the users have a different way to get a reference
+    // to these objects (https://crbug.com/677672)
+
+    /** Convenience method to access the {@link SuggestionsSource}. */
+    SuggestionsSource getSuggestionsSource();
+
+    /** Convenience method to access the {@link SuggestionsMetricsReporter}. */
+    SuggestionsMetricsReporter getMetricsReporter();
+
+    /** Convenience method to access the {@link SuggestionsNavigationDelegate}. */
+    SuggestionsNavigationDelegate getNavigationDelegate();
+
+    // Favicons
+
+    /**
+     * Checks if an icon with the given URL is available. If not,
+     * downloads it and stores it as a favicon/large icon for the given {@code pageUrl}.
+     * @param pageUrl The URL of the site whose icon is being requested.
+     * @param iconUrl The URL of the favicon/large icon.
+     * @param isLargeIcon Whether the {@code iconUrl} represents a large icon or favicon.
+     * @param callback The callback to be notified when the favicon has been checked.
+     */
+    void ensureIconIsAvailable(String pageUrl, String iconUrl, boolean isLargeIcon,
+            boolean isTemporary, IconAvailabilityCallback callback);
+
+    /**
+     * Gets the large icon (e.g. favicon or touch icon) for a given URL.
+     * @param url The URL of the site whose icon is being requested.
+     * @param size The desired size of the icon in pixels.
+     * @param callback The callback to be notified when the icon is available.
+     */
+    void getLargeIconForUrl(String url, int size, LargeIconCallback callback);
+
+    /**
+     * Gets the favicon image for a given URL.
+     * @param url The URL of the site whose favicon is being requested.
+     * @param size The desired size of the favicon in pixels.
+     * @param faviconCallback The callback to be notified when the favicon is available.
+     */
+    void getLocalFaviconImageForURL(String url, int size, FaviconImageCallback faviconCallback);
+
+    // Feature/State checks
+
+    /**
+     * Registers a {@link DestructionObserver}, notified when the New Tab Page goes away.
+     */
+    void addDestructionObserver(DestructionObserver destructionObserver);
+
+    // Offline
+
+    /**
+     * Checks if the pages with the given URLs are available offline.
+     * @param pageUrls The URLs of the sites whose offline availability is requested.
+     * @param callback Fired when the results are available.
+     */
+    void getUrlsAvailableOffline(Set<String> pageUrls, Callback<Set<String>> callback);
+}
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsUiDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsUiDelegateImpl.java
new file mode 100644
index 0000000..74490ce
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsUiDelegateImpl.java
@@ -0,0 +1,197 @@
+// 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.
+
+package org.chromium.chrome.browser.suggestions;
+
+import android.net.Uri;
+import android.os.SystemClock;
+import android.support.annotation.Nullable;
+
+import org.chromium.base.Callback;
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.favicon.FaviconHelper;
+import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback;
+import org.chromium.chrome.browser.favicon.FaviconHelper.IconAvailabilityCallback;
+import org.chromium.chrome.browser.favicon.LargeIconBridge;
+import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback;
+import org.chromium.chrome.browser.ntp.NewTabPage.DestructionObserver;
+import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource;
+import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.tab.Tab;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * {@link SuggestionsUiDelegate} implementation.
+ */
+public class SuggestionsUiDelegateImpl implements SuggestionsUiDelegate {
+    private final List<DestructionObserver> mDestructionObservers = new ArrayList<>();
+    private final SuggestionsSource mSuggestionsSource;
+    private final SuggestionsMetricsReporter mSuggestionsMetricsReporter;
+    private final SuggestionsNavigationDelegate mSuggestionsNavigationDelegate;
+
+    private final Profile mProfile;
+
+    private final Tab mTab;
+
+    private FaviconHelper mFaviconHelper;
+    private LargeIconBridge mLargeIconBridge;
+
+    private boolean mIsDestroyed;
+
+    public SuggestionsUiDelegateImpl(SuggestionsSource suggestionsSource,
+            SuggestionsMetricsReporter metricsReporter,
+            SuggestionsNavigationDelegate navigationDelegate, Profile profile, Tab currentTab) {
+        mSuggestionsSource = suggestionsSource;
+        mSuggestionsMetricsReporter = metricsReporter;
+        mSuggestionsNavigationDelegate = navigationDelegate;
+
+        mProfile = profile;
+        mTab = currentTab;
+    }
+
+    @Override
+    public void getLocalFaviconImageForURL(
+            String url, int size, FaviconImageCallback faviconCallback) {
+        if (mIsDestroyed) return;
+        getFaviconHelper().getLocalFaviconImageForURL(mProfile, url, size, faviconCallback);
+    }
+
+    @Override
+    public void getLargeIconForUrl(String url, int size, LargeIconCallback callback) {
+        if (mIsDestroyed) return;
+        getLargeIconBridge().getLargeIconForUrl(url, size, callback);
+    }
+
+    @Override
+    public void ensureIconIsAvailable(String pageUrl, String iconUrl, boolean isLargeIcon,
+            boolean isTemporary, IconAvailabilityCallback callback) {
+        if (mIsDestroyed) return;
+        getFaviconHelper().ensureIconIsAvailable(mProfile, mTab.getWebContents(), pageUrl, iconUrl,
+                isLargeIcon, isTemporary, callback);
+    }
+
+    @Override
+    public void getUrlsAvailableOffline(
+            Set<String> pageUrls, final Callback<Set<String>> callback) {
+        final Set<String> urlsAvailableOffline = new HashSet<>();
+        if (mIsDestroyed || !isNtpOfflinePagesEnabled()) {
+            callback.onResult(urlsAvailableOffline);
+            return;
+        }
+
+        HashSet<String> urlsToCheckForOfflinePage = new HashSet<>();
+
+        for (String pageUrl : pageUrls) {
+            if (isLocalUrl(pageUrl)) {
+                urlsAvailableOffline.add(pageUrl);
+            } else {
+                urlsToCheckForOfflinePage.add(pageUrl);
+            }
+        }
+
+        final long offlineQueryStartTime = SystemClock.elapsedRealtime();
+
+        OfflinePageBridge offlinePageBridge = OfflinePageBridge.getForProfile(mProfile);
+
+        // TODO(dewittj): Remove this code by making the NTP badging available after the NTP is
+        // fully loaded.
+        if (offlinePageBridge == null || !offlinePageBridge.isOfflinePageModelLoaded()) {
+            // Posting a task to avoid potential re-entrancy issues.
+            ThreadUtils.postOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    callback.onResult(urlsAvailableOffline);
+                }
+            });
+            return;
+        }
+
+        offlinePageBridge.checkPagesExistOffline(
+                urlsToCheckForOfflinePage, new Callback<Set<String>>() {
+                    @Override
+                    public void onResult(Set<String> urlsWithOfflinePages) {
+                        urlsAvailableOffline.addAll(urlsWithOfflinePages);
+                        callback.onResult(urlsAvailableOffline);
+                        RecordHistogram.recordTimesHistogram("NewTabPage.OfflineUrlsLoadTime",
+                                SystemClock.elapsedRealtime() - offlineQueryStartTime,
+                                TimeUnit.MILLISECONDS);
+                    }
+                });
+    }
+
+    @Override
+    public SuggestionsSource getSuggestionsSource() {
+        return mSuggestionsSource;
+    }
+
+    @Nullable
+    @Override
+    public SuggestionsMetricsReporter getMetricsReporter() {
+        return mSuggestionsMetricsReporter;
+    }
+
+    @Nullable
+    @Override
+    public SuggestionsNavigationDelegate getNavigationDelegate() {
+        return mSuggestionsNavigationDelegate;
+    }
+
+    @Override
+    public void addDestructionObserver(DestructionObserver destructionObserver) {
+        mDestructionObservers.add(destructionObserver);
+    }
+
+    /** Invalidates the delegate and calls the registered destruction observers. */
+    public void onDestroy() {
+        assert !mIsDestroyed;
+
+        for (DestructionObserver observer : mDestructionObservers) observer.onDestroy();
+
+        if (mFaviconHelper != null) {
+            mFaviconHelper.destroy();
+            mFaviconHelper = null;
+        }
+        if (mLargeIconBridge != null) {
+            mLargeIconBridge.destroy();
+            mLargeIconBridge = null;
+        }
+        mIsDestroyed = true;
+    }
+
+    /**
+     * Utility method to lazily create the {@link FaviconHelper}, and avoid unnecessary native
+     * calls in tests.
+     */
+    private FaviconHelper getFaviconHelper() {
+        assert !mIsDestroyed;
+        if (mFaviconHelper == null) mFaviconHelper = new FaviconHelper();
+        return mFaviconHelper;
+    }
+
+    /**
+     * Utility method to lazily create the {@link LargeIconBridge}, and avoid unnecessary native
+     * calls in tests.
+     */
+    private LargeIconBridge getLargeIconBridge() {
+        assert !mIsDestroyed;
+        if (mLargeIconBridge == null) mLargeIconBridge = new LargeIconBridge(mProfile);
+        return mLargeIconBridge;
+    }
+
+    private boolean isNtpOfflinePagesEnabled() {
+        return ChromeFeatureList.isEnabled(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME);
+    }
+
+    private boolean isLocalUrl(String url) {
+        return "file".equals(Uri.parse(url).getScheme());
+    }
+}
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index f84fd8e..98256ba 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -918,6 +918,10 @@
   "java/src/org/chromium/chrome/browser/snackbar/undo/UndoBarController.java",
   "java/src/org/chromium/chrome/browser/ssl/SecurityStateModel.java",
   "java/src/org/chromium/chrome/browser/suggestions/ContentSuggestionsActivity.java",
+  "java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java",
+  "java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegateImpl.java",
+  "java/src/org/chromium/chrome/browser/suggestions/SuggestionsUiDelegate.java",
+  "java/src/org/chromium/chrome/browser/suggestions/SuggestionsUiDelegateImpl.java",
   "java/src/org/chromium/chrome/browser/suggestions/SuggestionsMetricsReporter.java",
   "java/src/org/chromium/chrome/browser/suggestions/SuggestionsRanker.java",
   "java/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProvider.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
index 091e335..77f946e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
@@ -20,21 +20,18 @@
 import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback;
 import org.chromium.chrome.browser.favicon.FaviconHelper.IconAvailabilityCallback;
 import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback;
-import org.chromium.chrome.browser.ntp.ContextMenuManager;
-import org.chromium.chrome.browser.ntp.LogoBridge.LogoObserver;
-import org.chromium.chrome.browser.ntp.MostVisitedItem;
 import org.chromium.chrome.browser.ntp.NewTabPage.DestructionObserver;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.UiConfig;
 import org.chromium.chrome.browser.ntp.cards.ActionItem;
 import org.chromium.chrome.browser.ntp.cards.NewTabPageAdapter;
 import org.chromium.chrome.browser.ntp.cards.NewTabPageRecyclerView;
 import org.chromium.chrome.browser.ntp.cards.SuggestionsCategoryInfo;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
-import org.chromium.chrome.browser.profiles.MostVisitedSites.MostVisitedURLsObserver;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.suggestions.SuggestionsMetricsReporter;
+import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegate;
 import org.chromium.chrome.browser.suggestions.SuggestionsRanker;
+import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
 import org.chromium.chrome.test.ChromeActivityTestCaseBase;
 import org.chromium.chrome.test.util.RenderUtils.ViewRenderer;
 
@@ -48,7 +45,7 @@
 public class ArticleSnippetsTest extends ChromeActivityTestCaseBase<ChromeActivity> {
     private ViewRenderer mViewRenderer;
 
-    private NewTabPageManager mNtpManager;
+    private SuggestionsUiDelegate mUiDelegate;
     private FakeSuggestionsSource mSnippetsSource;
     private NewTabPageRecyclerView mRecyclerView;
     private NewTabPageAdapter mAdapter;
@@ -81,8 +78,9 @@
                 View aboveTheFold = new View(getActivity());
 
                 mRecyclerView.setAboveTheFoldView(aboveTheFold);
-                mAdapter = new NewTabPageAdapter(mNtpManager, aboveTheFold, mUiConfig,
-                        OfflinePageBridge.getForProfile(Profile.getLastUsedProfile()));
+                mAdapter = new NewTabPageAdapter(mUiDelegate, aboveTheFold, mUiConfig,
+                        OfflinePageBridge.getForProfile(Profile.getLastUsedProfile()),
+                        /* contextMenuManager = */null);
                 mRecyclerView.setAdapter(mAdapter);
             }
         });
@@ -183,17 +181,14 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mNtpManager = new MockNewTabPageManager();
+        mUiDelegate = new MockUiDelegate();
         mSnippetsSource = new FakeSuggestionsSource();
     }
 
     /**
-     * A NewTabPageManager to initialize our Adapter.
+     * A SuggestionsUiDelegate to initialize our Adapter.
      */
-    private class MockNewTabPageManager implements NewTabPageManager {
-        // TODO(dgn): provide a RecyclerView if we need to test the context menu.
-        private ContextMenuManager mContextMenuManager =
-                new ContextMenuManager(getActivity(), this, null);
+    private class MockUiDelegate implements SuggestionsUiDelegate {
         private SuggestionsMetricsReporter mSuggestionsMetricsReporter =
                 new DummySuggestionsMetricsReporter();
 
@@ -214,56 +209,6 @@
         }
 
         @Override
-        public void removeMostVisitedItem(MostVisitedItem item) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void openMostVisitedItem(int windowDisposition, MostVisitedItem item) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean isLocationBarShownInNTP() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean isVoiceSearchEnabled() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean isFakeOmniboxTextEnabledTablet() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void navigateToBookmarks() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void navigateToRecentTabs() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void openSnippet(int windowOpenDisposition, SnippetArticle article) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void focusSearchBox(boolean beginVoiceSearch, String pastedText) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void setMostVisitedURLsObserver(MostVisitedURLsObserver observer, int numResults) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
         public void getLargeIconForUrl(String url, int size, LargeIconCallback callback) {
             throw new UnsupportedOperationException();
         }
@@ -280,41 +225,6 @@
         }
 
         @Override
-        public void onLogoClicked(boolean isAnimatedLogoShowing) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void getSearchProviderLogo(LogoObserver logoObserver) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void onLoadingComplete(MostVisitedItem[] mostVisitedItems) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean isOpenInNewWindowEnabled() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean isOpenInIncognitoEnabled() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void navigateToDownloadManager() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public void onLearnMoreClicked() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
         public SuggestionsSource getSuggestionsSource() {
             return mSnippetsSource;
         }
@@ -323,17 +233,13 @@
         public void addDestructionObserver(DestructionObserver destructionObserver) {}
 
         @Override
-        public boolean isCurrentPage() {
-            return true;
+        public SuggestionsMetricsReporter getMetricsReporter() {
+            return mSuggestionsMetricsReporter;
         }
 
         @Override
-        public ContextMenuManager getContextMenuManager() {
-            return mContextMenuManager;
-        }
-
-        public SuggestionsMetricsReporter getSuggestionsMetricsReporter() {
-            return mSuggestionsMetricsReporter;
+        public SuggestionsNavigationDelegate getNavigationDelegate() {
+            return null;
         }
     }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
index 6b3fa15..b3414961 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java
@@ -53,8 +53,8 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.EnableFeatures;
+import org.chromium.chrome.browser.ntp.ContextMenuManager;
 import org.chromium.chrome.browser.ntp.NewTabPage.DestructionObserver;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.cards.ContentSuggestionsTestUtils.CategoryInfoBuilder;
 import org.chromium.chrome.browser.ntp.cards.SignInPromo.SigninObserver;
 import org.chromium.chrome.browser.ntp.snippets.CategoryInt;
@@ -68,6 +68,7 @@
 import org.chromium.chrome.browser.signin.SigninManager.SignInAllowedObserver;
 import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver;
 import org.chromium.chrome.browser.suggestions.SuggestionsMetricsReporter;
+import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
 import org.chromium.testing.local.LocalRobolectricTestRunner;
 
 import java.util.ArrayList;
@@ -92,7 +93,7 @@
     @Mock
     private OfflinePageBridge mOfflinePageBridge;
     @Mock
-    private NewTabPageManager mNewTabPageManager;
+    private SuggestionsUiDelegate mUiDelegate;
 
     /**
      * Stores information about a section that should be present in the adapter.
@@ -210,10 +211,8 @@
         mSource.setInfoForCategory(category,
                 new CategoryInfoBuilder(category).showIfEmpty().build());
 
-        when(mNewTabPageManager.getSuggestionsSource()).thenReturn(mSource);
-        when(mNewTabPageManager.getSuggestionsMetricsReporter())
-                .thenReturn(mock(SuggestionsMetricsReporter.class));
-        when(mNewTabPageManager.isCurrentPage()).thenReturn(true);
+        when(mUiDelegate.getSuggestionsSource()).thenReturn(mSource);
+        when(mUiDelegate.getMetricsReporter()).thenReturn(mock(SuggestionsMetricsReporter.class));
 
         reloadNtp();
     }
@@ -481,7 +480,7 @@
                 new CategoryInfoBuilder(category).showIfEmpty().build());
 
         // 1.1 - Initial state
-        when(mNewTabPageManager.getSuggestionsSource()).thenReturn(suggestionsSource);
+        when(mUiDelegate.getSuggestionsSource()).thenReturn(suggestionsSource);
         reloadNtp();
         assertItemsFor(sectionWithStatusCard().withProgress());
 
@@ -507,7 +506,7 @@
         suggestionsSource.setInfoForCategory(category, new CategoryInfoBuilder(category).build());
 
         // 2.1 - Initial state
-        when(mNewTabPageManager.getSuggestionsSource()).thenReturn(suggestionsSource);
+        when(mUiDelegate.getSuggestionsSource()).thenReturn(suggestionsSource);
         reloadNtp();
         assertItemsFor();
 
@@ -537,7 +536,7 @@
                                                                .build());
 
         // 1.1 - Initial state.
-        when(mNewTabPageManager.getSuggestionsSource()).thenReturn(suggestionsSource);
+        when(mUiDelegate.getSuggestionsSource()).thenReturn(suggestionsSource);
         reloadNtp();
         assertItemsFor(sectionWithStatusCard().withActionButton().withProgress());
 
@@ -564,7 +563,7 @@
                 new CategoryInfoBuilder(category).showIfEmpty().build());
 
         // 2.1 - Initial state.
-        when(mNewTabPageManager.getSuggestionsSource()).thenReturn(suggestionsSource);
+        when(mUiDelegate.getSuggestionsSource()).thenReturn(suggestionsSource);
         reloadNtp();
         assertItemsFor(sectionWithStatusCard().withProgress());
 
@@ -638,7 +637,7 @@
     @Feature({"Ntp"})
     public void testCategoryOrder() {
         FakeSuggestionsSource suggestionsSource = new FakeSuggestionsSource();
-        when(mNewTabPageManager.getSuggestionsSource()).thenReturn(suggestionsSource);
+        when(mUiDelegate.getSuggestionsSource()).thenReturn(suggestionsSource);
         registerCategory(suggestionsSource, KnownCategories.ARTICLES, 0);
         registerCategory(suggestionsSource, KnownCategories.BOOKMARKS, 0);
         registerCategory(suggestionsSource, KnownCategories.PHYSICAL_WEB_PAGES, 0);
@@ -658,7 +657,7 @@
 
         // With a different order.
         suggestionsSource = new FakeSuggestionsSource();
-        when(mNewTabPageManager.getSuggestionsSource()).thenReturn(suggestionsSource);
+        when(mUiDelegate.getSuggestionsSource()).thenReturn(suggestionsSource);
         registerCategory(suggestionsSource, KnownCategories.ARTICLES, 0);
         registerCategory(suggestionsSource, KnownCategories.PHYSICAL_WEB_PAGES, 0);
         registerCategory(suggestionsSource, KnownCategories.DOWNLOADS, 0);
@@ -678,7 +677,7 @@
 
         // With unknown categories.
         suggestionsSource = new FakeSuggestionsSource();
-        when(mNewTabPageManager.getSuggestionsSource()).thenReturn(suggestionsSource);
+        when(mUiDelegate.getSuggestionsSource()).thenReturn(suggestionsSource);
         registerCategory(suggestionsSource, KnownCategories.ARTICLES, 0);
         registerCategory(suggestionsSource, KnownCategories.PHYSICAL_WEB_PAGES, 0);
         registerCategory(suggestionsSource, KnownCategories.DOWNLOADS, 0);
@@ -703,7 +702,7 @@
     public void testChangeNotifications() {
         FakeSuggestionsSource suggestionsSource = spy(new FakeSuggestionsSource());
         registerCategory(suggestionsSource, KnownCategories.ARTICLES, 3);
-        when(mNewTabPageManager.getSuggestionsSource()).thenReturn(suggestionsSource);
+        when(mUiDelegate.getSuggestionsSource()).thenReturn(suggestionsSource);
 
         @SuppressWarnings("unchecked")
         Callback<String> itemDismissedCallback = mock(Callback.class);
@@ -799,7 +798,7 @@
         ArgumentCaptor<DestructionObserver> observers =
                 ArgumentCaptor.forClass(DestructionObserver.class);
 
-        doNothing().when(mNewTabPageManager).addDestructionObserver(observers.capture());
+        doNothing().when(mUiDelegate).addDestructionObserver(observers.capture());
 
         reloadNtp();
         assertTrue(isSignInPromoVisible());
@@ -868,7 +867,7 @@
         ArgumentCaptor<DestructionObserver> observers =
                 ArgumentCaptor.forClass(DestructionObserver.class);
 
-        verify(mNewTabPageManager, atLeastOnce()).addDestructionObserver(observers.capture());
+        verify(mUiDelegate, atLeastOnce()).addDestructionObserver(observers.capture());
 
         SigninObserver signinObserver = null;
         for (DestructionObserver observer : observers.getAllValues()) {
@@ -1046,8 +1045,8 @@
     }
 
     private void reloadNtp() {
-        mAdapter = new NewTabPageAdapter(mNewTabPageManager, mock(View.class), null,
-                mOfflinePageBridge);
+        mAdapter = new NewTabPageAdapter(mUiDelegate, mock(View.class), null, mOfflinePageBridge,
+                mock(ContextMenuManager.class));
     }
 
     private void assertArticlesEqual(List<SnippetArticle> articles, int start, int end) {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SectionListTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SectionListTest.java
index a477c2c..608ddc3 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SectionListTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SectionListTest.java
@@ -21,7 +21,6 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.cards.ContentSuggestionsTestUtils.CategoryInfoBuilder;
 import org.chromium.chrome.browser.ntp.snippets.CategoryInt;
 import org.chromium.chrome.browser.ntp.snippets.FakeSuggestionsSource;
@@ -31,6 +30,7 @@
 import org.chromium.chrome.browser.ntp.snippets.SnippetArticleViewHolder;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
 import org.chromium.chrome.browser.suggestions.SuggestionsMetricsReporter;
+import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
 import org.chromium.testing.local.LocalRobolectricTestRunner;
 
 import java.util.Collections;
@@ -43,7 +43,7 @@
 @Config(manifest = Config.NONE)
 public class SectionListTest {
     @Mock
-    private NewTabPageManager mNtpManager;
+    private SuggestionsUiDelegate mUiDelegate;
     @Mock
     private OfflinePageBridge mOfflinePageBridge;
     @Mock
@@ -55,8 +55,8 @@
         MockitoAnnotations.initMocks(this);
         mSuggestionSource = new FakeSuggestionsSource();
 
-        when(mNtpManager.getSuggestionsSource()).thenReturn(mSuggestionSource);
-        when(mNtpManager.getSuggestionsMetricsReporter()).thenReturn(mMetricsReporter);
+        when(mUiDelegate.getSuggestionsSource()).thenReturn(mSuggestionSource);
+        when(mUiDelegate.getMetricsReporter()).thenReturn(mMetricsReporter);
     }
 
     @Test
@@ -83,7 +83,7 @@
         List<SnippetArticle> bookmarks =
                 registerCategory(mSuggestionSource, KnownCategories.BOOKMARKS, 4);
 
-        SectionList sectionList = new SectionList(mNtpManager, mOfflinePageBridge);
+        SectionList sectionList = new SectionList(mUiDelegate, mOfflinePageBridge);
 
         bindViewHolders(sectionList);
 
@@ -119,7 +119,7 @@
         List<SnippetArticle> bookmarks =
                 registerCategory(mSuggestionSource, KnownCategories.BOOKMARKS, 4);
 
-        SectionList sectionList = new SectionList(mNtpManager, mOfflinePageBridge);
+        SectionList sectionList = new SectionList(mUiDelegate, mOfflinePageBridge);
 
         bindViewHolders(sectionList, 0, 5); // Bind until after the third article.
 
@@ -219,7 +219,7 @@
         registerCategory(mSuggestionSource,
                 new CategoryInfoBuilder(KnownCategories.DOWNLOADS).withViewAllAction().build(), 3);
 
-        SectionList sectionList = new SectionList(mNtpManager, mOfflinePageBridge);
+        SectionList sectionList = new SectionList(mUiDelegate, mOfflinePageBridge);
         bindViewHolders(sectionList);
 
         assertThat(sectionList.getSectionForTesting(KnownCategories.ARTICLES)
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSectionTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSectionTest.java
index 5d965e1..7e750c2 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSectionTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/SuggestionsSectionTest.java
@@ -33,14 +33,15 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.EnableFeatures;
-import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.ntp.cards.ContentSuggestionsTestUtils.CategoryInfoBuilder;
 import org.chromium.chrome.browser.ntp.snippets.CategoryStatus;
 import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
 import org.chromium.chrome.browser.ntp.snippets.SuggestionsSource;
 import org.chromium.chrome.browser.offlinepages.OfflinePageItem;
 import org.chromium.chrome.browser.suggestions.SuggestionsMetricsReporter;
+import org.chromium.chrome.browser.suggestions.SuggestionsNavigationDelegate;
 import org.chromium.chrome.browser.suggestions.SuggestionsRanker;
+import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
 import org.chromium.testing.local.LocalRobolectricTestRunner;
 
 import java.util.Arrays;
@@ -57,7 +58,8 @@
     private SuggestionsSection.Delegate mDelegate;
     @Mock
     private NodeParent mParent;
-    @Mock private NewTabPageManager mManager;
+    @Mock
+    private SuggestionsUiDelegate mUiDelegate;
     private FakeOfflinePageBridge mBridge;
 
     @Before
@@ -465,7 +467,7 @@
 
     private SuggestionsSection createSection(SuggestionsCategoryInfo info) {
         SuggestionsSection section = new SuggestionsSection(
-                mDelegate, mManager, mock(SuggestionsRanker.class), mBridge, info);
+                mDelegate, mUiDelegate, mock(SuggestionsRanker.class), mBridge, info);
         section.setParent(mParent);
         return section;
     }
@@ -476,10 +478,11 @@
 
     private static void verifyAction(SuggestionsSection section, @ActionItem.Action int action) {
         SuggestionsSource suggestionsSource = mock(SuggestionsSource.class);
-        NewTabPageManager manager = mock(NewTabPageManager.class);
+        SuggestionsUiDelegate manager = mock(SuggestionsUiDelegate.class);
+        SuggestionsNavigationDelegate navDelegate = mock(SuggestionsNavigationDelegate.class);
         when(manager.getSuggestionsSource()).thenReturn(suggestionsSource);
-        when(manager.getSuggestionsMetricsReporter())
-                .thenReturn(mock(SuggestionsMetricsReporter.class));
+        when(manager.getNavigationDelegate()).thenReturn(navDelegate);
+        when(manager.getMetricsReporter()).thenReturn(mock(SuggestionsMetricsReporter.class));
 
         if (action != ActionItem.ACTION_NONE) {
             section.getActionItem().performAction(manager);
@@ -487,7 +490,7 @@
 
         verify(section.getCategoryInfo(),
                 (action == ActionItem.ACTION_VIEW_ALL ? times(1) : never()))
-                .performViewAllAction(manager);
+                .performViewAllAction(navDelegate);
         verify(suggestionsSource,
                 action == ActionItem.ACTION_RELOAD || action == ActionItem.ACTION_FETCH_MORE
                         ? times(1)
diff --git a/chrome/browser/resources/chromeos/login/offline_ad_login.js b/chrome/browser/resources/chromeos/login/offline_ad_login.js
index 4847247..f722ecf 100644
--- a/chrome/browser/resources/chromeos/login/offline_ad_login.js
+++ b/chrome/browser/resources/chromeos/login/offline_ad_login.js
@@ -83,6 +83,8 @@
    * @param {string|undefined} machineName
    */
   setUser: function(user, machineName) {
+    if (this.userRealm && user)
+      user = user.replace(this.userRealm, '');
     this.$.userInput.value = user || '';
     this.$.machineNameInput.value = machineName || '';
     this.$.passwordInput.value = '';
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
index cc35df7c..8b09ce1 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
@@ -50,6 +50,7 @@
       'monitorOfflineIdle',
       'updateControlsState',
       'showWhitelistCheckFailedError',
+      'invalidateAd',
     ],
 
     /**
@@ -1090,6 +1091,8 @@
         ADAuthUI.realm = params['realm'];
         ADAuthUI.userRealm = '@' + params['realm'];
       }
+      if ('email' in params)
+        ADAuthUI.setUser(params['email']);
       this.onAuthReady_();
     },
 
@@ -1116,6 +1119,15 @@
         Oobe.showSigninUI();
 
       this.updateControlsState();
+    },
+
+    invalidateAd: function(username) {
+      if (this.screenMode_ != ScreenMode.AD_AUTH)
+        return;
+      var adAuthUI = this.getSigninFrame_();
+      adAuthUI.setUser(username);
+      adAuthUI.setInvalid(ACTIVE_DIRECTORY_ERROR_STATE.BAD_PASSWORD);
+      this.loading = false;
     }
   };
 });
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
index efacc14..ba67796 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -522,11 +522,13 @@
     case authpolicy::ERROR_PASSWORD_EXPIRED:
       core_oobe_actor_->ShowActiveDirectoryPasswordChangeScreen(username);
       break;
-    case authpolicy::ERROR_UNKNOWN:
-    case authpolicy::ERROR_DBUS_FAILURE:
     case authpolicy::ERROR_PARSE_UPN_FAILED:
     case authpolicy::ERROR_BAD_USER_NAME:
     case authpolicy::ERROR_BAD_PASSWORD:
+      CallJS("invalidateAd", username);
+      return;
+    case authpolicy::ERROR_UNKNOWN:
+    case authpolicy::ERROR_DBUS_FAILURE:
     case authpolicy::ERROR_CANNOT_RESOLVE_KDC:
     case authpolicy::ERROR_KINIT_FAILED:
     case authpolicy::ERROR_NET_FAILED:
diff --git a/components/ntp_snippets/BUILD.gn b/components/ntp_snippets/BUILD.gn
index c29c9133..00db4c0 100644
--- a/components/ntp_snippets/BUILD.gn
+++ b/components/ntp_snippets/BUILD.gn
@@ -47,12 +47,10 @@
     "pref_names.h",
     "pref_util.cc",
     "pref_util.h",
+    "remote/json_request.cc",
+    "remote/json_request.h",
     "remote/ntp_snippet.cc",
     "remote/ntp_snippet.h",
-    "remote/ntp_snippets_json_request.cc",
-    "remote/ntp_snippets_json_request.h",
-    "remote/ntp_snippets_request_params.cc",
-    "remote/ntp_snippets_request_params.h",
     "remote/persistent_scheduler.h",
     "remote/remote_suggestions_database.cc",
     "remote/remote_suggestions_database.h",
@@ -65,6 +63,8 @@
     "remote/remote_suggestions_scheduler.h",
     "remote/remote_suggestions_status_service.cc",
     "remote/remote_suggestions_status_service.h",
+    "remote/request_params.cc",
+    "remote/request_params.h",
     "remote/request_throttler.cc",
     "remote/request_throttler.h",
     "remote/scheduling_remote_suggestions_provider.cc",
@@ -137,8 +137,8 @@
     "content_suggestions_service_unittest.cc",
     "offline_pages/recent_tab_suggestions_provider_unittest.cc",
     "physical_web_pages/physical_web_page_suggestions_provider_unittest.cc",
+    "remote/json_request_unittest.cc",
     "remote/ntp_snippet_unittest.cc",
-    "remote/ntp_snippets_json_request_unittest.cc",
     "remote/remote_suggestions_database_unittest.cc",
     "remote/remote_suggestions_fetcher_unittest.cc",
     "remote/remote_suggestions_provider_impl_unittest.cc",
diff --git a/components/ntp_snippets/remote/ntp_snippets_json_request.cc b/components/ntp_snippets/remote/json_request.cc
similarity index 86%
rename from components/ntp_snippets/remote/ntp_snippets_json_request.cc
rename to components/ntp_snippets/remote/json_request.cc
index bf511098..9c24b7f8 100644
--- a/components/ntp_snippets/remote/ntp_snippets_json_request.cc
+++ b/components/ntp_snippets/remote/json_request.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 "components/ntp_snippets/remote/ntp_snippets_json_request.h"
+#include "components/ntp_snippets/remote/json_request.h"
 
 #include <algorithm>
 #include <utility>
@@ -20,7 +20,7 @@
 #include "components/data_use_measurement/core/data_use_user_data.h"
 #include "components/ntp_snippets/category_info.h"
 #include "components/ntp_snippets/features.h"
-#include "components/ntp_snippets/remote/ntp_snippets_request_params.h"
+#include "components/ntp_snippets/remote/request_params.h"
 #include "components/ntp_snippets/user_classifier.h"
 #include "components/signin/core/browser/profile_oauth2_token_service.h"
 #include "components/signin/core/browser/signin_manager.h"
@@ -165,7 +165,7 @@
       l10n_util::GetStringUTF16(IDS_NTP_ARTICLE_SUGGESTIONS_SECTION_EMPTY));
 }
 
-NTPSnippetsJsonRequest::NTPSnippetsJsonRequest(
+JsonRequest::JsonRequest(
     base::Optional<Category> exclusive_category,
     base::TickClock* tick_clock,  // Needed until destruction of the request.
     const ParseJSONCallback& callback)
@@ -176,21 +176,21 @@
   creation_time_ = tick_clock_->NowTicks();
 }
 
-NTPSnippetsJsonRequest::~NTPSnippetsJsonRequest() {
+JsonRequest::~JsonRequest() {
   LOG_IF(DFATAL, !request_completed_callback_.is_null())
       << "The CompletionCallback was never called!";
 }
 
-void NTPSnippetsJsonRequest::Start(CompletedCallback callback) {
+void JsonRequest::Start(CompletedCallback callback) {
   request_completed_callback_ = std::move(callback);
   url_fetcher_->Start();
 }
 
-base::TimeDelta NTPSnippetsJsonRequest::GetFetchDuration() const {
+base::TimeDelta JsonRequest::GetFetchDuration() const {
   return tick_clock_->NowTicks() - creation_time_;
 }
 
-std::string NTPSnippetsJsonRequest::GetResponseString() const {
+std::string JsonRequest::GetResponseString() const {
   std::string response;
   url_fetcher_->GetResponseAsString(&response);
   return response;
@@ -198,7 +198,7 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 // URLFetcherDelegate overrides
-void NTPSnippetsJsonRequest::OnURLFetchComplete(const net::URLFetcher* source) {
+void JsonRequest::OnURLFetchComplete(const net::URLFetcher* source) {
   DCHECK_EQ(url_fetcher_.get(), source);
   const URLRequestStatus& status = url_fetcher_->GetStatus();
   int response = url_fetcher_->GetResponseCode();
@@ -224,26 +224,25 @@
   }
 }
 
-void NTPSnippetsJsonRequest::ParseJsonResponse() {
+void JsonRequest::ParseJsonResponse() {
   std::string json_string;
   bool stores_result_to_string =
       url_fetcher_->GetResponseAsString(&json_string);
   DCHECK(stores_result_to_string);
 
-  parse_json_callback_.Run(json_string,
-                           base::Bind(&NTPSnippetsJsonRequest::OnJsonParsed,
-                                      weak_ptr_factory_.GetWeakPtr()),
-                           base::Bind(&NTPSnippetsJsonRequest::OnJsonError,
-                                      weak_ptr_factory_.GetWeakPtr()));
+  parse_json_callback_.Run(
+      json_string,
+      base::Bind(&JsonRequest::OnJsonParsed, weak_ptr_factory_.GetWeakPtr()),
+      base::Bind(&JsonRequest::OnJsonError, weak_ptr_factory_.GetWeakPtr()));
 }
 
-void NTPSnippetsJsonRequest::OnJsonParsed(std::unique_ptr<base::Value> result) {
+void JsonRequest::OnJsonParsed(std::unique_ptr<base::Value> result) {
   std::move(request_completed_callback_)
       .Run(std::move(result), FetchResult::SUCCESS,
            /*error_details=*/std::string());
 }
 
-void NTPSnippetsJsonRequest::OnJsonError(const std::string& error) {
+void JsonRequest::OnJsonError(const std::string& error) {
   std::string json_string;
   url_fetcher_->GetResponseAsString(&json_string);
   LOG(WARNING) << "Received invalid JSON (" << error << "): " << json_string;
@@ -252,20 +251,18 @@
            /*error_details=*/base::StringPrintf(" (error %s)", error.c_str()));
 }
 
-NTPSnippetsJsonRequest::Builder::Builder()
+JsonRequest::Builder::Builder()
     : fetch_api_(CHROME_READER_API),
       personalization_(Personalization::kBoth),
       language_model_(nullptr) {}
-NTPSnippetsJsonRequest::Builder::Builder(NTPSnippetsJsonRequest::Builder&&) =
-    default;
-NTPSnippetsJsonRequest::Builder::~Builder() = default;
+JsonRequest::Builder::Builder(JsonRequest::Builder&&) = default;
+JsonRequest::Builder::~Builder() = default;
 
-std::unique_ptr<NTPSnippetsJsonRequest> NTPSnippetsJsonRequest::Builder::Build()
-    const {
+std::unique_ptr<JsonRequest> JsonRequest::Builder::Build() const {
   DCHECK(!url_.is_empty());
   DCHECK(url_request_context_getter_);
   DCHECK(tick_clock_);
-  auto request = base::MakeUnique<NTPSnippetsJsonRequest>(
+  auto request = base::MakeUnique<JsonRequest>(
       params_.exclusive_category, tick_clock_, parse_json_callback_);
   std::string body = BuildBody();
   std::string headers = BuildHeaders();
@@ -279,8 +276,7 @@
   return request;
 }
 
-NTPSnippetsJsonRequest::Builder&
-NTPSnippetsJsonRequest::Builder::SetAuthentication(
+JsonRequest::Builder& JsonRequest::Builder::SetAuthentication(
     const std::string& account_id,
     const std::string& auth_header) {
   obfuscated_gaia_id_ = account_id;
@@ -288,60 +284,53 @@
   return *this;
 }
 
-NTPSnippetsJsonRequest::Builder& NTPSnippetsJsonRequest::Builder::SetFetchAPI(
-    FetchAPI fetch_api) {
+JsonRequest::Builder& JsonRequest::Builder::SetFetchAPI(FetchAPI fetch_api) {
   fetch_api_ = fetch_api;
   return *this;
 }
 
-NTPSnippetsJsonRequest::Builder&
-NTPSnippetsJsonRequest::Builder::SetLanguageModel(
+JsonRequest::Builder& JsonRequest::Builder::SetLanguageModel(
     const translate::LanguageModel* language_model) {
   language_model_ = language_model;
   return *this;
 }
 
-NTPSnippetsJsonRequest::Builder& NTPSnippetsJsonRequest::Builder::SetParams(
-    const NTPSnippetsRequestParams& params) {
+JsonRequest::Builder& JsonRequest::Builder::SetParams(
+    const RequestParams& params) {
   params_ = params;
   return *this;
 }
 
-NTPSnippetsJsonRequest::Builder&
-NTPSnippetsJsonRequest::Builder::SetParseJsonCallback(
+JsonRequest::Builder& JsonRequest::Builder::SetParseJsonCallback(
     ParseJSONCallback callback) {
   parse_json_callback_ = callback;
   return *this;
 }
 
-NTPSnippetsJsonRequest::Builder&
-NTPSnippetsJsonRequest::Builder::SetPersonalization(
+JsonRequest::Builder& JsonRequest::Builder::SetPersonalization(
     Personalization personalization) {
   personalization_ = personalization;
   return *this;
 }
 
-NTPSnippetsJsonRequest::Builder& NTPSnippetsJsonRequest::Builder::SetTickClock(
+JsonRequest::Builder& JsonRequest::Builder::SetTickClock(
     base::TickClock* tick_clock) {
   tick_clock_ = tick_clock;
   return *this;
 }
 
-NTPSnippetsJsonRequest::Builder& NTPSnippetsJsonRequest::Builder::SetUrl(
-    const GURL& url) {
+JsonRequest::Builder& JsonRequest::Builder::SetUrl(const GURL& url) {
   url_ = url;
   return *this;
 }
 
-NTPSnippetsJsonRequest::Builder&
-NTPSnippetsJsonRequest::Builder::SetUrlRequestContextGetter(
+JsonRequest::Builder& JsonRequest::Builder::SetUrlRequestContextGetter(
     const scoped_refptr<net::URLRequestContextGetter>& context_getter) {
   url_request_context_getter_ = context_getter;
   return *this;
 }
 
-NTPSnippetsJsonRequest::Builder&
-NTPSnippetsJsonRequest::Builder::SetUserClassifier(
+JsonRequest::Builder& JsonRequest::Builder::SetUserClassifier(
     const UserClassifier& user_classifier) {
   if (IsSendingUserClassEnabled()) {
     user_class_ = GetUserClassString(user_classifier.GetUserClass());
@@ -349,7 +338,7 @@
   return *this;
 }
 
-std::string NTPSnippetsJsonRequest::Builder::BuildHeaders() const {
+std::string JsonRequest::Builder::BuildHeaders() const {
   net::HttpRequestHeaders headers;
   headers.SetHeader("Content-Type", "application/json; charset=UTF-8");
   if (!auth_header_.empty()) {
@@ -366,7 +355,7 @@
   return headers.ToString();
 }
 
-std::string NTPSnippetsJsonRequest::Builder::BuildBody() const {
+std::string JsonRequest::Builder::BuildBody() const {
   auto request = base::MakeUnique<base::DictionaryValue>();
   std::string user_locale = PosixLocaleFromBCP47Language(params_.language_code);
   switch (fetch_api_) {
@@ -460,8 +449,7 @@
   return request_json;
 }
 
-std::unique_ptr<net::URLFetcher>
-NTPSnippetsJsonRequest::Builder::BuildURLFetcher(
+std::unique_ptr<net::URLFetcher> JsonRequest::Builder::BuildURLFetcher(
     net::URLFetcherDelegate* delegate,
     const std::string& headers,
     const std::string& body) const {
@@ -483,7 +471,7 @@
   return url_fetcher;
 }
 
-void NTPSnippetsJsonRequest::Builder::PrepareLanguages(
+void JsonRequest::Builder::PrepareLanguages(
     translate::LanguageModel::LanguageInfo* ui_language,
     translate::LanguageModel::LanguageInfo* other_top_language) const {
   // TODO(jkrcal): Add language model factory for iOS and add fakes to tests so
diff --git a/components/ntp_snippets/remote/ntp_snippets_json_request.h b/components/ntp_snippets/remote/json_request.h
similarity index 84%
rename from components/ntp_snippets/remote/ntp_snippets_json_request.h
rename to components/ntp_snippets/remote/json_request.h
index 84aa89b..c7c73c7 100644
--- a/components/ntp_snippets/remote/ntp_snippets_json_request.h
+++ b/components/ntp_snippets/remote/json_request.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_NTP_SNIPPETS_REMOTE_NTP_SNIPPETS_JSON_REQUEST_H_
-#define COMPONENTS_NTP_SNIPPETS_REMOTE_NTP_SNIPPETS_JSON_REQUEST_H_
+#ifndef COMPONENTS_NTP_SNIPPETS_REMOTE_JSON_REQUEST_H_
+#define COMPONENTS_NTP_SNIPPETS_REMOTE_JSON_REQUEST_H_
 
 #include <memory>
 #include <string>
@@ -12,7 +12,7 @@
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
-#include "components/ntp_snippets/remote/ntp_snippets_request_params.h"
+#include "components/ntp_snippets/remote/request_params.h"
 #include "components/ntp_snippets/status.h"
 #include "components/translate/core/browser/language_model.h"
 #include "google_apis/gaia/oauth2_token_service.h"
@@ -52,8 +52,9 @@
   CHROME_CONTENT_SUGGESTIONS_API,
 };
 
-// A single request to query snippets.
-class NTPSnippetsJsonRequest : public net::URLFetcherDelegate {
+// A single request to query remote suggestions. On success, the suggestions are
+// returned in parsed JSON form (base::Value).
+class JsonRequest : public net::URLFetcherDelegate {
  public:
   // A client can expect error_details only, if there was any error during the
   // fetching or parsing. In successful cases, it will be an empty string.
@@ -62,7 +63,7 @@
                               FetchResult result_code,
                               const std::string& error_details)>;
 
-  // Builds authenticated and non-authenticated NTPSnippetsJsonRequests.
+  // Builds authenticated and non-authenticated JsonRequests.
   class Builder {
    public:
     Builder();
@@ -70,7 +71,7 @@
     ~Builder();
 
     // Builds a Request object that contains all data to fetch new snippets.
-    std::unique_ptr<NTPSnippetsJsonRequest> Build() const;
+    std::unique_ptr<JsonRequest> Build() const;
 
     Builder& SetAuthentication(const std::string& account_id,
                                const std::string& auth_header);
@@ -79,7 +80,7 @@
     // The language_model borrowed from the fetcher needs to stay alive until
     // the request body is built.
     Builder& SetLanguageModel(const translate::LanguageModel* language_model);
-    Builder& SetParams(const NTPSnippetsRequestParams& params);
+    Builder& SetParams(const RequestParams& params);
     Builder& SetParseJsonCallback(ParseJSONCallback callback);
     Builder& SetPersonalization(Personalization personalization);
     // The tick_clock borrowed from the fetcher will be injected into the
@@ -123,7 +124,7 @@
     std::string auth_header_;
     base::TickClock* tick_clock_;
     FetchAPI fetch_api_;
-    NTPSnippetsRequestParams params_;
+    RequestParams params_;
     ParseJSONCallback parse_json_callback_;
     Personalization personalization_;
     GURL url_;
@@ -137,11 +138,11 @@
     DISALLOW_COPY_AND_ASSIGN(Builder);
   };
 
-  NTPSnippetsJsonRequest(base::Optional<Category> exclusive_category,
-                         base::TickClock* tick_clock,
-                         const ParseJSONCallback& callback);
-  NTPSnippetsJsonRequest(NTPSnippetsJsonRequest&&);
-  ~NTPSnippetsJsonRequest() override;
+  JsonRequest(base::Optional<Category> exclusive_category,
+              base::TickClock* tick_clock,
+              const ParseJSONCallback& callback);
+  JsonRequest(JsonRequest&&);
+  ~JsonRequest() override;
 
   void Start(CompletedCallback callback);
 
@@ -180,13 +181,13 @@
   // The callback to notify when URLFetcher finished and results are available.
   CompletedCallback request_completed_callback_;
 
-  base::WeakPtrFactory<NTPSnippetsJsonRequest> weak_ptr_factory_;
+  base::WeakPtrFactory<JsonRequest> weak_ptr_factory_;
 
-  DISALLOW_COPY_AND_ASSIGN(NTPSnippetsJsonRequest);
+  DISALLOW_COPY_AND_ASSIGN(JsonRequest);
 };
 
 }  // namespace internal
 
 }  // namespace ntp_snippets
 
-#endif  // COMPONENTS_NTP_SNIPPETS_REMOTE_NTP_SNIPPETS_JSON_REQUEST_H_
+#endif  // COMPONENTS_NTP_SNIPPETS_REMOTE_JSON_REQUEST_H_
diff --git a/components/ntp_snippets/remote/ntp_snippets_json_request_unittest.cc b/components/ntp_snippets/remote/json_request_unittest.cc
similarity index 90%
rename from components/ntp_snippets/remote/ntp_snippets_json_request_unittest.cc
rename to components/ntp_snippets/remote/json_request_unittest.cc
index 8e42d97..909f7cc 100644
--- a/components/ntp_snippets/remote/ntp_snippets_json_request_unittest.cc
+++ b/components/ntp_snippets/remote/json_request_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 "components/ntp_snippets/remote/ntp_snippets_json_request.h"
+#include "components/ntp_snippets/remote/json_request.h"
 
 #include <set>
 #include <utility>
@@ -16,7 +16,7 @@
 #include "base/values.h"
 #include "components/ntp_snippets/features.h"
 #include "components/ntp_snippets/ntp_snippets_constants.h"
-#include "components/ntp_snippets/remote/ntp_snippets_request_params.h"
+#include "components/ntp_snippets/remote/request_params.h"
 #include "components/prefs/testing_pref_service.h"
 #include "components/variations/variations_params_manager.h"
 #include "net/url_request/test_url_fetcher_factory.h"
@@ -57,9 +57,9 @@
 
 }  // namespace
 
-class NTPSnippetsJsonRequestTest : public testing::Test {
+class JsonRequestTest : public testing::Test {
  public:
-  NTPSnippetsJsonRequestTest()
+  JsonRequestTest()
       : params_manager_(
             ntp_snippets::kStudyName,
             {{"send_top_languages", "true"}, {"send_user_class", "true"}},
@@ -85,8 +85,8 @@
     return language_model;
   }
 
-  NTPSnippetsJsonRequest::Builder CreateMinimalBuilder() {
-    NTPSnippetsJsonRequest::Builder builder;
+  JsonRequest::Builder CreateMinimalBuilder() {
+    JsonRequest::Builder builder;
     builder.SetUrl(GURL("http://valid-url.test"))
         .SetTickClock(tick_clock_.get())
         .SetUrlRequestContextGetter(request_context_getter_.get());
@@ -101,12 +101,12 @@
   scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
   net::TestURLFetcherFactory fetcher_factory_;
 
-  DISALLOW_COPY_AND_ASSIGN(NTPSnippetsJsonRequestTest);
+  DISALLOW_COPY_AND_ASSIGN(JsonRequestTest);
 };
 
-TEST_F(NTPSnippetsJsonRequestTest, BuildRequestAuthenticated) {
-  NTPSnippetsJsonRequest::Builder builder = CreateMinimalBuilder();
-  NTPSnippetsRequestParams params;
+TEST_F(JsonRequestTest, BuildRequestAuthenticated) {
+  JsonRequest::Builder builder = CreateMinimalBuilder();
+  RequestParams params;
   params.excluded_ids = {"1234567890"};
   params.count_to_fetch = 25;
   params.interactive_request = false;
@@ -166,9 +166,9 @@
                          "}"));
 }
 
-TEST_F(NTPSnippetsJsonRequestTest, BuildRequestUnauthenticated) {
-  NTPSnippetsJsonRequest::Builder builder;
-  NTPSnippetsRequestParams params;
+TEST_F(JsonRequestTest, BuildRequestUnauthenticated) {
+  JsonRequest::Builder builder;
+  RequestParams params;
   params.interactive_request = true;
   params.count_to_fetch = 10;
   builder.SetParams(params)
@@ -218,9 +218,9 @@
                          "}"));
 }
 
-TEST_F(NTPSnippetsJsonRequestTest, BuildRequestExcludedIds) {
-  NTPSnippetsJsonRequest::Builder builder;
-  NTPSnippetsRequestParams params;
+TEST_F(JsonRequestTest, BuildRequestExcludedIds) {
+  JsonRequest::Builder builder;
+  RequestParams params;
   params.interactive_request = false;
   for (int i = 0; i < 200; ++i) {
     params.excluded_ids.insert(base::StringPrintf("%03d", i));
@@ -261,9 +261,9 @@
                          "}"));
 }
 
-TEST_F(NTPSnippetsJsonRequestTest, BuildRequestNoUserClass) {
-  NTPSnippetsJsonRequest::Builder builder;
-  NTPSnippetsRequestParams params;
+TEST_F(JsonRequestTest, BuildRequestNoUserClass) {
+  JsonRequest::Builder builder;
+  RequestParams params;
   params.interactive_request = false;
   builder.SetPersonalization(Personalization::kNonPersonal)
       .SetParams(params)
@@ -276,11 +276,11 @@
                          "}"));
 }
 
-TEST_F(NTPSnippetsJsonRequestTest, BuildRequestWithTwoLanguages) {
-  NTPSnippetsJsonRequest::Builder builder;
+TEST_F(JsonRequestTest, BuildRequestWithTwoLanguages) {
+  JsonRequest::Builder builder;
   std::unique_ptr<translate::LanguageModel> language_model =
       MakeLanguageModel({"de", "en"});
-  NTPSnippetsRequestParams params;
+  RequestParams params;
   params.interactive_request = true;
   params.language_code = "en";
   builder.SetParams(params)
@@ -306,11 +306,11 @@
                          "}"));
 }
 
-TEST_F(NTPSnippetsJsonRequestTest, BuildRequestWithUILanguageOnly) {
-  NTPSnippetsJsonRequest::Builder builder;
+TEST_F(JsonRequestTest, BuildRequestWithUILanguageOnly) {
+  JsonRequest::Builder builder;
   std::unique_ptr<translate::LanguageModel> language_model =
       MakeLanguageModel({"en"});
-  NTPSnippetsRequestParams params;
+  RequestParams params;
   params.interactive_request = true;
   params.language_code = "en";
   builder.SetParams(params)
diff --git a/components/ntp_snippets/remote/ntp_snippets_request_params.cc b/components/ntp_snippets/remote/ntp_snippets_request_params.cc
deleted file mode 100644
index e25035e..0000000
--- a/components/ntp_snippets/remote/ntp_snippets_request_params.cc
+++ /dev/null
@@ -1,14 +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.
-
-#include "components/ntp_snippets/remote/ntp_snippets_request_params.h"
-
-namespace ntp_snippets {
-
-NTPSnippetsRequestParams::NTPSnippetsRequestParams() = default;
-NTPSnippetsRequestParams::NTPSnippetsRequestParams(
-    const NTPSnippetsRequestParams&) = default;
-NTPSnippetsRequestParams::~NTPSnippetsRequestParams() = default;
-
-}  // namespace ntp_snippets
diff --git a/components/ntp_snippets/remote/remote_suggestions_fetcher.cc b/components/ntp_snippets/remote/remote_suggestions_fetcher.cc
index 44392e7..fedd35a 100644
--- a/components/ntp_snippets/remote/remote_suggestions_fetcher.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_fetcher.cc
@@ -22,7 +22,7 @@
 #include "components/ntp_snippets/category.h"
 #include "components/ntp_snippets/features.h"
 #include "components/ntp_snippets/ntp_snippets_constants.h"
-#include "components/ntp_snippets/remote/ntp_snippets_request_params.h"
+#include "components/ntp_snippets/remote/request_params.h"
 #include "components/ntp_snippets/user_classifier.h"
 #include "components/signin/core/browser/signin_manager.h"
 #include "components/signin/core/browser/signin_manager_base.h"
@@ -39,7 +39,7 @@
 
 namespace ntp_snippets {
 
-using internal::NTPSnippetsJsonRequest;
+using internal::JsonRequest;
 using internal::FetchAPI;
 using internal::FetchResult;
 
@@ -307,7 +307,7 @@
 }
 
 void RemoteSuggestionsFetcher::FetchSnippets(
-    const NTPSnippetsRequestParams& params,
+    const RequestParams& params,
     SnippetsAvailableCallback callback) {
   if (!DemandQuotaForRequest(params.interactive_request)) {
     FetchFinished(OptionalFetchedCategories(), std::move(callback),
@@ -327,7 +327,7 @@
                                                   /*reduced_resolution=*/true));
   }
 
-  NTPSnippetsJsonRequest::Builder builder;
+  JsonRequest::Builder builder;
   builder.SetFetchAPI(fetch_api_)
       .SetFetchAPI(fetch_api_)
       .SetLanguageModel(language_model_)
@@ -359,7 +359,7 @@
 }
 
 void RemoteSuggestionsFetcher::FetchSnippetsNonAuthenticated(
-    NTPSnippetsJsonRequest::Builder builder,
+    JsonRequest::Builder builder,
     SnippetsAvailableCallback callback) {
   // When not providing OAuth token, we need to pass the Google API key.
   builder.SetUrl(
@@ -369,7 +369,7 @@
 }
 
 void RemoteSuggestionsFetcher::FetchSnippetsAuthenticated(
-    NTPSnippetsJsonRequest::Builder builder,
+    JsonRequest::Builder builder,
     SnippetsAvailableCallback callback,
     const std::string& account_id,
     const std::string& oauth_access_token) {
@@ -382,10 +382,10 @@
 }
 
 void RemoteSuggestionsFetcher::StartRequest(
-    NTPSnippetsJsonRequest::Builder builder,
+    JsonRequest::Builder builder,
     SnippetsAvailableCallback callback) {
-  std::unique_ptr<NTPSnippetsJsonRequest> request = builder.Build();
-  NTPSnippetsJsonRequest* raw_request = request.get();
+  std::unique_ptr<JsonRequest> request = builder.Build();
+  JsonRequest* raw_request = request.get();
   raw_request->Start(base::BindOnce(&RemoteSuggestionsFetcher::JsonRequestDone,
                                     base::Unretained(this), std::move(request),
                                     std::move(callback)));
@@ -413,7 +413,7 @@
       << "Got tokens from some previous request";
 
   while (!pending_requests_.empty()) {
-    std::pair<NTPSnippetsJsonRequest::Builder, SnippetsAvailableCallback>
+    std::pair<JsonRequest::Builder, SnippetsAvailableCallback>
         builder_and_callback = std::move(pending_requests_.front());
     pending_requests_.pop();
     FetchSnippetsAuthenticated(std::move(builder_and_callback.first),
@@ -438,7 +438,7 @@
 
   DLOG(ERROR) << "Unable to get token: " << error.ToString();
   while (!pending_requests_.empty()) {
-    std::pair<NTPSnippetsJsonRequest::Builder, SnippetsAvailableCallback>
+    std::pair<JsonRequest::Builder, SnippetsAvailableCallback>
         builder_and_callback = std::move(pending_requests_.front());
 
     FetchFinished(OptionalFetchedCategories(),
@@ -466,7 +466,7 @@
 }
 
 void RemoteSuggestionsFetcher::JsonRequestDone(
-    std::unique_ptr<NTPSnippetsJsonRequest> request,
+    std::unique_ptr<JsonRequest> request,
     SnippetsAvailableCallback callback,
     std::unique_ptr<base::Value> result,
     FetchResult status_code,
diff --git a/components/ntp_snippets/remote/remote_suggestions_fetcher.h b/components/ntp_snippets/remote/remote_suggestions_fetcher.h
index 44fcd6e..79135e84 100644
--- a/components/ntp_snippets/remote/remote_suggestions_fetcher.h
+++ b/components/ntp_snippets/remote/remote_suggestions_fetcher.h
@@ -17,9 +17,9 @@
 #include "base/time/tick_clock.h"
 #include "components/ntp_snippets/category.h"
 #include "components/ntp_snippets/category_info.h"
+#include "components/ntp_snippets/remote/json_request.h"
 #include "components/ntp_snippets/remote/ntp_snippet.h"
-#include "components/ntp_snippets/remote/ntp_snippets_json_request.h"
-#include "components/ntp_snippets/remote/ntp_snippets_request_params.h"
+#include "components/ntp_snippets/remote/request_params.h"
 #include "components/ntp_snippets/remote/request_throttler.h"
 #include "components/ntp_snippets/status.h"
 #include "components/translate/core/browser/language_model.h"
@@ -95,7 +95,7 @@
   //
   // If an ongoing fetch exists, both fetches won't influence each other (i.e.
   // every callback will be called exactly once).
-  void FetchSnippets(const NTPSnippetsRequestParams& params,
+  void FetchSnippets(const RequestParams& params,
                      SnippetsAvailableCallback callback);
 
   std::string PersonalizationModeString() const;
@@ -135,15 +135,13 @@
                            BuildRequestWithOtherLanguageOnly);
   friend class ChromeReaderSnippetsFetcherTest;
 
-  void FetchSnippetsNonAuthenticated(
-      internal::NTPSnippetsJsonRequest::Builder builder,
-      SnippetsAvailableCallback callback);
-  void FetchSnippetsAuthenticated(
-      internal::NTPSnippetsJsonRequest::Builder builder,
-      SnippetsAvailableCallback callback,
-      const std::string& account_id,
-      const std::string& oauth_access_token);
-  void StartRequest(internal::NTPSnippetsJsonRequest::Builder builder,
+  void FetchSnippetsNonAuthenticated(internal::JsonRequest::Builder builder,
+                                     SnippetsAvailableCallback callback);
+  void FetchSnippetsAuthenticated(internal::JsonRequest::Builder builder,
+                                  SnippetsAvailableCallback callback,
+                                  const std::string& account_id,
+                                  const std::string& oauth_access_token);
+  void StartRequest(internal::JsonRequest::Builder builder,
                     SnippetsAvailableCallback callback);
 
   void StartTokenRequest();
@@ -158,12 +156,11 @@
   // OAuth2TokenService::Observer overrides:
   void OnRefreshTokenAvailable(const std::string& account_id) override;
 
-  void JsonRequestDone(
-      std::unique_ptr<internal::NTPSnippetsJsonRequest> request,
-      SnippetsAvailableCallback callback,
-      std::unique_ptr<base::Value> result,
-      internal::FetchResult status_code,
-      const std::string& error_details);
+  void JsonRequestDone(std::unique_ptr<internal::JsonRequest> request,
+                       SnippetsAvailableCallback callback,
+                       std::unique_ptr<base::Value> result,
+                       internal::FetchResult status_code,
+                       const std::string& error_details);
   void FetchFinished(OptionalFetchedCategories categories,
                      SnippetsAvailableCallback callback,
                      internal::FetchResult status_code,
@@ -190,8 +187,8 @@
   scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
 
   // Stores requests that wait for an access token.
-  std::queue<std::pair<internal::NTPSnippetsJsonRequest::Builder,
-                       SnippetsAvailableCallback>>
+  std::queue<
+      std::pair<internal::JsonRequest::Builder, SnippetsAvailableCallback>>
       pending_requests_;
 
   // Weak reference, not owned.
diff --git a/components/ntp_snippets/remote/remote_suggestions_fetcher_unittest.cc b/components/ntp_snippets/remote/remote_suggestions_fetcher_unittest.cc
index f5f4aa6..ec046cf 100644
--- a/components/ntp_snippets/remote/remote_suggestions_fetcher_unittest.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_fetcher_unittest.cc
@@ -22,7 +22,7 @@
 #include "components/ntp_snippets/features.h"
 #include "components/ntp_snippets/ntp_snippets_constants.h"
 #include "components/ntp_snippets/remote/ntp_snippet.h"
-#include "components/ntp_snippets/remote/ntp_snippets_request_params.h"
+#include "components/ntp_snippets/remote/request_params.h"
 #include "components/ntp_snippets/user_classifier.h"
 #include "components/prefs/testing_pref_service.h"
 #include "components/signin/core/browser/account_tracker_service.h"
@@ -322,8 +322,8 @@
   }
   base::HistogramTester& histogram_tester() { return histogram_tester_; }
 
-  NTPSnippetsRequestParams test_params() {
-    NTPSnippetsRequestParams result;
+  RequestParams test_params() {
+    RequestParams result;
     result.count_to_fetch = 1;
     result.interactive_request = true;
     return result;
@@ -670,7 +670,7 @@
   EXPECT_CALL(mock_callback(), Run(IsSuccess(), _))
       .WillOnce(MoveArgument1PointeeTo(&fetched_categories));
 
-  NTPSnippetsRequestParams params = test_params();
+  RequestParams params = test_params();
   params.exclusive_category =
       base::Optional<Category>(Category::FromRemoteCategory(2));
 
@@ -726,7 +726,7 @@
 
 TEST_F(ChromeReaderSnippetsFetcherTest, RetryOnInteractiveRequests) {
   DelegateCallingTestURLFetcherFactory fetcher_factory;
-  NTPSnippetsRequestParams params = test_params();
+  RequestParams params = test_params();
   params.interactive_request = true;
 
   snippets_fetcher().FetchSnippets(
@@ -750,7 +750,7 @@
       {"-1", 0, "Do not retry on negative param values."},
       {"4", 4, "Retry as set in param value."}};
 
-  NTPSnippetsRequestParams params = test_params();
+  RequestParams params = test_params();
   params.interactive_request = false;
 
   for (const auto& retry_config : retry_config_expectation) {
diff --git a/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc b/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc
index dcdbe065..4aec9ba9 100644
--- a/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc
@@ -367,7 +367,7 @@
 
   MarkEmptyCategoriesAsLoading();
 
-  NTPSnippetsRequestParams params = BuildFetchParams();
+  RequestParams params = BuildFetchParams();
   params.interactive_request = interactive_request;
   suggestions_fetcher_->FetchSnippets(
       params, base::BindOnce(&RemoteSuggestionsProviderImpl::OnFetchFinished,
@@ -385,7 +385,7 @@
                                 "RemoteSuggestionsProvider is not ready!"));
     return;
   }
-  NTPSnippetsRequestParams params = BuildFetchParams();
+  RequestParams params = BuildFetchParams();
   params.excluded_ids.insert(known_suggestion_ids.begin(),
                              known_suggestion_ids.end());
   params.interactive_request = true;
@@ -398,9 +398,8 @@
 }
 
 // Builds default fetcher params.
-NTPSnippetsRequestParams RemoteSuggestionsProviderImpl::BuildFetchParams()
-    const {
-  NTPSnippetsRequestParams result;
+RequestParams RemoteSuggestionsProviderImpl::BuildFetchParams() const {
+  RequestParams result;
   result.language_code = application_language_code_;
   result.count_to_fetch = kMaxSnippetCount;
   for (const auto& map_entry : category_contents_) {
diff --git a/components/ntp_snippets/remote/remote_suggestions_provider_impl.h b/components/ntp_snippets/remote/remote_suggestions_provider_impl.h
index e7d28fe..53a7564 100644
--- a/components/ntp_snippets/remote/remote_suggestions_provider_impl.h
+++ b/components/ntp_snippets/remote/remote_suggestions_provider_impl.h
@@ -25,10 +25,10 @@
 #include "components/ntp_snippets/content_suggestion.h"
 #include "components/ntp_snippets/content_suggestions_provider.h"
 #include "components/ntp_snippets/remote/ntp_snippet.h"
-#include "components/ntp_snippets/remote/ntp_snippets_request_params.h"
 #include "components/ntp_snippets/remote/remote_suggestions_fetcher.h"
 #include "components/ntp_snippets/remote/remote_suggestions_provider.h"
 #include "components/ntp_snippets/remote/remote_suggestions_status_service.h"
+#include "components/ntp_snippets/remote/request_params.h"
 #include "components/ntp_snippets/remote/request_throttler.h"
 
 class PrefRegistrySimple;
@@ -397,7 +397,7 @@
   void RestoreCategoriesFromPrefs();
   void StoreCategoriesToPrefs();
 
-  NTPSnippetsRequestParams BuildFetchParams() const;
+  RequestParams BuildFetchParams() const;
 
   void MarkEmptyCategoriesAsLoading();
 
diff --git a/components/ntp_snippets/remote/request_params.cc b/components/ntp_snippets/remote/request_params.cc
new file mode 100644
index 0000000..b661a90
--- /dev/null
+++ b/components/ntp_snippets/remote/request_params.cc
@@ -0,0 +1,13 @@
+// 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.
+
+#include "components/ntp_snippets/remote/request_params.h"
+
+namespace ntp_snippets {
+
+RequestParams::RequestParams() = default;
+RequestParams::RequestParams(const RequestParams&) = default;
+RequestParams::~RequestParams() = default;
+
+}  // namespace ntp_snippets
diff --git a/components/ntp_snippets/remote/ntp_snippets_request_params.h b/components/ntp_snippets/remote/request_params.h
similarity index 78%
rename from components/ntp_snippets/remote/ntp_snippets_request_params.h
rename to components/ntp_snippets/remote/request_params.h
index e0f9011a..02289dd3 100644
--- a/components/ntp_snippets/remote/ntp_snippets_request_params.h
+++ b/components/ntp_snippets/remote/request_params.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_NTP_SNIPPETS_REMOTE_NTP_SNIPPETS_REQUEST_PARAMS_H_
-#define COMPONENTS_NTP_SNIPPETS_REMOTE_NTP_SNIPPETS_REQUEST_PARAMS_H_
+#ifndef COMPONENTS_NTP_SNIPPETS_REMOTE_REQUEST_PARAMS_H_
+#define COMPONENTS_NTP_SNIPPETS_REMOTE_REQUEST_PARAMS_H_
 
 #include <memory>
 #include <set>
@@ -19,11 +19,11 @@
 // Enumeration listing all possible variants of dealing with personalization.
 enum class Personalization { kPersonal, kNonPersonal, kBoth };
 
-// Contains all parameters for fetching NTPSnippets.
-struct NTPSnippetsRequestParams {
-  NTPSnippetsRequestParams();
-  NTPSnippetsRequestParams(const NTPSnippetsRequestParams&);
-  ~NTPSnippetsRequestParams();
+// Contains all parameters for fetching remote suggestions.
+struct RequestParams {
+  RequestParams();
+  RequestParams(const RequestParams&);
+  ~RequestParams();
 
   // BCP 47 language code specifying the user's UI language.
   std::string language_code;
@@ -54,4 +54,4 @@
 
 }  // namespace ntp_snippets
 
-#endif  // COMPONENTS_NTP_SNIPPETS_REMOTE_NTP_SNIPPETS_REQUEST_PARAMS_H_
+#endif  // COMPONENTS_NTP_SNIPPETS_REMOTE_REQUEST_PARAMS_H_
diff --git a/ios/build/chrome_build.gni b/ios/build/chrome_build.gni
index a5a1394..af4b46c 100644
--- a/ios/build/chrome_build.gni
+++ b/ios/build/chrome_build.gni
@@ -9,6 +9,7 @@
 declare_args() {
   # Enable today extension.
   ios_enable_today_extension = true
+  ios_enable_widget_extension = false
 
   # Enable share extension.
   ios_enable_share_extension = true
@@ -24,6 +25,8 @@
   # List of plist templates to merge when generating chrome entitlements.
   ios_chrome_entitlements_additions = []
 }
+assert(!(ios_enable_today_extension && ios_enable_widget_extension),
+       "Both today extensions cannot be enabled simultaneously.")
 
 # Configure whether breakpad support is enabled.
 breakpad_enabled = is_official_build && is_chrome_branded
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn
index 78fd194..9b17b92 100644
--- a/ios/chrome/app/BUILD.gn
+++ b/ios/chrome/app/BUILD.gn
@@ -273,12 +273,16 @@
 
   bundle_deps = [ "//ios/chrome/app/resources" ]
 
-  if (ios_enable_today_extension && current_toolchain == default_toolchain) {
-    deps += [ ":today_extension_bundle" ]
-  }
-
-  if (ios_enable_share_extension && current_toolchain == default_toolchain) {
-    deps += [ ":share_extension_bundle" ]
+  if (current_toolchain == default_toolchain) {
+    if (ios_enable_today_extension) {
+      deps += [ ":today_extension_bundle" ]
+    }
+    if (ios_enable_widget_extension) {
+      deps += [ ":widget_extension_bundle" ]
+    }
+    if (ios_enable_share_extension) {
+      deps += [ ":share_extension_bundle" ]
+    }
   }
 
   extra_substitutions = [
@@ -298,30 +302,52 @@
   }
 }
 
-if (ios_enable_today_extension && current_toolchain == default_toolchain) {
-  bundle_data("today_extension_bundle") {
-    public_deps = [
-      "//ios/chrome/today_extension",
-    ]
-    sources = [
-      "$root_out_dir/today_extension.appex",
-    ]
-    outputs = [
-      "{{bundle_plugins_dir}}/{{source_file_part}}",
-    ]
+if (current_toolchain == default_toolchain) {
+  if (ios_enable_today_extension) {
+    bundle_data("today_extension_bundle") {
+      public_deps = [
+        "//ios/chrome/today_extension",
+      ]
+      sources = [
+        "$root_out_dir/today_extension.appex",
+      ]
+      outputs = [
+        "{{bundle_plugins_dir}}/{{source_file_part}}",
+      ]
+    }
   }
-}
 
-if (ios_enable_share_extension && current_toolchain == default_toolchain) {
-  bundle_data("share_extension_bundle") {
-    public_deps = [
-      "//ios/chrome/share_extension",
-    ]
-    sources = [
-      "$root_out_dir/share_extension.appex",
-    ]
-    outputs = [
-      "{{bundle_plugins_dir}}/{{source_file_part}}",
-    ]
+  if (ios_enable_widget_extension) {
+    bundle_data("widget_extension_bundle") {
+      public_deps = [
+        "//ios/chrome/widget_extension",
+      ]
+      sources = [
+        "$root_out_dir/widget_extension.appex",
+      ]
+
+      # The output is renamed today_extension.appex so that signing in canary
+      # works and clobbering is not necessary when switching between this
+      # extension and the today extension.
+      # TODO(crbug.com/682230) : Rename this when widget gets its own
+      # mobileprovision.
+      outputs = [
+        "{{bundle_plugins_dir}}/today_extension.appex",
+      ]
+    }
+  }
+
+  if (ios_enable_share_extension) {
+    bundle_data("share_extension_bundle") {
+      public_deps = [
+        "//ios/chrome/share_extension",
+      ]
+      sources = [
+        "$root_out_dir/share_extension.appex",
+      ]
+      outputs = [
+        "{{bundle_plugins_dir}}/{{source_file_part}}",
+      ]
+    }
   }
 }
diff --git a/ios/chrome/browser/ui/history/history_panel_view_controller.mm b/ios/chrome/browser/ui/history/history_panel_view_controller.mm
index a39bfa4..2989f1e 100644
--- a/ios/chrome/browser/ui/history/history_panel_view_controller.mm
+++ b/ios/chrome/browser/ui/history/history_panel_view_controller.mm
@@ -295,6 +295,13 @@
   [self exitSearchMode];
 }
 
+#pragma mark UIAccessibilityAction
+
+- (BOOL)accessibilityPerformEscape {
+  [self closeHistory];
+  return YES;
+}
+
 #pragma mark - Private methods
 
 - (void)closeHistory {
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_view_controller.mm b/ios/chrome/browser/ui/reading_list/reading_list_view_controller.mm
index f4ca8cb..808e0ac 100644
--- a/ios/chrome/browser/ui/reading_list/reading_list_view_controller.mm
+++ b/ios/chrome/browser/ui/reading_list/reading_list_view_controller.mm
@@ -243,6 +243,13 @@
     [audience setCollectionHasItems:self.readingListModel->size() > 0];
 }
 
+#pragma mark UIAccessibilityAction
+
+- (BOOL)accessibilityPerformEscape {
+  [self dismiss];
+  return YES;
+}
+
 #pragma mark - UIViewController
 
 - (void)viewDidLoad {
diff --git a/ios/chrome/widget_extension/BUILD.gn b/ios/chrome/widget_extension/BUILD.gn
new file mode 100644
index 0000000..1316fa9
--- /dev/null
+++ b/ios/chrome/widget_extension/BUILD.gn
@@ -0,0 +1,50 @@
+# 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.
+
+import("//build/config/ios/rules.gni")
+import("//build/mac/tweak_info_plist.gni")
+import("//ios/build/chrome_build.gni")
+
+tweak_info_plist("tweak_info_plist") {
+  info_plist = "Info.plist"
+}
+
+compile_plist("entitlements") {
+  format = "xml1"
+  substitutions = [ "IOS_BUNDLE_ID_PREFIX=$ios_app_bundle_id_prefix" ]
+  output_name = "$target_gen_dir/today_extension.appex.entitlements"
+  plist_templates =
+      [ "entitlements/external/widget_extension.appex.entitlements" ] +
+      ios_chrome_entitlements_additions
+}
+
+ios_appex_bundle("widget_extension") {
+  sources = [
+    "widget_view.h",
+    "widget_view.mm",
+    "widget_view_controller.h",
+    "widget_view_controller.mm",
+  ]
+
+  libs = [
+    "Foundation.framework",
+    "NotificationCenter.framework",
+    "UIKit.framework",
+  ]
+
+  extra_substitutions = [
+    "CHROME_CHANNEL_SCHEME=$url_channel_scheme",
+    "CHROMIUM_SHORT_NAME=$chromium_short_name",
+
+    # The widget_extension and today_extension are using the same provisioning
+    # profile during development work.
+    # TODO(crbug.com/682238) : Request provisioning profile if widget is kept.
+    "WIDGET_EXTENSION_BUNDLE_ID=$chromium_bundle_id.TodayExtension",
+  ]
+
+  configs += [ "//build/config/compiler:enable_arc" ]
+
+  entitlements_target = ":entitlements"
+  info_plist_target = ":tweak_info_plist"
+}
diff --git a/ios/chrome/widget_extension/Info.plist b/ios/chrome/widget_extension/Info.plist
new file mode 100644
index 0000000..915460e2
--- /dev/null
+++ b/ios/chrome/widget_extension/Info.plist
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleDisplayName</key>
+	<string>${CHROMIUM_SHORT_NAME}</string>
+	<key>CFBundleExecutable</key>
+	<string>widget_extension</string>
+	<key>CFBundleIdentifier</key>
+	<string>${IOS_BUNDLE_ID_PREFIX}.${WIDGET_EXTENSION_BUNDLE_ID}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>widget_extension</string>
+	<key>CFBundlePackageType</key>
+	<string>XPC!</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+	<key>NSExtension</key>
+	<dict>
+		<key>NSExtensionPrincipalClass</key>
+		<string>WidgetViewController</string>
+		<key>NSExtensionPointIdentifier</key>
+		<string>com.apple.widget-extension</string>
+	</dict>
+	<key>KSChannelChromeScheme</key>
+	<string>${CHROME_CHANNEL_SCHEME}</string>
+</dict>
+</plist>
diff --git a/ios/chrome/widget_extension/OWNERS b/ios/chrome/widget_extension/OWNERS
new file mode 100644
index 0000000..55fb7e49
--- /dev/null
+++ b/ios/chrome/widget_extension/OWNERS
@@ -0,0 +1 @@
+lod@chromium.org
\ No newline at end of file
diff --git a/ios/chrome/widget_extension/entitlements/external/widget_extension.appex.entitlements b/ios/chrome/widget_extension/entitlements/external/widget_extension.appex.entitlements
new file mode 100644
index 0000000..ece1274
--- /dev/null
+++ b/ios/chrome/widget_extension/entitlements/external/widget_extension.appex.entitlements
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>application-identifier</key>
+	<string>$(AppIdentifierPrefix)$(CFBundleIdentifier)</string>
+	<key>com.apple.security.application-groups</key>
+	<array>
+		<string>group.${IOS_BUNDLE_ID_PREFIX}.chrome</string>
+	</array>
+</dict>
+</plist>
diff --git a/ios/chrome/widget_extension/widget_view.h b/ios/chrome/widget_extension/widget_view.h
new file mode 100644
index 0000000..a13f35e
--- /dev/null
+++ b/ios/chrome/widget_extension/widget_view.h
@@ -0,0 +1,18 @@
+// 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 IOS_CHROME_WIDGET_EXTENSION_WIDGET_VIEW_H_
+#define IOS_CHROME_WIDGET_EXTENSION_WIDGET_VIEW_H_
+
+#import <UIKit/UIKit.h>
+
+@interface WidgetView : UIView
+
+- (instancetype)init NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
+- (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE;
+
+@end
+
+#endif  // IOS_CHROME_WIDGET_EXTENSION_WIDGET_VIEW_H_
diff --git a/ios/chrome/widget_extension/widget_view.mm b/ios/chrome/widget_extension/widget_view.mm
new file mode 100644
index 0000000..843adccd3
--- /dev/null
+++ b/ios/chrome/widget_extension/widget_view.mm
@@ -0,0 +1,20 @@
+// 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.
+
+#import "ios/chrome/widget_extension/widget_view.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation WidgetView
+
+#pragma mark - Lifecycle
+
+- (instancetype)init {
+  self = [super initWithFrame:CGRectZero];
+  return self;
+}
+
+@end
diff --git a/ios/chrome/widget_extension/widget_view_controller.h b/ios/chrome/widget_extension/widget_view_controller.h
new file mode 100644
index 0000000..57cb0af
--- /dev/null
+++ b/ios/chrome/widget_extension/widget_view_controller.h
@@ -0,0 +1,14 @@
+// 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 IOS_CHROME_WIDGET_EXTENSION_WIDGET_VIEW_CONTROLLER_H_
+#define IOS_CHROME_WIDGET_EXTENSION_WIDGET_VIEW_CONTROLLER_H_
+
+#import <UIKit/UIKit.h>
+
+@interface WidgetViewController : UIViewController
+
+@end
+
+#endif  // IOS_CHROME_WIDGET_EXTENSION_WIDGET_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/widget_extension/widget_view_controller.mm b/ios/chrome/widget_extension/widget_view_controller.mm
new file mode 100644
index 0000000..dfe050a
--- /dev/null
+++ b/ios/chrome/widget_extension/widget_view_controller.mm
@@ -0,0 +1,35 @@
+// 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.
+
+#import "ios/chrome/widget_extension/widget_view_controller.h"
+
+#import <NotificationCenter/NotificationCenter.h>
+
+#import "ios/chrome/widget_extension/widget_view.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface WidgetViewController ()
+@property(nonatomic, weak) WidgetView* widgetView;
+@end
+
+@implementation WidgetViewController
+
+@synthesize widgetView = _widgetView;
+
+#pragma mark - UIViewController
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+
+  // A local variable is necessary here as the property is declared weak and the
+  // object would be deallocated before being retained by the addSubview call.
+  WidgetView* widgetView = [[WidgetView alloc] init];
+  self.widgetView = widgetView;
+  [self.view addSubview:self.widgetView];
+}
+
+@end
diff --git a/ios/net/crn_http_protocol_handler.mm b/ios/net/crn_http_protocol_handler.mm
index 20fe4db..81617f7 100644
--- a/ios/net/crn_http_protocol_handler.mm
+++ b/ios/net/crn_http_protocol_handler.mm
@@ -581,27 +581,9 @@
   if (![request_ HTTPShouldHandleCookies])
     load_flags |= LOAD_DO_NOT_SEND_COOKIES | LOAD_DO_NOT_SAVE_COOKIES;
 
-  // Cache flags.
-  if (tracker_) {
-    RequestTracker::CacheMode cache_mode = tracker_->GetCacheMode();
-    switch (cache_mode) {
-      case RequestTracker::CACHE_RELOAD:
-        load_flags |= LOAD_VALIDATE_CACHE;
-        break;
-      case RequestTracker::CACHE_HISTORY:
-        load_flags |= LOAD_SKIP_CACHE_VALIDATION;
-        break;
-      case RequestTracker::CACHE_BYPASS:
-        load_flags |= LOAD_DISABLE_CACHE | LOAD_BYPASS_CACHE;
-        break;
-      case RequestTracker::CACHE_ONLY:
-        load_flags |= LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION;
-        break;
-      case RequestTracker::CACHE_NORMAL:
-        // Do nothing, normal load.
-        break;
-    }
-  } else {
+  // If a RequestTracker is defined, always use normal load, otherwise
+  // respect the cache policy from the request.
+  if (!tracker_) {
     switch ([request_ cachePolicy]) {
       case NSURLRequestReloadIgnoringLocalAndRemoteCacheData:
         load_flags |= LOAD_BYPASS_CACHE;
diff --git a/ios/net/request_tracker.h b/ios/net/request_tracker.h
index 098dbc92..c172fefa 100644
--- a/ios/net/request_tracker.h
+++ b/ios/net/request_tracker.h
@@ -27,14 +27,6 @@
 // The RequestTracker can be created on one thread and used on a different one.
 class RequestTracker {
  public:
-  enum CacheMode {
-    CACHE_NORMAL,
-    CACHE_RELOAD,
-    CACHE_HISTORY,
-    CACHE_BYPASS,
-    CACHE_ONLY,
-  };
-
   typedef base::Callback<void(bool)> SSLCallback;
 
   class RequestTrackerFactory {
@@ -108,10 +100,6 @@
                                      bool recoverable,
                                      const SSLCallback& should_continue) = 0;
 
-  // Gets and sets the cache mode.
-  CacheMode GetCacheMode() const;
-  void SetCacheMode(RequestTracker::CacheMode mode);
-
  protected:
   virtual ~RequestTracker();
 
@@ -119,7 +107,6 @@
 
  private:
   bool initialized_;
-  CacheMode cache_mode_;
   base::ThreadChecker thread_checker_;
 
   base::WeakPtrFactory<RequestTracker> weak_ptr_factory_;
diff --git a/ios/net/request_tracker.mm b/ios/net/request_tracker.mm
index a28c739..b29c39b6e 100644
--- a/ios/net/request_tracker.mm
+++ b/ios/net/request_tracker.mm
@@ -41,7 +41,6 @@
 
 RequestTracker::RequestTracker()
     : initialized_(false),
-      cache_mode_(CACHE_NORMAL),
       weak_ptr_factory_(this) {
   // RequestTracker can be created from the main thread and used from another
   // thread.
@@ -65,14 +64,4 @@
   initialized_ = true;
 }
 
-RequestTracker::CacheMode RequestTracker::GetCacheMode() const {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return cache_mode_;
-}
-
-void RequestTracker::SetCacheMode(RequestTracker::CacheMode mode) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  cache_mode_ = mode;
-}
-
 }  // namespace net
diff --git a/ios/web/net/request_tracker_impl.h b/ios/web/net/request_tracker_impl.h
index 582d615..17b9340 100644
--- a/ios/web/net/request_tracker_impl.h
+++ b/ios/web/net/request_tracker_impl.h
@@ -182,9 +182,6 @@
   static void PostUITaskIfOpen(const base::WeakPtr<RequestTracker> tracker,
                                const base::Closure& task);
 
-  // Sets the cache mode. Must be called from the UI thread.
-  void SetCacheModeFromUIThread(RequestTracker::CacheMode mode);
-
 #pragma mark Testing methods
 
   void SetCertificatePolicyCacheForTest(web::CertificatePolicyCache* cache);
diff --git a/ios/web/net/request_tracker_impl.mm b/ios/web/net/request_tracker_impl.mm
index 81de5d5..b5a2c52b 100644
--- a/ios/web/net/request_tracker_impl.mm
+++ b/ios/web/net/request_tracker_impl.mm
@@ -658,14 +658,6 @@
   web::WebThread::PostTask(web::WebThread::IO, FROM_HERE, task);
 }
 
-void RequestTrackerImpl::SetCacheModeFromUIThread(
-    RequestTracker::CacheMode mode) {
-  DCHECK_CURRENTLY_ON(web::WebThread::UI);
-  web::WebThread::PostTask(
-      web::WebThread::IO, FROM_HERE,
-      base::Bind(&RequestTracker::SetCacheMode, this, mode));
-}
-
 #pragma mark Private Object Lifecycle API
 
 RequestTrackerImpl::RequestTrackerImpl(
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index a62a61bb..88e3349 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -2273,14 +2273,6 @@
 - (void)didFinishWithURL:(const GURL&)currentURL loadSuccess:(BOOL)loadSuccess {
   DCHECK(_loadPhase == web::PAGE_LOADED);
   _webStateImpl->GetRequestTracker()->FinishPageLoad(currentURL, loadSuccess);
-  // Reset the navigation type to the default value.
-  // Note: it is possible that the web view has already started loading the
-  // next page when this is called. In that case the cache mode can leak to
-  // (some of) the requests of the next page. It's expected to be an edge case,
-  // but if it becomes a problem it should be possible to notice it afterwards
-  // and react to it (by warning the user or reloading the page for example).
-  _webStateImpl->GetRequestTracker()->SetCacheModeFromUIThread(
-      net::RequestTracker::CACHE_NORMAL);
 
   // Rather than creating a new WKBackForwardListItem when loading WebUI pages,
   // WKWebView will cache the WebUI HTML in the previous WKBackForwardListItem
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation b/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation
index 93bc938..034a4d1 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-browser-side-navigation
@@ -1,13 +1,12 @@
 # These tests currently fail when run with --enable-browser-side-navigation
 # See https://crbug.com/576261
 # https://crbug.com/608372: PlzNavigate: support POST navigations
-crbug.com/608372 fast/forms/submit-to-url-fragment.html [ Failure ]
 crbug.com/608372 fast/forms/xss-auditor-doesnt-crash-on-post-submit.html [ Timeout ]
+#  Layout test does not end for unknown reasons.
 crbug.com/608372 http/tests/history/back-to-post.html [ Timeout ]
-crbug.com/608372 http/tests/navigation/post-goback-same-url.html [ Failure ]
-crbug.com/608372 virtual/stable/http/tests/navigation/post-goback-same-url.html [ Failure ]
 crbug.com/608372 virtual/mojo-loading/http/tests/history/back-to-post.html [ Timeout ]
-crbug.com/608372 virtual/mojo-loading/http/tests/navigation/post-goback-same-url.html [ Failure ]
+#  Layout test ending too soon.
+crbug.com/608372 fast/forms/submit-to-url-fragment.html [ Failure ]
 
 # https://crbug.com/575210: PlzNavigate: history navigation support
 crbug.com/575210 fast/history/history-length-append-subframe-with-hash.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/media/video-no-controls-events-not-absorbed.html b/third_party/WebKit/LayoutTests/media/video-no-controls-events-not-absorbed.html
new file mode 100644
index 0000000..13bdfc8d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/media/video-no-controls-events-not-absorbed.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>Video elements without controls should not absborb click events</title>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="media-file.js"></script>
+<video></video>
+<script>
+test(_ => {
+  assert_true('eventSender' in window);
+}, 'eventSender required');
+
+async_test(t => {
+  var video = document.querySelector('video');
+  video.addEventListener('loadedmetadata', t.step_func(_ => {
+    var rect = video.getBoundingClientRect();
+    eventSender.gestureTap(rect.left + rect.width / 2,
+                           rect.top + rect.height / 2);
+  }));
+
+  addEventListener('click', t.step_func(_ => {
+    assert_true(true, 'Received click');
+    t.done();
+  }));
+
+  video.src = findMediaFile('video', 'content/test');
+});
+</script>
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/emphasis-complex-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/emphasis-complex-expected.png
index 866d51ac..dfeb09f8 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/emphasis-complex-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/emphasis-complex-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/emphasis-complex-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/text/emphasis-complex-expected.txt
index ce14211..7af7cd85 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/emphasis-complex-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/emphasis-complex-expected.txt
@@ -7,8 +7,8 @@
         LayoutText {#text} at (0,17) size 180x34
           text run at (0,17) width 180 RTL: "\x{643}\x{62A}\x{627}\x{628} \x{623}\x{644}\x{641} \x{644}\x{64A}\x{644}\x{629} \x{648}\x{644}\x{64A}\x{644}\x{629}"
       LayoutBlockFlow {P} at (0,82) size 784x52
-        LayoutText {#text} at (0,17) size 545x34
-          text run at (0,17) width 545: "\x{1797}\x{17B6}\x{179F}\x{17B6}\x{1781}\x{17D2}\x{1798}\x{17C2}\x{179A} \x{1797}\x{17B6}\x{179F}\x{17B6}\x{1781}\x{17D2}\x{1798}\x{17C2}\x{179A} \x{17A2}\x{178F}\x{17D2}\x{1790}\x{1794}\x{1791}\x{200B}\x{1782}\x{17C6}\x{179A}\x{17BC}"
+        LayoutText {#text} at (0,17) size 591x34
+          text run at (0,17) width 591: "\x{1797}\x{17B6}\x{179F}\x{17B6}\x{1781}\x{17D2}\x{1798}\x{17C2}\x{179A} \x{1797}\x{17B6}\x{179F}\x{17B6}\x{1781}\x{17D2}\x{1798}\x{17C2}\x{179A} \x{17A2}\x{178F}\x{17D2}\x{1790}\x{1794}\x{1791}\x{200B}\x{1782}\x{17C6}\x{179A}\x{17BC}"
       LayoutBlockFlow {P} at (0,164) size 784x63
         LayoutText {#text} at (0,17) size 245x34
           text run at (0,17) width 245: "Mixed\x{926}\x{947}\x{935}\x{928}\x{93E}\x{917}\x{930}\x{940}Mixed"
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/khmer-selection-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/khmer-selection-expected.png
index 44d5d620..0e31d8c9 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/khmer-selection-expected.png
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/khmer-selection-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/khmer-selection-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/khmer-selection-expected.txt
index f2b6cb0..35cf8841 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/khmer-selection-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/international/khmer-selection-expected.txt
@@ -4,25 +4,25 @@
   LayoutBlockFlow {HTML} at (0,0) size 800x128
     LayoutBlockFlow {BODY} at (8,16) size 784x96
       LayoutBlockFlow {P} at (0,0) size 784x20
-        LayoutInline {NOBR} at (0,0) size 228x19
-          LayoutInline {B} at (0,0) size 36x19
-            LayoutText {#text} at (0,0) size 36x19
-              text run at (0,0) width 36: "\x{179C}\x{17C9}\x{17C2}\x{1794}"
-          LayoutText {#text} at (36,0) size 4x19
-            text run at (36,0) width 4: " "
-          LayoutInline {A} at (0,0) size 60x19 [color=#0000EE]
-            LayoutText {#text} at (40,0) size 60x19
-              text run at (40,0) width 60: "\x{179A}\x{17BC}\x{1794}\x{1797}\x{17B6}\x{1796}"
-          LayoutText {#text} at (100,0) size 4x19
-            text run at (100,0) width 4: " "
-          LayoutInline {A} at (0,0) size 36x19 [color=#0000EE]
-            LayoutText {#text} at (104,0) size 36x19
-              text run at (104,0) width 36: "\x{1780}\x{17D2}\x{179A}\x{17BB}\x{1798}"
-          LayoutText {#text} at (140,0) size 4x19
-            text run at (140,0) width 4: " "
+        LayoutInline {NOBR} at (0,0) size 264x19
+          LayoutInline {B} at (0,0) size 48x19
+            LayoutText {#text} at (0,0) size 48x19
+              text run at (0,0) width 48: "\x{179C}\x{17C9}\x{17C2}\x{1794}"
+          LayoutText {#text} at (48,0) size 4x19
+            text run at (48,0) width 4: " "
+          LayoutInline {A} at (0,0) size 72x19 [color=#0000EE]
+            LayoutText {#text} at (52,0) size 72x19
+              text run at (52,0) width 72: "\x{179A}\x{17BC}\x{1794}\x{1797}\x{17B6}\x{1796}"
+          LayoutText {#text} at (124,0) size 4x19
+            text run at (124,0) width 4: " "
+          LayoutInline {A} at (0,0) size 48x19 [color=#0000EE]
+            LayoutText {#text} at (128,0) size 48x19
+              text run at (128,0) width 48: "\x{1780}\x{17D2}\x{179A}\x{17BB}\x{1798}"
+          LayoutText {#text} at (176,0) size 4x19
+            text run at (176,0) width 4: " "
           LayoutInline {A} at (0,0) size 84x19 [color=#0000EE]
-            LayoutText {#text} at (144,0) size 84x19
-              text run at (144,0) width 84: "\x{1790}\x{178F}\x{17AF}\x{1780}\x{179F}\x{17B6}\x{179A}"
+            LayoutText {#text} at (180,0) size 84x19
+              text run at (180,0) width 84: "\x{1790}\x{178F}\x{17AF}\x{1780}\x{179F}\x{17B6}\x{179A}"
         LayoutText {#text} at (0,0) size 0x0
       LayoutBlockFlow {P} at (0,36) size 784x60
         LayoutText {#text} at (0,0) size 501x19
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/large-text-composed-char-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/text/large-text-composed-char-expected.txt
index c32bf6e..df1f776 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/large-text-composed-char-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/large-text-composed-char-expected.txt
@@ -1,4 +1,4 @@
-layer at (0,0) size 800x600 scrollWidth 1064 scrollHeight 8486
+layer at (0,0) size 800x600 scrollWidth 1072 scrollHeight 8486
   LayoutView at (0,0) size 800x600
 layer at (0,0) size 800x8486 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600
   LayoutBlockFlow {HTML} at (0,0) size 800x8486
@@ -343,9 +343,9 @@
           text run at (0,2656) width 1056: "e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301} e\x{301} e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301} e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301} e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}"
           text run at (1056,2656) width 0: " "
           text run at (0,2672) width 968: "e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301} e\x{301} e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301} e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301} e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e"
-        LayoutText {#text} at (968,2672) size 1056x2720
-          text run at (968,2672) width 88: "\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}"
-          text run at (1056,2672) width 0: " "
+        LayoutText {#text} at (968,2672) size 1064x2720
+          text run at (968,2672) width 96: "\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}"
+          text run at (1064,2672) width 0: " "
           text run at (0,2688) width 1056: "e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301} e\x{301} e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301} e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301} e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}"
           text run at (1056,2688) width 0: " "
           text run at (0,2704) width 1056: "e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301} e\x{301} e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301} e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301} e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}e\x{301}"
diff --git a/third_party/WebKit/Source/bindings/templates/attributes.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/attributes.cpp.tmpl
index a2cfd7a..7550a07 100644
--- a/third_party/WebKit/Source/bindings/templates/attributes.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/attributes.cpp.tmpl
@@ -188,7 +188,7 @@
 
 {##############################################################################}
 {% macro attribute_getter_callback(attribute, world_suffix) %}
-void {{attribute.name}}AttributeGetterCallback{{world_suffix}}(
+{{exported}}void {{attribute.name}}AttributeGetterCallback{{world_suffix}}(
 {%- if attribute.is_data_type_property %}
 v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info
 {%- else %}
@@ -229,7 +229,7 @@
 
 {##############################################################################}
 {% macro attribute_cache_property_callback(attribute) %}
-v8::Local<v8::Private> {{attribute.name}}CachedAccessorCallback(v8::Isolate* isolate)
+{{exported}}v8::Local<v8::Private> {{attribute.name}}CachedAccessorCallback(v8::Isolate* isolate)
 {
     return V8PrivateProperty::get{{attribute.cached_accessor_name}}(isolate).getPrivate();
 }
@@ -238,7 +238,7 @@
 
 {##############################################################################}
 {% macro constructor_getter_callback(attribute, world_suffix) %}
-void {{attribute.name}}ConstructorGetterCallback{{world_suffix}}(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
+{{exported}}void {{attribute.name}}ConstructorGetterCallback{{world_suffix}}(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
   {% if attribute.deprecate_as %}
   Deprecation::countDeprecation(currentExecutionContext(info.GetIsolate()), UseCounter::{{attribute.deprecate_as}});
   {% endif %}
@@ -366,7 +366,7 @@
 
 {##############################################################################}
 {% macro attribute_setter_callback(attribute, world_suffix) %}
-void {{attribute.name}}AttributeSetterCallback{{world_suffix}}(
+{{exported}}void {{attribute.name}}AttributeSetterCallback{{world_suffix}}(
 {%- if attribute.is_data_type_property %}
 v8::Local<v8::Name>, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<void>& info
 {%- else %}
diff --git a/third_party/WebKit/Source/bindings/templates/constants.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/constants.cpp.tmpl
index 40b7bc2..c49a238 100644
--- a/third_party/WebKit/Source/bindings/templates/constants.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/constants.cpp.tmpl
@@ -1,6 +1,6 @@
 {##############################################################################}
 {% macro constant_getter_callback(constant) %}
-void {{constant.name}}ConstantGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
+{{exported}}void {{constant.name}}ConstantGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
   {% if constant.deprecate_as %}
   Deprecation::countDeprecation(currentExecutionContext(info.GetIsolate()), UseCounter::{{constant.deprecate_as}});
   {% endif %}
diff --git a/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl
index ffa4afa..1d1db395 100644
--- a/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/interface.cpp.tmpl
@@ -48,7 +48,7 @@
 {% block indexed_property_getter_callback %}
 {% if indexed_property_getter or named_property_getter %}
 {% set getter = indexed_property_getter or named_property_getter %}
-void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
+{{exported}}void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
   {% if indexed_property_getter %}
 
   {% if getter.is_custom %}
@@ -122,7 +122,7 @@
 {% block indexed_property_setter_callback %}
 {% if indexed_property_setter or named_property_setter %}
 {% set setter = indexed_property_setter or named_property_setter %}
-void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+{{exported}}void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   {% if setter.is_ce_reactions %}
   CEReactionsScope ceReactionsScope;
   {% endif %}
@@ -190,7 +190,7 @@
 {% block indexed_property_deleter_callback %}
 {% if indexed_property_deleter or named_property_deleter %}
 {% set deleter = indexed_property_deleter or named_property_deleter %}
-void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+{{exported}}void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   {% if deleter.is_ce_reactions %}
   CEReactionsScope ceReactionsScope;
   {% endif %}
@@ -253,7 +253,7 @@
 {% block named_property_getter_callback %}
 {% if named_property_getter %}
 {% set getter = named_property_getter %}
-void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+{{exported}}void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -320,7 +320,7 @@
 {% block named_property_setter_callback %}
 {% if named_property_setter %}
 {% set setter = named_property_setter %}
-void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+{{exported}}void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -381,7 +381,7 @@
 {% block named_property_deleter_callback %}
 {% if named_property_deleter %}
 {% set deleter = named_property_deleter %}
-void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+{{exported}}void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -435,7 +435,7 @@
 {% block named_property_query_callback %}
 {% if named_property_getter and named_property_getter.is_enumerable %}
 {% set getter = named_property_getter %}
-void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
+{{exported}}void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -475,7 +475,7 @@
 {% block named_property_enumerator_callback %}
 {% if named_property_getter and named_property_getter.is_enumerable %}
 {% set getter = named_property_getter %}
-void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
+{{exported}}void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
   {% if getter.is_custom_property_enumerator %}
   {{v8_class}}::namedPropertyEnumeratorCustom(info);
   {% else %}
@@ -510,7 +510,7 @@
   V8HiddenValue::setHiddenValue(ScriptState::current(info.GetIsolate()), v8::Local<v8::Object>::Cast(info.Holder()), name.As<v8::String>(), v8Value);
 }
 
-void {{cpp_class}}OriginSafeMethodSetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<void>& info) {
+{{exported}}void {{cpp_class}}OriginSafeMethodSetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<void>& info) {
   {{cpp_class}}V8Internal::{{cpp_class}}OriginSafeMethodSetter(name, v8Value, info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/templates/interface.h.tmpl b/third_party/WebKit/Source/bindings/templates/interface.h.tmpl
index 8f6e6d6..a828a5d 100644
--- a/third_party/WebKit/Source/bindings/templates/interface.h.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/interface.h.tmpl
@@ -21,7 +21,7 @@
   STATIC_ONLY({{v8_class}}Constructor);
  public:
   static v8::Local<v8::FunctionTemplate> domTemplate(v8::Isolate*, const DOMWrapperWorld&);
-  static const WrapperTypeInfo wrapperTypeInfo;
+  {{exported}}static const WrapperTypeInfo wrapperTypeInfo;
 };
 
 {% endif %}
diff --git a/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl
index d32da99..16bb616 100644
--- a/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl
@@ -189,7 +189,7 @@
 {##############################################################################}
 {% block security_check_functions %}
 {% if has_access_check_callbacks and not is_partial %}
-bool securityCheck(v8::Local<v8::Context> accessingContext, v8::Local<v8::Object> accessedObject, v8::Local<v8::Value> data) {
+{{exported}}bool securityCheck(v8::Local<v8::Context> accessingContext, v8::Local<v8::Object> accessedObject, v8::Local<v8::Value> data) {
   {% if interface_name == 'Window' %}
   v8::Isolate* isolate = v8::Isolate::GetCurrent();
   v8::Local<v8::Object> window = V8Window::findInstanceInPrototypeChain(accessedObject, isolate);
@@ -230,7 +230,7 @@
 {% endif %}
 
 {% if has_cross_origin_named_getter %}
-void crossOriginNamedGetter(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+{{exported}}void crossOriginNamedGetter(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -257,7 +257,7 @@
 {% endif %}
 
 {% if has_cross_origin_named_setter %}
-void crossOriginNamedSetter(v8::Local<v8::Name> name, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+{{exported}}void crossOriginNamedSetter(v8::Local<v8::Name> name, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -280,7 +280,7 @@
 {% endif %}
 
 {% if has_cross_origin_named_enumerator %}
-void crossOriginNamedEnumerator(const v8::PropertyCallbackInfo<v8::Array>& info) {
+{{exported}}void crossOriginNamedEnumerator(const v8::PropertyCallbackInfo<v8::Array>& info) {
   Vector<String> names;
   for (const auto& attribute : kCrossOriginAttributeTable)
     names.push_back(attribute.name);
@@ -292,7 +292,7 @@
 {% endif %}
 
 {% if has_cross_origin_indexed_getter %}
-void crossOriginIndexedGetter(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
+{{exported}}void crossOriginIndexedGetter(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
   {% if indexed_property_getter.is_custom %}
   {{v8_class}}::indexedPropertyGetterCustom(index, info);
   {% else %}
diff --git a/third_party/WebKit/Source/bindings/templates/methods.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/methods.cpp.tmpl
index a0a4779..d212e1e 100644
--- a/third_party/WebKit/Source/bindings/templates/methods.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/methods.cpp.tmpl
@@ -483,7 +483,7 @@
 
 {##############################################################################}
 {% macro method_callback(method, world_suffix) %}
-void {{method.name}}MethodCallback{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info) {
+{{exported}} void {{method.name}}MethodCallback{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info) {
   {% if not method.overloads %}{# Overloaded methods are measured in overload_resolution_method() #}
   {% if method.measure_as %}
   UseCounter::count(currentExecutionContext(info.GetIsolate()), UseCounter::{{method.measure_as('Method')}});
@@ -546,7 +546,7 @@
   }
 }
 
-void {{method.name}}OriginSafeMethodGetterCallback{{world_suffix}}(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
+{{exported}} void {{method.name}}OriginSafeMethodGetterCallback{{world_suffix}}(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
   {{cpp_class}}V8Internal::{{method.name}}OriginSafeMethodGetter{{world_suffix}}(info);
 }
 {% endmacro %}
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8SVGTestInterface.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8SVGTestInterface.cpp
index 0384cde..5730545 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8SVGTestInterface.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8SVGTestInterface.cpp
@@ -62,7 +62,7 @@
   v8SetReturnValueString(info, impl->fastGetAttribute(SVGNames::typeAttr), info.GetIsolate());
 }
 
-void typeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void typeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   SVGTestInterfaceV8Internal::typeAttributeGetter(info);
 }
 
@@ -81,7 +81,7 @@
   impl->setAttribute(SVGNames::typeAttr, cppValue);
 }
 
-void typeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void typeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestCallbackFunctions.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestCallbackFunctions.cpp
index bd85132..fb0ab0f2 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestCallbackFunctions.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestCallbackFunctions.cpp
@@ -64,7 +64,7 @@
   v8SetReturnValueFast(info, impl->voidCallbackFunctionAttribute(), impl);
 }
 
-void voidCallbackFunctionAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void voidCallbackFunctionAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestCallbackFunctionsV8Internal::voidCallbackFunctionAttributeAttributeGetter(info);
 }
 
@@ -78,7 +78,7 @@
   impl->setVoidCallbackFunctionAttribute(cppValue);
 }
 
-void voidCallbackFunctionAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void voidCallbackFunctionAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestCallbackFunctionsV8Internal::voidCallbackFunctionAttributeAttributeSetter(v8Value, info);
@@ -92,7 +92,7 @@
   v8SetReturnValueFast(info, impl->anyCallbackFunctionOptionalAnyArgAttribute(), impl);
 }
 
-void anyCallbackFunctionOptionalAnyArgAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void anyCallbackFunctionOptionalAnyArgAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestCallbackFunctionsV8Internal::anyCallbackFunctionOptionalAnyArgAttributeAttributeGetter(info);
 }
 
@@ -106,7 +106,7 @@
   impl->setAnyCallbackFunctionOptionalAnyArgAttribute(cppValue);
 }
 
-void anyCallbackFunctionOptionalAnyArgAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void anyCallbackFunctionOptionalAnyArgAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestCallbackFunctionsV8Internal::anyCallbackFunctionOptionalAnyArgAttributeAttributeSetter(v8Value, info);
@@ -120,7 +120,7 @@
   v8SetReturnValueInt(info, impl->customElementsCallbacksReadonlyAttribute());
 }
 
-void customElementsCallbacksReadonlyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customElementsCallbacksReadonlyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestCallbackFunctionsV8Internal::customElementsCallbacksReadonlyAttributeAttributeGetter(info);
 }
 
@@ -130,7 +130,7 @@
   v8SetReturnValue(info, impl->returnCallbackFunctionMethod());
 }
 
-void returnCallbackFunctionMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void returnCallbackFunctionMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestCallbackFunctionsV8Internal::returnCallbackFunctionMethodMethod(info);
 }
 
@@ -140,7 +140,7 @@
   v8SetReturnValue(info, impl->returnCallbackFunctionMethod2());
 }
 
-void returnCallbackFunctionMethod2MethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void returnCallbackFunctionMethod2MethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestCallbackFunctionsV8Internal::returnCallbackFunctionMethod2Method(info);
 }
 
@@ -163,7 +163,7 @@
   impl->voidMethodCallbackFunctionInArg(voidCallbackFunctionArg);
 }
 
-void voidMethodCallbackFunctionInArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodCallbackFunctionInArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestCallbackFunctionsV8Internal::voidMethodCallbackFunctionInArgMethod(info);
 }
 
@@ -186,7 +186,7 @@
   impl->voidMethodCallbackFunctionInArg2(anyCallbackFunctionOptionalAnyArgArg);
 }
 
-void voidMethodCallbackFunctionInArg2MethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodCallbackFunctionInArg2MethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestCallbackFunctionsV8Internal::voidMethodCallbackFunctionInArg2Method(info);
 }
 
@@ -209,7 +209,7 @@
   impl->voidMethodCallbackFunctionWithReturnValueInArg(longCallbackFunctionArg);
 }
 
-void voidMethodCallbackFunctionWithReturnValueInArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodCallbackFunctionWithReturnValueInArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestCallbackFunctionsV8Internal::voidMethodCallbackFunctionWithReturnValueInArgMethod(info);
 }
 
@@ -237,7 +237,7 @@
   impl->voidMethodOptionalCallbackFunctionInArg(voidCallbackFunctionArg);
 }
 
-void voidMethodOptionalCallbackFunctionInArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodOptionalCallbackFunctionInArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestCallbackFunctionsV8Internal::voidMethodOptionalCallbackFunctionInArgMethod(info);
 }
 
@@ -260,7 +260,7 @@
   impl->voidMethodNullableCallbackFunctionInArg(voidCallbackFunctionArg);
 }
 
-void voidMethodNullableCallbackFunctionInArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodNullableCallbackFunctionInArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestCallbackFunctionsV8Internal::voidMethodNullableCallbackFunctionInArgMethod(info);
 }
 
@@ -272,7 +272,7 @@
   impl->customElementCallbacksMethod();
 }
 
-void customElementCallbacksMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void customElementCallbacksMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestCallbackFunctionsV8Internal::customElementCallbacksMethodMethod(info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestConstants.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestConstants.cpp
index 70cb4011..f83df0c 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestConstants.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestConstants.cpp
@@ -57,12 +57,12 @@
 
 namespace TestConstantsV8Internal {
 
-void DEPRECATED_CONSTANTConstantGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void DEPRECATED_CONSTANTConstantGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
   Deprecation::countDeprecation(currentExecutionContext(info.GetIsolate()), UseCounter::Constant);
   v8SetReturnValueInt(info, 1);
 }
 
-void MEASURED_CONSTANTConstantGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void MEASURED_CONSTANTConstantGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
   UseCounter::count(currentExecutionContext(info.GetIsolate()), UseCounter::Constant);
   v8SetReturnValueInt(info, 1);
 }
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestException.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestException.cpp
index ec12c7d5..c5181c7 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestException.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestException.cpp
@@ -61,7 +61,7 @@
   v8SetReturnValueUnsigned(info, impl->readonlyUnsignedShortAttribute());
 }
 
-void readonlyUnsignedShortAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void readonlyUnsignedShortAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestExceptionV8Internal::readonlyUnsignedShortAttributeAttributeGetter(info);
 }
 
@@ -73,7 +73,7 @@
   v8SetReturnValueString(info, impl->readonlyStringAttribute(), info.GetIsolate());
 }
 
-void readonlyStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void readonlyStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestExceptionV8Internal::readonlyStringAttributeAttributeGetter(info);
 }
 
@@ -83,7 +83,7 @@
   v8SetReturnValueString(info, impl->toString(), info.GetIsolate());
 }
 
-void toStringMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void toStringMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestExceptionV8Internal::toStringMethod(info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexed.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexed.cpp
index 7de5c0c6..a298256 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexed.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexed.cpp
@@ -62,7 +62,7 @@
   v8SetReturnValueInt(info, impl->length());
 }
 
-void lengthAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void lengthAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestIntegerIndexedV8Internal::lengthAttributeGetter(info);
 }
 
@@ -80,7 +80,7 @@
   impl->setLength(cppValue);
 }
 
-void lengthAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void lengthAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestIntegerIndexedV8Internal::lengthAttributeSetter(v8Value, info);
@@ -105,11 +105,11 @@
   impl->voidMethodDocument(document);
 }
 
-void voidMethodDocumentMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDocumentMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestIntegerIndexedV8Internal::voidMethodDocumentMethod(info);
 }
 
-void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -117,7 +117,7 @@
   V8TestIntegerIndexed::namedPropertyGetterCustom(propertyName, info);
 }
 
-void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -125,7 +125,7 @@
   V8TestIntegerIndexed::namedPropertySetterCustom(propertyName, v8Value, info);
 }
 
-void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -133,7 +133,7 @@
   V8TestIntegerIndexed::namedPropertyDeleterCustom(propertyName, info);
 }
 
-void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
+CORE_EXPORT void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -141,19 +141,19 @@
   V8TestIntegerIndexed::namedPropertyQueryCustom(propertyName, info);
 }
 
-void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
+CORE_EXPORT void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
   V8TestIntegerIndexed::namedPropertyEnumeratorCustom(info);
 }
 
-void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
   V8TestIntegerIndexed::indexedPropertyGetterCustom(index, info);
 }
 
-void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   V8TestIntegerIndexed::indexedPropertySetterCustom(index, v8Value, info);
 }
 
-void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   V8TestIntegerIndexed::indexedPropertyDeleterCustom(index, info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedGlobal.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedGlobal.cpp
index e31c251..4996191c 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedGlobal.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedGlobal.cpp
@@ -62,7 +62,7 @@
   v8SetReturnValue(info, static_cast<double>(impl->length()));
 }
 
-void lengthAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void lengthAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestIntegerIndexedGlobalV8Internal::lengthAttributeGetter(info);
 }
 
@@ -80,7 +80,7 @@
   impl->setLength(cppValue);
 }
 
-void lengthAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void lengthAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestIntegerIndexedGlobalV8Internal::lengthAttributeSetter(v8Value, info);
@@ -105,11 +105,11 @@
   impl->voidMethodDocument(document);
 }
 
-void voidMethodDocumentMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDocumentMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestIntegerIndexedGlobalV8Internal::voidMethodDocumentMethod(info);
 }
 
-void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -117,7 +117,7 @@
   V8TestIntegerIndexedGlobal::namedPropertyGetterCustom(propertyName, info);
 }
 
-void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -125,7 +125,7 @@
   V8TestIntegerIndexedGlobal::namedPropertySetterCustom(propertyName, v8Value, info);
 }
 
-void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -133,7 +133,7 @@
   V8TestIntegerIndexedGlobal::namedPropertyDeleterCustom(propertyName, info);
 }
 
-void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
+CORE_EXPORT void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -141,19 +141,19 @@
   V8TestIntegerIndexedGlobal::namedPropertyQueryCustom(propertyName, info);
 }
 
-void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
+CORE_EXPORT void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
   V8TestIntegerIndexedGlobal::namedPropertyEnumeratorCustom(info);
 }
 
-void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
   V8TestIntegerIndexedGlobal::indexedPropertyGetterCustom(index, info);
 }
 
-void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   V8TestIntegerIndexedGlobal::indexedPropertySetterCustom(index, v8Value, info);
 }
 
-void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   V8TestIntegerIndexedGlobal::indexedPropertyDeleterCustom(index, info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedPrimaryGlobal.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedPrimaryGlobal.cpp
index 00a245b..e43b8fd 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedPrimaryGlobal.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestIntegerIndexedPrimaryGlobal.cpp
@@ -62,7 +62,7 @@
   v8SetReturnValueInt(info, impl->length());
 }
 
-void lengthAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void lengthAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestIntegerIndexedPrimaryGlobalV8Internal::lengthAttributeGetter(info);
 }
 
@@ -80,7 +80,7 @@
   impl->setLength(cppValue);
 }
 
-void lengthAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void lengthAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestIntegerIndexedPrimaryGlobalV8Internal::lengthAttributeSetter(v8Value, info);
@@ -105,11 +105,11 @@
   impl->voidMethodDocument(document);
 }
 
-void voidMethodDocumentMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDocumentMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestIntegerIndexedPrimaryGlobalV8Internal::voidMethodDocumentMethod(info);
 }
 
-void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -117,7 +117,7 @@
   V8TestIntegerIndexedPrimaryGlobal::namedPropertyGetterCustom(propertyName, info);
 }
 
-void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -125,7 +125,7 @@
   V8TestIntegerIndexedPrimaryGlobal::namedPropertySetterCustom(propertyName, v8Value, info);
 }
 
-void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -133,7 +133,7 @@
   V8TestIntegerIndexedPrimaryGlobal::namedPropertyDeleterCustom(propertyName, info);
 }
 
-void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
+CORE_EXPORT void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -141,19 +141,19 @@
   V8TestIntegerIndexedPrimaryGlobal::namedPropertyQueryCustom(propertyName, info);
 }
 
-void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
+CORE_EXPORT void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
   V8TestIntegerIndexedPrimaryGlobal::namedPropertyEnumeratorCustom(info);
 }
 
-void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
   V8TestIntegerIndexedPrimaryGlobal::indexedPropertyGetterCustom(index, info);
 }
 
-void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   V8TestIntegerIndexedPrimaryGlobal::indexedPropertySetterCustom(index, v8Value, info);
 }
 
-void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   V8TestIntegerIndexedPrimaryGlobal::indexedPropertyDeleterCustom(index, info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
index c698c8f..59a9445 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
@@ -86,7 +86,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->testInterfaceAttribute()), impl);
 }
 
-void testInterfaceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   UseCounter::count(currentExecutionContext(info.GetIsolate()), UseCounter::V8TestInterface_TestInterfaceAttribute_AttributeGetter);
 
   TestInterfaceImplementationV8Internal::testInterfaceAttributeAttributeGetter(info);
@@ -110,7 +110,7 @@
   impl->setTestInterfaceAttribute(cppValue);
 }
 
-void testInterfaceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   UseCounter::count(currentExecutionContext(info.GetIsolate()), UseCounter::V8TestInterface_TestInterfaceAttribute_AttributeSetter);
@@ -126,7 +126,7 @@
   v8SetReturnValue(info, impl->doubleAttribute());
 }
 
-void doubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::doubleAttributeAttributeGetter(info);
 }
 
@@ -144,7 +144,7 @@
   impl->setDoubleAttribute(cppValue);
 }
 
-void doubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::doubleAttributeAttributeSetter(v8Value, info);
@@ -158,7 +158,7 @@
   v8SetReturnValue(info, impl->floatAttribute());
 }
 
-void floatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void floatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::floatAttributeAttributeGetter(info);
 }
 
@@ -176,7 +176,7 @@
   impl->setFloatAttribute(cppValue);
 }
 
-void floatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void floatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::floatAttributeAttributeSetter(v8Value, info);
@@ -190,7 +190,7 @@
   v8SetReturnValue(info, impl->unrestrictedDoubleAttribute());
 }
 
-void unrestrictedDoubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unrestrictedDoubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::unrestrictedDoubleAttributeAttributeGetter(info);
 }
 
@@ -208,7 +208,7 @@
   impl->setUnrestrictedDoubleAttribute(cppValue);
 }
 
-void unrestrictedDoubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unrestrictedDoubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::unrestrictedDoubleAttributeAttributeSetter(v8Value, info);
@@ -222,7 +222,7 @@
   v8SetReturnValue(info, impl->unrestrictedFloatAttribute());
 }
 
-void unrestrictedFloatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unrestrictedFloatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::unrestrictedFloatAttributeAttributeGetter(info);
 }
 
@@ -240,7 +240,7 @@
   impl->setUnrestrictedFloatAttribute(cppValue);
 }
 
-void unrestrictedFloatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unrestrictedFloatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::unrestrictedFloatAttributeAttributeSetter(v8Value, info);
@@ -254,7 +254,7 @@
   v8SetReturnValueString(info, impl->testEnumAttribute(), info.GetIsolate());
 }
 
-void testEnumAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testEnumAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::testEnumAttributeAttributeGetter(info);
 }
 
@@ -286,7 +286,7 @@
   impl->setTestEnumAttribute(cppValue);
 }
 
-void testEnumAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testEnumAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::testEnumAttributeAttributeSetter(v8Value, info);
@@ -303,7 +303,7 @@
   v8SetReturnValue(info, result);
 }
 
-void stringOrDoubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringOrDoubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::stringOrDoubleAttributeAttributeGetter(info);
 }
 
@@ -322,7 +322,7 @@
   impl->setStringOrDoubleAttribute(cppValue);
 }
 
-void stringOrDoubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringOrDoubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::stringOrDoubleAttributeAttributeSetter(v8Value, info);
@@ -336,7 +336,7 @@
   v8SetReturnValueInt(info, impl->conditionalLongAttribute());
 }
 
-void conditionalLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void conditionalLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::conditionalLongAttributeAttributeGetter(info);
 }
 
@@ -354,7 +354,7 @@
   impl->setConditionalLongAttribute(cppValue);
 }
 
-void conditionalLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void conditionalLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::conditionalLongAttributeAttributeSetter(v8Value, info);
@@ -368,7 +368,7 @@
   v8SetReturnValueInt(info, impl->conditionalReadOnlyLongAttribute());
 }
 
-void conditionalReadOnlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void conditionalReadOnlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::conditionalReadOnlyLongAttributeAttributeGetter(info);
 }
 
@@ -376,7 +376,7 @@
   v8SetReturnValueString(info, TestInterfaceImplementation::staticStringAttribute(), info.GetIsolate());
 }
 
-void staticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::staticStringAttributeAttributeGetter(info);
 }
 
@@ -389,7 +389,7 @@
   TestInterfaceImplementation::setStaticStringAttribute(cppValue);
 }
 
-void staticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::staticStringAttributeAttributeSetter(v8Value, info);
@@ -399,7 +399,7 @@
   v8SetReturnValue(info, WTF::getPtr(TestInterfaceImplementation::staticReturnDOMWrapperAttribute()), info.GetIsolate()->GetCurrentContext()->Global());
 }
 
-void staticReturnDOMWrapperAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticReturnDOMWrapperAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::staticReturnDOMWrapperAttributeAttributeGetter(info);
 }
 
@@ -418,7 +418,7 @@
   TestInterfaceImplementation::setStaticReturnDOMWrapperAttribute(cppValue);
 }
 
-void staticReturnDOMWrapperAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticReturnDOMWrapperAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::staticReturnDOMWrapperAttributeAttributeSetter(v8Value, info);
@@ -428,7 +428,7 @@
   v8SetReturnValueString(info, TestInterfaceImplementation::staticReadOnlyStringAttribute(), info.GetIsolate());
 }
 
-void staticReadOnlyStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticReadOnlyStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::staticReadOnlyStringAttributeAttributeGetter(info);
 }
 
@@ -446,7 +446,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void staticReadOnlyReturnDOMWrapperAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticReadOnlyReturnDOMWrapperAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::staticReadOnlyReturnDOMWrapperAttributeAttributeGetter(info);
 }
 
@@ -454,7 +454,7 @@
   v8SetReturnValueInt(info, TestInterfaceImplementation::staticConditionalReadOnlyLongAttribute());
 }
 
-void staticConditionalReadOnlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticConditionalReadOnlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::staticConditionalReadOnlyLongAttributeAttributeGetter(info);
 }
 
@@ -466,7 +466,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->legacyInterfaceTypeCheckingAttribute()), impl);
 }
 
-void legacyInterfaceTypeCheckingAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void legacyInterfaceTypeCheckingAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::legacyInterfaceTypeCheckingAttributeAttributeGetter(info);
 }
 
@@ -480,7 +480,7 @@
   impl->setLegacyInterfaceTypeCheckingAttribute(cppValue);
 }
 
-void legacyInterfaceTypeCheckingAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void legacyInterfaceTypeCheckingAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::legacyInterfaceTypeCheckingAttributeAttributeSetter(v8Value, info);
@@ -494,7 +494,7 @@
   v8SetReturnValueInt(info, impl->alwaysExposedAttribute());
 }
 
-void alwaysExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void alwaysExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::alwaysExposedAttributeAttributeGetter(info);
 }
 
@@ -512,7 +512,7 @@
   impl->setAlwaysExposedAttribute(cppValue);
 }
 
-void alwaysExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void alwaysExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::alwaysExposedAttributeAttributeSetter(v8Value, info);
@@ -526,7 +526,7 @@
   v8SetReturnValueInt(info, impl->workerExposedAttribute());
 }
 
-void workerExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void workerExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::workerExposedAttributeAttributeGetter(info);
 }
 
@@ -544,7 +544,7 @@
   impl->setWorkerExposedAttribute(cppValue);
 }
 
-void workerExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void workerExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::workerExposedAttributeAttributeSetter(v8Value, info);
@@ -558,7 +558,7 @@
   v8SetReturnValueInt(info, impl->windowExposedAttribute());
 }
 
-void windowExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void windowExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::windowExposedAttributeAttributeGetter(info);
 }
 
@@ -576,7 +576,7 @@
   impl->setWindowExposedAttribute(cppValue);
 }
 
-void windowExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void windowExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::windowExposedAttributeAttributeSetter(v8Value, info);
@@ -595,7 +595,7 @@
   v8SetReturnValue(info, impl->lenientThisAttribute().v8Value());
 }
 
-void lenientThisAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void lenientThisAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::lenientThisAttributeAttributeGetter(info);
 }
 
@@ -614,7 +614,7 @@
   impl->setLenientThisAttribute(cppValue);
 }
 
-void lenientThisAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void lenientThisAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::lenientThisAttributeAttributeSetter(v8Value, info);
@@ -628,7 +628,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->secureContextAttribute()), impl);
 }
 
-void secureContextAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::secureContextAttributeAttributeGetter(info);
 }
 
@@ -650,7 +650,7 @@
   impl->setSecureContextAttribute(cppValue);
 }
 
-void secureContextAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::secureContextAttributeAttributeSetter(v8Value, info);
@@ -664,7 +664,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->secureContextRuntimeEnabledAttribute()), impl);
 }
 
-void secureContextRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::secureContextRuntimeEnabledAttributeAttributeGetter(info);
 }
 
@@ -686,7 +686,7 @@
   impl->setSecureContextRuntimeEnabledAttribute(cppValue);
 }
 
-void secureContextRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::secureContextRuntimeEnabledAttributeAttributeSetter(v8Value, info);
@@ -700,7 +700,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->secureContextWindowExposedAttribute()), impl);
 }
 
-void secureContextWindowExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWindowExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::secureContextWindowExposedAttributeAttributeGetter(info);
 }
 
@@ -722,7 +722,7 @@
   impl->setSecureContextWindowExposedAttribute(cppValue);
 }
 
-void secureContextWindowExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWindowExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::secureContextWindowExposedAttributeAttributeSetter(v8Value, info);
@@ -736,7 +736,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->secureContextWorkerExposedAttribute()), impl);
 }
 
-void secureContextWorkerExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWorkerExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::secureContextWorkerExposedAttributeAttributeGetter(info);
 }
 
@@ -758,7 +758,7 @@
   impl->setSecureContextWorkerExposedAttribute(cppValue);
 }
 
-void secureContextWorkerExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWorkerExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::secureContextWorkerExposedAttributeAttributeSetter(v8Value, info);
@@ -772,7 +772,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->secureContextWindowExposedRuntimeEnabledAttribute()), impl);
 }
 
-void secureContextWindowExposedRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWindowExposedRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::secureContextWindowExposedRuntimeEnabledAttributeAttributeGetter(info);
 }
 
@@ -794,7 +794,7 @@
   impl->setSecureContextWindowExposedRuntimeEnabledAttribute(cppValue);
 }
 
-void secureContextWindowExposedRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWindowExposedRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::secureContextWindowExposedRuntimeEnabledAttributeAttributeSetter(v8Value, info);
@@ -808,7 +808,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->secureContextWorkerExposedRuntimeEnabledAttribute()), impl);
 }
 
-void secureContextWorkerExposedRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWorkerExposedRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::secureContextWorkerExposedRuntimeEnabledAttributeAttributeGetter(info);
 }
 
@@ -830,7 +830,7 @@
   impl->setSecureContextWorkerExposedRuntimeEnabledAttribute(cppValue);
 }
 
-void secureContextWorkerExposedRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWorkerExposedRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::secureContextWorkerExposedRuntimeEnabledAttributeAttributeSetter(v8Value, info);
@@ -840,7 +840,7 @@
   v8SetReturnValueInt(info, TestInterfaceImplementation::implementsStaticReadOnlyLongAttribute());
 }
 
-void implementsStaticReadOnlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementsStaticReadOnlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implementsStaticReadOnlyLongAttributeAttributeGetter(info);
 }
 
@@ -848,7 +848,7 @@
   v8SetReturnValueString(info, TestInterfaceImplementation::implementsStaticStringAttribute(), info.GetIsolate());
 }
 
-void implementsStaticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementsStaticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implementsStaticStringAttributeAttributeGetter(info);
 }
 
@@ -861,7 +861,7 @@
   TestInterfaceImplementation::setImplementsStaticStringAttribute(cppValue);
 }
 
-void implementsStaticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementsStaticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::implementsStaticStringAttributeAttributeSetter(v8Value, info);
@@ -875,7 +875,7 @@
   v8SetReturnValueString(info, impl->implementsReadonlyStringAttribute(), info.GetIsolate());
 }
 
-void implementsReadonlyStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementsReadonlyStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implementsReadonlyStringAttributeAttributeGetter(info);
 }
 
@@ -887,7 +887,7 @@
   v8SetReturnValueString(info, impl->implementsStringAttribute(), info.GetIsolate());
 }
 
-void implementsStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementsStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implementsStringAttributeAttributeGetter(info);
 }
 
@@ -903,7 +903,7 @@
   impl->setImplementsStringAttribute(cppValue);
 }
 
-void implementsStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementsStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::implementsStringAttributeAttributeSetter(v8Value, info);
@@ -917,7 +917,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->implementsNodeAttribute()), impl);
 }
 
-void implementsNodeAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementsNodeAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implementsNodeAttributeAttributeGetter(info);
 }
 
@@ -939,7 +939,7 @@
   impl->setImplementsNodeAttribute(cppValue);
 }
 
-void implementsNodeAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementsNodeAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::implementsNodeAttributeAttributeSetter(v8Value, info);
@@ -955,7 +955,7 @@
   v8SetReturnValue(info, cppValue ? V8AbstractEventListener::cast(cppValue)->getListenerOrNull(info.GetIsolate(), impl->getExecutionContext()) : v8::Null(info.GetIsolate()).As<v8::Value>());
 }
 
-void implementsEventHandlerAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementsEventHandlerAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implementsEventHandlerAttributeAttributeGetter(info);
 }
 
@@ -969,7 +969,7 @@
   impl->setImplementsEventHandlerAttribute(V8EventListenerHelper::getEventListener(ScriptState::forReceiverObject(info), v8Value, true, ListenerFindOrCreate));
 }
 
-void implementsEventHandlerAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementsEventHandlerAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::implementsEventHandlerAttributeAttributeSetter(v8Value, info);
@@ -983,7 +983,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->implementsRuntimeEnabledNodeAttribute()), impl);
 }
 
-void implementsRuntimeEnabledNodeAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementsRuntimeEnabledNodeAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implementsRuntimeEnabledNodeAttributeAttributeGetter(info);
 }
 
@@ -1005,7 +1005,7 @@
   impl->setImplementsRuntimeEnabledNodeAttribute(cppValue);
 }
 
-void implementsRuntimeEnabledNodeAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementsRuntimeEnabledNodeAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::implementsRuntimeEnabledNodeAttributeAttributeSetter(v8Value, info);
@@ -1015,7 +1015,7 @@
   v8SetReturnValueString(info, TestImplements2::implements2StaticStringAttribute(), info.GetIsolate());
 }
 
-void implements2StaticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implements2StaticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implements2StaticStringAttributeAttributeGetter(info);
 }
 
@@ -1028,7 +1028,7 @@
   TestImplements2::setImplements2StaticStringAttribute(cppValue);
 }
 
-void implements2StaticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implements2StaticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::implements2StaticStringAttributeAttributeSetter(v8Value, info);
@@ -1042,7 +1042,7 @@
   v8SetReturnValueString(info, TestImplements2::implements2StringAttribute(*impl), info.GetIsolate());
 }
 
-void implements2StringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implements2StringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implements2StringAttributeAttributeGetter(info);
 }
 
@@ -1058,7 +1058,7 @@
   TestImplements2::setImplements2StringAttribute(*impl, cppValue);
 }
 
-void implements2StringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implements2StringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::implements2StringAttributeAttributeSetter(v8Value, info);
@@ -1072,7 +1072,7 @@
   v8SetReturnValueString(info, TestImplements3Implementation::implements3StringAttribute(*impl), info.GetIsolate());
 }
 
-void implements3StringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implements3StringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implements3StringAttributeAttributeGetter(info);
 }
 
@@ -1088,7 +1088,7 @@
   TestImplements3Implementation::setImplements3StringAttribute(*impl, cppValue);
 }
 
-void implements3StringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implements3StringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::implements3StringAttributeAttributeSetter(v8Value, info);
@@ -1098,7 +1098,7 @@
   v8SetReturnValueString(info, TestImplements3Implementation::implements3StaticStringAttribute(), info.GetIsolate());
 }
 
-void implements3StaticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implements3StaticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implements3StaticStringAttributeAttributeGetter(info);
 }
 
@@ -1111,7 +1111,7 @@
   TestImplements3Implementation::setImplements3StaticStringAttribute(cppValue);
 }
 
-void implements3StaticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implements3StaticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::implements3StaticStringAttributeAttributeSetter(v8Value, info);
@@ -1125,7 +1125,7 @@
   v8SetReturnValueInt(info, TestInterfacePartial::partialLongAttribute(*impl));
 }
 
-void partialLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialLongAttributeAttributeGetter(info);
 }
 
@@ -1143,7 +1143,7 @@
   TestInterfacePartial::setPartialLongAttribute(*impl, cppValue);
 }
 
-void partialLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::partialLongAttributeAttributeSetter(v8Value, info);
@@ -1153,7 +1153,7 @@
   v8SetReturnValueInt(info, TestInterfacePartial::partialStaticLongAttribute());
 }
 
-void partialStaticLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialStaticLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialStaticLongAttributeAttributeGetter(info);
 }
 
@@ -1168,7 +1168,7 @@
   TestInterfacePartial::setPartialStaticLongAttribute(cppValue);
 }
 
-void partialStaticLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialStaticLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::partialStaticLongAttributeAttributeSetter(v8Value, info);
@@ -1184,7 +1184,7 @@
   v8SetReturnValueInt(info, TestInterfacePartial::partialCallWithExecutionContextLongAttribute(executionContext, *impl));
 }
 
-void partialCallWithExecutionContextLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialCallWithExecutionContextLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialCallWithExecutionContextLongAttributeAttributeGetter(info);
 }
 
@@ -1204,7 +1204,7 @@
   TestInterfacePartial::setPartialCallWithExecutionContextLongAttribute(executionContext, *impl, cppValue);
 }
 
-void partialCallWithExecutionContextLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialCallWithExecutionContextLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::partialCallWithExecutionContextLongAttributeAttributeSetter(v8Value, info);
@@ -1218,7 +1218,7 @@
   v8SetReturnValueString(info, TestInterfacePartial::partialPartialEnumTypeAttribute(*impl), info.GetIsolate());
 }
 
-void partialPartialEnumTypeAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialPartialEnumTypeAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialPartialEnumTypeAttributeAttributeGetter(info);
 }
 
@@ -1248,7 +1248,7 @@
   TestInterfacePartial::setPartialPartialEnumTypeAttribute(*impl, cppValue);
 }
 
-void partialPartialEnumTypeAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialPartialEnumTypeAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::partialPartialEnumTypeAttributeAttributeSetter(v8Value, info);
@@ -1262,7 +1262,7 @@
   v8SetReturnValueInt(info, TestInterfacePartial2Implementation::partial2LongAttribute(*impl));
 }
 
-void partial2LongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partial2LongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partial2LongAttributeAttributeGetter(info);
 }
 
@@ -1280,7 +1280,7 @@
   TestInterfacePartial2Implementation::setPartial2LongAttribute(*impl, cppValue);
 }
 
-void partial2LongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partial2LongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::partial2LongAttributeAttributeSetter(v8Value, info);
@@ -1290,7 +1290,7 @@
   v8SetReturnValueInt(info, TestInterfacePartial2Implementation::partial2StaticLongAttribute());
 }
 
-void partial2StaticLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partial2StaticLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partial2StaticLongAttributeAttributeGetter(info);
 }
 
@@ -1305,7 +1305,7 @@
   TestInterfacePartial2Implementation::setPartial2StaticLongAttribute(cppValue);
 }
 
-void partial2StaticLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partial2StaticLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::partial2StaticLongAttributeAttributeSetter(v8Value, info);
@@ -1319,7 +1319,7 @@
   v8SetReturnValueFast(info, TestInterfacePartial2Implementation::partial2SecureContextAttribute(*impl), impl);
 }
 
-void partial2SecureContextAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partial2SecureContextAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partial2SecureContextAttributeAttributeGetter(info);
 }
 
@@ -1341,7 +1341,7 @@
   TestInterfacePartial2Implementation::setPartial2SecureContextAttribute(*impl, cppValue);
 }
 
-void partial2SecureContextAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partial2SecureContextAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::partial2SecureContextAttributeAttributeSetter(v8Value, info);
@@ -1355,7 +1355,7 @@
   v8SetReturnValueFast(info, TestInterfacePartialSecureContext::partialSecureContextAttribute(*impl), impl);
 }
 
-void partialSecureContextAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialSecureContextAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialSecureContextAttributeAttributeGetter(info);
 }
 
@@ -1377,7 +1377,7 @@
   TestInterfacePartialSecureContext::setPartialSecureContextAttribute(*impl, cppValue);
 }
 
-void partialSecureContextAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialSecureContextAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::partialSecureContextAttributeAttributeSetter(v8Value, info);
@@ -1391,7 +1391,7 @@
   v8SetReturnValueFast(info, TestInterfacePartialSecureContext::partialSecureContextRuntimeEnabledAttribute(*impl), impl);
 }
 
-void partialSecureContextRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialSecureContextRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialSecureContextRuntimeEnabledAttributeAttributeGetter(info);
 }
 
@@ -1413,7 +1413,7 @@
   TestInterfacePartialSecureContext::setPartialSecureContextRuntimeEnabledAttribute(*impl, cppValue);
 }
 
-void partialSecureContextRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialSecureContextRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::partialSecureContextRuntimeEnabledAttributeAttributeSetter(v8Value, info);
@@ -1427,7 +1427,7 @@
   v8SetReturnValueFast(info, TestInterfacePartialSecureContext::partialSecureContextWindowExposedAttribute(*impl), impl);
 }
 
-void partialSecureContextWindowExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialSecureContextWindowExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialSecureContextWindowExposedAttributeAttributeGetter(info);
 }
 
@@ -1449,7 +1449,7 @@
   TestInterfacePartialSecureContext::setPartialSecureContextWindowExposedAttribute(*impl, cppValue);
 }
 
-void partialSecureContextWindowExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialSecureContextWindowExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::partialSecureContextWindowExposedAttributeAttributeSetter(v8Value, info);
@@ -1463,7 +1463,7 @@
   v8SetReturnValueFast(info, TestInterfacePartialSecureContext::partialSecureContextWorkerExposedAttribute(*impl), impl);
 }
 
-void partialSecureContextWorkerExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialSecureContextWorkerExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialSecureContextWorkerExposedAttributeAttributeGetter(info);
 }
 
@@ -1485,7 +1485,7 @@
   TestInterfacePartialSecureContext::setPartialSecureContextWorkerExposedAttribute(*impl, cppValue);
 }
 
-void partialSecureContextWorkerExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialSecureContextWorkerExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::partialSecureContextWorkerExposedAttributeAttributeSetter(v8Value, info);
@@ -1499,7 +1499,7 @@
   v8SetReturnValueFast(info, TestInterfacePartialSecureContext::partialSecureContextWindowExposedRuntimeEnabledAttribute(*impl), impl);
 }
 
-void partialSecureContextWindowExposedRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialSecureContextWindowExposedRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialSecureContextWindowExposedRuntimeEnabledAttributeAttributeGetter(info);
 }
 
@@ -1521,7 +1521,7 @@
   TestInterfacePartialSecureContext::setPartialSecureContextWindowExposedRuntimeEnabledAttribute(*impl, cppValue);
 }
 
-void partialSecureContextWindowExposedRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialSecureContextWindowExposedRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::partialSecureContextWindowExposedRuntimeEnabledAttributeAttributeSetter(v8Value, info);
@@ -1535,7 +1535,7 @@
   v8SetReturnValueFast(info, TestInterfacePartialSecureContext::partialSecureContextWorkerExposedRuntimeEnabledAttribute(*impl), impl);
 }
 
-void partialSecureContextWorkerExposedRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialSecureContextWorkerExposedRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialSecureContextWorkerExposedRuntimeEnabledAttributeAttributeGetter(info);
 }
 
@@ -1557,7 +1557,7 @@
   TestInterfacePartialSecureContext::setPartialSecureContextWorkerExposedRuntimeEnabledAttribute(*impl, cppValue);
 }
 
-void partialSecureContextWorkerExposedRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void partialSecureContextWorkerExposedRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceImplementationV8Internal::partialSecureContextWorkerExposedRuntimeEnabledAttributeAttributeSetter(v8Value, info);
@@ -1582,7 +1582,7 @@
   impl->voidMethodTestInterfaceEmptyArg(testInterfaceEmptyArg);
 }
 
-void voidMethodTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::voidMethodTestInterfaceEmptyArgMethod(info);
 }
 
@@ -1609,7 +1609,7 @@
   impl->voidMethodDoubleArgFloatArg(doubleArg, floatArg);
 }
 
-void voidMethodDoubleArgFloatArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDoubleArgFloatArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::voidMethodDoubleArgFloatArgMethod(info);
 }
 
@@ -1636,7 +1636,7 @@
   impl->voidMethodUnrestrictedDoubleArgUnrestrictedFloatArg(unrestrictedDoubleArg, unrestrictedFloatArg);
 }
 
-void voidMethodUnrestrictedDoubleArgUnrestrictedFloatArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodUnrestrictedDoubleArgUnrestrictedFloatArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::voidMethodUnrestrictedDoubleArgUnrestrictedFloatArgMethod(info);
 }
 
@@ -1667,7 +1667,7 @@
   impl->voidMethodTestEnumArg(testEnumArg);
 }
 
-void voidMethodTestEnumArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestEnumArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::voidMethodTestEnumArgMethod(info);
 }
 
@@ -1677,7 +1677,7 @@
   impl->voidMethod();
 }
 
-void voidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::voidMethodMethod(info);
 }
 
@@ -1687,7 +1687,7 @@
   impl->voidMethod();
 }
 
-void voidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::voidMethodMethodForMainWorld(info);
 }
 
@@ -1697,7 +1697,7 @@
   impl->alwaysExposedMethod();
 }
 
-void alwaysExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void alwaysExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::alwaysExposedMethodMethod(info);
 }
 
@@ -1707,7 +1707,7 @@
   impl->workerExposedMethod();
 }
 
-void workerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void workerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::workerExposedMethodMethod(info);
 }
 
@@ -1717,7 +1717,7 @@
   impl->windowExposedMethod();
 }
 
-void windowExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void windowExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::windowExposedMethodMethod(info);
 }
 
@@ -1725,7 +1725,7 @@
   TestInterfaceImplementation::alwaysExposedStaticMethod();
 }
 
-void alwaysExposedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void alwaysExposedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::alwaysExposedStaticMethodMethod(info);
 }
 
@@ -1733,7 +1733,7 @@
   TestInterfaceImplementation::workerExposedStaticMethod();
 }
 
-void workerExposedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void workerExposedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::workerExposedStaticMethodMethod(info);
 }
 
@@ -1741,7 +1741,7 @@
   TestInterfaceImplementation::windowExposedStaticMethod();
 }
 
-void windowExposedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void windowExposedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::windowExposedStaticMethodMethod(info);
 }
 
@@ -1749,7 +1749,7 @@
   v8SetReturnValue(info, TestInterfaceImplementation::staticReturnDOMWrapperMethod(), info.GetIsolate()->GetCurrentContext()->Global());
 }
 
-void staticReturnDOMWrapperMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void staticReturnDOMWrapperMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::staticReturnDOMWrapperMethodMethod(info);
 }
 
@@ -1759,7 +1759,7 @@
   impl->methodWithExposedAndRuntimeEnabledFlag();
 }
 
-void methodWithExposedAndRuntimeEnabledFlagMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void methodWithExposedAndRuntimeEnabledFlagMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::methodWithExposedAndRuntimeEnabledFlagMethod(info);
 }
 
@@ -1841,7 +1841,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadMethodWithExposedAndRuntimeEnabledFlagMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadMethodWithExposedAndRuntimeEnabledFlagMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::overloadMethodWithExposedAndRuntimeEnabledFlagMethod(info);
 }
 
@@ -1851,7 +1851,7 @@
   impl->methodWithExposedHavingRuntimeEnabldFlag();
 }
 
-void methodWithExposedHavingRuntimeEnabldFlagMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void methodWithExposedHavingRuntimeEnabldFlagMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::methodWithExposedHavingRuntimeEnabldFlagMethod(info);
 }
 
@@ -1861,7 +1861,7 @@
   impl->windowAndServiceWorkerExposedMethod();
 }
 
-void windowAndServiceWorkerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void windowAndServiceWorkerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::windowAndServiceWorkerExposedMethodMethod(info);
 }
 
@@ -1944,7 +1944,7 @@
   impl->legacyInterfaceTypeCheckingMethod(testInterfaceEmptyArg);
 }
 
-void legacyInterfaceTypeCheckingMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void legacyInterfaceTypeCheckingMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::legacyInterfaceTypeCheckingMethodMethod(info);
 }
 
@@ -1954,7 +1954,7 @@
   impl->secureContextMethod();
 }
 
-void secureContextMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void secureContextMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::secureContextMethodMethod(info);
 }
 
@@ -1964,7 +1964,7 @@
   impl->secureContextRuntimeEnabledMethod();
 }
 
-void secureContextRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void secureContextRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::secureContextRuntimeEnabledMethodMethod(info);
 }
 
@@ -1974,7 +1974,7 @@
   impl->secureContextWindowExposedMethod();
 }
 
-void secureContextWindowExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void secureContextWindowExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::secureContextWindowExposedMethodMethod(info);
 }
 
@@ -1984,7 +1984,7 @@
   impl->secureContextWorkerExposedMethod();
 }
 
-void secureContextWorkerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void secureContextWorkerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::secureContextWorkerExposedMethodMethod(info);
 }
 
@@ -1994,7 +1994,7 @@
   impl->secureContextWindowExposedRuntimeEnabledMethod();
 }
 
-void secureContextWindowExposedRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void secureContextWindowExposedRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::secureContextWindowExposedRuntimeEnabledMethodMethod(info);
 }
 
@@ -2004,7 +2004,7 @@
   impl->secureContextWorkerExposedRuntimeEnabledMethod();
 }
 
-void secureContextWorkerExposedRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void secureContextWorkerExposedRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::secureContextWorkerExposedRuntimeEnabledMethodMethod(info);
 }
 
@@ -2014,7 +2014,7 @@
   impl->implementsVoidMethod();
 }
 
-void implementsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void implementsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implementsVoidMethodMethod(info);
 }
 
@@ -2049,11 +2049,11 @@
   v8SetReturnValue(info, result);
 }
 
-void implementsComplexMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void implementsComplexMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implementsComplexMethodMethod(info);
 }
 
-void implementsCustomVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void implementsCustomVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   V8TestInterface::implementsCustomVoidMethodMethodCustom(info);
 }
 
@@ -2061,7 +2061,7 @@
   TestInterfaceImplementation::implementsStaticVoidMethod();
 }
 
-void implementsStaticVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void implementsStaticVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implementsStaticVoidMethodMethod(info);
 }
 
@@ -2071,7 +2071,7 @@
   TestImplements2::implements2VoidMethod(*impl);
 }
 
-void implements2VoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void implements2VoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implements2VoidMethodMethod(info);
 }
 
@@ -2081,7 +2081,7 @@
   TestImplements3Implementation::implements3VoidMethod(*impl);
 }
 
-void implements3VoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void implements3VoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implements3VoidMethodMethod(info);
 }
 
@@ -2089,7 +2089,7 @@
   TestImplements3Implementation::implements3StaticVoidMethod();
 }
 
-void implements3StaticVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void implements3StaticVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::implements3StaticVoidMethodMethod(info);
 }
 
@@ -2099,7 +2099,7 @@
   TestInterfacePartial::partialVoidMethod(*impl);
 }
 
-void partialVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partialVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialVoidMethodMethod(info);
 }
 
@@ -2107,7 +2107,7 @@
   TestInterfacePartial::partialStaticVoidMethod();
 }
 
-void partialStaticVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partialStaticVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialStaticVoidMethodMethod(info);
 }
 
@@ -2129,7 +2129,7 @@
   TestInterfacePartial::partialVoidMethodLongArg(*impl, longArg);
 }
 
-void partialVoidMethodLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partialVoidMethodLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialVoidMethodLongArgMethod(info);
 }
 
@@ -2145,7 +2145,7 @@
   }
 }
 
-void partialCallWithExecutionContextRaisesExceptionVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partialCallWithExecutionContextRaisesExceptionVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialCallWithExecutionContextRaisesExceptionVoidMethodMethod(info);
 }
 
@@ -2168,7 +2168,7 @@
   TestInterfacePartial::partialVoidMethodPartialCallbackTypeArg(*impl, partialCallbackTypeArg);
 }
 
-void partialVoidMethodPartialCallbackTypeArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partialVoidMethodPartialCallbackTypeArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialVoidMethodPartialCallbackTypeArgMethod(info);
 }
 
@@ -2188,7 +2188,7 @@
   TestInterfacePartial2Implementation::partial2SecureContextMethod(*impl);
 }
 
-void partial2SecureContextMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partial2SecureContextMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partial2SecureContextMethodMethod(info);
 }
 
@@ -2198,7 +2198,7 @@
   TestInterfacePartialSecureContext::partialSecureContextMethod(*impl);
 }
 
-void partialSecureContextMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partialSecureContextMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialSecureContextMethodMethod(info);
 }
 
@@ -2208,7 +2208,7 @@
   TestInterfacePartialSecureContext::partialSecureContextRuntimeEnabledMethod(*impl);
 }
 
-void partialSecureContextRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partialSecureContextRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialSecureContextRuntimeEnabledMethodMethod(info);
 }
 
@@ -2218,7 +2218,7 @@
   TestInterfacePartialSecureContext::partialSecureContextWindowExposedMethod(*impl);
 }
 
-void partialSecureContextWindowExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partialSecureContextWindowExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialSecureContextWindowExposedMethodMethod(info);
 }
 
@@ -2228,7 +2228,7 @@
   TestInterfacePartialSecureContext::partialSecureContextWorkerExposedMethod(*impl);
 }
 
-void partialSecureContextWorkerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partialSecureContextWorkerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialSecureContextWorkerExposedMethodMethod(info);
 }
 
@@ -2238,7 +2238,7 @@
   TestInterfacePartialSecureContext::partialSecureContextWindowExposedRuntimeEnabledMethod(*impl);
 }
 
-void partialSecureContextWindowExposedRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partialSecureContextWindowExposedRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialSecureContextWindowExposedRuntimeEnabledMethodMethod(info);
 }
 
@@ -2248,7 +2248,7 @@
   TestInterfacePartialSecureContext::partialSecureContextWorkerExposedRuntimeEnabledMethod(*impl);
 }
 
-void partialSecureContextWorkerExposedRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partialSecureContextWorkerExposedRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partialSecureContextWorkerExposedRuntimeEnabledMethodMethod(info);
 }
 
@@ -2276,7 +2276,7 @@
   (voidMethodPartialOverloadMethodForPartialInterface)(info);
 }
 
-void voidMethodPartialOverloadMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodPartialOverloadMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::voidMethodPartialOverloadMethod(info);
 }
 
@@ -2296,7 +2296,7 @@
   (staticVoidMethodPartialOverloadMethodForPartialInterface)(info);
 }
 
-void staticVoidMethodPartialOverloadMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void staticVoidMethodPartialOverloadMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::staticVoidMethodPartialOverloadMethod(info);
 }
 
@@ -2320,7 +2320,7 @@
   (promiseMethodPartialOverloadMethodForPartialInterface)(info);
 }
 
-void promiseMethodPartialOverloadMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void promiseMethodPartialOverloadMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::promiseMethodPartialOverloadMethod(info);
 }
 
@@ -2340,7 +2340,7 @@
   (staticPromiseMethodPartialOverloadMethodForPartialInterface)(info);
 }
 
-void staticPromiseMethodPartialOverloadMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void staticPromiseMethodPartialOverloadMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::staticPromiseMethodPartialOverloadMethod(info);
 }
 
@@ -2360,7 +2360,7 @@
   (partial2VoidMethodMethodForPartialInterface)(info);
 }
 
-void partial2VoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partial2VoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partial2VoidMethodMethod(info);
 }
 
@@ -2380,7 +2380,7 @@
   (partial2StaticVoidMethodMethodForPartialInterface)(info);
 }
 
-void partial2StaticVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partial2StaticVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partial2StaticVoidMethodMethod(info);
 }
 
@@ -2398,7 +2398,7 @@
   v8SetReturnValue(info, result.v8Value());
 }
 
-void toJSONMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void toJSONMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::toJSONMethod(info);
 }
 
@@ -2408,7 +2408,7 @@
   v8SetReturnValueString(info, impl->toString(), info.GetIsolate());
 }
 
-void toStringMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void toStringMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::toStringMethod(info);
 }
 
@@ -2426,7 +2426,7 @@
   v8SetReturnValue(info, result);
 }
 
-void iteratorMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void iteratorMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::iteratorMethod(info);
 }
 
@@ -2438,7 +2438,7 @@
   v8SetReturnValueString(info, result, info.GetIsolate());
 }
 
-void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -2458,7 +2458,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -2475,7 +2475,7 @@
   v8SetReturnValue(info, result == DeleteSuccess);
 }
 
-void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -2495,7 +2495,7 @@
   v8SetReturnValueInt(info, v8::None);
 }
 
-void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
+CORE_EXPORT void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -2515,7 +2515,7 @@
   v8SetReturnValue(info, ToV8(names, info.Holder(), info.GetIsolate()).As<v8::Array>());
 }
 
-void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
+CORE_EXPORT void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
   TestInterfaceImplementationV8Internal::namedPropertyEnumerator(info);
 }
 
@@ -2533,7 +2533,7 @@
   v8SetReturnValueString(info, result, info.GetIsolate());
 }
 
-void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::indexedPropertyGetter(index, info);
 }
 
@@ -2549,7 +2549,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::indexedPropertySetter(index, v8Value, info);
 }
 
@@ -2562,7 +2562,7 @@
   v8SetReturnValue(info, result == DeleteSuccess);
 }
 
-void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   TestInterfaceImplementationV8Internal::indexedPropertyDeleter(index, info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface2.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface2.cpp
index edd0f2b..0f985325 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface2.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface2.cpp
@@ -78,7 +78,7 @@
   v8SetReturnValue(info, impl->legacyCaller(index));
 }
 
-void legacyCallerMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void legacyCallerMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::legacyCallerMethod(info);
 }
 
@@ -104,7 +104,7 @@
   v8SetReturnValue(info, result);
 }
 
-void itemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void itemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::itemMethod(info);
 }
 
@@ -138,7 +138,7 @@
   v8SetReturnValue(info, result);
 }
 
-void setItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void setItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::setItemMethod(info);
 }
 
@@ -164,7 +164,7 @@
   v8SetReturnValueBool(info, result);
 }
 
-void deleteItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void deleteItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::deleteItemMethod(info);
 }
 
@@ -190,7 +190,7 @@
   v8SetReturnValue(info, result);
 }
 
-void namedItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void namedItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::namedItemMethod(info);
 }
 
@@ -224,7 +224,7 @@
   v8SetReturnValue(info, result);
 }
 
-void setNamedItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void setNamedItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::setNamedItemMethod(info);
 }
 
@@ -250,7 +250,7 @@
   v8SetReturnValueBool(info, result);
 }
 
-void deleteNamedItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void deleteNamedItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::deleteNamedItemMethod(info);
 }
 
@@ -260,7 +260,7 @@
   v8SetReturnValueString(info, impl->stringifierMethod(), info.GetIsolate());
 }
 
-void stringifierMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void stringifierMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::stringifierMethodMethod(info);
 }
 
@@ -278,7 +278,7 @@
   v8SetReturnValue(info, result);
 }
 
-void keysMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void keysMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::keysMethod(info);
 }
 
@@ -296,7 +296,7 @@
   v8SetReturnValue(info, result);
 }
 
-void valuesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void valuesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::valuesMethod(info);
 }
 
@@ -314,7 +314,7 @@
   v8SetReturnValue(info, result);
 }
 
-void entriesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void entriesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::entriesMethod(info);
 }
 
@@ -347,7 +347,7 @@
   }
 }
 
-void forEachMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void forEachMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::forEachMethod(info);
 }
 
@@ -378,7 +378,7 @@
   v8SetReturnValueBool(info, result);
 }
 
-void hasMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void hasMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::hasMethod(info);
 }
 
@@ -388,7 +388,7 @@
   v8SetReturnValueString(info, impl->stringifierMethod(), info.GetIsolate());
 }
 
-void toStringMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void toStringMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::toStringMethod(info);
 }
 
@@ -406,7 +406,7 @@
   v8SetReturnValue(info, result);
 }
 
-void iteratorMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void iteratorMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::iteratorMethod(info);
 }
 
@@ -428,7 +428,7 @@
   v8SetReturnValueFast(info, result, impl);
 }
 
-void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -455,7 +455,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -477,7 +477,7 @@
   v8SetReturnValue(info, result == DeleteSuccess);
 }
 
-void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -497,7 +497,7 @@
   v8SetReturnValueInt(info, v8::None);
 }
 
-void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
+CORE_EXPORT void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -517,7 +517,7 @@
   v8SetReturnValue(info, ToV8(names, info.Holder(), info.GetIsolate()).As<v8::Array>());
 }
 
-void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
+CORE_EXPORT void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
   TestInterface2V8Internal::namedPropertyEnumerator(info);
 }
 
@@ -537,7 +537,7 @@
   v8SetReturnValueFast(info, result, impl);
 }
 
-void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::indexedPropertyGetter(index, info);
 }
 
@@ -559,7 +559,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterface2V8Internal::indexedPropertySetter(index, v8Value, info);
 }
 
@@ -576,7 +576,7 @@
   v8SetReturnValue(info, result == DeleteSuccess);
 }
 
-void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   TestInterface2V8Internal::indexedPropertyDeleter(index, info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface3.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface3.cpp
index fedb667..a289996 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface3.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface3.cpp
@@ -66,7 +66,7 @@
   v8SetReturnValueString(info, impl->readonlyStringifierAttribute(), info.GetIsolate());
 }
 
-void readonlyStringifierAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void readonlyStringifierAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface3V8Internal::readonlyStringifierAttributeAttributeGetter(info);
 }
 
@@ -89,7 +89,7 @@
   impl->voidMethodDocument(document);
 }
 
-void voidMethodDocumentMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDocumentMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface3V8Internal::voidMethodDocumentMethod(info);
 }
 
@@ -107,7 +107,7 @@
   v8SetReturnValue(info, result);
 }
 
-void keysMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void keysMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface3V8Internal::keysMethod(info);
 }
 
@@ -125,7 +125,7 @@
   v8SetReturnValue(info, result);
 }
 
-void valuesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void valuesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface3V8Internal::valuesMethod(info);
 }
 
@@ -143,7 +143,7 @@
   v8SetReturnValue(info, result);
 }
 
-void entriesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void entriesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface3V8Internal::entriesMethod(info);
 }
 
@@ -176,7 +176,7 @@
   }
 }
 
-void forEachMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void forEachMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface3V8Internal::forEachMethod(info);
 }
 
@@ -186,7 +186,7 @@
   v8SetReturnValueString(info, impl->readonlyStringifierAttribute(), info.GetIsolate());
 }
 
-void toStringMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void toStringMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface3V8Internal::toStringMethod(info);
 }
 
@@ -204,11 +204,11 @@
   v8SetReturnValue(info, result);
 }
 
-void iteratorMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void iteratorMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface3V8Internal::iteratorMethod(info);
 }
 
-void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -216,7 +216,7 @@
   V8TestInterface3::namedPropertyGetterCustom(propertyName, info);
 }
 
-void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -224,7 +224,7 @@
   V8TestInterface3::namedPropertySetterCustom(propertyName, v8Value, info);
 }
 
-void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -232,7 +232,7 @@
   V8TestInterface3::namedPropertyDeleterCustom(propertyName, info);
 }
 
-void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
+CORE_EXPORT void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -240,19 +240,19 @@
   V8TestInterface3::namedPropertyQueryCustom(propertyName, info);
 }
 
-void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
+CORE_EXPORT void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
   V8TestInterface3::namedPropertyEnumeratorCustom(info);
 }
 
-void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
   V8TestInterface3::indexedPropertyGetterCustom(index, info);
 }
 
-void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   V8TestInterface3::indexedPropertySetterCustom(index, v8Value, info);
 }
 
-void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   V8TestInterface3::indexedPropertyDeleterCustom(index, info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceCheckSecurity.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceCheckSecurity.cpp
index da7325d..b187205 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceCheckSecurity.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceCheckSecurity.cpp
@@ -63,7 +63,7 @@
   v8SetReturnValueInt(info, impl->readonlyLongAttribute());
 }
 
-void readonlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void readonlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::readonlyLongAttributeAttributeGetter(info);
 }
 
@@ -75,7 +75,7 @@
   v8SetReturnValueInt(info, impl->longAttribute());
 }
 
-void longAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void longAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::longAttributeAttributeGetter(info);
 }
 
@@ -93,7 +93,7 @@
   impl->setLongAttribute(cppValue);
 }
 
-void longAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void longAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceCheckSecurityV8Internal::longAttributeAttributeSetter(v8Value, info);
@@ -107,7 +107,7 @@
   v8SetReturnValueInt(info, impl->doNotCheckSecurityLongAttribute());
 }
 
-void doNotCheckSecurityLongAttributeAttributeGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doNotCheckSecurityLongAttributeAttributeGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityLongAttributeAttributeGetter(info);
 }
 
@@ -125,7 +125,7 @@
   impl->setDoNotCheckSecurityLongAttribute(cppValue);
 }
 
-void doNotCheckSecurityLongAttributeAttributeSetterCallback(v8::Local<v8::Name>, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<void>& info) {
+CORE_EXPORT void doNotCheckSecurityLongAttributeAttributeSetterCallback(v8::Local<v8::Name>, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<void>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityLongAttributeAttributeSetter(v8Value, info);
 }
 
@@ -137,7 +137,7 @@
   v8SetReturnValueInt(info, impl->doNotCheckSecurityReadonlyLongAttribute());
 }
 
-void doNotCheckSecurityReadonlyLongAttributeAttributeGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doNotCheckSecurityReadonlyLongAttributeAttributeGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityReadonlyLongAttributeAttributeGetter(info);
 }
 
@@ -149,7 +149,7 @@
   v8SetReturnValueInt(info, impl->doNotCheckSecurityOnSetterLongAttribute());
 }
 
-void doNotCheckSecurityOnSetterLongAttributeAttributeGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doNotCheckSecurityOnSetterLongAttributeAttributeGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityOnSetterLongAttributeAttributeGetter(info);
 }
 
@@ -167,7 +167,7 @@
   impl->setDoNotCheckSecurityOnSetterLongAttribute(cppValue);
 }
 
-void doNotCheckSecurityOnSetterLongAttributeAttributeSetterCallback(v8::Local<v8::Name>, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<void>& info) {
+CORE_EXPORT void doNotCheckSecurityOnSetterLongAttributeAttributeSetterCallback(v8::Local<v8::Name>, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<void>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityOnSetterLongAttributeAttributeSetter(v8Value, V8CrossOriginSetterInfo(info.GetIsolate(), info.Holder()));
 }
 
@@ -179,7 +179,7 @@
   v8SetReturnValueInt(info, impl->doNotCheckSecurityReplaceableReadonlyLongAttribute());
 }
 
-void doNotCheckSecurityReplaceableReadonlyLongAttributeAttributeGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doNotCheckSecurityReplaceableReadonlyLongAttributeAttributeGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityReplaceableReadonlyLongAttributeAttributeGetter(info);
 }
 
@@ -194,7 +194,7 @@
   impl->voidMethod();
 }
 
-void voidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::voidMethodMethod(info);
 }
 
@@ -204,7 +204,7 @@
   impl->doNotCheckSecurityVoidMethod();
 }
 
-void doNotCheckSecurityVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void doNotCheckSecurityVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityVoidMethodMethod(info);
 }
 
@@ -230,7 +230,7 @@
   }
 }
 
-void doNotCheckSecurityVoidMethodOriginSafeMethodGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void doNotCheckSecurityVoidMethodOriginSafeMethodGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityVoidMethodOriginSafeMethodGetter(info);
 }
 
@@ -240,7 +240,7 @@
   impl->doNotCheckSecurityPerWorldBindingsVoidMethod();
 }
 
-void doNotCheckSecurityPerWorldBindingsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void doNotCheckSecurityPerWorldBindingsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityPerWorldBindingsVoidMethodMethod(info);
 }
 
@@ -266,7 +266,7 @@
   }
 }
 
-void doNotCheckSecurityPerWorldBindingsVoidMethodOriginSafeMethodGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void doNotCheckSecurityPerWorldBindingsVoidMethodOriginSafeMethodGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityPerWorldBindingsVoidMethodOriginSafeMethodGetter(info);
 }
 
@@ -276,7 +276,7 @@
   impl->doNotCheckSecurityPerWorldBindingsVoidMethod();
 }
 
-void doNotCheckSecurityPerWorldBindingsVoidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void doNotCheckSecurityPerWorldBindingsVoidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityPerWorldBindingsVoidMethodMethodForMainWorld(info);
 }
 
@@ -302,7 +302,7 @@
   }
 }
 
-void doNotCheckSecurityPerWorldBindingsVoidMethodOriginSafeMethodGetterCallbackForMainWorld(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void doNotCheckSecurityPerWorldBindingsVoidMethodOriginSafeMethodGetterCallbackForMainWorld(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityPerWorldBindingsVoidMethodOriginSafeMethodGetterForMainWorld(info);
 }
 
@@ -312,7 +312,7 @@
   impl->doNotCheckSecurityUnforgeableVoidMethod();
 }
 
-void doNotCheckSecurityUnforgeableVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void doNotCheckSecurityUnforgeableVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityUnforgeableVoidMethodMethod(info);
 }
 
@@ -338,7 +338,7 @@
   }
 }
 
-void doNotCheckSecurityUnforgeableVoidMethodOriginSafeMethodGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void doNotCheckSecurityUnforgeableVoidMethodOriginSafeMethodGetterCallback(v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityUnforgeableVoidMethodOriginSafeMethodGetter(info);
 }
 
@@ -358,11 +358,11 @@
   V8HiddenValue::setHiddenValue(ScriptState::current(info.GetIsolate()), v8::Local<v8::Object>::Cast(info.Holder()), name.As<v8::String>(), v8Value);
 }
 
-void TestInterfaceCheckSecurityOriginSafeMethodSetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<void>& info) {
+CORE_EXPORT void TestInterfaceCheckSecurityOriginSafeMethodSetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<void>& info) {
   TestInterfaceCheckSecurityV8Internal::TestInterfaceCheckSecurityOriginSafeMethodSetter(name, v8Value, info);
 }
 
-bool securityCheck(v8::Local<v8::Context> accessingContext, v8::Local<v8::Object> accessedObject, v8::Local<v8::Value> data) {
+CORE_EXPORT bool securityCheck(v8::Local<v8::Context> accessingContext, v8::Local<v8::Object> accessedObject, v8::Local<v8::Value> data) {
   TestInterfaceCheckSecurity* impl = V8TestInterfaceCheckSecurity::toImpl(accessedObject);
   return BindingSecurity::shouldAllowAccessTo(toLocalDOMWindow(toDOMWindow(accessingContext)), impl, BindingSecurity::ErrorReportOption::DoNotReport);
 }
@@ -400,7 +400,7 @@
   {"doNotCheckSecurityUnforgeableVoidMethod", &TestInterfaceCheckSecurityV8Internal::doNotCheckSecurityUnforgeableVoidMethodOriginSafeMethodGetter, nullptr},
 };
 
-void crossOriginNamedGetter(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void crossOriginNamedGetter(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -417,7 +417,7 @@
       V8TestInterfaceCheckSecurity::toImpl(info.Holder())->frame());
 }
 
-void crossOriginNamedSetter(v8::Local<v8::Name> name, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void crossOriginNamedSetter(v8::Local<v8::Name> name, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -434,7 +434,7 @@
       V8TestInterfaceCheckSecurity::toImpl(info.Holder())->frame());
 }
 
-void crossOriginNamedEnumerator(const v8::PropertyCallbackInfo<v8::Array>& info) {
+CORE_EXPORT void crossOriginNamedEnumerator(const v8::PropertyCallbackInfo<v8::Array>& info) {
   Vector<String> names;
   for (const auto& attribute : kCrossOriginAttributeTable)
     names.push_back(attribute.name);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.h
index e6b1ffe..dbe6b7a 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceConstructor.h
@@ -28,7 +28,7 @@
   STATIC_ONLY(V8TestInterfaceConstructorConstructor);
  public:
   static v8::Local<v8::FunctionTemplate> domTemplate(v8::Isolate*, const DOMWrapperWorld&);
-  static const WrapperTypeInfo wrapperTypeInfo;
+  CORE_EXPORT static const WrapperTypeInfo wrapperTypeInfo;
 };
 
 class V8TestInterfaceConstructor {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceDocument.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceDocument.cpp
index 7abe8b3..cb8dae6 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceDocument.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceDocument.cpp
@@ -66,7 +66,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->location()), impl);
 }
 
-void locationAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceDocumentV8Internal::locationAttributeGetter(info);
 }
 
@@ -87,7 +87,7 @@
   impl->setHref(currentDOMWindow(info.GetIsolate()), enteredDOMWindow(info.GetIsolate()), cppValue, exceptionState);
 }
 
-void locationAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceDocumentV8Internal::locationAttributeSetter(v8Value, info);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventInitConstructor.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventInitConstructor.cpp
index 57a35cd..1ef87291 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventInitConstructor.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventInitConstructor.cpp
@@ -62,7 +62,7 @@
   v8SetReturnValueString(info, impl->readonlyStringAttribute(), info.GetIsolate());
 }
 
-void readonlyStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void readonlyStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceEventInitConstructorV8Internal::readonlyStringAttributeAttributeGetter(info);
 }
 
@@ -74,7 +74,7 @@
   v8SetReturnValueBool(info, impl->isTrusted());
 }
 
-void isTrustedAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void isTrustedAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceEventInitConstructorV8Internal::isTrustedAttributeGetter(info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventTarget.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventTarget.h
index 11588cb7..39fd0fb 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventTarget.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceEventTarget.h
@@ -28,7 +28,7 @@
   STATIC_ONLY(V8TestInterfaceEventTargetConstructor);
  public:
   static v8::Local<v8::FunctionTemplate> domTemplate(v8::Isolate*, const DOMWrapperWorld&);
-  static const WrapperTypeInfo wrapperTypeInfo;
+  CORE_EXPORT static const WrapperTypeInfo wrapperTypeInfo;
 };
 
 class V8TestInterfaceEventTarget {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceGarbageCollected.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceGarbageCollected.cpp
index df42d4b..8303d04 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceGarbageCollected.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceGarbageCollected.cpp
@@ -65,7 +65,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->attr1()), impl);
 }
 
-void attr1AttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void attr1AttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceGarbageCollectedV8Internal::attr1AttributeGetter(info);
 }
 
@@ -87,7 +87,7 @@
   impl->setAttr1(cppValue);
 }
 
-void attr1AttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void attr1AttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceGarbageCollectedV8Internal::attr1AttributeSetter(v8Value, info);
@@ -112,7 +112,7 @@
   impl->func(arg);
 }
 
-void funcMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void funcMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceGarbageCollectedV8Internal::funcMethod(info);
 }
 
@@ -130,7 +130,7 @@
   v8SetReturnValue(info, result);
 }
 
-void keysMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void keysMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceGarbageCollectedV8Internal::keysMethod(info);
 }
 
@@ -148,7 +148,7 @@
   v8SetReturnValue(info, result);
 }
 
-void valuesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void valuesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceGarbageCollectedV8Internal::valuesMethod(info);
 }
 
@@ -166,7 +166,7 @@
   v8SetReturnValue(info, result);
 }
 
-void entriesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void entriesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceGarbageCollectedV8Internal::entriesMethod(info);
 }
 
@@ -199,7 +199,7 @@
   }
 }
 
-void forEachMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void forEachMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceGarbageCollectedV8Internal::forEachMethod(info);
 }
 
@@ -227,7 +227,7 @@
   v8SetReturnValueBool(info, result);
 }
 
-void hasMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void hasMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceGarbageCollectedV8Internal::hasMethod(info);
 }
 
@@ -255,7 +255,7 @@
   v8SetReturnValue(info, result);
 }
 
-void addMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void addMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceGarbageCollectedV8Internal::addMethod(info);
 }
 
@@ -272,7 +272,7 @@
   }
 }
 
-void clearMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void clearMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceGarbageCollectedV8Internal::clearMethod(info);
 }
 
@@ -300,7 +300,7 @@
   v8SetReturnValueBool(info, result);
 }
 
-void deleteMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void deleteMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceGarbageCollectedV8Internal::deleteMethod(info);
 }
 
@@ -318,7 +318,7 @@
   v8SetReturnValue(info, result);
 }
 
-void iteratorMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void iteratorMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceGarbageCollectedV8Internal::iteratorMethod(info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor.h
index 20b61d80..99aaedd 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor.h
@@ -27,7 +27,7 @@
   STATIC_ONLY(V8TestInterfaceNamedConstructorConstructor);
  public:
   static v8::Local<v8::FunctionTemplate> domTemplate(v8::Isolate*, const DOMWrapperWorld&);
-  static const WrapperTypeInfo wrapperTypeInfo;
+  CORE_EXPORT static const WrapperTypeInfo wrapperTypeInfo;
 };
 
 class V8TestInterfaceNamedConstructor {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor2.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor2.h
index 23888fe..4b25630 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor2.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNamedConstructor2.h
@@ -27,7 +27,7 @@
   STATIC_ONLY(V8TestInterfaceNamedConstructor2Constructor);
  public:
   static v8::Local<v8::FunctionTemplate> domTemplate(v8::Isolate*, const DOMWrapperWorld&);
-  static const WrapperTypeInfo wrapperTypeInfo;
+  CORE_EXPORT static const WrapperTypeInfo wrapperTypeInfo;
 };
 
 class V8TestInterfaceNamedConstructor2 {
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNode.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNode.cpp
index 15d3f122..2694f86 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNode.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceNode.cpp
@@ -65,7 +65,7 @@
   v8SetReturnValueString(info, impl->nodeName(), info.GetIsolate());
 }
 
-void nodeNameAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void nodeNameAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceNodeV8Internal::nodeNameAttributeGetter(info);
 }
 
@@ -81,7 +81,7 @@
   impl->setNodeName(cppValue);
 }
 
-void nodeNameAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void nodeNameAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceNodeV8Internal::nodeNameAttributeSetter(v8Value, info);
@@ -95,7 +95,7 @@
   v8SetReturnValueString(info, impl->stringAttribute(), info.GetIsolate());
 }
 
-void stringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceNodeV8Internal::stringAttributeAttributeGetter(info);
 }
 
@@ -111,7 +111,7 @@
   impl->setStringAttribute(cppValue);
 }
 
-void stringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceNodeV8Internal::stringAttributeAttributeSetter(v8Value, info);
@@ -125,7 +125,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->readonlyTestInterfaceEmptyAttribute()), impl);
 }
 
-void readonlyTestInterfaceEmptyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void readonlyTestInterfaceEmptyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceNodeV8Internal::readonlyTestInterfaceEmptyAttributeAttributeGetter(info);
 }
 
@@ -139,7 +139,7 @@
   v8SetReturnValue(info, cppValue ? V8AbstractEventListener::cast(cppValue)->getListenerOrNull(info.GetIsolate(), impl->getExecutionContext()) : v8::Null(info.GetIsolate()).As<v8::Value>());
 }
 
-void eventHandlerAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void eventHandlerAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceNodeV8Internal::eventHandlerAttributeAttributeGetter(info);
 }
 
@@ -152,7 +152,7 @@
   impl->setEventHandlerAttribute(V8EventListenerHelper::getEventListener(ScriptState::forReceiverObject(info), v8Value, true, ListenerFindOrCreate));
 }
 
-void eventHandlerAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void eventHandlerAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceNodeV8Internal::eventHandlerAttributeAttributeSetter(v8Value, info);
@@ -166,7 +166,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->perWorldBindingsReadonlyTestInterfaceEmptyAttribute()), impl);
 }
 
-void perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceNodeV8Internal::perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetter(info);
 }
 
@@ -178,7 +178,7 @@
   v8SetReturnValueForMainWorld(info, WTF::getPtr(impl->perWorldBindingsReadonlyTestInterfaceEmptyAttribute()));
 }
 
-void perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceNodeV8Internal::perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterForMainWorld(info);
 }
 
@@ -190,7 +190,7 @@
   v8SetReturnValueString(info, impl->fastGetAttribute(HTMLNames::reflectstringattributeAttr), info.GetIsolate());
 }
 
-void reflectStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceNodeV8Internal::reflectStringAttributeAttributeGetter(info);
 }
 
@@ -206,7 +206,7 @@
   impl->setAttribute(HTMLNames::reflectstringattributeAttr, cppValue);
 }
 
-void reflectStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -222,7 +222,7 @@
   v8SetReturnValueString(info, impl->getURLAttribute(HTMLNames::reflecturlstringattributeAttr), info.GetIsolate());
 }
 
-void reflectUrlStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectUrlStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceNodeV8Internal::reflectUrlStringAttributeAttributeGetter(info);
 }
 
@@ -238,7 +238,7 @@
   impl->setAttribute(HTMLNames::reflecturlstringattributeAttr, cppValue);
 }
 
-void reflectUrlStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectUrlStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -252,7 +252,7 @@
   v8SetReturnValueFast(info, impl->testInterfaceEmptyMethod(), impl);
 }
 
-void testInterfaceEmptyMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void testInterfaceEmptyMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceNodeV8Internal::testInterfaceEmptyMethodMethod(info);
 }
 
@@ -262,7 +262,7 @@
   v8SetReturnValueFast(info, impl->perWorldBindingsTestInterfaceEmptyMethod(), impl);
 }
 
-void perWorldBindingsTestInterfaceEmptyMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void perWorldBindingsTestInterfaceEmptyMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceNodeV8Internal::perWorldBindingsTestInterfaceEmptyMethodMethod(info);
 }
 
@@ -272,7 +272,7 @@
   v8SetReturnValueForMainWorld(info, impl->perWorldBindingsTestInterfaceEmptyMethod());
 }
 
-void perWorldBindingsTestInterfaceEmptyMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void perWorldBindingsTestInterfaceEmptyMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceNodeV8Internal::perWorldBindingsTestInterfaceEmptyMethodMethodForMainWorld(info);
 }
 
@@ -299,7 +299,7 @@
   v8SetReturnValueFast(info, impl->perWorldBindingsTestInterfaceEmptyMethodOptionalBooleanArg(optionalBooleanArgument), impl);
 }
 
-void perWorldBindingsTestInterfaceEmptyMethodOptionalBooleanArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void perWorldBindingsTestInterfaceEmptyMethodOptionalBooleanArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceNodeV8Internal::perWorldBindingsTestInterfaceEmptyMethodOptionalBooleanArgMethod(info);
 }
 
@@ -326,7 +326,7 @@
   v8SetReturnValueForMainWorld(info, impl->perWorldBindingsTestInterfaceEmptyMethodOptionalBooleanArg(optionalBooleanArgument));
 }
 
-void perWorldBindingsTestInterfaceEmptyMethodOptionalBooleanArgMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void perWorldBindingsTestInterfaceEmptyMethodOptionalBooleanArgMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceNodeV8Internal::perWorldBindingsTestInterfaceEmptyMethodOptionalBooleanArgMethodForMainWorld(info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceOriginTrialEnabled.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceOriginTrialEnabled.cpp
index fec0b1e00..d83fb7a 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceOriginTrialEnabled.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceOriginTrialEnabled.cpp
@@ -61,7 +61,7 @@
   v8SetReturnValue(info, impl->doubleAttribute());
 }
 
-void doubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceOriginTrialEnabledV8Internal::doubleAttributeAttributeGetter(info);
 }
 
@@ -79,7 +79,7 @@
   impl->setDoubleAttribute(cppValue);
 }
 
-void doubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceOriginTrialEnabledV8Internal::doubleAttributeAttributeSetter(v8Value, info);
@@ -93,7 +93,7 @@
   v8SetReturnValueInt(info, impl->conditionalLongAttribute());
 }
 
-void conditionalLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void conditionalLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceOriginTrialEnabledV8Internal::conditionalLongAttributeAttributeGetter(info);
 }
 
@@ -111,7 +111,7 @@
   impl->setConditionalLongAttribute(cppValue);
 }
 
-void conditionalLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void conditionalLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceOriginTrialEnabledV8Internal::conditionalLongAttributeAttributeSetter(v8Value, info);
@@ -125,7 +125,7 @@
   v8SetReturnValueInt(info, impl->conditionalReadOnlyLongAttribute());
 }
 
-void conditionalReadOnlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void conditionalReadOnlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceOriginTrialEnabledV8Internal::conditionalReadOnlyLongAttributeAttributeGetter(info);
 }
 
@@ -133,7 +133,7 @@
   v8SetReturnValueString(info, TestInterfaceOriginTrialEnabled::staticStringAttribute(), info.GetIsolate());
 }
 
-void staticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceOriginTrialEnabledV8Internal::staticStringAttributeAttributeGetter(info);
 }
 
@@ -146,7 +146,7 @@
   TestInterfaceOriginTrialEnabled::setStaticStringAttribute(cppValue);
 }
 
-void staticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceOriginTrialEnabledV8Internal::staticStringAttributeAttributeSetter(v8Value, info);
@@ -156,7 +156,7 @@
   v8SetReturnValueInt(info, TestInterfaceOriginTrialEnabled::staticConditionalReadOnlyLongAttribute());
 }
 
-void staticConditionalReadOnlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticConditionalReadOnlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceOriginTrialEnabledV8Internal::staticConditionalReadOnlyLongAttributeAttributeGetter(info);
 }
 
@@ -183,7 +183,7 @@
   impl->voidMethodDoubleArgFloatArg(doubleArg, floatArg);
 }
 
-void voidMethodDoubleArgFloatArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDoubleArgFloatArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceOriginTrialEnabledV8Internal::voidMethodDoubleArgFloatArgMethod(info);
 }
 
@@ -232,7 +232,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void voidMethodPartialOverloadMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodPartialOverloadMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceOriginTrialEnabledV8Internal::voidMethodPartialOverloadMethod(info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceSecureContext.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceSecureContext.cpp
index d95fc51..e7bfe3d 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceSecureContext.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceSecureContext.cpp
@@ -61,7 +61,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->secureContextAttribute()), impl);
 }
 
-void secureContextAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceSecureContextV8Internal::secureContextAttributeAttributeGetter(info);
 }
 
@@ -83,7 +83,7 @@
   impl->setSecureContextAttribute(cppValue);
 }
 
-void secureContextAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceSecureContextV8Internal::secureContextAttributeAttributeSetter(v8Value, info);
@@ -97,7 +97,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->secureContextRuntimeEnabledAttribute()), impl);
 }
 
-void secureContextRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceSecureContextV8Internal::secureContextRuntimeEnabledAttributeAttributeGetter(info);
 }
 
@@ -119,7 +119,7 @@
   impl->setSecureContextRuntimeEnabledAttribute(cppValue);
 }
 
-void secureContextRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceSecureContextV8Internal::secureContextRuntimeEnabledAttributeAttributeSetter(v8Value, info);
@@ -133,7 +133,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->secureContextWindowExposedAttribute()), impl);
 }
 
-void secureContextWindowExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWindowExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceSecureContextV8Internal::secureContextWindowExposedAttributeAttributeGetter(info);
 }
 
@@ -155,7 +155,7 @@
   impl->setSecureContextWindowExposedAttribute(cppValue);
 }
 
-void secureContextWindowExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWindowExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceSecureContextV8Internal::secureContextWindowExposedAttributeAttributeSetter(v8Value, info);
@@ -169,7 +169,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->secureContextWorkerExposedAttribute()), impl);
 }
 
-void secureContextWorkerExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWorkerExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceSecureContextV8Internal::secureContextWorkerExposedAttributeAttributeGetter(info);
 }
 
@@ -191,7 +191,7 @@
   impl->setSecureContextWorkerExposedAttribute(cppValue);
 }
 
-void secureContextWorkerExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWorkerExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceSecureContextV8Internal::secureContextWorkerExposedAttributeAttributeSetter(v8Value, info);
@@ -205,7 +205,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->secureContextWindowExposedRuntimeEnabledAttribute()), impl);
 }
 
-void secureContextWindowExposedRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWindowExposedRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceSecureContextV8Internal::secureContextWindowExposedRuntimeEnabledAttributeAttributeGetter(info);
 }
 
@@ -227,7 +227,7 @@
   impl->setSecureContextWindowExposedRuntimeEnabledAttribute(cppValue);
 }
 
-void secureContextWindowExposedRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWindowExposedRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceSecureContextV8Internal::secureContextWindowExposedRuntimeEnabledAttributeAttributeSetter(v8Value, info);
@@ -241,7 +241,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->secureContextWorkerExposedRuntimeEnabledAttribute()), impl);
 }
 
-void secureContextWorkerExposedRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWorkerExposedRuntimeEnabledAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceSecureContextV8Internal::secureContextWorkerExposedRuntimeEnabledAttributeAttributeGetter(info);
 }
 
@@ -263,7 +263,7 @@
   impl->setSecureContextWorkerExposedRuntimeEnabledAttribute(cppValue);
 }
 
-void secureContextWorkerExposedRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void secureContextWorkerExposedRuntimeEnabledAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterfaceSecureContextV8Internal::secureContextWorkerExposedRuntimeEnabledAttributeAttributeSetter(v8Value, info);
@@ -275,7 +275,7 @@
   impl->secureContextMethod();
 }
 
-void secureContextMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void secureContextMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceSecureContextV8Internal::secureContextMethodMethod(info);
 }
 
@@ -285,7 +285,7 @@
   impl->secureContextRuntimeEnabledMethod();
 }
 
-void secureContextRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void secureContextRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceSecureContextV8Internal::secureContextRuntimeEnabledMethodMethod(info);
 }
 
@@ -295,7 +295,7 @@
   impl->secureContextWindowExposedMethod();
 }
 
-void secureContextWindowExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void secureContextWindowExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceSecureContextV8Internal::secureContextWindowExposedMethodMethod(info);
 }
 
@@ -305,7 +305,7 @@
   impl->secureContextWorkerExposedMethod();
 }
 
-void secureContextWorkerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void secureContextWorkerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceSecureContextV8Internal::secureContextWorkerExposedMethodMethod(info);
 }
 
@@ -315,7 +315,7 @@
   impl->secureContextWindowExposedRuntimeEnabledMethod();
 }
 
-void secureContextWindowExposedRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void secureContextWindowExposedRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceSecureContextV8Internal::secureContextWindowExposedRuntimeEnabledMethodMethod(info);
 }
 
@@ -325,7 +325,7 @@
   impl->secureContextWorkerExposedRuntimeEnabledMethod();
 }
 
-void secureContextWorkerExposedRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void secureContextWorkerExposedRuntimeEnabledMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceSecureContextV8Internal::secureContextWorkerExposedRuntimeEnabledMethodMethod(info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestNode.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestNode.cpp
index f3d131ce..9f2d5546 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestNode.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestNode.cpp
@@ -61,7 +61,7 @@
   v8SetReturnValueString(info, impl->href(), info.GetIsolate());
 }
 
-void hrefAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void hrefAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestNodeV8Internal::hrefAttributeGetter(info);
 }
 
@@ -77,7 +77,7 @@
   impl->setHref(cppValue);
 }
 
-void hrefAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void hrefAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestNodeV8Internal::hrefAttributeSetter(v8Value, info);
@@ -91,7 +91,7 @@
   v8SetReturnValueString(info, impl->hrefThrows(), info.GetIsolate());
 }
 
-void hrefThrowsAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void hrefThrowsAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestNodeV8Internal::hrefThrowsAttributeGetter(info);
 }
 
@@ -109,7 +109,7 @@
   impl->setHrefThrows(cppValue, exceptionState);
 }
 
-void hrefThrowsAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void hrefThrowsAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestNodeV8Internal::hrefThrowsAttributeSetter(v8Value, info);
@@ -123,7 +123,7 @@
   v8SetReturnValueString(info, impl->hrefCallWith(), info.GetIsolate());
 }
 
-void hrefCallWithAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void hrefCallWithAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestNodeV8Internal::hrefCallWithAttributeGetter(info);
 }
 
@@ -141,7 +141,7 @@
   impl->setHrefCallWith(executionContext, currentDOMWindow(info.GetIsolate()), enteredDOMWindow(info.GetIsolate()), cppValue);
 }
 
-void hrefCallWithAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void hrefCallWithAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestNodeV8Internal::hrefCallWithAttributeSetter(v8Value, info);
@@ -155,7 +155,7 @@
   v8SetReturnValueString(info, impl->hrefByteString(), info.GetIsolate());
 }
 
-void hrefByteStringAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void hrefByteStringAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestNodeV8Internal::hrefByteStringAttributeGetter(info);
 }
 
@@ -173,7 +173,7 @@
   impl->setHrefByteString(cppValue);
 }
 
-void hrefByteStringAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void hrefByteStringAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestNodeV8Internal::hrefByteStringAttributeSetter(v8Value, info);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
index 61e99e2..b5bd8aa 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestObject.cpp
@@ -127,7 +127,7 @@
   v8SetReturnValueString(info, impl->stringifierAttribute(), info.GetIsolate());
 }
 
-void stringifierAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringifierAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::stringifierAttributeAttributeGetter(info);
 }
 
@@ -143,7 +143,7 @@
   impl->setStringifierAttribute(cppValue);
 }
 
-void stringifierAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringifierAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::stringifierAttributeAttributeSetter(v8Value, info);
@@ -157,7 +157,7 @@
   v8SetReturnValueString(info, impl->readonlyStringAttribute(), info.GetIsolate());
 }
 
-void readonlyStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void readonlyStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::readonlyStringAttributeAttributeGetter(info);
 }
 
@@ -179,7 +179,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void readonlyTestInterfaceEmptyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void readonlyTestInterfaceEmptyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::readonlyTestInterfaceEmptyAttributeAttributeGetter(info);
 }
 
@@ -191,7 +191,7 @@
   v8SetReturnValueInt(info, impl->readonlyLongAttribute());
 }
 
-void readonlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void readonlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::readonlyLongAttributeAttributeGetter(info);
 }
 
@@ -203,7 +203,7 @@
   v8SetReturnValue(info, v8DateOrNaN(info.GetIsolate(), impl->dateAttribute()));
 }
 
-void dateAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void dateAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::dateAttributeAttributeGetter(info);
 }
 
@@ -221,7 +221,7 @@
   impl->setDateAttribute(cppValue);
 }
 
-void dateAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void dateAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::dateAttributeAttributeSetter(v8Value, info);
@@ -235,7 +235,7 @@
   v8SetReturnValueString(info, impl->stringAttribute(), info.GetIsolate());
 }
 
-void stringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::stringAttributeAttributeGetter(info);
 }
 
@@ -251,7 +251,7 @@
   impl->setStringAttribute(cppValue);
 }
 
-void stringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::stringAttributeAttributeSetter(v8Value, info);
@@ -265,7 +265,7 @@
   v8SetReturnValueString(info, impl->byteStringAttribute(), info.GetIsolate());
 }
 
-void byteStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void byteStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::byteStringAttributeAttributeGetter(info);
 }
 
@@ -283,7 +283,7 @@
   impl->setByteStringAttribute(cppValue);
 }
 
-void byteStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void byteStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::byteStringAttributeAttributeSetter(v8Value, info);
@@ -297,7 +297,7 @@
   v8SetReturnValueString(info, impl->usvStringAttribute(), info.GetIsolate());
 }
 
-void usvStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void usvStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::usvStringAttributeAttributeGetter(info);
 }
 
@@ -315,7 +315,7 @@
   impl->setUsvStringAttribute(cppValue);
 }
 
-void usvStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void usvStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::usvStringAttributeAttributeSetter(v8Value, info);
@@ -329,7 +329,7 @@
   v8SetReturnValue(info, static_cast<double>(impl->domTimeStampAttribute()));
 }
 
-void domTimeStampAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void domTimeStampAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::domTimeStampAttributeAttributeGetter(info);
 }
 
@@ -347,7 +347,7 @@
   impl->setDomTimeStampAttribute(cppValue);
 }
 
-void domTimeStampAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void domTimeStampAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::domTimeStampAttributeAttributeSetter(v8Value, info);
@@ -361,7 +361,7 @@
   v8SetReturnValueBool(info, impl->booleanAttribute());
 }
 
-void booleanAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void booleanAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::booleanAttributeAttributeGetter(info);
 }
 
@@ -379,7 +379,7 @@
   impl->setBooleanAttribute(cppValue);
 }
 
-void booleanAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void booleanAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::booleanAttributeAttributeSetter(v8Value, info);
@@ -393,7 +393,7 @@
   v8SetReturnValueInt(info, impl->byteAttribute());
 }
 
-void byteAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void byteAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::byteAttributeAttributeGetter(info);
 }
 
@@ -411,7 +411,7 @@
   impl->setByteAttribute(cppValue);
 }
 
-void byteAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void byteAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::byteAttributeAttributeSetter(v8Value, info);
@@ -425,7 +425,7 @@
   v8SetReturnValue(info, impl->doubleAttribute());
 }
 
-void doubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::doubleAttributeAttributeGetter(info);
 }
 
@@ -443,7 +443,7 @@
   impl->setDoubleAttribute(cppValue);
 }
 
-void doubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::doubleAttributeAttributeSetter(v8Value, info);
@@ -457,7 +457,7 @@
   v8SetReturnValue(info, impl->floatAttribute());
 }
 
-void floatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void floatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::floatAttributeAttributeGetter(info);
 }
 
@@ -475,7 +475,7 @@
   impl->setFloatAttribute(cppValue);
 }
 
-void floatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void floatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::floatAttributeAttributeSetter(v8Value, info);
@@ -489,7 +489,7 @@
   v8SetReturnValueInt(info, impl->longAttribute());
 }
 
-void longAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void longAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::longAttributeAttributeGetter(info);
 }
 
@@ -507,7 +507,7 @@
   impl->setLongAttribute(cppValue);
 }
 
-void longAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void longAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::longAttributeAttributeSetter(v8Value, info);
@@ -521,7 +521,7 @@
   v8SetReturnValue(info, static_cast<double>(impl->longLongAttribute()));
 }
 
-void longLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void longLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::longLongAttributeAttributeGetter(info);
 }
 
@@ -539,7 +539,7 @@
   impl->setLongLongAttribute(cppValue);
 }
 
-void longLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void longLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::longLongAttributeAttributeSetter(v8Value, info);
@@ -553,7 +553,7 @@
   v8SetReturnValueUnsigned(info, impl->octetAttribute());
 }
 
-void octetAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void octetAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::octetAttributeAttributeGetter(info);
 }
 
@@ -571,7 +571,7 @@
   impl->setOctetAttribute(cppValue);
 }
 
-void octetAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void octetAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::octetAttributeAttributeSetter(v8Value, info);
@@ -585,7 +585,7 @@
   v8SetReturnValueInt(info, impl->shortAttribute());
 }
 
-void shortAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void shortAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::shortAttributeAttributeGetter(info);
 }
 
@@ -603,7 +603,7 @@
   impl->setShortAttribute(cppValue);
 }
 
-void shortAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void shortAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::shortAttributeAttributeSetter(v8Value, info);
@@ -617,7 +617,7 @@
   v8SetReturnValue(info, impl->unrestrictedDoubleAttribute());
 }
 
-void unrestrictedDoubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unrestrictedDoubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unrestrictedDoubleAttributeAttributeGetter(info);
 }
 
@@ -635,7 +635,7 @@
   impl->setUnrestrictedDoubleAttribute(cppValue);
 }
 
-void unrestrictedDoubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unrestrictedDoubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::unrestrictedDoubleAttributeAttributeSetter(v8Value, info);
@@ -649,7 +649,7 @@
   v8SetReturnValue(info, impl->unrestrictedFloatAttribute());
 }
 
-void unrestrictedFloatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unrestrictedFloatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unrestrictedFloatAttributeAttributeGetter(info);
 }
 
@@ -667,7 +667,7 @@
   impl->setUnrestrictedFloatAttribute(cppValue);
 }
 
-void unrestrictedFloatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unrestrictedFloatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::unrestrictedFloatAttributeAttributeSetter(v8Value, info);
@@ -681,7 +681,7 @@
   v8SetReturnValueUnsigned(info, impl->unsignedLongAttribute());
 }
 
-void unsignedLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unsignedLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unsignedLongAttributeAttributeGetter(info);
 }
 
@@ -699,7 +699,7 @@
   impl->setUnsignedLongAttribute(cppValue);
 }
 
-void unsignedLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unsignedLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::unsignedLongAttributeAttributeSetter(v8Value, info);
@@ -713,7 +713,7 @@
   v8SetReturnValue(info, static_cast<double>(impl->unsignedLongLongAttribute()));
 }
 
-void unsignedLongLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unsignedLongLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unsignedLongLongAttributeAttributeGetter(info);
 }
 
@@ -731,7 +731,7 @@
   impl->setUnsignedLongLongAttribute(cppValue);
 }
 
-void unsignedLongLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unsignedLongLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::unsignedLongLongAttributeAttributeSetter(v8Value, info);
@@ -745,7 +745,7 @@
   v8SetReturnValueUnsigned(info, impl->unsignedShortAttribute());
 }
 
-void unsignedShortAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unsignedShortAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unsignedShortAttributeAttributeGetter(info);
 }
 
@@ -763,7 +763,7 @@
   impl->setUnsignedShortAttribute(cppValue);
 }
 
-void unsignedShortAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unsignedShortAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::unsignedShortAttributeAttributeSetter(v8Value, info);
@@ -777,7 +777,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->testInterfaceEmptyAttribute()), impl);
 }
 
-void testInterfaceEmptyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceEmptyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testInterfaceEmptyAttributeAttributeGetter(info);
 }
 
@@ -799,7 +799,7 @@
   impl->setTestInterfaceEmptyAttribute(cppValue);
 }
 
-void testInterfaceEmptyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceEmptyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::testInterfaceEmptyAttributeAttributeSetter(v8Value, info);
@@ -813,7 +813,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->testObjectAttribute()), impl);
 }
 
-void testObjectAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testObjectAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testObjectAttributeAttributeGetter(info);
 }
 
@@ -835,7 +835,7 @@
   impl->setTestObjectAttribute(cppValue);
 }
 
-void testObjectAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testObjectAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::testObjectAttributeAttributeSetter(v8Value, info);
@@ -849,7 +849,7 @@
   v8SetReturnValueInt(info, impl->cssAttribute());
 }
 
-void cssAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void cssAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::cssAttributeAttributeGetter(info);
 }
 
@@ -867,7 +867,7 @@
   impl->setCSSAttribute(cppValue);
 }
 
-void cssAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void cssAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::cssAttributeAttributeSetter(v8Value, info);
@@ -881,7 +881,7 @@
   v8SetReturnValueInt(info, impl->imeAttribute());
 }
 
-void imeAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void imeAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::imeAttributeAttributeGetter(info);
 }
 
@@ -899,7 +899,7 @@
   impl->setIMEAttribute(cppValue);
 }
 
-void imeAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void imeAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::imeAttributeAttributeSetter(v8Value, info);
@@ -913,7 +913,7 @@
   v8SetReturnValueInt(info, impl->svgAttribute());
 }
 
-void svgAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void svgAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::svgAttributeAttributeGetter(info);
 }
 
@@ -931,7 +931,7 @@
   impl->setSVGAttribute(cppValue);
 }
 
-void svgAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void svgAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::svgAttributeAttributeSetter(v8Value, info);
@@ -945,7 +945,7 @@
   v8SetReturnValueInt(info, impl->xmlAttribute());
 }
 
-void xmlAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void xmlAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::xmlAttributeAttributeGetter(info);
 }
 
@@ -963,7 +963,7 @@
   impl->setXMLAttribute(cppValue);
 }
 
-void xmlAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void xmlAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::xmlAttributeAttributeSetter(v8Value, info);
@@ -977,7 +977,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->nodeFilterAttribute()), impl);
 }
 
-void nodeFilterAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void nodeFilterAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::nodeFilterAttributeAttributeGetter(info);
 }
 
@@ -991,7 +991,7 @@
   impl->setNodeFilterAttribute(cppValue);
 }
 
-void nodeFilterAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void nodeFilterAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::nodeFilterAttributeAttributeSetter(v8Value, info);
@@ -1005,7 +1005,7 @@
   v8SetReturnValue(info, v8Deserialize(info.GetIsolate(), WTF::getPtr(impl->serializedScriptValueAttribute())));
 }
 
-void serializedScriptValueAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void serializedScriptValueAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::serializedScriptValueAttributeAttributeGetter(info);
 }
 
@@ -1023,7 +1023,7 @@
   impl->setSerializedScriptValueAttribute(cppValue);
 }
 
-void serializedScriptValueAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void serializedScriptValueAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::serializedScriptValueAttributeAttributeSetter(v8Value, info);
@@ -1037,7 +1037,7 @@
   v8SetReturnValue(info, impl->anyAttribute().v8Value());
 }
 
-void anyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void anyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::anyAttributeAttributeGetter(info);
 }
 
@@ -1051,7 +1051,7 @@
   impl->setAnyAttribute(cppValue);
 }
 
-void anyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void anyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::anyAttributeAttributeSetter(v8Value, info);
@@ -1065,7 +1065,7 @@
   v8SetReturnValue(info, impl->promiseAttribute().v8Value());
 }
 
-void promiseAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void promiseAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::promiseAttributeAttributeGetter(info);
 }
 
@@ -1079,7 +1079,7 @@
   impl->setPromiseAttribute(cppValue);
 }
 
-void promiseAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void promiseAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::promiseAttributeAttributeSetter(v8Value, info);
@@ -1093,7 +1093,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->windowAttribute()), impl);
 }
 
-void windowAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void windowAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::windowAttributeAttributeGetter(info);
 }
 
@@ -1115,7 +1115,7 @@
   impl->setWindowAttribute(cppValue);
 }
 
-void windowAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void windowAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::windowAttributeAttributeSetter(v8Value, info);
@@ -1129,7 +1129,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->documentAttribute()), impl);
 }
 
-void documentAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void documentAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::documentAttributeAttributeGetter(info);
 }
 
@@ -1151,7 +1151,7 @@
   impl->setDocumentAttribute(cppValue);
 }
 
-void documentAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void documentAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::documentAttributeAttributeSetter(v8Value, info);
@@ -1165,7 +1165,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->documentFragmentAttribute()), impl);
 }
 
-void documentFragmentAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void documentFragmentAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::documentFragmentAttributeAttributeGetter(info);
 }
 
@@ -1187,7 +1187,7 @@
   impl->setDocumentFragmentAttribute(cppValue);
 }
 
-void documentFragmentAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void documentFragmentAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::documentFragmentAttributeAttributeSetter(v8Value, info);
@@ -1201,7 +1201,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->documentTypeAttribute()), impl);
 }
 
-void documentTypeAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void documentTypeAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::documentTypeAttributeAttributeGetter(info);
 }
 
@@ -1223,7 +1223,7 @@
   impl->setDocumentTypeAttribute(cppValue);
 }
 
-void documentTypeAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void documentTypeAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::documentTypeAttributeAttributeSetter(v8Value, info);
@@ -1237,7 +1237,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->elementAttribute()), impl);
 }
 
-void elementAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void elementAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::elementAttributeAttributeGetter(info);
 }
 
@@ -1259,7 +1259,7 @@
   impl->setElementAttribute(cppValue);
 }
 
-void elementAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void elementAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::elementAttributeAttributeSetter(v8Value, info);
@@ -1273,7 +1273,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->nodeAttribute()), impl);
 }
 
-void nodeAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void nodeAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::nodeAttributeAttributeGetter(info);
 }
 
@@ -1295,7 +1295,7 @@
   impl->setNodeAttribute(cppValue);
 }
 
-void nodeAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void nodeAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::nodeAttributeAttributeSetter(v8Value, info);
@@ -1309,7 +1309,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->shadowRootAttribute()), impl);
 }
 
-void shadowRootAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void shadowRootAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::shadowRootAttributeAttributeGetter(info);
 }
 
@@ -1331,7 +1331,7 @@
   impl->setShadowRootAttribute(cppValue);
 }
 
-void shadowRootAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void shadowRootAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::shadowRootAttributeAttributeSetter(v8Value, info);
@@ -1345,7 +1345,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->arrayBufferAttribute()), impl);
 }
 
-void arrayBufferAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void arrayBufferAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::arrayBufferAttributeAttributeGetter(info);
 }
 
@@ -1367,7 +1367,7 @@
   impl->setArrayBufferAttribute(cppValue);
 }
 
-void arrayBufferAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void arrayBufferAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::arrayBufferAttributeAttributeSetter(v8Value, info);
@@ -1381,7 +1381,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->float32ArrayAttribute()), impl);
 }
 
-void float32ArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void float32ArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::float32ArrayAttributeAttributeGetter(info);
 }
 
@@ -1403,7 +1403,7 @@
   impl->setFloat32ArrayAttribute(cppValue);
 }
 
-void float32ArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void float32ArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::float32ArrayAttributeAttributeSetter(v8Value, info);
@@ -1417,7 +1417,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->uint8ArrayAttribute()), impl);
 }
 
-void uint8ArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void uint8ArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::uint8ArrayAttributeAttributeGetter(info);
 }
 
@@ -1439,7 +1439,7 @@
   impl->setUint8ArrayAttribute(cppValue);
 }
 
-void uint8ArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void uint8ArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::uint8ArrayAttributeAttributeSetter(v8Value, info);
@@ -1453,7 +1453,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->self()), impl);
 }
 
-void selfAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void selfAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::selfAttributeGetter(info);
 }
 
@@ -1465,7 +1465,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->readonlyEventTargetAttribute()), impl);
 }
 
-void readonlyEventTargetAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void readonlyEventTargetAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::readonlyEventTargetAttributeAttributeGetter(info);
 }
 
@@ -1477,7 +1477,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->readonlyEventTargetOrNullAttribute()), impl);
 }
 
-void readonlyEventTargetOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void readonlyEventTargetOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::readonlyEventTargetOrNullAttributeAttributeGetter(info);
 }
 
@@ -1489,7 +1489,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->readonlyWindowAttribute()), impl);
 }
 
-void readonlyWindowAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void readonlyWindowAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::readonlyWindowAttributeAttributeGetter(info);
 }
 
@@ -1501,7 +1501,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->htmlCollectionAttribute()), impl);
 }
 
-void htmlCollectionAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void htmlCollectionAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::htmlCollectionAttributeAttributeGetter(info);
 }
 
@@ -1513,7 +1513,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->htmlElementAttribute()), impl);
 }
 
-void htmlElementAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void htmlElementAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::htmlElementAttributeAttributeGetter(info);
 }
 
@@ -1525,7 +1525,7 @@
   v8SetReturnValue(info, ToV8(impl->stringArrayAttribute(), info.Holder(), info.GetIsolate()));
 }
 
-void stringArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::stringArrayAttributeAttributeGetter(info);
 }
 
@@ -1543,7 +1543,7 @@
   impl->setStringArrayAttribute(cppValue);
 }
 
-void stringArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::stringArrayAttributeAttributeSetter(v8Value, info);
@@ -1557,7 +1557,7 @@
   v8SetReturnValue(info, ToV8(impl->testInterfaceEmptyArrayAttribute(), info.Holder(), info.GetIsolate()));
 }
 
-void testInterfaceEmptyArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceEmptyArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testInterfaceEmptyArrayAttributeAttributeGetter(info);
 }
 
@@ -1575,7 +1575,7 @@
   impl->setTestInterfaceEmptyArrayAttribute(cppValue);
 }
 
-void testInterfaceEmptyArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceEmptyArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::testInterfaceEmptyArrayAttributeAttributeSetter(v8Value, info);
@@ -1589,7 +1589,7 @@
   v8SetReturnValue(info, ToV8(impl->floatArrayAttribute(), info.Holder(), info.GetIsolate()));
 }
 
-void floatArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void floatArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::floatArrayAttributeAttributeGetter(info);
 }
 
@@ -1607,7 +1607,7 @@
   impl->setFloatArrayAttribute(cppValue);
 }
 
-void floatArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void floatArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::floatArrayAttributeAttributeSetter(v8Value, info);
@@ -1621,7 +1621,7 @@
   v8SetReturnValue(info, freezeV8Object(ToV8(impl->stringFrozenArrayAttribute(), info.Holder(), info.GetIsolate()), info.GetIsolate()));
 }
 
-void stringFrozenArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringFrozenArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::stringFrozenArrayAttributeAttributeGetter(info);
 }
 
@@ -1639,7 +1639,7 @@
   impl->setStringFrozenArrayAttribute(cppValue);
 }
 
-void stringFrozenArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringFrozenArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::stringFrozenArrayAttributeAttributeSetter(v8Value, info);
@@ -1653,7 +1653,7 @@
   v8SetReturnValue(info, freezeV8Object(ToV8(impl->testInterfaceEmptyFrozenArrayAttribute(), info.Holder(), info.GetIsolate()), info.GetIsolate()));
 }
 
-void testInterfaceEmptyFrozenArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceEmptyFrozenArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testInterfaceEmptyFrozenArrayAttributeAttributeGetter(info);
 }
 
@@ -1671,7 +1671,7 @@
   impl->setTestInterfaceEmptyFrozenArrayAttribute(cppValue);
 }
 
-void testInterfaceEmptyFrozenArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceEmptyFrozenArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::testInterfaceEmptyFrozenArrayAttributeAttributeSetter(v8Value, info);
@@ -1685,7 +1685,7 @@
   v8SetReturnValueStringOrNull(info, impl->stringOrNullAttribute(), info.GetIsolate());
 }
 
-void stringOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::stringOrNullAttributeAttributeGetter(info);
 }
 
@@ -1701,7 +1701,7 @@
   impl->setStringOrNullAttribute(cppValue);
 }
 
-void stringOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::stringOrNullAttributeAttributeSetter(v8Value, info);
@@ -1724,7 +1724,7 @@
   v8SetReturnValueInt(info, cppValue);
 }
 
-void longOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void longOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::longOrNullAttributeAttributeGetter(info);
 }
 
@@ -1742,7 +1742,7 @@
   impl->setLongOrNullAttribute(cppValue);
 }
 
-void longOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void longOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::longOrNullAttributeAttributeSetter(v8Value, info);
@@ -1756,7 +1756,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->testInterfaceOrNullAttribute()), impl);
 }
 
-void testInterfaceOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testInterfaceOrNullAttributeAttributeGetter(info);
 }
 
@@ -1778,7 +1778,7 @@
   impl->setTestInterfaceOrNullAttribute(cppValue);
 }
 
-void testInterfaceOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::testInterfaceOrNullAttributeAttributeSetter(v8Value, info);
@@ -1792,7 +1792,7 @@
   v8SetReturnValueString(info, impl->testEnumAttribute(), info.GetIsolate());
 }
 
-void testEnumAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testEnumAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testEnumAttributeAttributeGetter(info);
 }
 
@@ -1824,7 +1824,7 @@
   impl->setTestEnumAttribute(cppValue);
 }
 
-void testEnumAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testEnumAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::testEnumAttributeAttributeSetter(v8Value, info);
@@ -1838,7 +1838,7 @@
   v8SetReturnValueStringOrNull(info, impl->testEnumOrNullAttribute(), info.GetIsolate());
 }
 
-void testEnumOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testEnumOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testEnumOrNullAttributeAttributeGetter(info);
 }
 
@@ -1870,7 +1870,7 @@
   impl->setTestEnumOrNullAttribute(cppValue);
 }
 
-void testEnumOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testEnumOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::testEnumOrNullAttributeAttributeSetter(v8Value, info);
@@ -1880,7 +1880,7 @@
   v8SetReturnValueString(info, TestObject::staticStringAttribute(), info.GetIsolate());
 }
 
-void staticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::staticStringAttributeAttributeGetter(info);
 }
 
@@ -1893,7 +1893,7 @@
   TestObject::setStaticStringAttribute(cppValue);
 }
 
-void staticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::staticStringAttributeAttributeSetter(v8Value, info);
@@ -1903,7 +1903,7 @@
   v8SetReturnValueInt(info, TestObject::staticLongAttribute());
 }
 
-void staticLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::staticLongAttributeAttributeGetter(info);
 }
 
@@ -1918,7 +1918,7 @@
   TestObject::setStaticLongAttribute(cppValue);
 }
 
-void staticLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void staticLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::staticLongAttributeAttributeSetter(v8Value, info);
@@ -1934,7 +1934,7 @@
   v8SetReturnValue(info, cppValue ? V8AbstractEventListener::cast(cppValue)->getListenerOrNull(info.GetIsolate(), impl->getExecutionContext()) : v8::Null(info.GetIsolate()).As<v8::Value>());
 }
 
-void eventHandlerAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void eventHandlerAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::eventHandlerAttributeAttributeGetter(info);
 }
 
@@ -1948,7 +1948,7 @@
   impl->setEventHandlerAttribute(V8EventListenerHelper::getEventListener(ScriptState::forReceiverObject(info), v8Value, true, ListenerFindOrCreate));
 }
 
-void eventHandlerAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void eventHandlerAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::eventHandlerAttributeAttributeSetter(v8Value, info);
@@ -1965,7 +1965,7 @@
   v8SetReturnValue(info, result);
 }
 
-void doubleOrStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doubleOrStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::doubleOrStringAttributeAttributeGetter(info);
 }
 
@@ -1984,7 +1984,7 @@
   impl->setDoubleOrStringAttribute(cppValue);
 }
 
-void doubleOrStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doubleOrStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::doubleOrStringAttributeAttributeSetter(v8Value, info);
@@ -2001,7 +2001,7 @@
   v8SetReturnValue(info, result);
 }
 
-void doubleOrStringOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doubleOrStringOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::doubleOrStringOrNullAttributeAttributeGetter(info);
 }
 
@@ -2020,7 +2020,7 @@
   impl->setDoubleOrStringOrNullAttribute(cppValue);
 }
 
-void doubleOrStringOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doubleOrStringOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::doubleOrStringOrNullAttributeAttributeSetter(v8Value, info);
@@ -2037,7 +2037,7 @@
   v8SetReturnValue(info, result);
 }
 
-void doubleOrNullStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doubleOrNullStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::doubleOrNullStringAttributeAttributeGetter(info);
 }
 
@@ -2056,7 +2056,7 @@
   impl->setDoubleOrNullStringAttribute(cppValue);
 }
 
-void doubleOrNullStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void doubleOrNullStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::doubleOrNullStringAttributeAttributeSetter(v8Value, info);
@@ -2073,7 +2073,7 @@
   v8SetReturnValue(info, result);
 }
 
-void stringOrStringSequenceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringOrStringSequenceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::stringOrStringSequenceAttributeAttributeGetter(info);
 }
 
@@ -2092,7 +2092,7 @@
   impl->setStringOrStringSequenceAttribute(cppValue);
 }
 
-void stringOrStringSequenceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void stringOrStringSequenceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::stringOrStringSequenceAttributeAttributeSetter(v8Value, info);
@@ -2109,7 +2109,7 @@
   v8SetReturnValue(info, result);
 }
 
-void testEnumOrDoubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testEnumOrDoubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testEnumOrDoubleAttributeAttributeGetter(info);
 }
 
@@ -2128,7 +2128,7 @@
   impl->setTestEnumOrDoubleAttribute(cppValue);
 }
 
-void testEnumOrDoubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testEnumOrDoubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::testEnumOrDoubleAttributeAttributeSetter(v8Value, info);
@@ -2145,7 +2145,7 @@
   v8SetReturnValue(info, result);
 }
 
-void unrestrictedDoubleOrStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unrestrictedDoubleOrStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unrestrictedDoubleOrStringAttributeAttributeGetter(info);
 }
 
@@ -2164,7 +2164,7 @@
   impl->setUnrestrictedDoubleOrStringAttribute(cppValue);
 }
 
-void unrestrictedDoubleOrStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unrestrictedDoubleOrStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::unrestrictedDoubleOrStringAttributeAttributeSetter(v8Value, info);
@@ -2178,7 +2178,7 @@
   v8SetReturnValueInt(info, impl->activityLoggingAccessForAllWorldsLongAttribute());
 }
 
-void activityLoggingAccessForAllWorldsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingAccessForAllWorldsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
   V8PerContextData* contextData = scriptState->perContextData();
   if (contextData && contextData->activityLogger()) {
@@ -2202,7 +2202,7 @@
   impl->setActivityLoggingAccessForAllWorldsLongAttribute(cppValue);
 }
 
-void activityLoggingAccessForAllWorldsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingAccessForAllWorldsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
@@ -2222,7 +2222,7 @@
   v8SetReturnValueInt(info, impl->activityLoggingGetterForAllWorldsLongAttribute());
 }
 
-void activityLoggingGetterForAllWorldsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingGetterForAllWorldsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
   V8PerContextData* contextData = scriptState->perContextData();
   if (contextData && contextData->activityLogger()) {
@@ -2246,7 +2246,7 @@
   impl->setActivityLoggingGetterForAllWorldsLongAttribute(cppValue);
 }
 
-void activityLoggingGetterForAllWorldsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingGetterForAllWorldsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::activityLoggingGetterForAllWorldsLongAttributeAttributeSetter(v8Value, info);
@@ -2260,7 +2260,7 @@
   v8SetReturnValueInt(info, impl->activityLoggingSetterForAllWorldsLongAttribute());
 }
 
-void activityLoggingSetterForAllWorldsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingSetterForAllWorldsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::activityLoggingSetterForAllWorldsLongAttributeAttributeGetter(info);
 }
 
@@ -2278,7 +2278,7 @@
   impl->setActivityLoggingSetterForAllWorldsLongAttribute(cppValue);
 }
 
-void activityLoggingSetterForAllWorldsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingSetterForAllWorldsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
@@ -2314,7 +2314,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void cachedAttributeAnyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void cachedAttributeAnyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::cachedAttributeAnyAttributeAttributeGetter(info);
 }
 
@@ -2332,7 +2332,7 @@
   V8HiddenValue::deleteHiddenValue(ScriptState::forFunctionObject(info), holder, v8AtomicString(info.GetIsolate(), "cachedAttributeAnyAttribute"));
 }
 
-void cachedAttributeAnyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void cachedAttributeAnyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::cachedAttributeAnyAttributeAttributeSetter(v8Value, info);
@@ -2362,7 +2362,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void cachedArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void cachedArrayAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::cachedArrayAttributeAttributeGetter(info);
 }
 
@@ -2384,7 +2384,7 @@
   V8HiddenValue::deleteHiddenValue(ScriptState::forFunctionObject(info), holder, v8AtomicString(info.GetIsolate(), "cachedArrayAttribute"));
 }
 
-void cachedArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void cachedArrayAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::cachedArrayAttributeAttributeSetter(v8Value, info);
@@ -2414,7 +2414,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void cachedStringOrNoneAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void cachedStringOrNoneAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::cachedStringOrNoneAttributeAttributeGetter(info);
 }
 
@@ -2434,7 +2434,7 @@
   V8HiddenValue::deleteHiddenValue(ScriptState::forFunctionObject(info), holder, v8AtomicString(info.GetIsolate(), "cachedStringOrNoneAttribute"));
 }
 
-void cachedStringOrNoneAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void cachedStringOrNoneAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::cachedStringOrNoneAttributeAttributeSetter(v8Value, info);
@@ -2450,7 +2450,7 @@
   v8SetReturnValue(info, impl->callWithExecutionContextAnyAttribute(executionContext).v8Value());
 }
 
-void callWithExecutionContextAnyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void callWithExecutionContextAnyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::callWithExecutionContextAnyAttributeAttributeGetter(info);
 }
 
@@ -2466,7 +2466,7 @@
   impl->setCallWithExecutionContextAnyAttribute(executionContext, cppValue);
 }
 
-void callWithExecutionContextAnyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void callWithExecutionContextAnyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::callWithExecutionContextAnyAttributeAttributeSetter(v8Value, info);
@@ -2482,7 +2482,7 @@
   v8SetReturnValue(info, impl->callWithScriptStateAnyAttribute(scriptState).v8Value());
 }
 
-void callWithScriptStateAnyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void callWithScriptStateAnyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::callWithScriptStateAnyAttributeAttributeGetter(info);
 }
 
@@ -2498,7 +2498,7 @@
   impl->setCallWithScriptStateAnyAttribute(scriptState, cppValue);
 }
 
-void callWithScriptStateAnyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void callWithScriptStateAnyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::callWithScriptStateAnyAttributeAttributeSetter(v8Value, info);
@@ -2515,7 +2515,7 @@
   v8SetReturnValue(info, impl->callWithExecutionContextAndScriptStateAnyAttribute(scriptState, executionContext).v8Value());
 }
 
-void callWithExecutionContextAndScriptStateAnyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void callWithExecutionContextAndScriptStateAnyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::callWithExecutionContextAndScriptStateAnyAttributeAttributeGetter(info);
 }
 
@@ -2533,7 +2533,7 @@
   impl->setCallWithExecutionContextAndScriptStateAnyAttribute(scriptState, executionContext, cppValue);
 }
 
-void callWithExecutionContextAndScriptStateAnyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void callWithExecutionContextAndScriptStateAnyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::callWithExecutionContextAndScriptStateAnyAttributeAttributeSetter(v8Value, info);
@@ -2554,33 +2554,33 @@
   v8SetReturnValue(info, ToV8(WTF::getPtr(impl->checkSecurityForNodeReadonlyDocumentAttribute()), ToV8(impl->contentWindow(), v8::Local<v8::Object>(), info.GetIsolate()).As<v8::Object>(), info.GetIsolate()));
 }
 
-void checkSecurityForNodeReadonlyDocumentAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void checkSecurityForNodeReadonlyDocumentAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::checkSecurityForNodeReadonlyDocumentAttributeAttributeGetter(info);
 }
 
-void testInterfaceEmptyConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceEmptyConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
   Deprecation::countDeprecation(currentExecutionContext(info.GetIsolate()), UseCounter::deprecatedTestInterfaceEmptyConstructorAttribute);
 
   v8ConstructorAttributeGetter(property, info);
 }
 
-void measureAsFeatureNameTestInterfaceEmptyConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void measureAsFeatureNameTestInterfaceEmptyConstructorAttributeConstructorGetterCallback(v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
   UseCounter::count(currentExecutionContext(info.GetIsolate()), UseCounter::FeatureName);
 
   v8ConstructorAttributeGetter(property, info);
 }
 
-void customObjectAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customObjectAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   V8TestObject::customObjectAttributeAttributeGetterCustom(info);
 }
 
-void customObjectAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customObjectAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V8TestObject::customObjectAttributeAttributeSetterCustom(v8Value, info);
 }
 
-void customGetterLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customGetterLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   V8TestObject::customGetterLongAttributeAttributeGetterCustom(info);
 }
 
@@ -2598,13 +2598,13 @@
   impl->setCustomGetterLongAttribute(cppValue);
 }
 
-void customGetterLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customGetterLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::customGetterLongAttributeAttributeSetter(v8Value, info);
 }
 
-void customGetterReadonlyObjectAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customGetterReadonlyObjectAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   V8TestObject::customGetterReadonlyObjectAttributeAttributeGetterCustom(info);
 }
 
@@ -2616,11 +2616,11 @@
   v8SetReturnValueInt(info, impl->customSetterLongAttribute());
 }
 
-void customSetterLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customSetterLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::customSetterLongAttributeAttributeGetter(info);
 }
 
-void customSetterLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customSetterLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V8TestObject::customSetterLongAttributeAttributeSetterCustom(v8Value, info);
@@ -2634,7 +2634,7 @@
   v8SetReturnValueInt(info, impl->deprecatedLongAttribute());
 }
 
-void deprecatedLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void deprecatedLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   Deprecation::countDeprecation(currentExecutionContext(info.GetIsolate()), UseCounter::LongAttribute);
 
   TestObjectV8Internal::deprecatedLongAttributeAttributeGetter(info);
@@ -2654,7 +2654,7 @@
   impl->setDeprecatedLongAttribute(cppValue);
 }
 
-void deprecatedLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void deprecatedLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   Deprecation::countDeprecation(currentExecutionContext(info.GetIsolate()), UseCounter::LongAttribute);
@@ -2670,7 +2670,7 @@
   v8SetReturnValueInt(info, impl->enforceRangeLongAttribute());
 }
 
-void enforceRangeLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void enforceRangeLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::enforceRangeLongAttributeAttributeGetter(info);
 }
 
@@ -2688,7 +2688,7 @@
   impl->setEnforceRangeLongAttribute(cppValue);
 }
 
-void enforceRangeLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void enforceRangeLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::enforceRangeLongAttributeAttributeSetter(v8Value, info);
@@ -2702,7 +2702,7 @@
   v8SetReturnValueInt(info, impl->implementedAsName());
 }
 
-void implementedAsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementedAsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::implementedAsLongAttributeAttributeGetter(info);
 }
 
@@ -2720,23 +2720,23 @@
   impl->setImplementedAsName(cppValue);
 }
 
-void implementedAsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void implementedAsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::implementedAsLongAttributeAttributeSetter(v8Value, info);
 }
 
-void customImplementedAsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customImplementedAsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   V8TestObject::customImplementedAsLongAttributeAttributeGetterCustom(info);
 }
 
-void customImplementedAsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customImplementedAsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V8TestObject::customImplementedAsLongAttributeAttributeSetterCustom(v8Value, info);
 }
 
-void customGetterImplementedAsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customGetterImplementedAsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   V8TestObject::customGetterImplementedAsLongAttributeAttributeGetterCustom(info);
 }
 
@@ -2754,7 +2754,7 @@
   impl->setImplementedAsNameWithCustomGetter(cppValue);
 }
 
-void customGetterImplementedAsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customGetterImplementedAsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::customGetterImplementedAsLongAttributeAttributeSetter(v8Value, info);
@@ -2768,11 +2768,11 @@
   v8SetReturnValueInt(info, impl->implementedAsNameWithCustomGetter());
 }
 
-void customSetterImplementedAsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customSetterImplementedAsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::customSetterImplementedAsLongAttributeAttributeGetter(info);
 }
 
-void customSetterImplementedAsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void customSetterImplementedAsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V8TestObject::customSetterImplementedAsLongAttributeAttributeSetterCustom(v8Value, info);
@@ -2786,7 +2786,7 @@
   v8SetReturnValueInt(info, impl->measureAsLongAttribute());
 }
 
-void measureAsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void measureAsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   UseCounter::count(currentExecutionContext(info.GetIsolate()), UseCounter::TestFeature);
 
   TestObjectV8Internal::measureAsLongAttributeAttributeGetter(info);
@@ -2806,7 +2806,7 @@
   impl->setMeasureAsLongAttribute(cppValue);
 }
 
-void measureAsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void measureAsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   UseCounter::count(currentExecutionContext(info.GetIsolate()), UseCounter::TestFeature);
@@ -2822,7 +2822,7 @@
   v8SetReturnValueInt(info, impl->notEnumerableLongAttribute());
 }
 
-void notEnumerableLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void notEnumerableLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::notEnumerableLongAttributeAttributeGetter(info);
 }
 
@@ -2840,7 +2840,7 @@
   impl->setNotEnumerableLongAttribute(cppValue);
 }
 
-void notEnumerableLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void notEnumerableLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::notEnumerableLongAttributeAttributeSetter(v8Value, info);
@@ -2854,7 +2854,7 @@
   v8SetReturnValueInt(info, impl->originTrialEnabledLongAttribute());
 }
 
-void originTrialEnabledLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void originTrialEnabledLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::originTrialEnabledLongAttributeAttributeGetter(info);
 }
 
@@ -2872,7 +2872,7 @@
   impl->setOriginTrialEnabledLongAttribute(cppValue);
 }
 
-void originTrialEnabledLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void originTrialEnabledLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::originTrialEnabledLongAttributeAttributeSetter(v8Value, info);
@@ -2896,7 +2896,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetter(info);
 }
 
@@ -2918,7 +2918,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::perWorldBindingsReadonlyTestInterfaceEmptyAttributeAttributeGetterForMainWorld(info);
 }
 
@@ -2930,7 +2930,7 @@
   v8SetReturnValueInt(info, impl->activityLoggingAccessPerWorldBindingsLongAttribute());
 }
 
-void activityLoggingAccessPerWorldBindingsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingAccessPerWorldBindingsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
   V8PerContextData* contextData = scriptState->perContextData();
   if (contextData && contextData->activityLogger()) {
@@ -2954,7 +2954,7 @@
   impl->setActivityLoggingAccessPerWorldBindingsLongAttribute(cppValue);
 }
 
-void activityLoggingAccessPerWorldBindingsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingAccessPerWorldBindingsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
@@ -2974,7 +2974,7 @@
   v8SetReturnValueInt(info, impl->activityLoggingAccessPerWorldBindingsLongAttribute());
 }
 
-void activityLoggingAccessPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingAccessPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
   V8PerContextData* contextData = scriptState->perContextData();
   if (contextData && contextData->activityLogger()) {
@@ -2998,7 +2998,7 @@
   impl->setActivityLoggingAccessPerWorldBindingsLongAttribute(cppValue);
 }
 
-void activityLoggingAccessPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingAccessPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
@@ -3018,7 +3018,7 @@
   v8SetReturnValueInt(info, impl->activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttribute());
 }
 
-void activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
   V8PerContextData* contextData = scriptState->perContextData();
   if (contextData && contextData->activityLogger()) {
@@ -3042,7 +3042,7 @@
   impl->setActivityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttribute(cppValue);
 }
 
-void activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
@@ -3062,7 +3062,7 @@
   v8SetReturnValueInt(info, impl->activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttribute());
 }
 
-void activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterForMainWorld(info);
 }
 
@@ -3080,7 +3080,7 @@
   impl->setActivityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttribute(cppValue);
 }
 
-void activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::activityLoggingAccessForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterForMainWorld(v8Value, info);
@@ -3094,7 +3094,7 @@
   v8SetReturnValueInt(info, impl->activityLoggingGetterPerWorldBindingsLongAttribute());
 }
 
-void activityLoggingGetterPerWorldBindingsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingGetterPerWorldBindingsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
   V8PerContextData* contextData = scriptState->perContextData();
   if (contextData && contextData->activityLogger()) {
@@ -3118,7 +3118,7 @@
   impl->setActivityLoggingGetterPerWorldBindingsLongAttribute(cppValue);
 }
 
-void activityLoggingGetterPerWorldBindingsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingGetterPerWorldBindingsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::activityLoggingGetterPerWorldBindingsLongAttributeAttributeSetter(v8Value, info);
@@ -3132,7 +3132,7 @@
   v8SetReturnValueInt(info, impl->activityLoggingGetterPerWorldBindingsLongAttribute());
 }
 
-void activityLoggingGetterPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingGetterPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
   V8PerContextData* contextData = scriptState->perContextData();
   if (contextData && contextData->activityLogger()) {
@@ -3156,7 +3156,7 @@
   impl->setActivityLoggingGetterPerWorldBindingsLongAttribute(cppValue);
 }
 
-void activityLoggingGetterPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingGetterPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::activityLoggingGetterPerWorldBindingsLongAttributeAttributeSetterForMainWorld(v8Value, info);
@@ -3170,7 +3170,7 @@
   v8SetReturnValueInt(info, impl->activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttribute());
 }
 
-void activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
   V8PerContextData* contextData = scriptState->perContextData();
   if (contextData && contextData->activityLogger()) {
@@ -3194,7 +3194,7 @@
   impl->setActivityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttribute(cppValue);
 }
 
-void activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetter(v8Value, info);
@@ -3208,7 +3208,7 @@
   v8SetReturnValueInt(info, impl->activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttribute());
 }
 
-void activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeGetterForMainWorld(info);
 }
 
@@ -3226,7 +3226,7 @@
   impl->setActivityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttribute(cppValue);
 }
 
-void activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::activityLoggingGetterForIsolatedWorldsPerWorldBindingsLongAttributeAttributeSetterForMainWorld(v8Value, info);
@@ -3240,7 +3240,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->location()), impl);
 }
 
-void locationAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::locationAttributeGetter(info);
 }
 
@@ -3259,7 +3259,7 @@
   impl->setHref(cppValue);
 }
 
-void locationAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::locationAttributeSetter(v8Value, info);
@@ -3273,7 +3273,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->locationWithException()), impl);
 }
 
-void locationWithExceptionAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationWithExceptionAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::locationWithExceptionAttributeGetter(info);
 }
 
@@ -3294,7 +3294,7 @@
   impl->setHrefThrows(cppValue, exceptionState);
 }
 
-void locationWithExceptionAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationWithExceptionAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::locationWithExceptionAttributeSetter(v8Value, info);
@@ -3308,7 +3308,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->locationWithCallWith()), impl);
 }
 
-void locationWithCallWithAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationWithCallWithAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::locationWithCallWithAttributeGetter(info);
 }
 
@@ -3329,7 +3329,7 @@
   impl->setHrefCallWith(executionContext, currentDOMWindow(info.GetIsolate()), enteredDOMWindow(info.GetIsolate()), cppValue);
 }
 
-void locationWithCallWithAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationWithCallWithAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::locationWithCallWithAttributeSetter(v8Value, info);
@@ -3343,7 +3343,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->locationByteString()), impl);
 }
 
-void locationByteStringAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationByteStringAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::locationByteStringAttributeGetter(info);
 }
 
@@ -3364,7 +3364,7 @@
   impl->setHrefByteString(cppValue);
 }
 
-void locationByteStringAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationByteStringAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::locationByteStringAttributeSetter(v8Value, info);
@@ -3378,7 +3378,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->locationWithPerWorldBindings()), impl);
 }
 
-void locationWithPerWorldBindingsAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationWithPerWorldBindingsAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::locationWithPerWorldBindingsAttributeGetter(info);
 }
 
@@ -3397,7 +3397,7 @@
   impl->setHref(cppValue);
 }
 
-void locationWithPerWorldBindingsAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationWithPerWorldBindingsAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::locationWithPerWorldBindingsAttributeSetter(v8Value, info);
@@ -3411,7 +3411,7 @@
   v8SetReturnValueForMainWorld(info, WTF::getPtr(impl->locationWithPerWorldBindings()));
 }
 
-void locationWithPerWorldBindingsAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationWithPerWorldBindingsAttributeGetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::locationWithPerWorldBindingsAttributeGetterForMainWorld(info);
 }
 
@@ -3430,7 +3430,7 @@
   impl->setHref(cppValue);
 }
 
-void locationWithPerWorldBindingsAttributeSetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationWithPerWorldBindingsAttributeSetterCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::locationWithPerWorldBindingsAttributeSetterForMainWorld(v8Value, info);
@@ -3444,7 +3444,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->locationLegacyInterfaceTypeChecking()), impl);
 }
 
-void locationLegacyInterfaceTypeCheckingAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationLegacyInterfaceTypeCheckingAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::locationLegacyInterfaceTypeCheckingAttributeGetter(info);
 }
 
@@ -3463,7 +3463,7 @@
   impl->setHref(cppValue);
 }
 
-void locationLegacyInterfaceTypeCheckingAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationLegacyInterfaceTypeCheckingAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::locationLegacyInterfaceTypeCheckingAttributeSetter(v8Value, info);
@@ -3487,7 +3487,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void locationGarbageCollectedAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationGarbageCollectedAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::locationGarbageCollectedAttributeGetter(info);
 }
 
@@ -3512,7 +3512,7 @@
   impl->setAttr1(cppValue);
 }
 
-void locationGarbageCollectedAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationGarbageCollectedAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::locationGarbageCollectedAttributeSetter(v8Value, info);
@@ -3533,7 +3533,7 @@
   v8SetReturnValueInt(info, cppValue);
 }
 
-void raisesExceptionLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void raisesExceptionLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::raisesExceptionLongAttributeAttributeGetter(info);
 }
 
@@ -3551,7 +3551,7 @@
   impl->setRaisesExceptionLongAttribute(cppValue, exceptionState);
 }
 
-void raisesExceptionLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void raisesExceptionLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::raisesExceptionLongAttributeAttributeSetter(v8Value, info);
@@ -3572,7 +3572,7 @@
   v8SetReturnValueInt(info, cppValue);
 }
 
-void raisesExceptionGetterLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void raisesExceptionGetterLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::raisesExceptionGetterLongAttributeAttributeGetter(info);
 }
 
@@ -3590,7 +3590,7 @@
   impl->setRaisesExceptionGetterLongAttribute(cppValue);
 }
 
-void raisesExceptionGetterLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void raisesExceptionGetterLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::raisesExceptionGetterLongAttributeAttributeSetter(v8Value, info);
@@ -3604,7 +3604,7 @@
   v8SetReturnValueInt(info, impl->setterRaisesExceptionLongAttribute());
 }
 
-void setterRaisesExceptionLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void setterRaisesExceptionLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::setterRaisesExceptionLongAttributeAttributeGetter(info);
 }
 
@@ -3622,7 +3622,7 @@
   impl->setSetterRaisesExceptionLongAttribute(cppValue, exceptionState);
 }
 
-void setterRaisesExceptionLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void setterRaisesExceptionLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::setterRaisesExceptionLongAttributeAttributeSetter(v8Value, info);
@@ -3643,7 +3643,7 @@
   v8SetReturnValueFast(info, cppValue, impl);
 }
 
-void raisesExceptionTestInterfaceEmptyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void raisesExceptionTestInterfaceEmptyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::raisesExceptionTestInterfaceEmptyAttributeAttributeGetter(info);
 }
 
@@ -3665,7 +3665,7 @@
   impl->setRaisesExceptionTestInterfaceEmptyAttribute(cppValue, exceptionState);
 }
 
-void raisesExceptionTestInterfaceEmptyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void raisesExceptionTestInterfaceEmptyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::raisesExceptionTestInterfaceEmptyAttributeAttributeSetter(v8Value, info);
@@ -3700,7 +3700,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void cachedAttributeRaisesExceptionGetterAnyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void cachedAttributeRaisesExceptionGetterAnyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::cachedAttributeRaisesExceptionGetterAnyAttributeAttributeGetter(info);
 }
 
@@ -3720,7 +3720,7 @@
   V8HiddenValue::deleteHiddenValue(ScriptState::forFunctionObject(info), holder, v8AtomicString(info.GetIsolate(), "cachedAttributeRaisesExceptionGetterAnyAttribute"));
 }
 
-void cachedAttributeRaisesExceptionGetterAnyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void cachedAttributeRaisesExceptionGetterAnyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::cachedAttributeRaisesExceptionGetterAnyAttributeAttributeSetter(v8Value, info);
@@ -3734,7 +3734,7 @@
   v8SetReturnValueFast(info, impl->fastGetAttribute(HTMLNames::reflecttestinterfaceattributeAttr), impl);
 }
 
-void reflectTestInterfaceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectTestInterfaceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::reflectTestInterfaceAttributeAttributeGetter(info);
 }
 
@@ -3759,7 +3759,7 @@
   impl->setAttribute(HTMLNames::reflecttestinterfaceattributeAttr, cppValue);
 }
 
-void reflectTestInterfaceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectTestInterfaceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -3775,7 +3775,7 @@
   v8SetReturnValueFast(info, impl->fastGetAttribute(HTMLNames::reflectedNameAttributeAttr), impl);
 }
 
-void reflectReflectedNameAttributeTestAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectReflectedNameAttributeTestAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::reflectReflectedNameAttributeTestAttributeAttributeGetter(info);
 }
 
@@ -3800,7 +3800,7 @@
   impl->setAttribute(HTMLNames::reflectedNameAttributeAttr, cppValue);
 }
 
-void reflectReflectedNameAttributeTestAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectReflectedNameAttributeTestAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -3816,7 +3816,7 @@
   v8SetReturnValueBool(info, impl->fastHasAttribute(HTMLNames::reflectbooleanattributeAttr));
 }
 
-void reflectBooleanAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectBooleanAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::reflectBooleanAttributeAttributeGetter(info);
 }
 
@@ -3837,7 +3837,7 @@
   impl->setBooleanAttribute(HTMLNames::reflectbooleanattributeAttr, cppValue);
 }
 
-void reflectBooleanAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectBooleanAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -3853,7 +3853,7 @@
   v8SetReturnValueInt(info, impl->getIntegralAttribute(HTMLNames::reflectlongattributeAttr));
 }
 
-void reflectLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::reflectLongAttributeAttributeGetter(info);
 }
 
@@ -3874,7 +3874,7 @@
   impl->setIntegralAttribute(HTMLNames::reflectlongattributeAttr, cppValue);
 }
 
-void reflectLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -3890,7 +3890,7 @@
   v8SetReturnValueUnsigned(info, std::max(0, static_cast<int>(impl->fastGetAttribute(HTMLNames::reflectunsignedshortattributeAttr))));
 }
 
-void reflectUnsignedShortAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectUnsignedShortAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::reflectUnsignedShortAttributeAttributeGetter(info);
 }
 
@@ -3911,7 +3911,7 @@
   impl->setAttribute(HTMLNames::reflectunsignedshortattributeAttr, cppValue);
 }
 
-void reflectUnsignedShortAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectUnsignedShortAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -3927,7 +3927,7 @@
   v8SetReturnValueUnsigned(info, std::max(0, static_cast<int>(impl->getIntegralAttribute(HTMLNames::reflectunsignedlongattributeAttr))));
 }
 
-void reflectUnsignedLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectUnsignedLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::reflectUnsignedLongAttributeAttributeGetter(info);
 }
 
@@ -3948,7 +3948,7 @@
   impl->setUnsignedIntegralAttribute(HTMLNames::reflectunsignedlongattributeAttr, cppValue);
 }
 
-void reflectUnsignedLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectUnsignedLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -3964,7 +3964,7 @@
   v8SetReturnValueString(info, impl->getIdAttribute(), info.GetIsolate());
 }
 
-void idAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void idAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::idAttributeGetter(info);
 }
 
@@ -3983,7 +3983,7 @@
   impl->setAttribute(HTMLNames::idAttr, cppValue);
 }
 
-void idAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void idAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -3999,7 +3999,7 @@
   v8SetReturnValueString(info, impl->getNameAttribute(), info.GetIsolate());
 }
 
-void nameAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void nameAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::nameAttributeGetter(info);
 }
 
@@ -4018,7 +4018,7 @@
   impl->setAttribute(HTMLNames::nameAttr, cppValue);
 }
 
-void nameAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void nameAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -4034,7 +4034,7 @@
   v8SetReturnValueString(info, impl->getClassAttribute(), info.GetIsolate());
 }
 
-void classAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void classAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::classAttributeGetter(info);
 }
 
@@ -4053,7 +4053,7 @@
   impl->setAttribute(HTMLNames::classAttr, cppValue);
 }
 
-void classAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void classAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -4069,7 +4069,7 @@
   v8SetReturnValueString(info, impl->getIdAttribute(), info.GetIsolate());
 }
 
-void reflectedIdAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectedIdAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::reflectedIdAttributeGetter(info);
 }
 
@@ -4088,7 +4088,7 @@
   impl->setAttribute(HTMLNames::idAttr, cppValue);
 }
 
-void reflectedIdAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectedIdAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -4104,7 +4104,7 @@
   v8SetReturnValueString(info, impl->getNameAttribute(), info.GetIsolate());
 }
 
-void reflectedNameAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectedNameAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::reflectedNameAttributeGetter(info);
 }
 
@@ -4123,7 +4123,7 @@
   impl->setAttribute(HTMLNames::nameAttr, cppValue);
 }
 
-void reflectedNameAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectedNameAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -4139,7 +4139,7 @@
   v8SetReturnValueString(info, impl->getClassAttribute(), info.GetIsolate());
 }
 
-void reflectedClassAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectedClassAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::reflectedClassAttributeGetter(info);
 }
 
@@ -4158,7 +4158,7 @@
   impl->setAttribute(HTMLNames::classAttr, cppValue);
 }
 
-void reflectedClassAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void reflectedClassAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -4184,7 +4184,7 @@
   v8SetReturnValueString(info, cppValue, info.GetIsolate());
 }
 
-void limitedToOnlyOneAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void limitedToOnlyOneAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::limitedToOnlyOneAttributeAttributeGetter(info);
 }
 
@@ -4203,7 +4203,7 @@
   impl->setAttribute(HTMLNames::limitedtoonlyoneattributeAttr, cppValue);
 }
 
-void limitedToOnlyOneAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void limitedToOnlyOneAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -4233,7 +4233,7 @@
   v8SetReturnValueString(info, cppValue, info.GetIsolate());
 }
 
-void limitedToOnlyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void limitedToOnlyAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::limitedToOnlyAttributeAttributeGetter(info);
 }
 
@@ -4252,7 +4252,7 @@
   impl->setAttribute(HTMLNames::limitedtoonlyattributeAttr, cppValue);
 }
 
-void limitedToOnlyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void limitedToOnlyAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -4280,7 +4280,7 @@
   v8SetReturnValueString(info, cppValue, info.GetIsolate());
 }
 
-void limitedToOnlyOtherAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void limitedToOnlyOtherAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::limitedToOnlyOtherAttributeAttributeGetter(info);
 }
 
@@ -4299,7 +4299,7 @@
   impl->setAttribute(HTMLNames::otherAttr, cppValue);
 }
 
-void limitedToOnlyOtherAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void limitedToOnlyOtherAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -4327,7 +4327,7 @@
   v8SetReturnValueString(info, cppValue, info.GetIsolate());
 }
 
-void limitedWithMissingDefaultAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void limitedWithMissingDefaultAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::limitedWithMissingDefaultAttributeAttributeGetter(info);
 }
 
@@ -4346,7 +4346,7 @@
   impl->setAttribute(HTMLNames::limitedwithmissingdefaultattributeAttr, cppValue);
 }
 
-void limitedWithMissingDefaultAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void limitedWithMissingDefaultAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -4376,7 +4376,7 @@
   v8SetReturnValueString(info, cppValue, info.GetIsolate());
 }
 
-void limitedWithInvalidMissingDefaultAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void limitedWithInvalidMissingDefaultAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::limitedWithInvalidMissingDefaultAttributeAttributeGetter(info);
 }
 
@@ -4395,7 +4395,7 @@
   impl->setAttribute(HTMLNames::limitedwithinvalidmissingdefaultattributeAttr, cppValue);
 }
 
-void limitedWithInvalidMissingDefaultAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void limitedWithInvalidMissingDefaultAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -4425,7 +4425,7 @@
   v8SetReturnValueString(info, cppValue, info.GetIsolate());
 }
 
-void corsSettingAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void corsSettingAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::corsSettingAttributeAttributeGetter(info);
 }
 
@@ -4455,7 +4455,7 @@
   v8SetReturnValueString(info, cppValue, info.GetIsolate());
 }
 
-void limitedWithEmptyMissingInvalidAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void limitedWithEmptyMissingInvalidAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::limitedWithEmptyMissingInvalidAttributeAttributeGetter(info);
 }
 
@@ -4467,7 +4467,7 @@
   v8SetReturnValueInt(info, impl->replaceableReadonlyLongAttribute());
 }
 
-void replaceableReadonlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void replaceableReadonlyLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::replaceableReadonlyLongAttributeAttributeGetter(info);
 }
 
@@ -4478,7 +4478,7 @@
   v8CallBoolean(info.Holder()->CreateDataProperty(info.GetIsolate()->GetCurrentContext(), propertyName, v8Value));
 }
 
-void replaceableReadonlyLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void replaceableReadonlyLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::replaceableReadonlyLongAttributeAttributeSetter(v8Value, info);
@@ -4492,7 +4492,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->locationPutForwards()), impl);
 }
 
-void locationPutForwardsAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationPutForwardsAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::locationPutForwardsAttributeGetter(info);
 }
 
@@ -4511,7 +4511,7 @@
   impl->setHref(cppValue);
 }
 
-void locationPutForwardsAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void locationPutForwardsAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::locationPutForwardsAttributeSetter(v8Value, info);
@@ -4525,7 +4525,7 @@
   v8SetReturnValueInt(info, impl->runtimeEnabledLongAttribute());
 }
 
-void runtimeEnabledLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void runtimeEnabledLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::runtimeEnabledLongAttributeAttributeGetter(info);
 }
 
@@ -4543,7 +4543,7 @@
   impl->setRuntimeEnabledLongAttribute(cppValue);
 }
 
-void runtimeEnabledLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void runtimeEnabledLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::runtimeEnabledLongAttributeAttributeSetter(v8Value, info);
@@ -4557,7 +4557,7 @@
   v8SetReturnValueString(info, impl->setterCallWithCurrentWindowAndEnteredWindowStringAttribute(), info.GetIsolate());
 }
 
-void setterCallWithCurrentWindowAndEnteredWindowStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void setterCallWithCurrentWindowAndEnteredWindowStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::setterCallWithCurrentWindowAndEnteredWindowStringAttributeAttributeGetter(info);
 }
 
@@ -4573,7 +4573,7 @@
   impl->setSetterCallWithCurrentWindowAndEnteredWindowStringAttribute(currentDOMWindow(info.GetIsolate()), enteredDOMWindow(info.GetIsolate()), cppValue);
 }
 
-void setterCallWithCurrentWindowAndEnteredWindowStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void setterCallWithCurrentWindowAndEnteredWindowStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::setterCallWithCurrentWindowAndEnteredWindowStringAttributeAttributeSetter(v8Value, info);
@@ -4587,7 +4587,7 @@
   v8SetReturnValueString(info, impl->setterCallWithExecutionContextStringAttribute(), info.GetIsolate());
 }
 
-void setterCallWithExecutionContextStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void setterCallWithExecutionContextStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::setterCallWithExecutionContextStringAttributeAttributeGetter(info);
 }
 
@@ -4605,7 +4605,7 @@
   impl->setSetterCallWithExecutionContextStringAttribute(executionContext, cppValue);
 }
 
-void setterCallWithExecutionContextStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void setterCallWithExecutionContextStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::setterCallWithExecutionContextStringAttributeAttributeSetter(v8Value, info);
@@ -4619,7 +4619,7 @@
   v8SetReturnValueString(info, impl->treatNullAsEmptyStringStringAttribute(), info.GetIsolate());
 }
 
-void treatNullAsEmptyStringStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void treatNullAsEmptyStringStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::treatNullAsEmptyStringStringAttributeAttributeGetter(info);
 }
 
@@ -4635,7 +4635,7 @@
   impl->setTreatNullAsEmptyStringStringAttribute(cppValue);
 }
 
-void treatNullAsEmptyStringStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void treatNullAsEmptyStringStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::treatNullAsEmptyStringStringAttributeAttributeSetter(v8Value, info);
@@ -4649,7 +4649,7 @@
   v8SetReturnValueString(info, impl->treatNullAsNullStringStringAttribute(), info.GetIsolate());
 }
 
-void treatNullAsNullStringStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void treatNullAsNullStringStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::treatNullAsNullStringStringAttributeAttributeGetter(info);
 }
 
@@ -4665,7 +4665,7 @@
   impl->setTreatNullAsNullStringStringAttribute(cppValue);
 }
 
-void treatNullAsNullStringStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void treatNullAsNullStringStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::treatNullAsNullStringStringAttributeAttributeSetter(v8Value, info);
@@ -4679,7 +4679,7 @@
   v8SetReturnValue(info, impl->legacyInterfaceTypeCheckingFloatAttribute());
 }
 
-void legacyInterfaceTypeCheckingFloatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void legacyInterfaceTypeCheckingFloatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::legacyInterfaceTypeCheckingFloatAttributeAttributeGetter(info);
 }
 
@@ -4697,7 +4697,7 @@
   impl->setLegacyInterfaceTypeCheckingFloatAttribute(cppValue);
 }
 
-void legacyInterfaceTypeCheckingFloatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void legacyInterfaceTypeCheckingFloatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::legacyInterfaceTypeCheckingFloatAttributeAttributeSetter(v8Value, info);
@@ -4711,7 +4711,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->legacyInterfaceTypeCheckingTestInterfaceAttribute()), impl);
 }
 
-void legacyInterfaceTypeCheckingTestInterfaceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void legacyInterfaceTypeCheckingTestInterfaceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::legacyInterfaceTypeCheckingTestInterfaceAttributeAttributeGetter(info);
 }
 
@@ -4725,7 +4725,7 @@
   impl->setLegacyInterfaceTypeCheckingTestInterfaceAttribute(cppValue);
 }
 
-void legacyInterfaceTypeCheckingTestInterfaceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void legacyInterfaceTypeCheckingTestInterfaceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::legacyInterfaceTypeCheckingTestInterfaceAttributeAttributeSetter(v8Value, info);
@@ -4739,7 +4739,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->legacyInterfaceTypeCheckingTestInterfaceOrNullAttribute()), impl);
 }
 
-void legacyInterfaceTypeCheckingTestInterfaceOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void legacyInterfaceTypeCheckingTestInterfaceOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::legacyInterfaceTypeCheckingTestInterfaceOrNullAttributeAttributeGetter(info);
 }
 
@@ -4753,7 +4753,7 @@
   impl->setLegacyInterfaceTypeCheckingTestInterfaceOrNullAttribute(cppValue);
 }
 
-void legacyInterfaceTypeCheckingTestInterfaceOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void legacyInterfaceTypeCheckingTestInterfaceOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::legacyInterfaceTypeCheckingTestInterfaceOrNullAttributeAttributeSetter(v8Value, info);
@@ -4767,7 +4767,7 @@
   v8SetReturnValueString(info, impl->getURLAttribute(HTMLNames::urlstringattributeAttr), info.GetIsolate());
 }
 
-void urlStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void urlStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::urlStringAttributeAttributeGetter(info);
 }
 
@@ -4786,7 +4786,7 @@
   impl->setAttribute(HTMLNames::urlstringattributeAttr, cppValue);
 }
 
-void urlStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void urlStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -4802,7 +4802,7 @@
   v8SetReturnValueString(info, impl->getURLAttribute(HTMLNames::reflectUrlAttributeAttr), info.GetIsolate());
 }
 
-void urlStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void urlStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::urlStringAttributeAttributeGetter(info);
 }
 
@@ -4821,7 +4821,7 @@
   impl->setAttribute(HTMLNames::reflectUrlAttributeAttr, cppValue);
 }
 
-void urlStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void urlStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   V0CustomElementProcessingStack::CallbackDeliveryScope deliveryScope;
@@ -4837,7 +4837,7 @@
   v8SetReturnValueInt(info, impl->unforgeableLongAttribute());
 }
 
-void unforgeableLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unforgeableLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unforgeableLongAttributeAttributeGetter(info);
 }
 
@@ -4855,7 +4855,7 @@
   impl->setUnforgeableLongAttribute(cppValue);
 }
 
-void unforgeableLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unforgeableLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::unforgeableLongAttributeAttributeSetter(v8Value, info);
@@ -4869,7 +4869,7 @@
   v8SetReturnValueInt(info, impl->measuredLongAttribute());
 }
 
-void measuredLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void measuredLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   UseCounter::count(currentExecutionContext(info.GetIsolate()), UseCounter::V8TestObject_MeasuredLongAttribute_AttributeGetter);
 
   TestObjectV8Internal::measuredLongAttributeAttributeGetter(info);
@@ -4889,7 +4889,7 @@
   impl->setMeasuredLongAttribute(cppValue);
 }
 
-void measuredLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void measuredLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   UseCounter::count(currentExecutionContext(info.GetIsolate()), UseCounter::V8TestObject_MeasuredLongAttribute_AttributeSetter);
@@ -4915,7 +4915,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void sameObjectAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void sameObjectAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::sameObjectAttributeAttributeGetter(info);
 }
 
@@ -4955,7 +4955,7 @@
   privateSameObject.set(info.GetIsolate()->GetCurrentContext(), holder, info.GetReturnValue().Get());
 }
 
-void saveSameObjectAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void saveSameObjectAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::saveSameObjectAttributeAttributeGetter(info);
 }
 
@@ -4967,7 +4967,7 @@
   v8SetReturnValueInt(info, impl->unscopableLongAttribute());
 }
 
-void unscopableLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unscopableLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unscopableLongAttributeAttributeGetter(info);
 }
 
@@ -4985,7 +4985,7 @@
   impl->setUnscopableLongAttribute(cppValue);
 }
 
-void unscopableLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unscopableLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::unscopableLongAttributeAttributeSetter(v8Value, info);
@@ -4999,7 +4999,7 @@
   v8SetReturnValueInt(info, impl->unscopableOriginTrialEnabledLongAttribute());
 }
 
-void unscopableOriginTrialEnabledLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unscopableOriginTrialEnabledLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unscopableOriginTrialEnabledLongAttributeAttributeGetter(info);
 }
 
@@ -5017,7 +5017,7 @@
   impl->setUnscopableOriginTrialEnabledLongAttribute(cppValue);
 }
 
-void unscopableOriginTrialEnabledLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unscopableOriginTrialEnabledLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::unscopableOriginTrialEnabledLongAttributeAttributeSetter(v8Value, info);
@@ -5031,7 +5031,7 @@
   v8SetReturnValueInt(info, impl->unscopableRuntimeEnabledLongAttribute());
 }
 
-void unscopableRuntimeEnabledLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unscopableRuntimeEnabledLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unscopableRuntimeEnabledLongAttributeAttributeGetter(info);
 }
 
@@ -5049,7 +5049,7 @@
   impl->setUnscopableRuntimeEnabledLongAttribute(cppValue);
 }
 
-void unscopableRuntimeEnabledLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void unscopableRuntimeEnabledLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::unscopableRuntimeEnabledLongAttributeAttributeSetter(v8Value, info);
@@ -5063,7 +5063,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->testInterfaceAttribute()), impl);
 }
 
-void testInterfaceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testInterfaceAttributeAttributeGetter(info);
 }
 
@@ -5085,7 +5085,7 @@
   impl->setTestInterfaceAttribute(cppValue);
 }
 
-void testInterfaceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::testInterfaceAttributeAttributeSetter(v8Value, info);
@@ -5099,7 +5099,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->testInterfaceGarbageCollectedAttribute()), impl);
 }
 
-void testInterfaceGarbageCollectedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceGarbageCollectedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testInterfaceGarbageCollectedAttributeAttributeGetter(info);
 }
 
@@ -5121,7 +5121,7 @@
   impl->setTestInterfaceGarbageCollectedAttribute(cppValue);
 }
 
-void testInterfaceGarbageCollectedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceGarbageCollectedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::testInterfaceGarbageCollectedAttributeAttributeSetter(v8Value, info);
@@ -5135,7 +5135,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->testInterfaceGarbageCollectedOrNullAttribute()), impl);
 }
 
-void testInterfaceGarbageCollectedOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceGarbageCollectedOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testInterfaceGarbageCollectedOrNullAttributeAttributeGetter(info);
 }
 
@@ -5157,7 +5157,7 @@
   impl->setTestInterfaceGarbageCollectedOrNullAttribute(cppValue);
 }
 
-void testInterfaceGarbageCollectedOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void testInterfaceGarbageCollectedOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestObjectV8Internal::testInterfaceGarbageCollectedOrNullAttributeAttributeSetter(v8Value, info);
@@ -5169,7 +5169,7 @@
   impl->unscopableVoidMethod();
 }
 
-void unscopableVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void unscopableVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unscopableVoidMethodMethod(info);
 }
 
@@ -5179,7 +5179,7 @@
   impl->unscopableRuntimeEnabledVoidMethod();
 }
 
-void unscopableRuntimeEnabledVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void unscopableRuntimeEnabledVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unscopableRuntimeEnabledVoidMethodMethod(info);
 }
 
@@ -5189,7 +5189,7 @@
   impl->voidMethod();
 }
 
-void voidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodMethod(info);
 }
 
@@ -5197,7 +5197,7 @@
   TestObject::staticVoidMethod();
 }
 
-void staticVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void staticVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::staticVoidMethodMethod(info);
 }
 
@@ -5207,7 +5207,7 @@
   v8SetReturnValue(info, v8DateOrNaN(info.GetIsolate(), impl->dateMethod()));
 }
 
-void dateMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void dateMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::dateMethodMethod(info);
 }
 
@@ -5217,7 +5217,7 @@
   v8SetReturnValueString(info, impl->stringMethod(), info.GetIsolate());
 }
 
-void stringMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void stringMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::stringMethodMethod(info);
 }
 
@@ -5227,7 +5227,7 @@
   v8SetReturnValueString(info, impl->byteStringMethod(), info.GetIsolate());
 }
 
-void byteStringMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void byteStringMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::byteStringMethodMethod(info);
 }
 
@@ -5237,7 +5237,7 @@
   v8SetReturnValueString(info, impl->usvStringMethod(), info.GetIsolate());
 }
 
-void usvStringMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void usvStringMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::usvStringMethodMethod(info);
 }
 
@@ -5247,7 +5247,7 @@
   v8SetReturnValue(info, static_cast<double>(impl->readonlyDOMTimeStampMethod()));
 }
 
-void readonlyDOMTimeStampMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void readonlyDOMTimeStampMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::readonlyDOMTimeStampMethodMethod(info);
 }
 
@@ -5257,7 +5257,7 @@
   v8SetReturnValueBool(info, impl->booleanMethod());
 }
 
-void booleanMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void booleanMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::booleanMethodMethod(info);
 }
 
@@ -5267,7 +5267,7 @@
   v8SetReturnValueInt(info, impl->byteMethod());
 }
 
-void byteMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void byteMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::byteMethodMethod(info);
 }
 
@@ -5277,7 +5277,7 @@
   v8SetReturnValue(info, impl->doubleMethod());
 }
 
-void doubleMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void doubleMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::doubleMethodMethod(info);
 }
 
@@ -5287,7 +5287,7 @@
   v8SetReturnValue(info, impl->floatMethod());
 }
 
-void floatMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void floatMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::floatMethodMethod(info);
 }
 
@@ -5297,7 +5297,7 @@
   v8SetReturnValueInt(info, impl->longMethod());
 }
 
-void longMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void longMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::longMethodMethod(info);
 }
 
@@ -5307,7 +5307,7 @@
   v8SetReturnValue(info, static_cast<double>(impl->longLongMethod()));
 }
 
-void longLongMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void longLongMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::longLongMethodMethod(info);
 }
 
@@ -5317,7 +5317,7 @@
   v8SetReturnValueUnsigned(info, impl->octetMethod());
 }
 
-void octetMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void octetMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::octetMethodMethod(info);
 }
 
@@ -5327,7 +5327,7 @@
   v8SetReturnValueInt(info, impl->shortMethod());
 }
 
-void shortMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void shortMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::shortMethodMethod(info);
 }
 
@@ -5337,7 +5337,7 @@
   v8SetReturnValueUnsigned(info, impl->unsignedLongMethod());
 }
 
-void unsignedLongMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void unsignedLongMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unsignedLongMethodMethod(info);
 }
 
@@ -5347,7 +5347,7 @@
   v8SetReturnValue(info, static_cast<double>(impl->unsignedLongLongMethod()));
 }
 
-void unsignedLongLongMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void unsignedLongLongMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unsignedLongLongMethodMethod(info);
 }
 
@@ -5357,7 +5357,7 @@
   v8SetReturnValueUnsigned(info, impl->unsignedShortMethod());
 }
 
-void unsignedShortMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void unsignedShortMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unsignedShortMethodMethod(info);
 }
 
@@ -5379,7 +5379,7 @@
   impl->voidMethodDateArg(dateArg);
 }
 
-void voidMethodDateArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDateArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDateArgMethod(info);
 }
 
@@ -5399,7 +5399,7 @@
   impl->voidMethodStringArg(stringArg);
 }
 
-void voidMethodStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodStringArgMethod(info);
 }
 
@@ -5421,7 +5421,7 @@
   impl->voidMethodByteStringArg(stringArg);
 }
 
-void voidMethodByteStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodByteStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodByteStringArgMethod(info);
 }
 
@@ -5443,7 +5443,7 @@
   impl->voidMethodUSVStringArg(usvStringArg);
 }
 
-void voidMethodUSVStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodUSVStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodUSVStringArgMethod(info);
 }
 
@@ -5465,7 +5465,7 @@
   impl->voidMethodDOMTimeStampArg(domTimeStampArg);
 }
 
-void voidMethodDOMTimeStampArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDOMTimeStampArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDOMTimeStampArgMethod(info);
 }
 
@@ -5487,7 +5487,7 @@
   impl->voidMethodBooleanArg(booleanArg);
 }
 
-void voidMethodBooleanArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodBooleanArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodBooleanArgMethod(info);
 }
 
@@ -5509,7 +5509,7 @@
   impl->voidMethodByteArg(byteArg);
 }
 
-void voidMethodByteArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodByteArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodByteArgMethod(info);
 }
 
@@ -5531,7 +5531,7 @@
   impl->voidMethodDoubleArg(doubleArg);
 }
 
-void voidMethodDoubleArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDoubleArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDoubleArgMethod(info);
 }
 
@@ -5553,7 +5553,7 @@
   impl->voidMethodFloatArg(floatArg);
 }
 
-void voidMethodFloatArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodFloatArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodFloatArgMethod(info);
 }
 
@@ -5575,7 +5575,7 @@
   impl->voidMethodLongArg(longArg);
 }
 
-void voidMethodLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodLongArgMethod(info);
 }
 
@@ -5597,7 +5597,7 @@
   impl->voidMethodLongLongArg(longLongArg);
 }
 
-void voidMethodLongLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodLongLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodLongLongArgMethod(info);
 }
 
@@ -5619,7 +5619,7 @@
   impl->voidMethodOctetArg(octetArg);
 }
 
-void voidMethodOctetArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodOctetArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodOctetArgMethod(info);
 }
 
@@ -5641,7 +5641,7 @@
   impl->voidMethodShortArg(shortArg);
 }
 
-void voidMethodShortArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodShortArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodShortArgMethod(info);
 }
 
@@ -5663,7 +5663,7 @@
   impl->voidMethodUnsignedLongArg(unsignedLongArg);
 }
 
-void voidMethodUnsignedLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodUnsignedLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodUnsignedLongArgMethod(info);
 }
 
@@ -5685,7 +5685,7 @@
   impl->voidMethodUnsignedLongLongArg(unsignedLongLongArg);
 }
 
-void voidMethodUnsignedLongLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodUnsignedLongLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodUnsignedLongLongArgMethod(info);
 }
 
@@ -5707,7 +5707,7 @@
   impl->voidMethodUnsignedShortArg(unsignedShortArg);
 }
 
-void voidMethodUnsignedShortArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodUnsignedShortArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodUnsignedShortArgMethod(info);
 }
 
@@ -5717,7 +5717,7 @@
   v8SetReturnValue(info, impl->testInterfaceEmptyMethod());
 }
 
-void testInterfaceEmptyMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void testInterfaceEmptyMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testInterfaceEmptyMethodMethod(info);
 }
 
@@ -5740,7 +5740,7 @@
   impl->voidMethodTestInterfaceEmptyArg(testInterfaceEmptyArg);
 }
 
-void voidMethodTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodTestInterfaceEmptyArgMethod(info);
 }
 
@@ -5770,7 +5770,7 @@
   impl->voidMethodLongArgTestInterfaceEmptyArg(longArg, testInterfaceEmptyArg);
 }
 
-void voidMethodLongArgTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodLongArgTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodLongArgTestInterfaceEmptyArgMethod(info);
 }
 
@@ -5780,7 +5780,7 @@
   v8SetReturnValue(info, impl->anyMethod().v8Value());
 }
 
-void anyMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void anyMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::anyMethodMethod(info);
 }
 
@@ -5803,7 +5803,7 @@
   impl->voidMethodEventTargetArg(eventTargetArg);
 }
 
-void voidMethodEventTargetArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodEventTargetArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodEventTargetArgMethod(info);
 }
 
@@ -5821,7 +5821,7 @@
   impl->voidMethodAnyArg(anyArg);
 }
 
-void voidMethodAnyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodAnyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodAnyArgMethod(info);
 }
 
@@ -5844,7 +5844,7 @@
   impl->voidMethodAttrArg(attrArg);
 }
 
-void voidMethodAttrArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodAttrArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodAttrArgMethod(info);
 }
 
@@ -5867,7 +5867,7 @@
   impl->voidMethodDocumentArg(documentArg);
 }
 
-void voidMethodDocumentArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDocumentArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDocumentArgMethod(info);
 }
 
@@ -5890,7 +5890,7 @@
   impl->voidMethodDocumentTypeArg(documentTypeArg);
 }
 
-void voidMethodDocumentTypeArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDocumentTypeArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDocumentTypeArgMethod(info);
 }
 
@@ -5913,7 +5913,7 @@
   impl->voidMethodElementArg(elementArg);
 }
 
-void voidMethodElementArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodElementArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodElementArgMethod(info);
 }
 
@@ -5936,7 +5936,7 @@
   impl->voidMethodNodeArg(nodeArg);
 }
 
-void voidMethodNodeArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodNodeArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodNodeArgMethod(info);
 }
 
@@ -5946,7 +5946,7 @@
   v8SetReturnValue(info, impl->arrayBufferMethod());
 }
 
-void arrayBufferMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void arrayBufferMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::arrayBufferMethodMethod(info);
 }
 
@@ -5956,7 +5956,7 @@
   v8SetReturnValue(info, impl->arrayBufferViewMethod());
 }
 
-void arrayBufferViewMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void arrayBufferViewMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::arrayBufferViewMethodMethod(info);
 }
 
@@ -5966,7 +5966,7 @@
   v8SetReturnValue(info, impl->float32ArrayMethod());
 }
 
-void float32ArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void float32ArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::float32ArrayMethodMethod(info);
 }
 
@@ -5976,7 +5976,7 @@
   v8SetReturnValue(info, impl->int32ArrayMethod());
 }
 
-void int32ArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void int32ArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::int32ArrayMethodMethod(info);
 }
 
@@ -5986,7 +5986,7 @@
   v8SetReturnValue(info, impl->uint8ArrayMethod());
 }
 
-void uint8ArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void uint8ArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::uint8ArrayMethodMethod(info);
 }
 
@@ -6009,7 +6009,7 @@
   impl->voidMethodArrayBufferArg(arrayBufferArg);
 }
 
-void voidMethodArrayBufferArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodArrayBufferArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodArrayBufferArgMethod(info);
 }
 
@@ -6032,7 +6032,7 @@
   impl->voidMethodArrayBufferOrNullArg(arrayBufferArg);
 }
 
-void voidMethodArrayBufferOrNullArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodArrayBufferOrNullArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodArrayBufferOrNullArgMethod(info);
 }
 
@@ -6055,7 +6055,7 @@
   impl->voidMethodArrayBufferViewArg(arrayBufferViewArg);
 }
 
-void voidMethodArrayBufferViewArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodArrayBufferViewArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodArrayBufferViewArgMethod(info);
 }
 
@@ -6078,7 +6078,7 @@
   impl->voidMethodFlexibleArrayBufferViewArg(arrayBufferViewArg);
 }
 
-void voidMethodFlexibleArrayBufferViewArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodFlexibleArrayBufferViewArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodFlexibleArrayBufferViewArgMethod(info);
 }
 
@@ -6101,7 +6101,7 @@
   impl->voidMethodFlexibleArrayBufferViewTypedArg(typedArrayBufferViewArg);
 }
 
-void voidMethodFlexibleArrayBufferViewTypedArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodFlexibleArrayBufferViewTypedArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodFlexibleArrayBufferViewTypedArgMethod(info);
 }
 
@@ -6124,7 +6124,7 @@
   impl->voidMethodFloat32ArrayArg(float32ArrayArg);
 }
 
-void voidMethodFloat32ArrayArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodFloat32ArrayArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodFloat32ArrayArgMethod(info);
 }
 
@@ -6147,7 +6147,7 @@
   impl->voidMethodInt32ArrayArg(int32ArrayArg);
 }
 
-void voidMethodInt32ArrayArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodInt32ArrayArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodInt32ArrayArgMethod(info);
 }
 
@@ -6170,7 +6170,7 @@
   impl->voidMethodUint8ArrayArg(uint8ArrayArg);
 }
 
-void voidMethodUint8ArrayArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodUint8ArrayArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodUint8ArrayArgMethod(info);
 }
 
@@ -6180,7 +6180,7 @@
   v8SetReturnValue(info, ToV8(impl->longArrayMethod(), info.Holder(), info.GetIsolate()));
 }
 
-void longArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void longArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::longArrayMethodMethod(info);
 }
 
@@ -6190,7 +6190,7 @@
   v8SetReturnValue(info, ToV8(impl->stringArrayMethod(), info.Holder(), info.GetIsolate()));
 }
 
-void stringArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void stringArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::stringArrayMethodMethod(info);
 }
 
@@ -6200,7 +6200,7 @@
   v8SetReturnValue(info, ToV8(impl->testInterfaceEmptyArrayMethod(), info.Holder(), info.GetIsolate()));
 }
 
-void testInterfaceEmptyArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void testInterfaceEmptyArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testInterfaceEmptyArrayMethodMethod(info);
 }
 
@@ -6222,7 +6222,7 @@
   impl->voidMethodArrayLongArg(arrayLongArg);
 }
 
-void voidMethodArrayLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodArrayLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodArrayLongArgMethod(info);
 }
 
@@ -6244,7 +6244,7 @@
   impl->voidMethodArrayStringArg(arrayStringArg);
 }
 
-void voidMethodArrayStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodArrayStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodArrayStringArgMethod(info);
 }
 
@@ -6266,7 +6266,7 @@
   impl->voidMethodArrayTestInterfaceEmptyArg(arrayTestInterfaceEmptyArg);
 }
 
-void voidMethodArrayTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodArrayTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodArrayTestInterfaceEmptyArgMethod(info);
 }
 
@@ -6290,7 +6290,7 @@
   impl->voidMethodNullableArrayLongArg(arrayLongArg);
 }
 
-void voidMethodNullableArrayLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodNullableArrayLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodNullableArrayLongArgMethod(info);
 }
 
@@ -6300,7 +6300,7 @@
   v8SetReturnValue(info, ToV8(impl->longSequenceMethod(), info.Holder(), info.GetIsolate()));
 }
 
-void longSequenceMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void longSequenceMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::longSequenceMethodMethod(info);
 }
 
@@ -6310,7 +6310,7 @@
   v8SetReturnValue(info, ToV8(impl->stringSequenceMethod(), info.Holder(), info.GetIsolate()));
 }
 
-void stringSequenceMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void stringSequenceMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::stringSequenceMethodMethod(info);
 }
 
@@ -6320,7 +6320,7 @@
   v8SetReturnValue(info, ToV8(impl->testInterfaceEmptySequenceMethod(), info.Holder(), info.GetIsolate()));
 }
 
-void testInterfaceEmptySequenceMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void testInterfaceEmptySequenceMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testInterfaceEmptySequenceMethodMethod(info);
 }
 
@@ -6342,7 +6342,7 @@
   impl->voidMethodSequenceLongArg(longSequenceArg);
 }
 
-void voidMethodSequenceLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodSequenceLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodSequenceLongArgMethod(info);
 }
 
@@ -6364,7 +6364,7 @@
   impl->voidMethodSequenceStringArg(stringSequenceArg);
 }
 
-void voidMethodSequenceStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodSequenceStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodSequenceStringArgMethod(info);
 }
 
@@ -6386,7 +6386,7 @@
   impl->voidMethodSequenceTestInterfaceEmptyArg(testInterfaceEmptySequenceArg);
 }
 
-void voidMethodSequenceTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodSequenceTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodSequenceTestInterfaceEmptyArgMethod(info);
 }
 
@@ -6408,7 +6408,7 @@
   impl->voidMethodSequenceSequenceDOMStringArg(stringSequenceSequenceArg);
 }
 
-void voidMethodSequenceSequenceDOMStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodSequenceSequenceDOMStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodSequenceSequenceDOMStringArgMethod(info);
 }
 
@@ -6432,7 +6432,7 @@
   impl->voidMethodNullableSequenceLongArg(longSequenceArg);
 }
 
-void voidMethodNullableSequenceLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodNullableSequenceLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodNullableSequenceLongArgMethod(info);
 }
 
@@ -6442,7 +6442,7 @@
   v8SetReturnValue(info, freezeV8Object(ToV8(impl->longFrozenArrayMethod(), info.Holder(), info.GetIsolate()), info.GetIsolate()));
 }
 
-void longFrozenArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void longFrozenArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::longFrozenArrayMethodMethod(info);
 }
 
@@ -6464,7 +6464,7 @@
   impl->voidMethodStringFrozenArrayMethod(stringFrozenArrayArg);
 }
 
-void voidMethodStringFrozenArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodStringFrozenArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodStringFrozenArrayMethodMethod(info);
 }
 
@@ -6486,7 +6486,7 @@
   impl->voidMethodTestInterfaceEmptyFrozenArrayMethod(testInterfaceEmptyFrozenArrayArg);
 }
 
-void voidMethodTestInterfaceEmptyFrozenArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestInterfaceEmptyFrozenArrayMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodTestInterfaceEmptyFrozenArrayMethodMethod(info);
 }
 
@@ -6500,7 +6500,7 @@
     v8SetReturnValueInt(info, result.get());
 }
 
-void nullableLongMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void nullableLongMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::nullableLongMethodMethod(info);
 }
 
@@ -6510,7 +6510,7 @@
   v8SetReturnValueStringOrNull(info, impl->nullableStringMethod(), info.GetIsolate());
 }
 
-void nullableStringMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void nullableStringMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::nullableStringMethodMethod(info);
 }
 
@@ -6520,7 +6520,7 @@
   v8SetReturnValue(info, impl->nullableTestInterfaceMethod());
 }
 
-void nullableTestInterfaceMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void nullableTestInterfaceMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::nullableTestInterfaceMethodMethod(info);
 }
 
@@ -6534,7 +6534,7 @@
     v8SetReturnValue(info, ToV8(result.get(), info.Holder(), info.GetIsolate()));
 }
 
-void nullableLongSequenceMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void nullableLongSequenceMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::nullableLongSequenceMethodMethod(info);
 }
 
@@ -6546,7 +6546,7 @@
   v8SetReturnValue(info, result);
 }
 
-void testInterfaceGarbageCollectedOrDOMStringMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void testInterfaceGarbageCollectedOrDOMStringMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testInterfaceGarbageCollectedOrDOMStringMethodMethod(info);
 }
 
@@ -6558,7 +6558,7 @@
   v8SetReturnValue(info, result);
 }
 
-void booleanOrDOMStringOrUnrestrictedDoubleMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void booleanOrDOMStringOrUnrestrictedDoubleMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::booleanOrDOMStringOrUnrestrictedDoubleMethodMethod(info);
 }
 
@@ -6570,7 +6570,7 @@
   v8SetReturnValue(info, result);
 }
 
-void testInterfaceOrLongMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void testInterfaceOrLongMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testInterfaceOrLongMethodMethod(info);
 }
 
@@ -6592,7 +6592,7 @@
   impl->voidMethodDoubleOrDOMStringArg(arg);
 }
 
-void voidMethodDoubleOrDOMStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDoubleOrDOMStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDoubleOrDOMStringArgMethod(info);
 }
 
@@ -6614,7 +6614,7 @@
   impl->voidMethodDoubleOrDOMStringOrNullArg(arg);
 }
 
-void voidMethodDoubleOrDOMStringOrNullArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDoubleOrDOMStringOrNullArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDoubleOrDOMStringOrNullArgMethod(info);
 }
 
@@ -6636,7 +6636,7 @@
   impl->voidMethodDoubleOrNullOrDOMStringArg(arg);
 }
 
-void voidMethodDoubleOrNullOrDOMStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDoubleOrNullOrDOMStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDoubleOrNullOrDOMStringArgMethod(info);
 }
 
@@ -6658,7 +6658,7 @@
   impl->voidMethodDOMStringOrArrayBufferOrArrayBufferViewArg(arg);
 }
 
-void voidMethodDOMStringOrArrayBufferOrArrayBufferViewArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDOMStringOrArrayBufferOrArrayBufferViewArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDOMStringOrArrayBufferOrArrayBufferViewArgMethod(info);
 }
 
@@ -6680,7 +6680,7 @@
   impl->voidMethodArrayBufferOrArrayBufferViewOrDictionaryArg(arg);
 }
 
-void voidMethodArrayBufferOrArrayBufferViewOrDictionaryArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodArrayBufferOrArrayBufferViewOrDictionaryArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodArrayBufferOrArrayBufferViewOrDictionaryArgMethod(info);
 }
 
@@ -6697,7 +6697,7 @@
   impl->voidMethodArrayOfDoubleOrDOMStringArg(arg);
 }
 
-void voidMethodArrayOfDoubleOrDOMStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodArrayOfDoubleOrDOMStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodArrayOfDoubleOrDOMStringArgMethod(info);
 }
 
@@ -6720,7 +6720,7 @@
   impl->voidMethodTestInterfaceEmptyOrNullArg(nullableTestInterfaceEmptyArg);
 }
 
-void voidMethodTestInterfaceEmptyOrNullArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestInterfaceEmptyOrNullArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodTestInterfaceEmptyOrNullArgMethod(info);
 }
 
@@ -6743,7 +6743,7 @@
   impl->voidMethodTestCallbackInterfaceArg(testCallbackInterfaceArg);
 }
 
-void voidMethodTestCallbackInterfaceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestCallbackInterfaceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodTestCallbackInterfaceArgMethod(info);
 }
 
@@ -6765,7 +6765,7 @@
   impl->voidMethodOptionalTestCallbackInterfaceArg(optionalTestCallbackInterfaceArg);
 }
 
-void voidMethodOptionalTestCallbackInterfaceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodOptionalTestCallbackInterfaceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodOptionalTestCallbackInterfaceArgMethod(info);
 }
 
@@ -6788,7 +6788,7 @@
   impl->voidMethodTestCallbackInterfaceOrNullArg(testCallbackInterfaceArg);
 }
 
-void voidMethodTestCallbackInterfaceOrNullArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestCallbackInterfaceOrNullArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodTestCallbackInterfaceOrNullArgMethod(info);
 }
 
@@ -6798,7 +6798,7 @@
   v8SetReturnValueString(info, impl->testEnumMethod(), info.GetIsolate());
 }
 
-void testEnumMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void testEnumMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testEnumMethodMethod(info);
 }
 
@@ -6829,7 +6829,7 @@
   impl->voidMethodTestEnumArg(testEnumTypeArg);
 }
 
-void voidMethodTestEnumArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestEnumArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodTestEnumArgMethod(info);
 }
 
@@ -6874,7 +6874,7 @@
   impl->voidMethodTestMultipleEnumArg(testEnumTypeArg, testEnumTypeArg2);
 }
 
-void voidMethodTestMultipleEnumArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestMultipleEnumArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodTestMultipleEnumArgMethod(info);
 }
 
@@ -6884,7 +6884,7 @@
   v8SetReturnValue(info, impl->dictionaryMethod());
 }
 
-void dictionaryMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void dictionaryMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::dictionaryMethodMethod(info);
 }
 
@@ -6896,7 +6896,7 @@
   v8SetReturnValue(info, result);
 }
 
-void testDictionaryMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void testDictionaryMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testDictionaryMethodMethod(info);
 }
 
@@ -6911,7 +6911,7 @@
     v8SetReturnValue(info, result.get());
 }
 
-void nullableTestDictionaryMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void nullableTestDictionaryMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::nullableTestDictionaryMethodMethod(info);
 }
 
@@ -6928,7 +6928,7 @@
   impl->passPermissiveDictionaryMethod(arg);
 }
 
-void passPermissiveDictionaryMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void passPermissiveDictionaryMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::passPermissiveDictionaryMethodMethod(info);
 }
 
@@ -6938,7 +6938,7 @@
   v8SetReturnValue(info, impl->nodeFilterMethod());
 }
 
-void nodeFilterMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void nodeFilterMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::nodeFilterMethodMethod(info);
 }
 
@@ -6987,7 +6987,7 @@
   v8SetReturnValue(info, impl->promiseMethod(arg1, arg2, arg3, variadic).v8Value());
 }
 
-void promiseMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void promiseMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::promiseMethodMethod(info);
 }
 
@@ -7021,7 +7021,7 @@
   v8SetReturnValue(info, impl->promiseMethodWithoutExceptionState(arg1).v8Value());
 }
 
-void promiseMethodWithoutExceptionStateMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void promiseMethodWithoutExceptionStateMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::promiseMethodWithoutExceptionStateMethod(info);
 }
 
@@ -7031,7 +7031,7 @@
   v8SetReturnValue(info, v8Deserialize(info.GetIsolate(), impl->serializedScriptValueMethod()));
 }
 
-void serializedScriptValueMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void serializedScriptValueMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::serializedScriptValueMethodMethod(info);
 }
 
@@ -7041,7 +7041,7 @@
   v8SetReturnValue(info, impl->xPathNSResolverMethod());
 }
 
-void xPathNSResolverMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void xPathNSResolverMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::xPathNSResolverMethodMethod(info);
 }
 
@@ -7068,7 +7068,7 @@
   impl->voidMethodDictionaryArg(dictionaryArg);
 }
 
-void voidMethodDictionaryArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDictionaryArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDictionaryArgMethod(info);
 }
 
@@ -7086,7 +7086,7 @@
   impl->voidMethodNodeFilterArg(nodeFilterArg);
 }
 
-void voidMethodNodeFilterArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodNodeFilterArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodNodeFilterArgMethod(info);
 }
 
@@ -7109,7 +7109,7 @@
   impl->voidMethodPromiseArg(promiseArg);
 }
 
-void voidMethodPromiseArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodPromiseArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodPromiseArgMethod(info);
 }
 
@@ -7131,7 +7131,7 @@
   impl->voidMethodSerializedScriptValueArg(serializedScriptValueArg);
 }
 
-void voidMethodSerializedScriptValueArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodSerializedScriptValueArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodSerializedScriptValueArgMethod(info);
 }
 
@@ -7154,7 +7154,7 @@
   impl->voidMethodXPathNSResolverArg(xPathNSResolverArg);
 }
 
-void voidMethodXPathNSResolverArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodXPathNSResolverArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodXPathNSResolverArgMethod(info);
 }
 
@@ -7176,7 +7176,7 @@
   impl->voidMethodDictionarySequenceArg(dictionarySequenceArg);
 }
 
-void voidMethodDictionarySequenceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDictionarySequenceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDictionarySequenceArgMethod(info);
 }
 
@@ -7203,7 +7203,7 @@
   impl->voidMethodStringArgLongArg(stringArg, longArg);
 }
 
-void voidMethodStringArgLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodStringArgLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodStringArgLongArgMethod(info);
 }
 
@@ -7228,7 +7228,7 @@
   impl->voidMethodOptionalStringArg(optionalStringArg);
 }
 
-void voidMethodOptionalStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodOptionalStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodOptionalStringArgMethod(info);
 }
 
@@ -7256,7 +7256,7 @@
   impl->voidMethodOptionalTestInterfaceEmptyArg(optionalTestInterfaceEmptyArg);
 }
 
-void voidMethodOptionalTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodOptionalTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodOptionalTestInterfaceEmptyArgMethod(info);
 }
 
@@ -7283,7 +7283,7 @@
   impl->voidMethodOptionalLongArg(optionalLongArg);
 }
 
-void voidMethodOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodOptionalLongArgMethod(info);
 }
 
@@ -7310,7 +7310,7 @@
   v8SetReturnValueString(info, impl->stringMethodOptionalLongArg(optionalLongArg), info.GetIsolate());
 }
 
-void stringMethodOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void stringMethodOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::stringMethodOptionalLongArgMethod(info);
 }
 
@@ -7337,7 +7337,7 @@
   v8SetReturnValue(info, impl->testInterfaceEmptyMethodOptionalLongArg(optionalLongArg));
 }
 
-void testInterfaceEmptyMethodOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void testInterfaceEmptyMethodOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::testInterfaceEmptyMethodOptionalLongArgMethod(info);
 }
 
@@ -7364,7 +7364,7 @@
   v8SetReturnValueInt(info, impl->longMethodOptionalLongArg(optionalLongArg));
 }
 
-void longMethodOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void longMethodOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::longMethodOptionalLongArgMethod(info);
 }
 
@@ -7401,7 +7401,7 @@
   impl->voidMethodLongArgOptionalLongArg(longArg, optionalLongArg);
 }
 
-void voidMethodLongArgOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodLongArgOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodLongArgOptionalLongArgMethod(info);
 }
 
@@ -7447,7 +7447,7 @@
   impl->voidMethodLongArgOptionalLongArgOptionalLongArg(longArg, optionalLongArg1, optionalLongArg2);
 }
 
-void voidMethodLongArgOptionalLongArgOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodLongArgOptionalLongArgOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodLongArgOptionalLongArgOptionalLongArgMethod(info);
 }
 
@@ -7487,7 +7487,7 @@
   impl->voidMethodLongArgOptionalTestInterfaceEmptyArg(longArg, optionalTestInterfaceEmpty);
 }
 
-void voidMethodLongArgOptionalTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodLongArgOptionalTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodLongArgOptionalTestInterfaceEmptyArgMethod(info);
 }
 
@@ -7527,7 +7527,7 @@
   impl->voidMethodTestInterfaceEmptyArgOptionalLongArg(optionalTestInterfaceEmpty, longArg);
 }
 
-void voidMethodTestInterfaceEmptyArgOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestInterfaceEmptyArgOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodTestInterfaceEmptyArgOptionalLongArgMethod(info);
 }
 
@@ -7549,7 +7549,7 @@
   impl->voidMethodOptionalDictionaryArg(optionalDictionaryArg);
 }
 
-void voidMethodOptionalDictionaryArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodOptionalDictionaryArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodOptionalDictionaryArgMethod(info);
 }
 
@@ -7570,7 +7570,7 @@
   impl->voidMethodDefaultByteStringArg(defaultByteStringArg);
 }
 
-void voidMethodDefaultByteStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultByteStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultByteStringArgMethod(info);
 }
 
@@ -7589,7 +7589,7 @@
   impl->voidMethodDefaultStringArg(defaultStringArg);
 }
 
-void voidMethodDefaultStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultStringArgMethod(info);
 }
 
@@ -7626,7 +7626,7 @@
   impl->voidMethodDefaultIntegerArgs(defaultLongArg, defaultLongLongArg, defaultUnsignedArg);
 }
 
-void voidMethodDefaultIntegerArgsMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultIntegerArgsMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultIntegerArgsMethod(info);
 }
 
@@ -7647,7 +7647,7 @@
   impl->voidMethodDefaultDoubleArg(defaultDoubleArg);
 }
 
-void voidMethodDefaultDoubleArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultDoubleArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultDoubleArgMethod(info);
 }
 
@@ -7668,7 +7668,7 @@
   impl->voidMethodDefaultTrueBooleanArg(defaultBooleanArg);
 }
 
-void voidMethodDefaultTrueBooleanArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultTrueBooleanArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultTrueBooleanArgMethod(info);
 }
 
@@ -7689,7 +7689,7 @@
   impl->voidMethodDefaultFalseBooleanArg(defaultBooleanArg);
 }
 
-void voidMethodDefaultFalseBooleanArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultFalseBooleanArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultFalseBooleanArgMethod(info);
 }
 
@@ -7710,7 +7710,7 @@
   impl->voidMethodDefaultNullableByteStringArg(defaultStringArg);
 }
 
-void voidMethodDefaultNullableByteStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultNullableByteStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultNullableByteStringArgMethod(info);
 }
 
@@ -7729,7 +7729,7 @@
   impl->voidMethodDefaultNullableStringArg(defaultStringArg);
 }
 
-void voidMethodDefaultNullableStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultNullableStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultNullableStringArgMethod(info);
 }
 
@@ -7751,7 +7751,7 @@
   impl->voidMethodDefaultNullableTestInterfaceArg(defaultTestInterfaceArg);
 }
 
-void voidMethodDefaultNullableTestInterfaceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultNullableTestInterfaceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultNullableTestInterfaceArgMethod(info);
 }
 
@@ -7788,7 +7788,7 @@
   impl->voidMethodDefaultDoubleOrStringArgs(defaultLongArg, defaultStringArg, defaultNullArg);
 }
 
-void voidMethodDefaultDoubleOrStringArgsMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultDoubleOrStringArgsMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultDoubleOrStringArgsMethod(info);
 }
 
@@ -7809,7 +7809,7 @@
   impl->voidMethodDefaultStringSequenceArg(defaultStringSequenceArg);
 }
 
-void voidMethodDefaultStringSequenceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultStringSequenceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultStringSequenceArgMethod(info);
 }
 
@@ -7826,7 +7826,7 @@
   impl->voidMethodVariadicStringArg(variadicStringArgs);
 }
 
-void voidMethodVariadicStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodVariadicStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodVariadicStringArgMethod(info);
 }
 
@@ -7853,7 +7853,7 @@
   impl->voidMethodStringArgVariadicStringArg(stringArg, variadicStringArgs);
 }
 
-void voidMethodStringArgVariadicStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodStringArgVariadicStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodStringArgVariadicStringArgMethod(info);
 }
 
@@ -7875,7 +7875,7 @@
   impl->voidMethodVariadicTestInterfaceEmptyArg(variadicTestInterfaceEmptyArgs);
 }
 
-void voidMethodVariadicTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodVariadicTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodVariadicTestInterfaceEmptyArgMethod(info);
 }
 
@@ -7910,7 +7910,7 @@
   impl->voidMethodTestInterfaceEmptyArgVariadicTestInterfaceEmptyArg(testInterfaceEmptyArg, variadicTestInterfaceEmptyArgs);
 }
 
-void voidMethodTestInterfaceEmptyArgVariadicTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestInterfaceEmptyArgVariadicTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodTestInterfaceEmptyArgVariadicTestInterfaceEmptyArgMethod(info);
 }
 
@@ -7932,7 +7932,7 @@
   impl->voidMethodVariadicTestInterfaceGarbageCollectedArg(variadicTestInterfaceGarbageCollectedArg);
 }
 
-void voidMethodVariadicTestInterfaceGarbageCollectedArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodVariadicTestInterfaceGarbageCollectedArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodVariadicTestInterfaceGarbageCollectedArgMethod(info);
 }
 
@@ -7997,7 +7997,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedMethodAMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedMethodAMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedMethodAMethod(info);
 }
 
@@ -8080,7 +8080,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedMethodBMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedMethodBMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedMethodBMethod(info);
 }
 
@@ -8139,7 +8139,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedMethodCMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedMethodCMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedMethodCMethod(info);
 }
 
@@ -8197,7 +8197,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedMethodDMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedMethodDMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedMethodDMethod(info);
 }
 
@@ -8260,7 +8260,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedMethodEMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedMethodEMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedMethodEMethod(info);
 }
 
@@ -8336,7 +8336,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedMethodFMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedMethodFMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedMethodFMethod(info);
 }
 
@@ -8409,7 +8409,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedMethodGMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedMethodGMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedMethodGMethod(info);
 }
 
@@ -8469,7 +8469,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedMethodHMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedMethodHMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedMethodHMethod(info);
 }
 
@@ -8529,7 +8529,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedMethodIMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedMethodIMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedMethodIMethod(info);
 }
 
@@ -8590,7 +8590,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedMethodJMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedMethodJMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedMethodJMethod(info);
 }
 
@@ -8647,7 +8647,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedMethodKMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedMethodKMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedMethodKMethod(info);
 }
 
@@ -8733,7 +8733,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedMethodLMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedMethodLMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedMethodLMethod(info);
 }
 
@@ -8793,7 +8793,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedMethodNMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedMethodNMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedMethodNMethod(info);
 }
 
@@ -8903,7 +8903,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void promiseOverloadMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void promiseOverloadMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::promiseOverloadMethodMethod(info);
 }
 
@@ -8958,7 +8958,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedPerWorldBindingsMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedPerWorldBindingsMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedPerWorldBindingsMethodMethod(info);
 }
 
@@ -9001,7 +9001,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedPerWorldBindingsMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedPerWorldBindingsMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedPerWorldBindingsMethodMethodForMainWorld(info);
 }
 
@@ -9062,7 +9062,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void overloadedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void overloadedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::overloadedStaticMethodMethod(info);
 }
 
@@ -9087,7 +9087,7 @@
   v8SetReturnValue(info, result.v8Value());
 }
 
-void itemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void itemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::itemMethod(info);
 }
 
@@ -9117,7 +9117,7 @@
   v8SetReturnValueString(info, result, info.GetIsolate());
 }
 
-void setItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void setItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::setItemMethod(info);
 }
 
@@ -9139,7 +9139,7 @@
   impl->voidMethodClampUnsignedShortArg(clampUnsignedShortArg);
 }
 
-void voidMethodClampUnsignedShortArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodClampUnsignedShortArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodClampUnsignedShortArgMethod(info);
 }
 
@@ -9161,7 +9161,7 @@
   impl->voidMethodClampUnsignedLongArg(clampUnsignedLongArg);
 }
 
-void voidMethodClampUnsignedLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodClampUnsignedLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodClampUnsignedLongArgMethod(info);
 }
 
@@ -9179,7 +9179,7 @@
   impl->voidMethodDefaultUndefinedTestInterfaceEmptyArg(defaultUndefinedTestInterfaceEmptyArg);
 }
 
-void voidMethodDefaultUndefinedTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultUndefinedTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultUndefinedTestInterfaceEmptyArgMethod(info);
 }
 
@@ -9196,7 +9196,7 @@
   impl->voidMethodDefaultUndefinedLongArg(defaultUndefinedLongArg);
 }
 
-void voidMethodDefaultUndefinedLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultUndefinedLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultUndefinedLongArgMethod(info);
 }
 
@@ -9211,7 +9211,7 @@
   impl->voidMethodDefaultUndefinedStringArg(defaultUndefinedStringArg);
 }
 
-void voidMethodDefaultUndefinedStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodDefaultUndefinedStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodDefaultUndefinedStringArgMethod(info);
 }
 
@@ -9233,7 +9233,7 @@
   impl->voidMethodEnforceRangeLongArg(enforceRangeLongArg);
 }
 
-void voidMethodEnforceRangeLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodEnforceRangeLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodEnforceRangeLongArgMethod(info);
 }
 
@@ -9253,7 +9253,7 @@
   impl->voidMethodTreatNullAsEmptyStringStringArg(treatNullAsEmptyStringStringArg);
 }
 
-void voidMethodTreatNullAsEmptyStringStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTreatNullAsEmptyStringStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodTreatNullAsEmptyStringStringArgMethod(info);
 }
 
@@ -9273,7 +9273,7 @@
   impl->voidMethodTreatNullAsNullStringStringArg(treatNullAsNullStringStringArg);
 }
 
-void voidMethodTreatNullAsNullStringStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTreatNullAsNullStringStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodTreatNullAsNullStringStringArgMethod(info);
 }
 
@@ -9283,7 +9283,7 @@
   impl->activityLoggingAccessForAllWorldsMethod();
 }
 
-void activityLoggingAccessForAllWorldsMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void activityLoggingAccessForAllWorldsMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
   V8PerContextData* contextData = scriptState->perContextData();
   if (contextData && contextData->activityLogger()) {
@@ -9301,7 +9301,7 @@
   impl->callWithExecutionContextVoidMethod(executionContext);
 }
 
-void callWithExecutionContextVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void callWithExecutionContextVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::callWithExecutionContextVoidMethodMethod(info);
 }
 
@@ -9313,7 +9313,7 @@
   impl->callWithScriptStateVoidMethod(scriptState);
 }
 
-void callWithScriptStateVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void callWithScriptStateVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::callWithScriptStateVoidMethodMethod(info);
 }
 
@@ -9326,7 +9326,7 @@
   v8SetReturnValueInt(info, result);
 }
 
-void callWithScriptStateLongMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void callWithScriptStateLongMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::callWithScriptStateLongMethodMethod(info);
 }
 
@@ -9339,7 +9339,7 @@
   impl->callWithScriptStateExecutionContextVoidMethod(scriptState, executionContext);
 }
 
-void callWithScriptStateExecutionContextVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void callWithScriptStateExecutionContextVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::callWithScriptStateExecutionContextVoidMethodMethod(info);
 }
 
@@ -9352,7 +9352,7 @@
   impl->callWithScriptStateScriptArgumentsVoidMethod(scriptState, scriptArguments);
 }
 
-void callWithScriptStateScriptArgumentsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void callWithScriptStateScriptArgumentsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::callWithScriptStateScriptArgumentsVoidMethodMethod(info);
 }
 
@@ -9383,7 +9383,7 @@
   impl->callWithScriptStateScriptArgumentsVoidMethodOptionalBooleanArg(scriptState, scriptArguments, optionalBooleanArg);
 }
 
-void callWithScriptStateScriptArgumentsVoidMethodOptionalBooleanArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void callWithScriptStateScriptArgumentsVoidMethodOptionalBooleanArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::callWithScriptStateScriptArgumentsVoidMethodOptionalBooleanArgMethod(info);
 }
 
@@ -9393,7 +9393,7 @@
   impl->callWithCurrentWindow(currentDOMWindow(info.GetIsolate()));
 }
 
-void callWithCurrentWindowMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void callWithCurrentWindowMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::callWithCurrentWindowMethod(info);
 }
 
@@ -9403,7 +9403,7 @@
   impl->callWithCurrentWindowScriptWindow(currentDOMWindow(info.GetIsolate()), enteredDOMWindow(info.GetIsolate()));
 }
 
-void callWithCurrentWindowScriptWindowMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void callWithCurrentWindowScriptWindowMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::callWithCurrentWindowScriptWindowMethod(info);
 }
 
@@ -9415,7 +9415,7 @@
   impl->callWithThisValue(ScriptValue(scriptState, info.Holder()));
 }
 
-void callWithThisValueMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void callWithThisValueMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::callWithThisValueMethod(info);
 }
 
@@ -9431,11 +9431,11 @@
   impl->checkSecurityForNodeVoidMethod();
 }
 
-void checkSecurityForNodeVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void checkSecurityForNodeVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::checkSecurityForNodeVoidMethodMethod(info);
 }
 
-void customVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void customVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   V8TestObject::customVoidMethodMethodCustom(info);
 }
 
@@ -9446,7 +9446,7 @@
   impl->customCallPrologueVoidMethod();
 }
 
-void customCallPrologueVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void customCallPrologueVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::customCallPrologueVoidMethodMethod(info);
 }
 
@@ -9457,7 +9457,7 @@
   V8TestObject::customCallEpilogueVoidMethodMethodEpilogueCustom(info, impl);
 }
 
-void customCallEpilogueVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void customCallEpilogueVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::customCallEpilogueVoidMethodMethod(info);
 }
 
@@ -9467,7 +9467,7 @@
   impl->deprecatedVoidMethod();
 }
 
-void deprecatedVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void deprecatedVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   Deprecation::countDeprecation(currentExecutionContext(info.GetIsolate()), UseCounter::voidMethod);
   TestObjectV8Internal::deprecatedVoidMethodMethod(info);
 }
@@ -9478,7 +9478,7 @@
   impl->implementedAsMethodName();
 }
 
-void implementedAsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void implementedAsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::implementedAsVoidMethodMethod(info);
 }
 
@@ -9488,7 +9488,7 @@
   impl->measureAsVoidMethod();
 }
 
-void measureAsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void measureAsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   UseCounter::count(currentExecutionContext(info.GetIsolate()), UseCounter::TestFeature);
   TestObjectV8Internal::measureAsVoidMethodMethod(info);
 }
@@ -9499,7 +9499,7 @@
   impl->measureMethod();
 }
 
-void measureMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void measureMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   UseCounter::count(currentExecutionContext(info.GetIsolate()), UseCounter::V8TestObject_MeasureMethod_Method);
   TestObjectV8Internal::measureMethodMethod(info);
 }
@@ -9551,7 +9551,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void measureOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void measureOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::measureOverloadedMethodMethod(info);
 }
 
@@ -9602,7 +9602,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void DeprecateAsOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void DeprecateAsOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::DeprecateAsOverloadedMethodMethod(info);
 }
 
@@ -9653,7 +9653,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void DeprecateAsSameValueOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void DeprecateAsSameValueOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::DeprecateAsSameValueOverloadedMethodMethod(info);
 }
 
@@ -9704,7 +9704,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void measureAsOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void measureAsOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::measureAsOverloadedMethodMethod(info);
 }
 
@@ -9755,7 +9755,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void measureAsSameValueOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void measureAsSameValueOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::measureAsSameValueOverloadedMethodMethod(info);
 }
 
@@ -9808,7 +9808,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void deprecateAsMeasureAsSameValueOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void deprecateAsMeasureAsSameValueOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::deprecateAsMeasureAsSameValueOverloadedMethodMethod(info);
 }
 
@@ -9861,7 +9861,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void deprecateAsSameValueMeasureAsOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void deprecateAsSameValueMeasureAsOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::deprecateAsSameValueMeasureAsOverloadedMethodMethod(info);
 }
 
@@ -9914,7 +9914,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void deprecateAsSameValueMeasureAsSameValueOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void deprecateAsSameValueMeasureAsSameValueOverloadedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::deprecateAsSameValueMeasureAsSameValueOverloadedMethodMethod(info);
 }
 
@@ -9924,7 +9924,7 @@
   impl->notEnumerableVoidMethod();
 }
 
-void notEnumerableVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void notEnumerableVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::notEnumerableVoidMethodMethod(info);
 }
 
@@ -9934,7 +9934,7 @@
   impl->originTrialEnabledVoidMethod();
 }
 
-void originTrialEnabledVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void originTrialEnabledVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::originTrialEnabledVoidMethodMethod(info);
 }
 
@@ -9944,7 +9944,7 @@
   impl->perWorldBindingsOriginTrialEnabledVoidMethod();
 }
 
-void perWorldBindingsOriginTrialEnabledVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void perWorldBindingsOriginTrialEnabledVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::perWorldBindingsOriginTrialEnabledVoidMethodMethod(info);
 }
 
@@ -9954,7 +9954,7 @@
   impl->perWorldBindingsOriginTrialEnabledVoidMethod();
 }
 
-void perWorldBindingsOriginTrialEnabledVoidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void perWorldBindingsOriginTrialEnabledVoidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::perWorldBindingsOriginTrialEnabledVoidMethodMethodForMainWorld(info);
 }
 
@@ -9964,7 +9964,7 @@
   impl->perWorldBindingsVoidMethod();
 }
 
-void perWorldBindingsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void perWorldBindingsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::perWorldBindingsVoidMethodMethod(info);
 }
 
@@ -9974,7 +9974,7 @@
   impl->perWorldBindingsVoidMethod();
 }
 
-void perWorldBindingsVoidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void perWorldBindingsVoidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::perWorldBindingsVoidMethodMethodForMainWorld(info);
 }
 
@@ -9997,7 +9997,7 @@
   impl->perWorldBindingsVoidMethodTestInterfaceEmptyArg(testInterfaceEmptyArg);
 }
 
-void perWorldBindingsVoidMethodTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void perWorldBindingsVoidMethodTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::perWorldBindingsVoidMethodTestInterfaceEmptyArgMethod(info);
 }
 
@@ -10020,7 +10020,7 @@
   impl->perWorldBindingsVoidMethodTestInterfaceEmptyArg(testInterfaceEmptyArg);
 }
 
-void perWorldBindingsVoidMethodTestInterfaceEmptyArgMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void perWorldBindingsVoidMethodTestInterfaceEmptyArgMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::perWorldBindingsVoidMethodTestInterfaceEmptyArgMethodForMainWorld(info);
 }
 
@@ -10077,7 +10077,7 @@
   instance->postMessage(context, message.release(), transferables.messagePorts, exceptionState);
 }
 
-void postMessageMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void postMessageMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   postMessageImpl("TestObject", V8TestObject::toImpl(info.Holder()), info);
 }
 
@@ -10087,7 +10087,7 @@
   impl->activityLoggingForAllWorldsPerWorldBindingsVoidMethod();
 }
 
-void activityLoggingForAllWorldsPerWorldBindingsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void activityLoggingForAllWorldsPerWorldBindingsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
   V8PerContextData* contextData = scriptState->perContextData();
   if (contextData && contextData->activityLogger()) {
@@ -10104,7 +10104,7 @@
   impl->activityLoggingForAllWorldsPerWorldBindingsVoidMethod();
 }
 
-void activityLoggingForAllWorldsPerWorldBindingsVoidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void activityLoggingForAllWorldsPerWorldBindingsVoidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
   V8PerContextData* contextData = scriptState->perContextData();
   if (contextData && contextData->activityLogger()) {
@@ -10121,7 +10121,7 @@
   impl->activityLoggingForIsolatedWorldsPerWorldBindingsVoidMethod();
 }
 
-void activityLoggingForIsolatedWorldsPerWorldBindingsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void activityLoggingForIsolatedWorldsPerWorldBindingsVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   ScriptState* scriptState = ScriptState::forReceiverObject(info);
   V8PerContextData* contextData = scriptState->perContextData();
   if (contextData && contextData->activityLogger()) {
@@ -10138,7 +10138,7 @@
   impl->activityLoggingForIsolatedWorldsPerWorldBindingsVoidMethod();
 }
 
-void activityLoggingForIsolatedWorldsPerWorldBindingsVoidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void activityLoggingForIsolatedWorldsPerWorldBindingsVoidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::activityLoggingForIsolatedWorldsPerWorldBindingsVoidMethodMethodForMainWorld(info);
 }
 
@@ -10153,7 +10153,7 @@
   }
 }
 
-void raisesExceptionVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void raisesExceptionVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::raisesExceptionVoidMethodMethod(info);
 }
 
@@ -10169,7 +10169,7 @@
   v8SetReturnValueString(info, result, info.GetIsolate());
 }
 
-void raisesExceptionStringMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void raisesExceptionStringMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::raisesExceptionStringMethodMethod(info);
 }
 
@@ -10202,7 +10202,7 @@
   }
 }
 
-void raisesExceptionVoidMethodOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void raisesExceptionVoidMethodOptionalLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::raisesExceptionVoidMethodOptionalLongArgMethod(info);
 }
 
@@ -10230,7 +10230,7 @@
   }
 }
 
-void raisesExceptionVoidMethodTestCallbackInterfaceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void raisesExceptionVoidMethodTestCallbackInterfaceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::raisesExceptionVoidMethodTestCallbackInterfaceArgMethod(info);
 }
 
@@ -10257,7 +10257,7 @@
   }
 }
 
-void raisesExceptionVoidMethodOptionalTestCallbackInterfaceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void raisesExceptionVoidMethodOptionalTestCallbackInterfaceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::raisesExceptionVoidMethodOptionalTestCallbackInterfaceArgMethod(info);
 }
 
@@ -10273,7 +10273,7 @@
   v8SetReturnValue(info, result);
 }
 
-void raisesExceptionTestInterfaceEmptyVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void raisesExceptionTestInterfaceEmptyVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::raisesExceptionTestInterfaceEmptyVoidMethodMethod(info);
 }
 
@@ -10289,7 +10289,7 @@
   v8SetReturnValue(info, result);
 }
 
-void raisesExceptionXPathNSResolverVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void raisesExceptionXPathNSResolverVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::raisesExceptionXPathNSResolverVoidMethodMethod(info);
 }
 
@@ -10315,7 +10315,7 @@
   }
 }
 
-void callWithExecutionContextRaisesExceptionVoidMethodLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void callWithExecutionContextRaisesExceptionVoidMethodLongArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::callWithExecutionContextRaisesExceptionVoidMethodLongArgMethod(info);
 }
 
@@ -10325,7 +10325,7 @@
   impl->runtimeEnabledVoidMethod();
 }
 
-void runtimeEnabledVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void runtimeEnabledVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::runtimeEnabledVoidMethodMethod(info);
 }
 
@@ -10335,7 +10335,7 @@
   impl->perWorldBindingsRuntimeEnabledVoidMethod();
 }
 
-void perWorldBindingsRuntimeEnabledVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void perWorldBindingsRuntimeEnabledVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::perWorldBindingsRuntimeEnabledVoidMethodMethod(info);
 }
 
@@ -10345,7 +10345,7 @@
   impl->perWorldBindingsRuntimeEnabledVoidMethod();
 }
 
-void perWorldBindingsRuntimeEnabledVoidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void perWorldBindingsRuntimeEnabledVoidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::perWorldBindingsRuntimeEnabledVoidMethodMethodForMainWorld(info);
 }
 
@@ -10405,7 +10405,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void runtimeEnabledOverloadedVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void runtimeEnabledOverloadedVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::runtimeEnabledOverloadedVoidMethodMethod(info);
 }
 
@@ -10541,7 +10541,7 @@
   exceptionState.throwTypeError("No function was found that matched the signature provided.");
 }
 
-void partiallyRuntimeEnabledOverloadedVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void partiallyRuntimeEnabledOverloadedVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::partiallyRuntimeEnabledOverloadedVoidMethodMethod(info);
 }
 
@@ -10559,7 +10559,7 @@
   impl->legacyInterfaceTypeCheckingVoidMethodTestInterfaceEmptyArg(testInterfaceEmptyArg);
 }
 
-void legacyInterfaceTypeCheckingVoidMethodTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void legacyInterfaceTypeCheckingVoidMethodTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::legacyInterfaceTypeCheckingVoidMethodTestInterfaceEmptyArgMethod(info);
 }
 
@@ -10581,7 +10581,7 @@
   impl->legacyInterfaceTypeCheckingVoidMethodTestInterfaceEmptyVariadicArg(testInterfaceEmptyArg);
 }
 
-void legacyInterfaceTypeCheckingVoidMethodTestInterfaceEmptyVariadicArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void legacyInterfaceTypeCheckingVoidMethodTestInterfaceEmptyVariadicArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::legacyInterfaceTypeCheckingVoidMethodTestInterfaceEmptyVariadicArgMethod(info);
 }
 
@@ -10622,7 +10622,7 @@
   impl->useToImpl4ArgumentsCheckingIfPossibleWithOptionalArg(node1, node2);
 }
 
-void useToImpl4ArgumentsCheckingIfPossibleWithOptionalArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void useToImpl4ArgumentsCheckingIfPossibleWithOptionalArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::useToImpl4ArgumentsCheckingIfPossibleWithOptionalArgMethod(info);
 }
 
@@ -10653,7 +10653,7 @@
   impl->useToImpl4ArgumentsCheckingIfPossibleWithNullableArg(node1, node2);
 }
 
-void useToImpl4ArgumentsCheckingIfPossibleWithNullableArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void useToImpl4ArgumentsCheckingIfPossibleWithNullableArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::useToImpl4ArgumentsCheckingIfPossibleWithNullableArgMethod(info);
 }
 
@@ -10684,7 +10684,7 @@
   impl->useToImpl4ArgumentsCheckingIfPossibleWithUndefinedArg(node1, node2);
 }
 
-void useToImpl4ArgumentsCheckingIfPossibleWithUndefinedArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void useToImpl4ArgumentsCheckingIfPossibleWithUndefinedArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::useToImpl4ArgumentsCheckingIfPossibleWithUndefinedArgMethod(info);
 }
 
@@ -10694,7 +10694,7 @@
   impl->unforgeableVoidMethod();
 }
 
-void unforgeableVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void unforgeableVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::unforgeableVoidMethodMethod(info);
 }
 
@@ -10716,7 +10716,7 @@
   impl->voidMethodTestInterfaceGarbageCollectedSequenceArg(testInterfaceGarbageCollectedSequenceArg);
 }
 
-void voidMethodTestInterfaceGarbageCollectedSequenceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestInterfaceGarbageCollectedSequenceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodTestInterfaceGarbageCollectedSequenceArgMethod(info);
 }
 
@@ -10738,7 +10738,7 @@
   impl->voidMethodTestInterfaceGarbageCollectedArrayArg(testInterfaceGarbageCollectedArrayArg);
 }
 
-void voidMethodTestInterfaceGarbageCollectedArrayArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestInterfaceGarbageCollectedArrayArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::voidMethodTestInterfaceGarbageCollectedArrayArgMethod(info);
 }
 
@@ -10752,7 +10752,7 @@
   v8SetReturnValue(info, result);
 }
 
-void newObjectTestInterfaceMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void newObjectTestInterfaceMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::newObjectTestInterfaceMethodMethod(info);
 }
 
@@ -10762,7 +10762,7 @@
   v8SetReturnValueString(info, impl->serializerMethod(), info.GetIsolate());
 }
 
-void serializerMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void serializerMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::serializerMethodMethod(info);
 }
 
@@ -10780,7 +10780,7 @@
   v8SetReturnValue(info, result);
 }
 
-void keysMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void keysMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::keysMethod(info);
 }
 
@@ -10798,7 +10798,7 @@
   v8SetReturnValue(info, result);
 }
 
-void valuesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void valuesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::valuesMethod(info);
 }
 
@@ -10816,7 +10816,7 @@
   v8SetReturnValue(info, result);
 }
 
-void entriesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void entriesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::entriesMethod(info);
 }
 
@@ -10849,7 +10849,7 @@
   }
 }
 
-void forEachMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void forEachMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::forEachMethod(info);
 }
 
@@ -10877,7 +10877,7 @@
   v8SetReturnValueBool(info, result);
 }
 
-void hasMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void hasMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::hasMethod(info);
 }
 
@@ -10905,7 +10905,7 @@
   v8SetReturnValue(info, result.v8Value());
 }
 
-void getMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void getMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::getMethod(info);
 }
 
@@ -10922,7 +10922,7 @@
   }
 }
 
-void clearMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void clearMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::clearMethod(info);
 }
 
@@ -10950,7 +10950,7 @@
   v8SetReturnValueBool(info, result);
 }
 
-void deleteMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void deleteMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::deleteMethod(info);
 }
 
@@ -10983,7 +10983,7 @@
   v8SetReturnValue(info, result);
 }
 
-void setMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void setMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::setMethod(info);
 }
 
@@ -10993,7 +10993,7 @@
   v8SetReturnValueString(info, impl->serializerMethod(), info.GetIsolate());
 }
 
-void toJSONMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void toJSONMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::toJSONMethod(info);
 }
 
@@ -11003,7 +11003,7 @@
   v8SetReturnValueString(info, impl->stringifierAttribute(), info.GetIsolate());
 }
 
-void toStringMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void toStringMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::toStringMethod(info);
 }
 
@@ -11021,7 +11021,7 @@
   v8SetReturnValue(info, result);
 }
 
-void iteratorMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void iteratorMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::iteratorMethod(info);
 }
 
@@ -11035,7 +11035,7 @@
   v8SetReturnValue(info, result.v8Value());
 }
 
-void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -11057,7 +11057,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -11076,7 +11076,7 @@
   v8SetReturnValue(info, result == DeleteSuccess);
 }
 
-void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -11097,7 +11097,7 @@
   v8SetReturnValueInt(info, v8::None);
 }
 
-void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
+CORE_EXPORT void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -11117,7 +11117,7 @@
   v8SetReturnValue(info, ToV8(names, info.Holder(), info.GetIsolate()).As<v8::Array>());
 }
 
-void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
+CORE_EXPORT void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
   TestObjectV8Internal::namedPropertyEnumerator(info);
 }
 
@@ -11136,7 +11136,7 @@
   v8SetReturnValue(info, result.v8Value());
 }
 
-void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::indexedPropertyGetter(index, info);
 }
 
@@ -11153,7 +11153,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestObjectV8Internal::indexedPropertySetter(index, v8Value, info);
 }
 
@@ -11171,7 +11171,7 @@
   v8SetReturnValue(info, result == DeleteSuccess);
 }
 
-void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+CORE_EXPORT void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   TestObjectV8Internal::indexedPropertyDeleter(index, info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.cpp
index bba2b50..61a67c10 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperations.cpp
@@ -77,7 +77,7 @@
   v8SetReturnValue(info, result);
 }
 
-void namedItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void namedItemMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestSpecialOperationsV8Internal::namedItemMethod(info);
 }
 
@@ -90,7 +90,7 @@
   v8SetReturnValue(info, result);
 }
 
-void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -112,7 +112,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -132,7 +132,7 @@
   v8SetReturnValueInt(info, v8::None);
 }
 
-void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
+CORE_EXPORT void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -152,17 +152,17 @@
   v8SetReturnValue(info, ToV8(names, info.Holder(), info.GetIsolate()).As<v8::Array>());
 }
 
-void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
+CORE_EXPORT void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
   TestSpecialOperationsV8Internal::namedPropertyEnumerator(info);
 }
 
-void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
   const AtomicString& propertyName = AtomicString::number(index);
 
   TestSpecialOperationsV8Internal::namedPropertyGetter(propertyName, info);
 }
 
-void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   const AtomicString& propertyName = AtomicString::number(index);
 
   TestSpecialOperationsV8Internal::namedPropertySetter(propertyName, v8Value, info);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperationsNotEnumerable.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperationsNotEnumerable.cpp
index d3d2319..267df7c 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperationsNotEnumerable.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestSpecialOperationsNotEnumerable.cpp
@@ -60,7 +60,7 @@
   v8SetReturnValueString(info, result, info.GetIsolate());
 }
 
-void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -82,7 +82,7 @@
   v8SetReturnValueString(info, result, info.GetIsolate());
 }
 
-void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestSpecialOperationsNotEnumerableV8Internal::indexedPropertyGetter(index, info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.cpp
index a7638b60..41e0fa9 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestTypedefs.cpp
@@ -66,7 +66,7 @@
   v8SetReturnValue(info, static_cast<double>(impl->uLongLongAttribute()));
 }
 
-void uLongLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void uLongLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestTypedefsV8Internal::uLongLongAttributeAttributeGetter(info);
 }
 
@@ -84,7 +84,7 @@
   impl->setULongLongAttribute(cppValue);
 }
 
-void uLongLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void uLongLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestTypedefsV8Internal::uLongLongAttributeAttributeSetter(v8Value, info);
@@ -101,7 +101,7 @@
   v8SetReturnValue(info, result);
 }
 
-void domStringOrDoubleOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void domStringOrDoubleOrNullAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestTypedefsV8Internal::domStringOrDoubleOrNullAttributeAttributeGetter(info);
 }
 
@@ -120,7 +120,7 @@
   impl->setDomStringOrDoubleOrNullAttribute(cppValue);
 }
 
-void domStringOrDoubleOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT void domStringOrDoubleOrNullAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestTypedefsV8Internal::domStringOrDoubleOrNullAttributeAttributeSetter(v8Value, info);
@@ -149,7 +149,7 @@
   impl->voidMethodArrayOfLongsArg(arrayOfLongsArg);
 }
 
-void voidMethodArrayOfLongsArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodArrayOfLongsArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestTypedefsV8Internal::voidMethodArrayOfLongsArgMethod(info);
 }
 
@@ -176,7 +176,7 @@
   impl->voidMethodFloatArgStringArg(floatArg, stringArg);
 }
 
-void voidMethodFloatArgStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodFloatArgStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestTypedefsV8Internal::voidMethodFloatArgStringArgMethod(info);
 }
 
@@ -199,7 +199,7 @@
   impl->voidMethodTestCallbackInterfaceTypeArg(testCallbackInterfaceTypeArg);
 }
 
-void voidMethodTestCallbackInterfaceTypeArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void voidMethodTestCallbackInterfaceTypeArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestTypedefsV8Internal::voidMethodTestCallbackInterfaceTypeArgMethod(info);
 }
 
@@ -221,7 +221,7 @@
   v8SetReturnValue(info, static_cast<double>(impl->uLongLongMethodTestInterfaceEmptyTypeSequenceArg(testInterfaceEmptyTypeSequenceArg)));
 }
 
-void uLongLongMethodTestInterfaceEmptyTypeSequenceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void uLongLongMethodTestInterfaceEmptyTypeSequenceArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestTypedefsV8Internal::uLongLongMethodTestInterfaceEmptyTypeSequenceArgMethod(info);
 }
 
@@ -233,7 +233,7 @@
   v8SetReturnValue(info, result);
 }
 
-void testInterfaceOrTestInterfaceEmptyMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void testInterfaceOrTestInterfaceEmptyMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestTypedefsV8Internal::testInterfaceOrTestInterfaceEmptyMethodMethod(info);
 }
 
@@ -245,7 +245,7 @@
   v8SetReturnValue(info, result);
 }
 
-void domStringOrDoubleMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void domStringOrDoubleMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestTypedefsV8Internal::domStringOrDoubleMethodMethod(info);
 }
 
@@ -267,7 +267,7 @@
   v8SetReturnValue(info, ToV8(impl->arrayOfStringsMethodArrayOfStringsArg(arrayOfStringsArg), info.Holder(), info.GetIsolate()));
 }
 
-void arrayOfStringsMethodArrayOfStringsArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void arrayOfStringsMethodArrayOfStringsArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestTypedefsV8Internal::arrayOfStringsMethodArrayOfStringsArgMethod(info);
 }
 
@@ -289,7 +289,7 @@
   v8SetReturnValue(info, ToV8(impl->stringArrayMethodStringArrayArg(stringArrayArg), info.Holder(), info.GetIsolate()));
 }
 
-void stringArrayMethodStringArrayArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+CORE_EXPORT  void stringArrayMethodStringArrayArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestTypedefsV8Internal::stringArrayMethodStringArrayArgMethod(info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface2Partial.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface2Partial.cpp
index 84203557..fdd8eb1 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface2Partial.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface2Partial.cpp
@@ -45,7 +45,7 @@
   TestInterface2Partial::voidMethodPartial1(*impl, value);
 }
 
-void voidMethodPartial1MethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+ void voidMethodPartial1MethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2PartialV8Internal::voidMethodPartial1Method(info);
 }
 
@@ -65,7 +65,7 @@
   TestInterface2Partial2::voidMethodPartial2(*impl, value);
 }
 
-void voidMethodPartial2MethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+ void voidMethodPartial2MethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface2PartialV8Internal::voidMethodPartial2Method(info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
index 9c2d7bf..ac6487c 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
@@ -69,7 +69,7 @@
   v8SetReturnValueFast(info, WTF::getPtr(impl->testInterfaceAttribute()), impl);
 }
 
-void testInterfaceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void testInterfaceAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::testInterfaceAttributeAttributeGetter(info);
 }
 
@@ -91,7 +91,7 @@
   impl->setTestInterfaceAttribute(cppValue);
 }
 
-void testInterfaceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void testInterfaceAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterface5ImplementationV8Internal::testInterfaceAttributeAttributeSetter(v8Value, info);
@@ -105,7 +105,7 @@
   v8SetReturnValue(info, impl->doubleAttribute());
 }
 
-void doubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void doubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::doubleAttributeAttributeGetter(info);
 }
 
@@ -123,7 +123,7 @@
   impl->setDoubleAttribute(cppValue);
 }
 
-void doubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void doubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterface5ImplementationV8Internal::doubleAttributeAttributeSetter(v8Value, info);
@@ -137,7 +137,7 @@
   v8SetReturnValue(info, impl->floatAttribute());
 }
 
-void floatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void floatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::floatAttributeAttributeGetter(info);
 }
 
@@ -155,7 +155,7 @@
   impl->setFloatAttribute(cppValue);
 }
 
-void floatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void floatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterface5ImplementationV8Internal::floatAttributeAttributeSetter(v8Value, info);
@@ -169,7 +169,7 @@
   v8SetReturnValue(info, impl->unrestrictedDoubleAttribute());
 }
 
-void unrestrictedDoubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void unrestrictedDoubleAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::unrestrictedDoubleAttributeAttributeGetter(info);
 }
 
@@ -187,7 +187,7 @@
   impl->setUnrestrictedDoubleAttribute(cppValue);
 }
 
-void unrestrictedDoubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void unrestrictedDoubleAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterface5ImplementationV8Internal::unrestrictedDoubleAttributeAttributeSetter(v8Value, info);
@@ -201,7 +201,7 @@
   v8SetReturnValue(info, impl->unrestrictedFloatAttribute());
 }
 
-void unrestrictedFloatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void unrestrictedFloatAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::unrestrictedFloatAttributeAttributeGetter(info);
 }
 
@@ -219,7 +219,7 @@
   impl->setUnrestrictedFloatAttribute(cppValue);
 }
 
-void unrestrictedFloatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void unrestrictedFloatAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterface5ImplementationV8Internal::unrestrictedFloatAttributeAttributeSetter(v8Value, info);
@@ -229,7 +229,7 @@
   v8SetReturnValueString(info, TestInterface5Implementation::staticStringAttribute(), info.GetIsolate());
 }
 
-void staticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void staticStringAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::staticStringAttributeAttributeGetter(info);
 }
 
@@ -242,7 +242,7 @@
   TestInterface5Implementation::setStaticStringAttribute(cppValue);
 }
 
-void staticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void staticStringAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterface5ImplementationV8Internal::staticStringAttributeAttributeSetter(v8Value, info);
@@ -256,7 +256,7 @@
   v8SetReturnValueInt(info, impl->alwaysExposedAttribute());
 }
 
-void alwaysExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void alwaysExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::alwaysExposedAttributeAttributeGetter(info);
 }
 
@@ -274,7 +274,7 @@
   impl->setAlwaysExposedAttribute(cppValue);
 }
 
-void alwaysExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void alwaysExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterface5ImplementationV8Internal::alwaysExposedAttributeAttributeSetter(v8Value, info);
@@ -288,7 +288,7 @@
   v8SetReturnValueInt(info, impl->workerExposedAttribute());
 }
 
-void workerExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void workerExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::workerExposedAttributeAttributeGetter(info);
 }
 
@@ -306,7 +306,7 @@
   impl->setWorkerExposedAttribute(cppValue);
 }
 
-void workerExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void workerExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterface5ImplementationV8Internal::workerExposedAttributeAttributeSetter(v8Value, info);
@@ -320,7 +320,7 @@
   v8SetReturnValueInt(info, impl->windowExposedAttribute());
 }
 
-void windowExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void windowExposedAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::windowExposedAttributeAttributeGetter(info);
 }
 
@@ -338,7 +338,7 @@
   impl->setWindowExposedAttribute(cppValue);
 }
 
-void windowExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void windowExposedAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Value> v8Value = info[0];
 
   TestInterface5ImplementationV8Internal::windowExposedAttributeAttributeSetter(v8Value, info);
@@ -363,7 +363,7 @@
   impl->voidMethodTestInterfaceEmptyArg(testInterfaceEmptyArg);
 }
 
-void voidMethodTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void voidMethodTestInterfaceEmptyArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::voidMethodTestInterfaceEmptyArgMethod(info);
 }
 
@@ -390,7 +390,7 @@
   impl->voidMethodDoubleArgFloatArg(doubleArg, floatArg);
 }
 
-void voidMethodDoubleArgFloatArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void voidMethodDoubleArgFloatArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::voidMethodDoubleArgFloatArgMethod(info);
 }
 
@@ -417,7 +417,7 @@
   impl->voidMethodUnrestrictedDoubleArgUnrestrictedFloatArg(unrestrictedDoubleArg, unrestrictedFloatArg);
 }
 
-void voidMethodUnrestrictedDoubleArgUnrestrictedFloatArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void voidMethodUnrestrictedDoubleArgUnrestrictedFloatArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::voidMethodUnrestrictedDoubleArgUnrestrictedFloatArgMethod(info);
 }
 
@@ -427,7 +427,7 @@
   impl->voidMethod();
 }
 
-void voidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void voidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::voidMethodMethod(info);
 }
 
@@ -437,7 +437,7 @@
   impl->voidMethod();
 }
 
-void voidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void voidMethodMethodCallbackForMainWorld(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::voidMethodMethodForMainWorld(info);
 }
 
@@ -447,7 +447,7 @@
   impl->alwaysExposedMethod();
 }
 
-void alwaysExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void alwaysExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::alwaysExposedMethodMethod(info);
 }
 
@@ -457,7 +457,7 @@
   impl->workerExposedMethod();
 }
 
-void workerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void workerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::workerExposedMethodMethod(info);
 }
 
@@ -467,7 +467,7 @@
   impl->windowExposedMethod();
 }
 
-void windowExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void windowExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::windowExposedMethodMethod(info);
 }
 
@@ -475,7 +475,7 @@
   TestInterface5Implementation::alwaysExposedStaticMethod();
 }
 
-void alwaysExposedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void alwaysExposedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::alwaysExposedStaticMethodMethod(info);
 }
 
@@ -483,7 +483,7 @@
   TestInterface5Implementation::workerExposedStaticMethod();
 }
 
-void workerExposedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void workerExposedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::workerExposedStaticMethodMethod(info);
 }
 
@@ -491,7 +491,7 @@
   TestInterface5Implementation::windowExposedStaticMethod();
 }
 
-void windowExposedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void windowExposedStaticMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::windowExposedStaticMethodMethod(info);
 }
 
@@ -501,7 +501,7 @@
   impl->windowAndServiceWorkerExposedMethod();
 }
 
-void windowAndServiceWorkerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void windowAndServiceWorkerExposedMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::windowAndServiceWorkerExposedMethodMethod(info);
 }
 
@@ -523,7 +523,7 @@
   impl->voidMethodBooleanOrDOMStringArg(arg);
 }
 
-void voidMethodBooleanOrDOMStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void voidMethodBooleanOrDOMStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::voidMethodBooleanOrDOMStringArgMethod(info);
 }
 
@@ -545,7 +545,7 @@
   impl->voidMethodDoubleOrDOMStringArg(arg);
 }
 
-void voidMethodDoubleOrDOMStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void voidMethodDoubleOrDOMStringArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::voidMethodDoubleOrDOMStringArgMethod(info);
 }
 
@@ -568,7 +568,7 @@
   impl->voidMethodVoidExperimentalCallbackFunction(arg);
 }
 
-void voidMethodVoidExperimentalCallbackFunctionMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void voidMethodVoidExperimentalCallbackFunctionMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::voidMethodVoidExperimentalCallbackFunctionMethod(info);
 }
 
@@ -591,7 +591,7 @@
   impl->voidMethodVoidCallbackFunctionModulesArg(arg);
 }
 
-void voidMethodVoidCallbackFunctionModulesArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void voidMethodVoidCallbackFunctionModulesArgMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::voidMethodVoidCallbackFunctionModulesArgMethod(info);
 }
 
@@ -609,7 +609,7 @@
   v8SetReturnValue(info, result);
 }
 
-void keysMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void keysMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::keysMethod(info);
 }
 
@@ -627,7 +627,7 @@
   v8SetReturnValue(info, result);
 }
 
-void valuesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void valuesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::valuesMethod(info);
 }
 
@@ -645,7 +645,7 @@
   v8SetReturnValue(info, result);
 }
 
-void entriesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void entriesMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::entriesMethod(info);
 }
 
@@ -678,7 +678,7 @@
   }
 }
 
-void forEachMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void forEachMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::forEachMethod(info);
 }
 
@@ -688,7 +688,7 @@
   v8SetReturnValueString(info, impl->toString(), info.GetIsolate());
 }
 
-void toStringMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void toStringMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::toStringMethod(info);
 }
 
@@ -706,7 +706,7 @@
   v8SetReturnValue(info, result);
 }
 
-void iteratorMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT  void iteratorMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::iteratorMethod(info);
 }
 
@@ -718,7 +718,7 @@
   v8SetReturnValueString(info, result, info.GetIsolate());
 }
 
-void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void namedPropertyGetterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -738,7 +738,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void namedPropertySetterCallback(v8::Local<v8::Name> name, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -755,7 +755,7 @@
   v8SetReturnValue(info, result == DeleteSuccess);
 }
 
-void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+MODULES_EXPORT void namedPropertyDeleterCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -775,7 +775,7 @@
   v8SetReturnValueInt(info, v8::None);
 }
 
-void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
+MODULES_EXPORT void namedPropertyQueryCallback(v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) {
   if (!name->IsString())
     return;
   const AtomicString& propertyName = toCoreAtomicString(name.As<v8::String>());
@@ -795,7 +795,7 @@
   v8SetReturnValue(info, ToV8(names, info.Holder(), info.GetIsolate()).As<v8::Array>());
 }
 
-void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
+MODULES_EXPORT void namedPropertyEnumeratorCallback(const v8::PropertyCallbackInfo<v8::Array>& info) {
   TestInterface5ImplementationV8Internal::namedPropertyEnumerator(info);
 }
 
@@ -813,7 +813,7 @@
   v8SetReturnValueString(info, result, info.GetIsolate());
 }
 
-void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void indexedPropertyGetterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::indexedPropertyGetter(index, info);
 }
 
@@ -829,7 +829,7 @@
   v8SetReturnValue(info, v8Value);
 }
 
-void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
+MODULES_EXPORT void indexedPropertySetterCallback(uint32_t index, v8::Local<v8::Value> v8Value, const v8::PropertyCallbackInfo<v8::Value>& info) {
   TestInterface5ImplementationV8Internal::indexedPropertySetter(index, v8Value, info);
 }
 
@@ -842,7 +842,7 @@
   v8SetReturnValue(info, result == DeleteSuccess);
 }
 
-void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
+MODULES_EXPORT void indexedPropertyDeleterCallback(uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean>& info) {
   TestInterface5ImplementationV8Internal::indexedPropertyDeleter(index, info);
 }
 
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp
index 5d4b26a8..51d79566 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp
@@ -310,7 +310,7 @@
   TestInterfacePartial3Implementation::partialVoidTestEnumModulesArgMethod(*impl, arg);
 }
 
-void partialVoidTestEnumModulesArgMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+ void partialVoidTestEnumModulesArgMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationPartialV8Internal::partialVoidTestEnumModulesArgMethodMethod(info);
 }
 
@@ -351,7 +351,7 @@
   TestInterfacePartial3Implementation::unscopableVoidMethod(*impl);
 }
 
-void unscopableVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+ void unscopableVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationPartialV8Internal::unscopableVoidMethodMethod(info);
 }
 
@@ -361,7 +361,7 @@
   TestInterfacePartial4::partial4VoidMethod(*impl);
 }
 
-void partial4VoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+ void partial4VoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationPartialV8Internal::partial4VoidMethodMethod(info);
 }
 
@@ -369,7 +369,7 @@
   TestInterfacePartial4::partial4StaticVoidMethod();
 }
 
-void partial4StaticVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+ void partial4StaticVoidMethodMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationPartialV8Internal::partial4StaticVoidMethodMethod(info);
 }
 
diff --git a/third_party/WebKit/Source/core/css/BUILD.gn b/third_party/WebKit/Source/core/css/BUILD.gn
index eeeb3df..9bc7288 100644
--- a/third_party/WebKit/Source/core/css/BUILD.gn
+++ b/third_party/WebKit/Source/core/css/BUILD.gn
@@ -349,9 +349,11 @@
     "properties/CSSPropertyAPIClip.cpp",
     "properties/CSSPropertyAPIColumnGap.cpp",
     "properties/CSSPropertyAPIContain.cpp",
+    "properties/CSSPropertyAPIContent.cpp",
     "properties/CSSPropertyAPICursor.cpp",
     "properties/CSSPropertyAPIFlexBasis.cpp",
     "properties/CSSPropertyAPIFontSizeAdjust.cpp",
+    "properties/CSSPropertyAPIFontVariantCaps.cpp",
     "properties/CSSPropertyAPIFontVariantLigatures.cpp",
     "properties/CSSPropertyAPIFontVariationSettings.cpp",
     "properties/CSSPropertyAPILetterAndWordSpacing.cpp",
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.in b/third_party/WebKit/Source/core/css/CSSProperties.in
index 6f45c528..e60f292 100644
--- a/third_party/WebKit/Source/core/css/CSSProperties.in
+++ b/third_party/WebKit/Source/core/css/CSSProperties.in
@@ -175,7 +175,7 @@
 font-stretch inherited, font, type_name=FontStretch, name_for_methods=Stretch, priority=High
 font-style inherited, font, type_name=FontStyle, name_for_methods=Style, priority=High
 font-variant-ligatures inherited, font, type_name=VariantLigatures, name_for_methods=VariantLigatures, converter=convertFontVariantLigatures, priority=High, api_class
-font-variant-caps inherited, font, name_for_methods=VariantCaps, converter=convertFontVariantCaps, priority=High
+font-variant-caps inherited, font, name_for_methods=VariantCaps, converter=convertFontVariantCaps, priority=High, api_class
 font-variant-numeric inherited, font, name_for_methods=VariantNumeric, converter=convertFontVariantNumeric, priority=High
 font-weight interpolable, inherited, font, type_name=FontWeight, name_for_methods=Weight, converter=convertFontWeight, priority=High
 font-feature-settings inherited, font, name_for_methods=FeatureSettings, converter=convertFontFeatureSettings, priority=High
@@ -247,7 +247,7 @@
 color-rendering inherited, svg
 column-fill type_name=ColumnFill
 contain runtime_flag=CSSContainment, converter=convertFlags<Containment>, api_class
-content custom_all, typedom_types=[Image], repeated
+content custom_all, typedom_types=[Image], repeated, api_class
 counter-increment custom_all
 counter-reset custom_all
 cursor inherited, custom_all, api_class
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
index a0887600..84588d20 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -8,7 +8,6 @@
 #include "core/css/CSSBasicShapeValues.h"
 #include "core/css/CSSBorderImage.h"
 #include "core/css/CSSContentDistributionValue.h"
-#include "core/css/CSSCounterValue.h"
 #include "core/css/CSSCursorImageValue.h"
 #include "core/css/CSSCustomIdentValue.h"
 #include "core/css/CSSFontFaceSrcValue.h"
@@ -337,12 +336,6 @@
   return consumeString(range);
 }
 
-static CSSIdentifierValue* consumeFontVariantCaps(CSSParserTokenRange& range) {
-  return consumeIdent<CSSValueNormal, CSSValueSmallCaps, CSSValueAllSmallCaps,
-                      CSSValuePetiteCaps, CSSValueAllPetiteCaps,
-                      CSSValueUnicase, CSSValueTitlingCaps>(range);
-}
-
 class FontVariantNumericParser {
   STACK_ALLOCATED();
 
@@ -1475,89 +1468,6 @@
                                 UnitlessQuirk::Forbid);
 }
 
-static CSSValue* consumeAttr(CSSParserTokenRange args,
-                             const CSSParserContext* context) {
-  if (args.peek().type() != IdentToken)
-    return nullptr;
-
-  AtomicString attrName =
-      args.consumeIncludingWhitespace().value().toAtomicString();
-  if (!args.atEnd())
-    return nullptr;
-
-  // TODO(esprehn): This should be lowerASCII().
-  if (context->isHTMLDocument())
-    attrName = attrName.lower();
-
-  CSSFunctionValue* attrValue = CSSFunctionValue::create(CSSValueAttr);
-  attrValue->append(*CSSCustomIdentValue::create(attrName));
-  return attrValue;
-}
-
-static CSSValue* consumeCounterContent(CSSParserTokenRange args,
-                                       bool counters) {
-  CSSCustomIdentValue* identifier = consumeCustomIdent(args);
-  if (!identifier)
-    return nullptr;
-
-  CSSStringValue* separator = nullptr;
-  if (!counters) {
-    separator = CSSStringValue::create(String());
-  } else {
-    if (!consumeCommaIncludingWhitespace(args) ||
-        args.peek().type() != StringToken)
-      return nullptr;
-    separator = CSSStringValue::create(
-        args.consumeIncludingWhitespace().value().toString());
-  }
-
-  CSSIdentifierValue* listStyle = nullptr;
-  if (consumeCommaIncludingWhitespace(args)) {
-    CSSValueID id = args.peek().id();
-    if ((id != CSSValueNone &&
-         (id < CSSValueDisc || id > CSSValueKatakanaIroha)))
-      return nullptr;
-    listStyle = consumeIdent(args);
-  } else {
-    listStyle = CSSIdentifierValue::create(CSSValueDecimal);
-  }
-
-  if (!args.atEnd())
-    return nullptr;
-  return CSSCounterValue::create(identifier, listStyle, separator);
-}
-
-static CSSValue* consumeContent(CSSParserTokenRange& range,
-                                const CSSParserContext* context) {
-  if (identMatches<CSSValueNone, CSSValueNormal>(range.peek().id()))
-    return consumeIdent(range);
-
-  CSSValueList* values = CSSValueList::createSpaceSeparated();
-
-  do {
-    CSSValue* parsedValue = consumeImage(range, context);
-    if (!parsedValue)
-      parsedValue =
-          consumeIdent<CSSValueOpenQuote, CSSValueCloseQuote,
-                       CSSValueNoOpenQuote, CSSValueNoCloseQuote>(range);
-    if (!parsedValue)
-      parsedValue = consumeString(range);
-    if (!parsedValue) {
-      if (range.peek().functionId() == CSSValueAttr)
-        parsedValue = consumeAttr(consumeFunction(range), context);
-      else if (range.peek().functionId() == CSSValueCounter)
-        parsedValue = consumeCounterContent(consumeFunction(range), false);
-      else if (range.peek().functionId() == CSSValueCounters)
-        parsedValue = consumeCounterContent(consumeFunction(range), true);
-      if (!parsedValue)
-        return nullptr;
-    }
-    values->append(*parsedValue);
-  } while (!range.atEnd());
-
-  return values;
-}
-
 static CSSValue* consumePerspective(CSSParserTokenRange& range,
                                     const CSSParserContext* context,
                                     CSSPropertyID unresolvedProperty) {
@@ -2733,8 +2643,6 @@
   switch (property) {
     case CSSPropertyWebkitHighlight:
       return consumeWebkitHighlight(m_range);
-    case CSSPropertyFontVariantCaps:
-      return consumeFontVariantCaps(m_range);
     case CSSPropertyFontVariantNumeric:
       return consumeFontVariantNumeric(m_range);
     case CSSPropertyFontFeatureSettings:
@@ -2963,8 +2871,6 @@
     case CSSPropertyRx:
     case CSSPropertyRy:
       return consumeRxOrRy(m_range);
-    case CSSPropertyContent:
-      return consumeContent(m_range, m_context);
     case CSSPropertyListStyleImage:
     case CSSPropertyBorderImageSource:
     case CSSPropertyWebkitMaskBoxImageSource:
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIContent.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIContent.cpp
new file mode 100644
index 0000000..401b6250
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIContent.cpp
@@ -0,0 +1,112 @@
+// 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 "core/css/properties/CSSPropertyAPIContent.h"
+
+#include "core/CSSValueKeywords.h"
+#include "core/css/CSSCounterValue.h"
+#include "core/css/CSSFunctionValue.h"
+#include "core/css/CSSStringValue.h"
+#include "core/css/CSSValueList.h"
+#include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+
+namespace blink {
+
+namespace {
+
+CSSValue* consumeAttr(CSSParserTokenRange args,
+                      const CSSParserContext* context) {
+  if (args.peek().type() != IdentToken)
+    return nullptr;
+
+  AtomicString attrName =
+      args.consumeIncludingWhitespace().value().toAtomicString();
+  if (!args.atEnd())
+    return nullptr;
+
+  // TODO(esprehn): This should be lowerASCII().
+  if (context->isHTMLDocument())
+    attrName = attrName.lower();
+
+  CSSFunctionValue* attrValue = CSSFunctionValue::create(CSSValueAttr);
+  attrValue->append(*CSSCustomIdentValue::create(attrName));
+  return attrValue;
+}
+
+CSSValue* consumeCounterContent(CSSParserTokenRange args, bool counters) {
+  CSSCustomIdentValue* identifier =
+      CSSPropertyParserHelpers::consumeCustomIdent(args);
+  if (!identifier)
+    return nullptr;
+
+  CSSStringValue* separator = nullptr;
+  if (!counters) {
+    separator = CSSStringValue::create(String());
+  } else {
+    if (!CSSPropertyParserHelpers::consumeCommaIncludingWhitespace(args) ||
+        args.peek().type() != StringToken)
+      return nullptr;
+    separator = CSSStringValue::create(
+        args.consumeIncludingWhitespace().value().toString());
+  }
+
+  CSSIdentifierValue* listStyle = nullptr;
+  if (CSSPropertyParserHelpers::consumeCommaIncludingWhitespace(args)) {
+    CSSValueID id = args.peek().id();
+    if ((id != CSSValueNone &&
+         (id < CSSValueDisc || id > CSSValueKatakanaIroha)))
+      return nullptr;
+    listStyle = CSSPropertyParserHelpers::consumeIdent(args);
+  } else {
+    listStyle = CSSIdentifierValue::create(CSSValueDecimal);
+  }
+
+  if (!args.atEnd())
+    return nullptr;
+  return CSSCounterValue::create(identifier, listStyle, separator);
+}
+
+}  // namespace
+
+const CSSValue* CSSPropertyAPIContent::parseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext* context) {
+  if (CSSPropertyParserHelpers::identMatches<CSSValueNone, CSSValueNormal>(
+          range.peek().id()))
+    return CSSPropertyParserHelpers::consumeIdent(range);
+
+  CSSValueList* values = CSSValueList::createSpaceSeparated();
+
+  do {
+    CSSValue* parsedValue =
+        CSSPropertyParserHelpers::consumeImage(range, context);
+    if (!parsedValue) {
+      parsedValue = CSSPropertyParserHelpers::consumeIdent<
+          CSSValueOpenQuote, CSSValueCloseQuote, CSSValueNoOpenQuote,
+          CSSValueNoCloseQuote>(range);
+    }
+    if (!parsedValue)
+      parsedValue = CSSPropertyParserHelpers::consumeString(range);
+    if (!parsedValue) {
+      if (range.peek().functionId() == CSSValueAttr) {
+        parsedValue = consumeAttr(
+            CSSPropertyParserHelpers::consumeFunction(range), context);
+      } else if (range.peek().functionId() == CSSValueCounter) {
+        parsedValue = consumeCounterContent(
+            CSSPropertyParserHelpers::consumeFunction(range), false);
+      } else if (range.peek().functionId() == CSSValueCounters) {
+        parsedValue = consumeCounterContent(
+            CSSPropertyParserHelpers::consumeFunction(range), true);
+      }
+      if (!parsedValue)
+        return nullptr;
+    }
+    values->append(*parsedValue);
+  } while (!range.atEnd());
+
+  return values;
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIFontVariantCaps.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIFontVariantCaps.cpp
new file mode 100644
index 0000000..de5e2b8
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyAPIFontVariantCaps.cpp
@@ -0,0 +1,21 @@
+// 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 "core/css/properties/CSSPropertyAPIFontVariantCaps.h"
+
+#include "core/CSSValueKeywords.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+
+namespace blink {
+
+const CSSValue* CSSPropertyAPIFontVariantCaps::parseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext* context) {
+  return CSSPropertyParserHelpers::consumeIdent<
+      CSSValueNormal, CSSValueSmallCaps, CSSValueAllSmallCaps,
+      CSSValuePetiteCaps, CSSValueAllPetiteCaps, CSSValueUnicase,
+      CSSValueTitlingCaps>(range);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaControls.cpp b/third_party/WebKit/Source/core/html/shadow/MediaControls.cpp
index c3c805e..89f8b67 100644
--- a/third_party/WebKit/Source/core/html/shadow/MediaControls.cpp
+++ b/third_party/WebKit/Source/core/html/shadow/MediaControls.cpp
@@ -570,6 +570,11 @@
 void MediaControls::defaultEventHandler(Event* event) {
   HTMLDivElement::defaultEventHandler(event);
 
+  // Do not handle events to not interfere with the rest of the page if no
+  // controls should be visible.
+  if (!mediaElement().shouldShowControls())
+    return;
+
   // Add IgnoreControlsHover to m_hideTimerBehaviorFlags when we see a touch
   // event, to allow the hide-timer to do the right thing when it fires.
   // FIXME: Preferably we would only do this when we're actually handling the
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
index 0610418f..669c20a 100644
--- a/third_party/WebKit/Source/core/loader/FrameLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
@@ -948,11 +948,11 @@
     return FrameLoadTypeReplaceCurrentItem;
 
   if (request.resourceRequest().url() == m_documentLoader->urlForHistory()) {
+    if (request.resourceRequest().httpMethod() == HTTPNames::POST)
+      return FrameLoadTypeStandard;
     if (!request.originDocument())
       return FrameLoadTypeReloadMainResource;
-    return request.resourceRequest().httpMethod() == HTTPNames::POST
-               ? FrameLoadTypeStandard
-               : FrameLoadTypeReplaceCurrentItem;
+    return FrameLoadTypeReplaceCurrentItem;
   }
 
   if (request.substituteData().failingURL() ==
diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc
index a0bc142..949a51ae 100644
--- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.cc
@@ -183,7 +183,6 @@
 }
 
 bool TaskQueueImpl::RunsTasksOnCurrentThread() const {
-  base::AutoLock lock(any_thread_lock_);
   return base::PlatformThread::CurrentId() == thread_id_;
 }
 
diff --git a/third_party/harfbuzz-ng/BUILD.gn b/third_party/harfbuzz-ng/BUILD.gn
index 1d2b1932b3..78a1c30 100644
--- a/third_party/harfbuzz-ng/BUILD.gn
+++ b/third_party/harfbuzz-ng/BUILD.gn
@@ -101,6 +101,7 @@
       "src/hb-ot-layout.h",
       "src/hb-ot-map-private.hh",
       "src/hb-ot-map.cc",
+      "src/hb-ot-math.cc",
       "src/hb-ot-maxp-table.hh",
       "src/hb-ot-name-table.hh",
       "src/hb-ot-shape-complex-arabic-fallback.hh",
diff --git a/third_party/harfbuzz-ng/NEWS b/third_party/harfbuzz-ng/NEWS
index fb84c88..8c3ef11 100644
--- a/third_party/harfbuzz-ng/NEWS
+++ b/third_party/harfbuzz-ng/NEWS
@@ -1,3 +1,47 @@
+Overview of changes leading to 1.4.1
+Thursday, January 5, 2017
+====================================
+
+- Always build and use UCDN for Unicode data by default.
+  Reduces dependence on version of Unicode data in glib,
+  specially in the Windows bundles we are shipping, which
+  have very old glib.
+
+
+Overview of changes leading to 1.4.0
+Thursday, January 5, 2017
+====================================
+
+- Merged "OpenType GX" branch which adds core of support for
+  OpenType 1.8 Font Variations.  To that extent, the relevant
+  new API is:
+
+New API:
+hb_font_set_var_coords_normalized()
+
+  with supporting API:
+
+New API:
+HB_OT_LAYOUT_NO_VARIATIONS_INDEX
+hb_ot_layout_table_find_feature_variations()
+hb_ot_layout_feature_with_variations_get_lookups()
+hb_shape_plan_create2()
+hb_shape_plan_create_cached2()
+
+  Currently variations in GSUB/GPOS/GDEF are fully supported,
+  and no other tables are supported.  In particular, fvar/avar
+  are NOT supported, hence the hb_font_set_var_coords_normalized()
+  taking normalized coordinates.  API to take design coordinates
+  will be added in the future.
+
+  HVAR/VVAR/MVAR support will also be added to hb-ot-font in the
+  future.
+
+- Fix regression in GDEF glyph class processing.
+- Add decompositions for Chakma, Limbu, and Balinese in USE shaper.
+- Misc fixes.
+
+
 Overview of changes leading to 1.3.4
 Monday, December 5, 2016
 ====================================
diff --git a/third_party/harfbuzz-ng/README.chromium b/third_party/harfbuzz-ng/README.chromium
index f667f66..2b05002 100644
--- a/third_party/harfbuzz-ng/README.chromium
+++ b/third_party/harfbuzz-ng/README.chromium
@@ -1,8 +1,8 @@
 Name: harfbuzz-ng
 Short Name: harfbuzz-ng
 URL: http://harfbuzz.org
-Version: 1.3.4
-Date: 20161205
+Version: 1.4.1
+Date: 20170105
 Security Critical: yes
 License: MIT
 License File: COPYING
diff --git a/third_party/harfbuzz-ng/src/hb-coretext.cc b/third_party/harfbuzz-ng/src/hb-coretext.cc
index 507581b..e857dfa 100644
--- a/third_party/harfbuzz-ng/src/hb-coretext.cc
+++ b/third_party/harfbuzz-ng/src/hb-coretext.cc
@@ -288,7 +288,9 @@
 hb_coretext_shaper_shape_plan_data_t *
 _hb_coretext_shaper_shape_plan_data_create (hb_shape_plan_t    *shape_plan HB_UNUSED,
 					     const hb_feature_t *user_features HB_UNUSED,
-					     unsigned int        num_user_features HB_UNUSED)
+					     unsigned int        num_user_features HB_UNUSED,
+					     const int          *coords HB_UNUSED,
+					     unsigned int        num_coords HB_UNUSED)
 {
   return (hb_coretext_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
 }
@@ -1280,7 +1282,9 @@
 hb_coretext_aat_shaper_shape_plan_data_t *
 _hb_coretext_aat_shaper_shape_plan_data_create (hb_shape_plan_t    *shape_plan HB_UNUSED,
 					     const hb_feature_t *user_features HB_UNUSED,
-					     unsigned int        num_user_features HB_UNUSED)
+					     unsigned int        num_user_features HB_UNUSED,
+					     const int          *coords HB_UNUSED,
+					     unsigned int        num_coords HB_UNUSED)
 {
   return (hb_coretext_aat_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
 }
diff --git a/third_party/harfbuzz-ng/src/hb-fallback-shape.cc b/third_party/harfbuzz-ng/src/hb-fallback-shape.cc
index e2ad240..ac6d4b0 100644
--- a/third_party/harfbuzz-ng/src/hb-fallback-shape.cc
+++ b/third_party/harfbuzz-ng/src/hb-fallback-shape.cc
@@ -73,7 +73,9 @@
 hb_fallback_shaper_shape_plan_data_t *
 _hb_fallback_shaper_shape_plan_data_create (hb_shape_plan_t    *shape_plan HB_UNUSED,
 					    const hb_feature_t *user_features HB_UNUSED,
-					    unsigned int        num_user_features HB_UNUSED)
+					    unsigned int        num_user_features HB_UNUSED,
+					    const int          *coords HB_UNUSED,
+					    unsigned int        num_coords HB_UNUSED)
 {
   return (hb_fallback_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
 }
diff --git a/third_party/harfbuzz-ng/src/hb-font-private.hh b/third_party/harfbuzz-ng/src/hb-font-private.hh
index cda97a6..53671d78 100644
--- a/third_party/harfbuzz-ng/src/hb-font-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-font-private.hh
@@ -108,6 +108,10 @@
   unsigned int x_ppem;
   unsigned int y_ppem;
 
+  /* Font variation coordinates. */
+  unsigned int num_coords;
+  int *coords;
+
   hb_font_funcs_t   *klass;
   void              *user_data;
   hb_destroy_func_t  destroy;
@@ -120,6 +124,8 @@
   { return HB_DIRECTION_IS_VERTICAL(direction) ? y_scale : x_scale; }
   inline hb_position_t em_scale_x (int16_t v) { return em_scale (v, x_scale); }
   inline hb_position_t em_scale_y (int16_t v) { return em_scale (v, y_scale); }
+  inline hb_position_t em_scalef_x (float v) { return em_scalef (v, this->x_scale); }
+  inline hb_position_t em_scalef_y (float v) { return em_scalef (v, this->y_scale); }
   inline hb_position_t em_scale_dir (int16_t v, hb_direction_t direction)
   { return em_scale (v, dir_scale (direction)); }
 
@@ -531,6 +537,10 @@
     scaled += scaled >= 0 ? upem/2 : -upem/2; /* Round. */
     return (hb_position_t) (scaled / upem);
   }
+  inline hb_position_t em_scalef (float v, int scale)
+  {
+    return (hb_position_t) (v * scale / face->get_upem ());
+  }
 };
 
 #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
diff --git a/third_party/harfbuzz-ng/src/hb-font.cc b/third_party/harfbuzz-ng/src/hb-font.cc
index 08fcd647..2935c4b4 100644
--- a/third_party/harfbuzz-ng/src/hb-font.cc
+++ b/third_party/harfbuzz-ng/src/hb-font.cc
@@ -1165,6 +1165,8 @@
   font->x_ppem = parent->x_ppem;
   font->y_ppem = parent->y_ppem;
 
+  /* TODO: copy variation coordinates. */
+
   return font;
 }
 
@@ -1194,6 +1196,9 @@
     0, /* x_ppem */
     0, /* y_ppem */
 
+    0, /* num_coords */
+    NULL, /* coords */
+
     const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil), /* klass */
     NULL, /* user_data */
     NULL, /* destroy */
@@ -1248,6 +1253,8 @@
   hb_face_destroy (font->face);
   hb_font_funcs_destroy (font->klass);
 
+  free (font->coords);
+
   free (font);
 }
 
@@ -1537,6 +1544,32 @@
 }
 
 
+void
+hb_font_set_var_coords_normalized (hb_font_t *font,
+				   int *coords, /* XXX 2.14 normalized */
+				   unsigned int coords_length)
+{
+  if (font->immutable)
+    return;
+
+  /* Skip tail zero entries. */
+  while (coords_length && !coords[coords_length - 1])
+    coords_length--;
+
+  int *copy = coords_length ? (int *) calloc (coords_length, sizeof (coords[0])) : NULL;
+  if (unlikely (coords_length && !copy))
+    return;
+
+  free (font->coords);
+
+  if (coords_length)
+    memcpy (copy, coords, coords_length * sizeof (coords[0]));
+
+  font->coords = copy;
+  font->num_coords = coords_length;
+}
+
+
 #ifndef HB_DISABLE_DEPRECATED
 
 /*
diff --git a/third_party/harfbuzz-ng/src/hb-font.h b/third_party/harfbuzz-ng/src/hb-font.h
index 2b6ab50..8813286 100644
--- a/third_party/harfbuzz-ng/src/hb-font.h
+++ b/third_party/harfbuzz-ng/src/hb-font.h
@@ -604,6 +604,11 @@
 		  unsigned int *y_ppem);
 
 
+HB_EXTERN void
+hb_font_set_var_coords_normalized (hb_font_t *font,
+				   int *coords, /* XXX 2.14 normalized */
+				   unsigned int coords_length);
+
 HB_END_DECLS
 
 #endif /* HB_FONT_H */
diff --git a/third_party/harfbuzz-ng/src/hb-ft.cc b/third_party/harfbuzz-ng/src/hb-ft.cc
index 2b06c59b..f127066a 100644
--- a/third_party/harfbuzz-ng/src/hb-ft.cc
+++ b/third_party/harfbuzz-ng/src/hb-ft.cc
@@ -36,6 +36,7 @@
 #include "hb-cache-private.hh" // Maybe use in the future?
 
 #include FT_ADVANCES_H
+#include FT_MULTIPLE_MASTERS_H
 #include FT_TRUETYPE_TABLES_H
 
 
@@ -616,6 +617,23 @@
 		    ft_face->size->metrics.y_ppem);
 #endif
 
+#ifdef HAVE_FT_GET_VAR_BLEND_COORDINATES
+  FT_MM_Var *mm_var = NULL;
+  if (!FT_Get_MM_Var (ft_face, &mm_var))
+  {
+    FT_Fixed coords[mm_var->num_axis];
+    int hbCoords[mm_var->num_axis];
+    if (!FT_Get_Var_Blend_Coordinates (ft_face, mm_var->num_axis, coords))
+    {
+      for (int i = 0; i < mm_var->num_axis; ++i)
+	hbCoords[i] = coords[i] >> 2;
+
+      hb_font_set_var_coords_normalized (font, hbCoords, mm_var->num_axis);
+    }
+  }
+  free (mm_var);
+#endif
+
   return font;
 }
 
diff --git a/third_party/harfbuzz-ng/src/hb-glib.cc b/third_party/harfbuzz-ng/src/hb-glib.cc
index e203524..2b91b5b 100644
--- a/third_party/harfbuzz-ng/src/hb-glib.cc
+++ b/third_party/harfbuzz-ng/src/hb-glib.cc
@@ -382,6 +382,7 @@
   return const_cast<hb_unicode_funcs_t *> (&_hb_glib_unicode_funcs);
 }
 
+#if GLIB_CHECK_VERSION(2,31,10)
 /**
  * hb_glib_blob_create:
  *
@@ -398,3 +399,4 @@
 			 g_bytes_ref (gbytes),
 			 (hb_destroy_func_t) g_bytes_unref);
 }
+#endif
diff --git a/third_party/harfbuzz-ng/src/hb-glib.h b/third_party/harfbuzz-ng/src/hb-glib.h
index 12c3e3b..5f04183 100644
--- a/third_party/harfbuzz-ng/src/hb-glib.h
+++ b/third_party/harfbuzz-ng/src/hb-glib.h
@@ -46,9 +46,10 @@
 HB_EXTERN hb_unicode_funcs_t *
 hb_glib_get_unicode_funcs (void);
 
+#if GLIB_CHECK_VERSION(2,31,10)
 HB_EXTERN hb_blob_t *
 hb_glib_blob_create (GBytes *gbytes);
-
+#endif
 
 HB_END_DECLS
 
diff --git a/third_party/harfbuzz-ng/src/hb-graphite2.cc b/third_party/harfbuzz-ng/src/hb-graphite2.cc
index c32318d..a2d90db 100644
--- a/third_party/harfbuzz-ng/src/hb-graphite2.cc
+++ b/third_party/harfbuzz-ng/src/hb-graphite2.cc
@@ -195,7 +195,9 @@
 hb_graphite2_shaper_shape_plan_data_t *
 _hb_graphite2_shaper_shape_plan_data_create (hb_shape_plan_t    *shape_plan HB_UNUSED,
 					     const hb_feature_t *user_features HB_UNUSED,
-					     unsigned int        num_user_features HB_UNUSED)
+					     unsigned int        num_user_features HB_UNUSED,
+					     const int          *coords HB_UNUSED,
+					     unsigned int        num_coords HB_UNUSED)
 {
   return (hb_graphite2_shaper_shape_plan_data_t *) HB_SHAPER_DATA_SUCCEEDED;
 }
diff --git a/third_party/harfbuzz-ng/src/hb-open-type-private.hh b/third_party/harfbuzz-ng/src/hb-open-type-private.hh
index 66f1c08..2cc1fb2 100644
--- a/third_party/harfbuzz-ng/src/hb-open-type-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-open-type-private.hh
@@ -105,7 +105,7 @@
   inline unsigned int get_size (void) const { return (size); }
 
 #define DEFINE_SIZE_UNION(size, _member) \
-  DEFINE_INSTANCE_ASSERTION (this->u._member.static_size == (size)); \
+  DEFINE_INSTANCE_ASSERTION (0*sizeof(this->u._member.static_size) + sizeof(this->u._member) == (size)); \
   static const unsigned int min_size = (size)
 
 #define DEFINE_SIZE_MIN(size) \
@@ -652,6 +652,7 @@
 
 typedef	IntType<int8_t	, 1> CHAR;	/* 8-bit signed integer. */
 typedef	IntType<uint8_t	, 1> BYTE;	/* 8-bit unsigned integer. */
+typedef	IntType<int8_t	, 1> INT8;	/* 8-bit signed integer. */
 typedef IntType<uint16_t, 2> USHORT;	/* 16-bit unsigned integer. */
 typedef IntType<int16_t,  2> SHORT;	/* 16-bit signed integer. */
 typedef IntType<uint32_t, 4> ULONG;	/* 32-bit unsigned integer. */
@@ -951,8 +952,8 @@
 };
 
 /* Array of Offset's */
-template <typename Type>
-struct OffsetArrayOf : ArrayOf<OffsetTo<Type> > {};
+template <typename Type, typename OffsetType=USHORT>
+struct OffsetArrayOf : ArrayOf<OffsetTo<Type, OffsetType> > {};
 
 /* Array of offsets relative to the beginning of the array itself. */
 template <typename Type>
diff --git a/third_party/harfbuzz-ng/src/hb-ot-font.cc b/third_party/harfbuzz-ng/src/hb-ot-font.cc
index df01bc9..5be055d3 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-font.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-font.cc
@@ -355,7 +355,11 @@
     if (!subtable) subtable = cmap->find_subtable (0, 2);
     if (!subtable) subtable = cmap->find_subtable (0, 1);
     if (!subtable) subtable = cmap->find_subtable (0, 0);
-    if (!subtable)(subtable = cmap->find_subtable (3, 0)) && (symbol = true);
+    if (!subtable)
+    {
+      subtable = cmap->find_subtable (3, 0);
+      if (subtable) symbol = true;
+    }
     /* Meh. */
     if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
 
diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout-common-private.hh b/third_party/harfbuzz-ng/src/hb-ot-layout-common-private.hh
index 34fa1b77..62ca7a3 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-layout-common-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-ot-layout-common-private.hh
@@ -507,7 +507,7 @@
   { return this+featureParams; }
 
   inline bool sanitize (hb_sanitize_context_t *c,
-			const Record<Feature>::sanitize_closure_t *closure) const
+			const Record<Feature>::sanitize_closure_t *closure = NULL) const
   {
     TRACE_SANITIZE (this);
     if (unlikely (!(c->check_struct (this) && lookupIndex.sanitize (c))))
@@ -731,8 +731,8 @@
     inline void init (const struct CoverageFormat1 &c_) { c = &c_; i = 0; };
     inline bool more (void) { return i < c->glyphArray.len; }
     inline void next (void) { i++; }
-    inline uint16_t get_glyph (void) { return c->glyphArray[i]; }
-    inline uint16_t get_coverage (void) { return i; }
+    inline hb_codepoint_t get_glyph (void) { return c->glyphArray[i]; }
+    inline unsigned int get_coverage (void) { return i; }
 
     private:
     const struct CoverageFormat1 *c;
@@ -829,26 +829,33 @@
 
   public:
   /* Older compilers need this to be public. */
-  struct Iter {
-    inline void init (const CoverageFormat2 &c_) {
+  struct Iter
+  {
+    inline void init (const CoverageFormat2 &c_)
+    {
       c = &c_;
       coverage = 0;
       i = 0;
       j = c->rangeRecord.len ? c_.rangeRecord[0].start : 0;
     }
     inline bool more (void) { return i < c->rangeRecord.len; }
-    inline void next (void) {
-      coverage++;
-      if (j == c->rangeRecord[i].end) {
+    inline void next (void)
+    {
+      if (j >= c->rangeRecord[i].end)
+      {
         i++;
 	if (more ())
+	{
 	  j = c->rangeRecord[i].start;
+	  coverage = c->rangeRecord[i].value;
+	}
 	return;
       }
+      coverage++;
       j++;
     }
-    inline uint16_t get_glyph (void) { return j; }
-    inline uint16_t get_coverage (void) { return coverage; }
+    inline hb_codepoint_t get_glyph (void) { return j; }
+    inline unsigned int get_coverage (void) { return coverage; }
 
     private:
     const struct CoverageFormat2 *c;
@@ -957,14 +964,14 @@
       default:                   break;
       }
     }
-    inline uint16_t get_glyph (void) {
+    inline hb_codepoint_t get_glyph (void) {
       switch (format) {
       case 1: return u.format1.get_glyph ();
       case 2: return u.format2.get_glyph ();
       default:return 0;
       }
     }
-    inline uint16_t get_coverage (void) {
+    inline unsigned int get_coverage (void) {
       switch (format) {
       case 1: return u.format1.get_coverage ();
       case 2: return u.format2.get_coverage ();
@@ -1162,11 +1169,380 @@
 
 
 /*
+ * Item Variation Store
+ */
+
+struct VarRegionAxis
+{
+  inline float evaluate (int coord) const
+  {
+    int start = startCoord, peak = peakCoord, end = endCoord;
+
+    /* TODO Move these to sanitize(). */
+    if (unlikely (start > peak || peak > end))
+      return 1.;
+    if (unlikely (start < 0 && end > 0 && peak != 0))
+      return 1.;
+
+    if (peak == 0 || coord == peak)
+      return 1.;
+
+    if (coord <= start || end <= coord)
+      return 0.;
+
+    /* Interpolate */
+    if (coord < peak)
+      return float (coord - start) / (peak - start);
+    else
+      return float (end - coord) / (end - peak);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+    /* TODO Handle invalid start/peak/end configs, so we don't
+     * have to do that at runtime. */
+  }
+
+  public:
+  F2DOT14	startCoord;
+  F2DOT14	peakCoord;
+  F2DOT14	endCoord;
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct VarRegionList
+{
+  inline float evaluate (unsigned int region_index,
+			 int *coords, unsigned int coord_len) const
+  {
+    if (unlikely (region_index >= regionCount))
+      return 0.;
+
+    const VarRegionAxis *axes = axesZ + (region_index * axisCount);
+
+    float v = 1.;
+    unsigned int count = MIN (coord_len, (unsigned int) axisCount);
+    for (unsigned int i = 0; i < count; i++)
+    {
+      float factor = axes[i].evaluate (coords[i]);
+      if (factor == 0.)
+        return 0.;
+      v *= factor;
+    }
+    return v;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  c->check_array (axesZ, axesZ[0].static_size,
+				  (unsigned int) axisCount * (unsigned int) regionCount));
+  }
+
+  protected:
+  USHORT	axisCount;
+  USHORT	regionCount;
+  VarRegionAxis	axesZ[VAR];
+  public:
+  DEFINE_SIZE_ARRAY (4, axesZ);
+};
+
+struct VarData
+{
+  inline unsigned int get_row_size (void) const
+  { return shortCount + regionIndices.len; }
+
+  inline unsigned int get_size (void) const
+  { return itemCount * get_row_size (); }
+
+  inline float get_delta (unsigned int inner,
+			  int *coords, unsigned int coord_count,
+			  const VarRegionList &regions) const
+  {
+    if (unlikely (inner >= itemCount))
+      return 0.;
+
+   unsigned int count = regionIndices.len;
+   unsigned int scount = shortCount;
+
+   const BYTE *bytes = &StructAfter<BYTE> (regionIndices);
+   const BYTE *row = bytes + inner * (scount + count);
+
+   float delta = 0.;
+   unsigned int i = 0;
+
+   const SHORT *scursor = reinterpret_cast<const SHORT *> (row);
+   for (; i < scount; i++)
+   {
+     float scalar = regions.evaluate (regionIndices.array[i], coords, coord_count);
+     delta += scalar * *scursor++;
+   }
+   const INT8 *bcursor = reinterpret_cast<const INT8 *> (scursor);
+   for (; i < count; i++)
+   {
+     float scalar = regions.evaluate (regionIndices.array[i], coords, coord_count);
+     delta += scalar * *bcursor++;
+   }
+
+   return delta;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  regionIndices.sanitize(c) &&
+		  shortCount <= regionIndices.len &&
+		  c->check_array (&StructAfter<BYTE> (regionIndices),
+				  get_row_size (), itemCount));
+  }
+
+  protected:
+  USHORT		itemCount;
+  USHORT		shortCount;
+  ArrayOf<USHORT>	regionIndices;
+  BYTE			bytesX[VAR];
+  public:
+  DEFINE_SIZE_ARRAY2 (6, regionIndices, bytesX);
+};
+
+struct VariationStore
+{
+  inline float get_delta (unsigned int outer, unsigned int inner,
+			  int *coords, unsigned int coord_count) const
+  {
+    if (unlikely (outer >= dataSets.len))
+      return 0.;
+
+    return (this+dataSets[outer]).get_delta (inner,
+					     coords, coord_count,
+					     this+regions);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  format == 1 &&
+		  regions.sanitize (c, this) &&
+		  dataSets.sanitize (c, this));
+  }
+
+  protected:
+  USHORT				format;
+  OffsetTo<VarRegionList, ULONG>	regions;
+  OffsetArrayOf<VarData, ULONG>		dataSets;
+  public:
+  DEFINE_SIZE_ARRAY (8, dataSets);
+};
+
+/*
+ * Feature Variations
+ */
+
+struct ConditionFormat1
+{
+  friend struct Condition;
+
+  private:
+  inline bool evaluate (const int *coords, unsigned int coord_len) const
+  {
+    int coord = axisIndex < coord_len ? coords[axisIndex] : 0;
+    return filterRangeMinValue <= coord && coord <= filterRangeMaxValue;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  USHORT	format;		/* Format identifier--format = 1 */
+  USHORT	axisIndex;
+  F2DOT14	filterRangeMinValue;
+  F2DOT14	filterRangeMaxValue;
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct Condition
+{
+  inline bool evaluate (const int *coords, unsigned int coord_len) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.evaluate (coords, coord_len);
+    default:return false;
+    }
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case 1: return_trace (u.format1.sanitize (c));
+    default:return_trace (true);
+    }
+  }
+
+  protected:
+  union {
+  USHORT		format;		/* Format identifier */
+  ConditionFormat1	format1;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+struct ConditionSet
+{
+  inline bool evaluate (const int *coords, unsigned int coord_len) const
+  {
+    unsigned int count = conditions.len;
+    for (unsigned int i = 0; i < count; i++)
+      if (!(this+conditions.array[i]).evaluate (coords, coord_len))
+        return false;
+    return true;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (conditions.sanitize (c, this));
+  }
+
+  protected:
+  OffsetArrayOf<Condition, ULONG> conditions;
+  public:
+  DEFINE_SIZE_ARRAY (2, conditions);
+};
+
+struct FeatureTableSubstitutionRecord
+{
+  friend struct FeatureTableSubstitution;
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && feature.sanitize (c, base));
+  }
+
+  protected:
+  USHORT			featureIndex;
+  OffsetTo<Feature, ULONG>	feature;
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct FeatureTableSubstitution
+{
+  inline const Feature *find_substitute (unsigned int feature_index) const
+  {
+    unsigned int count = substitutions.len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      const FeatureTableSubstitutionRecord &record = substitutions.array[i];
+      if (record.featureIndex == feature_index)
+	return &(this+record.feature);
+    }
+    return NULL;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (version.sanitize (c) &&
+		  likely (version.major == 1) &&
+		  substitutions.sanitize (c, this));
+  }
+
+  protected:
+  FixedVersion<>	version;	/* Version--0x00010000u */
+  ArrayOf<FeatureTableSubstitutionRecord>
+			substitutions;
+  public:
+  DEFINE_SIZE_ARRAY (6, substitutions);
+};
+
+struct FeatureVariationRecord
+{
+  friend struct FeatureVariations;
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (conditions.sanitize (c, base) &&
+		  substitutions.sanitize (c, base));
+  }
+
+  protected:
+  OffsetTo<ConditionSet, ULONG>
+			conditions;
+  OffsetTo<FeatureTableSubstitution, ULONG>
+			substitutions;
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct FeatureVariations
+{
+  static const unsigned int NOT_FOUND_INDEX = 0xFFFFFFFFu;
+
+  inline bool find_index (const int *coords, unsigned int coord_len,
+			  unsigned int *index) const
+  {
+    unsigned int count = varRecords.len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      const FeatureVariationRecord &record = varRecords.array[i];
+      if ((this+record.conditions).evaluate (coords, coord_len))
+      {
+	*index = i;
+	return true;
+      }
+    }
+    *index = NOT_FOUND_INDEX;
+    return false;
+  }
+
+  inline const Feature *find_substitute (unsigned int variations_index,
+					 unsigned int feature_index) const
+  {
+    const FeatureVariationRecord &record = varRecords[variations_index];
+    return (this+record.substitutions).find_substitute (feature_index);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (version.sanitize (c) &&
+		  likely (version.major == 1) &&
+		  varRecords.sanitize (c, this));
+  }
+
+  protected:
+  FixedVersion<>	version;	/* Version--0x00010000u */
+  ArrayOf<FeatureVariationRecord, ULONG>
+			varRecords;
+  public:
+  DEFINE_SIZE_ARRAY (8, varRecords);
+};
+
+
+/*
  * Device Tables
  */
 
-struct Device
+struct HintingDevice
 {
+  friend struct Device;
+
+  private:
 
   inline hb_position_t get_x_delta (hb_font_t *font) const
   { return get_delta (font->x_ppem, font->x_scale); }
@@ -1235,6 +1611,101 @@
   DEFINE_SIZE_ARRAY (6, deltaValue);
 };
 
+struct VariationDevice
+{
+  friend struct Device;
+
+  private:
+
+  inline hb_position_t get_x_delta (hb_font_t *font, const VariationStore &store) const
+  { return font->em_scalef_x (get_delta (font, store)); }
+
+  inline hb_position_t get_y_delta (hb_font_t *font, const VariationStore &store) const
+  { return font->em_scalef_y (get_delta (font, store)); }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  private:
+
+  inline float get_delta (hb_font_t *font, const VariationStore &store) const
+  {
+    return store.get_delta (outerIndex, innerIndex, font->coords, font->num_coords);
+  }
+
+  protected:
+  USHORT	outerIndex;
+  USHORT	innerIndex;
+  USHORT	deltaFormat;	/* Format identifier for this table: 0x0x8000 */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct DeviceHeader
+{
+  protected:
+  USHORT		reserved1;
+  USHORT		reserved2;
+  public:
+  USHORT		format;		/* Format identifier */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct Device
+{
+  inline hb_position_t get_x_delta (hb_font_t *font, const VariationStore &store=Null(VariationStore)) const
+  {
+    switch (u.b.format)
+    {
+    case 1: case 2: case 3:
+      return u.hinting.get_x_delta (font);
+    case 0x8000:
+      return u.variation.get_x_delta (font, store);
+    default:
+      return 0;
+    }
+  }
+  inline hb_position_t get_y_delta (hb_font_t *font, const VariationStore &store=Null(VariationStore)) const
+  {
+    switch (u.b.format)
+    {
+    case 1: case 2: case 3:
+      return u.hinting.get_y_delta (font);
+    case 0x8000:
+      return u.variation.get_y_delta (font, store);
+    default:
+      return 0;
+    }
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.b.format.sanitize (c)) return_trace (false);
+    switch (u.b.format) {
+    case 1: case 2: case 3:
+      return_trace (u.hinting.sanitize (c));
+    case 0x8000:
+      return_trace (u.variation.sanitize (c));
+    default:
+      return_trace (true);
+    }
+  }
+
+  protected:
+  union {
+  DeviceHeader		b;
+  HintingDevice		hinting;
+  VariationDevice	variation;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (6, b);
+};
+
 
 } /* namespace OT */
 
diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout-gdef-table.hh b/third_party/harfbuzz-ng/src/hb-ot-layout-gdef-table.hh
index 2b4bc5a..b70cbb7a 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-layout-gdef-table.hh
+++ b/third_party/harfbuzz-ng/src/hb-ot-layout-gdef-table.hh
@@ -97,7 +97,7 @@
   friend struct CaretValue;
 
   private:
-  inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id HB_UNUSED) const
+  inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction) const
   {
     return HB_DIRECTION_IS_HORIZONTAL (direction) ? font->em_scale_x (coordinate) : font->em_scale_y (coordinate);
   }
@@ -146,11 +146,11 @@
 {
   friend struct CaretValue;
 
-  inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id HB_UNUSED) const
+  inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, const VariationStore &var_store) const
   {
     return HB_DIRECTION_IS_HORIZONTAL (direction) ?
-           font->em_scale_x (coordinate) + (this+deviceTable).get_x_delta (font) :
-           font->em_scale_y (coordinate) + (this+deviceTable).get_y_delta (font);
+           font->em_scale_x (coordinate) + (this+deviceTable).get_x_delta (font, var_store) :
+           font->em_scale_y (coordinate) + (this+deviceTable).get_y_delta (font, var_store);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -172,12 +172,15 @@
 
 struct CaretValue
 {
-  inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id) const
+  inline hb_position_t get_caret_value (hb_font_t *font,
+					hb_direction_t direction,
+					hb_codepoint_t glyph_id,
+					const VariationStore &var_store) const
   {
     switch (u.format) {
-    case 1: return u.format1.get_caret_value (font, direction, glyph_id);
+    case 1: return u.format1.get_caret_value (font, direction);
     case 2: return u.format2.get_caret_value (font, direction, glyph_id);
-    case 3: return u.format3.get_caret_value (font, direction, glyph_id);
+    case 3: return u.format3.get_caret_value (font, direction, var_store);
     default:return 0;
     }
   }
@@ -210,6 +213,7 @@
   inline unsigned int get_lig_carets (hb_font_t *font,
 				      hb_direction_t direction,
 				      hb_codepoint_t glyph_id,
+				      const VariationStore &var_store,
 				      unsigned int start_offset,
 				      unsigned int *caret_count /* IN/OUT */,
 				      hb_position_t *caret_array /* OUT */) const
@@ -218,7 +222,7 @@
       const OffsetTo<CaretValue> *array = carets.sub_array (start_offset, caret_count);
       unsigned int count = *caret_count;
       for (unsigned int i = 0; i < count; i++)
-	caret_array[i] = (this+array[i]).get_caret_value (font, direction, glyph_id);
+	caret_array[i] = (this+array[i]).get_caret_value (font, direction, glyph_id, var_store);
     }
 
     return carets.len;
@@ -244,6 +248,7 @@
   inline unsigned int get_lig_carets (hb_font_t *font,
 				      hb_direction_t direction,
 				      hb_codepoint_t glyph_id,
+				      const VariationStore &var_store,
 				      unsigned int start_offset,
 				      unsigned int *caret_count /* IN/OUT */,
 				      hb_position_t *caret_array /* OUT */) const
@@ -256,7 +261,7 @@
       return 0;
     }
     const LigGlyph &lig_glyph = this+ligGlyph[index];
-    return lig_glyph.get_lig_carets (font, direction, glyph_id, start_offset, caret_count, caret_array);
+    return lig_glyph.get_lig_carets (font, direction, glyph_id, var_store, start_offset, caret_count, caret_array);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -367,11 +372,17 @@
 				      unsigned int start_offset,
 				      unsigned int *caret_count /* IN/OUT */,
 				      hb_position_t *caret_array /* OUT */) const
-  { return (this+ligCaretList).get_lig_carets (font, direction, glyph_id, start_offset, caret_count, caret_array); }
+  { return (this+ligCaretList).get_lig_carets (font,
+					       direction, glyph_id, get_var_store(),
+					       start_offset, caret_count, caret_array); }
 
-  inline bool has_mark_sets (void) const { return version.to_int () >= 0x00010002u && markGlyphSetsDef[0] != 0; }
+  inline bool has_mark_sets (void) const { return version.to_int () >= 0x00010002u && markGlyphSetsDef != 0; }
   inline bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const
-  { return version.to_int () >= 0x00010002u && (this+markGlyphSetsDef[0]).covers (set_index, glyph_id); }
+  { return version.to_int () >= 0x00010002u && (this+markGlyphSetsDef).covers (set_index, glyph_id); }
+
+  inline bool has_var_store (void) const { return version.to_int () >= 0x00010003u && varStore != 0; }
+  inline const VariationStore &get_var_store (void) const
+  { return version.to_int () >= 0x00010003u ? this+varStore : Null(VariationStore); }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -382,10 +393,10 @@
 		  attachList.sanitize (c, this) &&
 		  ligCaretList.sanitize (c, this) &&
 		  markAttachClassDef.sanitize (c, this) &&
-		  (version.to_int () < 0x00010002u || markGlyphSetsDef[0].sanitize (c, this)));
+		  (version.to_int () < 0x00010002u || markGlyphSetsDef.sanitize (c, this)) &&
+		  (version.to_int () < 0x00010003u || varStore.sanitize (c, this)));
   }
 
-
   /* glyph_props is a 16-bit integer where the lower 8-bit have bits representing
    * glyph class and other bits, and high 8-bit gthe mark attachment type (if any).
    * Not to be confused with lookup_props which is very similar. */
@@ -410,7 +421,7 @@
 
   protected:
   FixedVersion<>version;		/* Version of the GDEF table--currently
-					 * 0x00010002u */
+					 * 0x00010003u */
   OffsetTo<ClassDef>
 		glyphClassDef;		/* Offset to class definition table
 					 * for glyph type--from beginning of
@@ -428,12 +439,17 @@
 					 * mark attachment type--from beginning
 					 * of GDEF header (may be Null) */
   OffsetTo<MarkGlyphSets>
-		markGlyphSetsDef[VAR];	/* Offset to the table of mark set
+		markGlyphSetsDef;	/* Offset to the table of mark set
 					 * definitions--from beginning of GDEF
 					 * header (may be NULL).  Introduced
-					 * in version 00010002. */
+					 * in version 0x00010002. */
+  OffsetTo<VariationStore, ULONG>
+		varStore;		/* Offset to the table of Item Variation
+					 * Store--from beginning of GDEF
+					 * header (may be NULL).  Introduced
+					 * in version 0x00010003. */
   public:
-  DEFINE_SIZE_ARRAY (12, markGlyphSetsDef);
+  DEFINE_SIZE_MIN (12);
 };
 
 
diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh b/third_party/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh
index bbe390c..952fd60fe 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh
+++ b/third_party/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh
@@ -103,18 +103,17 @@
   inline unsigned int get_size (void) const
   { return get_len () * Value::static_size; }
 
-  void apply_value (hb_font_t            *font,
-		    hb_direction_t        direction,
+  void apply_value (hb_apply_context_t   *c,
 		    const void           *base,
 		    const Value          *values,
 		    hb_glyph_position_t  &glyph_pos) const
   {
-    unsigned int x_ppem, y_ppem;
     unsigned int format = *this;
-    hb_bool_t horizontal = HB_DIRECTION_IS_HORIZONTAL (direction);
-
     if (!format) return;
 
+    hb_font_t *font = c->font;
+    hb_bool_t horizontal = HB_DIRECTION_IS_HORIZONTAL (c->direction);
+
     if (format & xPlacement) glyph_pos.x_offset  += font->em_scale_x (get_short (values++));
     if (format & yPlacement) glyph_pos.y_offset  += font->em_scale_y (get_short (values++));
     if (format & xAdvance) {
@@ -129,27 +128,29 @@
 
     if (!has_device ()) return;
 
-    x_ppem = font->x_ppem;
-    y_ppem = font->y_ppem;
+    bool use_x_device = font->x_ppem || font->num_coords;
+    bool use_y_device = font->y_ppem || font->num_coords;
 
-    if (!x_ppem && !y_ppem) return;
+    if (!use_x_device && !use_y_device) return;
+
+    const VariationStore &store = c->var_store;
 
     /* pixel -> fractional pixel */
     if (format & xPlaDevice) {
-      if (x_ppem) glyph_pos.x_offset  += (base + get_device (values)).get_x_delta (font);
+      if (use_x_device) glyph_pos.x_offset  += (base + get_device (values)).get_x_delta (font, store);
       values++;
     }
     if (format & yPlaDevice) {
-      if (y_ppem) glyph_pos.y_offset  += (base + get_device (values)).get_y_delta (font);
+      if (use_y_device) glyph_pos.y_offset  += (base + get_device (values)).get_y_delta (font, store);
       values++;
     }
     if (format & xAdvDevice) {
-      if (horizontal && x_ppem) glyph_pos.x_advance += (base + get_device (values)).get_x_delta (font);
+      if (horizontal && use_x_device) glyph_pos.x_advance += (base + get_device (values)).get_x_delta (font, store);
       values++;
     }
     if (format & yAdvDevice) {
       /* y_advance values grow downward but font-space grows upward, hence negation */
-      if (!horizontal && y_ppem) glyph_pos.y_advance -= (base + get_device (values)).get_y_delta (font);
+      if (!horizontal && use_y_device) glyph_pos.y_advance -= (base + get_device (values)).get_y_delta (font, store);
       values++;
     }
   }
@@ -231,11 +232,12 @@
 
 struct AnchorFormat1
 {
-  inline void get_anchor (hb_font_t *font, hb_codepoint_t glyph_id HB_UNUSED,
+  inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
 			  hb_position_t *x, hb_position_t *y) const
   {
-      *x = font->em_scale_x (xCoordinate);
-      *y = font->em_scale_y (yCoordinate);
+    hb_font_t *font = c->font;
+    *x = font->em_scale_x (xCoordinate);
+    *y = font->em_scale_y (yCoordinate);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -254,18 +256,19 @@
 
 struct AnchorFormat2
 {
-  inline void get_anchor (hb_font_t *font, hb_codepoint_t glyph_id,
+  inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id,
 			  hb_position_t *x, hb_position_t *y) const
   {
-      unsigned int x_ppem = font->x_ppem;
-      unsigned int y_ppem = font->y_ppem;
-      hb_position_t cx, cy;
-      hb_bool_t ret;
+    hb_font_t *font = c->font;
+    unsigned int x_ppem = font->x_ppem;
+    unsigned int y_ppem = font->y_ppem;
+    hb_position_t cx, cy;
+    hb_bool_t ret;
 
-      ret = (x_ppem || y_ppem) &&
-             font->get_glyph_contour_point_for_origin (glyph_id, anchorPoint, HB_DIRECTION_LTR, &cx, &cy);
-      *x = ret && x_ppem ? cx : font->em_scale_x (xCoordinate);
-      *y = ret && y_ppem ? cy : font->em_scale_y (yCoordinate);
+    ret = (x_ppem || y_ppem) &&
+	   font->get_glyph_contour_point_for_origin (glyph_id, anchorPoint, HB_DIRECTION_LTR, &cx, &cy);
+    *x = ret && x_ppem ? cx : font->em_scale_x (xCoordinate);
+    *y = ret && y_ppem ? cy : font->em_scale_y (yCoordinate);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -285,16 +288,17 @@
 
 struct AnchorFormat3
 {
-  inline void get_anchor (hb_font_t *font, hb_codepoint_t glyph_id HB_UNUSED,
+  inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED,
 			  hb_position_t *x, hb_position_t *y) const
   {
-      *x = font->em_scale_x (xCoordinate);
-      *y = font->em_scale_y (yCoordinate);
+    hb_font_t *font = c->font;
+    *x = font->em_scale_x (xCoordinate);
+    *y = font->em_scale_y (yCoordinate);
 
-      if (font->x_ppem)
-	*x += (this+xDeviceTable).get_x_delta (font);
-      if (font->y_ppem)
-	*y += (this+yDeviceTable).get_x_delta (font);
+    if (font->x_ppem || font->num_coords)
+      *x += (this+xDeviceTable).get_x_delta (font, c->var_store);
+    if (font->y_ppem || font->num_coords)
+      *y += (this+yDeviceTable).get_y_delta (font, c->var_store);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -321,14 +325,14 @@
 
 struct Anchor
 {
-  inline void get_anchor (hb_font_t *font, hb_codepoint_t glyph_id,
+  inline void get_anchor (hb_apply_context_t *c, hb_codepoint_t glyph_id,
 			  hb_position_t *x, hb_position_t *y) const
   {
     *x = *y = 0;
     switch (u.format) {
-    case 1: u.format1.get_anchor (font, glyph_id, x, y); return;
-    case 2: u.format2.get_anchor (font, glyph_id, x, y); return;
-    case 3: u.format3.get_anchor (font, glyph_id, x, y); return;
+    case 1: u.format1.get_anchor (c, glyph_id, x, y); return;
+    case 2: u.format2.get_anchor (c, glyph_id, x, y); return;
+    case 3: u.format3.get_anchor (c, glyph_id, x, y); return;
     default:						 return;
     }
   }
@@ -370,7 +374,7 @@
   {
     TRACE_SANITIZE (this);
     if (!c->check_struct (this)) return_trace (false);
-    if (unlikely (rows > 0 && cols >= ((unsigned int) -1) / rows)) return_trace (false);
+    if (unlikely (_hb_unsigned_int_mul_overflows (rows, cols))) return_trace (false);
     unsigned int count = rows * cols;
     if (!c->check_array (matrixZ, matrixZ[0].static_size, count)) return_trace (false);
     for (unsigned int i = 0; i < count; i++)
@@ -428,8 +432,8 @@
 
     hb_position_t mark_x, mark_y, base_x, base_y;
 
-    mark_anchor.get_anchor (c->font, buffer->cur().codepoint, &mark_x, &mark_y);
-    glyph_anchor.get_anchor (c->font, buffer->info[glyph_pos].codepoint, &base_x, &base_y);
+    mark_anchor.get_anchor (c, buffer->cur().codepoint, &mark_x, &mark_y);
+    glyph_anchor.get_anchor (c, buffer->info[glyph_pos].codepoint, &base_x, &base_y);
 
     hb_glyph_position_t &o = buffer->cur_pos();
     o.x_offset = base_x - mark_x;
@@ -472,8 +476,7 @@
     unsigned int index = (this+coverage).get_coverage  (buffer->cur().codepoint);
     if (likely (index == NOT_COVERED)) return_trace (false);
 
-    valueFormat.apply_value (c->font, c->direction, this,
-			     values, buffer->cur_pos());
+    valueFormat.apply_value (c, this, values, buffer->cur_pos());
 
     buffer->idx++;
     return_trace (true);
@@ -523,7 +526,7 @@
 
     if (likely (index >= valueCount)) return_trace (false);
 
-    valueFormat.apply_value (c->font, c->direction, this,
+    valueFormat.apply_value (c, this,
 			     &values[index * valueFormat.get_len ()],
 			     buffer->cur_pos());
 
@@ -640,10 +643,8 @@
         min = mid + 1;
       else
       {
-	valueFormats[0].apply_value (c->font, c->direction, this,
-				     &record->values[0], buffer->cur_pos());
-	valueFormats[1].apply_value (c->font, c->direction, this,
-				     &record->values[len1], buffer->pos[pos]);
+	valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos());
+	valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]);
 	if (len2)
 	  pos++;
 	buffer->idx = pos;
@@ -689,7 +690,7 @@
     (this+coverage).add_coverage (c->input);
     unsigned int count = pairSet.len;
     for (unsigned int i = 0; i < count; i++)
-      (this+pairSet[i]).collect_glyphs (c, &valueFormat1);
+      (this+pairSet[i]).collect_glyphs (c, valueFormat);
   }
 
   inline const Coverage &get_coverage (void) const
@@ -708,7 +709,7 @@
     skippy_iter.reset (buffer->idx, 1);
     if (!skippy_iter.next ()) return_trace (false);
 
-    return_trace ((this+pairSet[index]).apply (c, &valueFormat1, skippy_iter.idx));
+    return_trace ((this+pairSet[index]).apply (c, valueFormat, skippy_iter.idx));
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -717,11 +718,11 @@
 
     if (!c->check_struct (this)) return_trace (false);
 
-    unsigned int len1 = valueFormat1.get_len ();
-    unsigned int len2 = valueFormat2.get_len ();
+    unsigned int len1 = valueFormat[0].get_len ();
+    unsigned int len2 = valueFormat[1].get_len ();
     PairSet::sanitize_closure_t closure = {
       this,
-      &valueFormat1,
+      valueFormat,
       len1,
       1 + len1 + len2
     };
@@ -734,10 +735,10 @@
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of subtable */
-  ValueFormat	valueFormat1;		/* Defines the types of data in
+  ValueFormat	valueFormat[2];		/* [0] Defines the types of data in
 					 * ValueRecord1--for the first glyph
 					 * in the pair--may be zero (0) */
-  ValueFormat	valueFormat2;		/* Defines the types of data in
+					/* [1] Defines the types of data in
 					 * ValueRecord2--for the second glyph
 					 * in the pair--may be zero (0) */
   OffsetArrayOf<PairSet>
@@ -790,10 +791,8 @@
     if (unlikely (klass1 >= class1Count || klass2 >= class2Count)) return_trace (false);
 
     const Value *v = &values[record_len * (klass1 * class2Count + klass2)];
-    valueFormat1.apply_value (c->font, c->direction, this,
-			      v, buffer->cur_pos());
-    valueFormat2.apply_value (c->font, c->direction, this,
-			      v + len1, buffer->pos[skippy_iter.idx]);
+    valueFormat1.apply_value (c, this, v, buffer->cur_pos());
+    valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]);
 
     buffer->idx = skippy_iter.idx;
     if (len2)
@@ -931,8 +930,8 @@
     unsigned int j = skippy_iter.idx;
 
     hb_position_t entry_x, entry_y, exit_x, exit_y;
-    (this+this_record.exitAnchor).get_anchor (c->font, buffer->info[i].codepoint, &exit_x, &exit_y);
-    (this+next_record.entryAnchor).get_anchor (c->font, buffer->info[j].codepoint, &entry_x, &entry_y);
+    (this+this_record.exitAnchor).get_anchor (c, buffer->info[i].codepoint, &exit_x, &exit_y);
+    (this+next_record.entryAnchor).get_anchor (c, buffer->info[j].codepoint, &entry_x, &entry_y);
 
     hb_glyph_position_t *pos = buffer->pos;
 
@@ -1519,8 +1518,6 @@
     const OffsetTo<PosLookupList> &list = CastR<OffsetTo<PosLookupList> > (lookupList);
     return_trace (list.sanitize (c, this));
   }
-  public:
-  DEFINE_SIZE_STATIC (10);
 };
 
 
diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh b/third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh
index 22031f4..66fcb3f3 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh
+++ b/third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh
@@ -41,7 +41,10 @@
   {
     TRACE_CLOSURE (this);
     Coverage::Iter iter;
-    for (iter.init (this+coverage); iter.more (); iter.next ()) {
+    for (iter.init (this+coverage); iter.more (); iter.next ())
+    {
+      /* TODO Switch to range-based API to work around malicious fonts.
+       * https://github.com/behdad/harfbuzz/issues/363 */
       hb_codepoint_t glyph_id = iter.get_glyph ();
       if (c->glyphs->has (glyph_id))
 	c->glyphs->add ((glyph_id + deltaGlyphID) & 0xFFFFu);
@@ -52,7 +55,10 @@
   {
     TRACE_COLLECT_GLYPHS (this);
     Coverage::Iter iter;
-    for (iter.init (this+coverage); iter.more (); iter.next ()) {
+    for (iter.init (this+coverage); iter.more (); iter.next ())
+    {
+      /* TODO Switch to range-based API to work around malicious fonts.
+       * https://github.com/behdad/harfbuzz/issues/363 */
       hb_codepoint_t glyph_id = iter.get_glyph ();
       c->input->add (glyph_id);
       c->output->add ((glyph_id + deltaGlyphID) & 0xFFFFu);
@@ -120,7 +126,11 @@
   {
     TRACE_CLOSURE (this);
     Coverage::Iter iter;
-    for (iter.init (this+coverage); iter.more (); iter.next ()) {
+    unsigned int count = substitute.len;
+    for (iter.init (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
       if (c->glyphs->has (iter.get_glyph ()))
 	c->glyphs->add (substitute[iter.get_coverage ()]);
     }
@@ -130,7 +140,11 @@
   {
     TRACE_COLLECT_GLYPHS (this);
     Coverage::Iter iter;
-    for (iter.init (this+coverage); iter.more (); iter.next ()) {
+    unsigned int count = substitute.len;
+    for (iter.init (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
       c->input->add (iter.get_glyph ());
       c->output->add (substitute[iter.get_coverage ()]);
     }
@@ -321,7 +335,11 @@
   {
     TRACE_CLOSURE (this);
     Coverage::Iter iter;
-    for (iter.init (this+coverage); iter.more (); iter.next ()) {
+    unsigned int count = sequence.len;
+    for (iter.init (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
       if (c->glyphs->has (iter.get_glyph ()))
 	(this+sequence[iter.get_coverage ()]).closure (c);
     }
@@ -439,7 +457,11 @@
   {
     TRACE_CLOSURE (this);
     Coverage::Iter iter;
-    for (iter.init (this+coverage); iter.more (); iter.next ()) {
+    unsigned int count = alternateSet.len;
+    for (iter.init (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
       if (c->glyphs->has (iter.get_glyph ())) {
 	const AlternateSet &alt_set = this+alternateSet[iter.get_coverage ()];
 	unsigned int count = alt_set.len;
@@ -453,7 +475,11 @@
   {
     TRACE_COLLECT_GLYPHS (this);
     Coverage::Iter iter;
-    for (iter.init (this+coverage); iter.more (); iter.next ()) {
+    unsigned int count = alternateSet.len;
+    for (iter.init (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
       c->input->add (iter.get_glyph ());
       const AlternateSet &alt_set = this+alternateSet[iter.get_coverage ()];
       unsigned int count = alt_set.len;
@@ -762,7 +788,11 @@
   {
     TRACE_CLOSURE (this);
     Coverage::Iter iter;
-    for (iter.init (this+coverage); iter.more (); iter.next ()) {
+    unsigned int count = ligatureSet.len;
+    for (iter.init (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
       if (c->glyphs->has (iter.get_glyph ()))
 	(this+ligatureSet[iter.get_coverage ()]).closure (c);
     }
@@ -772,7 +802,11 @@
   {
     TRACE_COLLECT_GLYPHS (this);
     Coverage::Iter iter;
-    for (iter.init (this+coverage); iter.more (); iter.next ()) {
+    unsigned int count = ligatureSet.len;
+    for (iter.init (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
       c->input->add (iter.get_glyph ());
       (this+ligatureSet[iter.get_coverage ()]).collect_glyphs (c);
     }
@@ -923,7 +957,11 @@
 
     const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
     Coverage::Iter iter;
-    for (iter.init (this+coverage); iter.more (); iter.next ()) {
+    count = substitute.len;
+    for (iter.init (this+coverage); iter.more (); iter.next ())
+    {
+      if (unlikely (iter.get_coverage () >= count))
+        break; /* Work around malicious fonts. https://github.com/behdad/harfbuzz/issues/363 */
       if (c->glyphs->has (iter.get_glyph ()))
 	c->glyphs->add (substitute[iter.get_coverage ()]);
     }
@@ -1273,8 +1311,6 @@
     const OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (lookupList);
     return_trace (list.sanitize (c, this));
   }
-  public:
-  DEFINE_SIZE_STATIC (10);
 };
 
 
@@ -1285,28 +1321,10 @@
 
   const GDEF &gdef = *hb_ot_layout_from_face (font->face)->gdef;
   unsigned int count = buffer->len;
-  hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 0; i < count; i++)
   {
-    unsigned int props = gdef.get_glyph_props (info[i].codepoint);
-    if (!props)
-    {
-      /* Never mark default-ignorables as marks.
-       * They won't get in the way of lookups anyway,
-       * but having them as mark will cause them to be skipped
-       * over if the lookup-flag says so, but at least for the
-       * Mongolian variation selectors, looks like Uniscribe
-       * marks them as non-mark.  Some Mongolian fonts without
-       * GDEF rely on this.  Another notable character that
-       * this applies to is COMBINING GRAPHEME JOINER. */
-      props = (_hb_glyph_info_get_general_category (&info[i]) !=
-	       HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK ||
-	       _hb_glyph_info_is_default_ignorable (&info[i])) ?
-	      HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH :
-	      HB_OT_LAYOUT_GLYPH_PROPS_MARK;
-    }
-    _hb_glyph_info_set_glyph_props (&info[i], props);
-    _hb_glyph_info_clear_lig_props (&info[i]);
+    _hb_glyph_info_set_glyph_props (&buffer->info[i], gdef.get_glyph_props (buffer->info[i].codepoint));
+    _hb_glyph_info_clear_lig_props (&buffer->info[i]);
     buffer->info[i].syllable() = 0;
   }
 }
diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh b/third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh
index 997d225..fd75c54 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh
@@ -469,6 +469,7 @@
   unsigned int lookup_props;
   const GDEF &gdef;
   bool has_glyph_classes;
+  const VariationStore &var_store;
   skipping_iterator_t iter_input, iter_context;
   unsigned int lookup_index;
   unsigned int debug_depth;
@@ -487,6 +488,7 @@
 			lookup_props (0),
 			gdef (*hb_ot_layout_from_face (face)->gdef),
 			has_glyph_classes (gdef.has_glyph_classes ()),
+			var_store (gdef.get_var_store ()),
 			iter_input (),
 			iter_context (),
 			lookup_index ((unsigned int) -1),
@@ -999,8 +1001,12 @@
     end = int (end) + delta;
     if (end <= match_positions[idx])
     {
+      /* End might end up being smaller than match_positions[idx] if the recursed
+       * lookup ended up removing many items, more than we have had matched.
+       * Just never rewind end back and get out of here.
+       * https://bugs.chromium.org/p/chromium/issues/detail?id=659496 */
+      end = match_positions[idx];
       /* There can't be any further changes. */
-      assert (end == match_positions[idx]);
       break;
     }
 
@@ -2269,6 +2275,24 @@
   inline const Lookup& get_lookup (unsigned int i) const
   { return (this+lookupList)[i]; }
 
+  inline bool find_variations_index (const int *coords, unsigned int num_coords,
+				     unsigned int *index) const
+  { return (version.to_int () >= 0x00010001u ? this+featureVars : Null(FeatureVariations))
+	   .find_index (coords, num_coords, index); }
+  inline const Feature& get_feature_variation (unsigned int feature_index,
+					       unsigned int variations_index) const
+  {
+    if (FeatureVariations::NOT_FOUND_INDEX != variations_index &&
+	version.to_int () >= 0x00010001u)
+    {
+      const Feature *feature = (this+featureVars).find_substitute (variations_index,
+								   feature_index);
+      if (feature)
+        return *feature;
+    }
+    return get_feature (feature_index);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -2276,7 +2300,8 @@
 		  likely (version.major == 1) &&
 		  scriptList.sanitize (c, this) &&
 		  featureList.sanitize (c, this) &&
-		  lookupList.sanitize (c, this));
+		  lookupList.sanitize (c, this) &&
+		  (version.to_int () < 0x00010001u || featureVars.sanitize (c, this)));
   }
 
   protected:
@@ -2288,8 +2313,13 @@
 		featureList; 	/* FeatureList table */
   OffsetTo<LookupList>
 		lookupList; 	/* LookupList table */
+  OffsetTo<FeatureVariations, ULONG>
+		featureVars;	/* Offset to Feature Variations
+				   table--from beginning of table
+				 * (may be NULL).  Introduced
+				 * in version 0x00010001. */
   public:
-  DEFINE_SIZE_STATIC (10);
+  DEFINE_SIZE_MIN (10);
 };
 
 
diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout.cc b/third_party/harfbuzz-ng/src/hb-ot-layout.cc
index 0501181a..145ec76 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-layout.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-layout.cc
@@ -35,7 +35,6 @@
 #include "hb-ot-layout-gsub-table.hh"
 #include "hb-ot-layout-gpos-table.hh"
 #include "hb-ot-layout-jstf-table.hh"
-#include "hb-ot-layout-math-table.hh"
 
 #include "hb-ot-map-private.hh"
 
@@ -205,31 +204,6 @@
   if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::GPOS);
   return *hb_ot_layout_from_face (face)->gpos;
 }
-static inline const OT::MATH&
-_get_math (hb_face_t *face)
-{
-  if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::MATH);
-
-  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
-
-retry:
-  const OT::MATH *math = (const OT::MATH *) hb_atomic_ptr_get (&layout->math);
-
-  if (unlikely (!math))
-  {
-    hb_blob_t *blob = OT::Sanitizer<OT::MATH>::sanitize (face->reference_table (HB_OT_TAG_MATH));
-    math = OT::Sanitizer<OT::MATH>::lock_instance (blob);
-    if (!hb_atomic_ptr_cmpexch (&layout->math, NULL, math))
-    {
-      hb_blob_destroy (blob);
-      goto retry;
-    }
-    layout->math_blob = blob;
-  }
-
-  return *math;
-}
-
 
 /*
  * GDEF
@@ -582,10 +556,13 @@
 				  unsigned int *lookup_count /* IN/OUT */,
 				  unsigned int *lookup_indexes /* OUT */)
 {
-  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
-  const OT::Feature &f = g.get_feature (feature_index);
-
-  return f.get_lookup_indexes (start_offset, lookup_count, lookup_indexes);
+  return hb_ot_layout_feature_with_variations_get_lookups (face,
+							   table_tag,
+							   feature_index,
+							   HB_OT_LAYOUT_NO_VARIATIONS_INDEX,
+							   start_offset,
+							   lookup_count,
+							   lookup_indexes);
 }
 
 /**
@@ -836,6 +813,38 @@
 }
 
 
+/* Variations support */
+
+hb_bool_t
+hb_ot_layout_table_find_feature_variations (hb_face_t    *face,
+					    hb_tag_t      table_tag,
+					    const int    *coords,
+					    unsigned int  num_coords,
+					    unsigned int *variations_index /* out */)
+{
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+  return g.find_variations_index (coords, num_coords, variations_index);
+}
+
+unsigned int
+hb_ot_layout_feature_with_variations_get_lookups (hb_face_t    *face,
+						  hb_tag_t      table_tag,
+						  unsigned int  feature_index,
+						  unsigned int  variations_index,
+						  unsigned int  start_offset,
+						  unsigned int *lookup_count /* IN/OUT */,
+						  unsigned int *lookup_indexes /* OUT */)
+{
+  ASSERT_STATIC (OT::FeatureVariations::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_VARIATIONS_INDEX);
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+  const OT::Feature &f = g.get_feature_variation (feature_index, variations_index);
+
+  return f.get_lookup_indexes (start_offset, lookup_count, lookup_indexes);
+}
+
+
 /*
  * OT::GSUB
  */
@@ -1220,221 +1229,3 @@
 {
   apply_string<GSUBProxy> (c, lookup, accel);
 }
-
-
-/*
- * MATH
- */
-/* TODO Move this to hb-ot-math.cc and separate it from hb_ot_layout_t. */
-
-/**
- * hb_ot_math_has_data:
- * @face: #hb_face_t to test
- *
- * This function allows to verify the presence of an OpenType MATH table on the
- * face. If so, such a table will be loaded into memory and sanitized. You can
- * then safely call other functions for math layout and shaping.
- *
- * Return value: #TRUE if face has a MATH table and #FALSE otherwise
- *
- * Since: 1.3.3
- **/
-hb_bool_t
-hb_ot_math_has_data (hb_face_t *face)
-{
-  return &_get_math (face) != &OT::Null(OT::MATH);
-}
-
-/**
- * hb_ot_math_get_constant:
- * @font: #hb_font_t from which to retrieve the value
- * @constant: #hb_ot_math_constant_t the constant to retrieve
- *
- * This function returns the requested math constants as a #hb_position_t.
- * If the request constant is HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN,
- * HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN or
- * HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN then the return value is
- * actually an integer between 0 and 100 representing that percentage.
- *
- * Return value: the requested constant or 0
- *
- * Since: 1.3.3
- **/
-hb_position_t
-hb_ot_math_get_constant (hb_font_t *font,
-			 hb_ot_math_constant_t constant)
-{
-  const OT::MATH &math = _get_math (font->face);
-  return math.get_constant(constant, font);
-}
-
-/**
- * hb_ot_math_get_glyph_italics_correction:
- * @font: #hb_font_t from which to retrieve the value
- * @glyph: glyph index from which to retrieve the value
- *
- * Return value: the italics correction of the glyph or 0
- *
- * Since: 1.3.3
- **/
-hb_position_t
-hb_ot_math_get_glyph_italics_correction (hb_font_t *font,
-					 hb_codepoint_t glyph)
-{
-  const OT::MATH &math = _get_math (font->face);
-  return math.get_math_glyph_info().get_italics_correction (glyph, font);
-}
-
-/**
- * hb_ot_math_get_glyph_top_accent_attachment:
- * @font: #hb_font_t from which to retrieve the value
- * @glyph: glyph index from which to retrieve the value
- *
- * Return value: the top accent attachment of the glyph or 0
- *
- * Since: 1.3.3
- **/
-hb_position_t
-hb_ot_math_get_glyph_top_accent_attachment (hb_font_t *font,
-					    hb_codepoint_t glyph)
-{
-  const OT::MATH &math = _get_math (font->face);
-  return math.get_math_glyph_info().get_top_accent_attachment (glyph, font);
-}
-
-/**
- * hb_ot_math_is_glyph_extended_shape:
- * @font: a #hb_font_t to test
- * @glyph: a glyph index to test
- *
- * Return value: #TRUE if the glyph is an extended shape and #FALSE otherwise
- *
- * Since: 1.3.3
- **/
-hb_bool_t
-hb_ot_math_is_glyph_extended_shape (hb_face_t *face,
-				    hb_codepoint_t glyph)
-{
-  const OT::MATH &math = _get_math (face);
-  return math.get_math_glyph_info().is_extended_shape (glyph);
-}
-
-/**
- * hb_ot_math_get_glyph_kerning:
- * @font: #hb_font_t from which to retrieve the value
- * @glyph: glyph index from which to retrieve the value
- * @kern: the #hb_ot_math_kern_t from which to retrieve the value
- * @correction_height: the correction height to use to determine the kerning.
- *
- * This function tries to retrieve the MathKern table for the specified font,
- * glyph and #hb_ot_math_kern_t. Then it browses the list of heights from the
- * MathKern table to find one value that is greater or equal to specified
- * correction_height. If one is found the corresponding value from the list of
- * kerns is returned and otherwise the last kern value is returned.
- *
- * Return value: requested kerning or 0
- *
- * Since: 1.3.3
- **/
-hb_position_t
-hb_ot_math_get_glyph_kerning (hb_font_t *font,
-			      hb_codepoint_t glyph,
-			      hb_ot_math_kern_t kern,
-			      hb_position_t correction_height)
-{
-  const OT::MATH &math = _get_math (font->face);
-  return math.get_math_glyph_info().get_kerning (glyph, kern, correction_height, font);
-}
-
-/**
- * hb_ot_math_get_glyph_variants:
- * @font: #hb_font_t from which to retrieve the values
- * @glyph: index of the glyph to stretch
- * @direction: direction of the stretching
- * @start_offset: offset of the first variant to retrieve
- * @variants_count: maximum number of variants to retrieve after start_offset
- * (IN) and actual number of variants retrieved (OUT)
- * @variants: array of size at least @variants_count to store the result
- *
- * This function tries to retrieve the MathGlyphConstruction for the specified
- * font, glyph and direction. Note that only the value of
- * #HB_DIRECTION_IS_HORIZONTAL is considered. It provides the corresponding list
- * of size variants as an array of hb_ot_math_glyph_variant_t structs.
- *
- * Return value: the total number of size variants available or 0
- *
- * Since: 1.3.3
- **/
-unsigned int
-hb_ot_math_get_glyph_variants (hb_font_t *font,
-			       hb_codepoint_t glyph,
-			       hb_direction_t direction,
-			       unsigned int start_offset,
-			       unsigned int *variants_count, /* IN/OUT */
-			       hb_ot_math_glyph_variant_t *variants /* OUT */)
-{
-  const OT::MATH &math = _get_math (font->face);
-  return math.get_math_variants().get_glyph_variants (glyph, direction, font,
-						      start_offset,
-						      variants_count,
-						      variants);
-}
-
-/**
- * hb_ot_math_get_min_connector_overlap:
- * @font: #hb_font_t from which to retrieve the value
- * @direction: direction of the stretching
- *
- * This function tries to retrieve the MathVariants table for the specified
- * font and returns the minimum overlap of connecting glyphs to draw a glyph
- * assembly in the specified direction. Note that only the value of
- * #HB_DIRECTION_IS_HORIZONTAL is considered.
- *
- * Return value: requested min connector overlap or 0
- *
- * Since: 1.3.3
- **/
-hb_position_t
-hb_ot_math_get_min_connector_overlap (hb_font_t *font,
-				      hb_direction_t direction)
-{
-  const OT::MATH &math = _get_math (font->face);
-  return math.get_math_variants().get_min_connector_overlap (direction, font);
-}
-
-/**
- * hb_ot_math_get_glyph_assembly:
- * @font: #hb_font_t from which to retrieve the values
- * @glyph: index of the glyph to stretch
- * @direction: direction of the stretching
- * @start_offset: offset of the first glyph part to retrieve
- * @parts_count: maximum number of glyph parts to retrieve after start_offset
- * (IN) and actual number of parts retrieved (OUT)
- * @parts: array of size at least @parts_count to store the result
- * @italics_correction: italic correction of the glyph assembly
- *
- * This function tries to retrieve the GlyphAssembly for the specified font,
- * glyph and direction. Note that only the value of #HB_DIRECTION_IS_HORIZONTAL
- * is considered. It provides the information necessary to draw the glyph
- * assembly as an array of #hb_ot_math_glyph_part_t.
- *
- * Return value: the total number of parts in the glyph assembly
- *
- * Since: 1.3.3
- **/
-unsigned int
-hb_ot_math_get_glyph_assembly (hb_font_t *font,
-			       hb_codepoint_t glyph,
-			       hb_direction_t direction,
-			       unsigned int start_offset,
-			       unsigned int *parts_count, /* IN/OUT */
-			       hb_ot_math_glyph_part_t *parts, /* OUT */
-			       hb_position_t *italics_correction /* OUT */)
-{
-  const OT::MATH &math = _get_math (font->face);
-  return math.get_math_variants().get_glyph_parts (glyph, direction, font,
-						   start_offset,
-						   parts_count,
-						   parts,
-						   italics_correction);
-}
diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout.h b/third_party/harfbuzz-ng/src/hb-ot-layout.h
index eb23d45b..9861f0f 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-layout.h
+++ b/third_party/harfbuzz-ng/src/hb-ot-layout.h
@@ -95,6 +95,7 @@
 #define HB_OT_LAYOUT_NO_SCRIPT_INDEX		0xFFFFu
 #define HB_OT_LAYOUT_NO_FEATURE_INDEX		0xFFFFu
 #define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX	0xFFFFu
+#define HB_OT_LAYOUT_NO_VARIATIONS_INDEX	0xFFFFFFFFu
 
 HB_EXTERN unsigned int
 hb_ot_layout_table_get_script_tags (hb_face_t    *face,
@@ -236,6 +237,24 @@
 					 void         *user_data);
 #endif
 
+/* Variations support */
+
+HB_EXTERN hb_bool_t
+hb_ot_layout_table_find_feature_variations (hb_face_t    *face,
+					    hb_tag_t      table_tag,
+					    const int    *coords,
+					    unsigned int  num_coords,
+					    unsigned int *variations_index /* out */);
+
+HB_EXTERN unsigned int
+hb_ot_layout_feature_with_variations_get_lookups (hb_face_t    *face,
+						  hb_tag_t      table_tag,
+						  unsigned int  feature_index,
+						  unsigned int  variations_index,
+						  unsigned int  start_offset,
+						  unsigned int *lookup_count /* IN/OUT */,
+						  unsigned int *lookup_indexes /* OUT */);
+
 
 /*
  * GSUB
diff --git a/third_party/harfbuzz-ng/src/hb-ot-map-private.hh b/third_party/harfbuzz-ng/src/hb-ot-map-private.hh
index 8692caa9..0395c9c 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-map-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-ot-map-private.hh
@@ -139,12 +139,6 @@
 
   private:
 
-  HB_INTERNAL void add_lookups (hb_face_t    *face,
-				unsigned int  table_index,
-				unsigned int  feature_index,
-				hb_mask_t     mask,
-				bool          auto_zwj);
-
   hb_mask_t global_mask;
 
   hb_prealloced_array_t<feature_map_t, 8> features;
@@ -182,7 +176,9 @@
   inline void add_gpos_pause (hb_ot_map_t::pause_func_t pause_func)
   { add_pause (1, pause_func); }
 
-  HB_INTERNAL void compile (struct hb_ot_map_t &m);
+  HB_INTERNAL void compile (hb_ot_map_t  &m,
+			    const int    *coords,
+			    unsigned int  num_coords);
 
   inline void finish (void) {
     feature_infos.finish ();
@@ -194,6 +190,14 @@
 
   private:
 
+  HB_INTERNAL void add_lookups (hb_ot_map_t  &m,
+				hb_face_t    *face,
+				unsigned int  table_index,
+				unsigned int  feature_index,
+				unsigned int  variations_index,
+				hb_mask_t     mask,
+				bool          auto_zwj);
+
   struct feature_info_t {
     hb_tag_t tag;
     unsigned int seq; /* sequence#, used for stable sorting only */
diff --git a/third_party/harfbuzz-ng/src/hb-ot-map.cc b/third_party/harfbuzz-ng/src/hb-ot-map.cc
index 17e3f406..9b331d52 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-map.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-map.cc
@@ -31,44 +31,13 @@
 #include "hb-ot-layout-private.hh"
 
 
-void
-hb_ot_map_t::add_lookups (hb_face_t    *face,
-			  unsigned int  table_index,
-			  unsigned int  feature_index,
-			  hb_mask_t     mask,
-			  bool          auto_zwj)
+void hb_ot_map_t::collect_lookups (unsigned int table_index, hb_set_t *lookups_out) const
 {
-  unsigned int lookup_indices[32];
-  unsigned int offset, len;
-  unsigned int table_lookup_count;
-
-  table_lookup_count = hb_ot_layout_table_get_lookup_count (face, table_tags[table_index]);
-
-  offset = 0;
-  do {
-    len = ARRAY_LENGTH (lookup_indices);
-    hb_ot_layout_feature_get_lookups (face,
-				      table_tags[table_index],
-				      feature_index,
-				      offset, &len,
-				      lookup_indices);
-
-    for (unsigned int i = 0; i < len; i++)
-    {
-      if (lookup_indices[i] >= table_lookup_count)
-	continue;
-      hb_ot_map_t::lookup_map_t *lookup = lookups[table_index].push ();
-      if (unlikely (!lookup))
-        return;
-      lookup->mask = mask;
-      lookup->index = lookup_indices[i];
-      lookup->auto_zwj = auto_zwj;
-    }
-
-    offset += len;
-  } while (len == ARRAY_LENGTH (lookup_indices));
+  for (unsigned int i = 0; i < lookups[table_index].len; i++)
+    hb_set_add (lookups_out, lookups[table_index][i].index);
 }
 
+
 hb_ot_map_builder_t::hb_ot_map_builder_t (hb_face_t *face_,
 					  const hb_segment_properties_t *props_)
 {
@@ -109,13 +78,48 @@
   info->stage[1] = current_stage[1];
 }
 
-
-void hb_ot_map_t::collect_lookups (unsigned int table_index, hb_set_t *lookups_out) const
+void
+hb_ot_map_builder_t::add_lookups (hb_ot_map_t  &m,
+				  hb_face_t    *face,
+				  unsigned int  table_index,
+				  unsigned int  feature_index,
+				  unsigned int  variations_index,
+				  hb_mask_t     mask,
+				  bool          auto_zwj)
 {
-  for (unsigned int i = 0; i < lookups[table_index].len; i++)
-    hb_set_add (lookups_out, lookups[table_index][i].index);
+  unsigned int lookup_indices[32];
+  unsigned int offset, len;
+  unsigned int table_lookup_count;
+
+  table_lookup_count = hb_ot_layout_table_get_lookup_count (face, table_tags[table_index]);
+
+  offset = 0;
+  do {
+    len = ARRAY_LENGTH (lookup_indices);
+    hb_ot_layout_feature_with_variations_get_lookups (face,
+						      table_tags[table_index],
+						      feature_index,
+						      variations_index,
+						      offset, &len,
+						      lookup_indices);
+
+    for (unsigned int i = 0; i < len; i++)
+    {
+      if (lookup_indices[i] >= table_lookup_count)
+	continue;
+      hb_ot_map_t::lookup_map_t *lookup = m.lookups[table_index].push ();
+      if (unlikely (!lookup))
+        return;
+      lookup->mask = mask;
+      lookup->index = lookup_indices[i];
+      lookup->auto_zwj = auto_zwj;
+    }
+
+    offset += len;
+  } while (len == ARRAY_LENGTH (lookup_indices));
 }
 
+
 void hb_ot_map_builder_t::add_pause (unsigned int table_index, hb_ot_map_t::pause_func_t pause_func)
 {
   stage_info_t *s = stages[table_index].push ();
@@ -128,7 +132,9 @@
 }
 
 void
-hb_ot_map_builder_t::compile (hb_ot_map_t &m)
+hb_ot_map_builder_t::compile (hb_ot_map_t  &m,
+			      const int    *coords,
+			      unsigned int  num_coords)
 {
   m.global_mask = 1;
 
@@ -262,23 +268,32 @@
   {
     /* Collect lookup indices for features */
 
+    unsigned int variations_index;
+    hb_ot_layout_table_find_feature_variations (face,
+						table_tags[table_index],
+						coords,
+						num_coords,
+						&variations_index);
+
     unsigned int stage_index = 0;
     unsigned int last_num_lookups = 0;
     for (unsigned stage = 0; stage < current_stage[table_index]; stage++)
     {
       if (required_feature_index[table_index] != HB_OT_LAYOUT_NO_FEATURE_INDEX &&
 	  required_feature_stage[table_index] == stage)
-	m.add_lookups (face, table_index,
-		       required_feature_index[table_index],
-		       1 /* mask */,
-		       true /* auto_zwj */);
+	add_lookups (m, face, table_index,
+		     required_feature_index[table_index],
+		     variations_index,
+		     1 /* mask */,
+		     true /* auto_zwj */);
 
       for (unsigned i = 0; i < m.features.len; i++)
         if (m.features[i].stage[table_index] == stage)
-	  m.add_lookups (face, table_index,
-			 m.features[i].index[table_index],
-			 m.features[i].mask,
-			 m.features[i].auto_zwj);
+	  add_lookups (m, face, table_index,
+		       m.features[i].index[table_index],
+		       variations_index,
+		       m.features[i].mask,
+		       m.features[i].auto_zwj);
 
       /* Sort lookups and merge duplicates */
       if (last_num_lookups < m.lookups[table_index].len)
diff --git a/third_party/harfbuzz-ng/src/hb-ot-math.cc b/third_party/harfbuzz-ng/src/hb-ot-math.cc
new file mode 100644
index 0000000..9ef21d29
--- /dev/null
+++ b/third_party/harfbuzz-ng/src/hb-ot-math.cc
@@ -0,0 +1,272 @@
+/*
+ * Copyright © 2016  Igalia S.L.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Igalia Author(s): Frédéric Wang
+ */
+
+#include "hb-open-type-private.hh"
+
+#include "hb-ot-layout-math-table.hh"
+
+HB_SHAPER_DATA_ENSURE_DECLARE(ot, face)
+
+static inline const OT::MATH&
+_get_math (hb_face_t *face)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::MATH);
+
+  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+
+retry:
+  const OT::MATH *math = (const OT::MATH *) hb_atomic_ptr_get (&layout->math);
+
+  if (unlikely (!math))
+  {
+    hb_blob_t *blob = OT::Sanitizer<OT::MATH>::sanitize (face->reference_table (HB_OT_TAG_MATH));
+    math = OT::Sanitizer<OT::MATH>::lock_instance (blob);
+    if (!hb_atomic_ptr_cmpexch (&layout->math, NULL, math))
+    {
+      hb_blob_destroy (blob);
+      goto retry;
+    }
+    layout->math_blob = blob;
+  }
+
+  return *math;
+}
+
+/*
+ * OT::MATH
+ */
+
+/**
+ * hb_ot_math_has_data:
+ * @face: #hb_face_t to test
+ *
+ * This function allows to verify the presence of an OpenType MATH table on the
+ * face. If so, such a table will be loaded into memory and sanitized. You can
+ * then safely call other functions for math layout and shaping.
+ *
+ * Return value: #TRUE if face has a MATH table and #FALSE otherwise
+ *
+ * Since: 1.3.3
+ **/
+hb_bool_t
+hb_ot_math_has_data (hb_face_t *face)
+{
+  return &_get_math (face) != &OT::Null(OT::MATH);
+}
+
+/**
+ * hb_ot_math_get_constant:
+ * @font: #hb_font_t from which to retrieve the value
+ * @constant: #hb_ot_math_constant_t the constant to retrieve
+ *
+ * This function returns the requested math constants as a #hb_position_t.
+ * If the request constant is HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN,
+ * HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN or
+ * HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN then the return value is
+ * actually an integer between 0 and 100 representing that percentage.
+ *
+ * Return value: the requested constant or 0
+ *
+ * Since: 1.3.3
+ **/
+hb_position_t
+hb_ot_math_get_constant (hb_font_t *font,
+			 hb_ot_math_constant_t constant)
+{
+  const OT::MATH &math = _get_math (font->face);
+  return math.get_constant(constant, font);
+}
+
+/**
+ * hb_ot_math_get_glyph_italics_correction:
+ * @font: #hb_font_t from which to retrieve the value
+ * @glyph: glyph index from which to retrieve the value
+ *
+ * Return value: the italics correction of the glyph or 0
+ *
+ * Since: 1.3.3
+ **/
+hb_position_t
+hb_ot_math_get_glyph_italics_correction (hb_font_t *font,
+					 hb_codepoint_t glyph)
+{
+  const OT::MATH &math = _get_math (font->face);
+  return math.get_math_glyph_info().get_italics_correction (glyph, font);
+}
+
+/**
+ * hb_ot_math_get_glyph_top_accent_attachment:
+ * @font: #hb_font_t from which to retrieve the value
+ * @glyph: glyph index from which to retrieve the value
+ *
+ * Return value: the top accent attachment of the glyph or 0
+ *
+ * Since: 1.3.3
+ **/
+hb_position_t
+hb_ot_math_get_glyph_top_accent_attachment (hb_font_t *font,
+					    hb_codepoint_t glyph)
+{
+  const OT::MATH &math = _get_math (font->face);
+  return math.get_math_glyph_info().get_top_accent_attachment (glyph, font);
+}
+
+/**
+ * hb_ot_math_is_glyph_extended_shape:
+ * @font: a #hb_font_t to test
+ * @glyph: a glyph index to test
+ *
+ * Return value: #TRUE if the glyph is an extended shape and #FALSE otherwise
+ *
+ * Since: 1.3.3
+ **/
+hb_bool_t
+hb_ot_math_is_glyph_extended_shape (hb_face_t *face,
+				    hb_codepoint_t glyph)
+{
+  const OT::MATH &math = _get_math (face);
+  return math.get_math_glyph_info().is_extended_shape (glyph);
+}
+
+/**
+ * hb_ot_math_get_glyph_kerning:
+ * @font: #hb_font_t from which to retrieve the value
+ * @glyph: glyph index from which to retrieve the value
+ * @kern: the #hb_ot_math_kern_t from which to retrieve the value
+ * @correction_height: the correction height to use to determine the kerning.
+ *
+ * This function tries to retrieve the MathKern table for the specified font,
+ * glyph and #hb_ot_math_kern_t. Then it browses the list of heights from the
+ * MathKern table to find one value that is greater or equal to specified
+ * correction_height. If one is found the corresponding value from the list of
+ * kerns is returned and otherwise the last kern value is returned.
+ *
+ * Return value: requested kerning or 0
+ *
+ * Since: 1.3.3
+ **/
+hb_position_t
+hb_ot_math_get_glyph_kerning (hb_font_t *font,
+			      hb_codepoint_t glyph,
+			      hb_ot_math_kern_t kern,
+			      hb_position_t correction_height)
+{
+  const OT::MATH &math = _get_math (font->face);
+  return math.get_math_glyph_info().get_kerning (glyph, kern, correction_height, font);
+}
+
+/**
+ * hb_ot_math_get_glyph_variants:
+ * @font: #hb_font_t from which to retrieve the values
+ * @glyph: index of the glyph to stretch
+ * @direction: direction of the stretching
+ * @start_offset: offset of the first variant to retrieve
+ * @variants_count: maximum number of variants to retrieve after start_offset
+ * (IN) and actual number of variants retrieved (OUT)
+ * @variants: array of size at least @variants_count to store the result
+ *
+ * This function tries to retrieve the MathGlyphConstruction for the specified
+ * font, glyph and direction. Note that only the value of
+ * #HB_DIRECTION_IS_HORIZONTAL is considered. It provides the corresponding list
+ * of size variants as an array of hb_ot_math_glyph_variant_t structs.
+ *
+ * Return value: the total number of size variants available or 0
+ *
+ * Since: 1.3.3
+ **/
+unsigned int
+hb_ot_math_get_glyph_variants (hb_font_t *font,
+			       hb_codepoint_t glyph,
+			       hb_direction_t direction,
+			       unsigned int start_offset,
+			       unsigned int *variants_count, /* IN/OUT */
+			       hb_ot_math_glyph_variant_t *variants /* OUT */)
+{
+  const OT::MATH &math = _get_math (font->face);
+  return math.get_math_variants().get_glyph_variants (glyph, direction, font,
+						      start_offset,
+						      variants_count,
+						      variants);
+}
+
+/**
+ * hb_ot_math_get_min_connector_overlap:
+ * @font: #hb_font_t from which to retrieve the value
+ * @direction: direction of the stretching
+ *
+ * This function tries to retrieve the MathVariants table for the specified
+ * font and returns the minimum overlap of connecting glyphs to draw a glyph
+ * assembly in the specified direction. Note that only the value of
+ * #HB_DIRECTION_IS_HORIZONTAL is considered.
+ *
+ * Return value: requested min connector overlap or 0
+ *
+ * Since: 1.3.3
+ **/
+hb_position_t
+hb_ot_math_get_min_connector_overlap (hb_font_t *font,
+				      hb_direction_t direction)
+{
+  const OT::MATH &math = _get_math (font->face);
+  return math.get_math_variants().get_min_connector_overlap (direction, font);
+}
+
+/**
+ * hb_ot_math_get_glyph_assembly:
+ * @font: #hb_font_t from which to retrieve the values
+ * @glyph: index of the glyph to stretch
+ * @direction: direction of the stretching
+ * @start_offset: offset of the first glyph part to retrieve
+ * @parts_count: maximum number of glyph parts to retrieve after start_offset
+ * (IN) and actual number of parts retrieved (OUT)
+ * @parts: array of size at least @parts_count to store the result
+ * @italics_correction: italic correction of the glyph assembly
+ *
+ * This function tries to retrieve the GlyphAssembly for the specified font,
+ * glyph and direction. Note that only the value of #HB_DIRECTION_IS_HORIZONTAL
+ * is considered. It provides the information necessary to draw the glyph
+ * assembly as an array of #hb_ot_math_glyph_part_t.
+ *
+ * Return value: the total number of parts in the glyph assembly
+ *
+ * Since: 1.3.3
+ **/
+unsigned int
+hb_ot_math_get_glyph_assembly (hb_font_t *font,
+			       hb_codepoint_t glyph,
+			       hb_direction_t direction,
+			       unsigned int start_offset,
+			       unsigned int *parts_count, /* IN/OUT */
+			       hb_ot_math_glyph_part_t *parts, /* OUT */
+			       hb_position_t *italics_correction /* OUT */)
+{
+  const OT::MATH &math = _get_math (font->face);
+  return math.get_math_variants().get_glyph_parts (glyph, direction, font,
+						   start_offset,
+						   parts_count,
+						   parts,
+						   italics_correction);
+}
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc
index 4da899055..56ec5cd 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-arabic.cc
@@ -618,6 +618,7 @@
   NULL, /* decompose */
   NULL, /* compose */
   setup_masks_arabic,
+  NULL, /* disable_otl */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-default.cc b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-default.cc
index be60e56..42830ab 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-default.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-default.cc
@@ -40,6 +40,7 @@
   NULL, /* decompose */
   NULL, /* compose */
   NULL, /* setup_masks */
+  NULL, /* disable_otl */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc
index 5f4d98b7..eb95a28 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-hangul.cc
@@ -419,6 +419,7 @@
   NULL, /* decompose */
   NULL, /* compose */
   setup_masks_hangul,
+  NULL, /* disable_otl */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
   false, /* fallback_position */
 };
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc
index 32159002..96f24946 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-hebrew.cc
@@ -154,6 +154,18 @@
   return found;
 }
 
+static bool
+disable_otl_hebrew (const hb_ot_shape_plan_t *plan)
+{
+  /* For Hebrew shaper, use fallback if GPOS does not have 'hebr'
+   * script.  This matches Uniscribe better, and makes fonts like
+   * Arial that have GSUB/GPOS/GDEF but no data for Hebrew work.
+   * See:
+   * https://github.com/behdad/harfbuzz/issues/347#issuecomment-267838368
+   */
+  return plan->map.chosen_script[1] != HB_TAG ('h','e','b','r');
+}
+
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hebrew =
 {
@@ -168,6 +180,7 @@
   NULL, /* decompose */
   compose_hebrew,
   NULL, /* setup_masks */
+  disable_otl_hebrew,
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc
index 94556f6..b48fb561 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-indic.cc
@@ -1713,33 +1713,28 @@
   switch (ab)
   {
     /* Don't decompose these. */
-    case 0x0931u  : return false;
-    case 0x0B94u  : return false;
+    case 0x0931u  : return false; /* DEVANAGARI LETTER RRA */
+    case 0x0B94u  : return false; /* TAMIL LETTER AU */
 
 
     /*
      * Decompose split matras that don't have Unicode decompositions.
      */
 
-    case 0x0F77u  : *a = 0x0FB2u; *b= 0x0F81u; return true;
-    case 0x0F79u  : *a = 0x0FB3u; *b= 0x0F81u; return true;
+    /* Khmer */
     case 0x17BEu  : *a = 0x17C1u; *b= 0x17BEu; return true;
     case 0x17BFu  : *a = 0x17C1u; *b= 0x17BFu; return true;
     case 0x17C0u  : *a = 0x17C1u; *b= 0x17C0u; return true;
     case 0x17C4u  : *a = 0x17C1u; *b= 0x17C4u; return true;
     case 0x17C5u  : *a = 0x17C1u; *b= 0x17C5u; return true;
-    case 0x1925u  : *a = 0x1920u; *b= 0x1923u; return true;
-    case 0x1926u  : *a = 0x1920u; *b= 0x1924u; return true;
-    case 0x1B3Cu  : *a = 0x1B42u; *b= 0x1B3Cu; return true;
-    case 0x1112Eu  : *a = 0x11127u; *b= 0x11131u; return true;
-    case 0x1112Fu  : *a = 0x11127u; *b= 0x11132u; return true;
+
 #if 0
+    /* Gujarati */
     /* This one has no decomposition in Unicode, but needs no decomposition either. */
     /* case 0x0AC9u  : return false; */
+
+    /* Oriya */
     case 0x0B57u  : *a = no decomp, -> RIGHT; return true;
-    case 0x1C29u  : *a = no decomp, -> LEFT; return true;
-    case 0xA9C0u  : *a = no decomp, -> RIGHT; return true;
-    case 0x111BuF  : *a = no decomp, -> ABOVE; return true;
 #endif
   }
 
@@ -1819,6 +1814,7 @@
   decompose_indic,
   compose_indic,
   setup_masks_indic,
+  NULL, /* disable_otl */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
   false, /* fallback_position */
 };
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.hh b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.hh
index 29fdf9a..d2fe742 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.hh
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-myanmar-machine.hh
@@ -1,5 +1,5 @@
 
-#line 1 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 1 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 /*
  * Copyright © 2011,2012  Google, Inc.
  *
@@ -32,7 +32,7 @@
 #include "hb-private.hh"
 
 
-#line 36 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
 static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
 	1u, 31u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 
 	3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, 
@@ -261,11 +261,11 @@
 static const int myanmar_syllable_machine_en_main = 0;
 
 
-#line 36 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 
 
 
-#line 93 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 93 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 
 
 #define found_syllable(syllable_type) \
@@ -285,7 +285,7 @@
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 289 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 289 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
 	{
 	cs = myanmar_syllable_machine_start;
 	ts = 0;
@@ -293,7 +293,7 @@
 	act = 0;
 	}
 
-#line 114 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 114 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 
 
   p = 0;
@@ -302,7 +302,7 @@
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
-#line 306 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 306 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
 	{
 	int _slen;
 	int _trans;
@@ -316,7 +316,7 @@
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 320 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 320 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
 	}
 
 	_keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@@ -335,38 +335,38 @@
 
 	switch ( _myanmar_syllable_machine_trans_actions[_trans] ) {
 	case 7:
-#line 85 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 	{te = p+1;{ found_syllable (consonant_syllable); }}
 	break;
 	case 5:
-#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 86 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 	{te = p+1;{ found_syllable (non_myanmar_cluster); }}
 	break;
 	case 10:
-#line 87 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 87 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 	{te = p+1;{ found_syllable (punctuation_cluster); }}
 	break;
 	case 4:
-#line 88 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 	{te = p+1;{ found_syllable (broken_cluster); }}
 	break;
 	case 3:
-#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 	{te = p+1;{ found_syllable (non_myanmar_cluster); }}
 	break;
 	case 6:
-#line 85 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 	{te = p;p--;{ found_syllable (consonant_syllable); }}
 	break;
 	case 8:
-#line 88 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 	{te = p;p--;{ found_syllable (broken_cluster); }}
 	break;
 	case 9:
-#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 	{te = p;p--;{ found_syllable (non_myanmar_cluster); }}
 	break;
-#line 370 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 370 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
 	}
 
 _again:
@@ -375,7 +375,7 @@
 #line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 379 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 379 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp"
 	}
 
 	if ( ++p != pe )
@@ -391,7 +391,7 @@
 
 	}
 
-#line 123 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 123 "../../src/hb-ot-shape-complex-myanmar-machine.rl"
 
 }
 
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc
index 577d790..bb68622e 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-myanmar.cc
@@ -521,6 +521,7 @@
   NULL, /* decompose */
   NULL, /* compose */
   NULL, /* setup_masks */
+  NULL, /* disable_otl */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
@@ -538,6 +539,7 @@
   NULL, /* decompose */
   NULL, /* compose */
   setup_masks_myanmar,
+  NULL, /* disable_otl */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
   false, /* fallback_position */
 };
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-private.hh b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-private.hh
index fb0c7040..39572df 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-private.hh
@@ -146,6 +146,14 @@
 		       hb_buffer_t              *buffer,
 		       hb_font_t                *font);
 
+  /* disable_otl()
+   * Called during shape().
+   * If set and returns true, GDEF/GSUB/GPOS of the font are ignored
+   * and fallback operations used.
+   * May be NULL.
+   */
+  bool (*disable_otl) (const hb_ot_shape_plan_t *plan);
+
   hb_ot_shape_zero_width_marks_type_t zero_width_marks;
 
   bool fallback_position;
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc
index 4322b0d..e6f80f5 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-thai.cc
@@ -376,6 +376,7 @@
   NULL, /* decompose */
   NULL, /* compose */
   NULL, /* setup_masks */
+  NULL, /* disable_otl */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   false,/* fallback_position */
 };
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-tibetan.cc b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-tibetan.cc
index a77b531..aadf59f 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-tibetan.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-tibetan.cc
@@ -57,6 +57,7 @@
   NULL, /* decompose */
   NULL, /* compose */
   NULL, /* setup_masks */
+  NULL, /* disable_otl */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
   true, /* fallback_position */
 };
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-use.cc b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-use.cc
index 045ead52..5b19d5d7 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-use.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-use.cc
@@ -559,6 +559,47 @@
 }
 
 static bool
+decompose_use (const hb_ot_shape_normalize_context_t *c,
+                hb_codepoint_t  ab,
+                hb_codepoint_t *a,
+                hb_codepoint_t *b)
+{
+  switch (ab)
+  {
+    /* Chakma:
+     * Special case where the Unicode decomp gives matras in the wrong order
+     * for cluster validation.
+     */
+    case 0x1112Eu : *a = 0x11127u; *b= 0x11131u; return true;
+    case 0x1112Fu : *a = 0x11127u; *b= 0x11132u; return true;
+
+    /*
+     * Decompose split matras that don't have Unicode decompositions.
+     */
+
+    /* Limbu */
+    case 0x1925u  : *a = 0x1920u; *b= 0x1923u; return true;
+    case 0x1926u  : *a = 0x1920u; *b= 0x1924u; return true;
+
+    /* Balinese */
+    case 0x1B3Cu  : *a = 0x1B42u; *b= 0x1B3Cu; return true;
+
+#if 0
+    /* Lepcha */
+    case 0x1C29u  : *a = no decomp, -> LEFT; return true;
+
+    /* Javanese */
+    case 0xA9C0u  : *a = no decomp, -> RIGHT; return true;
+
+    /* Sharada */
+    case 0x111BFu  : *a = no decomp, -> ABOVE; return true;
+#endif
+  }
+
+  return (bool) c->unicode->decompose (ab, a, b);
+}
+
+static bool
 compose_use (const hb_ot_shape_normalize_context_t *c,
 	     hb_codepoint_t  a,
 	     hb_codepoint_t  b,
@@ -582,9 +623,10 @@
   NULL, /* preprocess_text */
   NULL, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
-  NULL, /* decompose */
+  decompose_use,
   compose_use,
   setup_masks_use,
+  NULL, /* disable_otl */
   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
   false, /* fallback_position */
 };
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-private.hh b/third_party/harfbuzz-ng/src/hb-ot-shape-private.hh
index 54ac2c3..594e54c 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-shape-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-private.hh
@@ -77,11 +77,13 @@
 			 map (face, &props) {}
   ~hb_ot_shape_planner_t (void) { map.finish (); }
 
-  inline void compile (hb_ot_shape_plan_t &plan)
+  inline void compile (hb_ot_shape_plan_t &plan,
+		       const int          *coords,
+		       unsigned int        num_coords)
   {
     plan.props = props;
     plan.shaper = shaper;
-    map.compile (plan.map);
+    map.compile (plan.map, coords, num_coords);
 
     plan.rtlm_mask = plan.map.get_1_mask (HB_TAG ('r','t','l','m'));
     plan.frac_mask = plan.map.get_1_mask (HB_TAG ('f','r','a','c'));
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape.cc b/third_party/harfbuzz-ng/src/hb-ot-shape.cc
index 7811cb7..ddd6662 100644
--- a/third_party/harfbuzz-ng/src/hb-ot-shape.cc
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape.cc
@@ -69,6 +69,9 @@
 {
   hb_ot_map_builder_t *map = &planner->map;
 
+  map->add_global_bool_feature (HB_TAG('r','v','r','n'));
+  map->add_gsub_pause (NULL);
+
   switch (props->direction) {
     case HB_DIRECTION_LTR:
       map->add_global_bool_feature (HB_TAG ('l','t','r','a'));
@@ -163,7 +166,9 @@
 hb_ot_shaper_shape_plan_data_t *
 _hb_ot_shaper_shape_plan_data_create (hb_shape_plan_t    *shape_plan,
 				      const hb_feature_t *user_features,
-				      unsigned int        num_user_features)
+				      unsigned int        num_user_features,
+				      const int          *coords,
+				      unsigned int        num_coords)
 {
   hb_ot_shape_plan_t *plan = (hb_ot_shape_plan_t *) calloc (1, sizeof (hb_ot_shape_plan_t));
   if (unlikely (!plan))
@@ -173,9 +178,10 @@
 
   planner.shaper = hb_ot_shape_complex_categorize (&planner);
 
-  hb_ot_shape_collect_features (&planner, &shape_plan->props, user_features, num_user_features);
+  hb_ot_shape_collect_features (&planner, &shape_plan->props,
+				user_features, num_user_features);
 
-  planner.compile (*plan);
+  planner.compile (*plan, coords, num_coords);
 
   if (plan->shaper->data_create) {
     plan->data = plan->shaper->data_create (plan);
@@ -212,6 +218,8 @@
   unsigned int        num_user_features;
 
   /* Transient stuff */
+  bool fallback_positioning;
+  bool fallback_glyph_classes;
   hb_direction_t target_direction;
 };
 
@@ -524,6 +532,32 @@
 }
 
 static inline void
+hb_synthesize_glyph_classes (hb_ot_shape_context_t *c)
+{
+  unsigned int count = c->buffer->len;
+  hb_glyph_info_t *info = c->buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+  {
+    hb_ot_layout_glyph_props_flags_t klass;
+
+    /* Never mark default-ignorables as marks.
+     * They won't get in the way of lookups anyway,
+     * but having them as mark will cause them to be skipped
+     * over if the lookup-flag says so, but at least for the
+     * Mongolian variation selectors, looks like Uniscribe
+     * marks them as non-mark.  Some Mongolian fonts without
+     * GDEF rely on this.  Another notable character that
+     * this applies to is COMBINING GRAPHEME JOINER. */
+    klass = (_hb_glyph_info_get_general_category (&info[i]) !=
+	     HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK ||
+	     _hb_glyph_info_is_default_ignorable (&info[i])) ?
+	    HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH :
+	    HB_OT_LAYOUT_GLYPH_PROPS_MARK;
+    _hb_glyph_info_set_glyph_props (&info[i], klass);
+  }
+}
+
+static inline void
 hb_ot_substitute_default (hb_ot_shape_context_t *c)
 {
   hb_buffer_t *buffer = c->buffer;
@@ -539,7 +573,7 @@
   hb_ot_shape_setup_masks (c);
 
   /* This is unfortunate to go here, but necessary... */
-  if (!hb_ot_layout_has_positioning (c->face))
+  if (c->fallback_positioning)
     _hb_ot_shape_fallback_position_recategorize_marks (c->plan, c->font, buffer);
 
   hb_ot_map_glyphs_fast (buffer);
@@ -554,6 +588,9 @@
 
   hb_ot_layout_substitute_start (c->font, buffer);
 
+  if (!hb_ot_layout_has_glyph_classes (c->face))
+    hb_synthesize_glyph_classes (c);
+
   c->plan->substitute (c->font, buffer);
 
   return;
@@ -632,14 +669,12 @@
     _hb_ot_shape_fallback_spaces (c->plan, c->font, c->buffer);
 }
 
-static inline bool
+static inline void
 hb_ot_position_complex (hb_ot_shape_context_t *c)
 {
   hb_ot_layout_position_start (c->font, c->buffer);
 
-  bool ret = false;
   unsigned int count = c->buffer->len;
-  bool has_positioning = (bool) hb_ot_layout_has_positioning (c->face);
 
   /* If the font has no GPOS, AND, no fallback positioning will
    * happen, AND, direction is forward, then when zeroing mark
@@ -650,8 +685,9 @@
    * If fallback positinoing happens or GPOS is present, we don't
    * care.
    */
-  bool adjust_offsets_when_zeroing = !(has_positioning || c->plan->shaper->fallback_position ||
-                                       HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction));
+  bool adjust_offsets_when_zeroing = c->fallback_positioning &&
+				     !c->plan->shaper->fallback_position &&
+				     HB_DIRECTION_IS_FORWARD (c->buffer->props.direction);
 
   switch (c->plan->shaper->zero_width_marks)
   {
@@ -665,7 +701,7 @@
       break;
   }
 
-  if (has_positioning)
+  if (likely (!c->fallback_positioning))
   {
     hb_glyph_info_t *info = c->buffer->info;
     hb_glyph_position_t *pos = c->buffer->pos;
@@ -688,7 +724,6 @@
 					  &pos[i].x_offset,
 					  &pos[i].y_offset);
 
-    ret = true;
   }
 
   switch (c->plan->shaper->zero_width_marks)
@@ -707,8 +742,6 @@
   hb_ot_layout_position_finish_advances (c->font, c->buffer);
   hb_ot_zero_width_default_ignorables (c);
   hb_ot_layout_position_finish_offsets (c->font, c->buffer);
-
-  return ret;
 }
 
 static inline void
@@ -718,9 +751,9 @@
 
   hb_ot_position_default (c);
 
-  hb_bool_t fallback = !hb_ot_position_complex (c);
+  hb_ot_position_complex (c);
 
-  if (fallback && c->plan->shaper->fallback_position)
+  if (c->fallback_positioning && c->plan->shaper->fallback_position)
     _hb_ot_shape_fallback_position (c->plan, c->font, c->buffer);
 
   if (HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction))
@@ -728,7 +761,7 @@
 
   /* Visual fallback goes here. */
 
-  if (fallback)
+  if (c->fallback_positioning)
     _hb_ot_shape_fallback_kern (c->plan, c->font, c->buffer);
 
   _hb_buffer_deallocate_gsubgpos_vars (c->buffer);
@@ -748,6 +781,11 @@
 			      (unsigned) HB_BUFFER_MAX_LEN_MIN);
   }
 
+  bool disable_otl = c->plan->shaper->disable_otl && c->plan->shaper->disable_otl (c->plan);
+  //c->fallback_substitute     = disable_otl || !hb_ot_layout_has_substitution (c->face);
+  c->fallback_positioning    = disable_otl || !hb_ot_layout_has_positioning (c->face);
+  c->fallback_glyph_classes  = disable_otl || !hb_ot_layout_has_glyph_classes (c->face);
+
   /* Save the original direction, we use it later. */
   c->target_direction = c->buffer->props.direction;
 
diff --git a/third_party/harfbuzz-ng/src/hb-private.hh b/third_party/harfbuzz-ng/src/hb-private.hh
index c45be6f2..666af62 100644
--- a/third_party/harfbuzz-ng/src/hb-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-private.hh
@@ -689,17 +689,20 @@
     fprintf (stderr, " %*s  ", (unsigned int) (2 * sizeof (void *)), "");
 
   if (indented) {
-/* One may want to add ASCII version of these.  See:
- * https://bugs.freedesktop.org/show_bug.cgi?id=50970 */
 #define VBAR	"\342\224\202"	/* U+2502 BOX DRAWINGS LIGHT VERTICAL */
 #define VRBAR	"\342\224\234"	/* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
 #define DLBAR	"\342\225\256"	/* U+256E BOX DRAWINGS LIGHT ARC DOWN AND LEFT */
 #define ULBAR	"\342\225\257"	/* U+256F BOX DRAWINGS LIGHT ARC UP AND LEFT */
 #define LBAR	"\342\225\264"	/* U+2574 BOX DRAWINGS LIGHT LEFT */
-    static const char bars[] = VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR;
+    static const char bars[] =
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR
+      VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR VBAR;
     fprintf (stderr, "%2u %s" VRBAR "%s",
 	     level,
-	     bars + sizeof (bars) - 1 - MIN ((unsigned int) sizeof (bars), (unsigned int) (sizeof (VBAR) - 1) * level),
+	     bars + sizeof (bars) - 1 - MIN ((unsigned int) sizeof (bars) - 1, (unsigned int) (sizeof (VBAR) - 1) * level),
 	     level_dir ? (level_dir > 0 ? DLBAR : ULBAR) : LBAR);
   } else
     fprintf (stderr, "   " VRBAR LBAR);
diff --git a/third_party/harfbuzz-ng/src/hb-shape-plan-private.hh b/third_party/harfbuzz-ng/src/hb-shape-plan-private.hh
index 607da5e..aa0413a 100644
--- a/third_party/harfbuzz-ng/src/hb-shape-plan-private.hh
+++ b/third_party/harfbuzz-ng/src/hb-shape-plan-private.hh
@@ -47,12 +47,17 @@
   hb_feature_t *user_features;
   unsigned int num_user_features;
 
+  int *coords;
+  unsigned int num_coords;
+
   struct hb_shaper_data_t shaper_data;
 };
 
 #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS \
-	, const hb_feature_t            *user_features \
-	, unsigned int                   num_user_features
+	, const hb_feature_t *user_features \
+	, unsigned int        num_user_features \
+	, const int          *coords \
+	, unsigned int        num_coords
 #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, shape_plan);
 #include "hb-shaper-list.hh"
 #undef HB_SHAPER_IMPLEMENT
diff --git a/third_party/harfbuzz-ng/src/hb-shape-plan.cc b/third_party/harfbuzz-ng/src/hb-shape-plan.cc
index 87231fb3..600faaeb 100644
--- a/third_party/harfbuzz-ng/src/hb-shape-plan.cc
+++ b/third_party/harfbuzz-ng/src/hb-shape-plan.cc
@@ -46,11 +46,14 @@
 hb_shape_plan_plan (hb_shape_plan_t    *shape_plan,
 		    const hb_feature_t *user_features,
 		    unsigned int        num_user_features,
+		    const int          *coords,
+		    unsigned int        num_coords,
 		    const char * const *shaper_list)
 {
   DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan,
-		  "num_features=%d shaper_list=%p",
+		  "num_features=%d num_coords=%d shaper_list=%p",
 		  num_user_features,
+		  num_coords,
 		  shaper_list);
 
   const hb_shaper_pair_t *shapers = _hb_shapers_get ();
@@ -59,7 +62,9 @@
 	HB_STMT_START { \
 	  if (hb_##shaper##_shaper_face_data_ensure (shape_plan->face_unsafe)) { \
 	    HB_SHAPER_DATA (shaper, shape_plan) = \
-	      HB_SHAPER_DATA_CREATE_FUNC (shaper, shape_plan) (shape_plan, user_features, num_user_features); \
+	      HB_SHAPER_DATA_CREATE_FUNC (shaper, shape_plan) (shape_plan, \
+							       user_features, num_user_features, \
+							       coords, num_coords); \
 	    shape_plan->shaper_func = _hb_##shaper##_shape; \
 	    shape_plan->shaper_name = #shaper; \
 	    return; \
@@ -115,14 +120,31 @@
 		      unsigned int                   num_user_features,
 		      const char * const            *shaper_list)
 {
+  return hb_shape_plan_create2 (face, props,
+				user_features, num_user_features,
+				NULL, 0,
+				shaper_list);
+}
+
+hb_shape_plan_t *
+hb_shape_plan_create2 (hb_face_t                     *face,
+		       const hb_segment_properties_t *props,
+		       const hb_feature_t            *user_features,
+		       unsigned int                   num_user_features,
+		       const int                     *orig_coords,
+		       unsigned int                   num_coords,
+		       const char * const            *shaper_list)
+{
   DEBUG_MSG_FUNC (SHAPE_PLAN, NULL,
-		  "face=%p num_features=%d shaper_list=%p",
+		  "face=%p num_features=%d num_coords=%d shaper_list=%p",
 		  face,
 		  num_user_features,
+		  num_coords,
 		  shaper_list);
 
   hb_shape_plan_t *shape_plan;
   hb_feature_t *features = NULL;
+  int *coords = NULL;
 
   if (unlikely (!face))
     face = hb_face_get_empty ();
@@ -130,7 +152,14 @@
     return hb_shape_plan_get_empty ();
   if (num_user_features && !(features = (hb_feature_t *) calloc (num_user_features, sizeof (hb_feature_t))))
     return hb_shape_plan_get_empty ();
-  if (!(shape_plan = hb_object_create<hb_shape_plan_t> ())) {
+  if (num_coords && !(coords = (int *) calloc (num_coords, sizeof (int))))
+  {
+    free (features);
+    return hb_shape_plan_get_empty ();
+  }
+  if (!(shape_plan = hb_object_create<hb_shape_plan_t> ()))
+  {
+    free (coords);
     free (features);
     return hb_shape_plan_get_empty ();
   }
@@ -145,8 +174,15 @@
   shape_plan->user_features = features;
   if (num_user_features)
     memcpy (features, user_features, num_user_features * sizeof (hb_feature_t));
+  shape_plan->num_coords = num_coords;
+  shape_plan->coords = coords;
+  if (num_coords)
+    memcpy (coords, orig_coords, num_coords * sizeof (int));
 
-  hb_shape_plan_plan (shape_plan, user_features, num_user_features, shaper_list);
+  hb_shape_plan_plan (shape_plan,
+		      user_features, num_user_features,
+		      coords, num_coords,
+		      shaper_list);
 
   return shape_plan;
 }
@@ -176,6 +212,9 @@
     NULL, /* user_features */
     0,    /* num_user_featurs */
 
+    NULL, /* coords */
+    0,    /* num_coords */
+
     {
 #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID,
 #include "hb-shaper-list.hh"
@@ -220,6 +259,7 @@
 #undef HB_SHAPER_IMPLEMENT
 
   free (shape_plan->user_features);
+  free (shape_plan->coords);
 
   free (shape_plan);
 }
@@ -351,6 +391,8 @@
   const char * const            *shaper_list;
   const hb_feature_t            *user_features;
   unsigned int                   num_user_features;
+  const int                     *coords;
+  unsigned int                   num_coords;
   hb_shape_func_t               *shaper_func;
 };
 
@@ -358,12 +400,26 @@
 hb_shape_plan_user_features_match (const hb_shape_plan_t          *shape_plan,
 				   const hb_shape_plan_proposal_t *proposal)
 {
-  if (proposal->num_user_features != shape_plan->num_user_features) return false;
+  if (proposal->num_user_features != shape_plan->num_user_features)
+    return false;
   for (unsigned int i = 0, n = proposal->num_user_features; i < n; i++)
     if (proposal->user_features[i].tag   != shape_plan->user_features[i].tag   ||
         proposal->user_features[i].value != shape_plan->user_features[i].value ||
         proposal->user_features[i].start != shape_plan->user_features[i].start ||
-        proposal->user_features[i].end   != shape_plan->user_features[i].end) return false;
+        proposal->user_features[i].end   != shape_plan->user_features[i].end)
+      return false;
+  return true;
+}
+
+static inline hb_bool_t
+hb_shape_plan_coords_match (const hb_shape_plan_t          *shape_plan,
+			    const hb_shape_plan_proposal_t *proposal)
+{
+  if (proposal->num_coords != shape_plan->num_coords)
+    return false;
+  for (unsigned int i = 0, n = proposal->num_coords; i < n; i++)
+    if (proposal->coords[i] != shape_plan->coords[i])
+      return false;
   return true;
 }
 
@@ -373,6 +429,7 @@
 {
   return hb_segment_properties_equal (&shape_plan->props, &proposal->props) &&
 	 hb_shape_plan_user_features_match (shape_plan, proposal) &&
+	 hb_shape_plan_coords_match (shape_plan, proposal) &&
 	 ((shape_plan->default_shaper_list && proposal->shaper_list == NULL) ||
 	  (shape_plan->shaper_func == proposal->shaper_func));
 }
@@ -389,6 +446,13 @@
   return false;
 }
 
+static inline hb_bool_t
+hb_coords_present (const int *coords,
+		   unsigned int num_coords)
+{
+  return num_coords != 0;
+}
+
 /**
  * hb_shape_plan_create_cached:
  * @face: 
@@ -410,6 +474,21 @@
 			     unsigned int                   num_user_features,
 			     const char * const            *shaper_list)
 {
+  return hb_shape_plan_create_cached2 (face, props,
+				       user_features, num_user_features,
+				       NULL, 0,
+				       shaper_list);
+}
+
+hb_shape_plan_t *
+hb_shape_plan_create_cached2 (hb_face_t                     *face,
+			      const hb_segment_properties_t *props,
+			      const hb_feature_t            *user_features,
+			      unsigned int                   num_user_features,
+			      const int                     *coords,
+			      unsigned int                   num_coords,
+			      const char * const            *shaper_list)
+{
   DEBUG_MSG_FUNC (SHAPE_PLAN, NULL,
 		  "face=%p num_features=%d shaper_list=%p",
 		  face,
@@ -456,16 +535,21 @@
 
   /* Not found. */
 
-  hb_shape_plan_t *shape_plan = hb_shape_plan_create (face, props, user_features, num_user_features, shaper_list);
+  hb_shape_plan_t *shape_plan = hb_shape_plan_create2 (face, props,
+						       user_features, num_user_features,
+						       coords, num_coords,
+						       shaper_list);
 
   /* Don't add to the cache if face is inert. */
   if (unlikely (hb_object_is_inert (face)))
     return shape_plan;
 
   /* Don't add the plan to the cache if there were user features with non-global ranges */
-
   if (hb_non_global_user_features_present (user_features, num_user_features))
     return shape_plan;
+  /* Don't add the plan to the cache if there were variation coordinates XXX Fix me. */
+  if (hb_coords_present (coords, num_coords))
+    return shape_plan;
 
   hb_face_t::plan_node_t *node = (hb_face_t::plan_node_t *) calloc (1, sizeof (hb_face_t::plan_node_t));
   if (unlikely (!node))
diff --git a/third_party/harfbuzz-ng/src/hb-shape-plan.h b/third_party/harfbuzz-ng/src/hb-shape-plan.h
index aa5e0c7..b62ae7c 100644
--- a/third_party/harfbuzz-ng/src/hb-shape-plan.h
+++ b/third_party/harfbuzz-ng/src/hb-shape-plan.h
@@ -53,6 +53,25 @@
 			     const char * const            *shaper_list);
 
 HB_EXTERN hb_shape_plan_t *
+hb_shape_plan_create2 (hb_face_t                     *face,
+		       const hb_segment_properties_t *props,
+		       const hb_feature_t            *user_features,
+		       unsigned int                   num_user_features,
+		       const int                     *coords,
+		       unsigned int                   num_coords,
+		       const char * const            *shaper_list);
+
+HB_EXTERN hb_shape_plan_t *
+hb_shape_plan_create_cached2 (hb_face_t                     *face,
+			      const hb_segment_properties_t *props,
+			      const hb_feature_t            *user_features,
+			      unsigned int                   num_user_features,
+			      const int                     *coords,
+			      unsigned int                   num_coords,
+			      const char * const            *shaper_list);
+
+
+HB_EXTERN hb_shape_plan_t *
 hb_shape_plan_get_empty (void);
 
 HB_EXTERN hb_shape_plan_t *
diff --git a/third_party/harfbuzz-ng/src/hb-shape.cc b/third_party/harfbuzz-ng/src/hb-shape.cc
index 41a4fc5..706f144 100644
--- a/third_party/harfbuzz-ng/src/hb-shape.cc
+++ b/third_party/harfbuzz-ng/src/hb-shape.cc
@@ -373,7 +373,10 @@
 	       unsigned int        num_features,
 	       const char * const *shaper_list)
 {
-  hb_shape_plan_t *shape_plan = hb_shape_plan_create_cached (font->face, &buffer->props, features, num_features, shaper_list);
+  hb_shape_plan_t *shape_plan = hb_shape_plan_create_cached2 (font->face, &buffer->props,
+							      features, num_features,
+							      font->coords, font->num_coords,
+							      shaper_list);
   hb_bool_t res = hb_shape_plan_execute (shape_plan, font, buffer, features, num_features);
   hb_shape_plan_destroy (shape_plan);
 
diff --git a/third_party/harfbuzz-ng/src/hb-unicode.cc b/third_party/harfbuzz-ng/src/hb-unicode.cc
index 487d10b..d553a71 100644
--- a/third_party/harfbuzz-ng/src/hb-unicode.cc
+++ b/third_party/harfbuzz-ng/src/hb-unicode.cc
@@ -131,12 +131,12 @@
 #define HB_UNICODE_FUNCS_IMPLEMENT(set) \
   return hb_##set##_get_unicode_funcs ();
 
-#ifdef HAVE_GLIB
+#if defined(HAVE_UCDN)
+  HB_UNICODE_FUNCS_IMPLEMENT(ucdn)
+#elif defined(HAVE_GLIB)
   HB_UNICODE_FUNCS_IMPLEMENT(glib)
 #elif defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN)
   HB_UNICODE_FUNCS_IMPLEMENT(icu)
-#elif defined(HAVE_UCDN)
-  HB_UNICODE_FUNCS_IMPLEMENT(ucdn)
 #else
 #define HB_UNICODE_FUNCS_NIL 1
   HB_UNICODE_FUNCS_IMPLEMENT(nil)
diff --git a/third_party/harfbuzz-ng/src/hb-version.h b/third_party/harfbuzz-ng/src/hb-version.h
index 65359fdc..0cbe9470 100644
--- a/third_party/harfbuzz-ng/src/hb-version.h
+++ b/third_party/harfbuzz-ng/src/hb-version.h
@@ -37,10 +37,10 @@
 
 
 #define HB_VERSION_MAJOR 1
-#define HB_VERSION_MINOR 3
-#define HB_VERSION_MICRO 4
+#define HB_VERSION_MINOR 4
+#define HB_VERSION_MICRO 1
 
-#define HB_VERSION_STRING "1.3.4"
+#define HB_VERSION_STRING "1.4.1"
 
 #define HB_VERSION_ATLEAST(major,minor,micro) \
 	((major)*10000+(minor)*100+(micro) <= \
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index aae008f2..78a0d5c2 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -59413,6 +59413,16 @@
   </summary>
 </histogram>
 
+<histogram name="Search.GsaAccountChangeNotificationSource"
+    enum="GsaAccountChangeNotificationSource">
+  <owner>lizeb@chromium.org</owner>
+  <summary>
+    On Android, when GSA tells Chrome about an account change, what is the
+    notification mechanism used, which is either the service connection, or a
+    broadcast. Recorded once per account change.
+  </summary>
+</histogram>
+
 <histogram name="Search.GsaBroadcastsAccountChanges"
     enum="BooleanAccountChange">
   <owner>lizeb@chromium.org</owner>
@@ -91777,6 +91787,11 @@
   </int>
 </enum>
 
+<enum name="GsaAccountChangeNotificationSource" type="int">
+  <int value="0" label="Service"/>
+  <int value="1" label="Broadcast"/>
+</enum>
+
 <enum name="GzipEncodingFixupResult" type="int">
   <int value="0" label="Gzip encoding left as-is"/>
   <int value="1" label="MIME type indicated GZIP content"/>