OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.dom_distiller; | 5 package org.chromium.chrome.browser.dom_distiller; |
6 | 6 |
7 import android.app.Activity; | 7 import android.app.Activity; |
8 import android.content.Context; | 8 import android.content.Context; |
9 import android.text.TextUtils; | 9 import android.text.TextUtils; |
10 | 10 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
74 /** | 74 /** |
75 * Whether the page is an article or not. | 75 * Whether the page is an article or not. |
76 */ | 76 */ |
77 private int mReaderModeStatus = NOT_POSSIBLE; | 77 private int mReaderModeStatus = NOT_POSSIBLE; |
78 | 78 |
79 /** | 79 /** |
80 * Whether the fact that the current web page was distillable or not has bee n recorded. | 80 * Whether the fact that the current web page was distillable or not has bee n recorded. |
81 */ | 81 */ |
82 private boolean mIsUmaRecorded; | 82 private boolean mIsUmaRecorded; |
83 | 83 |
84 private boolean mSetCallback; | |
mdjones
2015/11/03 02:54:45
mIsCallbackSet; the current name feels like a func
wychen
2015/11/03 07:56:39
Done.
| |
85 | |
84 private WebContentsObserver mWebContentsObserver; | 86 private WebContentsObserver mWebContentsObserver; |
85 | 87 |
86 private final Tab mTab; | 88 private final Tab mTab; |
87 | 89 |
88 private final ReaderModePanel mReaderModePanel; | 90 private final ReaderModePanel mReaderModePanel; |
89 | 91 |
90 private final ObserverList<ReaderModeManagerObserver> mObservers; | 92 private final ObserverList<ReaderModeManagerObserver> mObservers; |
91 | 93 |
92 private final int mHeaderBackgroundColor; | 94 private final int mHeaderBackgroundColor; |
93 | 95 |
94 public ReaderModeManager(Tab tab, Context context) { | 96 public ReaderModeManager(Tab tab, Context context) { |
95 mTab = tab; | 97 mTab = tab; |
96 mTab.addObserver(this); | 98 mTab.addObserver(this); |
97 mObservers = new ObserverList<ReaderModeManagerObserver>(); | 99 mObservers = new ObserverList<ReaderModeManagerObserver>(); |
98 mReaderModePanel = isEnabled(context) ? new ReaderModePanel(this) : null ; | 100 mReaderModePanel = isEnabled(context) ? new ReaderModePanel(this) : null ; |
99 mHeaderBackgroundColor = context != null | 101 mHeaderBackgroundColor = context != null |
100 ? ApiCompatibilityUtils.getColor( | 102 ? ApiCompatibilityUtils.getColor( |
101 context.getResources(), R.color.reader_mode_header_bg) | 103 context.getResources(), R.color.reader_mode_header_bg) |
102 : 0; | 104 : 0; |
105 mSetCallback = false; | |
103 } | 106 } |
104 | 107 |
105 /** | 108 /** |
106 * Adds an observer to be notified about changes to the reader mode status. | 109 * Adds an observer to be notified about changes to the reader mode status. |
107 */ | 110 */ |
108 public void addObserver(ReaderModeManagerObserver observer) { | 111 public void addObserver(ReaderModeManagerObserver observer) { |
109 mObservers.addObserver(observer); | 112 mObservers.addObserver(observer); |
110 } | 113 } |
111 | 114 |
112 /** | 115 /** |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
240 return mReaderModePanel; | 243 return mReaderModePanel; |
241 } | 244 } |
242 | 245 |
243 private ReaderModeActivityDelegate getReaderModeActivityDelegate() { | 246 private ReaderModeActivityDelegate getReaderModeActivityDelegate() { |
244 return mTab.getReaderModeActivityDelegate(); | 247 return mTab.getReaderModeActivityDelegate(); |
245 } | 248 } |
246 | 249 |
247 private WebContentsObserver createWebContentsObserver(WebContents webContent s) { | 250 private WebContentsObserver createWebContentsObserver(WebContents webContent s) { |
248 return new WebContentsObserver(webContents) { | 251 return new WebContentsObserver(webContents) { |
249 @Override | 252 @Override |
250 public void didFinishLoad(long frameId, String validatedUrl, boolean isMainFrame) { | |
251 if (!isMainFrame) return; | |
252 if (DomDistillerUrlUtils.isDistilledPage(mTab.getUrl())) return; | |
253 updateStatusBasedOnReaderModeCriteria(true); | |
254 } | |
255 | |
256 @Override | |
257 public void didFailLoad(boolean isProvisionalLoad, boolean isMainFra me, int errorCode, | |
258 String description, String failingUrl, boolean wasIgnore dByHandler) { | |
259 if (!isMainFrame) return; | |
260 if (DomDistillerUrlUtils.isDistilledPage(mTab.getUrl())) return; | |
261 updateStatusBasedOnReaderModeCriteria(true); | |
262 } | |
263 | |
264 @Override | |
265 public void didStartProvisionalLoadForFrame(long frameId, long paren tFrameId, | 253 public void didStartProvisionalLoadForFrame(long frameId, long paren tFrameId, |
266 boolean isMainFrame, String validatedUrl, boolean isErrorPag e, | 254 boolean isMainFrame, String validatedUrl, boolean isErrorPag e, |
267 boolean isIframeSrcdoc) { | 255 boolean isIframeSrcdoc) { |
268 if (!isMainFrame) return; | 256 if (!isMainFrame) return; |
269 if (DomDistillerUrlUtils.isDistilledPage(validatedUrl)) { | 257 if (DomDistillerUrlUtils.isDistilledPage(validatedUrl)) { |
270 mReaderModeStatus = STARTED; | 258 mReaderModeStatus = STARTED; |
271 sendReaderModeStatusChangedNotification(); | 259 sendReaderModeStatusChangedNotification(); |
272 mReaderModePageUrl = validatedUrl; | 260 mReaderModePageUrl = validatedUrl; |
273 } | 261 } |
274 } | 262 } |
275 | 263 |
276 @Override | 264 @Override |
277 public void didNavigateMainFrame(String url, String baseUrl, | 265 public void didNavigateMainFrame(String url, String baseUrl, |
278 boolean isNavigationToDifferentPage, boolean isNavigationInP age, | 266 boolean isNavigationToDifferentPage, boolean isNavigationInP age, |
279 int statusCode) { | 267 int statusCode) { |
280 // TODO(cjhopman): This should possibly ignore navigations that replace the entry | 268 // TODO(cjhopman): This should possibly ignore navigations that replace the entry |
281 // (like those from history.replaceState()). | 269 // (like those from history.replaceState()). |
282 if (isNavigationInPage) return; | 270 if (isNavigationInPage) return; |
283 if (DomDistillerUrlUtils.isDistilledPage(url)) return; | 271 if (DomDistillerUrlUtils.isDistilledPage(url)) return; |
284 | 272 |
285 mReaderModeStatus = POSSIBLE; | 273 mReaderModeStatus = POSSIBLE; |
286 if (!TextUtils.equals(url, | 274 if (!TextUtils.equals(url, |
287 DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl( | 275 DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl( |
288 mReaderModePageUrl))) { | 276 mReaderModePageUrl))) { |
289 mReaderModeStatus = NOT_POSSIBLE; | 277 mReaderModeStatus = NOT_POSSIBLE; |
290 mIsUmaRecorded = false; | 278 mIsUmaRecorded = false; |
291 // Do not call updateStatusBasedOnReaderModeCriteria here. | 279 if (!mSetCallback) setDistillabilityCallback(); |
292 // For ADABOOST_MODEL, it is unlikely to get valid info at t his event. | |
293 } | 280 } |
294 mReaderModePageUrl = null; | 281 mReaderModePageUrl = null; |
295 sendReaderModeStatusChangedNotification(); | 282 sendReaderModeStatusChangedNotification(); |
296 } | 283 } |
297 }; | 284 }; |
298 } | 285 } |
299 | 286 |
300 // Updates reader mode status based on whether or not the page should be vie wed in reader mode. | 287 // Set the callback for updating reader mode status based on whether or not the page should |
301 private void updateStatusBasedOnReaderModeCriteria(final boolean forceRecord ) { | 288 // be viewed in reader mode. |
289 private void setDistillabilityCallback() { | |
302 if (mTab.getWebContents() == null) return; | 290 if (mTab.getWebContents() == null) return; |
303 if (mTab.getContentViewCore() == null) return; | 291 if (mTab.getContentViewCore() == null) return; |
304 | 292 |
305 DistillablePageUtils.isPageDistillable(mTab.getWebContents(), | 293 DistillablePageUtils.setCallback(mTab.getWebContents(), |
306 mTab.getContentViewCore().getIsMobileOptimizedHint(), | |
307 new DistillablePageUtils.PageDistillableCallback() { | 294 new DistillablePageUtils.PageDistillableCallback() { |
308 @Override | 295 @Override |
309 public void onIsPageDistillableResult(boolean isDistillable) { | 296 public void onIsPageDistillableResult(boolean isDistillable, boolean isLast) { |
310 if (isDistillable) { | 297 if (isDistillable) { |
311 mReaderModeStatus = POSSIBLE; | 298 mReaderModeStatus = POSSIBLE; |
312 } else { | 299 } else { |
313 mReaderModeStatus = NOT_POSSIBLE; | 300 mReaderModeStatus = NOT_POSSIBLE; |
314 } | 301 } |
315 if (!mIsUmaRecorded && (mReaderModeStatus == POSSIBLE || forceRecord)) { | 302 if (!mIsUmaRecorded && (mReaderModeStatus == POSSIBLE || isLast)) { |
316 mIsUmaRecorded = true; | 303 mIsUmaRecorded = true; |
317 RecordHistogram.recordBooleanHistogram( | 304 RecordHistogram.recordBooleanHistogram( |
318 "DomDistiller.PageDistillable", mReaderModeS tatus == POSSIBLE); | 305 "DomDistiller.PageDistillable", mReaderModeS tatus == POSSIBLE); |
319 } | 306 } |
320 sendReaderModeStatusChangedNotification(); | 307 sendReaderModeStatusChangedNotification(); |
321 } | 308 } |
322 }); | 309 }); |
310 mSetCallback = true; | |
323 } | 311 } |
324 | 312 |
325 private void sendReaderModeStatusChangedNotification() { | 313 private void sendReaderModeStatusChangedNotification() { |
326 for (ReaderModeManagerObserver observer : mObservers) { | 314 for (ReaderModeManagerObserver observer : mObservers) { |
327 observer.onReaderModeStatusChanged(mReaderModeStatus); | 315 observer.onReaderModeStatusChanged(mReaderModeStatus); |
328 } | 316 } |
329 if (mReaderModePanel != null) mReaderModePanel.updateBottomButtonBar(); | 317 if (mReaderModePanel != null) mReaderModePanel.updateBottomButtonBar(); |
330 } | 318 } |
331 | 319 |
332 private ContextualSearchManager getContextualSearchManager(Tab tab) { | 320 private ContextualSearchManager getContextualSearchManager(Tab tab) { |
(...skipping 11 matching lines...) Expand all Loading... | |
344 if (context == null) return false; | 332 if (context == null) return false; |
345 | 333 |
346 boolean enabled = CommandLine.getInstance().hasSwitch(ChromeSwitches.ENA BLE_DOM_DISTILLER) | 334 boolean enabled = CommandLine.getInstance().hasSwitch(ChromeSwitches.ENA BLE_DOM_DISTILLER) |
347 && !CommandLine.getInstance().hasSwitch( | 335 && !CommandLine.getInstance().hasSwitch( |
348 ChromeSwitches.DISABLE_READER_MODE_BOTTOM_BAR) | 336 ChromeSwitches.DISABLE_READER_MODE_BOTTOM_BAR) |
349 && !DeviceFormFactor.isTablet(context) | 337 && !DeviceFormFactor.isTablet(context) |
350 && DomDistillerTabUtils.isDistillerHeuristicsEnabled(); | 338 && DomDistillerTabUtils.isDistillerHeuristicsEnabled(); |
351 return enabled; | 339 return enabled; |
352 } | 340 } |
353 } | 341 } |
OLD | NEW |